From 6e5b4d3aadfaade74b1655f3e69a337e763d18c7 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 02:47:25 -0400 Subject: [PATCH 001/115] refactor: started renaming files/folders for easier navigation --- Masqr.js | 2 +- index.js | 4 ++-- static/404.html | 10 +++++----- static/apps.html | 10 +++++----- static/assets/css/{h.css => home.css} | 0 static/assets/css/{t.css => tabs.css} | 0 static/assets/{history => dynamic}/client.js | 6 +++--- static/assets/{history => dynamic}/config.js | 14 +++++++------- static/assets/{history => dynamic}/handler.js | 2 +- static/assets/{history => dynamic}/html.js | 0 static/assets/{history => dynamic}/worker.js | 2 +- static/assets/js/{c1.js => cloak.js} | 0 static/assets/js/{h1.js => home.js} | 0 static/assets/js/{index-3.js => index.js} | 10 +++++----- static/assets/js/{m1.js => main.js} | 0 static/assets/js/{s1.js => settings.js} | 0 static/assets/js/sj-tp.js | 8 ++++---- static/assets/js/{t3.js => tabs.js} | 18 +++++++++--------- static/assets/json/{a.json => apps.json} | 0 .../assets/json/{a.min.json => apps.min.json} | 0 static/assets/json/{g.json => games.json} | 0 .../json/{g.min.json => games.min.json} | 0 static/assets/mathematics/config.js | 10 ---------- static/assets/mathematics/handler.js | 1 - .../{languagearts => scramjet}/sj.all.js | 0 .../{languagearts => scramjet}/sj.sync.js | 0 .../{languagearts => scramjet}/sj.wasm.wasm | Bin .../{mathematics => ultraviolet}/bundle.js | 4 ++-- static/assets/ultraviolet/config.js | 10 ++++++++++ static/assets/ultraviolet/handler.js | 1 + .../assets/{mathematics => ultraviolet}/sw.js | 6 +++--- static/games.html | 10 +++++----- static/index.html | 18 +++++++++--------- static/settings.html | 12 ++++++------ static/sw.js | 14 +++++++------- static/tabs.html | 16 ++++++++-------- 36 files changed, 94 insertions(+), 94 deletions(-) rename static/assets/css/{h.css => home.css} (100%) rename static/assets/css/{t.css => tabs.css} (100%) rename static/assets/{history => dynamic}/client.js (77%) rename static/assets/{history => dynamic}/config.js (62%) rename static/assets/{history => dynamic}/handler.js (72%) rename static/assets/{history => dynamic}/html.js (100%) rename static/assets/{history => dynamic}/worker.js (84%) rename static/assets/js/{c1.js => cloak.js} (100%) rename static/assets/js/{h1.js => home.js} (100%) rename static/assets/js/{index-3.js => index.js} (87%) rename static/assets/js/{m1.js => main.js} (100%) rename static/assets/js/{s1.js => settings.js} (100%) rename static/assets/js/{t3.js => tabs.js} (97%) rename static/assets/json/{a.json => apps.json} (100%) rename static/assets/json/{a.min.json => apps.min.json} (100%) rename static/assets/json/{g.json => games.json} (100%) rename static/assets/json/{g.min.json => games.min.json} (100%) delete mode 100644 static/assets/mathematics/config.js delete mode 100644 static/assets/mathematics/handler.js rename static/assets/{languagearts => scramjet}/sj.all.js (100%) rename static/assets/{languagearts => scramjet}/sj.sync.js (100%) rename static/assets/{languagearts => scramjet}/sj.wasm.wasm (100%) rename static/assets/{mathematics => ultraviolet}/bundle.js (99%) create mode 100644 static/assets/ultraviolet/config.js create mode 100644 static/assets/ultraviolet/handler.js rename static/assets/{mathematics => ultraviolet}/sw.js (99%) diff --git a/Masqr.js b/Masqr.js index 348d7b16a9..7018e1de8b 100644 --- a/Masqr.js +++ b/Masqr.js @@ -7,7 +7,7 @@ const Fail = fs.readFileSync("Failed.html", "utf8") export function setupMasqr(app) { app.use(async (req, res, next) => { - if (req.url.includes("/ca/")) { + if (req.url.includes("/bare/")) { next() return } diff --git a/index.js b/index.js index 3382404d84..685f6ab9bb 100644 --- a/index.js +++ b/index.js @@ -19,7 +19,7 @@ console.log(chalk.yellow("🚀 Starting server...")); const __dirname = process.cwd(); const server = http.createServer(); const app = express(); -const bareServer = createBareServer("/ca/"); +const bareServer = createBareServer("/bare/"); const { baremuxPath } = bareMuxNode; const epoxyDistPath = path.join( __dirname, @@ -115,7 +115,7 @@ const transportStaticOptions = { }; app.use(express.static(path.join(__dirname, "static"))); -app.use("/ca", cors({ origin: true })); +app.use("/bare", cors({ origin: true })); app.use("/bm", express.static(baremuxPath, transportStaticOptions)); app.use("/ep", express.static(epoxyDistPath, transportStaticOptions)); diff --git a/static/404.html b/static/404.html index 16180ad478..5f00dd3a5c 100644 --- a/static/404.html +++ b/static/404.html @@ -8,7 +8,7 @@ Home - + @@ -35,9 +35,9 @@

Page not found.

- - - - + + + + \ No newline at end of file diff --git a/static/apps.html b/static/apps.html index 01091b436f..7835a1ea8b 100644 --- a/static/apps.html +++ b/static/apps.html @@ -8,14 +8,14 @@ Home - - + + - + - + @@ -44,7 +44,7 @@
- + - + @@ -37,9 +37,9 @@
- - - + + + - - - - - - - + + + + + + + - - + + - + diff --git a/static/sw.js b/static/sw.js index 68cd18d727..e65f88661b 100644 --- a/static/sw.js +++ b/static/sw.js @@ -1,9 +1,9 @@ -importScripts("/assets/history/config.js?v=2025-04-15"); -importScripts("/assets/history/worker.js?v=2025-04-15"); -importScripts("/assets/mathematics/bundle.js?v=2025-04-15"); -importScripts("/assets/mathematics/config.js?v=2025-04-15"); -importScripts(__uv$config.sw || "/assets/mathematics/sw.js?v=2025-04-15"); -importScripts("/assets/languagearts/sj.all.js?v=2025-04-15"); +importScripts("/assets/dynamic/config.js"); +importScripts("/assets/dynamic/worker.js"); +importScripts("/assets/ultraviolet/bundle.js"); +importScripts("/assets/ultraviolet/config.js"); +importScripts(__uv$config.sw || "/assets/ultraviolet/sw.js"); +importScripts("/assets/scramjet/sj.all.js"); const { ScramjetServiceWorker } = $scramjetLoadWorker(); const uv = new UVServiceWorker(); @@ -26,7 +26,7 @@ self.addEventListener("fetch", event => { return await dynamic.fetch(event); } - if (event.request.url.startsWith(`${location.origin}/a/`)) { + if (event.request.url.startsWith(`${location.origin}/uv/`)) { return await uv.fetch(event); } diff --git a/static/tabs.html b/static/tabs.html index 18b05b4c02..00052e3db8 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -9,8 +9,8 @@ Home - - + + - - - - + + + + + - + diff --git a/static/apps.html b/static/apps.html index 7835a1ea8b..b20d0893d3 100644 --- a/static/apps.html +++ b/static/apps.html @@ -12,8 +12,8 @@ - - + + @@ -43,7 +43,7 @@
- + diff --git a/static/assets/js/main.js b/static/assets/js/main.js index d59f4e2529..035b61e19d 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -47,12 +47,12 @@ document.addEventListener("DOMContentLoaded", () => { const themeEle = document.createElement("link"); themeEle.rel = "stylesheet"; const themes = { - catppuccinMocha: "/assets/css/themes/catppuccin/mocha.css?v=00", - catppuccinMacchiato: "/assets/css/themes/catppuccin/macchiato.css?v=00", - catppuccinFrappe: "/assets/css/themes/catppuccin/frappe.css?v=00", - catppuccinLatte: "/assets/css/themes/catppuccin/latte.css?v=00", - Inverted: "/assets/css/themes/colors/inverted.css?v=00", - sky: "/assets/css/themes/colors/sky.css?v=00", + catppuccinMocha: "/assets/css/themes/catppuccin/mocha.css", + catppuccinMacchiato: "/assets/css/themes/catppuccin/macchiato.css", + catppuccinFrappe: "/assets/css/themes/catppuccin/frappe.css", + catppuccinLatte: "/assets/css/themes/catppuccin/latte.css", + Inverted: "/assets/css/themes/colors/inverted.css", + sky: "/assets/css/themes/colors/sky.css", }; if (themes[themeid]) { diff --git a/static/games.html b/static/games.html index fd6b95b9c1..927bde65e2 100644 --- a/static/games.html +++ b/static/games.html @@ -10,8 +10,8 @@ Home - - + + + diff --git a/static/index.html b/static/index.html index 8d736c9b3a..f6868d54a3 100644 --- a/static/index.html +++ b/static/index.html @@ -10,7 +10,7 @@ Home - + diff --git a/static/settings.html b/static/settings.html index 2460490507..e7bacbab76 100644 --- a/static/settings.html +++ b/static/settings.html @@ -10,9 +10,9 @@ Home - - - + + + From 05be6e95651850a0f0a3d70cf8a5188619bfa406 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 03:12:03 -0400 Subject: [PATCH 004/115] fix: corrected file name for the apps/games launcher --- static/apps.html | 2 +- static/assets/js/{cloak.js => launcher.js} | 1 - static/games.html | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) rename static/assets/js/{cloak.js => launcher.js} (99%) diff --git a/static/apps.html b/static/apps.html index b20d0893d3..3a908bc4b5 100644 --- a/static/apps.html +++ b/static/apps.html @@ -43,7 +43,7 @@
- + diff --git a/static/assets/js/cloak.js b/static/assets/js/launcher.js similarity index 99% rename from static/assets/js/cloak.js rename to static/assets/js/launcher.js index d6a278feb5..7c7254f872 100644 --- a/static/assets/js/cloak.js +++ b/static/assets/js/launcher.js @@ -1,4 +1,3 @@ -// cloak.js let appInd; const g = window.location.pathname === "/a"; const a = window.location.pathname === "/b"; diff --git a/static/games.html b/static/games.html index 927bde65e2..eb91ccdb37 100644 --- a/static/games.html +++ b/static/games.html @@ -36,7 +36,7 @@
- + From 7dce15d3106fdd591e737491dbf65d9919c6cd6d Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 03:31:28 -0400 Subject: [PATCH 005/115] refactor: replace obfuscated routes with their normal names --- index.js | 8 ++++---- static/assets/js/home.js | 1 - static/assets/js/index.js | 11 +++++------ static/assets/js/launcher.js | 8 ++++---- static/assets/js/main.js | 13 ++++++------- static/assets/js/settings.js | 2 -- static/assets/js/tabs.js | 1 - 7 files changed, 19 insertions(+), 25 deletions(-) diff --git a/index.js b/index.js index 685f6ab9bb..420d042cfe 100644 --- a/index.js +++ b/index.js @@ -120,11 +120,11 @@ app.use("/bm", express.static(baremuxPath, transportStaticOptions)); app.use("/ep", express.static(epoxyDistPath, transportStaticOptions)); const routes = [ - { path: "/b", file: "apps.html" }, - { path: "/a", file: "games.html" }, + { path: "/apps", file: "apps.html" }, + { path: "/games", file: "games.html" }, { path: "/play.html", file: "games.html" }, - { path: "/c", file: "settings.html" }, - { path: "/d", file: "tabs.html" }, + { path: "/settings", file: "settings.html" }, + { path: "/tabs", file: "tabs.html" }, { path: "/", file: "index.html" }, ]; diff --git a/static/assets/js/home.js b/static/assets/js/home.js index b8155d44f1..73a893e686 100644 --- a/static/assets/js/home.js +++ b/static/assets/js/home.js @@ -1,4 +1,3 @@ -// home.js let inFrame; try { diff --git a/static/assets/js/index.js b/static/assets/js/index.js index 3aa9daa3c1..d669f18015 100644 --- a/static/assets/js/index.js +++ b/static/assets/js/index.js @@ -1,4 +1,3 @@ -// index.js window.addEventListener("load", () => { navigator.serviceWorker.register("../sw.js", { scope: "/uv/", @@ -8,10 +7,10 @@ window.addEventListener("load", () => { let xl; try { - xl = window.top.location.pathname === "/d"; + xl = window.top.location.pathname === "/tabs"; } catch { try { - xl = window.parent.location.pathname === "/d"; + xl = window.parent.location.pathname === "/tabs"; } catch { xl = false; } @@ -25,9 +24,9 @@ if (form && input) { event.preventDefault(); try { if (xl) await processUrl(input.value, ""); - else await processUrl(input.value, "/d"); + else await processUrl(input.value, "/tabs"); } catch { - await processUrl(input.value, "/d"); + await processUrl(input.value, "/tabs"); } }); } @@ -74,7 +73,7 @@ async function processUrl(value, path) { } function go(value) { - processUrl(value, "/d"); + processUrl(value, "/tabs"); } function blank(value) { diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index 7c7254f872..896c7440f7 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -1,15 +1,15 @@ let appInd; -const g = window.location.pathname === "/a"; -const a = window.location.pathname === "/b"; +const g = window.location.pathname === "/games"; +const a = window.location.pathname === "/apps"; const c = window.location.pathname === "/gt"; let t; try { - t = window.top.location.pathname === "/d"; + t = window.top.location.pathname === "/tabs"; } catch { try { - t = window.parent.location.pathname === "/d"; + t = window.parent.location.pathname === "/tabs"; } catch { t = false; } diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 035b61e19d..709934b629 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -1,11 +1,10 @@ -// main.js let qp; try { - qp = window.top.location.pathname === "/d"; + qp = window.top.location.pathname === "/tabs"; } catch { try { - qp = window.parent.location.pathname === "/d"; + qp = window.parent.location.pathname === "/tabs"; } catch { qp = false; } @@ -34,10 +33,10 @@ document.addEventListener("DOMContentLoaded", () => { nav
- Games - Apps - ${qp ? "" : 'Tabs'} - Setting + Games + Apps + ${qp ? "" : 'Tabs'} + Setting
`; nav.innerHTML = html; } diff --git a/static/assets/js/settings.js b/static/assets/js/settings.js index 4bbdd80c6f..9d0032a849 100644 --- a/static/assets/js/settings.js +++ b/static/assets/js/settings.js @@ -1,5 +1,3 @@ -// Ads -// settings.js document.addEventListener("DOMContentLoaded", () => { function adChange(selectedValue) { if (selectedValue === "default") { diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index 7d1e916995..1dd1deb9e7 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -1,4 +1,3 @@ -// tabs.js window.addEventListener("load", () => { navigator.serviceWorker.register("../sw.js", { scope: "/uv/" }); const form = document.getElementById("fv"); From 9bb76b0df7c18c6b705b489872cead0c7e465b8f Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 03:43:49 -0400 Subject: [PATCH 006/115] chore: updated biome's ignored folders and ran formatter --- biome.json | 2 +- index.js | 12 +++--------- static/assets/js/main.js | 2 +- static/assets/js/mg-pxy.js | 11 +++-------- static/assets/js/sj-tp.js | 21 +++++++++++---------- static/assets/js/tabs.js | 4 +--- 6 files changed, 20 insertions(+), 32 deletions(-) diff --git a/biome.json b/biome.json index cac51c8ddd..c52749276b 100644 --- a/biome.json +++ b/biome.json @@ -1,7 +1,7 @@ { "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", "files": { - "includes": ["**", "!**/static/assets/history", "!**/static/assets/mathematics", "!**/static/assets/json/**/*.min.json", "!**/Masqr.js", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb", "!**/Failed.html"] + "includes": ["**", "!**/static/assets/dynamic", "!**/static/assets/ultraviolet", "!**/static/assets/scramjet", "!**/static/assets/json/**/*.min.json", "!**/Masqr.js", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb", "!**/Failed.html"] }, "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { diff --git a/index.js b/index.js index 420d042cfe..e6b27dd4ca 100644 --- a/index.js +++ b/index.js @@ -1,14 +1,14 @@ import fs from "node:fs"; import http from "node:http"; import path from "node:path"; +import bareMuxNode from "@mercuryworkshop/bare-mux/node"; +import { server as wisp } from "@mercuryworkshop/wisp-js/server"; import { createBareServer } from "@nebula-services/bare-server-node"; import chalk from "chalk"; import cookieParser from "cookie-parser"; import cors from "cors"; import express from "express"; import basicAuth from "express-basic-auth"; -import bareMuxNode from "@mercuryworkshop/bare-mux/node"; -import { server as wisp } from "@mercuryworkshop/wisp-js/server"; import mime from "mime"; import fetch from "node-fetch"; // import { setupMasqr } from "./Masqr.js"; @@ -21,13 +21,7 @@ const server = http.createServer(); const app = express(); const bareServer = createBareServer("/bare/"); const { baremuxPath } = bareMuxNode; -const epoxyDistPath = path.join( - __dirname, - "node_modules", - "@mercuryworkshop", - "epoxy-transport", - "dist", -); +const epoxyDistPath = path.join(__dirname, "node_modules", "@mercuryworkshop", "epoxy-transport", "dist"); const PORT = process.env.PORT || 8080; const cache = new Map(); const CACHE_TTL = 30 * 24 * 60 * 60 * 1000; // Cache for 30 Days diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 709934b629..467e632f4f 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -310,4 +310,4 @@ document.addEventListener("DOMContentLoaded", () => { if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } -}); \ No newline at end of file +}); diff --git a/static/assets/js/mg-pxy.js b/static/assets/js/mg-pxy.js index b23c0ab8ac..07cc055cd8 100644 --- a/static/assets/js/mg-pxy.js +++ b/static/assets/js/mg-pxy.js @@ -1,17 +1,12 @@ -(function () { - "use strict"; - +(() => { function migrate() { - let hadLegacy = - localStorage.getItem("pChoice") !== null || - localStorage.getItem("uv") !== null || - localStorage.getItem("dy") !== null; + const hadLegacy = localStorage.getItem("pChoice") !== null || localStorage.getItem("uv") !== null || localStorage.getItem("dy") !== null; localStorage.removeItem("pChoice"); localStorage.removeItem("uv"); localStorage.removeItem("dy"); - let v = localStorage.getItem("pchoice"); + const v = localStorage.getItem("pchoice"); if (v === "sc") { localStorage.setItem("pchoice", "sj"); return "sj"; diff --git a/static/assets/js/sj-tp.js b/static/assets/js/sj-tp.js index 3dc42d90dd..6a33f80d7f 100644 --- a/static/assets/js/sj-tp.js +++ b/static/assets/js/sj-tp.js @@ -30,10 +30,7 @@ throw new Error("Sj bundle did not load."); } - const [{ BareMuxConnection }, { ScramjetController }] = await Promise.all([ - import("/bm/index.mjs"), - Promise.resolve(window.$scramjetLoadController()), - ]); + const [{ BareMuxConnection }, { ScramjetController }] = await Promise.all([import("/bm/index.mjs"), Promise.resolve(window.$scramjetLoadController())]); const sj = new ScramjetController(sjConfig); await sj.init(); @@ -44,9 +41,9 @@ window.__isSj = { connection, controller: sj, - encodeUrl: (url) => sj.encodeUrl(url), - decodeUrl: (url) => sj.decodeUrl(url), - pxyUrl: (url) => sj.encodeUrl(url), + encodeUrl: url => sj.encodeUrl(url), + decodeUrl: url => sj.decodeUrl(url), + pxyUrl: url => sj.encodeUrl(url), }; } @@ -60,9 +57,13 @@ if (document.readyState === "loading") { window.__isSjReady = new Promise(resolve => { - document.addEventListener("DOMContentLoaded", () => { - void boot().finally(resolve); - }, { once: true }); + document.addEventListener( + "DOMContentLoaded", + () => { + void boot().finally(resolve); + }, + { once: true }, + ); }); } else { window.__isSjReady = boot(); diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index 1dd1deb9e7..f7fe56d1e7 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -108,9 +108,7 @@ document.addEventListener("DOMContentLoaded", event => { tabTitle.textContent = title; } newIframe.contentWindow.open = url => { - const pxyUrl = window.__isGetPxyUrl - ? window.__isGetPxyUrl(url) - : `/uv/${__uv$config.encodeUrl(url)}`; + const pxyUrl = window.__isGetPxyUrl ? window.__isGetPxyUrl(url) : `/uv/${__uv$config.encodeUrl(url)}`; sessionStorage.setItem("URL", pxyUrl); createNewTab(); return null; From daf9bc78c381bbb53dd16b18498694ac4a73cd96 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 03:58:54 -0400 Subject: [PATCH 007/115] refactor: clean up launcher code, rename functions, and fix bugs --- static/assets/js/launcher.js | 534 +++++++++++++++-------------------- 1 file changed, 230 insertions(+), 304 deletions(-) diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index 896c7440f7..5543db703a 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -1,78 +1,84 @@ -let appInd; -const g = window.location.pathname === "/games"; -const a = window.location.pathname === "/apps"; -const c = window.location.pathname === "/gt"; - -let t; +const isGamesPage = window.location.pathname === "/games"; +const isAppsPage = window.location.pathname === "/apps"; +const isToolsPage = window.location.pathname === "/gt"; +let isInTabMode = false; try { - t = window.top.location.pathname === "/tabs"; + isInTabMode = window.top.location.pathname === "/tabs"; } catch { try { - t = window.parent.location.pathname === "/tabs"; + isInTabMode = window.parent.location.pathname === "/tabs"; } catch { - t = false; + isInTabMode = false; } } -function Span(name) { - return name.split("").map(char => { +function getStorageKey(baseKey) { + if (isGamesPage) return `G${baseKey}`; + if (isToolsPage) return `T${baseKey}`; + if (isAppsPage) return `A${baseKey}`; + return baseKey; +} + +function getFromStorage(baseKey) { + return localStorage.getItem(getStorageKey(baseKey)); +} + +function setInStorage(baseKey, value) { + localStorage.setItem(getStorageKey(baseKey), value); +} + +function createSpanElements(text) { + return text.split("").map(char => { const span = document.createElement("span"); span.textContent = char; return span; }); } -function saveToLocal(path) { - sessionStorage.setItem("GoUrl", path); +function saveUrlToSession(url) { + sessionStorage.setItem("GoUrl", url); } -function handleClick(app) { - if (typeof app.say !== "undefined") { +function handleAppClick(app) { + if (app.say) { alert(app.say); } - let Selected = app.link; + let selectedUrl = app.link; if (app.links && app.links.length > 1) { - Selected = getSelected(app.links); - if (!Selected) { - return false; - } + selectedUrl = promptUserForLink(app.links); + if (!selectedUrl) return false; } if (app.local) { - saveToLocal(Selected); - window.location.href = "rx"; - if (t) { - window.location.href = Selected; - } + saveUrlToSession(selectedUrl); + window.location.href = isInTabMode ? selectedUrl : "rx"; } else if (app.local2) { - saveToLocal(Selected); - window.location.href = Selected; + saveUrlToSession(selectedUrl); + window.location.href = selectedUrl; } else if (app.blank) { - blank(Selected); + blank(selectedUrl); } else if (app.now) { - now(Selected); - if (t) { - window.location.href = Selected; - } + now(selectedUrl); + if (isInTabMode) window.location.href = selectedUrl; } else if (app.custom) { - Custom(app); + createCustomApp(); } else if (app.dy) { - dy(Selected); + dy(selectedUrl); } else { - go(Selected); - if (t) { - blank(Selected); - } + go(selectedUrl); + if (isInTabMode) blank(selectedUrl); } + return false; } -function getSelected(links) { +function promptUserForLink(links) { const options = links.map((link, index) => `${index + 1}: ${link.name}`).join("\n"); + const choice = prompt(`Select a link by entering the corresponding number:\n${options}`); - const selectedIndex = Number.parseInt(choice, 10) - 1; + const selectedIndex = parseInt(choice, 10) - 1; if (Number.isNaN(selectedIndex) || selectedIndex < 0 || selectedIndex >= links.length) { alert("Invalid selection. Please try again."); @@ -82,81 +88,25 @@ function getSelected(links) { return links[selectedIndex].url; } -function CustomApp(customApp) { - let apps; - if (g) { - apps = localStorage.getItem("Gcustom"); - } else if (c) { - apps = localStorage.getItem("Tcustom"); - } else if (a) { - apps = localStorage.getItem("Acustom"); - } +function saveCustomApp(customApp) { + let apps = getFromStorage("custom"); - if (apps === null) { + if (!apps) { apps = {}; } else { apps = JSON.parse(apps); } const key = `custom${Object.keys(apps).length + 1}`; - apps[key] = customApp; - if (g) { - localStorage.setItem("Gcustom", JSON.stringify(apps)); - } else if (c) { - localStorage.setItem("Tcustom", JSON.stringify(apps)); - } else if (a) { - localStorage.setItem("Acustom", JSON.stringify(apps)); - } + setInStorage("custom", JSON.stringify(apps)); } -function setPin(index) { - let pins; - if (g) { - pins = localStorage.getItem("Gpinned"); - } else if (c) { - pins = localStorage.getItem("Tpinned"); - } else if (a) { - pins = localStorage.getItem("Apinned"); - } - - if (pins === null || pins === "") { - pins = []; - } else { - pins = pins.split(",").map(Number); - } - if (pinContains(index, pins)) { - const remove = pins.indexOf(index); - pins.splice(remove, 1); - } else { - pins.push(index); - } - if (g) { - localStorage.setItem("Gpinned", pins); - } else if (c) { - localStorage.setItem("Tpinned", pins); - } else if (a) { - localStorage.setItem("Apinned", pins); - } - location.reload(); -} - -function pinContains(i, p) { - if (p === "") { - return false; - } - for (const x of p) { - if (x === i) { - return true; - } - } - return false; -} - -function Custom(app) { +function createCustomApp() { const title = prompt("Enter title for the app:"); const link = prompt("Enter link for the app:"); + if (title && link) { const customApp = { name: `[Custom] ${title}`, @@ -165,246 +115,222 @@ function Custom(app) { custom: false, }; - CustomApp(customApp); - CreateCustomApp(customApp); + saveCustomApp(customApp); + + const card = renderAppCard(customApp, 0, true); + const nonPinnedContainer = document.querySelector(".apps"); + nonPinnedContainer.insertBefore(card, nonPinnedContainer.firstChild); } } -function CreateCustomApp(customApp) { - const columnDiv = document.createElement("div"); - columnDiv.classList.add("column"); - columnDiv.setAttribute("data-category", "all"); +function getPinnedApps() { + const pins = getFromStorage("pinned") || ""; + return pins ? pins.split(",").map(Number) : []; +} + +function savePinnedApps(pins) { + setInStorage("pinned", pins.join(",")); +} + +function togglePin(appIndex) { + let pins = getPinnedApps(); + const pinIndex = pins.indexOf(appIndex); + if (pinIndex !== -1) { + pins.splice(pinIndex, 1); + } else { + pins.push(appIndex); + } + + savePinnedApps(pins); + location.reload(); +} + +function isAppPinned(appIndex, pinnedList) { + return pinnedList.includes(appIndex); +} + +function createPinButton(appIndex) { const pinIcon = document.createElement("i"); pinIcon.classList.add("fa", "fa-map-pin"); pinIcon.ariaHidden = true; - const btn = document.createElement("button"); - btn.appendChild(pinIcon); - btn.style.float = "right"; - btn.style.cursor = "pointer"; - btn.style.backgroundColor = "rgb(45,45,45)"; - btn.style.borderRadius = "50%"; - btn.style.borderColor = "transparent"; - btn.style.color = "white"; - btn.style.top = "-200px"; - btn.style.position = "relative"; - btn.onclick = () => { - setPin(appInd); - }; - btn.title = "Pin"; - - const linkElem = document.createElement("a"); - linkElem.onclick = () => { - handleClick(customApp); - }; + const button = document.createElement("button"); + button.appendChild(pinIcon); + button.style.cssText = ` + float: right; + cursor: pointer; + background-color: rgb(45,45,45); + border-radius: 50%; + border-color: transparent; + color: white; + top: -200px; + position: relative; + `; + button.onclick = () => togglePin(appIndex); + button.title = "Pin"; + + return button; +} + +function renderAppCard(app, appIndex, isCustom = false) { + const columnDiv = document.createElement("div"); + columnDiv.classList.add("column"); + + const categories = isCustom ? "all" : (app.categories || []).join(" "); + columnDiv.setAttribute("data-category", categories); + + const link = document.createElement("a"); + link.onclick = () => handleAppClick(app); const image = document.createElement("img"); image.width = 145; image.height = 145; - image.src = customApp.image; image.loading = "lazy"; - const paragraph = document.createElement("p"); + if (app.image) { + image.src = app.image; + } else { + image.style.display = "none"; + } - for (const span of Span(customApp.name)) { + const paragraph = document.createElement("p"); + for (const span of createSpanElements(app.name)) { paragraph.appendChild(span); } - linkElem.appendChild(image); - linkElem.appendChild(paragraph); - columnDiv.appendChild(linkElem); - columnDiv.appendChild(btn); + if (app.error) { + paragraph.style.color = "red"; + app.say = app.say || "This app is currently not working."; + } else if (app.load) { + paragraph.style.color = "yellow"; + app.say = app.say || "This app may experience excessive loading times."; + } else if (app.partial) { + paragraph.style.color = "yellow"; + app.say = app.say || "This app is currently experiencing some issues, it may not work for you. (Dynamic doesn't work in about:blank)"; + } - const nonPinnedApps = document.querySelector(".apps"); - nonPinnedApps.insertBefore(columnDiv, nonPinnedApps.firstChild); -} + link.appendChild(image); + link.appendChild(paragraph); + columnDiv.appendChild(link); -document.addEventListener("DOMContentLoaded", () => { - let storedApps; - if (g) { - storedApps = JSON.parse(localStorage.getItem("Gcustom")); - } else if (c) { - storedApps = JSON.parse(localStorage.getItem("Tcustom")); - } else if (a) { - storedApps = JSON.parse(localStorage.getItem("Acustom")); + if (appIndex !== 0) { + columnDiv.appendChild(createPinButton(appIndex)); } + + return columnDiv; +} + +function loadCustomApps() { + const storedApps = getFromStorage("custom"); + if (storedApps) { - for (const app of Object.values(storedApps)) { - CreateCustomApp(app); - } + const apps = JSON.parse(storedApps); + const nonPinnedContainer = document.querySelector(".apps"); + + Object.values(apps).forEach(app => { + const card = renderAppCard(app, 0, true); + nonPinnedContainer.insertBefore(card, nonPinnedContainer.firstChild); + }); } -}); +} -let path = "/assets/json/apps.min.json"; -if (g) { - path = "/assets/json/games.min.json"; -} else if (c) { - path = "/assets/json/t.min.json"; -} else if (a) { - path = "/assets/json/apps.min.json"; +function getJsonPath() { + if (isGamesPage) return "/assets/json/games.min.json"; + if (isToolsPage) return "/assets/json/t.min.json"; + if (isAppsPage) return "/assets/json/apps.min.json"; + return "/assets/json/apps.min.json"; } -fetch(path) - .then(response => { - return response.json(); - }) - .then(appsList => { - appsList.sort((a, b) => { - if (a.name.startsWith("[Custom]")) { - return -1; - } - if (b.name.startsWith("[Custom]")) { - return 1; - } - return a.name.localeCompare(b.name); - }); - const nonPinnedApps = document.querySelector(".apps"); - const pinnedApps = document.querySelector(".pinned"); - let pinList; - if (g) { - pinList = localStorage.getItem("Gpinned") || ""; - } else if (a) { - pinList = localStorage.getItem("Apinned") || ""; - } else if (c) { - pinList = localStorage.getItem("Tpinned") || ""; + +function applyAppFlags(app) { + if (app.categories?.includes("local")) { + app.local = true; + } + + if (app.link && (app.link.includes("now.gg") || app.link.includes("nowgg.me"))) { + if (app.partial === null || app.partial === undefined) { + app.partial = true; + app.say = "Now.gg is currently not working for some users."; } - pinList = pinList ? pinList.split(",").map(Number) : []; - appInd = 0; - - for (const app of appsList) { - if (app.categories?.includes("local")) { - app.local = true; - } else if (app.link && (app.link.includes("now.gg") || app.link.includes("nowgg.me"))) { - if (app.partial === null || app.partial === undefined) { - app.partial = true; - app.say = "Now.gg is currently not working for some users."; - } - } else if (app.link?.includes("nowgg.nl")) { - if (app.error === null || app.error === undefined) { - app.error = true; - app.say = "NowGG.nl is currently down."; - } - } - - const pinNum = appInd; - - const columnDiv = document.createElement("div"); - columnDiv.classList.add("column"); - columnDiv.setAttribute("data-category", app.categories.join(" ")); - - const pinIcon = document.createElement("i"); - pinIcon.classList.add("fa", "fa-map-pin"); - pinIcon.ariaHidden = true; - - const btn = document.createElement("button"); - btn.appendChild(pinIcon); - btn.style.float = "right"; - btn.style.backgroundColor = "rgb(45,45,45)"; - btn.style.borderRadius = "50%"; - btn.style.borderColor = "transparent"; - btn.style.color = "white"; - btn.style.top = "-200px"; - btn.style.position = "relative"; - btn.onclick = () => { - setPin(pinNum); - }; - btn.title = "Pin"; - - const link = document.createElement("a"); - - link.onclick = () => { - handleClick(app); - }; - - const image = document.createElement("img"); - image.width = 145; - image.height = 145; - image.loading = "lazy"; - - if (app.image) { - image.src = app.image; - } else { - image.style.display = "none"; - } - - const paragraph = document.createElement("p"); - - for (const span of Span(app.name)) { - paragraph.appendChild(span); - } - - if (app.error) { - paragraph.style.color = "red"; - if (!app.say) { - app.say = "This app is currently not working."; - } - } else if (app.load) { - paragraph.style.color = "yellow"; - if (!app.say) { - app.say = "This app may experience excessive loading times."; - } - } else if (app.partial) { - paragraph.style.color = "yellow"; - if (!app.say) { - app.say = "This app is currently experiencing some issues, it may not work for you. (Dynamic doesn't work in about:blank)"; - } - } + } + + if (app.link?.includes("nowgg.nl")) { + if (app.error === null || app.error === undefined) { + app.error = true; + app.say = "NowGG.nl is currently down."; + } + } +} + +function loadAppsFromJson() { + const jsonPath = getJsonPath(); + + fetch(jsonPath) + .then(response => response.json()) + .then(appsList => { + appsList.sort((a, b) => { + if (a.name.startsWith("[Custom]")) return -1; + if (b.name.startsWith("[Custom]")) return 1; + return a.name.localeCompare(b.name); + }); - link.appendChild(image); - link.appendChild(paragraph); - columnDiv.appendChild(link); + const nonPinnedContainer = document.querySelector(".apps"); + const pinnedContainer = document.querySelector(".pinned"); + const pinnedList = getPinnedApps(); - if (appInd !== 0) { - columnDiv.appendChild(btn); - } + let appIndex = 0; - if (pinList != null && appInd !== 0) { - if (pinContains(appInd, pinList)) { - pinnedApps.appendChild(columnDiv); + appsList.forEach(app => { + applyAppFlags(app); + + const card = renderAppCard(app, appIndex); + + if (appIndex !== 0 && isAppPinned(appIndex, pinnedList)) { + pinnedContainer.appendChild(card); } else { - nonPinnedApps.appendChild(columnDiv); + nonPinnedContainer.appendChild(card); } - } else { - nonPinnedApps.appendChild(columnDiv); - } - appInd += 1; - } - const appsContainer = document.getElementById("apps-container"); - appsContainer.appendChild(pinnedApps); - appsContainer.appendChild(nonPinnedApps); - }) - .catch(error => { - console.error("Error fetching JSON data:", error); - }); + appIndex++; + }); + + const appsContainer = document.getElementById("apps-container"); + appsContainer.appendChild(pinnedContainer); + appsContainer.appendChild(nonPinnedContainer); + }) + .catch(error => { + console.error("Error fetching app data:", error); + }); +} -function category() { +function filterByCategory() { const selectedCategories = Array.from(document.querySelectorAll("#category option:checked")).map(option => option.value); - const g = document.getElementsByClassName("column"); - for (const game of g) { - const categories = game.getAttribute("data-category").split(" "); + const appCards = document.getElementsByClassName("column"); - if (selectedCategories.length === 0 || selectedCategories.some(category => categories.includes(category))) { - game.style.display = "block"; - } else { - game.style.display = "none"; - } - } + Array.from(appCards).forEach(card => { + const categories = card.getAttribute("data-category").split(" "); + const shouldShow = selectedCategories.length === 0 || selectedCategories.some(cat => categories.includes(cat)); + + card.style.display = shouldShow ? "block" : "none"; + }); } -function bar() { +function filterBySearchTerm() { const input = document.getElementById("search"); - const filter = input.value.toLowerCase(); - const g = document.getElementsByClassName("column"); - - for (const game of g) { - const name = game.getElementsByTagName("p")[0].textContent.toLowerCase(); + const searchTerm = input.value.toLowerCase(); + const appCards = document.getElementsByClassName("column"); - if (name.includes(filter)) { - game.style.display = "block"; - } else { - game.style.display = "none"; - } - } + Array.from(appCards).forEach(card => { + const appName = card.getElementsByTagName("p")[0].textContent.toLowerCase(); + card.style.display = appName.includes(searchTerm) ? "block" : "none"; + }); } + +window.category = filterByCategory; +window.bar = filterBySearchTerm; + +document.addEventListener("DOMContentLoaded", () => { + loadCustomApps(); + loadAppsFromJson(); +}); From da38920690c07b4fc82f921408090ffb7b163431 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 05:28:59 -0400 Subject: [PATCH 008/115] refactor: pin "create custom app" and "request an app" cards --- static/apps.html | 6 ++-- static/assets/js/launcher.js | 59 ++++++++++++++++++------------- static/assets/json/apps.json | 20 ++++------- static/assets/json/apps.min.json | 2 +- static/assets/json/games.json | 20 ++++------- static/assets/json/games.min.json | 2 +- static/games.html | 6 ++-- 7 files changed, 58 insertions(+), 57 deletions(-) diff --git a/static/apps.html b/static/apps.html index 3a908bc4b5..cd74653546 100644 --- a/static/apps.html +++ b/static/apps.html @@ -41,8 +41,10 @@ -
-
+
+
+
+
diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index 5543db703a..63500fd3e5 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -118,8 +118,8 @@ function createCustomApp() { saveCustomApp(customApp); const card = renderAppCard(customApp, 0, true); - const nonPinnedContainer = document.querySelector(".apps"); - nonPinnedContainer.insertBefore(card, nonPinnedContainer.firstChild); + const pinnedContainer = document.querySelector(".pinned"); + pinnedContainer.appendChild(card); } } @@ -214,27 +214,13 @@ function renderAppCard(app, appIndex, isCustom = false) { link.appendChild(paragraph); columnDiv.appendChild(link); - if (appIndex !== 0) { + if (appIndex !== 0 && appIndex !== 1) { columnDiv.appendChild(createPinButton(appIndex)); } return columnDiv; } -function loadCustomApps() { - const storedApps = getFromStorage("custom"); - - if (storedApps) { - const apps = JSON.parse(storedApps); - const nonPinnedContainer = document.querySelector(".apps"); - - Object.values(apps).forEach(app => { - const card = renderAppCard(app, 0, true); - nonPinnedContainer.insertBefore(card, nonPinnedContainer.firstChild); - }); - } -} - function getJsonPath() { if (isGamesPage) return "/assets/json/games.min.json"; if (isToolsPage) return "/assets/json/t.min.json"; @@ -268,15 +254,25 @@ function loadAppsFromJson() { fetch(jsonPath) .then(response => response.json()) .then(appsList => { + const nonPinnedContainer = document.querySelector(".apps"); + const pinnedContainer = document.querySelector(".pinned"); + const pinnedList = getPinnedApps(); + + const appsContainer = document.getElementById("apps-container"); + if (appsContainer) { + appsContainer.appendChild(pinnedContainer); + appsContainer.appendChild(nonPinnedContainer); + } + + const specialCards = appsList.splice(0, 2); + appsList.sort((a, b) => { if (a.name.startsWith("[Custom]")) return -1; if (b.name.startsWith("[Custom]")) return 1; return a.name.localeCompare(b.name); }); - const nonPinnedContainer = document.querySelector(".apps"); - const pinnedContainer = document.querySelector(".pinned"); - const pinnedList = getPinnedApps(); + appsList.unshift(...specialCards); let appIndex = 0; @@ -285,7 +281,9 @@ function loadAppsFromJson() { const card = renderAppCard(app, appIndex); - if (appIndex !== 0 && isAppPinned(appIndex, pinnedList)) { + if (appIndex === 0 || appIndex === 1) { + pinnedContainer.appendChild(card); + } else if (pinnedList != null && isAppPinned(appIndex, pinnedList)) { pinnedContainer.appendChild(card); } else { nonPinnedContainer.appendChild(card); @@ -294,15 +292,27 @@ function loadAppsFromJson() { appIndex++; }); - const appsContainer = document.getElementById("apps-container"); - appsContainer.appendChild(pinnedContainer); - appsContainer.appendChild(nonPinnedContainer); + loadCustomAppsInline(); }) .catch(error => { console.error("Error fetching app data:", error); }); } +function loadCustomAppsInline() { + const storedApps = getFromStorage("custom"); + + if (storedApps) { + const apps = JSON.parse(storedApps); + + const pinnedContainer = document.querySelector(".pinned"); + Object.values(apps).forEach(app => { + const card = renderAppCard(app, 0, true); + pinnedContainer.appendChild(card); + }); + } +} + function filterByCategory() { const selectedCategories = Array.from(document.querySelectorAll("#category option:checked")).map(option => option.value); @@ -331,6 +341,5 @@ window.category = filterByCategory; window.bar = filterBySearchTerm; document.addEventListener("DOMContentLoaded", () => { - loadCustomApps(); loadAppsFromJson(); }); diff --git a/static/assets/json/apps.json b/static/assets/json/apps.json index 5d8950259d..4db46e0d4f 100644 --- a/static/assets/json/apps.json +++ b/static/assets/json/apps.json @@ -1,22 +1,16 @@ [ + { + "name": "Request An App", + "link": "https://forms.gle/vwdHN3iPz5cLaHaMA", + "image": "/assets/media/icons/request.webp", + "categories": ["all"] + }, { - "name": "! Create Custom App", + "name": "Create Custom App", "image": "/assets/media/icons/custom.webp", "categories": ["all"], "custom": "true" }, - { - "name": "! Interstellar FAQ/Docs", - "image": "/assets/media/icons/help_center_googlefonts.png", - "link": "https://docs.gointerstellar.app", - "categories": ["all"] - }, - { - "name": "! [NEW] Request An App", - "link": "https://forms.gle/vwdHN3iPz5cLaHaMA", - "image": "/assets/media/icons/request.webp", - "categories": ["all"] - }, { "name": "Amazon", "link": "https://amazon.com/", diff --git a/static/assets/json/apps.min.json b/static/assets/json/apps.min.json index e34937a417..a3e5303d49 100644 --- a/static/assets/json/apps.min.json +++ b/static/assets/json/apps.min.json @@ -1 +1 @@ -[{"name":"! Create Custom App","image":"/assets/media/icons/custom.webp","categories":["all"],"custom":"true"},{"name":"! Interstellar FAQ/Docs","image":"/assets/media/icons/help_center_googlefonts.png","link":"https://docs.gointerstellar.app","categories":["all"]},{"name":"! [NEW] Request An App","link":"https://forms.gle/vwdHN3iPz5cLaHaMA","image":"/assets/media/icons/request.webp","categories":["all"]},{"name":"Amazon","link":"https://amazon.com/","image":"/assets/media/icons/amazon.webp","categories":["all"]},{"name":"Steam","link":"https://store.steampowered.com/","image":"/assets/media/icons/steam.webp","categories":["all"],"say":"Steam can't actually be added because it's an app, not a website. This only lets you browse the Steam website, you can't actually play any games unless you use Geforce Now.","partial":true},{"name":"BuzzFeed Quizzes","link":"https://www.buzzfeed.com/quizzes","image":"/assets/media/icons/buzzfeed.webp","categories":["all"]},{"name":"Guilded","link":"https://www.guilded.gg/","image":"/assets/media/icons/guilded.webp","categories":["all","social"]},{"name":"Android","link":"https://now.gg/iframe/snippet?app_pkg=com.uncube.launcher3&partner=interstellar","image":"/assets/media/icons/android.webp","categories":["all","emu","android"]},{"name":"Temu","link":"https://www.temu.com/","image":"/assets/media/icons/temu.webp","categories":["all"]},{"name":"Character AI","link":"https://now.gg/iframe/snippet?app_pkg=ai.character.app&partner=interstellar","image":"/assets/media/icons/characterai.webp","categories":["all","emu","android"]},{"name":"Aptoide","link":"https://now.gg/iframe/snippet?app_pkg=com.aptoide.partners.nowgg.store&partner=interstellar","image":"/assets/media/icons/aptoide.webp","categories":["all","emu","android"]},{"name":"Scratch","link":"https://scratch.mit.edu","image":"/assets/media/icons/scratch.webp","categories":["all","social","game"]},{"name":"Chess.com","link":"https://www.chess.com/","image":"/assets/media/icons/chess.webp","categories":["all","game"]},{"name":"Cool Math Games","link":"https://www.coolmathgames.com/","image":"/assets/media/icons/coolmath.webp","categories":["all","game"]},{"name":"Discord","links":[{"name":"Discord","url":"https://discord.com"},{"name":"Discord Canary","url":"https://canary.discord.com"},{"name":"Discord PTB","url":"https://ptb.discord.com"}],"image":"/assets/media/icons/dc.jpg","categories":["all","social"]},{"name":"ESPN","link":"https://www.espn.com/watch/","image":"/assets/media/icons/espn.webp","categories":["all"]},{"name":"Fifa Rosters","link":"https://fifarosters.com/","image":"/assets/media/icons/fifa.webp","categories":["all"]},{"name":"Firefox Web Browser","link":"https://replit.com/@cooleddie001/Firefox-Legacy?v=1","image":"/assets/media/icons/firefox.webp","categories":["all"]},{"name":"Flix HQ","link":"https://flixhq.to","image":"/assets/media/icons/flixhq.webp","categories":["all","media"]},{"name":"Geforce NOW","link":"https://play.geforcenow.com","image":"/assets/media/icons/geforce-now.webp","categories":["all","stream","cloud"]},{"name":"Github","link":"https://github.com","image":"/assets/media/icons/github.webp","categories":["all"]},{"name":"Google","link":"https://google.com","image":"/assets/media/icons/google.webp","categories":["all"]},{"name":"HBO MAX","link":"https://www.hbomax.com/","image":"/assets/media/icons/hbo.webp","categories":["all","stream"]},{"name":"Messenger","link":"https://messenger.com/","image":"/assets/media/icons/messenger.webp","categories":["all","social","message"]},{"name":"MLB","link":"https://mlb.com","image":"/assets/media/icons/mlb.webp","categories":["all"]},{"name":"NFL","link":"https://nfl.com","image":"/assets/media/icons/nfl.webp","categories":["all"]},{"name":"NBA","link":"https://nba.com","image":"assets/media/icons/nba.webp","categories":["all"]},{"name":"Paramount Plus","link":"https://paramountplus.com","image":"/assets/media/icons/paramount.webp","categories":["all","stream"]},{"name":"Pinterest","link":"https://pinterest.com","image":"/assets/media/icons/pinterest.webp","categories":["all"]},{"name":"Pixlr","link":"https://pixlr.com/","image":"/assets/media/icons/pix.webp","categories":["all"]},{"name":"Poki","link":"https://poki.com","image":"/assets/media/icons/poki.webp","categories":["all","game"]},{"name":"Premier League","link":"https://premierleague.com","image":"/assets/media/icons/pl.webp","categories":["all"]},{"name":"Soundcloud","link":"https://soundcloud.com","image":"/assets/media/icons/soundcloud.webp","categories":["all"]},{"name":"Spotify","image":"/assets/media/icons/spotify.webp","categories":["all"],"error":true},{"name":"Telegram","link":"https://web.telegram.org/","image":"/assets/media/icons/telegram.webp","categories":["all","social"]},{"name":"Tiktok","link":"https://tiktok.com","image":"/assets/media/icons/tiktok.webp","categories":["all","social"]},{"name":"Free Media Heck Yeah","link":"https://fmhy.pages.dev","image":"/assets/media/icons/fmhy.webp","categories":["all","media"]},{"name":"Canva","link":"https://canva.com","image":"/assets/media/icons/canva.webp","categories":["all"]},{"name":"Wikipedia","link":"https://en.wikipedia.org","image":"/assets/media/icons/wiki.webp","categories":["all"]},{"name":"GOAL","link":"https://goal.com","image":"/assets/media/icons/goal.webp","categories":["all"]},{"name":"Trello","link":"https://trello.com","image":"/assets/media/icons/trello.webp","categories":["all"]},{"name":"Gidd.io Games","link":"https://gidd.io","image":"/assets/media/icons/gidd.webp","categories":["all"]},{"name":"Tumblr","link":"https://tumblr.com/","image":"/assets/media/icons/tumblr.webp","categories":["all","social"]},{"name":"Twitch","link":"https://twitch.tv","image":"/assets/media/icons/twitch.webp","categories":["all","stream"]},{"name":"Twitter","link":"https://twitter.com","image":"/assets/media/icons/twitter.webp","categories":["all","social"]},{"name":"VS Code","link":"https://vscode.dev","image":"/assets/media/icons/vscode.webp","categories":["all","tool"]},{"name":"Y8 Games","link":"https://y8.com/","image":"/assets/media/icons/y8.webp","categories":["all","game"]},{"name":"YouTube","link":"https://youtube.com","image":"/assets/media/icons/youtube.webp","categories":["all","social","stream"],"dy":"true","partial":"true"},{"name":"YouTube Alternative (Invidious)","link":"https://vid.puffyan.us/","image":"/assets/media/icons/youtube.webp","categories":["all","social","stream"]},{"name":"Whatsapp","image":"/assets/media/icons/whatsapp.webp","categories":["all","message","social"],"error":true},{"name":"Wattpad","link":"https://www.wattpad.com/","image":"/assets/media/icons/wattpad.webp","categories":["all","social"]},{"name":"Discord - Login","links":[{"name":"Discord","url":"https://discord.com/login"},{"name":"Discord Canary","url":"https://canary.discord.com/login"},{"name":"Discord PTB","url":"https://ptb.discord.com/login"}],"image":"/assets/media/icons/dc.jpg","categories":["all","social"],"blank":"true"},{"name":"HD Today","link":"https://hdtoday.tv","image":"/assets/media/icons/hd.webp","categories":["all","stream","media"]},{"name":"Now.GG","link":"https://now.gg","image":"/assets/media/icons/now-gg.webp","categories":["all","emu","android"]},{"name":"Now.GG (NowGG.me) [Working]","link":"https://nowgg.me","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Vercel","link":"https://vercel.com","image":"/assets/media/icons/vercel.webp","categories":["all","tool"]},{"name":"Amazon Luna","link":"https://luna.amazon.com/","image":"/assets/media/icons/amazon-luna.webp","categories":["all","game","cloud"],"blank":"true"},{"name":"Google Gemini","link":"https://gemini.google.com","image":"/assets/media/icons/gemini.webp","categories":["all","ai"]},{"name":"Google Mail (Gmail)","link":"https://mail.google.com/","image":"/assets/media/icons/gmail.webp","categories":["all","mail"],"blank":"true","partial":"true"},{"name":"Outlook","link":"https://outlook.live.com/","image":"/assets/media/icons/outlook.webp","categories":["all","mail"],"dy":"true","partial":"true"},{"name":"Snapchat","image":"/assets/media/icons/snap.webp","categories":["all","social","message"],"error":"true"},{"name":"W3Schools","link":"https://www.w3schools.com","image":"/assets/media/icons/W3Schools.webp","categories":["all"]},{"name":"Newgrounds","link":"https://www.newgrounds.com","image":"/assets/media/icons/newgrounds.webp","categories":["all","social","game"]},{"name":"Instagram","image":"/assets/media/icons/insta.webp","categories":["all","social","message"],"error":"true"},{"name":"Proton Mail","image":"/assets/media/icons/proton.webp","categories":["all"],"error":"true"},{"name":"SpaceHey","link":"https://www.spacehey.com","image":"/assets/media/icons/spacehey.png","categories":["all","social"]},{"name":"FMovies.to","link":"https://fmovies24.to/","image":"/assets/media/icons/FM.png","categories":["all","media"]},{"name":"EMovies.si","link":"https://emovies.si","categories":["all","media"]},{"name":"Movie Web","link":"https://movie-web-me.vercel.app/","image":"/assets/media/icons/MW.png","say":"This is not an official domain for Movie Web","categories":["all","media"]},{"name":"Sudo-Flix.Lol (Movie Web Clone)","link":"https://sudo-flix.lol/","image":"/assets/media/icons/MW.png","say":"This is not an official domain for Movie Web","categories":["all","media"]},{"name":"GBA Games","link":"https://gba.js.org/","image":"/assets/media/icons/gba.png","categories":["all","emu"]},{"name":"GPTZero.me","link":"https://gptzero.me/","image":"/assets/media/icons/gz.webp","categories":["all","ad"]},{"name":"ZeroGPT.com","link":"https://www.zerogpt.com/","image":"/assets/media/icons/zg.webp","categories":["all","ad"]},{"name":"ChatGPT","link":"https://chat.openai.com","image":"/assets/media/icons/gpt.jpg","categories":["all","ai"],"error":"true","say":"You must have a ChatGPT account to use the site, also the site may have some issues if you don't minimize tabs while using it."},{"name":"CopyLeaks.com","link":"https://copyleaks.com/ai-content-detector","image":"/assets/media/icons/cl.jpg","categories":["all","ad"]},{"name":"Writer.com","link":"https://writer.com/ai-content-detector/","image":"/assets/media/icons/wr.png","categories":["all","ad"]},{"name":"Quillbot.com AI Detector","link":"https://quillbot.com/ai-content-detector","image":"/assets/media/icons/qb.jpg","categories":["all","ad"]},{"name":"Kome.ai YouTube Transcript","link":"https://kome.ai/tools/youtube-transcript-generator","image":"/assets/media/icons/km.webp","categories":["all","ts"]},{"name":"NoteGPT.io YouTube Transcript","link":"https://notegpt.io/youtube-transcript-generator","image":"/assets/media/icons/ng.jpg","categories":["all","ts"]},{"name":"Grammarly Plagiarism Checker","link":"https://www.grammarly.com/plagiarism-checker","image":"/assets/media/icons/gm.png","categories":["all","pc"]},{"name":"Plagiarism Detector","link":"https://plagiarismdetector.net/","image":"/assets/media/icons/pdn.png","categories":["all","pc"]},{"name":"Blooket Cheats","link":"https://github.com/005konz/Blooket-Cheats","image":"/assets/media/icons/bl.webp","categories":["all","bl","cs"]},{"name":"Edpuzzle Cheats","link":"https://github.com/ading2210/edpuzzle-answers","image":"/assets/media/icons/ep.png","categories":["all","ep","cs"]},{"name":"DeepAI.org","link":"https://deepai.org/","image":"/assets/media/icons/da.webp","categories":["all","ai"]},{"name":"FreedomGPT","link":"https://chat.freedomgpt.com/","categories":["all","ai"]},{"name":"TalkAI.info","link":"https://talkai.info/chat/","image":"/assets/media/icons/ta.webp","categories":["all","ai"]}] \ No newline at end of file +[{"name":"Request An App","link":"https://forms.gle/vwdHN3iPz5cLaHaMA","image":"/assets/media/icons/request.webp","categories":["all"]},{"name":"Create Custom App","image":"/assets/media/icons/custom.webp","categories":["all"],"custom":"true"},{"name":"Amazon","link":"https://amazon.com/","image":"/assets/media/icons/amazon.webp","categories":["all"]},{"name":"Steam","link":"https://store.steampowered.com/","image":"/assets/media/icons/steam.webp","categories":["all"],"say":"Steam can't actually be added because it's an app, not a website. This only lets you browse the Steam website, you can't actually play any games unless you use Geforce Now.","partial":true},{"name":"BuzzFeed Quizzes","link":"https://www.buzzfeed.com/quizzes","image":"/assets/media/icons/buzzfeed.webp","categories":["all"]},{"name":"Guilded","link":"https://www.guilded.gg/","image":"/assets/media/icons/guilded.webp","categories":["all","social"]},{"name":"Android","link":"https://now.gg/iframe/snippet?app_pkg=com.uncube.launcher3&partner=interstellar","image":"/assets/media/icons/android.webp","categories":["all","emu","android"]},{"name":"Temu","link":"https://www.temu.com/","image":"/assets/media/icons/temu.webp","categories":["all"]},{"name":"Character AI","link":"https://now.gg/iframe/snippet?app_pkg=ai.character.app&partner=interstellar","image":"/assets/media/icons/characterai.webp","categories":["all","emu","android"]},{"name":"Aptoide","link":"https://now.gg/iframe/snippet?app_pkg=com.aptoide.partners.nowgg.store&partner=interstellar","image":"/assets/media/icons/aptoide.webp","categories":["all","emu","android"]},{"name":"Scratch","link":"https://scratch.mit.edu","image":"/assets/media/icons/scratch.webp","categories":["all","social","game"]},{"name":"Chess.com","link":"https://www.chess.com/","image":"/assets/media/icons/chess.webp","categories":["all","game"]},{"name":"Cool Math Games","link":"https://www.coolmathgames.com/","image":"/assets/media/icons/coolmath.webp","categories":["all","game"]},{"name":"Discord","links":[{"name":"Discord","url":"https://discord.com"},{"name":"Discord Canary","url":"https://canary.discord.com"},{"name":"Discord PTB","url":"https://ptb.discord.com"}],"image":"/assets/media/icons/dc.jpg","categories":["all","social"]},{"name":"ESPN","link":"https://www.espn.com/watch/","image":"/assets/media/icons/espn.webp","categories":["all"]},{"name":"Fifa Rosters","link":"https://fifarosters.com/","image":"/assets/media/icons/fifa.webp","categories":["all"]},{"name":"Firefox Web Browser","link":"https://replit.com/@cooleddie001/Firefox-Legacy?v=1","image":"/assets/media/icons/firefox.webp","categories":["all"]},{"name":"Flix HQ","link":"https://flixhq.to","image":"/assets/media/icons/flixhq.webp","categories":["all","media"]},{"name":"Geforce NOW","link":"https://play.geforcenow.com","image":"/assets/media/icons/geforce-now.webp","categories":["all","stream","cloud"]},{"name":"Github","link":"https://github.com","image":"/assets/media/icons/github.webp","categories":["all"]},{"name":"Google","link":"https://google.com","image":"/assets/media/icons/google.webp","categories":["all"]},{"name":"HBO MAX","link":"https://www.hbomax.com/","image":"/assets/media/icons/hbo.webp","categories":["all","stream"]},{"name":"Messenger","link":"https://messenger.com/","image":"/assets/media/icons/messenger.webp","categories":["all","social","message"]},{"name":"MLB","link":"https://mlb.com","image":"/assets/media/icons/mlb.webp","categories":["all"]},{"name":"NFL","link":"https://nfl.com","image":"/assets/media/icons/nfl.webp","categories":["all"]},{"name":"NBA","link":"https://nba.com","image":"assets/media/icons/nba.webp","categories":["all"]},{"name":"Paramount Plus","link":"https://paramountplus.com","image":"/assets/media/icons/paramount.webp","categories":["all","stream"]},{"name":"Pinterest","link":"https://pinterest.com","image":"/assets/media/icons/pinterest.webp","categories":["all"]},{"name":"Pixlr","link":"https://pixlr.com/","image":"/assets/media/icons/pix.webp","categories":["all"]},{"name":"Poki","link":"https://poki.com","image":"/assets/media/icons/poki.webp","categories":["all","game"]},{"name":"Premier League","link":"https://premierleague.com","image":"/assets/media/icons/pl.webp","categories":["all"]},{"name":"Soundcloud","link":"https://soundcloud.com","image":"/assets/media/icons/soundcloud.webp","categories":["all"]},{"name":"Spotify","image":"/assets/media/icons/spotify.webp","categories":["all"],"error":true},{"name":"Telegram","link":"https://web.telegram.org/","image":"/assets/media/icons/telegram.webp","categories":["all","social"]},{"name":"Tiktok","link":"https://tiktok.com","image":"/assets/media/icons/tiktok.webp","categories":["all","social"]},{"name":"Free Media Heck Yeah","link":"https://fmhy.pages.dev","image":"/assets/media/icons/fmhy.webp","categories":["all","media"]},{"name":"Canva","link":"https://canva.com","image":"/assets/media/icons/canva.webp","categories":["all"]},{"name":"Wikipedia","link":"https://en.wikipedia.org","image":"/assets/media/icons/wiki.webp","categories":["all"]},{"name":"GOAL","link":"https://goal.com","image":"/assets/media/icons/goal.webp","categories":["all"]},{"name":"Trello","link":"https://trello.com","image":"/assets/media/icons/trello.webp","categories":["all"]},{"name":"Gidd.io Games","link":"https://gidd.io","image":"/assets/media/icons/gidd.webp","categories":["all"]},{"name":"Tumblr","link":"https://tumblr.com/","image":"/assets/media/icons/tumblr.webp","categories":["all","social"]},{"name":"Twitch","link":"https://twitch.tv","image":"/assets/media/icons/twitch.webp","categories":["all","stream"]},{"name":"Twitter","link":"https://twitter.com","image":"/assets/media/icons/twitter.webp","categories":["all","social"]},{"name":"VS Code","link":"https://vscode.dev","image":"/assets/media/icons/vscode.webp","categories":["all","tool"]},{"name":"Y8 Games","link":"https://y8.com/","image":"/assets/media/icons/y8.webp","categories":["all","game"]},{"name":"YouTube","link":"https://youtube.com","image":"/assets/media/icons/youtube.webp","categories":["all","social","stream"],"dy":"true","partial":"true"},{"name":"YouTube Alternative (Invidious)","link":"https://vid.puffyan.us/","image":"/assets/media/icons/youtube.webp","categories":["all","social","stream"]},{"name":"Whatsapp","image":"/assets/media/icons/whatsapp.webp","categories":["all","message","social"],"error":true},{"name":"Wattpad","link":"https://www.wattpad.com/","image":"/assets/media/icons/wattpad.webp","categories":["all","social"]},{"name":"Discord - Login","links":[{"name":"Discord","url":"https://discord.com/login"},{"name":"Discord Canary","url":"https://canary.discord.com/login"},{"name":"Discord PTB","url":"https://ptb.discord.com/login"}],"image":"/assets/media/icons/dc.jpg","categories":["all","social"],"blank":"true"},{"name":"HD Today","link":"https://hdtoday.tv","image":"/assets/media/icons/hd.webp","categories":["all","stream","media"]},{"name":"Now.GG","link":"https://now.gg","image":"/assets/media/icons/now-gg.webp","categories":["all","emu","android"]},{"name":"Now.GG (NowGG.me) [Working]","link":"https://nowgg.me","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Vercel","link":"https://vercel.com","image":"/assets/media/icons/vercel.webp","categories":["all","tool"]},{"name":"Amazon Luna","link":"https://luna.amazon.com/","image":"/assets/media/icons/amazon-luna.webp","categories":["all","game","cloud"],"blank":"true"},{"name":"Google Gemini","link":"https://gemini.google.com","image":"/assets/media/icons/gemini.webp","categories":["all","ai"]},{"name":"Google Mail (Gmail)","link":"https://mail.google.com/","image":"/assets/media/icons/gmail.webp","categories":["all","mail"],"blank":"true","partial":"true"},{"name":"Outlook","link":"https://outlook.live.com/","image":"/assets/media/icons/outlook.webp","categories":["all","mail"],"dy":"true","partial":"true"},{"name":"Snapchat","image":"/assets/media/icons/snap.webp","categories":["all","social","message"],"error":"true"},{"name":"W3Schools","link":"https://www.w3schools.com","image":"/assets/media/icons/W3Schools.webp","categories":["all"]},{"name":"Newgrounds","link":"https://www.newgrounds.com","image":"/assets/media/icons/newgrounds.webp","categories":["all","social","game"]},{"name":"Instagram","image":"/assets/media/icons/insta.webp","categories":["all","social","message"],"error":"true"},{"name":"Proton Mail","image":"/assets/media/icons/proton.webp","categories":["all"],"error":"true"},{"name":"SpaceHey","link":"https://www.spacehey.com","image":"/assets/media/icons/spacehey.png","categories":["all","social"]},{"name":"FMovies.to","link":"https://fmovies24.to/","image":"/assets/media/icons/FM.png","categories":["all","media"]},{"name":"EMovies.si","link":"https://emovies.si","categories":["all","media"]},{"name":"Movie Web","link":"https://movie-web-me.vercel.app/","image":"/assets/media/icons/MW.png","say":"This is not an official domain for Movie Web","categories":["all","media"]},{"name":"Sudo-Flix.Lol (Movie Web Clone)","link":"https://sudo-flix.lol/","image":"/assets/media/icons/MW.png","say":"This is not an official domain for Movie Web","categories":["all","media"]},{"name":"GBA Games","link":"https://gba.js.org/","image":"/assets/media/icons/gba.png","categories":["all","emu"]},{"name":"GPTZero.me","link":"https://gptzero.me/","image":"/assets/media/icons/gz.webp","categories":["all","ad"]},{"name":"ZeroGPT.com","link":"https://www.zerogpt.com/","image":"/assets/media/icons/zg.webp","categories":["all","ad"]},{"name":"ChatGPT","link":"https://chat.openai.com","image":"/assets/media/icons/gpt.jpg","categories":["all","ai"],"error":"true","say":"You must have a ChatGPT account to use the site, also the site may have some issues if you don't minimize tabs while using it."},{"name":"CopyLeaks.com","link":"https://copyleaks.com/ai-content-detector","image":"/assets/media/icons/cl.jpg","categories":["all","ad"]},{"name":"Writer.com","link":"https://writer.com/ai-content-detector/","image":"/assets/media/icons/wr.png","categories":["all","ad"]},{"name":"Quillbot.com AI Detector","link":"https://quillbot.com/ai-content-detector","image":"/assets/media/icons/qb.jpg","categories":["all","ad"]},{"name":"Kome.ai YouTube Transcript","link":"https://kome.ai/tools/youtube-transcript-generator","image":"/assets/media/icons/km.webp","categories":["all","ts"]},{"name":"NoteGPT.io YouTube Transcript","link":"https://notegpt.io/youtube-transcript-generator","image":"/assets/media/icons/ng.jpg","categories":["all","ts"]},{"name":"Grammarly Plagiarism Checker","link":"https://www.grammarly.com/plagiarism-checker","image":"/assets/media/icons/gm.png","categories":["all","pc"]},{"name":"Plagiarism Detector","link":"https://plagiarismdetector.net/","image":"/assets/media/icons/pdn.png","categories":["all","pc"]},{"name":"Blooket Cheats","link":"https://github.com/005konz/Blooket-Cheats","image":"/assets/media/icons/bl.webp","categories":["all","bl","cs"]},{"name":"Edpuzzle Cheats","link":"https://github.com/ading2210/edpuzzle-answers","image":"/assets/media/icons/ep.png","categories":["all","ep","cs"]},{"name":"DeepAI.org","link":"https://deepai.org/","image":"/assets/media/icons/da.webp","categories":["all","ai"]},{"name":"FreedomGPT","link":"https://chat.freedomgpt.com/","categories":["all","ai"]},{"name":"TalkAI.info","link":"https://talkai.info/chat/","image":"/assets/media/icons/ta.webp","categories":["all","ai"]}] \ No newline at end of file diff --git a/static/assets/json/games.json b/static/assets/json/games.json index c1913abe04..6f9e00eb7f 100644 --- a/static/assets/json/games.json +++ b/static/assets/json/games.json @@ -1,22 +1,16 @@ [ + { + "name": "Request A Game", + "link": "https://forms.gle/vwdHN3iPz5cLaHaMA", + "image": "/assets/media/icons/request.webp", + "categories": ["all"] + }, { - "name": "! Create Custom App", + "name": "Create Custom Game", "image": "/assets/media/icons/custom.webp", "categories": ["all"], "custom": "true" }, - { - "name": "! Interstellar FAQ/Docs", - "image": "/assets/media/icons/help_center_googlefonts.png", - "link": "https://docs.gointerstellar.app", - "categories": ["all"] - }, - { - "name": "! [NEW] Request A Game", - "link": "https://forms.gle/vwdHN3iPz5cLaHaMA", - "image": "/assets/media/icons/request.webp", - "categories": ["all"] - }, { "name": "Fancade", "link": "https://play.fancade.com", diff --git a/static/assets/json/games.min.json b/static/assets/json/games.min.json index dd63461014..ea30829eac 100644 --- a/static/assets/json/games.min.json +++ b/static/assets/json/games.min.json @@ -1 +1 @@ -[{"name":"! Create Custom App","image":"/assets/media/icons/custom.webp","categories":["all"],"custom":"true"},{"name":"! Interstellar FAQ/Docs","image":"/assets/media/icons/help_center_googlefonts.png","link":"https://docs.gointerstellar.app","categories":["all"]},{"name":"! [NEW] Request A Game","link":"https://forms.gle/vwdHN3iPz5cLaHaMA","image":"/assets/media/icons/request.webp","categories":["all"]},{"name":"Fancade","link":"https://play.fancade.com","image":"/assets/media/icon/fancade.jpg","categories":["all"]},{"name":"Amazon Luna","link":"https://luna.amazon.com/","image":"/assets/media/icons/amazon-luna.webp","categories":["all"],"blank":"true"},{"name":"Gartic Phone","link":"https://garticphone.com","image":"/assets/media/icons/garticphone.webp","categories":["all"]},{"name":"Newgrounds","link":"https://newgrounds.com/","image":"/assets/media/icons/newgrounds.webp","categories":["all"]},{"name":"Pranx","link":"https://pranx.com/","image":"/assets/media/icons/pranx.webp","categories":["all"]},{"name":"Steam","link":"https://steampowered.com/","image":"/assets/media/icons/steam.webp","categories":["all"],"say":"Steam can't actually be added because it's an app, not a website. This only lets you browse the Steam website, you can't actually play any games unless you use Geforce Now.","partial":true},{"name":"Swordbattle.io","link":"https://swordbattle.io/","image":"/assets/media/icons/swordbattle.webp","categories":["all","2d"]},{"name":"Stabfish.io","link":"https://stabfish.io/","image":"/assets/media/icons/stabfish.webp","categories":["all","2P"]},{"name":"Dynast.io","link":"https://dynast.io","image":"/assets/media/icons/dynast-io.webp","categories":["all"]},{"name":"Twisted Cooking Mama","link":"https://twisted-cooking-mama.game-files.crazygames.com/ruffle/twisted-cooking-mama/1/twistedcookingmama.html?v=1.273","image":"/assets/media/icons/twistedcookingmama.webp","categories":["all"]},{"name":"Marbles Garden","link":"https://www.coolmathgames.com/0-marbles-garden/play","image":"/assets/media/icons/marblesgarden.webp","categories":["all"]},{"name":"Fancy Pants Adventure","link":"https://games.crazygames.com/en_US/fancy-pants-adventure-world/index.html?v=1.273","image":"/assets/media/icons/fancypantsadventures.webp","categories":["all"]},{"name":"Fancy Pants Adventure 2","link":"https://games.crazygames.com/en_US/fancy-pants-adventure-world/index.html?v=1.273","image":"/assets/media/icons/fancypantsadventures2.webp","categories":["all"]},{"name":"Rooftop Snipers 2","link":"https://h5cdn.github.io/s6/rooftop-snipers-2/","image":"/assets/media/icons/rooftopsnipers2.webp","categories":["all"]},{"name":"Stickman Archero Fight","link":"https://html5.gamedistribution.com/rvvASMiM/3f4c166817ad4fd4b5b05d9adba22fcd/index.html","image":"/assets/media/icons/stickman-archero-fight.webp","categories":["all"]},{"name":"Earn to Die 2012 Part 2","link":"https://games-online.io/game/EarnToDie/index.html","image":"/assets/media/icons/earntodie2012part2.webp","categories":["all"]},{"name":"Lostgamer","link":"https://lostgamer.io","image":"/assets/media/icons/lostgamerio.webp","categories":["all","2P"]},{"name":"Thisissand","link":"https://thisissand.com/","image":"/assets/media/icons/thisissand.webp","categories":["all"]},{"name":"digdig.io","link":"https://digdig.io/","image":"/assets/media/icons/digdigio.webp","categories":["all","2P"]},{"name":"Big Tower Tiny Square","link":"https://www.coolmathgames.com/0-big-tower-tiny-square/play","image":"/assets/media/icons/bigtowertinysquare.webp","categories":["all"]},{"name":"The Impossible Quiz","link":"https://the-impossible-quiz.game-files.crazygames.com/ruffle/theimpossiblequiz.html","image":"/assets/media/icons/theimpossiblequiz.webp","categories":["all"]},{"name":"Helix Jump","link":"https://helix-jump.game-files.crazygames.com/helix-jump/1/index.html","image":"/assets/media/icons/helixjump.webp","categories":["all"]},{"name":"skribbl","link":"https://skribbl.io/","image":"/assets/media/icons/skribblio.webp","categories":["all","2P"]},{"name":"Wings!","link":"https://wings.io/","image":"/assets/media/icons/wingsio.webp","categories":["all","2P"]},{"name":"Stomped.io","link":"https://stomped.io","image":"/assets/media/icons/stompedio.webp","categories":["all"]},{"name":"Age of War","link":"https://age-of-war.game-files.crazygames.com/ruffle/ageofwar.html","image":"/assets/media/icons/ageofwar.webp","categories":["all","2P"]},{"name":"Brain Test","link":"https://0322484b-7a58-4454-9667-f805afffded5.poki-gdn.com/2e6b68d3-0f43-4b84-9c14-ab59f94e566c/index.html?country=US&ccpaApplies=0&url_referrer=https%3A%2F%2Fpoki.com%2F&tag=pg-v3.132.1&site_id=3&iso_lang=en&poki_url=https%3A%2F%2Fpoki.com%2Fen%2Fg%2Fbrain-test-tricky-puzzles&gdhoist=yes&nonPersonalized=n&familyFriendly=n&categories=7%2C16%2C37%2C72%2C96%2C400%2C832%2C843%2C1140%2C1150%2C1159&special_condition=landing&game_id=0322484b-7a58-4454-9667-f805afffded5&game_version_id=2e6b68d3-0f43-4b84-9c14-ab59f94e566c","image":"/assets/media/icons/braintest.webp","categories":["all"]},{"name":"Gladihoppers","link":"https://bonbang.github.io/store99/gladihoppers/index.html","image":"/assets/media/icons/gladihoppers.webp","categories":["all"]},{"name":"Snow Rider 3D","link":"https://html5.gamedistribution.com/rvvASMiM/3b79a8537ebc414fb4f9672a9b8c68c8/index.html?gd_zone_config=eyJwYXJlbnRVUkwiOiJodHRwczovL3Nub3dyaWRlcjNkLmNvbS8iLCJwYXJlbnREb21haW4iOiJzbm93cmlkZXIzZC5jb20iLCJ0b3BEb21haW4iOiJzbm93cmlkZXIzZC5jb20iLCJoYXNJbXByZXNzaW9uIjpmYWxzZSwibG9hZGVyRW5hYmxlZCI6dHJ1ZSwiaG9zdCI6Imh0bWw1LmdhbWVkaXN0cmlidXRpb24uY29tIiwidmVyc2lvbiI6IjEuNS4xNiJ9","image":"/assets/media/icons/snowrider3d.webp","categories":["all"]},{"name":"3 Slices","link":"https://images-opensocial.googleusercontent.com/gadgets/ifr?url=https://s3.amazonaws.com/production-assetsbucket-8ljvyr1xczmb/1ee20621-61bc-4ec8-a8ec-5e839c2e6edc%2F3-slices.xml","image":"/assets/media/icons/3slices.webp","categories":["all"]},{"name":"Buckshot Roulette","link":"https://buckshotroulette.online/game/v11/","image":"/assets/media/icons/buckshotroulette.webp","categories":["all"]},{"name":"Starblast","link":"https://starblast.io","image":"/assets/media/icons/starblastio.webp","categories":["all","2P"]},{"name":"CSGO Parkour","link":"https://yandex.com/games/app/203069?flags={%22adv_sticky_banner_disabled%22:true}","image":"/assets/media/icons/csgoparkour.webp","categories":["all"]},{"name":"Parkour Block 3D","link":"https://html5.gamedistribution.com/1461d40bb77f48e6be72489959a1ac04/","image":"/assets/media/icons/parkourblock3d.webp","categories":["all"]},{"name":"Jelly Mario","link":"https://jellymar.io","image":"/assets/media/icons/jellymario.webp","categories":["all"]},{"name":"Tyran.io","link":"https://tyran.io","image":"/assets/media/icons/tyranio.webp","categories":["all","2P"]},{"name":"Arras.io","link":"https://arras.io/","image":"/assets/media/icons/arrasio.webp","categories":["all","2P"]},{"name":"mk48.io","link":"https://mk48.io/","image":"/assets/media/icons/mk48io.webp","categories":["all","2P"]},{"name":"Bandit.RIP","link":"https://bandit.rip/","image":"/assets/media/icons/banditrip.webp","categories":["all","2P"]},{"name":"Addicting Games","link":"https://www.addictinggames.com/","image":"/assets/media/icons/addictinggames.webp","categories":["all"]},{"name":"Deeeep.io","link":"https://beta.deeeep.io","image":"/assets/media/icons/deeeepio.webp","categories":["all","2P"]},{"name":"ev.io","link":"https://ev.io","image":"/assets/media/icons/evio.webp","categories":["all","2P"]},{"name":"Brain Test 2","link":"https://games.poki.com/458768/df221093-aae9-4c0d-b458-efb16ae8e3ab","image":"/assets/media/icons/braintest2.webp","categories":["all"]},{"name":"Brain Test 3","link":"https://games.poki.com/458768/1f3ae540-a95f-4f20-a000-29512612e341","image":"/assets/media/icons/braintest3.webp","categories":["all"]},{"name":"Donitz - itch.io","link":"https://donitz.itch.io/","image":"/assets/media/icons/itch.webp","categories":["all"]},{"name":"Territorial.io","link":"https://territorial.io","image":"/assets/media/icons/territorialio.webp","categories":["all","2P"]},{"name":"Stickman Hook","link":"/e/stickman-hook/index.html","image":"/assets/media/icons/stickmanhook.webp","categories":["all","local"]},{"name":"Tube Jumpers","link":"https://unblocked76.github.io/tube-jumpers/","image":"/assets/media/icons/tubejumpers.webp","categories":["all","2P"]},{"name":"Tunnel Rush","link":"https://5dd2e8e4-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/5627efae-e960-407d-82a5-3da708eb4e68/index.html","image":"/assets/media/icons/tunnelrush.webp","categories":["all","2P"]},{"name":"Tunnel Rush 2","link":"https://a7e6d137-c3c1-46e6-a3db-04c2d33c98a8.poki-gdn.com/71e6bddd-9b0e-4621-a11a-9503086f69d5/index.html","image":"/assets/media/icons/tunnelrush2.webp","categories":["all"]},{"name":"Rainbow Obby","link":"https://785a4295-96c4-43e5-b237-fb07fc3ef44d.poki-gdn.com/f1d39f75-7a25-41de-86cf-ba00804737b5/index.html","image":"/assets/media/icons/rainbowobby.webp","categories":["all","2P"]},{"name":"Candy Jump","link":"https://candyjump.games235.com/","image":"/assets/media/icons/candyjump.webp","categories":["all"]},{"name":"Google Feud","link":"https://googlefeud.com/","image":"/assets/media/icons/googlefeud.webp","categories":["all"]},{"name":"Minecraft Classic","link":"https://classic.minecraft.net","image":"/assets/media/icons/mc.webp","categories":["all","2P"]},{"name":"Learn to Fly 3","link":"https://www.silvergames.com/en/learn-to-fly-3/iframe","image":"/assets/media/icons/learntofly3.webp","categories":["all"]},{"name":"Neal.Fun","link":"https://neal.fun","image":"/assets/media/icons/nealfun.webp","categories":["all"],"error":"true","say":"Neal.fun does not work on Interstellar because of Cloudflare protection."},{"name":"YoHoHo.io","link":"https://yohoho.io/","image":"/assets/media/icons/yohoho.webp","categories":["all","2P"]},{"name":"AntWar.io","link":"https://antwar.io/","image":"/assets/media/icons/antwario.webp","categories":["all","2P"]},{"name":"Tetr.io","link":"https://tetr.io/","image":"/assets/media/icons/tetrio.webp","categories":["all","2P"]},{"name":"Time Shooter 2","link":"https://html5.gamedistribution.com/62a72f2da7cb4b609579a47653546e6a/","image":"/assets/media/icons/timeshooter2.webp","categories":["all"]},{"name":"Merge Fruit","link":"https://html5.gamedistribution.com/2dee9d404697435aa76111eb4015e1d5/","image":"/assets/media/icons/mergefruit.webp","categories":["all"]},{"name":"There Is No Game","link":"https://5dd2d607-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/38959ae1-110b-49ab-86ae-df425fd7862a/index.html","image":"/assets/media/icons/thereisnogame.webp","categories":["all"]},{"name":"Jetpack Joyride","link":"/e/jetpack-joyride/index.html","image":"/assets/media/icons/jetpackjoyride.webp","categories":["all","local"]},{"name":"FeedVid","link":"https://v6p9d9t4.ssl.hwcdn.net/html/4941980-683813/index.html","image":"/assets/media/icons/feedvid.webp","categories":["all"]},{"name":"florr.io","link":"https://florr.io","image":"/assets/media/icons/florr.webp","categories":["all","2P"]},{"name":"Rocket Bot Royale","link":"https://rocketbotroyale2.winterpixel.io/","image":"/assets/media/icons/rocketbotroyale.webp","categories":["all"]},{"name":"Happy Wheels","link":"https://files.crazygames.com/ruffle/happywheels.html","image":"/assets/media/icons/happywheels.webp","categories":["all"]},{"name":"Papa's Burgeria","link":"https://www.coolmathgames.com/0-papas-burgeria/play","image":"/assets/media/icons/papasburgeria.webp","categories":["all"]},{"name":"Papa's Cheeseria","link":"https://www.coolmathgames.com/0-papas-cheeseria/play","image":"/assets/media/icons/papascheeseria.webp","categories":["all"]},{"name":"Papa's Pancakeria","link":"https://www.coolmathgames.com/0-papas-pancakeria/play","image":"/assets/media/icons/papaspancakeria.webp","categories":["all"]},{"name":"Papa's Wingeria","link":"https://www.coolmathgames.com/0-papas-wingeria/play","image":"/assets/media/icons/papaswingeria.webp","categories":["all"]},{"name":"Riddle School 1","link":"https://uploads.ungrounded.net/ruffle_wrapper/ruffleembed.html?v=1.0.67&browsermode=default&props=%7B%22ruffle%22%3A%22%2Fruffle_wrapper%2Flib%2Fruffle.js%3F1695474658%22%2C%22public_path%22%3A%22%2Fruffle_wrapper%2Flib%2F%22%2C%22swf%22%3A%22https%3A%2F%2Fuploads.ungrounded.net%2F314000%2F314680_Riddle_School.swf%3F1148577264%22%2C%22vars%22%3A%7B%22NewgroundsAPI_PublisherID%22%3A1%2C%22NewgroundsAPI_SandboxID%22%3A%2265103f0745c96%22%2C%22NewgroundsAPI_SessionID%22%3A%22%22%2C%22NewgroundsAPI_UserName%22%3A%22%26lt%3Bdeleted%26gt%3B%22%2C%22NewgroundsAPI_UserID%22%3A0%2C%22ng_username%22%3A%22%26lt%3Bdeleted%26gt%3B%22%7D%2C%22width%22%3A550%2C%22height%22%3A400%2C%22icon%22%3A%22https%3A%2F%2Fpicon.ngfiles.com%2F314000%2Fflash_314680_card.webp%3Ff1607914286%22%2C%22warnOnUnsupportedContent%22%3Afalse%7D","image":"/assets/media/icons/riddle-school.webp","categories":["all"]},{"name":"Powerline.IO","link":"https://powerline.io","image":"/assets/media/icons/powerline.webp","categories":["all","2P"]},{"name":"Papa's Scooperia","link":"https://files.crazygames.com/ruffle/papasscooperia.html","image":"/assets/media/icons/papasscooperia.webp","categories":["all"]},{"name":"Papa's Sushiria","link":"https://files.crazygames.com/ruffle/papassushiria.html","image":"/assets/media/icons/papassushiria.webp","categories":["all"]},{"name":"Burrito Bison","link":"https://f.silvergames.com/awayfl/index.html?swf=burrito-bison.swf","image":"/assets/media/icons/burritobison.webp","categories":["all"]},{"name":"Fireboy And Watergirl 2 In The Light Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40210/","image":"/assets/media/icons/fireboyandwatergirllighttemple.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 4 In The Crystal Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40212/","image":"/assets/media/icons/fireboyandwatergirlcrystaltemple.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 5: Elements","link":"https://www.coolmathgames.com/sites/default/files/public_games/40218","image":"/assets/media/icons/fireboyandwatergirlelements.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 6: Fairy Tales","link":"https://html5.gamedistribution.com/rvvASMiM/be3cff113c4e4f069b7614851825ffe9/index.html","image":"/assets/media/icons/fireboyandwatergirlfairytales.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl In The Forest Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40034/","image":"/assets/media/icons/fireboyandwatergirlforesttemple.webp","categories":["all","2P"]},{"name":"Gunspin","link":"https://html5.gamedistribution.com/rvvASMiM/917cce8c44c44638a8cdc2a1794b65c8/index.html","image":"/assets/media/icons/gunspin.webp","categories":["all"]},{"name":"Thelast Royale","link":"https://thelast.io","image":"/assets/media/icons/thelast-io.webp","categories":["all","2P"]},{"name":"mope.io","link":"https://thelast.io","image":"/assets/media/icons/mope-io.webp","categories":["all","2P"]},{"name":"Tiny Fishing","link":"https://www.dob5.com/d/file/games/tiny-fishing/","image":"/assets/media/icons/tinyfishing.webp","categories":["all"]},{"name":"Johnny Upgrade","link":"https://lagged.com/api/play2/johnny-upgrade3/","image":"/assets/media/icons/johnnyupgrade.webp","categories":["all"]},{"name":"bloxd.io","link":"https://bloxd.io","image":"/assets/media/icons/bloxd-io.webp","categories":["all","2P"]},{"name":"Duck Life 1","link":"https://www.hoodamath.com/mobile/games/duck-life/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 2","link":"https://www.hoodamath.com/mobile/games/duck-life-2-world-champion/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 3","link":"https://www.hoodamath.com/mobile/games/duck-life-3-evolution/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 4","link":"/e/ducklife4/index.html","image":"/assets/media/icons/dl4.webp","categories":["all","local"],"load":true},{"name":"Papa's Freezeria","link":"https://www.coolmathgames.com/0-papas-freezeria/play","image":"/assets/media/icons/papasfreezeria.webp","categories":["all","2P"]},{"name":"Evades","link":"https://evades.io","image":"/assets/media/icons/evadesio.webp","categories":["all,","2P"]},{"name":"Bullet Force Multiplayer","link":"https://www.crazygames.com/game/bullet-force-multiplayer","image":"/assets/media/icons/BFM.webp","categories":["all,","2P"]},{"name":"Crazy Games","link":"https://www.crazygames.com/","image":"/assets/media/icons/crazy.webp","categories":["all,","emu,","2P,","sports,","flash"]},{"name":"Cubes 2048","link":"https://www.crazygames.com/game/cubes-2048-io","image":"/assets/media/icons/C2048.webp","categories":["all,","2P"]},{"name":"DOOM","link":"https://archive.org/details/doom-play","image":"/assets/media/icons/DOOM.webp","categories":["all,","emu"]},{"name":"FNAF 2","link":"https://sussygamedeveloper.github.io/FNAF2/","image":"/assets/media/icons/FNAF2.webp","categories":["all"]},{"name":"FNAF 3","link":"https://sussygamedeveloper.github.io/fnaf3/","image":"/assets/media/icons/FNAF3.webp","categories":["all"]},{"name":"FNAF Web","link":"https://wellsousaaa.github.io/Five-Nights-at-Freddys-Web/","image":"/assets/media/icons/FNAFWeb.webp","categories":["all"]},{"name":"Riddle School 4","link":"https://riddle-school-4.game-files.crazygames.com/ruffle/riddleschool4.html","image":"/assets/media/icons/rs4.webp","categories":["all"]},{"name":"Riddle School 5","link":"https://riddle-school-5.game-files.crazygames.com/ruffle/riddleschool5.html","image":"/assets/media/icons/rs5.webp","categories":["all"]},{"name":"GBA Emulator","link":"https://ds.44670.org/gba/","image":"/assets/media/icons/gba.webp","categories":["all,","emu"]},{"name":"Itch.io","link":"https://itch.io","image":"/assets/media/icons/itch.webp","categories":["all,","emu,","2P"]},{"name":"N-Gon","link":"https://landgreen.github.io/sidescroller/","image":"/assets/media/icons/NGON.webp","categories":["all"]},{"name":"Nintendo DS Emulator","link":"https://ds.44670.org/","image":"/assets/media/icons/ds.webp","categories":["all,","emu"]},{"name":"Nintendo 64 Emulator","link":"https://www.neilb.net/n64wasm/","image":"/assets/media/icons/N64.webp","categories":["all,","emu"]},{"name":"Playstation 2 Emulator","link":"https://playjs.purei.org/","image":"/assets/media/icons/PS2.webp","categories":["all,","emu"]},{"name":"Run 3","link":"https://www.coolmathgames.com/0-run-3/play","image":"/assets/media/icons/run3.webp","categories":["all,","flash"]},{"name":"Subway Surfers: San Francisco ","link":"https://raw.githack.com/3kh0/3kh0-assets/main/subway-surfers/index.html","image":"/assets/media/icons/SF.webp","categories":["all,","emu"]},{"name":"Survivor.io","link":"https://html5.gamedistribution.com/rvvASMiM/f1c451e586c04b4c8cba01b0c50d9090/index.html","image":"/assets/media/icons/SVI.webp","categories":["all,","emu"]},{"name":"Web Retro","link":"/e/index.html","image":"/assets/media/icons/webretro.webp","categories":["all,","emu","local"]},{"name":"Slope","link":"https://watchdocumentaries.com/wp-content/uploads/games/slope/","image":"/assets/media/icons/slope.webp","categories":["all"]},{"name":"Fortnite (Geforce NOW)","link":"https://play.geforcenow.com/mall/#/deeplink?game-id=46bfab06-d864-465d-9e56-2d9e45cdee0a","image":"/assets/media/icons/fortnite.webp","categories":["all"]},{"name":"Bomb Party","link":"https://jklm.fun","image":"/assets/media/icons/BP.webp","categories":["all,","2P"]},{"name":"1","link":"/e/1/1/index.html","image":"/assets/media/icons/1.webp","categories":["all","local"]},{"name":"1v1.LOL","link":"https://1v1.lol","image":"/assets/media/icons/1v1-lol.webp","categories":["all,","2P"]},{"name":"2D Rocket League","link":"https://v6p9d9t4.ssl.hwcdn.net/html/3325334/index.html","image":"/assets/media/icons/2D-Rocket-League.webp","categories":["all"]},{"name":"3D Dino Game","link":"https://lagged.com/api/play2/t-rex-3d2/","image":"/assets/media/icons/trex-run-3D.webp","categories":["all"]},{"name":"60 Sec. Burger Run","link":"https://www.coolmathgames.com/0-60-second-burger-run/play","image":"/assets/media/icons/60-second-burger-run.webp","categories":["all"]},{"name":"8 Ball Pool","link":"https://8ball-pool.io","image":"/assets/media/icons/8ball.webp","categories":["all"]},{"name":"A Dark Room","link":"https://adarkroom.doublespeakgames.com","image":"/assets/media/icons/ADR.webp","categories":["all"]},{"name":"Ace Attorney","link":"https://f.kbhgames.com/r/gba/?r=ace-attorney","image":"/assets/media/icons/aa.webp","categories":["all"]},{"name":"AC - Wild World","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/10/animal-crossing-wild-world1.zip","image":"/assets/media/icons/acww.webp","categories":["all"]},{"name":"Adventure Capitalist","link":"https://than1089.github.io/adventure-capitalist/","image":"/assets/media/icons/adventure-capitalist.webp","categories":["all"]},{"name":"Agar.io","link":"https://agar.io","image":"/assets/media/icons/agario.webp","categories":["all"]},{"name":"Among Us (Scratch)","link":"https://turbowarp.org/523967150/fullscreen","image":"/assets/media/icons/scratch-among-us.webp","categories":["all"]},{"name":"Apex Legends","link":"https://play.geforcenow.com/games?game-id=cb2b1b5f-54ba-45fd-9839-96bbfe1376cd&lang=en_US&asset-id=01_c6efce00-e91e-402a-8b72-f4971f89c528","image":"/assets/media/icons/apex.webp","categories":["all"]},{"name":"Basket Random","link":"https://html5.gamedistribution.com/rvvASMiM/bf1268dccb5d43e7970bb3edaa54afc8/index.html","image":"/assets/media/icons/br.webp","categories":["all"]},{"name":"Basketball Stars","link":"https://html5.gamedistribution.com/69d78d071f704fa183d75b4114ae40ec/","image":"/assets/media/icons/basketball-stars.webp","categories":["all"]},{"name":"Basketball Bros","link":"https://www.basketbros.io/","image":"/assets/media/icons/basket-bros.webp","categories":["all"]},{"name":"Basketball Legends","link":"https://www.basketballlegends.fun/gamedata/basketball-legends-2020","image":"/assets/media/icons/basketball-legends.webp","categories":["all"]},{"name":"Biggie Cheese Fight","link":"https://scratch.mit.edu/projects/163771748/fullscreen","image":"/assets/media/icons/biggiecheese.webp","categories":["all"]},{"name":"Bitlife","link":"https://xlegends.github.io/bitlife/","image":"/assets/media/icons/bitlife.webp","categories":["all"]},{"name":"BTD 4","link":"https://en.gameslol.net/data/bloons-td-4/index.html","image":"/assets/media/icons/btd4.webp","categories":["all"]},{"name":"BuildNow.GG","link":"https://games.crazygames.com/en_US/buildnow-gg/index.html","image":"/assets/media/icons/build-now.webp","categories":["all"]},{"name":"Cat Ninja","link":"https://4iapq88o5f3gc1dij3it0mp5jojnm3jr-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://s3.amazonaws.com/production-assetsbucket-8ljvyr1xczmb/1ee20621-61bc-4ec8-a8ec-5e839c2e6edc%252Fcat-ninja.xml","image":"/assets/media/icons/cat-ninja.webp","categories":["all"]},{"name":"Candy Box","link":"https://candybox2.net","image":"/assets/media/icons/candybox.webp","categories":["all"]},{"name":"Celeste PICO-8","link":"https://exok.com/minigames/celeste.html","image":"/assets/media/icons/celeste.webp","categories":["all"]},{"name":"Clicker Heros","link":"https://www.clickerheroes.com/play.html","image":"/assets/media/icons/clickerheros.webp","categories":["all"]},{"name":"Chess.com","link":"https://chess.com","image":"/assets/media/icons/chess.webp","categories":["all"]},{"name":"Cluster Rush","link":"/e/2/Cluster-Rush/index.html","image":"/assets/media/icons/cluster-rush.webp","categories":["all","local"]},{"name":"Cookie Clicker","link":"https://orteil.dashnet.org/cookieclicker/","image":"/assets/media/icons/cookieclicker.webp","categories":["all"]},{"name":"Crossy Road","link":"https://5dd2e1e3-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/169dc11d-e718-4b36-9e60-d5ed5bc07a31/index.html","image":"/assets/media/icons/cr.webp","categories":["all"]},{"name":"Deepest Sword","link":"https://v6p9d9t4.ssl.hwcdn.net/html/4017918/index.html","image":"/assets/media/icons/deepest-sword.webp","categories":["all"]},{"name":"Diep.io","link":"https://diep.io/","image":"/assets/media/icons/diep.webp","categories":["all"]},{"name":"Doge Miner","link":"/e/1/DogeMiner/index.html","image":"/assets/media/icons/doge-miner-1.webp","categories":["all","local"]},{"name":"Doom 1","link":"https://browncha023.github.io/GBA/launcher.html#dm","image":"/assets/media/icons/DOOM.webp","categories":["all"]},{"name":"Doom 2","link":"https://browncha023.github.io/GBA/launcher.html#dm2","image":"/assets/media/icons/doom2.webp","categories":["all"]},{"name":"Dreader","link":"https://donitz.itch.io/dreader","image":"/assets/media/icons/dreader.webp","categories":["all"]},{"name":"Drift Boss","link":"https://watchdocumentaries.com/wp-content/uploads/games/drift-boss/","image":"/assets/media/icons/db.webp","categories":["all"]},{"name":"Drift Hunters","link":"https://webglmath.github.io/drift-hunters/","image":"/assets/media/icons/drift-hunters.webp","categories":["all"]},{"name":"Drive Mad","link":"https://raw.githack.com/3kh0/3kh0-assets/main/drive-mad/index.html","image":"/assets/media/icons/dm.webp","categories":["all"]},{"name":"Fallout 2","link":"https://jonasz-o.itch.io/fallout2remake3d","image":"/assets/media/icons/fallout2.webp","categories":["all"]},{"name":"FNAF 2 (Scratch)","link":"https://scratch.mit.edu/projects/469219637/embed/","image":"/assets/media/icons/FNAF2.webp","categories":["all"]},{"name":"Friday Night Funkin'","link":"https://w8.snokido.com/games/html5/friday-night-funkin/0281/index.html","image":"/assets/media/icons/fnf.webp","categories":["all"]},{"name":"FNF - Lofi Mod","link":"https://fnf.kdata1.com/lofi-funkin/2/","image":"/assets/media/icons/lofi.webp","categories":["all"]},{"name":"FNF VS. Snorlax","link":"https://fnf.kdata1.com/snorlax/1/","image":"/assets/media/icons/snorlax.webp","categories":["all"]},{"name":"JustFall.LOL","link":"https://justfall.lol","image":"/assets/media/icons/just-fall-lol.webp","categories":["all"]},{"name":"Kirby Mirror (GBA)","link":"https://www.retrogames.onl/gba/kirby-mirror-gba.html","image":"/assets/media/icons/kirby.webp","categories":["all"]},{"name":"Krunker","link":"https://krunker.io","image":"/assets/media/icons/krunker.webp","categories":["all"]},{"name":"G-Switch","link":"https://5dd24442-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/4f2c69b4-3edc-4cd7-a078-efd3d1ea9fb5/index.html","image":"/assets/media/icons/gswitch.webp","categories":["all"]},{"name":"G-Switch 2","link":"https://5dd27095-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/e0e70ee4-fdd4-4de8-931d-fde7d1cb408b/index.html","image":"/assets/media/icons/gswitch2.webp","categories":["all"]},{"name":"G-Switch 3","link":"https://5dd2b395-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/120fdec6-7eeb-470f-a43c-9bcdace0dacb/index.html","image":"/assets/media/icons/gswitch3.webp","categories":["all"]},{"name":"Golden Eye 007","link":"https://f.kbhgames.com/r/n64/game.php?file=007-golden-eye.zip","image":"/assets/media/icons/golden-eye-007.webp","categories":["all"]},{"name":"GBA Games 2","link":"https://cattn.github.io/gba/","image":"/assets/media/icons/gba.webp","categories":["all"]},{"name":"Geforce NOW","link":"https://play.geforcenow.com","image":"/assets/media/icons/geforce-now.webp","categories":["all"]},{"name":"Haunted School 1","link":"https://games.crazygames.com/en_US/haunted-school---horror-game/index.html","image":"/assets/media/icons/na.webp","categories":["all"]},{"name":"HexArena","link":"https://hexarena.io/","image":"/assets/media/icons/hexarena.webp","categories":["all"]},{"name":"Hole.IO","link":"https://hole-io.com/","image":"/assets/media/icons/hole.webp","categories":["all"]},{"name":"Idle Breakout","link":"/e/1/idle-breakout/index.html","image":"/assets/media/icons/idlebreakout.webp","categories":["all","local"]},{"name":"Isleward","link":"https://play.isleward.com","image":"/assets/media/icons/isleward.webp","categories":["all"]},{"name":"Interactive Buddy","link":"https://f.silvergames.com/ruffle/player.php?id=204","image":"/assets/media/icons/interactive-buddy.webp","categories":["all"]},{"name":"NGU Idle","link":"https://cache.armorgames.com/files/games/ngu-idle-18444/index.html?v=1559319416","image":"/assets/media/icons/nguidle.webp","categories":["all"]},{"name":"Jacksmith","link":"https://www.coolmathgames.com/0-jacksmith/play","image":"/assets/media/icons/jacksmith.webp","categories":["all"]},{"name":"Sandtrix","link":"https://files.crazygames.com/sandtrix/16/index.html","image":"/assets/media/icons/sandtrix.webp","categories":["all"]},{"name":"Learn To Fly Idle","link":"https://www.gameslol.net/data/waflash/index.php?g=635","image":"/assets/media/icons/ltf_idle.webp","categories":["all"]},{"name":"Lordz.io","link":"https://lordz.io/","image":"/assets/media/icons/lordz.webp","categories":["all"]},{"name":"Masked IO","link":"https://unblocked-games.s3.amazonaws.com/games/masked-io/index.html","image":"/assets/media/icons/masked-forces.webp","categories":["all"]},{"name":"Mario Kart 64","link":"https://static.arcadespot.com/retroemulator.php?system=n64&game=2017/06/mario-kart-64.zip","image":"/assets/media/icons/mario-kart-64.webp","categories":["all"]},{"name":"Mobs Inc","link":"https://overboy.itch.io/mobs-inc","image":"/assets/media/icons/mobsinc.webp","categories":["all"]},{"name":"Monkey Mart","link":"/e/2/monkey-mart/index.html","image":"/assets/media/icons/mm.webp","categories":["all","local"]},{"name":"MooMoo.io","link":"https://moomoo.io","image":"/assets/media/icons/moo.webp","categories":["all"]},{"name":"Mortal Kombat 4","link":"https://f.kbhgames.com/r/n64/game.php?file=Mortal-Kombat-4-U.zip","image":"/assets/media/icons/mortal-kombat-4.webp","categories":["all"]},{"name":"Mr. Mine","link":"https://www.coolmathgames.com/0-mr-mine/play","image":"/assets/media/icons/mrmine.webp","categories":["all"]},{"name":"Moto X3M","link":"https://html5.gamedistribution.com/rvvASMiM/5b0abd4c0faa4f5eb190a9a16d5a1b4c/index.html","image":"/assets/media/icons/mx3m.webp","categories":["all"]},{"name":"MX3M: Pool Party","link":"https://h0jokl1egt0fd4oc8qv3j0tltl9jbqhn-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://649025137-174029463385024710.preview.editmysite.com/uploads/b/139890129-767696982876512205/files/mx3mpp.xml","image":"/assets/media/icons/mx3m.webp","categories":["all"]},{"name":"MX3M: Spooky Land","link":"https://html5.gamedistribution.com/rvvASMiM/b8a342904608470a9f3382337aca3558/index.html","image":"/assets/media/icons/mx3m-spooky.webp","categories":["all"]},{"name":"MX3M: Winter","link":"https://www-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://sites.google.com/site/s017q3e/moto-x3m-4-winter.xml","image":"/assets/media/icons/mx3m-winter.webp","categories":["all"]},{"name":"Saul Run","link":"https://complex-ify.itch.io/saul-goodman","image":"/assets/media/icons/saulrun.webp","categories":["all"]},{"name":"Ninja Cat Exploit","link":"https://html5.gamedistribution.com/rvvASMiM/903ba9346b9d437e9c7e81d672cead44/index.html","image":"/assets/media/icons/ninja-cat.webp","categories":["all"]},{"name":"OvO","link":"https://8rlfg0ch3417et18dp8lvps6uo7c3b2c-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://427396048-642845047394716217.preview.editmysite.com/uploads/b/139890129-761103484729797659/files/ovo.xml","image":"/assets/media/icons/ovo.webp","categories":["all"]},{"name":"Online Racing Game!","link":"https://jchabin.github.io/cars/","image":"/assets/media/icons/OR.webp","categories":["all"]},{"name":"Online Soccer M.","link":"https://www.onlinesoccermanager.com/","image":"/assets/media/icons/osm.webp","categories":["all"]},{"name":"Papa's Bakeria","link":"https://f.silvergames.com/emu/waffle/?id=5458","image":"/assets/media/icons/bakeria.webp","categories":["all"]},{"name":"Papa's Cupcakeria","link":"https://f.silvergames.com/emu/waffle/?id=3246","image":"/assets/media/icons/cupcakeria.webp","categories":["all"]},{"name":"Papa Louie 1","link":"https://f.silvergames.com/ruffle/player.php?id=1373","image":"/assets/media/icons/louie1.webp","categories":["all"]},{"name":"Papa Louie 2","link":"https://f.silvergames.com/emu/waffle/?id=3042","image":"/assets/media/icons/louie2.webp","categories":["all"]},{"name":"Papa Louie 3","link":"https://f.silvergames.com/emu/waffle/?id=4693","image":"/assets/media/icons/papa-louie-3.webp","categories":["all"]},{"name":"Papa's Pizzeria","link":"https://f.silvergames.com/ruffle/player.php?id=1360","image":"/assets/media/icons/pizzeria.webp","categories":["all"]},{"name":"Paper Mario 64","link":"https://f.kbhgames.com/r/n64/game.php?file=Paper%20Mario%20(USA).zip","image":"/assets/media/icons/paper-mario-64.webp","categories":["all"]},{"name":"Paper.io","link":"https://paper-io.com/","image":"/assets/media/icons/paperio.webp","categories":["all"]},{"name":"Pixel Shooter","link":"https://94bfktj403i6m18as4vkvtreqd0ohci4-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://274019683-173520394482650759.preview.editmysite.com/uploads/b/139890129-131715539788281629/files/ps.xml","image":"/assets/media/icons/pixel-shooter.webp","categories":["all"]},{"name":"Pizza Tower","link":"https://gamaverse.com/c/e/g/pizza-tower-1678640389/index.html","image":"/assets/media/icons/pizza-tower.webp","categories":["all"]},{"name":"Pokemon Heart Gold","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/10/pokemon-heartgold-version1.zip","image":"/assets/media/icons/heartgold.webp","categories":["all"]},{"name":"Pokemon Showdown","link":"https://play.pokemonshowdown.com","image":"/assets/media/icons/showdown.webp","categories":["all"]},{"name":"Google Baseball","link":"https://www.google.com/logos/2019/july4th19/r6/july4th19.html","image":"/assets/media/icons/googlebaseball.webp","categories":["all"]},{"name":"Deal or No Deal","link":"https://f.kbhgames.com/RS/game.php?r=//f.kbhgames.com/2018/swf/dondeal2.swf&w=640&h=480&warnsupport=true","image":"/assets/media/icons/deal-or-no-deal.webp","categories":["all"]},{"name":"Deadshot","link":"https://deadshot.io","image":"/assets/media/icons/deadshot.webp","categories":["all"]},{"name":"Rainbow Tower","link":"https://www.mathplayground.com/mobile_rainbow_tower/index.html","image":"/assets/media/icons/rainbowtower.webp","categories":["all"]},{"name":"Doodle Jump","link":"https://doodlejump.pro/","image":"/assets/media/icons/doodlejump.webp","categories":["all"]},{"name":"Madalin Stunt Cars Multiplayer","link":"https://games.crazygames.com/en_US/madalin-cars-multiplayer/index.html","image":"/assets/media/icons/madalinmultiplayer.webp","categories":["all","2P"]},{"name":"Madalin Stunt Cars 2","link":"https://games.crazygames.com/en_US/madalin-stunt-cars-2/index.html","image":"/assets/media/icons/madalinstuntcars2.webp","categories":["all"]},{"name":"Madalin Stunt Cars 3","link":"https://games.crazygames.com/en_US/madalin-stunt-cars-3/index.html","image":"/assets/media/icons/madalinstuntcars3.webp","categories":["all"]},{"name":"PM: Light Platinum","link":"https://browncha023.github.io/GBA/launcher.html#pokemonlp","image":"/assets/media/icons/lp.webp","categories":["all"]},{"name":"Precision Client","link":"https://glcdn.githack.com/3kh0/3kh0-assets/-/raw/main/precision-client/index.html","image":"/assets/media/icons/precision.webp","categories":["all"]},{"name":"Rainbow Six Siege","link":"https://play.geforcenow.com/games?game-id=1dd07d47-6601-42f7-80e9-e4d8db08ea1b&lang=en_US&asset-id=01_44417-48c3d8e642e2","image":"/assets/media/icons/r6.webp","categories":["all"]},{"name":"Red Ball 1","link":"https://www.algebrashelper.com/redball","image":"/assets/media/icons/redball1.webp","categories":["all"]},{"name":"Red Ball 2","link":"https://www.algebrashelper.com/redball-2","image":"/assets/media/icons/redball2.webp","categories":["all"]},{"name":"Red Ball 4","link":"https://www.algebrashelper.com/redball-4","image":"/assets/media/icons/redball4.webp","categories":["all"]},{"name":"Red Ball 4 Vol. 2","link":"https://www.algebrashelper.com/read-ball-4v2","image":"/assets/media/icons/redball4vol2.webp","categories":["all"]},{"name":"Red Ball 4 Vol. 3","link":"https://www.algebrashelper.com/red-ball-4v3","image":"/assets/media/icons/redball4vol3.webp","categories":["all"]},{"name":"Riddle School 2","link":"https://f.silvergames.com/ruffle/player.php?id=8564","image":"/assets/media/icons/rs2.webp","categories":["all"]},{"name":"Riddle School 3","link":"https://riddle-school-3.game-files.crazygames.com/ruffle/riddleschool3.html","image":"/assets/media/icons/rs3.webp","categories":["all"]},{"name":"Rocket Pult","link":"https://v6p9d9t4.ssl.hwcdn.net/html/565140/index.html","image":"/assets/media/icons/rocketpult.webp","categories":["all"]},{"name":"Rooftop Snipers","link":"https://html5.gamedistribution.com/rvvASMiM/c3a70ae98547407a92ebedca8b79fdfa/index.html","image":"/assets/media/icons/rooftop.webp","categories":["all"]},{"name":"Sand Spiel","link":"https://sandspiel.club/","image":"/assets/media/icons/sand.webp","categories":["all"]},{"name":"Sandboxels","link":"https://v6p9d9t4.ssl.hwcdn.net/html/5808591/index.html","image":"/assets/media/icons/sandboxels.webp","categories":["all"]},{"name":"Shapez.IO","link":"https://shapez.io","image":"/assets/media/icons/shapezio.webp","categories":["all"]},{"name":"Shell Shockers","link":"https://shellshock.io/","image":"/assets/media/icons/shell-shockers.webp","categories":["all"]},{"name":"Slither.io","link":"https://slither.io/","image":"/assets/media/icons/slither.webp","categories":["all"]},{"name":"Smash Bros 64","link":"https://emulatorgames.online/games/n64/super-smash-bros","image":"/assets/media/icons/super-smash-bros-64.webp","categories":["all"]},{"name":"Smash Karts","link":"https://smashkarts.io/","image":"/assets/media/icons/smashkarts.webp","categories":["all"]},{"name":"Snowball.io","link":"https://games.crazygames.com/en_US/snowball-io/index.html","image":"/assets/media/icons/snowball.webp","categories":["all"]},{"name":"Space Plan","link":"https://jhollands.co.uk/spaceplan/","image":"/assets/media/icons/spaceplan.webp","categories":["all"]},{"name":"Stumble Guys","link":"https://www.stumbleguys.com/play","image":"/assets/media/icons/stumble-guys.webp","categories":["all"]},{"name":"Stumble Guys Clone","link":"https://stumble-guys.io/stumble-guys.embed","image":"/assets/media/icons/stumble-guys.webp","categories":["all"]},{"name":"Sugar Sugar HTML5","link":"https://66564262-37c6-4095-a731-535342e4bbe4.poki-gdn.com/5bd6e8c6-381d-4de5-9823-96662d29afaf/index.html","image":"/assets/media/icons/sugarsugar.webp","categories":["all"]},{"name":"Super Mario 63","link":"https://www.numuki.com/gameframe/super-mario-63","image":"/assets/media/icons/sm63.webp","categories":["all"]},{"name":"Super Mario 64","link":"https://f.kbhgames.com/r/n64/game.php?file=32112_super-mario-64-usa.zip","image":"/assets/media/icons/sm64.webp","categories":["all"]},{"name":"Super Smash Flash","link":"https://f.kbhgames.com/RS/game.php?r=//f.kbhgames.com/2018/swf/smashflash.swf&w=1521&h=753","image":"/assets/media/icons/ssf1.webp","categories":["all"]},{"name":"Supply Chain Idle","link":"https://chat.kongregate.com/gamez/0027/1653/live/index.html?kongregate_game_version=1554392772","image":"/assets/media/icons/supplychainlogo.webp","categories":["all"]},{"name":"Taming.io","link":"https://taming.io/","image":"/assets/media/icons/tamingio.webp","categories":["all"]},{"name":"Temple of Boom","link":"https://temple-of-boom.github.io/file/","image":"/assets/media/icons/templeofboom.webp","categories":["all","2P"]},{"name":"Tanuki Sunset","link":"https://watchdocumentaries.com/wp-content/uploads/games/tanuki-sunset","image":"/assets/media/icons/tanuki.webp","categories":["all"]},{"name":"The Simpsons","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/11/the-simpsons-game.zip","image":"/assets/media/icons/the-simpsons-game.webp","categories":["all"]},{"name":"Temple Run 2","link":"https://watchdocumentaries.com/wp-content/uploads/games/temple-run-2/","image":"/assets/media/icons/temple-run-2.webp","categories":["all"]},{"name":"Twitch Tetris","link":"https://www.rossipotti.de/ausgabe28/tetris/controls.html","image":"/assets/media/icons/na.webp","categories":["all"]},{"name":"Voxiom.io","link":"https://voxiom.io/","image":"/assets/media/icons/voxiom.webp","categories":["all"]},{"name":"Zombs.io","link":"https://zombs.io/","image":"/assets/media/icons/zombs-io.webp","categories":["all"]},{"name":"Zombs Royale","link":"https://zombsroyale.io","image":"/assets/media/icons/zombs-royale.webp","categories":["all,","2P"]},{"name":"GBA Games","link":"https://real-sgs.vercel.app/Tools/GBA-Emulator","image":"/assets/media/icons/gba.webp","categories":["all"]},{"name":"Retro Bowl","link":"/e/2/retro/index.html","image":"/assets/media/icons/retro.webp","categories":["all,","sports","local"]},{"name":"Roblox (Now.GG)","link":"https://now.gg/iframe/snippet?app_pkg=com.roblox.client&partner=interstellar","image":"/assets/media/icons/roblox.webp","categories":["all","emu","android"]},{"name":"Madden NFL 24","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.maddennfl21mobile&partner=interstellar","image":"/assets/media/icons/maddennfl24.webp","categories":["all","emu","android"]},{"name":"Android","link":"https://now.gg/iframe/snippet?app_pkg=com.uncube.launcher3&partner=interstellar","image":"/assets/media/icons/android.webp","categories":["all","emu","android"]},{"name":"Genshin Impact","link":"https://now.gg/iframe/snippet?app_pkg=com.miHoYo.GenshinImpact&partner=interstellar","image":"/assets/media/icons/genshinimpact.webp","categories":["all","emu","android"]},{"name":"Fortnite (Now.GG)","link":"https://now.gg/iframe/snippet?app_pkg=com.epicgames.fortnite&partner=interstellar","image":"/assets/media/icons/fortnite.webp","categories":["all","emu","android"]},{"name":"EA SPORTS FC™ MOBILE 24 SOCCER","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.fifamobile&partner=interstellar","image":"/assets/media/icons/easports-fcmobile24.webp","categories":["all","emu","android"]},{"name":"EA SPORTS™ UFC® Mobile 2","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.easportsufc2&partner=interstellar","image":"/assets/media/icons/easports-ufc.webp","categories":["all","emu","android"]},{"name":"Melon Playground","link":"https://now.gg/iframe/snippet?app_pkg=com.studio27.MelonPlayground&partner=interstellar","image":"/assets/media/icons/melonplayground.webp","categories":["all","emu","android"]},{"name":"Solar Smash","link":"https://now.gg/iframe/snippet?app_pkg=com.paradyme.solarsmash&partner=interstellar","image":"/assets/media/icons/solarsmash.webp","categories":["all","emu","android"]},{"name":"Bloons TD Battles 2","link":"https://now.gg/iframe/snippet?app_pkg=com.ninjakiwi.bloonstdbattles2&partner=interstellar","image":"/assets/media/icons/bloonstd2.webp","categories":["all","emu","android"]},{"name":"Bloons TD Battles","link":"https://now.gg/iframe/snippet?app_pkg=com.ninjakiwi.bloonstdbattles&partner=interstellar","image":"/assets/media/icons/bloonstd.webp","categories":["all","emu","android"]},{"name":"Cookie Run Kingdom","link":"https://now.gg/iframe/snippet?app_pkg=com.devsisters.ck&partner=interstellar","image":"/assets/media/icons/cookierunkingdom.webp","categories":["all","emu","android"]},{"name":"Character AI","link":"https://now.gg/iframe/snippet?app_pkg=ai.character.app&partner=interstellar","image":"/assets/media/icons/characterai.webp","categories":["all","emu","android"]},{"name":"Aptoide","link":"https://now.gg/iframe/snippet?app_pkg=com.aptoide.partners.nowgg.store&partner=interstellar","image":"/assets/media/icons/aptoide.webp","categories":["all","emu","android"]},{"name":"Akinator","link":"https://now.gg/iframe/snippet?app_pkg=com.digidust.elokence.akinator.freemium&partner=interstellar","image":"/assets/media/icons/akinator.webp","categories":["all","emu","android"]},{"name":"WorldBox","link":"https://now.gg/iframe/snippet?app_pkg=com.mkarpenko.worldbox&partner=interstellar","image":"/assets/media/icons/worldbox.webp","categories":["all","emu","android"]},{"name":"Toca Life World","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocalifeworld&partner=interstellar","image":"/assets/media/icons/tocalifeworld.webp","categories":["all","emu","android"]},{"name":"Toca Hair Salon 4","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocahairsalon4&partner=interstellar","image":"/assets/media/icons/tocabocahairsalon4.webp","categories":["all","emu","android"]},{"name":"Toca Kitchen 2","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocakitchen2&partner=interstellar","image":"/assets/media/icons/tocakitchen2.webp","categories":["all","emu","android"]},{"name":"Free Fire","link":"https://now.gg/iframe/snippet?app_pkg=com.dts.freefireth&partner=interstellar","image":"/assets/media/icons/freefire.webp","categories":["all","emu","android"]},{"name":"Stumble Guys (Android)","link":"https://now.gg/iframe/snippet?app_pkg=com.kitkagames.fallbuddies&partner=interstellar","image":"/assets/media/icons/stumble-guys.webp","categories":["all","emu","android"]},{"name":"Now.GG","link":"https://now.gg","image":"/assets/media/icons/now-gg.webp","categories":["all","emu","android"]},{"name":"Roblox (NowGG.me) [Working]","link":"https://nowgg.me/apps/roblox-corporation/5349/roblox.html","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Now.GG (NowGG.me) [Working]","link":"https://nowgg.me","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Parappa the Rapper","link":"https://retrogamesonline.io/parappa-the-rapper.embed","image":"/assets/media/icons/ptr.webp","categories":["all","emu"]},{"name":"Half-Life","link":"https://x8bitrain.github.io/webXash/","image":"/assets/media/icons/half-life.webp","categories":["all"]},{"name":"Kiomet","link":"https://kiomet.com","image":"/assets/media/icons/kiomet.webp","categories":["all"]},{"name":"Tribals.io","link":"https://tribals.io/","image":"/assets/media/icons/tribalsio.webp","categories":["all"]},{"name":"Counter Strike 1.6","link":"https://play-cs.com/en/servers","image":"/assets/media/icons/cs16.webp","categories":["all"]},{"name":"Narrow One","link":"https://narrow.one","image":"/assets/media/icons/narrowone.webp","categories":["all"]},{"name":"Kirka","link":"https://kirka.io","image":"/assets/media/icons/kirka.webp","categories":["all"]},{"name":"Cryzen","link":"https://cryzen.io","image":"/assets/media/icons/cryzen.webp","categories":["all"]},{"name":"Hordes","link":"https://hordes.io","image":"/assets/media/icons/hordes.webp","categories":["all"]},{"name":"Venge","link":"https://venge.io","image":"/assets/media/icons/venge.webp","categories":["all"]},{"name":"Minecraft 1.5.2 (Eaglercraft)","link":"/e/2/eag15/index.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Minecraft 1.8 (Eaglercraft)","link":"/e/2/eag18/offline.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Minecraft 1.8 (Eagler WASM)","link":"/e/2/eag18/wasm.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Getaway S.","link":"https://www.twoplayergames.org/embed/getaway-shootout","image":"/assets/media/icons/getaway.webp","categories":["all","2P"]},{"name":"2048","link":"/e/1/2048/index.html","image":"/assets/media/icons/2048.webp","categories":["all","local"]},{"name":"2048 Multitasking","link":"/e/1/2048-multitask/index.html","image":"/assets/media/icons/2048.webp","categories":["all","local"]},{"name":"Vex 7","link":"/e/1/vex7/index.html","image":"/assets/media/icons/vex7.webp","categories":["all","local"]},{"name":"Vex 6","link":"/e/1/vex6/index.html","image":"/assets/media/icons/vex6.webp","categories":["all","local"]},{"name":"Vex 5","link":"/e/1/vex5/index.html","image":"/assets/media/icons/vex5.webp","categories":["all","local"]},{"name":"Vex 3","link":"/e/1/vex3/index.html","image":"/assets/media/icons/vex3.webp","categories":["all","local"]},{"name":"Vex 4","link":"/e/1/vex4/index.html","image":"/assets/media/icons/vex4.webp","categories":["all","local"]},{"name":"Windows 96","link":"https://windows96.net","image":"/assets/media/icons/windows96.webp","categories":["all"]},{"name":"The Impossible Quiz: Book 2","link":"https://f.silvergames.com/ruffle/player.php?id=3742","image":"/assets/media/icons/book2.webp","categories":["all","emu"]},{"name":"Wrassling","link":"https://games.poki.com/458768/wrassling","image":"/assets/media/icons/wrassling.webp","categories":["all"]},{"name":"Happy Wheels","link":"https://games-online.io/game/HappyWheels/","image":"/assets/media/icons/hw.webp","categories":["all"]},{"name":"Google Snake Modded","link":"https://googlesnakemods.com/v/current/","image":"/assets/media/icons/snake.webp","categories":["all"]},{"name":"Idle Startup Tycoon","link":"https://www.mortgagecalculator.org/money-games/idle-startup-tycoon/","image":"/assets/media/icons/idlestartup.webp","categories":["all"]},{"name":"Two Player Games","link":"https://www.twoplayergames.org/","image":"/assets/media/icons/tpg.webp","categories":["all"]},{"name":"Five Nights at Winston's","link":"https://g.deev.is/fnaw/","image":"/assets/media/icons/fnaw.webp","categories":["all","game"]},{"name":"Goomy Clicker 2","link":"https://idle-js-games.github.io/goomyClicker2/","image":"/assets/media/icons/gc2.webp","categories":["all"]},{"name":"Space Company","link":"/e/1/space-company/index.html","image":"/assets/media/icons/sc.png","categories":["all","local"]},{"name":"Mario Kart DS","link":"https://seraph.reveriestudios.online/games/mariokartds/index.html","image":"/assets/media/icons/mariokartds.jpg","categories":["all","emu"]},{"name":"Cooking Mama","link":"https://seraph.reveriestudios.online/games/cookingmama/index.html","image":"/assets/media/icons/cookingmama.jpg","categories":["all","emu"]},{"name":"Wordle","link":"https://www.nytimes.com/games/wordle/index.html","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Wordle Unlimited","link":"https://wordleunlimited.org/","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Wordly","link":"https://wordly.org/","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Connections","link":"https://www.nytimes.com/games/connections","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Connections Unlimited","link":"https://1games.io/game/connections-game/","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Globle","link":"https://globle.org/?","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Particle Clicker","link":"/e/1/particle-clicker/index.html","image":"/assets/media/icons/pc.png","categories":["all,","local"]},{"name":"ShipCraft.io","link":"https://shipcraft.io/","categories":["all"]},{"name":"Super Mario Bros.","link":"https://emulator-games.pages.dev/nes/Super Mario Bros.","image":"/assets/media/icons/emulator/smb.webp","categories":["all","emu"]},{"name":"Super Mario Bros. 2","link":"https://emulator-games.pages.dev/nes/Super Mario Bros. 2","image":"/assets/media/icons/emulator/smb2.webp","categories":["all","emu"]},{"name":"Super Mario Bros. 3","link":"https://emulator-games.pages.dev/nes/Super Mario Bros. 3","image":"/assets/media/icons/emulator/smb3.webp","categories":["all","emu"]}] +[{"name":"Request A Game","link":"https://forms.gle/vwdHN3iPz5cLaHaMA","image":"/assets/media/icons/request.webp","categories":["all"]},{"name":"Create Custom Game","image":"/assets/media/icons/custom.webp","categories":["all"],"custom":"true"},{"name":"Fancade","link":"https://play.fancade.com","image":"/assets/media/icon/fancade.jpg","categories":["all"]},{"name":"Amazon Luna","link":"https://luna.amazon.com/","image":"/assets/media/icons/amazon-luna.webp","categories":["all"],"blank":"true"},{"name":"Gartic Phone","link":"https://garticphone.com","image":"/assets/media/icons/garticphone.webp","categories":["all"]},{"name":"Newgrounds","link":"https://newgrounds.com/","image":"/assets/media/icons/newgrounds.webp","categories":["all"]},{"name":"Pranx","link":"https://pranx.com/","image":"/assets/media/icons/pranx.webp","categories":["all"]},{"name":"Steam","link":"https://steampowered.com/","image":"/assets/media/icons/steam.webp","categories":["all"],"say":"Steam can't actually be added because it's an app, not a website. This only lets you browse the Steam website, you can't actually play any games unless you use Geforce Now.","partial":true},{"name":"Swordbattle.io","link":"https://swordbattle.io/","image":"/assets/media/icons/swordbattle.webp","categories":["all","2d"]},{"name":"Stabfish.io","link":"https://stabfish.io/","image":"/assets/media/icons/stabfish.webp","categories":["all","2P"]},{"name":"Dynast.io","link":"https://dynast.io","image":"/assets/media/icons/dynast-io.webp","categories":["all"]},{"name":"Twisted Cooking Mama","link":"https://twisted-cooking-mama.game-files.crazygames.com/ruffle/twisted-cooking-mama/1/twistedcookingmama.html?v=1.273","image":"/assets/media/icons/twistedcookingmama.webp","categories":["all"]},{"name":"Marbles Garden","link":"https://www.coolmathgames.com/0-marbles-garden/play","image":"/assets/media/icons/marblesgarden.webp","categories":["all"]},{"name":"Fancy Pants Adventure","link":"https://games.crazygames.com/en_US/fancy-pants-adventure-world/index.html?v=1.273","image":"/assets/media/icons/fancypantsadventures.webp","categories":["all"]},{"name":"Fancy Pants Adventure 2","link":"https://games.crazygames.com/en_US/fancy-pants-adventure-world/index.html?v=1.273","image":"/assets/media/icons/fancypantsadventures2.webp","categories":["all"]},{"name":"Rooftop Snipers 2","link":"https://h5cdn.github.io/s6/rooftop-snipers-2/","image":"/assets/media/icons/rooftopsnipers2.webp","categories":["all"]},{"name":"Stickman Archero Fight","link":"https://html5.gamedistribution.com/rvvASMiM/3f4c166817ad4fd4b5b05d9adba22fcd/index.html","image":"/assets/media/icons/stickman-archero-fight.webp","categories":["all"]},{"name":"Earn to Die 2012 Part 2","link":"https://games-online.io/game/EarnToDie/index.html","image":"/assets/media/icons/earntodie2012part2.webp","categories":["all"]},{"name":"Lostgamer","link":"https://lostgamer.io","image":"/assets/media/icons/lostgamerio.webp","categories":["all","2P"]},{"name":"Thisissand","link":"https://thisissand.com/","image":"/assets/media/icons/thisissand.webp","categories":["all"]},{"name":"digdig.io","link":"https://digdig.io/","image":"/assets/media/icons/digdigio.webp","categories":["all","2P"]},{"name":"Big Tower Tiny Square","link":"https://www.coolmathgames.com/0-big-tower-tiny-square/play","image":"/assets/media/icons/bigtowertinysquare.webp","categories":["all"]},{"name":"The Impossible Quiz","link":"https://the-impossible-quiz.game-files.crazygames.com/ruffle/theimpossiblequiz.html","image":"/assets/media/icons/theimpossiblequiz.webp","categories":["all"]},{"name":"Helix Jump","link":"https://helix-jump.game-files.crazygames.com/helix-jump/1/index.html","image":"/assets/media/icons/helixjump.webp","categories":["all"]},{"name":"skribbl","link":"https://skribbl.io/","image":"/assets/media/icons/skribblio.webp","categories":["all","2P"]},{"name":"Wings!","link":"https://wings.io/","image":"/assets/media/icons/wingsio.webp","categories":["all","2P"]},{"name":"Stomped.io","link":"https://stomped.io","image":"/assets/media/icons/stompedio.webp","categories":["all"]},{"name":"Age of War","link":"https://age-of-war.game-files.crazygames.com/ruffle/ageofwar.html","image":"/assets/media/icons/ageofwar.webp","categories":["all","2P"]},{"name":"Brain Test","link":"https://0322484b-7a58-4454-9667-f805afffded5.poki-gdn.com/2e6b68d3-0f43-4b84-9c14-ab59f94e566c/index.html?country=US&ccpaApplies=0&url_referrer=https%3A%2F%2Fpoki.com%2F&tag=pg-v3.132.1&site_id=3&iso_lang=en&poki_url=https%3A%2F%2Fpoki.com%2Fen%2Fg%2Fbrain-test-tricky-puzzles&gdhoist=yes&nonPersonalized=n&familyFriendly=n&categories=7%2C16%2C37%2C72%2C96%2C400%2C832%2C843%2C1140%2C1150%2C1159&special_condition=landing&game_id=0322484b-7a58-4454-9667-f805afffded5&game_version_id=2e6b68d3-0f43-4b84-9c14-ab59f94e566c","image":"/assets/media/icons/braintest.webp","categories":["all"]},{"name":"Gladihoppers","link":"https://bonbang.github.io/store99/gladihoppers/index.html","image":"/assets/media/icons/gladihoppers.webp","categories":["all"]},{"name":"Snow Rider 3D","link":"https://html5.gamedistribution.com/rvvASMiM/3b79a8537ebc414fb4f9672a9b8c68c8/index.html?gd_zone_config=eyJwYXJlbnRVUkwiOiJodHRwczovL3Nub3dyaWRlcjNkLmNvbS8iLCJwYXJlbnREb21haW4iOiJzbm93cmlkZXIzZC5jb20iLCJ0b3BEb21haW4iOiJzbm93cmlkZXIzZC5jb20iLCJoYXNJbXByZXNzaW9uIjpmYWxzZSwibG9hZGVyRW5hYmxlZCI6dHJ1ZSwiaG9zdCI6Imh0bWw1LmdhbWVkaXN0cmlidXRpb24uY29tIiwidmVyc2lvbiI6IjEuNS4xNiJ9","image":"/assets/media/icons/snowrider3d.webp","categories":["all"]},{"name":"3 Slices","link":"https://images-opensocial.googleusercontent.com/gadgets/ifr?url=https://s3.amazonaws.com/production-assetsbucket-8ljvyr1xczmb/1ee20621-61bc-4ec8-a8ec-5e839c2e6edc%2F3-slices.xml","image":"/assets/media/icons/3slices.webp","categories":["all"]},{"name":"Buckshot Roulette","link":"https://buckshotroulette.online/game/v11/","image":"/assets/media/icons/buckshotroulette.webp","categories":["all"]},{"name":"Starblast","link":"https://starblast.io","image":"/assets/media/icons/starblastio.webp","categories":["all","2P"]},{"name":"CSGO Parkour","link":"https://yandex.com/games/app/203069?flags={%22adv_sticky_banner_disabled%22:true}","image":"/assets/media/icons/csgoparkour.webp","categories":["all"]},{"name":"Parkour Block 3D","link":"https://html5.gamedistribution.com/1461d40bb77f48e6be72489959a1ac04/","image":"/assets/media/icons/parkourblock3d.webp","categories":["all"]},{"name":"Jelly Mario","link":"https://jellymar.io","image":"/assets/media/icons/jellymario.webp","categories":["all"]},{"name":"Tyran.io","link":"https://tyran.io","image":"/assets/media/icons/tyranio.webp","categories":["all","2P"]},{"name":"Arras.io","link":"https://arras.io/","image":"/assets/media/icons/arrasio.webp","categories":["all","2P"]},{"name":"mk48.io","link":"https://mk48.io/","image":"/assets/media/icons/mk48io.webp","categories":["all","2P"]},{"name":"Bandit.RIP","link":"https://bandit.rip/","image":"/assets/media/icons/banditrip.webp","categories":["all","2P"]},{"name":"Addicting Games","link":"https://www.addictinggames.com/","image":"/assets/media/icons/addictinggames.webp","categories":["all"]},{"name":"Deeeep.io","link":"https://beta.deeeep.io","image":"/assets/media/icons/deeeepio.webp","categories":["all","2P"]},{"name":"ev.io","link":"https://ev.io","image":"/assets/media/icons/evio.webp","categories":["all","2P"]},{"name":"Brain Test 2","link":"https://games.poki.com/458768/df221093-aae9-4c0d-b458-efb16ae8e3ab","image":"/assets/media/icons/braintest2.webp","categories":["all"]},{"name":"Brain Test 3","link":"https://games.poki.com/458768/1f3ae540-a95f-4f20-a000-29512612e341","image":"/assets/media/icons/braintest3.webp","categories":["all"]},{"name":"Donitz - itch.io","link":"https://donitz.itch.io/","image":"/assets/media/icons/itch.webp","categories":["all"]},{"name":"Territorial.io","link":"https://territorial.io","image":"/assets/media/icons/territorialio.webp","categories":["all","2P"]},{"name":"Stickman Hook","link":"/e/stickman-hook/index.html","image":"/assets/media/icons/stickmanhook.webp","categories":["all","local"]},{"name":"Tube Jumpers","link":"https://unblocked76.github.io/tube-jumpers/","image":"/assets/media/icons/tubejumpers.webp","categories":["all","2P"]},{"name":"Tunnel Rush","link":"https://5dd2e8e4-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/5627efae-e960-407d-82a5-3da708eb4e68/index.html","image":"/assets/media/icons/tunnelrush.webp","categories":["all","2P"]},{"name":"Tunnel Rush 2","link":"https://a7e6d137-c3c1-46e6-a3db-04c2d33c98a8.poki-gdn.com/71e6bddd-9b0e-4621-a11a-9503086f69d5/index.html","image":"/assets/media/icons/tunnelrush2.webp","categories":["all"]},{"name":"Rainbow Obby","link":"https://785a4295-96c4-43e5-b237-fb07fc3ef44d.poki-gdn.com/f1d39f75-7a25-41de-86cf-ba00804737b5/index.html","image":"/assets/media/icons/rainbowobby.webp","categories":["all","2P"]},{"name":"Candy Jump","link":"https://candyjump.games235.com/","image":"/assets/media/icons/candyjump.webp","categories":["all"]},{"name":"Google Feud","link":"https://googlefeud.com/","image":"/assets/media/icons/googlefeud.webp","categories":["all"]},{"name":"Minecraft Classic","link":"https://classic.minecraft.net","image":"/assets/media/icons/mc.webp","categories":["all","2P"]},{"name":"Learn to Fly 3","link":"https://www.silvergames.com/en/learn-to-fly-3/iframe","image":"/assets/media/icons/learntofly3.webp","categories":["all"]},{"name":"Neal.Fun","link":"https://neal.fun","image":"/assets/media/icons/nealfun.webp","categories":["all"],"error":"true","say":"Neal.fun does not work on Interstellar because of Cloudflare protection."},{"name":"YoHoHo.io","link":"https://yohoho.io/","image":"/assets/media/icons/yohoho.webp","categories":["all","2P"]},{"name":"AntWar.io","link":"https://antwar.io/","image":"/assets/media/icons/antwario.webp","categories":["all","2P"]},{"name":"Tetr.io","link":"https://tetr.io/","image":"/assets/media/icons/tetrio.webp","categories":["all","2P"]},{"name":"Time Shooter 2","link":"https://html5.gamedistribution.com/62a72f2da7cb4b609579a47653546e6a/","image":"/assets/media/icons/timeshooter2.webp","categories":["all"]},{"name":"Merge Fruit","link":"https://html5.gamedistribution.com/2dee9d404697435aa76111eb4015e1d5/","image":"/assets/media/icons/mergefruit.webp","categories":["all"]},{"name":"There Is No Game","link":"https://5dd2d607-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/38959ae1-110b-49ab-86ae-df425fd7862a/index.html","image":"/assets/media/icons/thereisnogame.webp","categories":["all"]},{"name":"Jetpack Joyride","link":"/e/jetpack-joyride/index.html","image":"/assets/media/icons/jetpackjoyride.webp","categories":["all","local"]},{"name":"FeedVid","link":"https://v6p9d9t4.ssl.hwcdn.net/html/4941980-683813/index.html","image":"/assets/media/icons/feedvid.webp","categories":["all"]},{"name":"florr.io","link":"https://florr.io","image":"/assets/media/icons/florr.webp","categories":["all","2P"]},{"name":"Rocket Bot Royale","link":"https://rocketbotroyale2.winterpixel.io/","image":"/assets/media/icons/rocketbotroyale.webp","categories":["all"]},{"name":"Happy Wheels","link":"https://files.crazygames.com/ruffle/happywheels.html","image":"/assets/media/icons/happywheels.webp","categories":["all"]},{"name":"Papa's Burgeria","link":"https://www.coolmathgames.com/0-papas-burgeria/play","image":"/assets/media/icons/papasburgeria.webp","categories":["all"]},{"name":"Papa's Cheeseria","link":"https://www.coolmathgames.com/0-papas-cheeseria/play","image":"/assets/media/icons/papascheeseria.webp","categories":["all"]},{"name":"Papa's Pancakeria","link":"https://www.coolmathgames.com/0-papas-pancakeria/play","image":"/assets/media/icons/papaspancakeria.webp","categories":["all"]},{"name":"Papa's Wingeria","link":"https://www.coolmathgames.com/0-papas-wingeria/play","image":"/assets/media/icons/papaswingeria.webp","categories":["all"]},{"name":"Riddle School 1","link":"https://uploads.ungrounded.net/ruffle_wrapper/ruffleembed.html?v=1.0.67&browsermode=default&props=%7B%22ruffle%22%3A%22%2Fruffle_wrapper%2Flib%2Fruffle.js%3F1695474658%22%2C%22public_path%22%3A%22%2Fruffle_wrapper%2Flib%2F%22%2C%22swf%22%3A%22https%3A%2F%2Fuploads.ungrounded.net%2F314000%2F314680_Riddle_School.swf%3F1148577264%22%2C%22vars%22%3A%7B%22NewgroundsAPI_PublisherID%22%3A1%2C%22NewgroundsAPI_SandboxID%22%3A%2265103f0745c96%22%2C%22NewgroundsAPI_SessionID%22%3A%22%22%2C%22NewgroundsAPI_UserName%22%3A%22%26lt%3Bdeleted%26gt%3B%22%2C%22NewgroundsAPI_UserID%22%3A0%2C%22ng_username%22%3A%22%26lt%3Bdeleted%26gt%3B%22%7D%2C%22width%22%3A550%2C%22height%22%3A400%2C%22icon%22%3A%22https%3A%2F%2Fpicon.ngfiles.com%2F314000%2Fflash_314680_card.webp%3Ff1607914286%22%2C%22warnOnUnsupportedContent%22%3Afalse%7D","image":"/assets/media/icons/riddle-school.webp","categories":["all"]},{"name":"Powerline.IO","link":"https://powerline.io","image":"/assets/media/icons/powerline.webp","categories":["all","2P"]},{"name":"Papa's Scooperia","link":"https://files.crazygames.com/ruffle/papasscooperia.html","image":"/assets/media/icons/papasscooperia.webp","categories":["all"]},{"name":"Papa's Sushiria","link":"https://files.crazygames.com/ruffle/papassushiria.html","image":"/assets/media/icons/papassushiria.webp","categories":["all"]},{"name":"Burrito Bison","link":"https://f.silvergames.com/awayfl/index.html?swf=burrito-bison.swf","image":"/assets/media/icons/burritobison.webp","categories":["all"]},{"name":"Fireboy And Watergirl 2 In The Light Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40210/","image":"/assets/media/icons/fireboyandwatergirllighttemple.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 4 In The Crystal Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40212/","image":"/assets/media/icons/fireboyandwatergirlcrystaltemple.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 5: Elements","link":"https://www.coolmathgames.com/sites/default/files/public_games/40218","image":"/assets/media/icons/fireboyandwatergirlelements.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 6: Fairy Tales","link":"https://html5.gamedistribution.com/rvvASMiM/be3cff113c4e4f069b7614851825ffe9/index.html","image":"/assets/media/icons/fireboyandwatergirlfairytales.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl In The Forest Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40034/","image":"/assets/media/icons/fireboyandwatergirlforesttemple.webp","categories":["all","2P"]},{"name":"Gunspin","link":"https://html5.gamedistribution.com/rvvASMiM/917cce8c44c44638a8cdc2a1794b65c8/index.html","image":"/assets/media/icons/gunspin.webp","categories":["all"]},{"name":"Thelast Royale","link":"https://thelast.io","image":"/assets/media/icons/thelast-io.webp","categories":["all","2P"]},{"name":"mope.io","link":"https://thelast.io","image":"/assets/media/icons/mope-io.webp","categories":["all","2P"]},{"name":"Tiny Fishing","link":"https://www.dob5.com/d/file/games/tiny-fishing/","image":"/assets/media/icons/tinyfishing.webp","categories":["all"]},{"name":"Johnny Upgrade","link":"https://lagged.com/api/play2/johnny-upgrade3/","image":"/assets/media/icons/johnnyupgrade.webp","categories":["all"]},{"name":"bloxd.io","link":"https://bloxd.io","image":"/assets/media/icons/bloxd-io.webp","categories":["all","2P"]},{"name":"Duck Life 1","link":"https://www.hoodamath.com/mobile/games/duck-life/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 2","link":"https://www.hoodamath.com/mobile/games/duck-life-2-world-champion/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 3","link":"https://www.hoodamath.com/mobile/games/duck-life-3-evolution/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 4","link":"/e/ducklife4/index.html","image":"/assets/media/icons/dl4.webp","categories":["all","local"],"load":true},{"name":"Papa's Freezeria","link":"https://www.coolmathgames.com/0-papas-freezeria/play","image":"/assets/media/icons/papasfreezeria.webp","categories":["all","2P"]},{"name":"Evades","link":"https://evades.io","image":"/assets/media/icons/evadesio.webp","categories":["all,","2P"]},{"name":"Bullet Force Multiplayer","link":"https://www.crazygames.com/game/bullet-force-multiplayer","image":"/assets/media/icons/BFM.webp","categories":["all,","2P"]},{"name":"Crazy Games","link":"https://www.crazygames.com/","image":"/assets/media/icons/crazy.webp","categories":["all,","emu,","2P,","sports,","flash"]},{"name":"Cubes 2048","link":"https://www.crazygames.com/game/cubes-2048-io","image":"/assets/media/icons/C2048.webp","categories":["all,","2P"]},{"name":"DOOM","link":"https://archive.org/details/doom-play","image":"/assets/media/icons/DOOM.webp","categories":["all,","emu"]},{"name":"FNAF 2","link":"https://sussygamedeveloper.github.io/FNAF2/","image":"/assets/media/icons/FNAF2.webp","categories":["all"]},{"name":"FNAF 3","link":"https://sussygamedeveloper.github.io/fnaf3/","image":"/assets/media/icons/FNAF3.webp","categories":["all"]},{"name":"FNAF Web","link":"https://wellsousaaa.github.io/Five-Nights-at-Freddys-Web/","image":"/assets/media/icons/FNAFWeb.webp","categories":["all"]},{"name":"Riddle School 4","link":"https://riddle-school-4.game-files.crazygames.com/ruffle/riddleschool4.html","image":"/assets/media/icons/rs4.webp","categories":["all"]},{"name":"Riddle School 5","link":"https://riddle-school-5.game-files.crazygames.com/ruffle/riddleschool5.html","image":"/assets/media/icons/rs5.webp","categories":["all"]},{"name":"GBA Emulator","link":"https://ds.44670.org/gba/","image":"/assets/media/icons/gba.webp","categories":["all,","emu"]},{"name":"Itch.io","link":"https://itch.io","image":"/assets/media/icons/itch.webp","categories":["all,","emu,","2P"]},{"name":"N-Gon","link":"https://landgreen.github.io/sidescroller/","image":"/assets/media/icons/NGON.webp","categories":["all"]},{"name":"Nintendo DS Emulator","link":"https://ds.44670.org/","image":"/assets/media/icons/ds.webp","categories":["all,","emu"]},{"name":"Nintendo 64 Emulator","link":"https://www.neilb.net/n64wasm/","image":"/assets/media/icons/N64.webp","categories":["all,","emu"]},{"name":"Playstation 2 Emulator","link":"https://playjs.purei.org/","image":"/assets/media/icons/PS2.webp","categories":["all,","emu"]},{"name":"Run 3","link":"https://www.coolmathgames.com/0-run-3/play","image":"/assets/media/icons/run3.webp","categories":["all,","flash"]},{"name":"Subway Surfers: San Francisco ","link":"https://raw.githack.com/3kh0/3kh0-assets/main/subway-surfers/index.html","image":"/assets/media/icons/SF.webp","categories":["all,","emu"]},{"name":"Survivor.io","link":"https://html5.gamedistribution.com/rvvASMiM/f1c451e586c04b4c8cba01b0c50d9090/index.html","image":"/assets/media/icons/SVI.webp","categories":["all,","emu"]},{"name":"Web Retro","link":"/e/index.html","image":"/assets/media/icons/webretro.webp","categories":["all,","emu","local"]},{"name":"Slope","link":"https://watchdocumentaries.com/wp-content/uploads/games/slope/","image":"/assets/media/icons/slope.webp","categories":["all"]},{"name":"Fortnite (Geforce NOW)","link":"https://play.geforcenow.com/mall/#/deeplink?game-id=46bfab06-d864-465d-9e56-2d9e45cdee0a","image":"/assets/media/icons/fortnite.webp","categories":["all"]},{"name":"Bomb Party","link":"https://jklm.fun","image":"/assets/media/icons/BP.webp","categories":["all,","2P"]},{"name":"1","link":"/e/1/1/index.html","image":"/assets/media/icons/1.webp","categories":["all","local"]},{"name":"1v1.LOL","link":"https://1v1.lol","image":"/assets/media/icons/1v1-lol.webp","categories":["all,","2P"]},{"name":"2D Rocket League","link":"https://v6p9d9t4.ssl.hwcdn.net/html/3325334/index.html","image":"/assets/media/icons/2D-Rocket-League.webp","categories":["all"]},{"name":"3D Dino Game","link":"https://lagged.com/api/play2/t-rex-3d2/","image":"/assets/media/icons/trex-run-3D.webp","categories":["all"]},{"name":"60 Sec. Burger Run","link":"https://www.coolmathgames.com/0-60-second-burger-run/play","image":"/assets/media/icons/60-second-burger-run.webp","categories":["all"]},{"name":"8 Ball Pool","link":"https://8ball-pool.io","image":"/assets/media/icons/8ball.webp","categories":["all"]},{"name":"A Dark Room","link":"https://adarkroom.doublespeakgames.com","image":"/assets/media/icons/ADR.webp","categories":["all"]},{"name":"Ace Attorney","link":"https://f.kbhgames.com/r/gba/?r=ace-attorney","image":"/assets/media/icons/aa.webp","categories":["all"]},{"name":"AC - Wild World","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/10/animal-crossing-wild-world1.zip","image":"/assets/media/icons/acww.webp","categories":["all"]},{"name":"Adventure Capitalist","link":"https://than1089.github.io/adventure-capitalist/","image":"/assets/media/icons/adventure-capitalist.webp","categories":["all"]},{"name":"Agar.io","link":"https://agar.io","image":"/assets/media/icons/agario.webp","categories":["all"]},{"name":"Among Us (Scratch)","link":"https://turbowarp.org/523967150/fullscreen","image":"/assets/media/icons/scratch-among-us.webp","categories":["all"]},{"name":"Apex Legends","link":"https://play.geforcenow.com/games?game-id=cb2b1b5f-54ba-45fd-9839-96bbfe1376cd&lang=en_US&asset-id=01_c6efce00-e91e-402a-8b72-f4971f89c528","image":"/assets/media/icons/apex.webp","categories":["all"]},{"name":"Basket Random","link":"https://html5.gamedistribution.com/rvvASMiM/bf1268dccb5d43e7970bb3edaa54afc8/index.html","image":"/assets/media/icons/br.webp","categories":["all"]},{"name":"Basketball Stars","link":"https://html5.gamedistribution.com/69d78d071f704fa183d75b4114ae40ec/","image":"/assets/media/icons/basketball-stars.webp","categories":["all"]},{"name":"Basketball Bros","link":"https://www.basketbros.io/","image":"/assets/media/icons/basket-bros.webp","categories":["all"]},{"name":"Basketball Legends","link":"https://www.basketballlegends.fun/gamedata/basketball-legends-2020","image":"/assets/media/icons/basketball-legends.webp","categories":["all"]},{"name":"Biggie Cheese Fight","link":"https://scratch.mit.edu/projects/163771748/fullscreen","image":"/assets/media/icons/biggiecheese.webp","categories":["all"]},{"name":"Bitlife","link":"https://xlegends.github.io/bitlife/","image":"/assets/media/icons/bitlife.webp","categories":["all"]},{"name":"BTD 4","link":"https://en.gameslol.net/data/bloons-td-4/index.html","image":"/assets/media/icons/btd4.webp","categories":["all"]},{"name":"BuildNow.GG","link":"https://games.crazygames.com/en_US/buildnow-gg/index.html","image":"/assets/media/icons/build-now.webp","categories":["all"]},{"name":"Cat Ninja","link":"https://4iapq88o5f3gc1dij3it0mp5jojnm3jr-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://s3.amazonaws.com/production-assetsbucket-8ljvyr1xczmb/1ee20621-61bc-4ec8-a8ec-5e839c2e6edc%252Fcat-ninja.xml","image":"/assets/media/icons/cat-ninja.webp","categories":["all"]},{"name":"Candy Box","link":"https://candybox2.net","image":"/assets/media/icons/candybox.webp","categories":["all"]},{"name":"Celeste PICO-8","link":"https://exok.com/minigames/celeste.html","image":"/assets/media/icons/celeste.webp","categories":["all"]},{"name":"Clicker Heros","link":"https://www.clickerheroes.com/play.html","image":"/assets/media/icons/clickerheros.webp","categories":["all"]},{"name":"Chess.com","link":"https://chess.com","image":"/assets/media/icons/chess.webp","categories":["all"]},{"name":"Cluster Rush","link":"/e/2/Cluster-Rush/index.html","image":"/assets/media/icons/cluster-rush.webp","categories":["all","local"]},{"name":"Cookie Clicker","link":"https://orteil.dashnet.org/cookieclicker/","image":"/assets/media/icons/cookieclicker.webp","categories":["all"]},{"name":"Crossy Road","link":"https://5dd2e1e3-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/169dc11d-e718-4b36-9e60-d5ed5bc07a31/index.html","image":"/assets/media/icons/cr.webp","categories":["all"]},{"name":"Deepest Sword","link":"https://v6p9d9t4.ssl.hwcdn.net/html/4017918/index.html","image":"/assets/media/icons/deepest-sword.webp","categories":["all"]},{"name":"Diep.io","link":"https://diep.io/","image":"/assets/media/icons/diep.webp","categories":["all"]},{"name":"Doge Miner","link":"/e/1/DogeMiner/index.html","image":"/assets/media/icons/doge-miner-1.webp","categories":["all","local"]},{"name":"Doom 1","link":"https://browncha023.github.io/GBA/launcher.html#dm","image":"/assets/media/icons/DOOM.webp","categories":["all"]},{"name":"Doom 2","link":"https://browncha023.github.io/GBA/launcher.html#dm2","image":"/assets/media/icons/doom2.webp","categories":["all"]},{"name":"Dreader","link":"https://donitz.itch.io/dreader","image":"/assets/media/icons/dreader.webp","categories":["all"]},{"name":"Drift Boss","link":"https://watchdocumentaries.com/wp-content/uploads/games/drift-boss/","image":"/assets/media/icons/db.webp","categories":["all"]},{"name":"Drift Hunters","link":"https://webglmath.github.io/drift-hunters/","image":"/assets/media/icons/drift-hunters.webp","categories":["all"]},{"name":"Drive Mad","link":"https://raw.githack.com/3kh0/3kh0-assets/main/drive-mad/index.html","image":"/assets/media/icons/dm.webp","categories":["all"]},{"name":"Fallout 2","link":"https://jonasz-o.itch.io/fallout2remake3d","image":"/assets/media/icons/fallout2.webp","categories":["all"]},{"name":"FNAF 2 (Scratch)","link":"https://scratch.mit.edu/projects/469219637/embed/","image":"/assets/media/icons/FNAF2.webp","categories":["all"]},{"name":"Friday Night Funkin'","link":"https://w8.snokido.com/games/html5/friday-night-funkin/0281/index.html","image":"/assets/media/icons/fnf.webp","categories":["all"]},{"name":"FNF - Lofi Mod","link":"https://fnf.kdata1.com/lofi-funkin/2/","image":"/assets/media/icons/lofi.webp","categories":["all"]},{"name":"FNF VS. Snorlax","link":"https://fnf.kdata1.com/snorlax/1/","image":"/assets/media/icons/snorlax.webp","categories":["all"]},{"name":"JustFall.LOL","link":"https://justfall.lol","image":"/assets/media/icons/just-fall-lol.webp","categories":["all"]},{"name":"Kirby Mirror (GBA)","link":"https://www.retrogames.onl/gba/kirby-mirror-gba.html","image":"/assets/media/icons/kirby.webp","categories":["all"]},{"name":"Krunker","link":"https://krunker.io","image":"/assets/media/icons/krunker.webp","categories":["all"]},{"name":"G-Switch","link":"https://5dd24442-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/4f2c69b4-3edc-4cd7-a078-efd3d1ea9fb5/index.html","image":"/assets/media/icons/gswitch.webp","categories":["all"]},{"name":"G-Switch 2","link":"https://5dd27095-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/e0e70ee4-fdd4-4de8-931d-fde7d1cb408b/index.html","image":"/assets/media/icons/gswitch2.webp","categories":["all"]},{"name":"G-Switch 3","link":"https://5dd2b395-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/120fdec6-7eeb-470f-a43c-9bcdace0dacb/index.html","image":"/assets/media/icons/gswitch3.webp","categories":["all"]},{"name":"Golden Eye 007","link":"https://f.kbhgames.com/r/n64/game.php?file=007-golden-eye.zip","image":"/assets/media/icons/golden-eye-007.webp","categories":["all"]},{"name":"GBA Games 2","link":"https://cattn.github.io/gba/","image":"/assets/media/icons/gba.webp","categories":["all"]},{"name":"Geforce NOW","link":"https://play.geforcenow.com","image":"/assets/media/icons/geforce-now.webp","categories":["all"]},{"name":"Haunted School 1","link":"https://games.crazygames.com/en_US/haunted-school---horror-game/index.html","image":"/assets/media/icons/na.webp","categories":["all"]},{"name":"HexArena","link":"https://hexarena.io/","image":"/assets/media/icons/hexarena.webp","categories":["all"]},{"name":"Hole.IO","link":"https://hole-io.com/","image":"/assets/media/icons/hole.webp","categories":["all"]},{"name":"Idle Breakout","link":"/e/1/idle-breakout/index.html","image":"/assets/media/icons/idlebreakout.webp","categories":["all","local"]},{"name":"Isleward","link":"https://play.isleward.com","image":"/assets/media/icons/isleward.webp","categories":["all"]},{"name":"Interactive Buddy","link":"https://f.silvergames.com/ruffle/player.php?id=204","image":"/assets/media/icons/interactive-buddy.webp","categories":["all"]},{"name":"NGU Idle","link":"https://cache.armorgames.com/files/games/ngu-idle-18444/index.html?v=1559319416","image":"/assets/media/icons/nguidle.webp","categories":["all"]},{"name":"Jacksmith","link":"https://www.coolmathgames.com/0-jacksmith/play","image":"/assets/media/icons/jacksmith.webp","categories":["all"]},{"name":"Sandtrix","link":"https://files.crazygames.com/sandtrix/16/index.html","image":"/assets/media/icons/sandtrix.webp","categories":["all"]},{"name":"Learn To Fly Idle","link":"https://www.gameslol.net/data/waflash/index.php?g=635","image":"/assets/media/icons/ltf_idle.webp","categories":["all"]},{"name":"Lordz.io","link":"https://lordz.io/","image":"/assets/media/icons/lordz.webp","categories":["all"]},{"name":"Masked IO","link":"https://unblocked-games.s3.amazonaws.com/games/masked-io/index.html","image":"/assets/media/icons/masked-forces.webp","categories":["all"]},{"name":"Mario Kart 64","link":"https://static.arcadespot.com/retroemulator.php?system=n64&game=2017/06/mario-kart-64.zip","image":"/assets/media/icons/mario-kart-64.webp","categories":["all"]},{"name":"Mobs Inc","link":"https://overboy.itch.io/mobs-inc","image":"/assets/media/icons/mobsinc.webp","categories":["all"]},{"name":"Monkey Mart","link":"/e/2/monkey-mart/index.html","image":"/assets/media/icons/mm.webp","categories":["all","local"]},{"name":"MooMoo.io","link":"https://moomoo.io","image":"/assets/media/icons/moo.webp","categories":["all"]},{"name":"Mortal Kombat 4","link":"https://f.kbhgames.com/r/n64/game.php?file=Mortal-Kombat-4-U.zip","image":"/assets/media/icons/mortal-kombat-4.webp","categories":["all"]},{"name":"Mr. Mine","link":"https://www.coolmathgames.com/0-mr-mine/play","image":"/assets/media/icons/mrmine.webp","categories":["all"]},{"name":"Moto X3M","link":"https://html5.gamedistribution.com/rvvASMiM/5b0abd4c0faa4f5eb190a9a16d5a1b4c/index.html","image":"/assets/media/icons/mx3m.webp","categories":["all"]},{"name":"MX3M: Pool Party","link":"https://h0jokl1egt0fd4oc8qv3j0tltl9jbqhn-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://649025137-174029463385024710.preview.editmysite.com/uploads/b/139890129-767696982876512205/files/mx3mpp.xml","image":"/assets/media/icons/mx3m.webp","categories":["all"]},{"name":"MX3M: Spooky Land","link":"https://html5.gamedistribution.com/rvvASMiM/b8a342904608470a9f3382337aca3558/index.html","image":"/assets/media/icons/mx3m-spooky.webp","categories":["all"]},{"name":"MX3M: Winter","link":"https://www-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://sites.google.com/site/s017q3e/moto-x3m-4-winter.xml","image":"/assets/media/icons/mx3m-winter.webp","categories":["all"]},{"name":"Saul Run","link":"https://complex-ify.itch.io/saul-goodman","image":"/assets/media/icons/saulrun.webp","categories":["all"]},{"name":"Ninja Cat Exploit","link":"https://html5.gamedistribution.com/rvvASMiM/903ba9346b9d437e9c7e81d672cead44/index.html","image":"/assets/media/icons/ninja-cat.webp","categories":["all"]},{"name":"OvO","link":"https://8rlfg0ch3417et18dp8lvps6uo7c3b2c-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://427396048-642845047394716217.preview.editmysite.com/uploads/b/139890129-761103484729797659/files/ovo.xml","image":"/assets/media/icons/ovo.webp","categories":["all"]},{"name":"Online Racing Game!","link":"https://jchabin.github.io/cars/","image":"/assets/media/icons/OR.webp","categories":["all"]},{"name":"Online Soccer M.","link":"https://www.onlinesoccermanager.com/","image":"/assets/media/icons/osm.webp","categories":["all"]},{"name":"Papa's Bakeria","link":"https://f.silvergames.com/emu/waffle/?id=5458","image":"/assets/media/icons/bakeria.webp","categories":["all"]},{"name":"Papa's Cupcakeria","link":"https://f.silvergames.com/emu/waffle/?id=3246","image":"/assets/media/icons/cupcakeria.webp","categories":["all"]},{"name":"Papa Louie 1","link":"https://f.silvergames.com/ruffle/player.php?id=1373","image":"/assets/media/icons/louie1.webp","categories":["all"]},{"name":"Papa Louie 2","link":"https://f.silvergames.com/emu/waffle/?id=3042","image":"/assets/media/icons/louie2.webp","categories":["all"]},{"name":"Papa Louie 3","link":"https://f.silvergames.com/emu/waffle/?id=4693","image":"/assets/media/icons/papa-louie-3.webp","categories":["all"]},{"name":"Papa's Pizzeria","link":"https://f.silvergames.com/ruffle/player.php?id=1360","image":"/assets/media/icons/pizzeria.webp","categories":["all"]},{"name":"Paper Mario 64","link":"https://f.kbhgames.com/r/n64/game.php?file=Paper%20Mario%20(USA).zip","image":"/assets/media/icons/paper-mario-64.webp","categories":["all"]},{"name":"Paper.io","link":"https://paper-io.com/","image":"/assets/media/icons/paperio.webp","categories":["all"]},{"name":"Pixel Shooter","link":"https://94bfktj403i6m18as4vkvtreqd0ohci4-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://274019683-173520394482650759.preview.editmysite.com/uploads/b/139890129-131715539788281629/files/ps.xml","image":"/assets/media/icons/pixel-shooter.webp","categories":["all"]},{"name":"Pizza Tower","link":"https://gamaverse.com/c/e/g/pizza-tower-1678640389/index.html","image":"/assets/media/icons/pizza-tower.webp","categories":["all"]},{"name":"Pokemon Heart Gold","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/10/pokemon-heartgold-version1.zip","image":"/assets/media/icons/heartgold.webp","categories":["all"]},{"name":"Pokemon Showdown","link":"https://play.pokemonshowdown.com","image":"/assets/media/icons/showdown.webp","categories":["all"]},{"name":"Google Baseball","link":"https://www.google.com/logos/2019/july4th19/r6/july4th19.html","image":"/assets/media/icons/googlebaseball.webp","categories":["all"]},{"name":"Deal or No Deal","link":"https://f.kbhgames.com/RS/game.php?r=//f.kbhgames.com/2018/swf/dondeal2.swf&w=640&h=480&warnsupport=true","image":"/assets/media/icons/deal-or-no-deal.webp","categories":["all"]},{"name":"Deadshot","link":"https://deadshot.io","image":"/assets/media/icons/deadshot.webp","categories":["all"]},{"name":"Rainbow Tower","link":"https://www.mathplayground.com/mobile_rainbow_tower/index.html","image":"/assets/media/icons/rainbowtower.webp","categories":["all"]},{"name":"Doodle Jump","link":"https://doodlejump.pro/","image":"/assets/media/icons/doodlejump.webp","categories":["all"]},{"name":"Madalin Stunt Cars Multiplayer","link":"https://games.crazygames.com/en_US/madalin-cars-multiplayer/index.html","image":"/assets/media/icons/madalinmultiplayer.webp","categories":["all","2P"]},{"name":"Madalin Stunt Cars 2","link":"https://games.crazygames.com/en_US/madalin-stunt-cars-2/index.html","image":"/assets/media/icons/madalinstuntcars2.webp","categories":["all"]},{"name":"Madalin Stunt Cars 3","link":"https://games.crazygames.com/en_US/madalin-stunt-cars-3/index.html","image":"/assets/media/icons/madalinstuntcars3.webp","categories":["all"]},{"name":"PM: Light Platinum","link":"https://browncha023.github.io/GBA/launcher.html#pokemonlp","image":"/assets/media/icons/lp.webp","categories":["all"]},{"name":"Precision Client","link":"https://glcdn.githack.com/3kh0/3kh0-assets/-/raw/main/precision-client/index.html","image":"/assets/media/icons/precision.webp","categories":["all"]},{"name":"Rainbow Six Siege","link":"https://play.geforcenow.com/games?game-id=1dd07d47-6601-42f7-80e9-e4d8db08ea1b&lang=en_US&asset-id=01_44417-48c3d8e642e2","image":"/assets/media/icons/r6.webp","categories":["all"]},{"name":"Red Ball 1","link":"https://www.algebrashelper.com/redball","image":"/assets/media/icons/redball1.webp","categories":["all"]},{"name":"Red Ball 2","link":"https://www.algebrashelper.com/redball-2","image":"/assets/media/icons/redball2.webp","categories":["all"]},{"name":"Red Ball 4","link":"https://www.algebrashelper.com/redball-4","image":"/assets/media/icons/redball4.webp","categories":["all"]},{"name":"Red Ball 4 Vol. 2","link":"https://www.algebrashelper.com/read-ball-4v2","image":"/assets/media/icons/redball4vol2.webp","categories":["all"]},{"name":"Red Ball 4 Vol. 3","link":"https://www.algebrashelper.com/red-ball-4v3","image":"/assets/media/icons/redball4vol3.webp","categories":["all"]},{"name":"Riddle School 2","link":"https://f.silvergames.com/ruffle/player.php?id=8564","image":"/assets/media/icons/rs2.webp","categories":["all"]},{"name":"Riddle School 3","link":"https://riddle-school-3.game-files.crazygames.com/ruffle/riddleschool3.html","image":"/assets/media/icons/rs3.webp","categories":["all"]},{"name":"Rocket Pult","link":"https://v6p9d9t4.ssl.hwcdn.net/html/565140/index.html","image":"/assets/media/icons/rocketpult.webp","categories":["all"]},{"name":"Rooftop Snipers","link":"https://html5.gamedistribution.com/rvvASMiM/c3a70ae98547407a92ebedca8b79fdfa/index.html","image":"/assets/media/icons/rooftop.webp","categories":["all"]},{"name":"Sand Spiel","link":"https://sandspiel.club/","image":"/assets/media/icons/sand.webp","categories":["all"]},{"name":"Sandboxels","link":"https://v6p9d9t4.ssl.hwcdn.net/html/5808591/index.html","image":"/assets/media/icons/sandboxels.webp","categories":["all"]},{"name":"Shapez.IO","link":"https://shapez.io","image":"/assets/media/icons/shapezio.webp","categories":["all"]},{"name":"Shell Shockers","link":"https://shellshock.io/","image":"/assets/media/icons/shell-shockers.webp","categories":["all"]},{"name":"Slither.io","link":"https://slither.io/","image":"/assets/media/icons/slither.webp","categories":["all"]},{"name":"Smash Bros 64","link":"https://emulatorgames.online/games/n64/super-smash-bros","image":"/assets/media/icons/super-smash-bros-64.webp","categories":["all"]},{"name":"Smash Karts","link":"https://smashkarts.io/","image":"/assets/media/icons/smashkarts.webp","categories":["all"]},{"name":"Snowball.io","link":"https://games.crazygames.com/en_US/snowball-io/index.html","image":"/assets/media/icons/snowball.webp","categories":["all"]},{"name":"Space Plan","link":"https://jhollands.co.uk/spaceplan/","image":"/assets/media/icons/spaceplan.webp","categories":["all"]},{"name":"Stumble Guys","link":"https://www.stumbleguys.com/play","image":"/assets/media/icons/stumble-guys.webp","categories":["all"]},{"name":"Stumble Guys Clone","link":"https://stumble-guys.io/stumble-guys.embed","image":"/assets/media/icons/stumble-guys.webp","categories":["all"]},{"name":"Sugar Sugar HTML5","link":"https://66564262-37c6-4095-a731-535342e4bbe4.poki-gdn.com/5bd6e8c6-381d-4de5-9823-96662d29afaf/index.html","image":"/assets/media/icons/sugarsugar.webp","categories":["all"]},{"name":"Super Mario 63","link":"https://www.numuki.com/gameframe/super-mario-63","image":"/assets/media/icons/sm63.webp","categories":["all"]},{"name":"Super Mario 64","link":"https://f.kbhgames.com/r/n64/game.php?file=32112_super-mario-64-usa.zip","image":"/assets/media/icons/sm64.webp","categories":["all"]},{"name":"Super Smash Flash","link":"https://f.kbhgames.com/RS/game.php?r=//f.kbhgames.com/2018/swf/smashflash.swf&w=1521&h=753","image":"/assets/media/icons/ssf1.webp","categories":["all"]},{"name":"Supply Chain Idle","link":"https://chat.kongregate.com/gamez/0027/1653/live/index.html?kongregate_game_version=1554392772","image":"/assets/media/icons/supplychainlogo.webp","categories":["all"]},{"name":"Taming.io","link":"https://taming.io/","image":"/assets/media/icons/tamingio.webp","categories":["all"]},{"name":"Temple of Boom","link":"https://temple-of-boom.github.io/file/","image":"/assets/media/icons/templeofboom.webp","categories":["all","2P"]},{"name":"Tanuki Sunset","link":"https://watchdocumentaries.com/wp-content/uploads/games/tanuki-sunset","image":"/assets/media/icons/tanuki.webp","categories":["all"]},{"name":"The Simpsons","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/11/the-simpsons-game.zip","image":"/assets/media/icons/the-simpsons-game.webp","categories":["all"]},{"name":"Temple Run 2","link":"https://watchdocumentaries.com/wp-content/uploads/games/temple-run-2/","image":"/assets/media/icons/temple-run-2.webp","categories":["all"]},{"name":"Twitch Tetris","link":"https://www.rossipotti.de/ausgabe28/tetris/controls.html","image":"/assets/media/icons/na.webp","categories":["all"]},{"name":"Voxiom.io","link":"https://voxiom.io/","image":"/assets/media/icons/voxiom.webp","categories":["all"]},{"name":"Zombs.io","link":"https://zombs.io/","image":"/assets/media/icons/zombs-io.webp","categories":["all"]},{"name":"Zombs Royale","link":"https://zombsroyale.io","image":"/assets/media/icons/zombs-royale.webp","categories":["all,","2P"]},{"name":"GBA Games","link":"https://real-sgs.vercel.app/Tools/GBA-Emulator","image":"/assets/media/icons/gba.webp","categories":["all"]},{"name":"Retro Bowl","link":"/e/2/retro/index.html","image":"/assets/media/icons/retro.webp","categories":["all,","sports","local"]},{"name":"Roblox (Now.GG)","link":"https://now.gg/iframe/snippet?app_pkg=com.roblox.client&partner=interstellar","image":"/assets/media/icons/roblox.webp","categories":["all","emu","android"]},{"name":"Madden NFL 24","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.maddennfl21mobile&partner=interstellar","image":"/assets/media/icons/maddennfl24.webp","categories":["all","emu","android"]},{"name":"Android","link":"https://now.gg/iframe/snippet?app_pkg=com.uncube.launcher3&partner=interstellar","image":"/assets/media/icons/android.webp","categories":["all","emu","android"]},{"name":"Genshin Impact","link":"https://now.gg/iframe/snippet?app_pkg=com.miHoYo.GenshinImpact&partner=interstellar","image":"/assets/media/icons/genshinimpact.webp","categories":["all","emu","android"]},{"name":"Fortnite (Now.GG)","link":"https://now.gg/iframe/snippet?app_pkg=com.epicgames.fortnite&partner=interstellar","image":"/assets/media/icons/fortnite.webp","categories":["all","emu","android"]},{"name":"EA SPORTS FC™ MOBILE 24 SOCCER","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.fifamobile&partner=interstellar","image":"/assets/media/icons/easports-fcmobile24.webp","categories":["all","emu","android"]},{"name":"EA SPORTS™ UFC® Mobile 2","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.easportsufc2&partner=interstellar","image":"/assets/media/icons/easports-ufc.webp","categories":["all","emu","android"]},{"name":"Melon Playground","link":"https://now.gg/iframe/snippet?app_pkg=com.studio27.MelonPlayground&partner=interstellar","image":"/assets/media/icons/melonplayground.webp","categories":["all","emu","android"]},{"name":"Solar Smash","link":"https://now.gg/iframe/snippet?app_pkg=com.paradyme.solarsmash&partner=interstellar","image":"/assets/media/icons/solarsmash.webp","categories":["all","emu","android"]},{"name":"Bloons TD Battles 2","link":"https://now.gg/iframe/snippet?app_pkg=com.ninjakiwi.bloonstdbattles2&partner=interstellar","image":"/assets/media/icons/bloonstd2.webp","categories":["all","emu","android"]},{"name":"Bloons TD Battles","link":"https://now.gg/iframe/snippet?app_pkg=com.ninjakiwi.bloonstdbattles&partner=interstellar","image":"/assets/media/icons/bloonstd.webp","categories":["all","emu","android"]},{"name":"Cookie Run Kingdom","link":"https://now.gg/iframe/snippet?app_pkg=com.devsisters.ck&partner=interstellar","image":"/assets/media/icons/cookierunkingdom.webp","categories":["all","emu","android"]},{"name":"Character AI","link":"https://now.gg/iframe/snippet?app_pkg=ai.character.app&partner=interstellar","image":"/assets/media/icons/characterai.webp","categories":["all","emu","android"]},{"name":"Aptoide","link":"https://now.gg/iframe/snippet?app_pkg=com.aptoide.partners.nowgg.store&partner=interstellar","image":"/assets/media/icons/aptoide.webp","categories":["all","emu","android"]},{"name":"Akinator","link":"https://now.gg/iframe/snippet?app_pkg=com.digidust.elokence.akinator.freemium&partner=interstellar","image":"/assets/media/icons/akinator.webp","categories":["all","emu","android"]},{"name":"WorldBox","link":"https://now.gg/iframe/snippet?app_pkg=com.mkarpenko.worldbox&partner=interstellar","image":"/assets/media/icons/worldbox.webp","categories":["all","emu","android"]},{"name":"Toca Life World","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocalifeworld&partner=interstellar","image":"/assets/media/icons/tocalifeworld.webp","categories":["all","emu","android"]},{"name":"Toca Hair Salon 4","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocahairsalon4&partner=interstellar","image":"/assets/media/icons/tocabocahairsalon4.webp","categories":["all","emu","android"]},{"name":"Toca Kitchen 2","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocakitchen2&partner=interstellar","image":"/assets/media/icons/tocakitchen2.webp","categories":["all","emu","android"]},{"name":"Free Fire","link":"https://now.gg/iframe/snippet?app_pkg=com.dts.freefireth&partner=interstellar","image":"/assets/media/icons/freefire.webp","categories":["all","emu","android"]},{"name":"Stumble Guys (Android)","link":"https://now.gg/iframe/snippet?app_pkg=com.kitkagames.fallbuddies&partner=interstellar","image":"/assets/media/icons/stumble-guys.webp","categories":["all","emu","android"]},{"name":"Now.GG","link":"https://now.gg","image":"/assets/media/icons/now-gg.webp","categories":["all","emu","android"]},{"name":"Roblox (NowGG.me) [Working]","link":"https://nowgg.me/apps/roblox-corporation/5349/roblox.html","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Now.GG (NowGG.me) [Working]","link":"https://nowgg.me","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Parappa the Rapper","link":"https://retrogamesonline.io/parappa-the-rapper.embed","image":"/assets/media/icons/ptr.webp","categories":["all","emu"]},{"name":"Half-Life","link":"https://x8bitrain.github.io/webXash/","image":"/assets/media/icons/half-life.webp","categories":["all"]},{"name":"Kiomet","link":"https://kiomet.com","image":"/assets/media/icons/kiomet.webp","categories":["all"]},{"name":"Tribals.io","link":"https://tribals.io/","image":"/assets/media/icons/tribalsio.webp","categories":["all"]},{"name":"Counter Strike 1.6","link":"https://play-cs.com/en/servers","image":"/assets/media/icons/cs16.webp","categories":["all"]},{"name":"Narrow One","link":"https://narrow.one","image":"/assets/media/icons/narrowone.webp","categories":["all"]},{"name":"Kirka","link":"https://kirka.io","image":"/assets/media/icons/kirka.webp","categories":["all"]},{"name":"Cryzen","link":"https://cryzen.io","image":"/assets/media/icons/cryzen.webp","categories":["all"]},{"name":"Hordes","link":"https://hordes.io","image":"/assets/media/icons/hordes.webp","categories":["all"]},{"name":"Venge","link":"https://venge.io","image":"/assets/media/icons/venge.webp","categories":["all"]},{"name":"Minecraft 1.5.2 (Eaglercraft)","link":"/e/2/eag15/index.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Minecraft 1.8 (Eaglercraft)","link":"/e/2/eag18/offline.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Minecraft 1.8 (Eagler WASM)","link":"/e/2/eag18/wasm.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Getaway S.","link":"https://www.twoplayergames.org/embed/getaway-shootout","image":"/assets/media/icons/getaway.webp","categories":["all","2P"]},{"name":"2048","link":"/e/1/2048/index.html","image":"/assets/media/icons/2048.webp","categories":["all","local"]},{"name":"2048 Multitasking","link":"/e/1/2048-multitask/index.html","image":"/assets/media/icons/2048.webp","categories":["all","local"]},{"name":"Vex 7","link":"/e/1/vex7/index.html","image":"/assets/media/icons/vex7.webp","categories":["all","local"]},{"name":"Vex 6","link":"/e/1/vex6/index.html","image":"/assets/media/icons/vex6.webp","categories":["all","local"]},{"name":"Vex 5","link":"/e/1/vex5/index.html","image":"/assets/media/icons/vex5.webp","categories":["all","local"]},{"name":"Vex 3","link":"/e/1/vex3/index.html","image":"/assets/media/icons/vex3.webp","categories":["all","local"]},{"name":"Vex 4","link":"/e/1/vex4/index.html","image":"/assets/media/icons/vex4.webp","categories":["all","local"]},{"name":"Windows 96","link":"https://windows96.net","image":"/assets/media/icons/windows96.webp","categories":["all"]},{"name":"The Impossible Quiz: Book 2","link":"https://f.silvergames.com/ruffle/player.php?id=3742","image":"/assets/media/icons/book2.webp","categories":["all","emu"]},{"name":"Wrassling","link":"https://games.poki.com/458768/wrassling","image":"/assets/media/icons/wrassling.webp","categories":["all"]},{"name":"Happy Wheels","link":"https://games-online.io/game/HappyWheels/","image":"/assets/media/icons/hw.webp","categories":["all"]},{"name":"Google Snake Modded","link":"https://googlesnakemods.com/v/current/","image":"/assets/media/icons/snake.webp","categories":["all"]},{"name":"Idle Startup Tycoon","link":"https://www.mortgagecalculator.org/money-games/idle-startup-tycoon/","image":"/assets/media/icons/idlestartup.webp","categories":["all"]},{"name":"Two Player Games","link":"https://www.twoplayergames.org/","image":"/assets/media/icons/tpg.webp","categories":["all"]},{"name":"Five Nights at Winston's","link":"https://g.deev.is/fnaw/","image":"/assets/media/icons/fnaw.webp","categories":["all","game"]},{"name":"Goomy Clicker 2","link":"https://idle-js-games.github.io/goomyClicker2/","image":"/assets/media/icons/gc2.webp","categories":["all"]},{"name":"Space Company","link":"/e/1/space-company/index.html","image":"/assets/media/icons/sc.png","categories":["all","local"]},{"name":"Mario Kart DS","link":"https://seraph.reveriestudios.online/games/mariokartds/index.html","image":"/assets/media/icons/mariokartds.jpg","categories":["all","emu"]},{"name":"Cooking Mama","link":"https://seraph.reveriestudios.online/games/cookingmama/index.html","image":"/assets/media/icons/cookingmama.jpg","categories":["all","emu"]},{"name":"Wordle","link":"https://www.nytimes.com/games/wordle/index.html","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Wordle Unlimited","link":"https://wordleunlimited.org/","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Wordly","link":"https://wordly.org/","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Connections","link":"https://www.nytimes.com/games/connections","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Connections Unlimited","link":"https://1games.io/game/connections-game/","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Globle","link":"https://globle.org/?","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Particle Clicker","link":"/e/1/particle-clicker/index.html","image":"/assets/media/icons/pc.png","categories":["all,","local"]},{"name":"ShipCraft.io","link":"https://shipcraft.io/","categories":["all"]},{"name":"Super Mario Bros.","link":"https://emulator-games.pages.dev/nes/Super Mario Bros.","image":"/assets/media/icons/emulator/smb.webp","categories":["all","emu"]},{"name":"Super Mario Bros. 2","link":"https://emulator-games.pages.dev/nes/Super Mario Bros. 2","image":"/assets/media/icons/emulator/smb2.webp","categories":["all","emu"]},{"name":"Super Mario Bros. 3","link":"https://emulator-games.pages.dev/nes/Super Mario Bros. 3","image":"/assets/media/icons/emulator/smb3.webp","categories":["all","emu"]}] \ No newline at end of file diff --git a/static/games.html b/static/games.html index eb91ccdb37..061095bbff 100644 --- a/static/games.html +++ b/static/games.html @@ -34,8 +34,10 @@ -
-
+
+
+
+
From 4c2aa0e8054b19ebd294184407faa88046019a8a Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 05:55:20 -0400 Subject: [PATCH 009/115] chore: formatted --- static/assets/json/apps.json | 2 +- static/assets/json/games.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/static/assets/json/apps.json b/static/assets/json/apps.json index 4db46e0d4f..fcddac2e79 100644 --- a/static/assets/json/apps.json +++ b/static/assets/json/apps.json @@ -1,5 +1,5 @@ [ - { + { "name": "Request An App", "link": "https://forms.gle/vwdHN3iPz5cLaHaMA", "image": "/assets/media/icons/request.webp", diff --git a/static/assets/json/games.json b/static/assets/json/games.json index 6f9e00eb7f..501a6084ca 100644 --- a/static/assets/json/games.json +++ b/static/assets/json/games.json @@ -1,5 +1,5 @@ [ - { + { "name": "Request A Game", "link": "https://forms.gle/vwdHN3iPz5cLaHaMA", "image": "/assets/media/icons/request.webp", From 062b9970212b37ef2ea154e3520a0d707616b5f6 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 06:40:53 -0400 Subject: [PATCH 010/115] fix(launcher): improve pin handling, fix filter conflicts, and update custom app validation --- static/assets/js/launcher.js | 90 +++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 33 deletions(-) diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index 63500fd3e5..baf9c80714 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -103,26 +103,35 @@ function saveCustomApp(customApp) { setInStorage("custom", JSON.stringify(apps)); } -function createCustomApp() { - const title = prompt("Enter title for the app:"); - const link = prompt("Enter link for the app:"); - - if (title && link) { - const customApp = { - name: `[Custom] ${title}`, - link: link, - image: "/assets/media/icons/custom.webp", - custom: false, - }; - - saveCustomApp(customApp); - - const card = renderAppCard(customApp, 0, true); - const pinnedContainer = document.querySelector(".pinned"); - pinnedContainer.appendChild(card); +function promptRequired(message) { + while (true) { + const value = prompt(message); + if (value === null) return null; + if (value.trim() !== "") return value.trim(); + alert("This field is required. Please enter a value."); } } +function createCustomApp() { + const title = promptRequired("Enter title for the app:"); + if (!title) return; + + const link = promptRequired("Enter link for the app:"); + if (!link) return; + const customApp = { + name: `[Custom] ${title}`, + link: link, + image: "/assets/media/icons/custom.webp", + custom: false, + }; + + saveCustomApp(customApp); + + const card = renderAppCard(customApp, 0, true); + const pinnedContainer = document.querySelector(".pinned"); + pinnedContainer.appendChild(card); +} + function getPinnedApps() { const pins = getFromStorage("pinned") || ""; return pins ? pins.split(",").map(Number) : []; @@ -136,14 +145,29 @@ function togglePin(appIndex) { let pins = getPinnedApps(); const pinIndex = pins.indexOf(appIndex); - if (pinIndex !== -1) { + const isCurrentlyPinned = pinIndex !== -1; + + if (isCurrentlyPinned) { pins.splice(pinIndex, 1); } else { pins.push(appIndex); } savePinnedApps(pins); - location.reload(); + + const card = document.querySelector(`.column[data-app-index="${appIndex}"]`); + if (card) { + const pinnedContainer = document.querySelector(".pinned"); + const nonPinnedContainer = document.querySelector(".apps"); + if (isCurrentlyPinned) { + const unpinnedCards = Array.from(nonPinnedContainer.getElementsByClassName("column")); + const cardName = card.getElementsByTagName("p")[0].textContent.toLowerCase(); + const insertBefore = unpinnedCards.find(c => c.getElementsByTagName("p")[0].textContent.toLowerCase() > cardName); + nonPinnedContainer.insertBefore(card, insertBefore ?? null); + } else { + pinnedContainer.appendChild(card); + } + } } function isAppPinned(appIndex, pinnedList) { @@ -179,6 +203,7 @@ function renderAppCard(app, appIndex, isCustom = false) { const categories = isCustom ? "all" : (app.categories || []).join(" "); columnDiv.setAttribute("data-category", categories); + columnDiv.setAttribute("data-app-index", appIndex); const link = document.createElement("a"); link.onclick = () => handleAppClick(app); @@ -313,28 +338,27 @@ function loadCustomAppsInline() { } } -function filterByCategory() { +function applyFilters() { + const searchTerm = (document.getElementById("search")?.value ?? "").toLowerCase(); const selectedCategories = Array.from(document.querySelectorAll("#category option:checked")).map(option => option.value); - const appCards = document.getElementsByClassName("column"); - - Array.from(appCards).forEach(card => { + Array.from(document.getElementsByClassName("column")).forEach(card => { + const appName = card.getElementsByTagName("p")[0].textContent.toLowerCase(); const categories = card.getAttribute("data-category").split(" "); - const shouldShow = selectedCategories.length === 0 || selectedCategories.some(cat => categories.includes(cat)); - card.style.display = shouldShow ? "block" : "none"; + const matchesSearch = !searchTerm || appName.includes(searchTerm); + const matchesCategory = selectedCategories.length === 0 || selectedCategories.some(cat => categories.includes(cat)); + + card.style.display = matchesSearch && matchesCategory ? "block" : "none"; }); } -function filterBySearchTerm() { - const input = document.getElementById("search"); - const searchTerm = input.value.toLowerCase(); - const appCards = document.getElementsByClassName("column"); +function filterByCategory() { + applyFilters(); +} - Array.from(appCards).forEach(card => { - const appName = card.getElementsByTagName("p")[0].textContent.toLowerCase(); - card.style.display = appName.includes(searchTerm) ? "block" : "none"; - }); +function filterBySearchTerm() { + applyFilters(); } window.category = filterByCategory; From f1fb287152b65504fb415cc74ffbe9e8f544737e Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 06:47:56 -0400 Subject: [PATCH 011/115] refactor: rename files for easier navigation --- static/assets/js/sj-tp.js | 6 +++--- .../assets/scramjet/{sj.all.js => scramjet.all.js} | 0 .../scramjet/{sj.sync.js => scramjet.sync.js} | 0 .../assets/scramjet/{sj.wasm.wasm => scramjet.wasm} | Bin static/index.html | 2 +- static/settings.html | 2 +- static/sw.js | 2 +- static/tabs.html | 2 +- 8 files changed, 7 insertions(+), 7 deletions(-) rename static/assets/scramjet/{sj.all.js => scramjet.all.js} (100%) rename static/assets/scramjet/{sj.sync.js => scramjet.sync.js} (100%) rename static/assets/scramjet/{sj.wasm.wasm => scramjet.wasm} (100%) diff --git a/static/assets/js/sj-tp.js b/static/assets/js/sj-tp.js index 6a33f80d7f..b9cdd452ef 100644 --- a/static/assets/js/sj-tp.js +++ b/static/assets/js/sj-tp.js @@ -8,9 +8,9 @@ const sjConfig = { prefix: "/uv/scramjet/", files: { - wasm: "/assets/scramjet/sj.wasm.wasm", - all: "/assets/scramjet/sj.all.js", - sync: "/assets/scramjet/sj.sync.js", + wasm: "/assets/scramjet/scramjet.wasm", + all: "/assets/scramjet/scramjet.all.js", + sync: "/assets/scramjet/scramjet.sync.js", }, flags: { rewriterLogs: false, diff --git a/static/assets/scramjet/sj.all.js b/static/assets/scramjet/scramjet.all.js similarity index 100% rename from static/assets/scramjet/sj.all.js rename to static/assets/scramjet/scramjet.all.js diff --git a/static/assets/scramjet/sj.sync.js b/static/assets/scramjet/scramjet.sync.js similarity index 100% rename from static/assets/scramjet/sj.sync.js rename to static/assets/scramjet/scramjet.sync.js diff --git a/static/assets/scramjet/sj.wasm.wasm b/static/assets/scramjet/scramjet.wasm similarity index 100% rename from static/assets/scramjet/sj.wasm.wasm rename to static/assets/scramjet/scramjet.wasm diff --git a/static/index.html b/static/index.html index f6868d54a3..e9927006fe 100644 --- a/static/index.html +++ b/static/index.html @@ -35,7 +35,7 @@

Interstell - + diff --git a/static/settings.html b/static/settings.html index e7bacbab76..f567ad4d8e 100644 --- a/static/settings.html +++ b/static/settings.html @@ -242,7 +242,7 @@

Information

}); }); - + diff --git a/static/sw.js b/static/sw.js index e65f88661b..00feffea31 100644 --- a/static/sw.js +++ b/static/sw.js @@ -3,7 +3,7 @@ importScripts("/assets/dynamic/worker.js"); importScripts("/assets/ultraviolet/bundle.js"); importScripts("/assets/ultraviolet/config.js"); importScripts(__uv$config.sw || "/assets/ultraviolet/sw.js"); -importScripts("/assets/scramjet/sj.all.js"); +importScripts("/assets/scramjet/scramjet.all.js"); const { ScramjetServiceWorker } = $scramjetLoadWorker(); const uv = new UVServiceWorker(); diff --git a/static/tabs.html b/static/tabs.html index 00052e3db8..7ba2514696 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -63,7 +63,7 @@ - + From 9ee3a9aa1aabe5dd49a0b48dd09170e298c3f827 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 06:58:56 -0400 Subject: [PATCH 012/115] refactor: drop masqr support and remove unused scramjet import from settings --- Masqr.js | 78 -------------------------------------------- biome.json | 2 +- index.js | 6 ---- static/settings.html | 1 - 4 files changed, 1 insertion(+), 86 deletions(-) delete mode 100644 Masqr.js diff --git a/Masqr.js b/Masqr.js deleted file mode 100644 index 7018e1de8b..0000000000 --- a/Masqr.js +++ /dev/null @@ -1,78 +0,0 @@ -import fs from "node:fs" -import path from "node:path" -import fetch from "node-fetch" - -const LICENSE_SERVER_URL = "https://masqr.gointerstellar.app/validate?license=" -const Fail = fs.readFileSync("Failed.html", "utf8") - -export function setupMasqr(app) { - app.use(async (req, res, next) => { - if (req.url.includes("/bare/")) { - next() - return - } - - const authheader = req.headers.authorization - - if (req.cookies["authcheck"]) { - next() - return - } - - if (req.cookies["refreshcheck"] !== "true") { - res.cookie("refreshcheck", "true", { maxAge: 10000 }) - MasqFail(req, res) - return - } - - if (!authheader) { - res.setHeader("WWW-Authenticate", "Basic") - res.status(401) - MasqFail(req, res) - return - } - - const auth = Buffer.from(authheader.split(" ")[1], "base64").toString().split(":") - const pass = auth[1] - - try { - const licenseCheckResponse = await fetch( - LICENSE_SERVER_URL + pass + "&host=" + req.headers.host - ) - const licenseCheck = (await licenseCheckResponse.json())["status"] - console.log( - LICENSE_SERVER_URL + pass + "&host=" + req.headers.host + " returned " + licenseCheck - ) - if (licenseCheck === "License valid") { - res.cookie("authcheck", "true", { - expires: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000), - }) - res.send("") - return - } - - MasqFail(req, res) - } catch (error) { - console.error(error) - MasqFail(req, res) - } - }) -} - -async function MasqFail(req, res) { - if (!req.headers.host) { - return - } - const unsafeSuffix = req.headers.host + ".html" - const safeSuffix = path.normalize(unsafeSuffix).replace(/^(\.\.(\/|\\|$))+/, "") - const safeJoin = path.join(process.cwd() + "/Masqrd", safeSuffix) - try { - await fs.promises.access(safeJoin) - const FailLocal = await fs.promises.readFile(safeJoin, "utf8") - res.setHeader("Content-Type", "text/html") - res.send(FailLocal) - } catch (e) { - res.setHeader("Content-Type", "text/html") - res.send(Fail) - } -} diff --git a/biome.json b/biome.json index c52749276b..edc13c1dfa 100644 --- a/biome.json +++ b/biome.json @@ -1,7 +1,7 @@ { "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", "files": { - "includes": ["**", "!**/static/assets/dynamic", "!**/static/assets/ultraviolet", "!**/static/assets/scramjet", "!**/static/assets/json/**/*.min.json", "!**/Masqr.js", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb", "!**/Failed.html"] + "includes": ["**", "!**/static/assets/dynamic", "!**/static/assets/ultraviolet", "!**/static/assets/scramjet", "!**/static/assets/json/**/*.min.json", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb", "!**/Failed.html"] }, "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { diff --git a/index.js b/index.js index e6b27dd4ca..695cae53a3 100644 --- a/index.js +++ b/index.js @@ -11,7 +11,6 @@ import express from "express"; import basicAuth from "express-basic-auth"; import mime from "mime"; import fetch from "node-fetch"; -// import { setupMasqr } from "./Masqr.js"; import config from "./config.js"; console.log(chalk.yellow("🚀 Starting server...")); @@ -92,11 +91,6 @@ app.use(cookieParser()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); -/* if (process.env.MASQR === "true") { - console.log(chalk.green("Masqr is enabled")); - setupMasqr(app); -} */ - const transportStaticOptions = { setHeaders: (res, filePath) => { const ext = path.extname(filePath); diff --git a/static/settings.html b/static/settings.html index f567ad4d8e..5a0f06f5a7 100644 --- a/static/settings.html +++ b/static/settings.html @@ -242,7 +242,6 @@

Information

}); }); - From 98d40572b7ba892de29ee7811632d5b11dc36b98 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 29 Apr 2026 07:01:51 -0400 Subject: [PATCH 013/115] chore: removed leftover masqr file --- Failed.html | 32 -------------------------------- biome.json | 2 +- 2 files changed, 1 insertion(+), 33 deletions(-) delete mode 100644 Failed.html diff --git a/Failed.html b/Failed.html deleted file mode 100644 index b2a511a512..0000000000 --- a/Failed.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - Welcome to nginx! - - - -

Welcome to nginx!

-

- If you see this page, the nginx web server is successfully installed and working. Further - configuration is required. -

- -

- For online documentation and support please refer to - nginx.org.
- Commercial support is available at - nginx.com. -

- -

Thank you for using nginx.

- - diff --git a/biome.json b/biome.json index edc13c1dfa..036e7450d7 100644 --- a/biome.json +++ b/biome.json @@ -1,7 +1,7 @@ { "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", "files": { - "includes": ["**", "!**/static/assets/dynamic", "!**/static/assets/ultraviolet", "!**/static/assets/scramjet", "!**/static/assets/json/**/*.min.json", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb", "!**/Failed.html"] + "includes": ["**", "!**/static/assets/dynamic", "!**/static/assets/ultraviolet", "!**/static/assets/scramjet", "!**/static/assets/json/**/*.min.json", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb"] }, "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { From e9e31b909ce36e84bea1c60dd7ae90c69ad7e2d9 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Thu, 30 Apr 2026 09:03:16 -0400 Subject: [PATCH 014/115] refactor: improve naming, simplify logic, and fix theme handling bugs --- static/assets/js/main.js | 59 +++++++++++++++------------------------- 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 467e632f4f..f57234fb20 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -1,12 +1,12 @@ -let qp; +let isInTabMode; try { - qp = window.top.location.pathname === "/tabs"; + isInTabMode = window.top.location.pathname === "/tabs"; } catch { try { - qp = window.parent.location.pathname === "/tabs"; + isInTabMode = window.parent.location.pathname === "/tabs"; } catch { - qp = false; + isInTabMode = false; } } @@ -35,7 +35,7 @@ document.addEventListener("DOMContentLoaded", () => {
Games Apps - ${qp ? "" : 'Tabs'} + ${isInTabMode ? "" : 'Tabs'} Setting
`; nav.innerHTML = html; @@ -43,8 +43,6 @@ document.addEventListener("DOMContentLoaded", () => { // Theme Logic const themeid = localStorage.getItem("theme"); - const themeEle = document.createElement("link"); - themeEle.rel = "stylesheet"; const themes = { catppuccinMocha: "/assets/css/themes/catppuccin/mocha.css", catppuccinMacchiato: "/assets/css/themes/catppuccin/macchiato.css", @@ -55,12 +53,17 @@ document.addEventListener("DOMContentLoaded", () => { }; if (themes[themeid]) { - themeEle.href = themes[themeid]; - document.body.appendChild(themeEle); + const themeLink = document.createElement("link"); + themeLink.rel = "stylesheet"; + themeLink.href = themes[themeid]; + document.body.appendChild(themeLink); } else { - const customThemeEle = document.createElement("style"); - customThemeEle.textContent = localStorage.getItem(`theme-${themeid}`); - document.head.appendChild(customThemeEle); + const customThemeCss = localStorage.getItem(`theme-${themeid}`); + if (customThemeCss) { + const customThemeStyle = document.createElement("style"); + customThemeStyle.textContent = customThemeCss; + document.head.appendChild(customThemeStyle); + } } // Favicon and Name Logic @@ -69,27 +72,11 @@ document.addEventListener("DOMContentLoaded", () => { const selectedValue = localStorage.getItem("selectedOption"); function setCloak(nameValue, iconUrl) { - const customName = localStorage.getItem("CustomName"); - const customIcon = localStorage.getItem("CustomIcon"); - - let FinalNameValue = nameValue; - let finalIconUrl = iconUrl; - - if (customName) { - FinalNameValue = customName; - } - if (customIcon) { - finalIconUrl = customIcon; - } + const finalName = localStorage.getItem("CustomName") || nameValue; + const finalIcon = localStorage.getItem("CustomIcon") || iconUrl; - if (finalIconUrl) { - icon.setAttribute("href", finalIconUrl); - localStorage.setItem("icon", finalIconUrl); - } - if (FinalNameValue) { - name.textContent = FinalNameValue; - localStorage.setItem("name", FinalNameValue); - } + if (finalIcon) icon.setAttribute("href", finalIcon); + if (finalName) name.textContent = finalName; } const options = { @@ -296,10 +283,8 @@ document.addEventListener("DOMContentLoaded", () => { document.addEventListener("keydown", event => { pressedKeys.push(event.key); - if (pressedKeys.length > eventKey.length) { - pressedKeys.shift(); - } - if (eventKey.every((key, index) => key === pressedKeys[index])) { + const recentKeys = pressedKeys.slice(-eventKey.length); + if (recentKeys.length === eventKey.length && eventKey.every((key, i) => key === recentKeys[i])) { window.location.href = pLink; pressedKeys = []; } @@ -310,4 +295,4 @@ document.addEventListener("DOMContentLoaded", () => { if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } -}); +}); \ No newline at end of file From 17776a7a5802e407849dbf6c502a23825b0db1f4 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Thu, 30 Apr 2026 09:08:34 -0400 Subject: [PATCH 015/115] fix(settings): fix cloaks not applying and refactor related logic --- static/assets/js/settings.js | 438 +++++++++++++++-------------------- 1 file changed, 183 insertions(+), 255 deletions(-) diff --git a/static/assets/js/settings.js b/static/assets/js/settings.js index 9d0032a849..f171461a92 100644 --- a/static/assets/js/settings.js +++ b/static/assets/js/settings.js @@ -1,92 +1,36 @@ -document.addEventListener("DOMContentLoaded", () => { - function adChange(selectedValue) { - if (selectedValue === "default") { - localStorage.setItem("ads", "on"); - } else if (selectedValue === "popups") { - localStorage.setItem("ads", "popups"); - } else if (selectedValue === "off") { - localStorage.setItem("ads", "off"); - } - } - - const adTypeElement = document.getElementById("adType"); - - if (adTypeElement) { - adTypeElement.addEventListener("change", function () { - const selectedOption = this.value; - adChange(selectedOption); - }); - - const storedAd = localStorage.getItem("ads"); - if (storedAd === "on") { - adTypeElement.value = "default"; - } else if (storedAd === "popups") { - adTypeElement.value = "popups"; - } else if (storedAd === "off") { - adTypeElement.value = "off"; - } else { - adTypeElement.value = "default"; - } - } - // Makes the custom icon and name persistent - const iconElement = document.getElementById("icon"); - const nameElement = document.getElementById("name"); - const customIcon = localStorage.getItem("CustomIcon"); - const customName = localStorage.getItem("CustomName"); - iconElement.value = customIcon; - nameElement.value = customName; - - if (localStorage.getItem("ab") === "true") { - document.getElementById("ab-settings-switch").checked = true; - } -}); - -// Dyn -document.addEventListener("DOMContentLoaded", () => { - function pChange(selectedValue) { - localStorage.setItem("pchoice", selectedValue); - } +const adTypeElement = document.getElementById("adType"); +if (adTypeElement) { + adTypeElement.addEventListener("change", function () { + localStorage.setItem("ads", this.value === "default" ? "on" : this.value); + }); - const pChangeElement = document.getElementById("pChange"); + const storedAd = localStorage.getItem("ads"); + adTypeElement.value = storedAd === "popups" || storedAd === "off" ? storedAd : "default"; +} - if (pChangeElement) { - pChangeElement.addEventListener("change", function () { - const selectedOption = this.value; - pChange(selectedOption); - }); +const pChangeElement = document.getElementById("pChange"); +if (pChangeElement) { + pChangeElement.addEventListener("change", function () { + localStorage.setItem("pchoice", this.value); + }); - const choice = localStorage.getItem("pchoice") || "sj"; - if (choice === "sj") { - pChangeElement.value = "sj"; - } else if (choice === "dy") { - pChangeElement.value = "dy"; - } else { - pChangeElement.value = "uv"; - } - } -}); + pChangeElement.value = localStorage.getItem("pchoice") || "sj"; +} -// Key let eventKey = localStorage.getItem("eventKey") || "`"; let eventKeyRaw = localStorage.getItem("eventKeyRaw") || "`"; let pLink = localStorage.getItem("pLink") || "https://classroom.google.com/"; -document.addEventListener("DOMContentLoaded", () => { - document.getElementById("eventKeyInput").value = eventKeyRaw; - document.getElementById("linkInput").value = pLink; +const eventKeyInput = document.getElementById("eventKeyInput"); +const linkInput = document.getElementById("linkInput"); - const selectedOption = localStorage.getItem("selectedOption"); - if (selectedOption) { - updateHeadSection(selectedOption); - } -}); +eventKeyInput.value = eventKeyRaw; +linkInput.value = pLink; -const eventKeyInput = document.getElementById("eventKeyInput"); eventKeyInput.addEventListener("input", () => { eventKey = eventKeyInput.value.split(","); }); -const linkInput = document.getElementById("linkInput"); linkInput.addEventListener("input", () => { pLink = linkInput.value; }); @@ -100,57 +44,121 @@ function saveEventKey() { // biome-ignore lint: idk window.location = window.location; } -const dropdown = document.getElementById("dropdown"); -const options = dropdown.getElementsByTagName("option"); -const sortedOptions = Array.from(options).sort((a, b) => a.textContent.localeCompare(b.textContent)); +const cloakDropdown = document.getElementById("dropdown"); +const sortedOptions = Array.from(cloakDropdown.getElementsByTagName("option")).sort((a, b) => + a.textContent.localeCompare(b.textContent) +); +while (cloakDropdown.firstChild) cloakDropdown.removeChild(cloakDropdown.firstChild); +for (const option of sortedOptions) cloakDropdown.appendChild(option); + +cloakDropdown.value = localStorage.getItem("selectedOption") || "Default"; + +const cloakOptions = { + Google: { name: "Google", icon: "/assets/media/favicon/google.png" }, + "Savvas Realize": { name: "Savvas Realize", icon: "/assets/media/favicon/savvas-realize.png" }, + SmartPass: { name: "SmartPass", icon: "/assets/media/favicon/smartpass.png" }, + "World Book Online - Super Home": { name: "Super Home Page", icon: "/assets/media/favicon/wbo.ico" }, + "World Book Online - Student": { name: "WBO Student | Home Page", icon: "/assets/media/favicon/wbo.ico" }, + "World Book Online - Timelines": { name: "Timelines - Home Page", icon: "/assets/media/favicon/wbo.ico" }, + Naviance: { name: "Naviance Student", icon: "/assets/media/favicon/naviance.png" }, + "PBS Learning Media": { name: "PBS LearningMedia | Teaching Resources For Students And Teachers", icon: "/assets/media/favicon/pbslearningmedia.ico" }, + "PBS Learning Media Student Home": { name: "Student Homepage | PBS LearningMedia", icon: "/assets/media/favicon/pbslearningmedia.ico" }, + Drive: { name: "My Drive - Google Drive", icon: "/assets/media/favicon/drive.png" }, + Classroom: { name: "Home", icon: "/assets/media/favicon/classroom.png" }, + Schoology: { name: "Home | Schoology", icon: "/assets/media/favicon/schoology.png" }, + Gmail: { name: "Gmail", icon: "/assets/media/favicon/gmail.png" }, + Clever: { name: "Clever | Portal", icon: "/assets/media/favicon/clever.png" }, + Khan: { name: "Dashboard | Khan Academy", icon: "/assets/media/favicon/khan.png" }, + Dictionary: { name: "Dictionary.com | Meanings & Definitions of English Words", icon: "/assets/media/favicon/dictionary.png" }, + Thesaurus: { name: "Synonyms and Antonyms of Words | Thesaurus.com", icon: "/assets/media/favicon/thesaurus.png" }, + Campus: { name: "Infinite Campus", icon: "/assets/media/favicon/campus.png" }, + IXL: { name: "IXL | Dashboard", icon: "/assets/media/favicon/ixl.png" }, + Canvas: { name: "Dashboard", icon: "/assets/media/favicon/canvas.png" }, + CodeHS: { name: "Sandbox | CodeHS", icon: "/assets/media/favicon/codehs.png" }, + LinkIt: { name: "Test Taker", icon: "/assets/media/favicon/linkit.ico" }, + Edpuzzle: { name: "Edpuzzle", icon: "/assets/media/favicon/edpuzzle.png" }, + "i-Ready Math": { name: "Math To Do, i-Ready", icon: "/assets/media/favicon/i-ready.ico" }, + "i-Ready Reading": { name: "Reading To Do, i-Ready", icon: "/assets/media/favicon/i-ready.ico" }, + "ClassLink Login": { name: "Login", icon: "/assets/media/favicon/classlink-login.png" }, + "Google Meet": { name: "Google Meet", icon: "/assets/media/favicon/google-meet.png" }, + "Google Docs": { name: "Google Docs", icon: "/assets/media/favicon/google-docs.ico" }, + "Google Slides": { name: "Google Slides", icon: "/assets/media/favicon/google-slides.ico" }, + Wikipedia: { name: "Wikipedia", icon: "/assets/media/favicon/wikipedia.png" }, + Britannica: { name: "Encyclopedia Britannica | Britannica", icon: "/assets/media/favicon/britannica.png" }, + Ducksters: { name: "Ducksters", icon: "/assets/media/favicon/ducksters.png" }, + Minga: { name: "Minga – Creating Amazing Schools", icon: "/assets/media/favicon/minga.png" }, + "i-Ready Learning Games": { name: "Learning Games, i-Ready", icon: "/assets/media/favicon/i-ready.ico" }, + "NoRedInk Home": { name: "Student Home | NoRedInk", icon: "/assets/media/favicon/noredink.png" }, + Desmos: { name: "Desmos | Graphing Calculator", icon: "/assets/media/favicon/desmos.ico" }, + "Newsela Binder": { name: "Newsela | Binder", icon: "/assets/media/favicon/newsela.png" }, + "Newsela Assignments": { name: "Newsela | Assignments", icon: "/assets/media/favicon/newsela.png" }, + "Newsela Home": { name: "Newsela | Instructional Content Platform", icon: "/assets/media/favicon/newsela.png" }, + "PowerSchool Sign In": { name: "Student and Parent Sign In", icon: "/assets/media/favicon/powerschool.png" }, + "PowerSchool Grades and Attendance": { name: "Grades and Attendance", icon: "/assets/media/favicon/powerschool.png" }, + "PowerSchool Teacher Comments": { name: "Teacher Comments", icon: "/assets/media/favicon/powerschool.png" }, + "PowerSchool Standards Grades": { name: "Standards Grades", icon: "/assets/media/favicon/powerschool.png" }, + "PowerSchool Attendance": { name: "Attendance", icon: "/assets/media/favicon/powerschool.png" }, + Nearpod: { name: "Nearpod", icon: "/assets/media/favicon/nearpod.png" }, + StudentVUE: { name: "StudentVUE", icon: "/assets/media/favicon/studentvue.ico" }, + "Quizlet Home": { name: "Flashcards, learning tools and textbook solutions | Quizlet", icon: "/assets/media/favicon/quizlet.webp" }, + "Google Forms Locked Mode": { name: "Start your quiz", icon: "/assets/media/favicon/googleforms.png" }, + DeltaMath: { name: "DeltaMath", icon: "/assets/media/favicon/deltamath.png" }, + Kami: { name: "Kami", icon: "/assets/media/favicon/kami.png" }, + "GoGuardian Admin Restricted": { name: "Restricted", icon: "/assets/media/favicon/goguardian-lock.png" }, + "GoGuardian Teacher Block": { name: "Uh oh!", icon: "/assets/media/favicon/goguardian.png" }, + "World History Encyclopedia": { name: "World History Encyclopedia", icon: "/assets/media/favicon/worldhistoryencyclopedia.png" }, + "Big Ideas Math Assignment Player": { name: "Assignment Player", icon: "/assets/media/favicon/bim.ico" }, + "Big Ideas Math": { name: "Big Ideas Math", icon: "/assets/media/favicon/bim.ico" }, +}; -while (dropdown.firstChild) { - dropdown.removeChild(dropdown.firstChild); -} +function handleDropdownChange(selectElement) { + const selectedValue = selectElement.value; + const preset = cloakOptions[selectedValue]; -for (const option of sortedOptions) { - dropdown.appendChild(option); -} + localStorage.removeItem("CustomName"); + localStorage.removeItem("CustomIcon"); + localStorage.setItem("selectedOption", selectedValue); -function saveIcon() { - const iconElement = document.getElementById("icon"); - const iconValue = iconElement.value; - console.log("saveIcon function called with icon value:", iconValue); - localStorage.setItem("icon", iconValue); -} + if (preset) { + localStorage.setItem("name", preset.name); + localStorage.setItem("icon", preset.icon); -function saveName() { - const nameElement = document.getElementById("name"); - const nameValue = nameElement.value; - console.log("saveName function called with name value:", nameValue); - localStorage.setItem("name", nameValue); + document.getElementById("t").textContent = preset.name; + document.getElementById("tab-favicon").setAttribute("href", preset.icon); + } + + redirectToMainDomain(); } -function CustomIcon() { - const iconElement = document.getElementById("icon"); - const iconValue = iconElement.value; - console.log("saveIcon function called with icon value:", iconValue); - localStorage.setItem("CustomIcon", iconValue); +function saveCustomIcon() { + const value = document.getElementById("icon").value; + localStorage.setItem("CustomIcon", value); + localStorage.setItem("icon", value); } -function CustomName() { - const nameElement = document.getElementById("name"); - const nameValue = nameElement.value; - console.log("saveName function called with name value:", nameValue); - localStorage.setItem("CustomName", nameValue); +function saveCustomName() { + const value = document.getElementById("name").value; + localStorage.setItem("CustomName", value); + localStorage.setItem("name", value); } -function ResetCustomCloak() { + +function resetCustomCloak() { localStorage.removeItem("CustomName"); localStorage.removeItem("CustomIcon"); document.getElementById("icon").value = ""; document.getElementById("name").value = ""; } +document.getElementById("icon").value = localStorage.getItem("CustomIcon") || ""; +document.getElementById("name").value = localStorage.getItem("CustomName") || ""; + +if (localStorage.getItem("ab") === "true") { + document.getElementById("ab-settings-switch").checked = true; +} + function redirectToMainDomain() { - const currentUrl = window.location.href; - const mainDomainUrl = currentUrl.replace(/\/[^/]*$/, ""); - const target = mainDomainUrl + window.location.pathname; + const target = window.location.origin + window.location.pathname; if (window !== top) { try { top.location.href = target; @@ -161,88 +169,37 @@ function redirectToMainDomain() { window.location.href = target; } } - } else window.location.href = mainDomainUrl + window.location.pathname; -} - -document.addEventListener("DOMContentLoaded", event => { - const icon = document.getElementById("tab-favicon"); - const name = document.getElementById("t"); - const selectedValue = localStorage.getItem("selectedOption") || "Default"; - document.getElementById("dropdown").value = selectedValue; - updateHeadSection(selectedValue); -}); - -function handleDropdownChange(selectElement) { - const selectedValue = selectElement.value; - localStorage.removeItem("CustomName"); - localStorage.removeItem("CustomIcon"); - localStorage.setItem("selectedOption", selectedValue); - updateHeadSection(selectedValue); - redirectToMainDomain(selectedValue); -} - -function updateHeadSection(selectedValue) { - const icon = document.getElementById("tab-favicon"); - const name = document.getElementById("t"); - const customName = localStorage.getItem("CustomName"); - const customIcon = localStorage.getItem("CustomIcon"); - - if (customName && customIcon) { - name.textContent = customName; - icon.setAttribute("href", customIcon); - localStorage.setItem("name", customName); - localStorage.setItem("icon", customIcon); + } else { + window.location.href = target; } } -// Custom Background -document.addEventListener("DOMContentLoaded", () => { - const saveButton = document.getElementById("save-button"); - const backgroundInput = document.getElementById("background-input"); - const resetButton = document.getElementById("reset-button"); - - saveButton.addEventListener("click", () => { - const imageURL = backgroundInput.value; - if (imageURL.trim() !== "") { - localStorage.setItem("backgroundImage", imageURL); - document.body.style.backgroundImage = `url('${imageURL}')`; - backgroundInput.value = ""; - } else { - console.log("No image URL entered."); - } - }); - resetButton.addEventListener("click", () => { - localStorage.removeItem("backgroundImage"); - document.body.style.backgroundImage = "url('default-background.jpg')"; - window.location.reload(); - }); +document.getElementById("save-button").addEventListener("click", () => { + const imageURL = document.getElementById("background-input").value.trim(); + if (imageURL) { + localStorage.setItem("backgroundImage", imageURL); + document.body.style.backgroundImage = `url('${imageURL}')`; + document.getElementById("background-input").value = ""; + } }); -// Particles -const switches = document.getElementById("2"); - -if (window.localStorage.getItem("particles") !== "") { - if (window.localStorage.getItem("particles") === "true") { - switches.checked = true; - } else { - switches.checked = false; - } -} +document.getElementById("reset-button").addEventListener("click", () => { + localStorage.removeItem("backgroundImage"); + document.body.style.backgroundImage = "url('default-background.jpg')"; + window.location.reload(); +}); -switches.addEventListener("change", event => { - if (event.currentTarget.checked) { - window.localStorage.setItem("particles", "true"); - } else { - window.localStorage.setItem("particles", "false"); - } +const particlesSwitch = document.getElementById("2"); +particlesSwitch.checked = localStorage.getItem("particles") === "true"; +particlesSwitch.addEventListener("change", event => { + localStorage.setItem("particles", event.currentTarget.checked ? "true" : "false"); }); -// AB Cloak + function AB() { let inFrame; - try { inFrame = window !== top; - } catch (e) { + } catch { inFrame = true; } @@ -253,7 +210,6 @@ function AB() { } else { const doc = popup.document; const iframe = doc.createElement("iframe"); - const style = iframe.style; const link = doc.createElement("link"); const name = localStorage.getItem("name") || "My Drive - Google Drive"; @@ -264,13 +220,14 @@ function AB() { link.href = icon; iframe.src = location.href; + const style = iframe.style; style.position = "fixed"; style.top = style.bottom = style.left = style.right = 0; style.border = style.outline = "none"; style.width = style.height = "100%"; - const pLink = localStorage.getItem(encodeURI("pLink")) || getRandomURL(); - location.replace(pLink); + const panicLink = localStorage.getItem("pLink") || getRandomURL(); + location.replace(panicLink); const script = doc.createElement("script"); script.textContent = ` @@ -288,19 +245,11 @@ function AB() { } function toggleAB() { - ab = localStorage.getItem("ab"); - if (!ab) { - localStorage.setItem("ab", "true"); - } else if (ab === "true") { - localStorage.setItem("ab", "false"); - } else { - localStorage.setItem("ab", "true"); - } + const ab = localStorage.getItem("ab"); + localStorage.setItem("ab", ab === "true" ? "false" : "true"); } -// Search Engine -function EngineChange(dropdown) { - const selectedEngine = dropdown.value; +function changeEngine(dropdown) { const engineUrls = { Brave: "https://search.brave.com/search?q=", Google: "https://www.google.com/search?q=", @@ -311,15 +260,14 @@ function EngineChange(dropdown) { Ecosia: "https://www.ecosia.org/search?q=", }; - localStorage.setItem("engine", engineUrls[selectedEngine]); - localStorage.setItem("enginename", selectedEngine); - - dropdown.value = selectedEngine; + const selected = dropdown.value; + localStorage.setItem("engine", engineUrls[selected]); + localStorage.setItem("enginename", selected); } -function SaveEngine() { - const customEngine = document.getElementById("engine-form").value; - if (customEngine.trim() !== "") { +function saveCustomEngine() { + const customEngine = document.getElementById("engine-form").value.trim(); + if (customEngine) { localStorage.setItem("engine", customEngine); localStorage.setItem("enginename", "Custom"); } else { @@ -327,62 +275,23 @@ function SaveEngine() { } } -document.addEventListener("DOMContentLoaded", () => { - const selectedEngineName = localStorage.getItem("enginename"); - const dropdown = document.getElementById("engine"); - if (selectedEngineName) { - dropdown.value = selectedEngineName; - } -}); - -function getRandomURL() { - const randomURLS = [ - "https://kahoot.it", - "https://classroom.google.com", - "https://drive.google.com", - "https://google.com", - "https://docs.google.com", - "https://slides.google.com", - "https://www.nasa.gov", - "https://blooket.com", - "https://clever.com", - "https://edpuzzle.com", - "https://khanacademy.org", - "https://wikipedia.org", - "https://dictionary.com", - ]; - return randomURLS[randRange(0, randomURLS.length)]; -} - -function randRange(min, max) { - return Math.floor(Math.random() * (max - min) + min); -} +const engineDropdown = document.getElementById("engine"); +const savedEngineName = localStorage.getItem("enginename"); +if (savedEngineName) engineDropdown.value = savedEngineName; function exportSaveData() { - function getCookies() { - const cookies = document.cookie.split("; "); - const cookieObj = {}; - cookies.forEach(cookie => { - const [name, value] = cookie.split("="); - cookieObj[name] = value; - }); - return cookieObj; - } - function getLocalStorage() { - const localStorageObj = {}; - for (const key in localStorage) { - if (Object.hasOwn(localStorage, key)) { - localStorageObj[key] = localStorage.getItem(key); - } - } - return localStorageObj; - } - const data = { - cookies: getCookies(), - localStorage: getLocalStorage(), - }; - const dataStr = JSON.stringify(data, null, 2); - const blob = new Blob([dataStr], { type: "application/json" }); + const cookies = Object.fromEntries( + document.cookie.split("; ").map(c => c.split("=")) + ); + const localStorageData = Object.fromEntries( + Object.keys(localStorage) + .filter(k => Object.hasOwn(localStorage, k)) + .map(k => [k, localStorage.getItem(k)]) + ); + + const blob = new Blob([JSON.stringify({ cookies, localStorage: localStorageData }, null, 2)], { + type: "application/json", + }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; @@ -427,3 +336,22 @@ function importSaveData() { }; input.click(); } + +function getRandomURL() { + const urls = [ + "https://kahoot.it", + "https://classroom.google.com", + "https://drive.google.com", + "https://google.com", + "https://docs.google.com", + "https://slides.google.com", + "https://www.nasa.gov", + "https://blooket.com", + "https://clever.com", + "https://edpuzzle.com", + "https://khanacademy.org", + "https://wikipedia.org", + "https://dictionary.com", + ]; + return urls[Math.floor(Math.random() * urls.length)]; +} \ No newline at end of file From 76fa6debdaf54f62cdc833175547eaabacca94c0 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Thu, 30 Apr 2026 09:11:44 -0400 Subject: [PATCH 016/115] fix: update filename to settings.js --- static/settings.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/settings.html b/static/settings.html index 5a0f06f5a7..869cedea5e 100644 --- a/static/settings.html +++ b/static/settings.html @@ -245,7 +245,7 @@

Information

- + - - \ No newline at end of file diff --git a/static/apps.html b/static/apps.html index cd74653546..f0fd25c6d7 100644 --- a/static/apps.html +++ b/static/apps.html @@ -8,6 +8,7 @@ Home + @@ -46,7 +47,6 @@
- - - diff --git a/static/tabs.html b/static/tabs.html index 7ba2514696..2b4e60a4ab 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -9,6 +9,7 @@ Home + @@ -66,7 +67,6 @@ - diff --git a/static/apps.html b/static/apps.html index f0fd25c6d7..f1611931db 100644 --- a/static/apps.html +++ b/static/apps.html @@ -8,13 +8,11 @@ Home - - - + @@ -47,6 +45,8 @@
+ + - diff --git a/static/settings.html b/static/settings.html index 649f3d6106..51b45f2d9c 100644 --- a/static/settings.html +++ b/static/settings.html @@ -8,11 +8,11 @@ Home - + @@ -239,7 +239,6 @@

Information

- diff --git a/static/tabs.html b/static/tabs.html index 2b4e60a4ab..01d2c7589f 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -9,9 +9,9 @@ Home - + - - + + diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 08e727b294..2faa778f25 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -279,7 +279,7 @@ document.addEventListener("DOMContentLoaded", () => { } // Event Key Logic - const eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["Ctrl", "E"]; + const eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; const pLink = localStorage.getItem("pLink") || "https://classroom.google.com/"; let pressedKeys = []; @@ -297,4 +297,4 @@ document.addEventListener("DOMContentLoaded", () => { if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } -}); +}); \ No newline at end of file diff --git a/static/games.html b/static/games.html index 4c369aa0cc..9d52738c65 100644 --- a/static/games.html +++ b/static/games.html @@ -4,7 +4,6 @@ - Home @@ -13,8 +12,8 @@ - - + + diff --git a/static/settings.html b/static/settings.html index 51b45f2d9c..9abdcb63c2 100644 --- a/static/settings.html +++ b/static/settings.html @@ -230,14 +230,6 @@

Information

- - From cee43f0d98ef1e4d161de149a8195cff7dd494e8 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 1 May 2026 11:14:56 -0400 Subject: [PATCH 023/115] fix: remove duplicate isInTabMode declaration + ran formatter --- static/assets/js/index.js | 21 +++++++-------------- static/assets/js/launcher.js | 12 +----------- static/assets/js/main.js | 2 +- 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/static/assets/js/index.js b/static/assets/js/index.js index d669f18015..53405723e2 100644 --- a/static/assets/js/index.js +++ b/static/assets/js/index.js @@ -4,18 +4,6 @@ window.addEventListener("load", () => { }); }); -let xl; - -try { - xl = window.top.location.pathname === "/tabs"; -} catch { - try { - xl = window.parent.location.pathname === "/tabs"; - } catch { - xl = false; - } -} - const form = document.getElementById("fv"); const input = document.getElementById("input"); @@ -23,7 +11,8 @@ if (form && input) { form.addEventListener("submit", async event => { event.preventDefault(); try { - if (xl) await processUrl(input.value, ""); + // isInTabMode is declared in main.js + if (isInTabMode) await processUrl(input.value, ""); else await processUrl(input.value, "/tabs"); } catch { await processUrl(input.value, "/tabs"); @@ -77,7 +66,11 @@ function go(value) { } function blank(value) { - processUrl(value); + processUrl(value, ""); +} + +function now(value) { + processUrl(value, ""); } function dy(value) { diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index baf9c80714..44c303bcf0 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -2,17 +2,6 @@ const isGamesPage = window.location.pathname === "/games"; const isAppsPage = window.location.pathname === "/apps"; const isToolsPage = window.location.pathname === "/gt"; -let isInTabMode = false; -try { - isInTabMode = window.top.location.pathname === "/tabs"; -} catch { - try { - isInTabMode = window.parent.location.pathname === "/tabs"; - } catch { - isInTabMode = false; - } -} - function getStorageKey(baseKey) { if (isGamesPage) return `G${baseKey}`; if (isToolsPage) return `T${baseKey}`; @@ -51,6 +40,7 @@ function handleAppClick(app) { if (!selectedUrl) return false; } + // isInTabMode is declared in main.js if (app.local) { saveUrlToSession(selectedUrl); window.location.href = isInTabMode ? selectedUrl : "rx"; diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 2faa778f25..ca374d30c6 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -297,4 +297,4 @@ document.addEventListener("DOMContentLoaded", () => { if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } -}); \ No newline at end of file +}); From b69feeba8f4fb1b81e5af7495d3d8dfea06324f7 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 1 May 2026 11:17:19 -0400 Subject: [PATCH 024/115] fix: update tabs route to prevent 404 errors --- static/assets/js/launcher.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index 44c303bcf0..f5556292a8 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -43,7 +43,7 @@ function handleAppClick(app) { // isInTabMode is declared in main.js if (app.local) { saveUrlToSession(selectedUrl); - window.location.href = isInTabMode ? selectedUrl : "rx"; + window.location.href = isInTabMode ? selectedUrl : "tabs"; } else if (app.local2) { saveUrlToSession(selectedUrl); window.location.href = selectedUrl; From 6864f366750028a68af1018e29136c93965eaa33 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 1 May 2026 11:37:35 -0400 Subject: [PATCH 025/115] refactor(tabs): clean up logic and naming, fix navigation bugs, format code --- static/assets/js/tabs.js | 637 +++++++++++++++++++-------------------- static/tabs.html | 8 +- 2 files changed, 310 insertions(+), 335 deletions(-) diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index f7fe56d1e7..7160a22b3b 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -1,158 +1,322 @@ -window.addEventListener("load", () => { - navigator.serviceWorker.register("../sw.js", { scope: "/uv/" }); - const form = document.getElementById("fv"); - const input = document.getElementById("input"); - if (form && input) { - form.addEventListener("submit", async event => { - event.preventDefault(); - const formValue = input.value.trim(); - const url = isUrl(formValue) ? prependHttps(formValue) : `https://search.brave.com/search?q=${formValue}`; - await processUrl(url); - }); +function isUrl(val = "") { + return /^http(s?):\/\//.test(val) || (val.includes(".") && val[0] !== " "); +} + +function prependHttps(url) { + return url.startsWith("http://") || url.startsWith("https://") ? url : `https://${url}`; +} + +function isScramjetEnabled() { + return localStorage.getItem("pchoice") === "sj"; +} + +async function encodeProxyUrl(url) { + if (isScramjetEnabled()) { + if (window.__isSjReady) await window.__isSjReady; + if (window.__isSj?.encodeUrl) return window.__isSj.encodeUrl(url); } + return `/uv/${__uv$config.encodeUrl(url)}`; +} - function useScramjetPxy() { - const p = localStorage.getItem("pchoice"); - return p === "sj"; +function encodeProxyUrlSync(url) { + if (isScramjetEnabled() && window.__isSj?.encodeUrl) return window.__isSj.encodeUrl(url); + return `/uv/${__uv$config.encodeUrl(url)}`; +} + +window.__encodeProxyUrl = encodeProxyUrlSync; + +function decodeUVUrl(input) { + if (!input) return input; + const [str, ...search] = input.split("?"); + return ( + decodeURIComponent(str) + .split("") + .map((char, ind) => (ind % 2 ? String.fromCharCode(char.charCodeAt(0) ^ 2) : char)) + .join("") + (search.length ? `?${search.join("?")}` : "") + ); +} + +function updateAddressBar() { + const activeIframe = document.querySelector("#frame-container iframe.active"); + if (!activeIframe) return; + + let currentUrl; + try { + if (activeIframe.contentWindow.document.readyState !== "complete") return; + currentUrl = activeIframe.contentWindow.document.location.href; + } catch { + return; } - async function getPxyUrl(url) { - if (useScramjetPxy()) { - if (window.__isSjReady) { - await window.__isSjReady; - } - if (window.__isSj?.encodeUrl) { - return window.__isSj.encodeUrl(url); - } + const input = document.getElementById("input"); + if (!input) return; + + if (currentUrl.includes("/uv/scramjet/")) { + if (window.__isSj?.decodeUrl) { + const decoded = window.__isSj.decodeUrl(currentUrl); + localStorage.setItem("decoded", decoded); + input.value = decoded; + } else { + input.value = currentUrl; } + } else if (currentUrl.includes("/uv/dynamic/")) { + const path = currentUrl.replace(window.location.origin, "").replace("/uv/dynamic/", ""); + localStorage.setItem("decoded", path); + input.value = decodeUVUrl(path); + } else if (currentUrl.includes("/uv/")) { + const path = currentUrl.replace(window.location.origin, "").replace("/uv/", ""); + localStorage.setItem("decoded", path); + input.value = decodeUVUrl(path); + } else { + const path = currentUrl.replace(window.location.origin, ""); + input.value = path; + localStorage.setItem("decoded", path); + } +} - return `/uv/${__uv$config.encodeUrl(url)}`; +function reload() { + const activeIframe = document.querySelector("#frame-container iframe.active"); + if (activeIframe) { + activeIframe.src = activeIframe.src; + updateAddressBar(); + } else { + console.error("No active iframe found"); } +} - function getPxyUrlSync(url) { - if (useScramjetPxy() && window.__isSj?.encodeUrl) { - return window.__isSj.encodeUrl(url); - } +function popoutTab() { + const activeIframe = document.querySelector("#frame-container iframe.active"); + if (!activeIframe) { + console.error("No active iframe found"); + return; + } + + const newWindow = window.open("about:blank", "_blank"); + if (!newWindow) return; + + const cloakName = localStorage.getItem("name") || "My Drive - Google Drive"; + const cloakIcon = localStorage.getItem("icon") || "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png"; + + newWindow.document.title = cloakName; + + const link = newWindow.document.createElement("link"); + link.rel = "icon"; + link.href = encodeURI(cloakIcon); + newWindow.document.head.appendChild(link); + + const newIframe = newWindow.document.createElement("iframe"); + const style = newIframe.style; + style.position = "fixed"; + style.top = style.bottom = style.left = style.right = 0; + style.border = style.outline = "none"; + style.width = style.height = "100%"; + newIframe.src = activeIframe.src; + + newWindow.document.body.appendChild(newIframe); +} - return `/uv/${__uv$config.encodeUrl(url)}`; +function toggleDevTools() { + const activeIframe = document.querySelector("#frame-container iframe.active"); + if (!activeIframe) { + console.error("No active iframe found"); + return; } - async function processUrl(url) { - const pxyUrl = await getPxyUrl(url); - sessionStorage.setItem("GoUrl", pxyUrl); - const iframeContainer = document.getElementById("frame-container"); - const activeIframe = Array.from(iframeContainer.querySelectorAll("iframe")).find(iframe => iframe.classList.contains("active")); - activeIframe.src = pxyUrl; - activeIframe.dataset.tabUrl = url; - input.value = url; - console.log(activeIframe.dataset.tabUrl); + const iframeWindow = activeIframe.contentWindow; + if (!iframeWindow) { + console.error("No content window found for the active iframe"); + return; } - function isUrl(val = "") { - if (/^http(s?):\/\//.test(val) || (val.includes(".") && val.substr(0, 1) !== " ")) { - return true; + + if (iframeWindow.eruda) { + if (iframeWindow.eruda._isInit) { + iframeWindow.eruda.destroy(); + } else { + console.error("Eruda is not initialized in the active iframe"); } - return false; + return; } - function prependHttps(url) { - if (!url.startsWith("http://") && !url.startsWith("https://")) { - return `https://${url}`; + + const iframeDocument = activeIframe.contentDocument; + if (!iframeDocument) { + console.error("No content document found for the active iframe"); + return; + } + + const script = iframeDocument.createElement("script"); + script.src = "https://cdn.jsdelivr.net/npm/eruda"; + script.onload = () => { + if (!iframeWindow.eruda) { + console.error("Failed to load Eruda in the active iframe"); + return; } - return url; + iframeWindow.eruda.init(); + iframeWindow.eruda.show(); + }; + iframeDocument.head.appendChild(script); +} + +function toggleFullscreen() { + const activeIframe = document.querySelector("#frame-container iframe.active"); + if (!activeIframe) { + console.error("No active iframe found"); + return; + } + + if (activeIframe.contentDocument.fullscreenElement) { + activeIframe.contentDocument.exitFullscreen(); + } else { + activeIframe.contentDocument.documentElement.requestFullscreen(); + } +} + +function goHome() { + window.location.href = "./"; +} + +function goBack() { + const activeIframe = document.querySelector("#frame-container iframe.active"); + if (activeIframe) { + activeIframe.contentWindow.history.back(); + updateAddressBar(); + } else { + console.error("No active iframe found"); + } +} + +function goForward() { + const activeIframe = document.querySelector("#frame-container iframe.active"); + if (activeIframe) { + activeIframe.contentWindow.history.forward(); + updateAddressBar(); + } else { + console.error("No active iframe found"); } +} - window.__isGetPxyUrl = getPxyUrlSync; +window.addEventListener("load", () => { + navigator.serviceWorker.register("../sw.js", { scope: "/uv/" }); + + const form = document.getElementById("fv"); + const input = document.getElementById("input"); + + if (form && input) { + form.addEventListener("submit", async event => { + event.preventDefault(); + const formValue = input.value.trim(); + const engine = localStorage.getItem("engine") || "https://search.brave.com/search?q="; + const url = isUrl(formValue) ? prependHttps(formValue) : `${engine}${formValue}`; + await navigateActiveTab(url); + }); + } + + async function navigateActiveTab(url) { + const proxyUrl = await encodeProxyUrl(url); + sessionStorage.setItem("GoUrl", proxyUrl); + const iframeContainer = document.getElementById("frame-container"); + const activeIframe = Array.from(iframeContainer.querySelectorAll("iframe")).find(f => f.classList.contains("active")); + if (!activeIframe) { + console.error("No active iframe found"); + return; + } + activeIframe.src = proxyUrl; + activeIframe.dataset.tabUrl = url; + if (input) input.value = url; + } }); -document.addEventListener("DOMContentLoaded", event => { + +document.addEventListener("DOMContentLoaded", () => { + document.getElementById("fullscreen-button")?.addEventListener("click", toggleFullscreen); + document.getElementById("home-page")?.addEventListener("click", goHome); + + const tabToggleBtn = document.getElementById("tabs-button"); + const tabSideNav = document.getElementById("right-side-nav"); + tabToggleBtn?.addEventListener("click", () => { + const activeIframe = document.querySelector("#frame-container iframe.active"); + if (!activeIframe) return; + + const hiding = tabSideNav.style.display !== "none"; + tabSideNav.style.display = hiding ? "none" : ""; + activeIframe.style.top = hiding ? "5%" : "10%"; + activeIframe.style.height = hiding ? "95%" : "90%"; + + const icon = tabToggleBtn.querySelector("i"); + icon.classList.toggle("fa-magnifying-glass-minus", !hiding); + icon.classList.toggle("fa-magnifying-glass-plus", hiding); + }); + const addTabButton = document.getElementById("add-tab"); const tabList = document.getElementById("tab-list"); const iframeContainer = document.getElementById("frame-container"); let tabCounter = 1; - addTabButton.addEventListener("click", () => { - createNewTab(); - Load(); - }); + + addTabButton.addEventListener("click", createNewTab); + + function resolveStoredUrl(value) { + if (!value) return null; + return value.startsWith("/") ? window.location.origin + value : value; + } + + function setAllInactive() { + for (const tab of tabList.querySelectorAll("li")) tab.classList.remove("active"); + for (const frame of iframeContainer.querySelectorAll("iframe")) frame.classList.remove("active"); + } + function createNewTab() { const newTab = document.createElement("li"); const tabTitle = document.createElement("span"); const newIframe = document.createElement("iframe"); + newIframe.sandbox = "allow-same-origin allow-scripts allow-forms allow-pointer-lock allow-modals allow-orientation-lock allow-presentation allow-storage-access-by-user-activation"; // When Top Navigation is not allowed links with the "top" value will be entirely blocked, if we allow Top Navigation it will overwrite the tab, which is obviously not wanted. + tabTitle.textContent = `New Tab ${tabCounter}`; tabTitle.className = "t"; newTab.dataset.tabId = tabCounter; newTab.addEventListener("click", switchTab); newTab.setAttribute("draggable", true); + const closeButton = document.createElement("button"); closeButton.classList.add("close-tab"); closeButton.innerHTML = "✕"; closeButton.addEventListener("click", closeTab); + newTab.appendChild(tabTitle); newTab.appendChild(closeButton); tabList.appendChild(newTab); - const allTabs = Array.from(tabList.querySelectorAll("li")); - for (const tab of allTabs) { - tab.classList.remove("active"); - } - const allIframes = Array.from(iframeContainer.querySelectorAll("iframe")); - for (const iframe of allIframes) { - iframe.classList.remove("active"); - } + + setAllInactive(); newTab.classList.add("active"); + newIframe.dataset.tabId = tabCounter; newIframe.classList.add("active"); - newIframe.addEventListener("load", () => { - const title = newIframe.contentDocument.title; - if (title.length <= 1) { - tabTitle.textContent = "Tab"; - } else { - tabTitle.textContent = title; - } - newIframe.contentWindow.open = url => { - const pxyUrl = window.__isGetPxyUrl ? window.__isGetPxyUrl(url) : `/uv/${__uv$config.encodeUrl(url)}`; - sessionStorage.setItem("URL", pxyUrl); - createNewTab(); - return null; - }; - if (newIframe.contentDocument.documentElement.outerHTML.trim().length > 0) { - Load(); - } - Load(); - }); - const goUrl = sessionStorage.getItem("GoUrl"); - const url = sessionStorage.getItem("URL"); - const resolveStoredUrl = value => { - if (!value) { - return null; - } + newIframe.addEventListener("load", () => { + try { + const title = newIframe.contentDocument?.title; + tabTitle.textContent = title && title.length > 1 ? title : "Tab"; - if (value.startsWith("/")) { - return window.location.origin + value; - } + newIframe.contentWindow.open = url => { + const proxyUrl = window.__encodeProxyUrl ? window.__encodeProxyUrl(url) : `/uv/${__uv$config.encodeUrl(url)}`; + sessionStorage.setItem("URL", proxyUrl); + createNewTab(); + return null; + }; + } catch {} + updateAddressBar(); + }); - return value; - }; + const goUrl = sessionStorage.getItem("GoUrl"); + const storedUrl = sessionStorage.getItem("URL"); - if (tabCounter === 0 || tabCounter === 1) { - if (goUrl !== null) { - if (goUrl.includes("/e/")) { - newIframe.src = window.location.origin + goUrl; - } else { - newIframe.src = resolveStoredUrl(goUrl); - } - } else { - newIframe.src = "/"; - } - } else if (tabCounter > 1) { - if (url !== null) { - newIframe.src = resolveStoredUrl(url); + if (tabCounter === 1) { + newIframe.src = goUrl ? (goUrl.includes("/e/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl)) : "/"; + } else { + if (storedUrl) { + newIframe.src = resolveStoredUrl(storedUrl); sessionStorage.removeItem("URL"); - } else if (goUrl !== null) { - if (goUrl.includes("/e/")) { - newIframe.src = window.location.origin + goUrl; - } else { - newIframe.src = resolveStoredUrl(goUrl); - } + } else if (goUrl) { + newIframe.src = goUrl.includes("/e/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl); } else { newIframe.src = "/"; } @@ -161,61 +325,56 @@ document.addEventListener("DOMContentLoaded", event => { iframeContainer.appendChild(newIframe); tabCounter += 1; } + function closeTab(event) { event.stopPropagation(); const tabId = event.target.closest("li").dataset.tabId; const tabToRemove = tabList.querySelector(`[data-tab-id='${tabId}']`); const iframeToRemove = iframeContainer.querySelector(`[data-tab-id='${tabId}']`); - if (tabToRemove && iframeToRemove) { - tabToRemove.remove(); - iframeToRemove.remove(); - const remainingTabs = Array.from(tabList.querySelectorAll("li")); - if (remainingTabs.length === 0) { - tabCounter = 0; - document.getElementById("input").value = ""; - } else { - const nextTabIndex = remainingTabs.findIndex(tab => tab.dataset.tabId !== tabId); - if (nextTabIndex > -1) { - const nextTabToActivate = remainingTabs[nextTabIndex]; - const nextIframeToActivate = iframeContainer.querySelector(`[data-tab-id='${nextTabToActivate.dataset.tabId}']`); - for (const tab of remainingTabs) { - tab.classList.remove("active"); - } - remainingTabs[nextTabIndex].classList.add("active"); - const allIframes = Array.from(iframeContainer.querySelectorAll("iframe")); - for (const iframe of allIframes) { - iframe.classList.remove("active"); - } - nextIframeToActivate.classList.add("active"); - } - } + + if (!tabToRemove || !iframeToRemove) return; + + tabToRemove.remove(); + iframeToRemove.remove(); + + const remainingTabs = Array.from(tabList.querySelectorAll("li")); + if (remainingTabs.length === 0) { + tabCounter = 0; + const input = document.getElementById("input"); + if (input) input.value = ""; + return; } + + const nextTab = remainingTabs[0]; + const nextIframe = iframeContainer.querySelector(`[data-tab-id='${nextTab.dataset.tabId}']`); + setAllInactive(); + nextTab.classList.add("active"); + if (nextIframe) nextIframe.classList.add("active"); } + function switchTab(event) { const tabId = event.target.closest("li").dataset.tabId; - const allTabs = Array.from(tabList.querySelectorAll("li")); - for (const tab of allTabs) { - tab.classList.remove("active"); - } - const allIframes = Array.from(iframeContainer.querySelectorAll("iframe")); - for (const iframe of allIframes) { - iframe.classList.remove("active"); - } + setAllInactive(); + const selectedTab = tabList.querySelector(`[data-tab-id='${tabId}']`); + const selectedIframe = iframeContainer.querySelector(`[data-tab-id='${tabId}']`); + if (selectedTab) { selectedTab.classList.add("active"); - Load(); } else { - console.log("No selected tab found with ID:", tabId); + console.error("No selected tab found with ID:", tabId); } - const selectedIframe = iframeContainer.querySelector(`[data-tab-id='${tabId}']`); + if (selectedIframe) { selectedIframe.classList.add("active"); + updateAddressBar(); } else { - console.log("No selected iframe found with ID:", tabId); + console.error("No selected iframe found with ID:", tabId); } } + let dragTab = null; + tabList.addEventListener("dragstart", event => { dragTab = event.target; }); @@ -223,205 +382,21 @@ document.addEventListener("DOMContentLoaded", event => { event.preventDefault(); const targetTab = event.target; if (targetTab.tagName === "LI" && targetTab !== dragTab) { - const targetIndex = Array.from(tabList.children).indexOf(targetTab); - const dragIndex = Array.from(tabList.children).indexOf(dragTab); - if (targetIndex < dragIndex) { - tabList.insertBefore(dragTab, targetTab); - } else { - tabList.insertBefore(dragTab, targetTab.nextSibling); - } + const children = Array.from(tabList.children); + const targetIndex = children.indexOf(targetTab); + const dragIndex = children.indexOf(dragTab); + tabList.insertBefore(dragTab, targetIndex < dragIndex ? targetTab : targetTab.nextSibling); } }); tabList.addEventListener("dragend", () => { dragTab = null; }); + createNewTab(); }); -// Reload -function reload() { - const activeIframe = document.querySelector("#frame-container iframe.active"); - if (activeIframe) { - // biome-ignore lint: idk - activeIframe.src = activeIframe.src; - Load(); - } else { - console.error("No active iframe found"); - } -} -// Popout -function popout() { - const activeIframe = document.querySelector("#frame-container iframe.active"); - if (activeIframe) { - const newWindow = window.open("about:blank", "_blank"); - if (newWindow) { - const name = localStorage.getItem("name") || "My Drive - Google Drive"; - const icon = localStorage.getItem("icon") || "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png"; - newWindow.document.title = name; - const link = newWindow.document.createElement("link"); - link.rel = "icon"; - link.href = encodeURI(icon); - newWindow.document.head.appendChild(link); - - const newIframe = newWindow.document.createElement("iframe"); - const style = newIframe.style; - style.position = "fixed"; - style.top = style.bottom = style.left = style.right = 0; - style.border = style.outline = "none"; - style.width = style.height = "100%"; - - newIframe.src = activeIframe.src; - - newWindow.document.body.appendChild(newIframe); - } - } else { - console.error("No active iframe found"); - } -} - -function eToggle() { - const activeIframe = document.querySelector("#frame-container iframe.active"); - if (!activeIframe) { - console.error("No active iframe found"); - return; - } - const erudaWindow = activeIframe.contentWindow; - if (!erudaWindow) { - console.error("No content window found for the active iframe"); - return; - } - if (erudaWindow.eruda) { - if (erudaWindow.eruda._isInit) { - erudaWindow.eruda.destroy(); - } else { - console.error("Eruda is not initialized in the active iframe"); - } - } else { - const erudaDocument = activeIframe.contentDocument; - if (!erudaDocument) { - console.error("No content document found for the active iframe"); - return; - } - const script = erudaDocument.createElement("script"); - script.src = "https://cdn.jsdelivr.net/npm/eruda"; - script.onload = () => { - if (!erudaWindow.eruda) { - console.error("Failed to load Eruda in the active iframe"); - return; - } - erudaWindow.eruda.init(); - erudaWindow.eruda.show(); - }; - erudaDocument.head.appendChild(script); - } -} -// Fullscreen -function FS() { - const activeIframe = document.querySelector("#frame-container iframe.active"); - if (activeIframe) { - if (activeIframe.contentDocument.fullscreenElement) { - activeIframe.contentDocument.exitFullscreen(); - } else { - activeIframe.contentDocument.documentElement.requestFullscreen(); - } - } else { - console.error("No active iframe found"); - } -} -const fullscreenButton = document.getElementById("fullscreen-button"); -fullscreenButton.addEventListener("click", FS); -// Home -function Home() { - window.location.href = "./"; -} -const homeButton = document.getElementById("home-page"); -homeButton.addEventListener("click", Home); -// Back -function goBack() { - const activeIframe = document.querySelector("#frame-container iframe.active"); - if (activeIframe) { - activeIframe.contentWindow.history.back(); - iframe.src = activeIframe.src; - Load(); - } else { - console.error("No active iframe found"); - } -} -// Forward -function goForward() { - const activeIframe = document.querySelector("#frame-container iframe.active"); - if (activeIframe) { - activeIframe.contentWindow.history.forward(); - iframe.src = activeIframe.src; - Load(); - } else { - console.error("No active iframe found"); - } -} -// Remove Nav -document.addEventListener("DOMContentLoaded", () => { - const tb = document.getElementById("tabs-button"); - const nb = document.getElementById("right-side-nav"); - tb.addEventListener("click", () => { - const activeIframe = document.querySelector("#frame-container iframe.active"); - if (nb.style.display === "none") { - nb.style.display = ""; - activeIframe.style.top = "10%"; - activeIframe.style.height = "90%"; - tb.querySelector("i").classList.remove("fa-magnifying-glass-plus"); - tb.querySelector("i").classList.add("fa-magnifying-glass-minus"); - } else { - nb.style.display = "none"; - activeIframe.style.top = "5%"; - activeIframe.style.height = "95%"; - tb.querySelector("i").classList.remove("fa-magnifying-glass-minus"); - tb.querySelector("i").classList.add("fa-magnifying-glass-plus"); - } - }); -}); if (navigator.userAgent.includes("Chrome")) { window.addEventListener("resize", () => { navigator.keyboard.lock(["Escape"]); }); } -function Load() { - const activeIframe = document.querySelector("#frame-container iframe.active"); - if (activeIframe && activeIframe.contentWindow.document.readyState === "complete") { - const website = activeIframe.contentWindow.document.location.href; - if (website.includes("/uv/scramjet/")) { - if (window.__isSj?.decodeUrl) { - const decodedValue = window.__isSj.decodeUrl(website); - localStorage.setItem("decoded", decodedValue); - document.getElementById("input").value = decodedValue; - } else { - document.getElementById("input").value = website; - } - } else if (website.includes("/uv/dynamic/")) { - const websitePath = website.replace(window.location.origin, "").replace("/uv/dynamic/", ""); - const decodedValue = decodeXor(websitePath); - localStorage.setItem("decoded", websitePath); - document.getElementById("input").value = decodedValue; - } else if (website.includes("/uv/")) { - const websitePath = website.replace(window.location.origin, "").replace("/uv/", ""); - localStorage.setItem("decoded", websitePath); - const decodedValue = decodeXor(websitePath); - document.getElementById("input").value = decodedValue; - } else { - const websitePath = website.replace(window.location.origin, ""); - document.getElementById("input").value = websitePath; - localStorage.setItem("decoded", websitePath); - } - } -} -function decodeXor(input) { - if (!input) { - return input; - } - const [str, ...search] = input.split("?"); - return ( - decodeURIComponent(str) - .split("") - .map((char, ind) => (ind % 2 ? String.fromCharCode(char.charCodeAt(Number.NaN) ^ 2) : char)) - .join("") + (search.length ? `?${search.join("?")}` : "") - ); -} diff --git a/static/tabs.html b/static/tabs.html index 01d2c7589f..58fc1bdad1 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -28,7 +28,7 @@ - + From bd3db7731c490021618820239692ae86d985164e Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sat, 2 May 2026 14:03:54 -0400 Subject: [PATCH 031/115] refactor(main): remove duplicate tab cloaker logic --- static/assets/js/main.js | 216 ++------------------------------------- 1 file changed, 7 insertions(+), 209 deletions(-) diff --git a/static/assets/js/main.js b/static/assets/js/main.js index ca374d30c6..044cdf31d5 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -68,215 +68,13 @@ document.addEventListener("DOMContentLoaded", () => { nav.innerHTML = html; } - // Favicon and Name Logic + // Favicon and Name Logic const icon = document.getElementById("tab-favicon"); - const name = document.getElementById("t"); - const selectedValue = localStorage.getItem("selectedOption"); - - function setCloak(nameValue, iconUrl) { - const finalName = localStorage.getItem("CustomName") || nameValue; - const finalIcon = localStorage.getItem("CustomIcon") || iconUrl; - - if (finalIcon) icon.setAttribute("href", finalIcon); - if (finalName) name.textContent = finalName; - } - - const options = { - Google: { name: "Google", icon: "/assets/media/favicon/google.png" }, - "Savvas Realize": { - name: "Savvas Realize", - icon: "/assets/media/favicon/savvas-realize.png", - }, - SmartPass: { - name: "SmartPass", - icon: "/assets/media/favicon/smartpass.png", - }, - "World Book Online - Super Home": { - name: "Super Home Page", - icon: "/assets/media/favicon/wbo.ico", - }, - "World Book Online - Student": { - name: "WBO Student | Home Page", - icon: "/assets/media/favicon/wbo.ico", - }, - "World Book Online - Timelines": { - name: "Timelines - Home Page", - icon: "/assets/media/favicon/wbo.ico", - }, - Naviance: { - name: "Naviance Student", - icon: "/assets/media/favicon/naviance.png", - }, - "PBS Learning Media": { - name: "PBS LearningMedia | Teaching Resources For Students And Teachers", - icon: "/assets/media/favicon/pbslearningmedia.ico", - }, - "PBS Learning Media Student Home": { - name: "Student Homepage | PBS LearningMedia", - icon: "/assets/media/favicon/pbslearningmedia.ico", - }, - Drive: { - name: "My Drive - Google Drive", - icon: "/assets/media/favicon/drive.png", - }, - Classroom: { name: "Home", icon: "/assets/media/favicon/classroom.png" }, - Schoology: { - name: "Home | Schoology", - icon: "/assets/media/favicon/schoology.png", - }, - Gmail: { name: "Gmail", icon: "/assets/media/favicon/gmail.png" }, - Clever: { - name: "Clever | Portal", - icon: "/assets/media/favicon/clever.png", - }, - Khan: { - name: "Dashboard | Khan Academy", - icon: "/assets/media/favicon/khan.png", - }, - Dictionary: { - name: "Dictionary.com | Meanings & Definitions of English Words", - icon: "/assets/media/favicon/dictionary.png", - }, - Thesaurus: { - name: "Synonyms and Antonyms of Words | Thesaurus.com", - icon: "/assets/media/favicon/thesaurus.png", - }, - Campus: { - name: "Infinite Campus", - icon: "/assets/media/favicon/campus.png", - }, - IXL: { name: "IXL | Dashboard", icon: "/assets/media/favicon/ixl.png" }, - Canvas: { name: "Dashboard", icon: "/assets/media/favicon/canvas.png" }, - CodeHS: { name: "Sandbox | CodeHS", icon: "/assets/media/favicon/codehs.png" }, - LinkIt: { name: "Test Taker", icon: "/assets/media/favicon/linkit.ico" }, - Edpuzzle: { name: "Edpuzzle", icon: "/assets/media/favicon/edpuzzle.png" }, - "i-Ready Math": { - name: "Math To Do, i-Ready", - icon: "/assets/media/favicon/i-ready.ico", - }, - "i-Ready Reading": { - name: "Reading To Do, i-Ready", - icon: "/assets/media/favicon/i-ready.ico", - }, - "ClassLink Login": { - name: "Login", - icon: "/assets/media/favicon/classlink-login.png", - }, - "Google Meet": { - name: "Google Meet", - icon: "/assets/media/favicon/google-meet.png", - }, - "Google Docs": { - name: "Google Docs", - icon: "/assets/media/favicon/google-docs.ico", - }, - "Google Slides": { - name: "Google Slides", - icon: "/assets/media/favicon/google-slides.ico", - }, - Wikipedia: { - name: "Wikipedia", - icon: "/assets/media/favicon/wikipedia.png", - }, - Britannica: { - name: "Encyclopedia Britannica | Britannica", - icon: "/assets/media/favicon/britannica.png", - }, - Ducksters: { - name: "Ducksters", - icon: "/assets/media/favicon/ducksters.png", - }, - Minga: { - name: "Minga – Creating Amazing Schools", - icon: "/assets/media/favicon/minga.png", - }, - "i-Ready Learning Games": { - name: "Learning Games, i-Ready", - icon: "/assets/media/favicon/i-ready.ico", - }, - "NoRedInk Home": { - name: "Student Home | NoRedInk", - icon: "/assets/media/favicon/noredink.png", - }, - Desmos: { - name: "Desmos | Graphing Calculator", - icon: "/assets/media/favicon/desmos.ico", - }, - "Newsela Binder": { - name: "Newsela | Binder", - icon: "/assets/media/favicon/newsela.png", - }, - "Newsela Assignments": { - name: "Newsela | Assignments", - icon: "/assets/media/favicon/newsela.png", - }, - "Newsela Home": { - name: "Newsela | Instructional Content Platform", - icon: "/assets/media/favicon/newsela.png", - }, - "PowerSchool Sign In": { - name: "Student and Parent Sign In", - icon: "/assets/media/favicon/powerschool.png", - }, - "PowerSchool Grades and Attendance": { - name: "Grades and Attendance", - icon: "/assets/media/favicon/powerschool.png", - }, - "PowerSchool Teacher Comments": { - name: "Teacher Comments", - icon: "/assets/media/favicon/powerschool.png", - }, - "PowerSchool Standards Grades": { - name: "Standards Grades", - icon: "/assets/media/favicon/powerschool.png", - }, - "PowerSchool Attendance": { - name: "Attendance", - icon: "/assets/media/favicon/powerschool.png", - }, - Nearpod: { name: "Nearpod", icon: "/assets/media/favicon/nearpod.png" }, - StudentVUE: { - name: "StudentVUE", - icon: "/assets/media/favicon/studentvue.ico", - }, - "Quizlet Home": { - name: "Flashcards, learning tools and textbook solutions | Quizlet", - icon: "/assets/media/favicon/quizlet.webp", - }, - "Google Forms Locked Mode": { - name: "Start your quiz", - icon: "/assets/media/favicon/googleforms.png", - }, - DeltaMath: { - name: "DeltaMath", - icon: "/assets/media/favicon/deltamath.png", - }, - Kami: { name: "Kami", icon: "/assets/media/favicon/kami.png" }, - "GoGuardian Admin Restricted": { - name: "Restricted", - icon: "/assets/media/favicon/goguardian-lock.png", - }, - "GoGuardian Teacher Block": { - name: "Uh oh!", - icon: "/assets/media/favicon/goguardian.png", - }, - "World History Encyclopedia": { - name: "World History Encyclopedia", - icon: "/assets/media/favicon/worldhistoryencyclopedia.png", - }, - "Big Ideas Math Assignment Player": { - name: "Assignment Player", - icon: "/assets/media/favicon/bim.ico", - }, - "Big Ideas Math": { - name: "Big Ideas Math", - icon: "/assets/media/favicon/bim.ico", - }, - }; - - if (options[selectedValue]) { - setCloak(options[selectedValue].name, options[selectedValue].icon); - } + const title = document.getElementById("t"); + const cloakName = localStorage.getItem("CustomName") || localStorage.getItem("name"); + const cloakIcon = localStorage.getItem("CustomIcon") || localStorage.getItem("icon"); + if (cloakName) title.textContent = cloakName; + if (cloakIcon) icon.setAttribute("href", cloakIcon); // Event Key Logic const eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; @@ -297,4 +95,4 @@ document.addEventListener("DOMContentLoaded", () => { if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } -}); +}); \ No newline at end of file From b04e76614ad57706becffcfc6e1ab3850570424f Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sat, 2 May 2026 14:14:44 -0400 Subject: [PATCH 032/115] refactor: improve function naming --- static/assets/js/launcher.js | 6 ++--- static/assets/js/search.js | 50 +++++++++++++++++------------------- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index e51d31d9d5..6bf1c62049 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -50,12 +50,12 @@ function handleAppClick(app) { } else if (app.blank) { blank(selectedUrl, proxy); } else if (app.now) { - now(selectedUrl, proxy); + blank(selectedUrl, proxy); if (isInTabMode) window.location.href = selectedUrl; } else if (app.custom) { createCustomApp(); } else if (app.dy) { - dy(selectedUrl); + useDynamic(selectedUrl); } else { go(selectedUrl, proxy); if (isInTabMode) blank(selectedUrl, proxy); @@ -355,4 +355,4 @@ window.bar = filterBySearchTerm; document.addEventListener("DOMContentLoaded", () => { loadAppsFromJson(); -}); +}); \ No newline at end of file diff --git a/static/assets/js/search.js b/static/assets/js/search.js index 0f897f6324..e61cf62223 100644 --- a/static/assets/js/search.js +++ b/static/assets/js/search.js @@ -12,20 +12,21 @@ if (form && input) { event.preventDefault(); try { // isInTabMode is declared in main.js - if (isInTabMode) await processUrl(input.value, ""); - else await processUrl(input.value, "/tabs"); + if (isInTabMode) await navigate(input.value, ""); + else await navigate(input.value, "/tabs"); } catch { - await processUrl(input.value, "/tabs"); + await navigate(input.value, "/tabs"); } }); } -function useScramjetPxy(proxyOverride) { - const p = proxyOverride ?? localStorage.getItem("pchoice"); - return p === "sj"; + +function isScramjet(proxyOverride) { + const choice = proxyOverride ?? localStorage.getItem("pchoice"); + return choice === "sj"; } -async function getPxyUrl(url, proxyOverride) { - if (useScramjetPxy(proxyOverride)) { +async function encodeUrl(url, proxyOverride) { + if (isScramjet(proxyOverride)) { if (window.__isSjReady) { await window.__isSjReady; } @@ -37,49 +38,44 @@ async function getPxyUrl(url, proxyOverride) { return `/uv/${__uv$config.encodeUrl(url)}`; } -async function processUrl(value, path, proxyOverride) { +async function navigate(value, path, proxyOverride) { let url = value.trim(); const engine = localStorage.getItem("engine"); const searchUrl = engine ? engine : "https://search.brave.com/search?q="; - if (!isUrl(url)) { + if (!isValidUrl(url)) { url = searchUrl + url; } else if (!(url.startsWith("https://") || url.startsWith("http://"))) { url = `https://${url}`; } const pchoice = proxyOverride ?? localStorage.getItem("pchoice"); - const pxyUrl = await getPxyUrl(url, pchoice); - sessionStorage.setItem("GoUrl", pxyUrl); + const proxyUrl = await encodeUrl(url, pchoice); + sessionStorage.setItem("GoUrl", proxyUrl); if (pchoice === "dy") { window.location.href = `/uv/dynamic/${__uv$config.encodeUrl(url)}`; } else if (path) { location.href = path; } else { - window.location.href = pxyUrl; + window.location.href = proxyUrl; } } +// Open link in the tabs page function go(value, proxyOverride) { - processUrl(value, "/tabs", proxyOverride); + navigate(value, "/tabs", proxyOverride); } +// Open link in about:blank function blank(value, proxyOverride) { - processUrl(value, "", proxyOverride); -} - -function now(value, proxyOverride) { - processUrl(value, "", proxyOverride); + navigate(value, "", proxyOverride); } -function dy(value) { - processUrl(value, `/uv/dynamic/${__uv$config.encodeUrl(value)}`, "dy"); +function useDynamic(value) { + navigate(value, `/uv/dynamic/${__uv$config.encodeUrl(value)}`, "dy"); } -function isUrl(val = "") { - if (/^http(s?):\/\//.test(val) || (val.includes(".") && val.substr(0, 1) !== " ")) { - return true; - } - return false; -} +function isValidUrl(val = "") { + return /^http(s?):\/\//.test(val) || (val.includes(".") && val[0] !== " "); +} \ No newline at end of file From 49be0a4db6f774dab97e1e1926d06c6306e7b37e Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sat, 2 May 2026 14:15:49 -0400 Subject: [PATCH 033/115] chore: formatted --- static/assets/js/launcher.js | 2 +- static/assets/js/main.js | 4 ++-- static/assets/js/search.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index 6bf1c62049..7fee332ec4 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -355,4 +355,4 @@ window.bar = filterBySearchTerm; document.addEventListener("DOMContentLoaded", () => { loadAppsFromJson(); -}); \ No newline at end of file +}); diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 044cdf31d5..26d3d873b2 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -68,7 +68,7 @@ document.addEventListener("DOMContentLoaded", () => { nav.innerHTML = html; } - // Favicon and Name Logic + // Favicon and Name Logic const icon = document.getElementById("tab-favicon"); const title = document.getElementById("t"); const cloakName = localStorage.getItem("CustomName") || localStorage.getItem("name"); @@ -95,4 +95,4 @@ document.addEventListener("DOMContentLoaded", () => { if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } -}); \ No newline at end of file +}); diff --git a/static/assets/js/search.js b/static/assets/js/search.js index e61cf62223..bf1f5ffecc 100644 --- a/static/assets/js/search.js +++ b/static/assets/js/search.js @@ -78,4 +78,4 @@ function useDynamic(value) { function isValidUrl(val = "") { return /^http(s?):\/\//.test(val) || (val.includes(".") && val[0] !== " "); -} \ No newline at end of file +} From d23cf9120dbf2f6f2ab4dd0f17d7522ce8b67ec8 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sat, 2 May 2026 14:23:13 -0400 Subject: [PATCH 034/115] refactor: restore nav-bar class name for consistency --- static/404.html | 3 ++- static/apps.html | 2 +- static/assets/css/nav.css | 26 +++++++++---------- .../assets/css/themes/catppuccin/frappe.css | 4 +-- static/assets/css/themes/catppuccin/latte.css | 4 +-- .../css/themes/catppuccin/macchiato.css | 4 +-- static/assets/css/themes/catppuccin/mocha.css | 4 +-- static/assets/js/main.js | 4 +-- static/games.html | 2 +- static/index.html | 2 +- static/settings.html | 2 +- 11 files changed, 29 insertions(+), 28 deletions(-) diff --git a/static/404.html b/static/404.html index 0c32e7c3f7..9da8a9e2ce 100644 --- a/static/404.html +++ b/static/404.html @@ -19,7 +19,7 @@ -
+

404

Page not found.

@@ -39,4 +39,5 @@

Page not found.

+ \ No newline at end of file diff --git a/static/apps.html b/static/apps.html index 95be2f7330..0aca1a9099 100644 --- a/static/apps.html +++ b/static/apps.html @@ -20,7 +20,7 @@ -
+
- From f52793decf7882751af823d8c7afee31aa3048c8 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sat, 2 May 2026 14:45:45 -0400 Subject: [PATCH 036/115] chore: remove tabs link from nav bar --- static/assets/js/main.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 0e65f611a7..5525a70cb5 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -62,7 +62,6 @@ document.addEventListener("DOMContentLoaded", () => { `; nav.innerHTML = html; @@ -95,4 +94,4 @@ document.addEventListener("DOMContentLoaded", () => { if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } -}); +}); \ No newline at end of file From 78a688525afc7e8227eac8eed43900d7e667335b Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sat, 2 May 2026 14:53:19 -0400 Subject: [PATCH 037/115] refactor: renamed /e to /gh-games for clarity --- index.js | 8 +++--- static/assets/js/tabs.js | 4 +-- static/assets/json/games.json | 46 +++++++++++++++---------------- static/assets/json/games.min.json | 2 +- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/index.js b/index.js index 695cae53a3..1d9ad7ba17 100644 --- a/index.js +++ b/index.js @@ -37,7 +37,7 @@ if (config.challenge !== false) { app.use(basicAuth({ users: config.users, challenge: true })); } -app.get("/e/*", async (req, res, next) => { +app.get("/gh-games/*", async (req, res, next) => { try { if (cache.has(req.path)) { const { data, contentType, timestamp } = cache.get(req.path); @@ -50,9 +50,9 @@ app.get("/e/*", async (req, res, next) => { } const baseUrls = { - "/e/1/": "https://raw.githubusercontent.com/qrs/x/fixy/", - "/e/2/": "https://raw.githubusercontent.com/3v1/V5-Assets/main/", - "/e/3/": "https://raw.githubusercontent.com/3v1/V5-Retro/master/", + "/gh-games/1/": "https://raw.githubusercontent.com/qrs/x/fixy/", + "/gh-games/2/": "https://raw.githubusercontent.com/3v1/V5-Assets/main/", + "/gh-games/3/": "https://raw.githubusercontent.com/3v1/V5-Retro/master/", }; let reqTarget; diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index 7160a22b3b..8332ba06a3 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -310,13 +310,13 @@ document.addEventListener("DOMContentLoaded", () => { const storedUrl = sessionStorage.getItem("URL"); if (tabCounter === 1) { - newIframe.src = goUrl ? (goUrl.includes("/e/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl)) : "/"; + newIframe.src = goUrl ? (goUrl.includes("/gh-games/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl)) : "/"; } else { if (storedUrl) { newIframe.src = resolveStoredUrl(storedUrl); sessionStorage.removeItem("URL"); } else if (goUrl) { - newIframe.src = goUrl.includes("/e/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl); + newIframe.src = goUrl.includes("/gh-games/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl); } else { newIframe.src = "/"; } diff --git a/static/assets/json/games.json b/static/assets/json/games.json index 501a6084ca..7733db840a 100644 --- a/static/assets/json/games.json +++ b/static/assets/json/games.json @@ -292,7 +292,7 @@ }, { "name": "Stickman Hook", - "link": "/e/stickman-hook/index.html", + "link": "/gh-games/stickman-hook/index.html", "image": "/assets/media/icons/stickmanhook.webp", "categories": ["all", "local"] }, @@ -390,7 +390,7 @@ }, { "name": "Jetpack Joyride", - "link": "/e/jetpack-joyride/index.html", + "link": "/gh-games/jetpack-joyride/index.html", "image": "/assets/media/icons/jetpackjoyride.webp", "categories": ["all", "local"] }, @@ -558,7 +558,7 @@ }, { "name": "Duck Life 4", - "link": "/e/ducklife4/index.html", + "link": "/gh-games/ducklife4/index.html", "image": "/assets/media/icons/dl4.webp", "categories": ["all", "local"], "load": true @@ -685,7 +685,7 @@ }, { "name": "Web Retro", - "link": "/e/index.html", + "link": "/gh-games/index.html", "image": "/assets/media/icons/webretro.webp", "categories": ["all,", "emu", "local"] }, @@ -709,7 +709,7 @@ }, { "name": "1", - "link": "/e/1/1/index.html", + "link": "/gh-games/1/1/index.html", "image": "/assets/media/icons/1.webp", "categories": ["all", "local"] }, @@ -865,7 +865,7 @@ }, { "name": "Cluster Rush", - "link": "/e/2/Cluster-Rush/index.html", + "link": "/gh-games/2/Cluster-Rush/index.html", "image": "/assets/media/icons/cluster-rush.webp", "categories": ["all", "local"] }, @@ -895,7 +895,7 @@ }, { "name": "Doge Miner", - "link": "/e/1/DogeMiner/index.html", + "link": "/gh-games/1/DogeMiner/index.html", "image": "/assets/media/icons/doge-miner-1.webp", "categories": ["all", "local"] }, @@ -1039,7 +1039,7 @@ }, { "name": "Idle Breakout", - "link": "/e/1/idle-breakout/index.html", + "link": "/gh-games/1/idle-breakout/index.html", "image": "/assets/media/icons/idlebreakout.webp", "categories": ["all", "local"] }, @@ -1105,7 +1105,7 @@ }, { "name": "Monkey Mart", - "link": "/e/2/monkey-mart/index.html", + "link": "/gh-games/2/monkey-mart/index.html", "image": "/assets/media/icons/mm.webp", "categories": ["all", "local"] }, @@ -1237,7 +1237,7 @@ }, { "name": "Pizza Tower", - "link": "https://gamaverse.com/c/e/g/pizza-tower-1678640389/index.html", + "link": "https://gamaverse.com/c/gh-games/g/pizza-tower-1678640389/index.html", "image": "/assets/media/icons/pizza-tower.webp", "categories": ["all"] }, @@ -1531,7 +1531,7 @@ }, { "name": "Retro Bowl", - "link": "/e/2/retro/index.html", + "link": "/gh-games/2/retro/index.html", "image": "/assets/media/icons/retro.webp", "categories": ["all,", "sports", "local"] }, @@ -1741,19 +1741,19 @@ }, { "name": "Minecraft 1.5.2 (Eaglercraft)", - "link": "/e/2/eag15/index.html", + "link": "/gh-games/2/eag15/index.html", "image": "/assets/media/icons/mc.webp", "categories": ["all", "2P", "emu", "local"] }, { "name": "Minecraft 1.8 (Eaglercraft)", - "link": "/e/2/eag18/offline.html", + "link": "/gh-games/2/eag18/offline.html", "image": "/assets/media/icons/mc.webp", "categories": ["all", "2P", "emu", "local"] }, { "name": "Minecraft 1.8 (Eagler WASM)", - "link": "/e/2/eag18/wasm.html", + "link": "/gh-games/2/eag18/wasm.html", "image": "/assets/media/icons/mc.webp", "categories": ["all", "2P", "emu", "local"] }, @@ -1765,43 +1765,43 @@ }, { "name": "2048", - "link": "/e/1/2048/index.html", + "link": "/gh-games/1/2048/index.html", "image": "/assets/media/icons/2048.webp", "categories": ["all", "local"] }, { "name": "2048 Multitasking", - "link": "/e/1/2048-multitask/index.html", + "link": "/gh-games/1/2048-multitask/index.html", "image": "/assets/media/icons/2048.webp", "categories": ["all", "local"] }, { "name": "Vex 7", - "link": "/e/1/vex7/index.html", + "link": "/gh-games/1/vex7/index.html", "image": "/assets/media/icons/vex7.webp", "categories": ["all", "local"] }, { "name": "Vex 6", - "link": "/e/1/vex6/index.html", + "link": "/gh-games/1/vex6/index.html", "image": "/assets/media/icons/vex6.webp", "categories": ["all", "local"] }, { "name": "Vex 5", - "link": "/e/1/vex5/index.html", + "link": "/gh-games/1/vex5/index.html", "image": "/assets/media/icons/vex5.webp", "categories": ["all", "local"] }, { "name": "Vex 3", - "link": "/e/1/vex3/index.html", + "link": "/gh-games/1/vex3/index.html", "image": "/assets/media/icons/vex3.webp", "categories": ["all", "local"] }, { "name": "Vex 4", - "link": "/e/1/vex4/index.html", + "link": "/gh-games/1/vex4/index.html", "image": "/assets/media/icons/vex4.webp", "categories": ["all", "local"] }, @@ -1861,7 +1861,7 @@ }, { "name": "Space Company", - "link": "/e/1/space-company/index.html", + "link": "/gh-games/1/space-company/index.html", "image": "/assets/media/icons/sc.png", "categories": ["all", "local"] }, @@ -1915,7 +1915,7 @@ }, { "name": "Particle Clicker", - "link": "/e/1/particle-clicker/index.html", + "link": "/gh-games/1/particle-clicker/index.html", "image": "/assets/media/icons/pc.png", "categories": ["all,", "local"] }, diff --git a/static/assets/json/games.min.json b/static/assets/json/games.min.json index ea30829eac..c7e865c9ba 100644 --- a/static/assets/json/games.min.json +++ b/static/assets/json/games.min.json @@ -1 +1 @@ -[{"name":"Request A Game","link":"https://forms.gle/vwdHN3iPz5cLaHaMA","image":"/assets/media/icons/request.webp","categories":["all"]},{"name":"Create Custom Game","image":"/assets/media/icons/custom.webp","categories":["all"],"custom":"true"},{"name":"Fancade","link":"https://play.fancade.com","image":"/assets/media/icon/fancade.jpg","categories":["all"]},{"name":"Amazon Luna","link":"https://luna.amazon.com/","image":"/assets/media/icons/amazon-luna.webp","categories":["all"],"blank":"true"},{"name":"Gartic Phone","link":"https://garticphone.com","image":"/assets/media/icons/garticphone.webp","categories":["all"]},{"name":"Newgrounds","link":"https://newgrounds.com/","image":"/assets/media/icons/newgrounds.webp","categories":["all"]},{"name":"Pranx","link":"https://pranx.com/","image":"/assets/media/icons/pranx.webp","categories":["all"]},{"name":"Steam","link":"https://steampowered.com/","image":"/assets/media/icons/steam.webp","categories":["all"],"say":"Steam can't actually be added because it's an app, not a website. This only lets you browse the Steam website, you can't actually play any games unless you use Geforce Now.","partial":true},{"name":"Swordbattle.io","link":"https://swordbattle.io/","image":"/assets/media/icons/swordbattle.webp","categories":["all","2d"]},{"name":"Stabfish.io","link":"https://stabfish.io/","image":"/assets/media/icons/stabfish.webp","categories":["all","2P"]},{"name":"Dynast.io","link":"https://dynast.io","image":"/assets/media/icons/dynast-io.webp","categories":["all"]},{"name":"Twisted Cooking Mama","link":"https://twisted-cooking-mama.game-files.crazygames.com/ruffle/twisted-cooking-mama/1/twistedcookingmama.html?v=1.273","image":"/assets/media/icons/twistedcookingmama.webp","categories":["all"]},{"name":"Marbles Garden","link":"https://www.coolmathgames.com/0-marbles-garden/play","image":"/assets/media/icons/marblesgarden.webp","categories":["all"]},{"name":"Fancy Pants Adventure","link":"https://games.crazygames.com/en_US/fancy-pants-adventure-world/index.html?v=1.273","image":"/assets/media/icons/fancypantsadventures.webp","categories":["all"]},{"name":"Fancy Pants Adventure 2","link":"https://games.crazygames.com/en_US/fancy-pants-adventure-world/index.html?v=1.273","image":"/assets/media/icons/fancypantsadventures2.webp","categories":["all"]},{"name":"Rooftop Snipers 2","link":"https://h5cdn.github.io/s6/rooftop-snipers-2/","image":"/assets/media/icons/rooftopsnipers2.webp","categories":["all"]},{"name":"Stickman Archero Fight","link":"https://html5.gamedistribution.com/rvvASMiM/3f4c166817ad4fd4b5b05d9adba22fcd/index.html","image":"/assets/media/icons/stickman-archero-fight.webp","categories":["all"]},{"name":"Earn to Die 2012 Part 2","link":"https://games-online.io/game/EarnToDie/index.html","image":"/assets/media/icons/earntodie2012part2.webp","categories":["all"]},{"name":"Lostgamer","link":"https://lostgamer.io","image":"/assets/media/icons/lostgamerio.webp","categories":["all","2P"]},{"name":"Thisissand","link":"https://thisissand.com/","image":"/assets/media/icons/thisissand.webp","categories":["all"]},{"name":"digdig.io","link":"https://digdig.io/","image":"/assets/media/icons/digdigio.webp","categories":["all","2P"]},{"name":"Big Tower Tiny Square","link":"https://www.coolmathgames.com/0-big-tower-tiny-square/play","image":"/assets/media/icons/bigtowertinysquare.webp","categories":["all"]},{"name":"The Impossible Quiz","link":"https://the-impossible-quiz.game-files.crazygames.com/ruffle/theimpossiblequiz.html","image":"/assets/media/icons/theimpossiblequiz.webp","categories":["all"]},{"name":"Helix Jump","link":"https://helix-jump.game-files.crazygames.com/helix-jump/1/index.html","image":"/assets/media/icons/helixjump.webp","categories":["all"]},{"name":"skribbl","link":"https://skribbl.io/","image":"/assets/media/icons/skribblio.webp","categories":["all","2P"]},{"name":"Wings!","link":"https://wings.io/","image":"/assets/media/icons/wingsio.webp","categories":["all","2P"]},{"name":"Stomped.io","link":"https://stomped.io","image":"/assets/media/icons/stompedio.webp","categories":["all"]},{"name":"Age of War","link":"https://age-of-war.game-files.crazygames.com/ruffle/ageofwar.html","image":"/assets/media/icons/ageofwar.webp","categories":["all","2P"]},{"name":"Brain Test","link":"https://0322484b-7a58-4454-9667-f805afffded5.poki-gdn.com/2e6b68d3-0f43-4b84-9c14-ab59f94e566c/index.html?country=US&ccpaApplies=0&url_referrer=https%3A%2F%2Fpoki.com%2F&tag=pg-v3.132.1&site_id=3&iso_lang=en&poki_url=https%3A%2F%2Fpoki.com%2Fen%2Fg%2Fbrain-test-tricky-puzzles&gdhoist=yes&nonPersonalized=n&familyFriendly=n&categories=7%2C16%2C37%2C72%2C96%2C400%2C832%2C843%2C1140%2C1150%2C1159&special_condition=landing&game_id=0322484b-7a58-4454-9667-f805afffded5&game_version_id=2e6b68d3-0f43-4b84-9c14-ab59f94e566c","image":"/assets/media/icons/braintest.webp","categories":["all"]},{"name":"Gladihoppers","link":"https://bonbang.github.io/store99/gladihoppers/index.html","image":"/assets/media/icons/gladihoppers.webp","categories":["all"]},{"name":"Snow Rider 3D","link":"https://html5.gamedistribution.com/rvvASMiM/3b79a8537ebc414fb4f9672a9b8c68c8/index.html?gd_zone_config=eyJwYXJlbnRVUkwiOiJodHRwczovL3Nub3dyaWRlcjNkLmNvbS8iLCJwYXJlbnREb21haW4iOiJzbm93cmlkZXIzZC5jb20iLCJ0b3BEb21haW4iOiJzbm93cmlkZXIzZC5jb20iLCJoYXNJbXByZXNzaW9uIjpmYWxzZSwibG9hZGVyRW5hYmxlZCI6dHJ1ZSwiaG9zdCI6Imh0bWw1LmdhbWVkaXN0cmlidXRpb24uY29tIiwidmVyc2lvbiI6IjEuNS4xNiJ9","image":"/assets/media/icons/snowrider3d.webp","categories":["all"]},{"name":"3 Slices","link":"https://images-opensocial.googleusercontent.com/gadgets/ifr?url=https://s3.amazonaws.com/production-assetsbucket-8ljvyr1xczmb/1ee20621-61bc-4ec8-a8ec-5e839c2e6edc%2F3-slices.xml","image":"/assets/media/icons/3slices.webp","categories":["all"]},{"name":"Buckshot Roulette","link":"https://buckshotroulette.online/game/v11/","image":"/assets/media/icons/buckshotroulette.webp","categories":["all"]},{"name":"Starblast","link":"https://starblast.io","image":"/assets/media/icons/starblastio.webp","categories":["all","2P"]},{"name":"CSGO Parkour","link":"https://yandex.com/games/app/203069?flags={%22adv_sticky_banner_disabled%22:true}","image":"/assets/media/icons/csgoparkour.webp","categories":["all"]},{"name":"Parkour Block 3D","link":"https://html5.gamedistribution.com/1461d40bb77f48e6be72489959a1ac04/","image":"/assets/media/icons/parkourblock3d.webp","categories":["all"]},{"name":"Jelly Mario","link":"https://jellymar.io","image":"/assets/media/icons/jellymario.webp","categories":["all"]},{"name":"Tyran.io","link":"https://tyran.io","image":"/assets/media/icons/tyranio.webp","categories":["all","2P"]},{"name":"Arras.io","link":"https://arras.io/","image":"/assets/media/icons/arrasio.webp","categories":["all","2P"]},{"name":"mk48.io","link":"https://mk48.io/","image":"/assets/media/icons/mk48io.webp","categories":["all","2P"]},{"name":"Bandit.RIP","link":"https://bandit.rip/","image":"/assets/media/icons/banditrip.webp","categories":["all","2P"]},{"name":"Addicting Games","link":"https://www.addictinggames.com/","image":"/assets/media/icons/addictinggames.webp","categories":["all"]},{"name":"Deeeep.io","link":"https://beta.deeeep.io","image":"/assets/media/icons/deeeepio.webp","categories":["all","2P"]},{"name":"ev.io","link":"https://ev.io","image":"/assets/media/icons/evio.webp","categories":["all","2P"]},{"name":"Brain Test 2","link":"https://games.poki.com/458768/df221093-aae9-4c0d-b458-efb16ae8e3ab","image":"/assets/media/icons/braintest2.webp","categories":["all"]},{"name":"Brain Test 3","link":"https://games.poki.com/458768/1f3ae540-a95f-4f20-a000-29512612e341","image":"/assets/media/icons/braintest3.webp","categories":["all"]},{"name":"Donitz - itch.io","link":"https://donitz.itch.io/","image":"/assets/media/icons/itch.webp","categories":["all"]},{"name":"Territorial.io","link":"https://territorial.io","image":"/assets/media/icons/territorialio.webp","categories":["all","2P"]},{"name":"Stickman Hook","link":"/e/stickman-hook/index.html","image":"/assets/media/icons/stickmanhook.webp","categories":["all","local"]},{"name":"Tube Jumpers","link":"https://unblocked76.github.io/tube-jumpers/","image":"/assets/media/icons/tubejumpers.webp","categories":["all","2P"]},{"name":"Tunnel Rush","link":"https://5dd2e8e4-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/5627efae-e960-407d-82a5-3da708eb4e68/index.html","image":"/assets/media/icons/tunnelrush.webp","categories":["all","2P"]},{"name":"Tunnel Rush 2","link":"https://a7e6d137-c3c1-46e6-a3db-04c2d33c98a8.poki-gdn.com/71e6bddd-9b0e-4621-a11a-9503086f69d5/index.html","image":"/assets/media/icons/tunnelrush2.webp","categories":["all"]},{"name":"Rainbow Obby","link":"https://785a4295-96c4-43e5-b237-fb07fc3ef44d.poki-gdn.com/f1d39f75-7a25-41de-86cf-ba00804737b5/index.html","image":"/assets/media/icons/rainbowobby.webp","categories":["all","2P"]},{"name":"Candy Jump","link":"https://candyjump.games235.com/","image":"/assets/media/icons/candyjump.webp","categories":["all"]},{"name":"Google Feud","link":"https://googlefeud.com/","image":"/assets/media/icons/googlefeud.webp","categories":["all"]},{"name":"Minecraft Classic","link":"https://classic.minecraft.net","image":"/assets/media/icons/mc.webp","categories":["all","2P"]},{"name":"Learn to Fly 3","link":"https://www.silvergames.com/en/learn-to-fly-3/iframe","image":"/assets/media/icons/learntofly3.webp","categories":["all"]},{"name":"Neal.Fun","link":"https://neal.fun","image":"/assets/media/icons/nealfun.webp","categories":["all"],"error":"true","say":"Neal.fun does not work on Interstellar because of Cloudflare protection."},{"name":"YoHoHo.io","link":"https://yohoho.io/","image":"/assets/media/icons/yohoho.webp","categories":["all","2P"]},{"name":"AntWar.io","link":"https://antwar.io/","image":"/assets/media/icons/antwario.webp","categories":["all","2P"]},{"name":"Tetr.io","link":"https://tetr.io/","image":"/assets/media/icons/tetrio.webp","categories":["all","2P"]},{"name":"Time Shooter 2","link":"https://html5.gamedistribution.com/62a72f2da7cb4b609579a47653546e6a/","image":"/assets/media/icons/timeshooter2.webp","categories":["all"]},{"name":"Merge Fruit","link":"https://html5.gamedistribution.com/2dee9d404697435aa76111eb4015e1d5/","image":"/assets/media/icons/mergefruit.webp","categories":["all"]},{"name":"There Is No Game","link":"https://5dd2d607-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/38959ae1-110b-49ab-86ae-df425fd7862a/index.html","image":"/assets/media/icons/thereisnogame.webp","categories":["all"]},{"name":"Jetpack Joyride","link":"/e/jetpack-joyride/index.html","image":"/assets/media/icons/jetpackjoyride.webp","categories":["all","local"]},{"name":"FeedVid","link":"https://v6p9d9t4.ssl.hwcdn.net/html/4941980-683813/index.html","image":"/assets/media/icons/feedvid.webp","categories":["all"]},{"name":"florr.io","link":"https://florr.io","image":"/assets/media/icons/florr.webp","categories":["all","2P"]},{"name":"Rocket Bot Royale","link":"https://rocketbotroyale2.winterpixel.io/","image":"/assets/media/icons/rocketbotroyale.webp","categories":["all"]},{"name":"Happy Wheels","link":"https://files.crazygames.com/ruffle/happywheels.html","image":"/assets/media/icons/happywheels.webp","categories":["all"]},{"name":"Papa's Burgeria","link":"https://www.coolmathgames.com/0-papas-burgeria/play","image":"/assets/media/icons/papasburgeria.webp","categories":["all"]},{"name":"Papa's Cheeseria","link":"https://www.coolmathgames.com/0-papas-cheeseria/play","image":"/assets/media/icons/papascheeseria.webp","categories":["all"]},{"name":"Papa's Pancakeria","link":"https://www.coolmathgames.com/0-papas-pancakeria/play","image":"/assets/media/icons/papaspancakeria.webp","categories":["all"]},{"name":"Papa's Wingeria","link":"https://www.coolmathgames.com/0-papas-wingeria/play","image":"/assets/media/icons/papaswingeria.webp","categories":["all"]},{"name":"Riddle School 1","link":"https://uploads.ungrounded.net/ruffle_wrapper/ruffleembed.html?v=1.0.67&browsermode=default&props=%7B%22ruffle%22%3A%22%2Fruffle_wrapper%2Flib%2Fruffle.js%3F1695474658%22%2C%22public_path%22%3A%22%2Fruffle_wrapper%2Flib%2F%22%2C%22swf%22%3A%22https%3A%2F%2Fuploads.ungrounded.net%2F314000%2F314680_Riddle_School.swf%3F1148577264%22%2C%22vars%22%3A%7B%22NewgroundsAPI_PublisherID%22%3A1%2C%22NewgroundsAPI_SandboxID%22%3A%2265103f0745c96%22%2C%22NewgroundsAPI_SessionID%22%3A%22%22%2C%22NewgroundsAPI_UserName%22%3A%22%26lt%3Bdeleted%26gt%3B%22%2C%22NewgroundsAPI_UserID%22%3A0%2C%22ng_username%22%3A%22%26lt%3Bdeleted%26gt%3B%22%7D%2C%22width%22%3A550%2C%22height%22%3A400%2C%22icon%22%3A%22https%3A%2F%2Fpicon.ngfiles.com%2F314000%2Fflash_314680_card.webp%3Ff1607914286%22%2C%22warnOnUnsupportedContent%22%3Afalse%7D","image":"/assets/media/icons/riddle-school.webp","categories":["all"]},{"name":"Powerline.IO","link":"https://powerline.io","image":"/assets/media/icons/powerline.webp","categories":["all","2P"]},{"name":"Papa's Scooperia","link":"https://files.crazygames.com/ruffle/papasscooperia.html","image":"/assets/media/icons/papasscooperia.webp","categories":["all"]},{"name":"Papa's Sushiria","link":"https://files.crazygames.com/ruffle/papassushiria.html","image":"/assets/media/icons/papassushiria.webp","categories":["all"]},{"name":"Burrito Bison","link":"https://f.silvergames.com/awayfl/index.html?swf=burrito-bison.swf","image":"/assets/media/icons/burritobison.webp","categories":["all"]},{"name":"Fireboy And Watergirl 2 In The Light Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40210/","image":"/assets/media/icons/fireboyandwatergirllighttemple.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 4 In The Crystal Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40212/","image":"/assets/media/icons/fireboyandwatergirlcrystaltemple.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 5: Elements","link":"https://www.coolmathgames.com/sites/default/files/public_games/40218","image":"/assets/media/icons/fireboyandwatergirlelements.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 6: Fairy Tales","link":"https://html5.gamedistribution.com/rvvASMiM/be3cff113c4e4f069b7614851825ffe9/index.html","image":"/assets/media/icons/fireboyandwatergirlfairytales.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl In The Forest Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40034/","image":"/assets/media/icons/fireboyandwatergirlforesttemple.webp","categories":["all","2P"]},{"name":"Gunspin","link":"https://html5.gamedistribution.com/rvvASMiM/917cce8c44c44638a8cdc2a1794b65c8/index.html","image":"/assets/media/icons/gunspin.webp","categories":["all"]},{"name":"Thelast Royale","link":"https://thelast.io","image":"/assets/media/icons/thelast-io.webp","categories":["all","2P"]},{"name":"mope.io","link":"https://thelast.io","image":"/assets/media/icons/mope-io.webp","categories":["all","2P"]},{"name":"Tiny Fishing","link":"https://www.dob5.com/d/file/games/tiny-fishing/","image":"/assets/media/icons/tinyfishing.webp","categories":["all"]},{"name":"Johnny Upgrade","link":"https://lagged.com/api/play2/johnny-upgrade3/","image":"/assets/media/icons/johnnyupgrade.webp","categories":["all"]},{"name":"bloxd.io","link":"https://bloxd.io","image":"/assets/media/icons/bloxd-io.webp","categories":["all","2P"]},{"name":"Duck Life 1","link":"https://www.hoodamath.com/mobile/games/duck-life/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 2","link":"https://www.hoodamath.com/mobile/games/duck-life-2-world-champion/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 3","link":"https://www.hoodamath.com/mobile/games/duck-life-3-evolution/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 4","link":"/e/ducklife4/index.html","image":"/assets/media/icons/dl4.webp","categories":["all","local"],"load":true},{"name":"Papa's Freezeria","link":"https://www.coolmathgames.com/0-papas-freezeria/play","image":"/assets/media/icons/papasfreezeria.webp","categories":["all","2P"]},{"name":"Evades","link":"https://evades.io","image":"/assets/media/icons/evadesio.webp","categories":["all,","2P"]},{"name":"Bullet Force Multiplayer","link":"https://www.crazygames.com/game/bullet-force-multiplayer","image":"/assets/media/icons/BFM.webp","categories":["all,","2P"]},{"name":"Crazy Games","link":"https://www.crazygames.com/","image":"/assets/media/icons/crazy.webp","categories":["all,","emu,","2P,","sports,","flash"]},{"name":"Cubes 2048","link":"https://www.crazygames.com/game/cubes-2048-io","image":"/assets/media/icons/C2048.webp","categories":["all,","2P"]},{"name":"DOOM","link":"https://archive.org/details/doom-play","image":"/assets/media/icons/DOOM.webp","categories":["all,","emu"]},{"name":"FNAF 2","link":"https://sussygamedeveloper.github.io/FNAF2/","image":"/assets/media/icons/FNAF2.webp","categories":["all"]},{"name":"FNAF 3","link":"https://sussygamedeveloper.github.io/fnaf3/","image":"/assets/media/icons/FNAF3.webp","categories":["all"]},{"name":"FNAF Web","link":"https://wellsousaaa.github.io/Five-Nights-at-Freddys-Web/","image":"/assets/media/icons/FNAFWeb.webp","categories":["all"]},{"name":"Riddle School 4","link":"https://riddle-school-4.game-files.crazygames.com/ruffle/riddleschool4.html","image":"/assets/media/icons/rs4.webp","categories":["all"]},{"name":"Riddle School 5","link":"https://riddle-school-5.game-files.crazygames.com/ruffle/riddleschool5.html","image":"/assets/media/icons/rs5.webp","categories":["all"]},{"name":"GBA Emulator","link":"https://ds.44670.org/gba/","image":"/assets/media/icons/gba.webp","categories":["all,","emu"]},{"name":"Itch.io","link":"https://itch.io","image":"/assets/media/icons/itch.webp","categories":["all,","emu,","2P"]},{"name":"N-Gon","link":"https://landgreen.github.io/sidescroller/","image":"/assets/media/icons/NGON.webp","categories":["all"]},{"name":"Nintendo DS Emulator","link":"https://ds.44670.org/","image":"/assets/media/icons/ds.webp","categories":["all,","emu"]},{"name":"Nintendo 64 Emulator","link":"https://www.neilb.net/n64wasm/","image":"/assets/media/icons/N64.webp","categories":["all,","emu"]},{"name":"Playstation 2 Emulator","link":"https://playjs.purei.org/","image":"/assets/media/icons/PS2.webp","categories":["all,","emu"]},{"name":"Run 3","link":"https://www.coolmathgames.com/0-run-3/play","image":"/assets/media/icons/run3.webp","categories":["all,","flash"]},{"name":"Subway Surfers: San Francisco ","link":"https://raw.githack.com/3kh0/3kh0-assets/main/subway-surfers/index.html","image":"/assets/media/icons/SF.webp","categories":["all,","emu"]},{"name":"Survivor.io","link":"https://html5.gamedistribution.com/rvvASMiM/f1c451e586c04b4c8cba01b0c50d9090/index.html","image":"/assets/media/icons/SVI.webp","categories":["all,","emu"]},{"name":"Web Retro","link":"/e/index.html","image":"/assets/media/icons/webretro.webp","categories":["all,","emu","local"]},{"name":"Slope","link":"https://watchdocumentaries.com/wp-content/uploads/games/slope/","image":"/assets/media/icons/slope.webp","categories":["all"]},{"name":"Fortnite (Geforce NOW)","link":"https://play.geforcenow.com/mall/#/deeplink?game-id=46bfab06-d864-465d-9e56-2d9e45cdee0a","image":"/assets/media/icons/fortnite.webp","categories":["all"]},{"name":"Bomb Party","link":"https://jklm.fun","image":"/assets/media/icons/BP.webp","categories":["all,","2P"]},{"name":"1","link":"/e/1/1/index.html","image":"/assets/media/icons/1.webp","categories":["all","local"]},{"name":"1v1.LOL","link":"https://1v1.lol","image":"/assets/media/icons/1v1-lol.webp","categories":["all,","2P"]},{"name":"2D Rocket League","link":"https://v6p9d9t4.ssl.hwcdn.net/html/3325334/index.html","image":"/assets/media/icons/2D-Rocket-League.webp","categories":["all"]},{"name":"3D Dino Game","link":"https://lagged.com/api/play2/t-rex-3d2/","image":"/assets/media/icons/trex-run-3D.webp","categories":["all"]},{"name":"60 Sec. Burger Run","link":"https://www.coolmathgames.com/0-60-second-burger-run/play","image":"/assets/media/icons/60-second-burger-run.webp","categories":["all"]},{"name":"8 Ball Pool","link":"https://8ball-pool.io","image":"/assets/media/icons/8ball.webp","categories":["all"]},{"name":"A Dark Room","link":"https://adarkroom.doublespeakgames.com","image":"/assets/media/icons/ADR.webp","categories":["all"]},{"name":"Ace Attorney","link":"https://f.kbhgames.com/r/gba/?r=ace-attorney","image":"/assets/media/icons/aa.webp","categories":["all"]},{"name":"AC - Wild World","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/10/animal-crossing-wild-world1.zip","image":"/assets/media/icons/acww.webp","categories":["all"]},{"name":"Adventure Capitalist","link":"https://than1089.github.io/adventure-capitalist/","image":"/assets/media/icons/adventure-capitalist.webp","categories":["all"]},{"name":"Agar.io","link":"https://agar.io","image":"/assets/media/icons/agario.webp","categories":["all"]},{"name":"Among Us (Scratch)","link":"https://turbowarp.org/523967150/fullscreen","image":"/assets/media/icons/scratch-among-us.webp","categories":["all"]},{"name":"Apex Legends","link":"https://play.geforcenow.com/games?game-id=cb2b1b5f-54ba-45fd-9839-96bbfe1376cd&lang=en_US&asset-id=01_c6efce00-e91e-402a-8b72-f4971f89c528","image":"/assets/media/icons/apex.webp","categories":["all"]},{"name":"Basket Random","link":"https://html5.gamedistribution.com/rvvASMiM/bf1268dccb5d43e7970bb3edaa54afc8/index.html","image":"/assets/media/icons/br.webp","categories":["all"]},{"name":"Basketball Stars","link":"https://html5.gamedistribution.com/69d78d071f704fa183d75b4114ae40ec/","image":"/assets/media/icons/basketball-stars.webp","categories":["all"]},{"name":"Basketball Bros","link":"https://www.basketbros.io/","image":"/assets/media/icons/basket-bros.webp","categories":["all"]},{"name":"Basketball Legends","link":"https://www.basketballlegends.fun/gamedata/basketball-legends-2020","image":"/assets/media/icons/basketball-legends.webp","categories":["all"]},{"name":"Biggie Cheese Fight","link":"https://scratch.mit.edu/projects/163771748/fullscreen","image":"/assets/media/icons/biggiecheese.webp","categories":["all"]},{"name":"Bitlife","link":"https://xlegends.github.io/bitlife/","image":"/assets/media/icons/bitlife.webp","categories":["all"]},{"name":"BTD 4","link":"https://en.gameslol.net/data/bloons-td-4/index.html","image":"/assets/media/icons/btd4.webp","categories":["all"]},{"name":"BuildNow.GG","link":"https://games.crazygames.com/en_US/buildnow-gg/index.html","image":"/assets/media/icons/build-now.webp","categories":["all"]},{"name":"Cat Ninja","link":"https://4iapq88o5f3gc1dij3it0mp5jojnm3jr-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://s3.amazonaws.com/production-assetsbucket-8ljvyr1xczmb/1ee20621-61bc-4ec8-a8ec-5e839c2e6edc%252Fcat-ninja.xml","image":"/assets/media/icons/cat-ninja.webp","categories":["all"]},{"name":"Candy Box","link":"https://candybox2.net","image":"/assets/media/icons/candybox.webp","categories":["all"]},{"name":"Celeste PICO-8","link":"https://exok.com/minigames/celeste.html","image":"/assets/media/icons/celeste.webp","categories":["all"]},{"name":"Clicker Heros","link":"https://www.clickerheroes.com/play.html","image":"/assets/media/icons/clickerheros.webp","categories":["all"]},{"name":"Chess.com","link":"https://chess.com","image":"/assets/media/icons/chess.webp","categories":["all"]},{"name":"Cluster Rush","link":"/e/2/Cluster-Rush/index.html","image":"/assets/media/icons/cluster-rush.webp","categories":["all","local"]},{"name":"Cookie Clicker","link":"https://orteil.dashnet.org/cookieclicker/","image":"/assets/media/icons/cookieclicker.webp","categories":["all"]},{"name":"Crossy Road","link":"https://5dd2e1e3-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/169dc11d-e718-4b36-9e60-d5ed5bc07a31/index.html","image":"/assets/media/icons/cr.webp","categories":["all"]},{"name":"Deepest Sword","link":"https://v6p9d9t4.ssl.hwcdn.net/html/4017918/index.html","image":"/assets/media/icons/deepest-sword.webp","categories":["all"]},{"name":"Diep.io","link":"https://diep.io/","image":"/assets/media/icons/diep.webp","categories":["all"]},{"name":"Doge Miner","link":"/e/1/DogeMiner/index.html","image":"/assets/media/icons/doge-miner-1.webp","categories":["all","local"]},{"name":"Doom 1","link":"https://browncha023.github.io/GBA/launcher.html#dm","image":"/assets/media/icons/DOOM.webp","categories":["all"]},{"name":"Doom 2","link":"https://browncha023.github.io/GBA/launcher.html#dm2","image":"/assets/media/icons/doom2.webp","categories":["all"]},{"name":"Dreader","link":"https://donitz.itch.io/dreader","image":"/assets/media/icons/dreader.webp","categories":["all"]},{"name":"Drift Boss","link":"https://watchdocumentaries.com/wp-content/uploads/games/drift-boss/","image":"/assets/media/icons/db.webp","categories":["all"]},{"name":"Drift Hunters","link":"https://webglmath.github.io/drift-hunters/","image":"/assets/media/icons/drift-hunters.webp","categories":["all"]},{"name":"Drive Mad","link":"https://raw.githack.com/3kh0/3kh0-assets/main/drive-mad/index.html","image":"/assets/media/icons/dm.webp","categories":["all"]},{"name":"Fallout 2","link":"https://jonasz-o.itch.io/fallout2remake3d","image":"/assets/media/icons/fallout2.webp","categories":["all"]},{"name":"FNAF 2 (Scratch)","link":"https://scratch.mit.edu/projects/469219637/embed/","image":"/assets/media/icons/FNAF2.webp","categories":["all"]},{"name":"Friday Night Funkin'","link":"https://w8.snokido.com/games/html5/friday-night-funkin/0281/index.html","image":"/assets/media/icons/fnf.webp","categories":["all"]},{"name":"FNF - Lofi Mod","link":"https://fnf.kdata1.com/lofi-funkin/2/","image":"/assets/media/icons/lofi.webp","categories":["all"]},{"name":"FNF VS. Snorlax","link":"https://fnf.kdata1.com/snorlax/1/","image":"/assets/media/icons/snorlax.webp","categories":["all"]},{"name":"JustFall.LOL","link":"https://justfall.lol","image":"/assets/media/icons/just-fall-lol.webp","categories":["all"]},{"name":"Kirby Mirror (GBA)","link":"https://www.retrogames.onl/gba/kirby-mirror-gba.html","image":"/assets/media/icons/kirby.webp","categories":["all"]},{"name":"Krunker","link":"https://krunker.io","image":"/assets/media/icons/krunker.webp","categories":["all"]},{"name":"G-Switch","link":"https://5dd24442-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/4f2c69b4-3edc-4cd7-a078-efd3d1ea9fb5/index.html","image":"/assets/media/icons/gswitch.webp","categories":["all"]},{"name":"G-Switch 2","link":"https://5dd27095-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/e0e70ee4-fdd4-4de8-931d-fde7d1cb408b/index.html","image":"/assets/media/icons/gswitch2.webp","categories":["all"]},{"name":"G-Switch 3","link":"https://5dd2b395-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/120fdec6-7eeb-470f-a43c-9bcdace0dacb/index.html","image":"/assets/media/icons/gswitch3.webp","categories":["all"]},{"name":"Golden Eye 007","link":"https://f.kbhgames.com/r/n64/game.php?file=007-golden-eye.zip","image":"/assets/media/icons/golden-eye-007.webp","categories":["all"]},{"name":"GBA Games 2","link":"https://cattn.github.io/gba/","image":"/assets/media/icons/gba.webp","categories":["all"]},{"name":"Geforce NOW","link":"https://play.geforcenow.com","image":"/assets/media/icons/geforce-now.webp","categories":["all"]},{"name":"Haunted School 1","link":"https://games.crazygames.com/en_US/haunted-school---horror-game/index.html","image":"/assets/media/icons/na.webp","categories":["all"]},{"name":"HexArena","link":"https://hexarena.io/","image":"/assets/media/icons/hexarena.webp","categories":["all"]},{"name":"Hole.IO","link":"https://hole-io.com/","image":"/assets/media/icons/hole.webp","categories":["all"]},{"name":"Idle Breakout","link":"/e/1/idle-breakout/index.html","image":"/assets/media/icons/idlebreakout.webp","categories":["all","local"]},{"name":"Isleward","link":"https://play.isleward.com","image":"/assets/media/icons/isleward.webp","categories":["all"]},{"name":"Interactive Buddy","link":"https://f.silvergames.com/ruffle/player.php?id=204","image":"/assets/media/icons/interactive-buddy.webp","categories":["all"]},{"name":"NGU Idle","link":"https://cache.armorgames.com/files/games/ngu-idle-18444/index.html?v=1559319416","image":"/assets/media/icons/nguidle.webp","categories":["all"]},{"name":"Jacksmith","link":"https://www.coolmathgames.com/0-jacksmith/play","image":"/assets/media/icons/jacksmith.webp","categories":["all"]},{"name":"Sandtrix","link":"https://files.crazygames.com/sandtrix/16/index.html","image":"/assets/media/icons/sandtrix.webp","categories":["all"]},{"name":"Learn To Fly Idle","link":"https://www.gameslol.net/data/waflash/index.php?g=635","image":"/assets/media/icons/ltf_idle.webp","categories":["all"]},{"name":"Lordz.io","link":"https://lordz.io/","image":"/assets/media/icons/lordz.webp","categories":["all"]},{"name":"Masked IO","link":"https://unblocked-games.s3.amazonaws.com/games/masked-io/index.html","image":"/assets/media/icons/masked-forces.webp","categories":["all"]},{"name":"Mario Kart 64","link":"https://static.arcadespot.com/retroemulator.php?system=n64&game=2017/06/mario-kart-64.zip","image":"/assets/media/icons/mario-kart-64.webp","categories":["all"]},{"name":"Mobs Inc","link":"https://overboy.itch.io/mobs-inc","image":"/assets/media/icons/mobsinc.webp","categories":["all"]},{"name":"Monkey Mart","link":"/e/2/monkey-mart/index.html","image":"/assets/media/icons/mm.webp","categories":["all","local"]},{"name":"MooMoo.io","link":"https://moomoo.io","image":"/assets/media/icons/moo.webp","categories":["all"]},{"name":"Mortal Kombat 4","link":"https://f.kbhgames.com/r/n64/game.php?file=Mortal-Kombat-4-U.zip","image":"/assets/media/icons/mortal-kombat-4.webp","categories":["all"]},{"name":"Mr. Mine","link":"https://www.coolmathgames.com/0-mr-mine/play","image":"/assets/media/icons/mrmine.webp","categories":["all"]},{"name":"Moto X3M","link":"https://html5.gamedistribution.com/rvvASMiM/5b0abd4c0faa4f5eb190a9a16d5a1b4c/index.html","image":"/assets/media/icons/mx3m.webp","categories":["all"]},{"name":"MX3M: Pool Party","link":"https://h0jokl1egt0fd4oc8qv3j0tltl9jbqhn-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://649025137-174029463385024710.preview.editmysite.com/uploads/b/139890129-767696982876512205/files/mx3mpp.xml","image":"/assets/media/icons/mx3m.webp","categories":["all"]},{"name":"MX3M: Spooky Land","link":"https://html5.gamedistribution.com/rvvASMiM/b8a342904608470a9f3382337aca3558/index.html","image":"/assets/media/icons/mx3m-spooky.webp","categories":["all"]},{"name":"MX3M: Winter","link":"https://www-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://sites.google.com/site/s017q3e/moto-x3m-4-winter.xml","image":"/assets/media/icons/mx3m-winter.webp","categories":["all"]},{"name":"Saul Run","link":"https://complex-ify.itch.io/saul-goodman","image":"/assets/media/icons/saulrun.webp","categories":["all"]},{"name":"Ninja Cat Exploit","link":"https://html5.gamedistribution.com/rvvASMiM/903ba9346b9d437e9c7e81d672cead44/index.html","image":"/assets/media/icons/ninja-cat.webp","categories":["all"]},{"name":"OvO","link":"https://8rlfg0ch3417et18dp8lvps6uo7c3b2c-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://427396048-642845047394716217.preview.editmysite.com/uploads/b/139890129-761103484729797659/files/ovo.xml","image":"/assets/media/icons/ovo.webp","categories":["all"]},{"name":"Online Racing Game!","link":"https://jchabin.github.io/cars/","image":"/assets/media/icons/OR.webp","categories":["all"]},{"name":"Online Soccer M.","link":"https://www.onlinesoccermanager.com/","image":"/assets/media/icons/osm.webp","categories":["all"]},{"name":"Papa's Bakeria","link":"https://f.silvergames.com/emu/waffle/?id=5458","image":"/assets/media/icons/bakeria.webp","categories":["all"]},{"name":"Papa's Cupcakeria","link":"https://f.silvergames.com/emu/waffle/?id=3246","image":"/assets/media/icons/cupcakeria.webp","categories":["all"]},{"name":"Papa Louie 1","link":"https://f.silvergames.com/ruffle/player.php?id=1373","image":"/assets/media/icons/louie1.webp","categories":["all"]},{"name":"Papa Louie 2","link":"https://f.silvergames.com/emu/waffle/?id=3042","image":"/assets/media/icons/louie2.webp","categories":["all"]},{"name":"Papa Louie 3","link":"https://f.silvergames.com/emu/waffle/?id=4693","image":"/assets/media/icons/papa-louie-3.webp","categories":["all"]},{"name":"Papa's Pizzeria","link":"https://f.silvergames.com/ruffle/player.php?id=1360","image":"/assets/media/icons/pizzeria.webp","categories":["all"]},{"name":"Paper Mario 64","link":"https://f.kbhgames.com/r/n64/game.php?file=Paper%20Mario%20(USA).zip","image":"/assets/media/icons/paper-mario-64.webp","categories":["all"]},{"name":"Paper.io","link":"https://paper-io.com/","image":"/assets/media/icons/paperio.webp","categories":["all"]},{"name":"Pixel Shooter","link":"https://94bfktj403i6m18as4vkvtreqd0ohci4-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://274019683-173520394482650759.preview.editmysite.com/uploads/b/139890129-131715539788281629/files/ps.xml","image":"/assets/media/icons/pixel-shooter.webp","categories":["all"]},{"name":"Pizza Tower","link":"https://gamaverse.com/c/e/g/pizza-tower-1678640389/index.html","image":"/assets/media/icons/pizza-tower.webp","categories":["all"]},{"name":"Pokemon Heart Gold","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/10/pokemon-heartgold-version1.zip","image":"/assets/media/icons/heartgold.webp","categories":["all"]},{"name":"Pokemon Showdown","link":"https://play.pokemonshowdown.com","image":"/assets/media/icons/showdown.webp","categories":["all"]},{"name":"Google Baseball","link":"https://www.google.com/logos/2019/july4th19/r6/july4th19.html","image":"/assets/media/icons/googlebaseball.webp","categories":["all"]},{"name":"Deal or No Deal","link":"https://f.kbhgames.com/RS/game.php?r=//f.kbhgames.com/2018/swf/dondeal2.swf&w=640&h=480&warnsupport=true","image":"/assets/media/icons/deal-or-no-deal.webp","categories":["all"]},{"name":"Deadshot","link":"https://deadshot.io","image":"/assets/media/icons/deadshot.webp","categories":["all"]},{"name":"Rainbow Tower","link":"https://www.mathplayground.com/mobile_rainbow_tower/index.html","image":"/assets/media/icons/rainbowtower.webp","categories":["all"]},{"name":"Doodle Jump","link":"https://doodlejump.pro/","image":"/assets/media/icons/doodlejump.webp","categories":["all"]},{"name":"Madalin Stunt Cars Multiplayer","link":"https://games.crazygames.com/en_US/madalin-cars-multiplayer/index.html","image":"/assets/media/icons/madalinmultiplayer.webp","categories":["all","2P"]},{"name":"Madalin Stunt Cars 2","link":"https://games.crazygames.com/en_US/madalin-stunt-cars-2/index.html","image":"/assets/media/icons/madalinstuntcars2.webp","categories":["all"]},{"name":"Madalin Stunt Cars 3","link":"https://games.crazygames.com/en_US/madalin-stunt-cars-3/index.html","image":"/assets/media/icons/madalinstuntcars3.webp","categories":["all"]},{"name":"PM: Light Platinum","link":"https://browncha023.github.io/GBA/launcher.html#pokemonlp","image":"/assets/media/icons/lp.webp","categories":["all"]},{"name":"Precision Client","link":"https://glcdn.githack.com/3kh0/3kh0-assets/-/raw/main/precision-client/index.html","image":"/assets/media/icons/precision.webp","categories":["all"]},{"name":"Rainbow Six Siege","link":"https://play.geforcenow.com/games?game-id=1dd07d47-6601-42f7-80e9-e4d8db08ea1b&lang=en_US&asset-id=01_44417-48c3d8e642e2","image":"/assets/media/icons/r6.webp","categories":["all"]},{"name":"Red Ball 1","link":"https://www.algebrashelper.com/redball","image":"/assets/media/icons/redball1.webp","categories":["all"]},{"name":"Red Ball 2","link":"https://www.algebrashelper.com/redball-2","image":"/assets/media/icons/redball2.webp","categories":["all"]},{"name":"Red Ball 4","link":"https://www.algebrashelper.com/redball-4","image":"/assets/media/icons/redball4.webp","categories":["all"]},{"name":"Red Ball 4 Vol. 2","link":"https://www.algebrashelper.com/read-ball-4v2","image":"/assets/media/icons/redball4vol2.webp","categories":["all"]},{"name":"Red Ball 4 Vol. 3","link":"https://www.algebrashelper.com/red-ball-4v3","image":"/assets/media/icons/redball4vol3.webp","categories":["all"]},{"name":"Riddle School 2","link":"https://f.silvergames.com/ruffle/player.php?id=8564","image":"/assets/media/icons/rs2.webp","categories":["all"]},{"name":"Riddle School 3","link":"https://riddle-school-3.game-files.crazygames.com/ruffle/riddleschool3.html","image":"/assets/media/icons/rs3.webp","categories":["all"]},{"name":"Rocket Pult","link":"https://v6p9d9t4.ssl.hwcdn.net/html/565140/index.html","image":"/assets/media/icons/rocketpult.webp","categories":["all"]},{"name":"Rooftop Snipers","link":"https://html5.gamedistribution.com/rvvASMiM/c3a70ae98547407a92ebedca8b79fdfa/index.html","image":"/assets/media/icons/rooftop.webp","categories":["all"]},{"name":"Sand Spiel","link":"https://sandspiel.club/","image":"/assets/media/icons/sand.webp","categories":["all"]},{"name":"Sandboxels","link":"https://v6p9d9t4.ssl.hwcdn.net/html/5808591/index.html","image":"/assets/media/icons/sandboxels.webp","categories":["all"]},{"name":"Shapez.IO","link":"https://shapez.io","image":"/assets/media/icons/shapezio.webp","categories":["all"]},{"name":"Shell Shockers","link":"https://shellshock.io/","image":"/assets/media/icons/shell-shockers.webp","categories":["all"]},{"name":"Slither.io","link":"https://slither.io/","image":"/assets/media/icons/slither.webp","categories":["all"]},{"name":"Smash Bros 64","link":"https://emulatorgames.online/games/n64/super-smash-bros","image":"/assets/media/icons/super-smash-bros-64.webp","categories":["all"]},{"name":"Smash Karts","link":"https://smashkarts.io/","image":"/assets/media/icons/smashkarts.webp","categories":["all"]},{"name":"Snowball.io","link":"https://games.crazygames.com/en_US/snowball-io/index.html","image":"/assets/media/icons/snowball.webp","categories":["all"]},{"name":"Space Plan","link":"https://jhollands.co.uk/spaceplan/","image":"/assets/media/icons/spaceplan.webp","categories":["all"]},{"name":"Stumble Guys","link":"https://www.stumbleguys.com/play","image":"/assets/media/icons/stumble-guys.webp","categories":["all"]},{"name":"Stumble Guys Clone","link":"https://stumble-guys.io/stumble-guys.embed","image":"/assets/media/icons/stumble-guys.webp","categories":["all"]},{"name":"Sugar Sugar HTML5","link":"https://66564262-37c6-4095-a731-535342e4bbe4.poki-gdn.com/5bd6e8c6-381d-4de5-9823-96662d29afaf/index.html","image":"/assets/media/icons/sugarsugar.webp","categories":["all"]},{"name":"Super Mario 63","link":"https://www.numuki.com/gameframe/super-mario-63","image":"/assets/media/icons/sm63.webp","categories":["all"]},{"name":"Super Mario 64","link":"https://f.kbhgames.com/r/n64/game.php?file=32112_super-mario-64-usa.zip","image":"/assets/media/icons/sm64.webp","categories":["all"]},{"name":"Super Smash Flash","link":"https://f.kbhgames.com/RS/game.php?r=//f.kbhgames.com/2018/swf/smashflash.swf&w=1521&h=753","image":"/assets/media/icons/ssf1.webp","categories":["all"]},{"name":"Supply Chain Idle","link":"https://chat.kongregate.com/gamez/0027/1653/live/index.html?kongregate_game_version=1554392772","image":"/assets/media/icons/supplychainlogo.webp","categories":["all"]},{"name":"Taming.io","link":"https://taming.io/","image":"/assets/media/icons/tamingio.webp","categories":["all"]},{"name":"Temple of Boom","link":"https://temple-of-boom.github.io/file/","image":"/assets/media/icons/templeofboom.webp","categories":["all","2P"]},{"name":"Tanuki Sunset","link":"https://watchdocumentaries.com/wp-content/uploads/games/tanuki-sunset","image":"/assets/media/icons/tanuki.webp","categories":["all"]},{"name":"The Simpsons","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/11/the-simpsons-game.zip","image":"/assets/media/icons/the-simpsons-game.webp","categories":["all"]},{"name":"Temple Run 2","link":"https://watchdocumentaries.com/wp-content/uploads/games/temple-run-2/","image":"/assets/media/icons/temple-run-2.webp","categories":["all"]},{"name":"Twitch Tetris","link":"https://www.rossipotti.de/ausgabe28/tetris/controls.html","image":"/assets/media/icons/na.webp","categories":["all"]},{"name":"Voxiom.io","link":"https://voxiom.io/","image":"/assets/media/icons/voxiom.webp","categories":["all"]},{"name":"Zombs.io","link":"https://zombs.io/","image":"/assets/media/icons/zombs-io.webp","categories":["all"]},{"name":"Zombs Royale","link":"https://zombsroyale.io","image":"/assets/media/icons/zombs-royale.webp","categories":["all,","2P"]},{"name":"GBA Games","link":"https://real-sgs.vercel.app/Tools/GBA-Emulator","image":"/assets/media/icons/gba.webp","categories":["all"]},{"name":"Retro Bowl","link":"/e/2/retro/index.html","image":"/assets/media/icons/retro.webp","categories":["all,","sports","local"]},{"name":"Roblox (Now.GG)","link":"https://now.gg/iframe/snippet?app_pkg=com.roblox.client&partner=interstellar","image":"/assets/media/icons/roblox.webp","categories":["all","emu","android"]},{"name":"Madden NFL 24","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.maddennfl21mobile&partner=interstellar","image":"/assets/media/icons/maddennfl24.webp","categories":["all","emu","android"]},{"name":"Android","link":"https://now.gg/iframe/snippet?app_pkg=com.uncube.launcher3&partner=interstellar","image":"/assets/media/icons/android.webp","categories":["all","emu","android"]},{"name":"Genshin Impact","link":"https://now.gg/iframe/snippet?app_pkg=com.miHoYo.GenshinImpact&partner=interstellar","image":"/assets/media/icons/genshinimpact.webp","categories":["all","emu","android"]},{"name":"Fortnite (Now.GG)","link":"https://now.gg/iframe/snippet?app_pkg=com.epicgames.fortnite&partner=interstellar","image":"/assets/media/icons/fortnite.webp","categories":["all","emu","android"]},{"name":"EA SPORTS FC™ MOBILE 24 SOCCER","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.fifamobile&partner=interstellar","image":"/assets/media/icons/easports-fcmobile24.webp","categories":["all","emu","android"]},{"name":"EA SPORTS™ UFC® Mobile 2","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.easportsufc2&partner=interstellar","image":"/assets/media/icons/easports-ufc.webp","categories":["all","emu","android"]},{"name":"Melon Playground","link":"https://now.gg/iframe/snippet?app_pkg=com.studio27.MelonPlayground&partner=interstellar","image":"/assets/media/icons/melonplayground.webp","categories":["all","emu","android"]},{"name":"Solar Smash","link":"https://now.gg/iframe/snippet?app_pkg=com.paradyme.solarsmash&partner=interstellar","image":"/assets/media/icons/solarsmash.webp","categories":["all","emu","android"]},{"name":"Bloons TD Battles 2","link":"https://now.gg/iframe/snippet?app_pkg=com.ninjakiwi.bloonstdbattles2&partner=interstellar","image":"/assets/media/icons/bloonstd2.webp","categories":["all","emu","android"]},{"name":"Bloons TD Battles","link":"https://now.gg/iframe/snippet?app_pkg=com.ninjakiwi.bloonstdbattles&partner=interstellar","image":"/assets/media/icons/bloonstd.webp","categories":["all","emu","android"]},{"name":"Cookie Run Kingdom","link":"https://now.gg/iframe/snippet?app_pkg=com.devsisters.ck&partner=interstellar","image":"/assets/media/icons/cookierunkingdom.webp","categories":["all","emu","android"]},{"name":"Character AI","link":"https://now.gg/iframe/snippet?app_pkg=ai.character.app&partner=interstellar","image":"/assets/media/icons/characterai.webp","categories":["all","emu","android"]},{"name":"Aptoide","link":"https://now.gg/iframe/snippet?app_pkg=com.aptoide.partners.nowgg.store&partner=interstellar","image":"/assets/media/icons/aptoide.webp","categories":["all","emu","android"]},{"name":"Akinator","link":"https://now.gg/iframe/snippet?app_pkg=com.digidust.elokence.akinator.freemium&partner=interstellar","image":"/assets/media/icons/akinator.webp","categories":["all","emu","android"]},{"name":"WorldBox","link":"https://now.gg/iframe/snippet?app_pkg=com.mkarpenko.worldbox&partner=interstellar","image":"/assets/media/icons/worldbox.webp","categories":["all","emu","android"]},{"name":"Toca Life World","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocalifeworld&partner=interstellar","image":"/assets/media/icons/tocalifeworld.webp","categories":["all","emu","android"]},{"name":"Toca Hair Salon 4","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocahairsalon4&partner=interstellar","image":"/assets/media/icons/tocabocahairsalon4.webp","categories":["all","emu","android"]},{"name":"Toca Kitchen 2","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocakitchen2&partner=interstellar","image":"/assets/media/icons/tocakitchen2.webp","categories":["all","emu","android"]},{"name":"Free Fire","link":"https://now.gg/iframe/snippet?app_pkg=com.dts.freefireth&partner=interstellar","image":"/assets/media/icons/freefire.webp","categories":["all","emu","android"]},{"name":"Stumble Guys (Android)","link":"https://now.gg/iframe/snippet?app_pkg=com.kitkagames.fallbuddies&partner=interstellar","image":"/assets/media/icons/stumble-guys.webp","categories":["all","emu","android"]},{"name":"Now.GG","link":"https://now.gg","image":"/assets/media/icons/now-gg.webp","categories":["all","emu","android"]},{"name":"Roblox (NowGG.me) [Working]","link":"https://nowgg.me/apps/roblox-corporation/5349/roblox.html","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Now.GG (NowGG.me) [Working]","link":"https://nowgg.me","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Parappa the Rapper","link":"https://retrogamesonline.io/parappa-the-rapper.embed","image":"/assets/media/icons/ptr.webp","categories":["all","emu"]},{"name":"Half-Life","link":"https://x8bitrain.github.io/webXash/","image":"/assets/media/icons/half-life.webp","categories":["all"]},{"name":"Kiomet","link":"https://kiomet.com","image":"/assets/media/icons/kiomet.webp","categories":["all"]},{"name":"Tribals.io","link":"https://tribals.io/","image":"/assets/media/icons/tribalsio.webp","categories":["all"]},{"name":"Counter Strike 1.6","link":"https://play-cs.com/en/servers","image":"/assets/media/icons/cs16.webp","categories":["all"]},{"name":"Narrow One","link":"https://narrow.one","image":"/assets/media/icons/narrowone.webp","categories":["all"]},{"name":"Kirka","link":"https://kirka.io","image":"/assets/media/icons/kirka.webp","categories":["all"]},{"name":"Cryzen","link":"https://cryzen.io","image":"/assets/media/icons/cryzen.webp","categories":["all"]},{"name":"Hordes","link":"https://hordes.io","image":"/assets/media/icons/hordes.webp","categories":["all"]},{"name":"Venge","link":"https://venge.io","image":"/assets/media/icons/venge.webp","categories":["all"]},{"name":"Minecraft 1.5.2 (Eaglercraft)","link":"/e/2/eag15/index.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Minecraft 1.8 (Eaglercraft)","link":"/e/2/eag18/offline.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Minecraft 1.8 (Eagler WASM)","link":"/e/2/eag18/wasm.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Getaway S.","link":"https://www.twoplayergames.org/embed/getaway-shootout","image":"/assets/media/icons/getaway.webp","categories":["all","2P"]},{"name":"2048","link":"/e/1/2048/index.html","image":"/assets/media/icons/2048.webp","categories":["all","local"]},{"name":"2048 Multitasking","link":"/e/1/2048-multitask/index.html","image":"/assets/media/icons/2048.webp","categories":["all","local"]},{"name":"Vex 7","link":"/e/1/vex7/index.html","image":"/assets/media/icons/vex7.webp","categories":["all","local"]},{"name":"Vex 6","link":"/e/1/vex6/index.html","image":"/assets/media/icons/vex6.webp","categories":["all","local"]},{"name":"Vex 5","link":"/e/1/vex5/index.html","image":"/assets/media/icons/vex5.webp","categories":["all","local"]},{"name":"Vex 3","link":"/e/1/vex3/index.html","image":"/assets/media/icons/vex3.webp","categories":["all","local"]},{"name":"Vex 4","link":"/e/1/vex4/index.html","image":"/assets/media/icons/vex4.webp","categories":["all","local"]},{"name":"Windows 96","link":"https://windows96.net","image":"/assets/media/icons/windows96.webp","categories":["all"]},{"name":"The Impossible Quiz: Book 2","link":"https://f.silvergames.com/ruffle/player.php?id=3742","image":"/assets/media/icons/book2.webp","categories":["all","emu"]},{"name":"Wrassling","link":"https://games.poki.com/458768/wrassling","image":"/assets/media/icons/wrassling.webp","categories":["all"]},{"name":"Happy Wheels","link":"https://games-online.io/game/HappyWheels/","image":"/assets/media/icons/hw.webp","categories":["all"]},{"name":"Google Snake Modded","link":"https://googlesnakemods.com/v/current/","image":"/assets/media/icons/snake.webp","categories":["all"]},{"name":"Idle Startup Tycoon","link":"https://www.mortgagecalculator.org/money-games/idle-startup-tycoon/","image":"/assets/media/icons/idlestartup.webp","categories":["all"]},{"name":"Two Player Games","link":"https://www.twoplayergames.org/","image":"/assets/media/icons/tpg.webp","categories":["all"]},{"name":"Five Nights at Winston's","link":"https://g.deev.is/fnaw/","image":"/assets/media/icons/fnaw.webp","categories":["all","game"]},{"name":"Goomy Clicker 2","link":"https://idle-js-games.github.io/goomyClicker2/","image":"/assets/media/icons/gc2.webp","categories":["all"]},{"name":"Space Company","link":"/e/1/space-company/index.html","image":"/assets/media/icons/sc.png","categories":["all","local"]},{"name":"Mario Kart DS","link":"https://seraph.reveriestudios.online/games/mariokartds/index.html","image":"/assets/media/icons/mariokartds.jpg","categories":["all","emu"]},{"name":"Cooking Mama","link":"https://seraph.reveriestudios.online/games/cookingmama/index.html","image":"/assets/media/icons/cookingmama.jpg","categories":["all","emu"]},{"name":"Wordle","link":"https://www.nytimes.com/games/wordle/index.html","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Wordle Unlimited","link":"https://wordleunlimited.org/","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Wordly","link":"https://wordly.org/","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Connections","link":"https://www.nytimes.com/games/connections","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Connections Unlimited","link":"https://1games.io/game/connections-game/","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Globle","link":"https://globle.org/?","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Particle Clicker","link":"/e/1/particle-clicker/index.html","image":"/assets/media/icons/pc.png","categories":["all,","local"]},{"name":"ShipCraft.io","link":"https://shipcraft.io/","categories":["all"]},{"name":"Super Mario Bros.","link":"https://emulator-games.pages.dev/nes/Super Mario Bros.","image":"/assets/media/icons/emulator/smb.webp","categories":["all","emu"]},{"name":"Super Mario Bros. 2","link":"https://emulator-games.pages.dev/nes/Super Mario Bros. 2","image":"/assets/media/icons/emulator/smb2.webp","categories":["all","emu"]},{"name":"Super Mario Bros. 3","link":"https://emulator-games.pages.dev/nes/Super Mario Bros. 3","image":"/assets/media/icons/emulator/smb3.webp","categories":["all","emu"]}] \ No newline at end of file +[{"name":"Request A Game","link":"https://forms.gle/vwdHN3iPz5cLaHaMA","image":"/assets/media/icons/request.webp","categories":["all"]},{"name":"Create Custom Game","image":"/assets/media/icons/custom.webp","categories":["all"],"custom":"true"},{"name":"Fancade","link":"https://play.fancade.com","image":"/assets/media/icon/fancade.jpg","categories":["all"]},{"name":"Amazon Luna","link":"https://luna.amazon.com/","image":"/assets/media/icons/amazon-luna.webp","categories":["all"],"blank":"true"},{"name":"Gartic Phone","link":"https://garticphone.com","image":"/assets/media/icons/garticphone.webp","categories":["all"]},{"name":"Newgrounds","link":"https://newgrounds.com/","image":"/assets/media/icons/newgrounds.webp","categories":["all"]},{"name":"Pranx","link":"https://pranx.com/","image":"/assets/media/icons/pranx.webp","categories":["all"]},{"name":"Steam","link":"https://steampowered.com/","image":"/assets/media/icons/steam.webp","categories":["all"],"say":"Steam can't actually be added because it's an app, not a website. This only lets you browse the Steam website, you can't actually play any games unless you use Geforce Now.","partial":true},{"name":"Swordbattle.io","link":"https://swordbattle.io/","image":"/assets/media/icons/swordbattle.webp","categories":["all","2d"]},{"name":"Stabfish.io","link":"https://stabfish.io/","image":"/assets/media/icons/stabfish.webp","categories":["all","2P"]},{"name":"Dynast.io","link":"https://dynast.io","image":"/assets/media/icons/dynast-io.webp","categories":["all"]},{"name":"Twisted Cooking Mama","link":"https://twisted-cooking-mama.game-files.crazygames.com/ruffle/twisted-cooking-mama/1/twistedcookingmama.html?v=1.273","image":"/assets/media/icons/twistedcookingmama.webp","categories":["all"]},{"name":"Marbles Garden","link":"https://www.coolmathgames.com/0-marbles-garden/play","image":"/assets/media/icons/marblesgarden.webp","categories":["all"]},{"name":"Fancy Pants Adventure","link":"https://games.crazygames.com/en_US/fancy-pants-adventure-world/index.html?v=1.273","image":"/assets/media/icons/fancypantsadventures.webp","categories":["all"]},{"name":"Fancy Pants Adventure 2","link":"https://games.crazygames.com/en_US/fancy-pants-adventure-world/index.html?v=1.273","image":"/assets/media/icons/fancypantsadventures2.webp","categories":["all"]},{"name":"Rooftop Snipers 2","link":"https://h5cdn.github.io/s6/rooftop-snipers-2/","image":"/assets/media/icons/rooftopsnipers2.webp","categories":["all"]},{"name":"Stickman Archero Fight","link":"https://html5.gamedistribution.com/rvvASMiM/3f4c166817ad4fd4b5b05d9adba22fcd/index.html","image":"/assets/media/icons/stickman-archero-fight.webp","categories":["all"]},{"name":"Earn to Die 2012 Part 2","link":"https://games-online.io/game/EarnToDie/index.html","image":"/assets/media/icons/earntodie2012part2.webp","categories":["all"]},{"name":"Lostgamer","link":"https://lostgamer.io","image":"/assets/media/icons/lostgamerio.webp","categories":["all","2P"]},{"name":"Thisissand","link":"https://thisissand.com/","image":"/assets/media/icons/thisissand.webp","categories":["all"]},{"name":"digdig.io","link":"https://digdig.io/","image":"/assets/media/icons/digdigio.webp","categories":["all","2P"]},{"name":"Big Tower Tiny Square","link":"https://www.coolmathgames.com/0-big-tower-tiny-square/play","image":"/assets/media/icons/bigtowertinysquare.webp","categories":["all"]},{"name":"The Impossible Quiz","link":"https://the-impossible-quiz.game-files.crazygames.com/ruffle/theimpossiblequiz.html","image":"/assets/media/icons/theimpossiblequiz.webp","categories":["all"]},{"name":"Helix Jump","link":"https://helix-jump.game-files.crazygames.com/helix-jump/1/index.html","image":"/assets/media/icons/helixjump.webp","categories":["all"]},{"name":"skribbl","link":"https://skribbl.io/","image":"/assets/media/icons/skribblio.webp","categories":["all","2P"]},{"name":"Wings!","link":"https://wings.io/","image":"/assets/media/icons/wingsio.webp","categories":["all","2P"]},{"name":"Stomped.io","link":"https://stomped.io","image":"/assets/media/icons/stompedio.webp","categories":["all"]},{"name":"Age of War","link":"https://age-of-war.game-files.crazygames.com/ruffle/ageofwar.html","image":"/assets/media/icons/ageofwar.webp","categories":["all","2P"]},{"name":"Brain Test","link":"https://0322484b-7a58-4454-9667-f805afffded5.poki-gdn.com/2e6b68d3-0f43-4b84-9c14-ab59f94e566c/index.html?country=US&ccpaApplies=0&url_referrer=https%3A%2F%2Fpoki.com%2F&tag=pg-v3.132.1&site_id=3&iso_lang=en&poki_url=https%3A%2F%2Fpoki.com%2Fen%2Fg%2Fbrain-test-tricky-puzzles&gdhoist=yes&nonPersonalized=n&familyFriendly=n&categories=7%2C16%2C37%2C72%2C96%2C400%2C832%2C843%2C1140%2C1150%2C1159&special_condition=landing&game_id=0322484b-7a58-4454-9667-f805afffded5&game_version_id=2e6b68d3-0f43-4b84-9c14-ab59f94e566c","image":"/assets/media/icons/braintest.webp","categories":["all"]},{"name":"Gladihoppers","link":"https://bonbang.github.io/store99/gladihoppers/index.html","image":"/assets/media/icons/gladihoppers.webp","categories":["all"]},{"name":"Snow Rider 3D","link":"https://html5.gamedistribution.com/rvvASMiM/3b79a8537ebc414fb4f9672a9b8c68c8/index.html?gd_zone_config=eyJwYXJlbnRVUkwiOiJodHRwczovL3Nub3dyaWRlcjNkLmNvbS8iLCJwYXJlbnREb21haW4iOiJzbm93cmlkZXIzZC5jb20iLCJ0b3BEb21haW4iOiJzbm93cmlkZXIzZC5jb20iLCJoYXNJbXByZXNzaW9uIjpmYWxzZSwibG9hZGVyRW5hYmxlZCI6dHJ1ZSwiaG9zdCI6Imh0bWw1LmdhbWVkaXN0cmlidXRpb24uY29tIiwidmVyc2lvbiI6IjEuNS4xNiJ9","image":"/assets/media/icons/snowrider3d.webp","categories":["all"]},{"name":"3 Slices","link":"https://images-opensocial.googleusercontent.com/gadgets/ifr?url=https://s3.amazonaws.com/production-assetsbucket-8ljvyr1xczmb/1ee20621-61bc-4ec8-a8ec-5e839c2e6edc%2F3-slices.xml","image":"/assets/media/icons/3slices.webp","categories":["all"]},{"name":"Buckshot Roulette","link":"https://buckshotroulette.online/game/v11/","image":"/assets/media/icons/buckshotroulette.webp","categories":["all"]},{"name":"Starblast","link":"https://starblast.io","image":"/assets/media/icons/starblastio.webp","categories":["all","2P"]},{"name":"CSGO Parkour","link":"https://yandex.com/games/app/203069?flags={%22adv_sticky_banner_disabled%22:true}","image":"/assets/media/icons/csgoparkour.webp","categories":["all"]},{"name":"Parkour Block 3D","link":"https://html5.gamedistribution.com/1461d40bb77f48e6be72489959a1ac04/","image":"/assets/media/icons/parkourblock3d.webp","categories":["all"]},{"name":"Jelly Mario","link":"https://jellymar.io","image":"/assets/media/icons/jellymario.webp","categories":["all"]},{"name":"Tyran.io","link":"https://tyran.io","image":"/assets/media/icons/tyranio.webp","categories":["all","2P"]},{"name":"Arras.io","link":"https://arras.io/","image":"/assets/media/icons/arrasio.webp","categories":["all","2P"]},{"name":"mk48.io","link":"https://mk48.io/","image":"/assets/media/icons/mk48io.webp","categories":["all","2P"]},{"name":"Bandit.RIP","link":"https://bandit.rip/","image":"/assets/media/icons/banditrip.webp","categories":["all","2P"]},{"name":"Addicting Games","link":"https://www.addictinggames.com/","image":"/assets/media/icons/addictinggames.webp","categories":["all"]},{"name":"Deeeep.io","link":"https://beta.deeeep.io","image":"/assets/media/icons/deeeepio.webp","categories":["all","2P"]},{"name":"ev.io","link":"https://ev.io","image":"/assets/media/icons/evio.webp","categories":["all","2P"]},{"name":"Brain Test 2","link":"https://games.poki.com/458768/df221093-aae9-4c0d-b458-efb16ae8e3ab","image":"/assets/media/icons/braintest2.webp","categories":["all"]},{"name":"Brain Test 3","link":"https://games.poki.com/458768/1f3ae540-a95f-4f20-a000-29512612e341","image":"/assets/media/icons/braintest3.webp","categories":["all"]},{"name":"Donitz - itch.io","link":"https://donitz.itch.io/","image":"/assets/media/icons/itch.webp","categories":["all"]},{"name":"Territorial.io","link":"https://territorial.io","image":"/assets/media/icons/territorialio.webp","categories":["all","2P"]},{"name":"Stickman Hook","link":"/gh-games/stickman-hook/index.html","image":"/assets/media/icons/stickmanhook.webp","categories":["all","local"]},{"name":"Tube Jumpers","link":"https://unblocked76.github.io/tube-jumpers/","image":"/assets/media/icons/tubejumpers.webp","categories":["all","2P"]},{"name":"Tunnel Rush","link":"https://5dd2e8e4-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/5627efae-e960-407d-82a5-3da708eb4e68/index.html","image":"/assets/media/icons/tunnelrush.webp","categories":["all","2P"]},{"name":"Tunnel Rush 2","link":"https://a7e6d137-c3c1-46e6-a3db-04c2d33c98a8.poki-gdn.com/71e6bddd-9b0e-4621-a11a-9503086f69d5/index.html","image":"/assets/media/icons/tunnelrush2.webp","categories":["all"]},{"name":"Rainbow Obby","link":"https://785a4295-96c4-43e5-b237-fb07fc3ef44d.poki-gdn.com/f1d39f75-7a25-41de-86cf-ba00804737b5/index.html","image":"/assets/media/icons/rainbowobby.webp","categories":["all","2P"]},{"name":"Candy Jump","link":"https://candyjump.games235.com/","image":"/assets/media/icons/candyjump.webp","categories":["all"]},{"name":"Google Feud","link":"https://googlefeud.com/","image":"/assets/media/icons/googlefeud.webp","categories":["all"]},{"name":"Minecraft Classic","link":"https://classic.minecraft.net","image":"/assets/media/icons/mc.webp","categories":["all","2P"]},{"name":"Learn to Fly 3","link":"https://www.silvergames.com/en/learn-to-fly-3/iframe","image":"/assets/media/icons/learntofly3.webp","categories":["all"]},{"name":"Neal.Fun","link":"https://neal.fun","image":"/assets/media/icons/nealfun.webp","categories":["all"],"error":"true","say":"Neal.fun does not work on Interstellar because of Cloudflare protection."},{"name":"YoHoHo.io","link":"https://yohoho.io/","image":"/assets/media/icons/yohoho.webp","categories":["all","2P"]},{"name":"AntWar.io","link":"https://antwar.io/","image":"/assets/media/icons/antwario.webp","categories":["all","2P"]},{"name":"Tetr.io","link":"https://tetr.io/","image":"/assets/media/icons/tetrio.webp","categories":["all","2P"]},{"name":"Time Shooter 2","link":"https://html5.gamedistribution.com/62a72f2da7cb4b609579a47653546e6a/","image":"/assets/media/icons/timeshooter2.webp","categories":["all"]},{"name":"Merge Fruit","link":"https://html5.gamedistribution.com/2dee9d404697435aa76111eb4015e1d5/","image":"/assets/media/icons/mergefruit.webp","categories":["all"]},{"name":"There Is No Game","link":"https://5dd2d607-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/38959ae1-110b-49ab-86ae-df425fd7862a/index.html","image":"/assets/media/icons/thereisnogame.webp","categories":["all"]},{"name":"Jetpack Joyride","link":"/gh-games/jetpack-joyride/index.html","image":"/assets/media/icons/jetpackjoyride.webp","categories":["all","local"]},{"name":"FeedVid","link":"https://v6p9d9t4.ssl.hwcdn.net/html/4941980-683813/index.html","image":"/assets/media/icons/feedvid.webp","categories":["all"]},{"name":"florr.io","link":"https://florr.io","image":"/assets/media/icons/florr.webp","categories":["all","2P"]},{"name":"Rocket Bot Royale","link":"https://rocketbotroyale2.winterpixel.io/","image":"/assets/media/icons/rocketbotroyale.webp","categories":["all"]},{"name":"Happy Wheels","link":"https://files.crazygames.com/ruffle/happywheels.html","image":"/assets/media/icons/happywheels.webp","categories":["all"]},{"name":"Papa's Burgeria","link":"https://www.coolmathgames.com/0-papas-burgeria/play","image":"/assets/media/icons/papasburgeria.webp","categories":["all"]},{"name":"Papa's Cheeseria","link":"https://www.coolmathgames.com/0-papas-cheeseria/play","image":"/assets/media/icons/papascheeseria.webp","categories":["all"]},{"name":"Papa's Pancakeria","link":"https://www.coolmathgames.com/0-papas-pancakeria/play","image":"/assets/media/icons/papaspancakeria.webp","categories":["all"]},{"name":"Papa's Wingeria","link":"https://www.coolmathgames.com/0-papas-wingeria/play","image":"/assets/media/icons/papaswingeria.webp","categories":["all"]},{"name":"Riddle School 1","link":"https://uploads.ungrounded.net/ruffle_wrapper/ruffleembed.html?v=1.0.67&browsermode=default&props=%7B%22ruffle%22%3A%22%2Fruffle_wrapper%2Flib%2Fruffle.js%3F1695474658%22%2C%22public_path%22%3A%22%2Fruffle_wrapper%2Flib%2F%22%2C%22swf%22%3A%22https%3A%2F%2Fuploads.ungrounded.net%2F314000%2F314680_Riddle_School.swf%3F1148577264%22%2C%22vars%22%3A%7B%22NewgroundsAPI_PublisherID%22%3A1%2C%22NewgroundsAPI_SandboxID%22%3A%2265103f0745c96%22%2C%22NewgroundsAPI_SessionID%22%3A%22%22%2C%22NewgroundsAPI_UserName%22%3A%22%26lt%3Bdeleted%26gt%3B%22%2C%22NewgroundsAPI_UserID%22%3A0%2C%22ng_username%22%3A%22%26lt%3Bdeleted%26gt%3B%22%7D%2C%22width%22%3A550%2C%22height%22%3A400%2C%22icon%22%3A%22https%3A%2F%2Fpicon.ngfiles.com%2F314000%2Fflash_314680_card.webp%3Ff1607914286%22%2C%22warnOnUnsupportedContent%22%3Afalse%7D","image":"/assets/media/icons/riddle-school.webp","categories":["all"]},{"name":"Powerline.IO","link":"https://powerline.io","image":"/assets/media/icons/powerline.webp","categories":["all","2P"]},{"name":"Papa's Scooperia","link":"https://files.crazygames.com/ruffle/papasscooperia.html","image":"/assets/media/icons/papasscooperia.webp","categories":["all"]},{"name":"Papa's Sushiria","link":"https://files.crazygames.com/ruffle/papassushiria.html","image":"/assets/media/icons/papassushiria.webp","categories":["all"]},{"name":"Burrito Bison","link":"https://f.silvergames.com/awayfl/index.html?swf=burrito-bison.swf","image":"/assets/media/icons/burritobison.webp","categories":["all"]},{"name":"Fireboy And Watergirl 2 In The Light Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40210/","image":"/assets/media/icons/fireboyandwatergirllighttemple.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 4 In The Crystal Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40212/","image":"/assets/media/icons/fireboyandwatergirlcrystaltemple.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 5: Elements","link":"https://www.coolmathgames.com/sites/default/files/public_games/40218","image":"/assets/media/icons/fireboyandwatergirlelements.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl 6: Fairy Tales","link":"https://html5.gamedistribution.com/rvvASMiM/be3cff113c4e4f069b7614851825ffe9/index.html","image":"/assets/media/icons/fireboyandwatergirlfairytales.webp","categories":["all","2P"]},{"name":"Fireboy And Watergirl In The Forest Temple","link":"https://www.coolmathgames.com/sites/default/files/public_games/40034/","image":"/assets/media/icons/fireboyandwatergirlforesttemple.webp","categories":["all","2P"]},{"name":"Gunspin","link":"https://html5.gamedistribution.com/rvvASMiM/917cce8c44c44638a8cdc2a1794b65c8/index.html","image":"/assets/media/icons/gunspin.webp","categories":["all"]},{"name":"Thelast Royale","link":"https://thelast.io","image":"/assets/media/icons/thelast-io.webp","categories":["all","2P"]},{"name":"mope.io","link":"https://thelast.io","image":"/assets/media/icons/mope-io.webp","categories":["all","2P"]},{"name":"Tiny Fishing","link":"https://www.dob5.com/d/file/games/tiny-fishing/","image":"/assets/media/icons/tinyfishing.webp","categories":["all"]},{"name":"Johnny Upgrade","link":"https://lagged.com/api/play2/johnny-upgrade3/","image":"/assets/media/icons/johnnyupgrade.webp","categories":["all"]},{"name":"bloxd.io","link":"https://bloxd.io","image":"/assets/media/icons/bloxd-io.webp","categories":["all","2P"]},{"name":"Duck Life 1","link":"https://www.hoodamath.com/mobile/games/duck-life/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 2","link":"https://www.hoodamath.com/mobile/games/duck-life-2-world-champion/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 3","link":"https://www.hoodamath.com/mobile/games/duck-life-3-evolution/game.html","image":"/assets/media/icons/ducklife.webp","categories":["all"]},{"name":"Duck Life 4","link":"/gh-games/ducklife4/index.html","image":"/assets/media/icons/dl4.webp","categories":["all","local"],"load":true},{"name":"Papa's Freezeria","link":"https://www.coolmathgames.com/0-papas-freezeria/play","image":"/assets/media/icons/papasfreezeria.webp","categories":["all","2P"]},{"name":"Evades","link":"https://evades.io","image":"/assets/media/icons/evadesio.webp","categories":["all,","2P"]},{"name":"Bullet Force Multiplayer","link":"https://www.crazygames.com/game/bullet-force-multiplayer","image":"/assets/media/icons/BFM.webp","categories":["all,","2P"]},{"name":"Crazy Games","link":"https://www.crazygames.com/","image":"/assets/media/icons/crazy.webp","categories":["all,","emu,","2P,","sports,","flash"]},{"name":"Cubes 2048","link":"https://www.crazygames.com/game/cubes-2048-io","image":"/assets/media/icons/C2048.webp","categories":["all,","2P"]},{"name":"DOOM","link":"https://archive.org/details/doom-play","image":"/assets/media/icons/DOOM.webp","categories":["all,","emu"]},{"name":"FNAF 2","link":"https://sussygamedeveloper.github.io/FNAF2/","image":"/assets/media/icons/FNAF2.webp","categories":["all"]},{"name":"FNAF 3","link":"https://sussygamedeveloper.github.io/fnaf3/","image":"/assets/media/icons/FNAF3.webp","categories":["all"]},{"name":"FNAF Web","link":"https://wellsousaaa.github.io/Five-Nights-at-Freddys-Web/","image":"/assets/media/icons/FNAFWeb.webp","categories":["all"]},{"name":"Riddle School 4","link":"https://riddle-school-4.game-files.crazygames.com/ruffle/riddleschool4.html","image":"/assets/media/icons/rs4.webp","categories":["all"]},{"name":"Riddle School 5","link":"https://riddle-school-5.game-files.crazygames.com/ruffle/riddleschool5.html","image":"/assets/media/icons/rs5.webp","categories":["all"]},{"name":"GBA Emulator","link":"https://ds.44670.org/gba/","image":"/assets/media/icons/gba.webp","categories":["all,","emu"]},{"name":"Itch.io","link":"https://itch.io","image":"/assets/media/icons/itch.webp","categories":["all,","emu,","2P"]},{"name":"N-Gon","link":"https://landgreen.github.io/sidescroller/","image":"/assets/media/icons/NGON.webp","categories":["all"]},{"name":"Nintendo DS Emulator","link":"https://ds.44670.org/","image":"/assets/media/icons/ds.webp","categories":["all,","emu"]},{"name":"Nintendo 64 Emulator","link":"https://www.neilb.net/n64wasm/","image":"/assets/media/icons/N64.webp","categories":["all,","emu"]},{"name":"Playstation 2 Emulator","link":"https://playjs.purei.org/","image":"/assets/media/icons/PS2.webp","categories":["all,","emu"]},{"name":"Run 3","link":"https://www.coolmathgames.com/0-run-3/play","image":"/assets/media/icons/run3.webp","categories":["all,","flash"]},{"name":"Subway Surfers: San Francisco ","link":"https://raw.githack.com/3kh0/3kh0-assets/main/subway-surfers/index.html","image":"/assets/media/icons/SF.webp","categories":["all,","emu"]},{"name":"Survivor.io","link":"https://html5.gamedistribution.com/rvvASMiM/f1c451e586c04b4c8cba01b0c50d9090/index.html","image":"/assets/media/icons/SVI.webp","categories":["all,","emu"]},{"name":"Web Retro","link":"/gh-games/index.html","image":"/assets/media/icons/webretro.webp","categories":["all,","emu","local"]},{"name":"Slope","link":"https://watchdocumentaries.com/wp-content/uploads/games/slope/","image":"/assets/media/icons/slope.webp","categories":["all"]},{"name":"Fortnite (Geforce NOW)","link":"https://play.geforcenow.com/mall/#/deeplink?game-id=46bfab06-d864-465d-9e56-2d9e45cdee0a","image":"/assets/media/icons/fortnite.webp","categories":["all"]},{"name":"Bomb Party","link":"https://jklm.fun","image":"/assets/media/icons/BP.webp","categories":["all,","2P"]},{"name":"1","link":"/gh-games/1/1/index.html","image":"/assets/media/icons/1.webp","categories":["all","local"]},{"name":"1v1.LOL","link":"https://1v1.lol","image":"/assets/media/icons/1v1-lol.webp","categories":["all,","2P"]},{"name":"2D Rocket League","link":"https://v6p9d9t4.ssl.hwcdn.net/html/3325334/index.html","image":"/assets/media/icons/2D-Rocket-League.webp","categories":["all"]},{"name":"3D Dino Game","link":"https://lagged.com/api/play2/t-rex-3d2/","image":"/assets/media/icons/trex-run-3D.webp","categories":["all"]},{"name":"60 Sec. Burger Run","link":"https://www.coolmathgames.com/0-60-second-burger-run/play","image":"/assets/media/icons/60-second-burger-run.webp","categories":["all"]},{"name":"8 Ball Pool","link":"https://8ball-pool.io","image":"/assets/media/icons/8ball.webp","categories":["all"]},{"name":"A Dark Room","link":"https://adarkroom.doublespeakgames.com","image":"/assets/media/icons/ADR.webp","categories":["all"]},{"name":"Ace Attorney","link":"https://f.kbhgames.com/r/gba/?r=ace-attorney","image":"/assets/media/icons/aa.webp","categories":["all"]},{"name":"AC - Wild World","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/10/animal-crossing-wild-world1.zip","image":"/assets/media/icons/acww.webp","categories":["all"]},{"name":"Adventure Capitalist","link":"https://than1089.github.io/adventure-capitalist/","image":"/assets/media/icons/adventure-capitalist.webp","categories":["all"]},{"name":"Agar.io","link":"https://agar.io","image":"/assets/media/icons/agario.webp","categories":["all"]},{"name":"Among Us (Scratch)","link":"https://turbowarp.org/523967150/fullscreen","image":"/assets/media/icons/scratch-among-us.webp","categories":["all"]},{"name":"Apex Legends","link":"https://play.geforcenow.com/games?game-id=cb2b1b5f-54ba-45fd-9839-96bbfe1376cd&lang=en_US&asset-id=01_c6efce00-e91e-402a-8b72-f4971f89c528","image":"/assets/media/icons/apex.webp","categories":["all"]},{"name":"Basket Random","link":"https://html5.gamedistribution.com/rvvASMiM/bf1268dccb5d43e7970bb3edaa54afc8/index.html","image":"/assets/media/icons/br.webp","categories":["all"]},{"name":"Basketball Stars","link":"https://html5.gamedistribution.com/69d78d071f704fa183d75b4114ae40ec/","image":"/assets/media/icons/basketball-stars.webp","categories":["all"]},{"name":"Basketball Bros","link":"https://www.basketbros.io/","image":"/assets/media/icons/basket-bros.webp","categories":["all"]},{"name":"Basketball Legends","link":"https://www.basketballlegends.fun/gamedata/basketball-legends-2020","image":"/assets/media/icons/basketball-legends.webp","categories":["all"]},{"name":"Biggie Cheese Fight","link":"https://scratch.mit.edu/projects/163771748/fullscreen","image":"/assets/media/icons/biggiecheese.webp","categories":["all"]},{"name":"Bitlife","link":"https://xlegends.github.io/bitlife/","image":"/assets/media/icons/bitlife.webp","categories":["all"]},{"name":"BTD 4","link":"https://en.gameslol.net/data/bloons-td-4/index.html","image":"/assets/media/icons/btd4.webp","categories":["all"]},{"name":"BuildNow.GG","link":"https://games.crazygames.com/en_US/buildnow-gg/index.html","image":"/assets/media/icons/build-now.webp","categories":["all"]},{"name":"Cat Ninja","link":"https://4iapq88o5f3gc1dij3it0mp5jojnm3jr-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://s3.amazonaws.com/production-assetsbucket-8ljvyr1xczmb/1ee20621-61bc-4ec8-a8ec-5e839c2e6edc%252Fcat-ninja.xml","image":"/assets/media/icons/cat-ninja.webp","categories":["all"]},{"name":"Candy Box","link":"https://candybox2.net","image":"/assets/media/icons/candybox.webp","categories":["all"]},{"name":"Celeste PICO-8","link":"https://exok.com/minigames/celeste.html","image":"/assets/media/icons/celeste.webp","categories":["all"]},{"name":"Clicker Heros","link":"https://www.clickerheroes.com/play.html","image":"/assets/media/icons/clickerheros.webp","categories":["all"]},{"name":"Chess.com","link":"https://chess.com","image":"/assets/media/icons/chess.webp","categories":["all"]},{"name":"Cluster Rush","link":"/gh-games/2/Cluster-Rush/index.html","image":"/assets/media/icons/cluster-rush.webp","categories":["all","local"]},{"name":"Cookie Clicker","link":"https://orteil.dashnet.org/cookieclicker/","image":"/assets/media/icons/cookieclicker.webp","categories":["all"]},{"name":"Crossy Road","link":"https://5dd2e1e3-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/169dc11d-e718-4b36-9e60-d5ed5bc07a31/index.html","image":"/assets/media/icons/cr.webp","categories":["all"]},{"name":"Deepest Sword","link":"https://v6p9d9t4.ssl.hwcdn.net/html/4017918/index.html","image":"/assets/media/icons/deepest-sword.webp","categories":["all"]},{"name":"Diep.io","link":"https://diep.io/","image":"/assets/media/icons/diep.webp","categories":["all"]},{"name":"Doge Miner","link":"/gh-games/1/DogeMiner/index.html","image":"/assets/media/icons/doge-miner-1.webp","categories":["all","local"]},{"name":"Doom 1","link":"https://browncha023.github.io/GBA/launcher.html#dm","image":"/assets/media/icons/DOOM.webp","categories":["all"]},{"name":"Doom 2","link":"https://browncha023.github.io/GBA/launcher.html#dm2","image":"/assets/media/icons/doom2.webp","categories":["all"]},{"name":"Dreader","link":"https://donitz.itch.io/dreader","image":"/assets/media/icons/dreader.webp","categories":["all"]},{"name":"Drift Boss","link":"https://watchdocumentaries.com/wp-content/uploads/games/drift-boss/","image":"/assets/media/icons/db.webp","categories":["all"]},{"name":"Drift Hunters","link":"https://webglmath.github.io/drift-hunters/","image":"/assets/media/icons/drift-hunters.webp","categories":["all"]},{"name":"Drive Mad","link":"https://raw.githack.com/3kh0/3kh0-assets/main/drive-mad/index.html","image":"/assets/media/icons/dm.webp","categories":["all"]},{"name":"Fallout 2","link":"https://jonasz-o.itch.io/fallout2remake3d","image":"/assets/media/icons/fallout2.webp","categories":["all"]},{"name":"FNAF 2 (Scratch)","link":"https://scratch.mit.edu/projects/469219637/embed/","image":"/assets/media/icons/FNAF2.webp","categories":["all"]},{"name":"Friday Night Funkin'","link":"https://w8.snokido.com/games/html5/friday-night-funkin/0281/index.html","image":"/assets/media/icons/fnf.webp","categories":["all"]},{"name":"FNF - Lofi Mod","link":"https://fnf.kdata1.com/lofi-funkin/2/","image":"/assets/media/icons/lofi.webp","categories":["all"]},{"name":"FNF VS. Snorlax","link":"https://fnf.kdata1.com/snorlax/1/","image":"/assets/media/icons/snorlax.webp","categories":["all"]},{"name":"JustFall.LOL","link":"https://justfall.lol","image":"/assets/media/icons/just-fall-lol.webp","categories":["all"]},{"name":"Kirby Mirror (GBA)","link":"https://www.retrogames.onl/gba/kirby-mirror-gba.html","image":"/assets/media/icons/kirby.webp","categories":["all"]},{"name":"Krunker","link":"https://krunker.io","image":"/assets/media/icons/krunker.webp","categories":["all"]},{"name":"G-Switch","link":"https://5dd24442-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/4f2c69b4-3edc-4cd7-a078-efd3d1ea9fb5/index.html","image":"/assets/media/icons/gswitch.webp","categories":["all"]},{"name":"G-Switch 2","link":"https://5dd27095-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/e0e70ee4-fdd4-4de8-931d-fde7d1cb408b/index.html","image":"/assets/media/icons/gswitch2.webp","categories":["all"]},{"name":"G-Switch 3","link":"https://5dd2b395-015f-11ea-ad56-9cb6d0d995f7.poki-gdn.com/120fdec6-7eeb-470f-a43c-9bcdace0dacb/index.html","image":"/assets/media/icons/gswitch3.webp","categories":["all"]},{"name":"Golden Eye 007","link":"https://f.kbhgames.com/r/n64/game.php?file=007-golden-eye.zip","image":"/assets/media/icons/golden-eye-007.webp","categories":["all"]},{"name":"GBA Games 2","link":"https://cattn.github.io/gba/","image":"/assets/media/icons/gba.webp","categories":["all"]},{"name":"Geforce NOW","link":"https://play.geforcenow.com","image":"/assets/media/icons/geforce-now.webp","categories":["all"]},{"name":"Haunted School 1","link":"https://games.crazygames.com/en_US/haunted-school---horror-game/index.html","image":"/assets/media/icons/na.webp","categories":["all"]},{"name":"HexArena","link":"https://hexarena.io/","image":"/assets/media/icons/hexarena.webp","categories":["all"]},{"name":"Hole.IO","link":"https://hole-io.com/","image":"/assets/media/icons/hole.webp","categories":["all"]},{"name":"Idle Breakout","link":"/gh-games/1/idle-breakout/index.html","image":"/assets/media/icons/idlebreakout.webp","categories":["all","local"]},{"name":"Isleward","link":"https://play.isleward.com","image":"/assets/media/icons/isleward.webp","categories":["all"]},{"name":"Interactive Buddy","link":"https://f.silvergames.com/ruffle/player.php?id=204","image":"/assets/media/icons/interactive-buddy.webp","categories":["all"]},{"name":"NGU Idle","link":"https://cache.armorgames.com/files/games/ngu-idle-18444/index.html?v=1559319416","image":"/assets/media/icons/nguidle.webp","categories":["all"]},{"name":"Jacksmith","link":"https://www.coolmathgames.com/0-jacksmith/play","image":"/assets/media/icons/jacksmith.webp","categories":["all"]},{"name":"Sandtrix","link":"https://files.crazygames.com/sandtrix/16/index.html","image":"/assets/media/icons/sandtrix.webp","categories":["all"]},{"name":"Learn To Fly Idle","link":"https://www.gameslol.net/data/waflash/index.php?g=635","image":"/assets/media/icons/ltf_idle.webp","categories":["all"]},{"name":"Lordz.io","link":"https://lordz.io/","image":"/assets/media/icons/lordz.webp","categories":["all"]},{"name":"Masked IO","link":"https://unblocked-games.s3.amazonaws.com/games/masked-io/index.html","image":"/assets/media/icons/masked-forces.webp","categories":["all"]},{"name":"Mario Kart 64","link":"https://static.arcadespot.com/retroemulator.php?system=n64&game=2017/06/mario-kart-64.zip","image":"/assets/media/icons/mario-kart-64.webp","categories":["all"]},{"name":"Mobs Inc","link":"https://overboy.itch.io/mobs-inc","image":"/assets/media/icons/mobsinc.webp","categories":["all"]},{"name":"Monkey Mart","link":"/gh-games/2/monkey-mart/index.html","image":"/assets/media/icons/mm.webp","categories":["all","local"]},{"name":"MooMoo.io","link":"https://moomoo.io","image":"/assets/media/icons/moo.webp","categories":["all"]},{"name":"Mortal Kombat 4","link":"https://f.kbhgames.com/r/n64/game.php?file=Mortal-Kombat-4-U.zip","image":"/assets/media/icons/mortal-kombat-4.webp","categories":["all"]},{"name":"Mr. Mine","link":"https://www.coolmathgames.com/0-mr-mine/play","image":"/assets/media/icons/mrmine.webp","categories":["all"]},{"name":"Moto X3M","link":"https://html5.gamedistribution.com/rvvASMiM/5b0abd4c0faa4f5eb190a9a16d5a1b4c/index.html","image":"/assets/media/icons/mx3m.webp","categories":["all"]},{"name":"MX3M: Pool Party","link":"https://h0jokl1egt0fd4oc8qv3j0tltl9jbqhn-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://649025137-174029463385024710.preview.editmysite.com/uploads/b/139890129-767696982876512205/files/mx3mpp.xml","image":"/assets/media/icons/mx3m.webp","categories":["all"]},{"name":"MX3M: Spooky Land","link":"https://html5.gamedistribution.com/rvvASMiM/b8a342904608470a9f3382337aca3558/index.html","image":"/assets/media/icons/mx3m-spooky.webp","categories":["all"]},{"name":"MX3M: Winter","link":"https://www-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://sites.google.com/site/s017q3e/moto-x3m-4-winter.xml","image":"/assets/media/icons/mx3m-winter.webp","categories":["all"]},{"name":"Saul Run","link":"https://complex-ify.itch.io/saul-goodman","image":"/assets/media/icons/saulrun.webp","categories":["all"]},{"name":"Ninja Cat Exploit","link":"https://html5.gamedistribution.com/rvvASMiM/903ba9346b9d437e9c7e81d672cead44/index.html","image":"/assets/media/icons/ninja-cat.webp","categories":["all"]},{"name":"OvO","link":"https://8rlfg0ch3417et18dp8lvps6uo7c3b2c-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://427396048-642845047394716217.preview.editmysite.com/uploads/b/139890129-761103484729797659/files/ovo.xml","image":"/assets/media/icons/ovo.webp","categories":["all"]},{"name":"Online Racing Game!","link":"https://jchabin.github.io/cars/","image":"/assets/media/icons/OR.webp","categories":["all"]},{"name":"Online Soccer M.","link":"https://www.onlinesoccermanager.com/","image":"/assets/media/icons/osm.webp","categories":["all"]},{"name":"Papa's Bakeria","link":"https://f.silvergames.com/emu/waffle/?id=5458","image":"/assets/media/icons/bakeria.webp","categories":["all"]},{"name":"Papa's Cupcakeria","link":"https://f.silvergames.com/emu/waffle/?id=3246","image":"/assets/media/icons/cupcakeria.webp","categories":["all"]},{"name":"Papa Louie 1","link":"https://f.silvergames.com/ruffle/player.php?id=1373","image":"/assets/media/icons/louie1.webp","categories":["all"]},{"name":"Papa Louie 2","link":"https://f.silvergames.com/emu/waffle/?id=3042","image":"/assets/media/icons/louie2.webp","categories":["all"]},{"name":"Papa Louie 3","link":"https://f.silvergames.com/emu/waffle/?id=4693","image":"/assets/media/icons/papa-louie-3.webp","categories":["all"]},{"name":"Papa's Pizzeria","link":"https://f.silvergames.com/ruffle/player.php?id=1360","image":"/assets/media/icons/pizzeria.webp","categories":["all"]},{"name":"Paper Mario 64","link":"https://f.kbhgames.com/r/n64/game.php?file=Paper%20Mario%20(USA).zip","image":"/assets/media/icons/paper-mario-64.webp","categories":["all"]},{"name":"Paper.io","link":"https://paper-io.com/","image":"/assets/media/icons/paperio.webp","categories":["all"]},{"name":"Pixel Shooter","link":"https://94bfktj403i6m18as4vkvtreqd0ohci4-a-sites-opensocial.googleusercontent.com/gadgets/ifr?url=https://274019683-173520394482650759.preview.editmysite.com/uploads/b/139890129-131715539788281629/files/ps.xml","image":"/assets/media/icons/pixel-shooter.webp","categories":["all"]},{"name":"Pizza Tower","link":"https://gamaverse.com/c/gh-games/g/pizza-tower-1678640389/index.html","image":"/assets/media/icons/pizza-tower.webp","categories":["all"]},{"name":"Pokemon Heart Gold","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/10/pokemon-heartgold-version1.zip","image":"/assets/media/icons/heartgold.webp","categories":["all"]},{"name":"Pokemon Showdown","link":"https://play.pokemonshowdown.com","image":"/assets/media/icons/showdown.webp","categories":["all"]},{"name":"Google Baseball","link":"https://www.google.com/logos/2019/july4th19/r6/july4th19.html","image":"/assets/media/icons/googlebaseball.webp","categories":["all"]},{"name":"Deal or No Deal","link":"https://f.kbhgames.com/RS/game.php?r=//f.kbhgames.com/2018/swf/dondeal2.swf&w=640&h=480&warnsupport=true","image":"/assets/media/icons/deal-or-no-deal.webp","categories":["all"]},{"name":"Deadshot","link":"https://deadshot.io","image":"/assets/media/icons/deadshot.webp","categories":["all"]},{"name":"Rainbow Tower","link":"https://www.mathplayground.com/mobile_rainbow_tower/index.html","image":"/assets/media/icons/rainbowtower.webp","categories":["all"]},{"name":"Doodle Jump","link":"https://doodlejump.pro/","image":"/assets/media/icons/doodlejump.webp","categories":["all"]},{"name":"Madalin Stunt Cars Multiplayer","link":"https://games.crazygames.com/en_US/madalin-cars-multiplayer/index.html","image":"/assets/media/icons/madalinmultiplayer.webp","categories":["all","2P"]},{"name":"Madalin Stunt Cars 2","link":"https://games.crazygames.com/en_US/madalin-stunt-cars-2/index.html","image":"/assets/media/icons/madalinstuntcars2.webp","categories":["all"]},{"name":"Madalin Stunt Cars 3","link":"https://games.crazygames.com/en_US/madalin-stunt-cars-3/index.html","image":"/assets/media/icons/madalinstuntcars3.webp","categories":["all"]},{"name":"PM: Light Platinum","link":"https://browncha023.github.io/GBA/launcher.html#pokemonlp","image":"/assets/media/icons/lp.webp","categories":["all"]},{"name":"Precision Client","link":"https://glcdn.githack.com/3kh0/3kh0-assets/-/raw/main/precision-client/index.html","image":"/assets/media/icons/precision.webp","categories":["all"]},{"name":"Rainbow Six Siege","link":"https://play.geforcenow.com/games?game-id=1dd07d47-6601-42f7-80e9-e4d8db08ea1b&lang=en_US&asset-id=01_44417-48c3d8e642e2","image":"/assets/media/icons/r6.webp","categories":["all"]},{"name":"Red Ball 1","link":"https://www.algebrashelper.com/redball","image":"/assets/media/icons/redball1.webp","categories":["all"]},{"name":"Red Ball 2","link":"https://www.algebrashelper.com/redball-2","image":"/assets/media/icons/redball2.webp","categories":["all"]},{"name":"Red Ball 4","link":"https://www.algebrashelper.com/redball-4","image":"/assets/media/icons/redball4.webp","categories":["all"]},{"name":"Red Ball 4 Vol. 2","link":"https://www.algebrashelper.com/read-ball-4v2","image":"/assets/media/icons/redball4vol2.webp","categories":["all"]},{"name":"Red Ball 4 Vol. 3","link":"https://www.algebrashelper.com/red-ball-4v3","image":"/assets/media/icons/redball4vol3.webp","categories":["all"]},{"name":"Riddle School 2","link":"https://f.silvergames.com/ruffle/player.php?id=8564","image":"/assets/media/icons/rs2.webp","categories":["all"]},{"name":"Riddle School 3","link":"https://riddle-school-3.game-files.crazygames.com/ruffle/riddleschool3.html","image":"/assets/media/icons/rs3.webp","categories":["all"]},{"name":"Rocket Pult","link":"https://v6p9d9t4.ssl.hwcdn.net/html/565140/index.html","image":"/assets/media/icons/rocketpult.webp","categories":["all"]},{"name":"Rooftop Snipers","link":"https://html5.gamedistribution.com/rvvASMiM/c3a70ae98547407a92ebedca8b79fdfa/index.html","image":"/assets/media/icons/rooftop.webp","categories":["all"]},{"name":"Sand Spiel","link":"https://sandspiel.club/","image":"/assets/media/icons/sand.webp","categories":["all"]},{"name":"Sandboxels","link":"https://v6p9d9t4.ssl.hwcdn.net/html/5808591/index.html","image":"/assets/media/icons/sandboxels.webp","categories":["all"]},{"name":"Shapez.IO","link":"https://shapez.io","image":"/assets/media/icons/shapezio.webp","categories":["all"]},{"name":"Shell Shockers","link":"https://shellshock.io/","image":"/assets/media/icons/shell-shockers.webp","categories":["all"]},{"name":"Slither.io","link":"https://slither.io/","image":"/assets/media/icons/slither.webp","categories":["all"]},{"name":"Smash Bros 64","link":"https://emulatorgames.online/games/n64/super-smash-bros","image":"/assets/media/icons/super-smash-bros-64.webp","categories":["all"]},{"name":"Smash Karts","link":"https://smashkarts.io/","image":"/assets/media/icons/smashkarts.webp","categories":["all"]},{"name":"Snowball.io","link":"https://games.crazygames.com/en_US/snowball-io/index.html","image":"/assets/media/icons/snowball.webp","categories":["all"]},{"name":"Space Plan","link":"https://jhollands.co.uk/spaceplan/","image":"/assets/media/icons/spaceplan.webp","categories":["all"]},{"name":"Stumble Guys","link":"https://www.stumbleguys.com/play","image":"/assets/media/icons/stumble-guys.webp","categories":["all"]},{"name":"Stumble Guys Clone","link":"https://stumble-guys.io/stumble-guys.embed","image":"/assets/media/icons/stumble-guys.webp","categories":["all"]},{"name":"Sugar Sugar HTML5","link":"https://66564262-37c6-4095-a731-535342e4bbe4.poki-gdn.com/5bd6e8c6-381d-4de5-9823-96662d29afaf/index.html","image":"/assets/media/icons/sugarsugar.webp","categories":["all"]},{"name":"Super Mario 63","link":"https://www.numuki.com/gameframe/super-mario-63","image":"/assets/media/icons/sm63.webp","categories":["all"]},{"name":"Super Mario 64","link":"https://f.kbhgames.com/r/n64/game.php?file=32112_super-mario-64-usa.zip","image":"/assets/media/icons/sm64.webp","categories":["all"]},{"name":"Super Smash Flash","link":"https://f.kbhgames.com/RS/game.php?r=//f.kbhgames.com/2018/swf/smashflash.swf&w=1521&h=753","image":"/assets/media/icons/ssf1.webp","categories":["all"]},{"name":"Supply Chain Idle","link":"https://chat.kongregate.com/gamez/0027/1653/live/index.html?kongregate_game_version=1554392772","image":"/assets/media/icons/supplychainlogo.webp","categories":["all"]},{"name":"Taming.io","link":"https://taming.io/","image":"/assets/media/icons/tamingio.webp","categories":["all"]},{"name":"Temple of Boom","link":"https://temple-of-boom.github.io/file/","image":"/assets/media/icons/templeofboom.webp","categories":["all","2P"]},{"name":"Tanuki Sunset","link":"https://watchdocumentaries.com/wp-content/uploads/games/tanuki-sunset","image":"/assets/media/icons/tanuki.webp","categories":["all"]},{"name":"The Simpsons","link":"https://static.arcadespot.com/retroemulator.php?system=nds&game=2017/11/the-simpsons-game.zip","image":"/assets/media/icons/the-simpsons-game.webp","categories":["all"]},{"name":"Temple Run 2","link":"https://watchdocumentaries.com/wp-content/uploads/games/temple-run-2/","image":"/assets/media/icons/temple-run-2.webp","categories":["all"]},{"name":"Twitch Tetris","link":"https://www.rossipotti.de/ausgabe28/tetris/controls.html","image":"/assets/media/icons/na.webp","categories":["all"]},{"name":"Voxiom.io","link":"https://voxiom.io/","image":"/assets/media/icons/voxiom.webp","categories":["all"]},{"name":"Zombs.io","link":"https://zombs.io/","image":"/assets/media/icons/zombs-io.webp","categories":["all"]},{"name":"Zombs Royale","link":"https://zombsroyale.io","image":"/assets/media/icons/zombs-royale.webp","categories":["all,","2P"]},{"name":"GBA Games","link":"https://real-sgs.vercel.app/Tools/GBA-Emulator","image":"/assets/media/icons/gba.webp","categories":["all"]},{"name":"Retro Bowl","link":"/gh-games/2/retro/index.html","image":"/assets/media/icons/retro.webp","categories":["all,","sports","local"]},{"name":"Roblox (Now.GG)","link":"https://now.gg/iframe/snippet?app_pkg=com.roblox.client&partner=interstellar","image":"/assets/media/icons/roblox.webp","categories":["all","emu","android"]},{"name":"Madden NFL 24","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.maddennfl21mobile&partner=interstellar","image":"/assets/media/icons/maddennfl24.webp","categories":["all","emu","android"]},{"name":"Android","link":"https://now.gg/iframe/snippet?app_pkg=com.uncube.launcher3&partner=interstellar","image":"/assets/media/icons/android.webp","categories":["all","emu","android"]},{"name":"Genshin Impact","link":"https://now.gg/iframe/snippet?app_pkg=com.miHoYo.GenshinImpact&partner=interstellar","image":"/assets/media/icons/genshinimpact.webp","categories":["all","emu","android"]},{"name":"Fortnite (Now.GG)","link":"https://now.gg/iframe/snippet?app_pkg=com.epicgames.fortnite&partner=interstellar","image":"/assets/media/icons/fortnite.webp","categories":["all","emu","android"]},{"name":"EA SPORTS FC™ MOBILE 24 SOCCER","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.fifamobile&partner=interstellar","image":"/assets/media/icons/easports-fcmobile24.webp","categories":["all","emu","android"]},{"name":"EA SPORTS™ UFC® Mobile 2","link":"https://now.gg/iframe/snippet?app_pkg=com.ea.gp.easportsufc2&partner=interstellar","image":"/assets/media/icons/easports-ufc.webp","categories":["all","emu","android"]},{"name":"Melon Playground","link":"https://now.gg/iframe/snippet?app_pkg=com.studio27.MelonPlayground&partner=interstellar","image":"/assets/media/icons/melonplayground.webp","categories":["all","emu","android"]},{"name":"Solar Smash","link":"https://now.gg/iframe/snippet?app_pkg=com.paradyme.solarsmash&partner=interstellar","image":"/assets/media/icons/solarsmash.webp","categories":["all","emu","android"]},{"name":"Bloons TD Battles 2","link":"https://now.gg/iframe/snippet?app_pkg=com.ninjakiwi.bloonstdbattles2&partner=interstellar","image":"/assets/media/icons/bloonstd2.webp","categories":["all","emu","android"]},{"name":"Bloons TD Battles","link":"https://now.gg/iframe/snippet?app_pkg=com.ninjakiwi.bloonstdbattles&partner=interstellar","image":"/assets/media/icons/bloonstd.webp","categories":["all","emu","android"]},{"name":"Cookie Run Kingdom","link":"https://now.gg/iframe/snippet?app_pkg=com.devsisters.ck&partner=interstellar","image":"/assets/media/icons/cookierunkingdom.webp","categories":["all","emu","android"]},{"name":"Character AI","link":"https://now.gg/iframe/snippet?app_pkg=ai.character.app&partner=interstellar","image":"/assets/media/icons/characterai.webp","categories":["all","emu","android"]},{"name":"Aptoide","link":"https://now.gg/iframe/snippet?app_pkg=com.aptoide.partners.nowgg.store&partner=interstellar","image":"/assets/media/icons/aptoide.webp","categories":["all","emu","android"]},{"name":"Akinator","link":"https://now.gg/iframe/snippet?app_pkg=com.digidust.elokence.akinator.freemium&partner=interstellar","image":"/assets/media/icons/akinator.webp","categories":["all","emu","android"]},{"name":"WorldBox","link":"https://now.gg/iframe/snippet?app_pkg=com.mkarpenko.worldbox&partner=interstellar","image":"/assets/media/icons/worldbox.webp","categories":["all","emu","android"]},{"name":"Toca Life World","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocalifeworld&partner=interstellar","image":"/assets/media/icons/tocalifeworld.webp","categories":["all","emu","android"]},{"name":"Toca Hair Salon 4","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocahairsalon4&partner=interstellar","image":"/assets/media/icons/tocabocahairsalon4.webp","categories":["all","emu","android"]},{"name":"Toca Kitchen 2","link":"https://now.gg/iframe/snippet?app_pkg=com.tocaboca.tocakitchen2&partner=interstellar","image":"/assets/media/icons/tocakitchen2.webp","categories":["all","emu","android"]},{"name":"Free Fire","link":"https://now.gg/iframe/snippet?app_pkg=com.dts.freefireth&partner=interstellar","image":"/assets/media/icons/freefire.webp","categories":["all","emu","android"]},{"name":"Stumble Guys (Android)","link":"https://now.gg/iframe/snippet?app_pkg=com.kitkagames.fallbuddies&partner=interstellar","image":"/assets/media/icons/stumble-guys.webp","categories":["all","emu","android"]},{"name":"Now.GG","link":"https://now.gg","image":"/assets/media/icons/now-gg.webp","categories":["all","emu","android"]},{"name":"Roblox (NowGG.me) [Working]","link":"https://nowgg.me/apps/roblox-corporation/5349/roblox.html","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Now.GG (NowGG.me) [Working]","link":"https://nowgg.me","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Parappa the Rapper","link":"https://retrogamesonline.io/parappa-the-rapper.embed","image":"/assets/media/icons/ptr.webp","categories":["all","emu"]},{"name":"Half-Life","link":"https://x8bitrain.github.io/webXash/","image":"/assets/media/icons/half-life.webp","categories":["all"]},{"name":"Kiomet","link":"https://kiomet.com","image":"/assets/media/icons/kiomet.webp","categories":["all"]},{"name":"Tribals.io","link":"https://tribals.io/","image":"/assets/media/icons/tribalsio.webp","categories":["all"]},{"name":"Counter Strike 1.6","link":"https://play-cs.com/en/servers","image":"/assets/media/icons/cs16.webp","categories":["all"]},{"name":"Narrow One","link":"https://narrow.one","image":"/assets/media/icons/narrowone.webp","categories":["all"]},{"name":"Kirka","link":"https://kirka.io","image":"/assets/media/icons/kirka.webp","categories":["all"]},{"name":"Cryzen","link":"https://cryzen.io","image":"/assets/media/icons/cryzen.webp","categories":["all"]},{"name":"Hordes","link":"https://hordes.io","image":"/assets/media/icons/hordes.webp","categories":["all"]},{"name":"Venge","link":"https://venge.io","image":"/assets/media/icons/venge.webp","categories":["all"]},{"name":"Minecraft 1.5.2 (Eaglercraft)","link":"/gh-games/2/eag15/index.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Minecraft 1.8 (Eaglercraft)","link":"/gh-games/2/eag18/offline.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Minecraft 1.8 (Eagler WASM)","link":"/gh-games/2/eag18/wasm.html","image":"/assets/media/icons/mc.webp","categories":["all","2P","emu","local"]},{"name":"Getaway S.","link":"https://www.twoplayergames.org/embed/getaway-shootout","image":"/assets/media/icons/getaway.webp","categories":["all","2P"]},{"name":"2048","link":"/gh-games/1/2048/index.html","image":"/assets/media/icons/2048.webp","categories":["all","local"]},{"name":"2048 Multitasking","link":"/gh-games/1/2048-multitask/index.html","image":"/assets/media/icons/2048.webp","categories":["all","local"]},{"name":"Vex 7","link":"/gh-games/1/vex7/index.html","image":"/assets/media/icons/vex7.webp","categories":["all","local"]},{"name":"Vex 6","link":"/gh-games/1/vex6/index.html","image":"/assets/media/icons/vex6.webp","categories":["all","local"]},{"name":"Vex 5","link":"/gh-games/1/vex5/index.html","image":"/assets/media/icons/vex5.webp","categories":["all","local"]},{"name":"Vex 3","link":"/gh-games/1/vex3/index.html","image":"/assets/media/icons/vex3.webp","categories":["all","local"]},{"name":"Vex 4","link":"/gh-games/1/vex4/index.html","image":"/assets/media/icons/vex4.webp","categories":["all","local"]},{"name":"Windows 96","link":"https://windows96.net","image":"/assets/media/icons/windows96.webp","categories":["all"]},{"name":"The Impossible Quiz: Book 2","link":"https://f.silvergames.com/ruffle/player.php?id=3742","image":"/assets/media/icons/book2.webp","categories":["all","emu"]},{"name":"Wrassling","link":"https://games.poki.com/458768/wrassling","image":"/assets/media/icons/wrassling.webp","categories":["all"]},{"name":"Happy Wheels","link":"https://games-online.io/game/HappyWheels/","image":"/assets/media/icons/hw.webp","categories":["all"]},{"name":"Google Snake Modded","link":"https://googlesnakemods.com/v/current/","image":"/assets/media/icons/snake.webp","categories":["all"]},{"name":"Idle Startup Tycoon","link":"https://www.mortgagecalculator.org/money-games/idle-startup-tycoon/","image":"/assets/media/icons/idlestartup.webp","categories":["all"]},{"name":"Two Player Games","link":"https://www.twoplayergames.org/","image":"/assets/media/icons/tpg.webp","categories":["all"]},{"name":"Five Nights at Winston's","link":"https://g.deev.is/fnaw/","image":"/assets/media/icons/fnaw.webp","categories":["all","game"]},{"name":"Goomy Clicker 2","link":"https://idle-js-games.github.io/goomyClicker2/","image":"/assets/media/icons/gc2.webp","categories":["all"]},{"name":"Space Company","link":"/gh-games/1/space-company/index.html","image":"/assets/media/icons/sc.png","categories":["all","local"]},{"name":"Mario Kart DS","link":"https://seraph.reveriestudios.online/games/mariokartds/index.html","image":"/assets/media/icons/mariokartds.jpg","categories":["all","emu"]},{"name":"Cooking Mama","link":"https://seraph.reveriestudios.online/games/cookingmama/index.html","image":"/assets/media/icons/cookingmama.jpg","categories":["all","emu"]},{"name":"Wordle","link":"https://www.nytimes.com/games/wordle/index.html","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Wordle Unlimited","link":"https://wordleunlimited.org/","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Wordly","link":"https://wordly.org/","image":"/assets/media/icons/w.webp","categories":["all"]},{"name":"Connections","link":"https://www.nytimes.com/games/connections","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Connections Unlimited","link":"https://1games.io/game/connections-game/","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Globle","link":"https://globle.org/?","image":"/assets/media/icons/cn.png","categories":["all"]},{"name":"Particle Clicker","link":"/gh-games/1/particle-clicker/index.html","image":"/assets/media/icons/pc.png","categories":["all,","local"]},{"name":"ShipCraft.io","link":"https://shipcraft.io/","categories":["all"]},{"name":"Super Mario Bros.","link":"https://emulator-games.pages.dev/nes/Super Mario Bros.","image":"/assets/media/icons/emulator/smb.webp","categories":["all","emu"]},{"name":"Super Mario Bros. 2","link":"https://emulator-games.pages.dev/nes/Super Mario Bros. 2","image":"/assets/media/icons/emulator/smb2.webp","categories":["all","emu"]},{"name":"Super Mario Bros. 3","link":"https://emulator-games.pages.dev/nes/Super Mario Bros. 3","image":"/assets/media/icons/emulator/smb3.webp","categories":["all","emu"]}] \ No newline at end of file From afdabfd0354e105275f243922bff0582cdf718fc Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 06:28:30 -0400 Subject: [PATCH 038/115] fix: prevent service worker errors for first time users --- static/assets/js/search.js | 57 ++++++++++++++++++++++++++++++++++---- static/sw.js | 16 ++++++++++- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/static/assets/js/search.js b/static/assets/js/search.js index bf1f5ffecc..6905f39d93 100644 --- a/static/assets/js/search.js +++ b/static/assets/js/search.js @@ -1,9 +1,54 @@ -window.addEventListener("load", () => { - navigator.serviceWorker.register("../sw.js", { - scope: "/uv/", - }); + +let swReady = false; +let swReadyResolve; +const swReadyPromise = new Promise(resolve => { swReadyResolve = resolve; }); + +window.addEventListener("load", async () => { + if (!("serviceWorker" in navigator)) { + swReady = true; + swReadyResolve(); + return; + } + + try { + const registration = await navigator.serviceWorker.register("../sw.js", { + scope: "/uv/", + }); + + if (registration.active) { + swReady = true; + swReadyResolve(); + return; + } + + const worker = registration.installing || registration.waiting; + if (worker) { + worker.addEventListener("statechange", function onStateChange() { + if (this.state === "activated") { + swReady = true; + swReadyResolve(); + worker.removeEventListener("statechange", onStateChange); + } + }); + } else { + swReady = true; + swReadyResolve(); + } + } catch (err) { + console.error("[SW] registration failed:", err); + swReady = true; + swReadyResolve(); + } }); +async function waitForServiceWorker() { + if (swReady) return; + await Promise.race([ + swReadyPromise, + new Promise(resolve => setTimeout(resolve, 4000)), + ]); +} + const form = document.getElementById("fv"); const input = document.getElementById("input"); @@ -39,6 +84,8 @@ async function encodeUrl(url, proxyOverride) { } async function navigate(value, path, proxyOverride) { + await waitForServiceWorker(); + let url = value.trim(); const engine = localStorage.getItem("engine"); const searchUrl = engine ? engine : "https://search.brave.com/search?q="; @@ -78,4 +125,4 @@ function useDynamic(value) { function isValidUrl(val = "") { return /^http(s?):\/\//.test(val) || (val.includes(".") && val[0] !== " "); -} +} \ No newline at end of file diff --git a/static/sw.js b/static/sw.js index 00feffea31..16830e9f68 100644 --- a/static/sw.js +++ b/static/sw.js @@ -13,6 +13,20 @@ const sj = new ScramjetServiceWorker(); const userKey = new URL(location).searchParams.get("userkey"); self.dynamic = dynamic; +self.addEventListener("install", event => { + event.waitUntil(self.skipWaiting()); +}); + +self.addEventListener("activate", event => { + event.waitUntil(self.clients.claim()); +}); + +self.addEventListener("message", event => { + if (event.data?.type === "SKIP_WAITING") { + self.skipWaiting(); + } +}); + self.addEventListener("fetch", event => { event.respondWith( (async () => { @@ -33,4 +47,4 @@ self.addEventListener("fetch", event => { return await fetch(event.request); })(), ); -}); +}); \ No newline at end of file From 3b6436b2649e163db1023840850a585bbfc26978 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 06:29:42 -0400 Subject: [PATCH 039/115] chore: formatted --- static/assets/js/main.js | 2 +- static/assets/js/search.js | 12 +++++------- static/sw.js | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 5525a70cb5..762bccde43 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -94,4 +94,4 @@ document.addEventListener("DOMContentLoaded", () => { if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } -}); \ No newline at end of file +}); diff --git a/static/assets/js/search.js b/static/assets/js/search.js index 6905f39d93..315ea88493 100644 --- a/static/assets/js/search.js +++ b/static/assets/js/search.js @@ -1,7 +1,8 @@ - let swReady = false; let swReadyResolve; -const swReadyPromise = new Promise(resolve => { swReadyResolve = resolve; }); +const swReadyPromise = new Promise(resolve => { + swReadyResolve = resolve; +}); window.addEventListener("load", async () => { if (!("serviceWorker" in navigator)) { @@ -43,10 +44,7 @@ window.addEventListener("load", async () => { async function waitForServiceWorker() { if (swReady) return; - await Promise.race([ - swReadyPromise, - new Promise(resolve => setTimeout(resolve, 4000)), - ]); + await Promise.race([swReadyPromise, new Promise(resolve => setTimeout(resolve, 4000))]); } const form = document.getElementById("fv"); @@ -125,4 +123,4 @@ function useDynamic(value) { function isValidUrl(val = "") { return /^http(s?):\/\//.test(val) || (val.includes(".") && val[0] !== " "); -} \ No newline at end of file +} diff --git a/static/sw.js b/static/sw.js index 16830e9f68..4bebaf06ad 100644 --- a/static/sw.js +++ b/static/sw.js @@ -47,4 +47,4 @@ self.addEventListener("fetch", event => { return await fetch(event.request); })(), ); -}); \ No newline at end of file +}); From f3777b66deff29bab3f94922911aac0f2a3c1911 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 07:01:08 -0400 Subject: [PATCH 040/115] refactor: remove in-memory cache, implement hard caching for GitHub assets --- index.js | 66 ++++++++++++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/index.js b/index.js index 1d9ad7ba17..2cda2be89d 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,3 @@ -import fs from "node:fs"; import http from "node:http"; import path from "node:path"; import bareMuxNode from "@mercuryworkshop/bare-mux/node"; @@ -10,7 +9,6 @@ import cors from "cors"; import express from "express"; import basicAuth from "express-basic-auth"; import mime from "mime"; -import fetch from "node-fetch"; import config from "./config.js"; console.log(chalk.yellow("🚀 Starting server...")); @@ -22,68 +20,67 @@ const bareServer = createBareServer("/bare/"); const { baremuxPath } = bareMuxNode; const epoxyDistPath = path.join(__dirname, "node_modules", "@mercuryworkshop", "epoxy-transport", "dist"); const PORT = process.env.PORT || 8080; -const cache = new Map(); -const CACHE_TTL = 30 * 24 * 60 * 60 * 1000; // Cache for 30 Days wisp.options.allow_loopback_ips = true; wisp.options.allow_private_ips = true; if (config.challenge !== false) { console.log(chalk.green("🔒 Password protection is enabled! Listing logins below")); - // biome-ignore lint: idk Object.entries(config.users).forEach(([username, password]) => { console.log(chalk.blue(`Username: ${username}, Password: ${password}`)); }); app.use(basicAuth({ users: config.users, challenge: true })); } +const ghGamesBases = { + "/gh-games/1/": "https://raw.githubusercontent.com/qrs/x/fixy/", + "/gh-games/2/": "https://raw.githubusercontent.com/3v1/V5-Assets/main/", + "/gh-games/3/": "https://raw.githubusercontent.com/3v1/V5-Retro/master/", +}; +const noMimeExts = new Set([".unityweb"]); + app.get("/gh-games/*", async (req, res, next) => { try { - if (cache.has(req.path)) { - const { data, contentType, timestamp } = cache.get(req.path); - if (Date.now() - timestamp > CACHE_TTL) { - cache.delete(req.path); - } else { - res.writeHead(200, { "Content-Type": contentType }); - return res.end(data); - } - } - - const baseUrls = { - "/gh-games/1/": "https://raw.githubusercontent.com/qrs/x/fixy/", - "/gh-games/2/": "https://raw.githubusercontent.com/3v1/V5-Assets/main/", - "/gh-games/3/": "https://raw.githubusercontent.com/3v1/V5-Retro/master/", - }; - let reqTarget; - for (const [prefix, baseUrl] of Object.entries(baseUrls)) { + for (const [prefix, baseUrl] of Object.entries(ghGamesBases)) { if (req.path.startsWith(prefix)) { reqTarget = baseUrl + req.path.slice(prefix.length); break; } } + if (!reqTarget) return next(); - if (!reqTarget) { - return next(); + const upstreamHeaders = {}; + if (req.headers["if-none-match"]) { + upstreamHeaders["If-None-Match"] = req.headers["if-none-match"]; } - const asset = await fetch(reqTarget); - if (!asset.ok) { - return next(); + const asset = await fetch(reqTarget, { headers: upstreamHeaders }); + + if (asset.status === 304) { + return res.sendStatus(304); } + if (!asset.ok) return next(); + const data = Buffer.from(await asset.arrayBuffer()); const ext = path.extname(reqTarget); - const no = [".unityweb"]; - const contentType = no.includes(ext) ? "application/octet-stream" : mime.getType(ext); + const contentType = noMimeExts.has(ext) ? "application/octet-stream" : mime.getType(ext); + + + const etag = asset.headers.get("etag"); + const lastModified = asset.headers.get("last-modified"); - cache.set(req.path, { data, contentType, timestamp: Date.now() }); - res.writeHead(200, { "Content-Type": contentType }); + res.writeHead(200, { + "Content-Type": contentType, + "Cache-Control": "public, max-age=31536000, immutable", + ...(etag && { ETag: etag }), + ...(lastModified && { "Last-Modified": lastModified }), + }); res.end(data); } catch (error) { console.error("Error fetching asset:", error); - res.setHeader("Content-Type", "text/html"); - res.status(500).send("Error fetching the asset"); + res.status(500).type("text/html").send("Error fetching the asset"); } }); @@ -116,7 +113,6 @@ const routes = [ { path: "/", file: "index.html" }, ]; -// biome-ignore lint: idk routes.forEach(route => { app.get(route.path, (_req, res) => { res.sendFile(path.join(__dirname, "static", route.file)); @@ -152,4 +148,4 @@ server.on("listening", () => { console.log(chalk.green(`🌍 Server is running on http://localhost:${PORT}`)); }); -server.listen({ port: PORT }); +server.listen({ port: PORT }); \ No newline at end of file From 73904eb262cdb925bb9e5d9dcfe4c68a3f45529d Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 07:07:10 -0400 Subject: [PATCH 041/115] fix: implement rate limiting on routes (resolves CodeQL security alerts) --- index.js | 26 +++++++++++++++++++++----- package.json | 1 + pnpm-lock.yaml | 24 ++++++++++++++++++++---- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 2cda2be89d..cea775bb12 100644 --- a/index.js +++ b/index.js @@ -8,6 +8,7 @@ import cookieParser from "cookie-parser"; import cors from "cors"; import express from "express"; import basicAuth from "express-basic-auth"; +import rateLimit from "express-rate-limit"; import mime from "mime"; import config from "./config.js"; @@ -24,6 +25,22 @@ const PORT = process.env.PORT || 8080; wisp.options.allow_loopback_ips = true; wisp.options.allow_private_ips = true; +const generalLimiter = rateLimit({ + windowMs: 60 * 1000, + max: 100, + standardHeaders: true, + legacyHeaders: false, + message: "Too many requests, please try again later.", +}); + +const ghGamesLimiter = rateLimit({ + windowMs: 60 * 1000, + max: 50, + standardHeaders: true, + legacyHeaders: false, + message: "Too many requests, please try again later.", +}); + if (config.challenge !== false) { console.log(chalk.green("🔒 Password protection is enabled! Listing logins below")); Object.entries(config.users).forEach(([username, password]) => { @@ -39,7 +56,7 @@ const ghGamesBases = { }; const noMimeExts = new Set([".unityweb"]); -app.get("/gh-games/*", async (req, res, next) => { +app.get("/gh-games/*", ghGamesLimiter, async (req, res, next) => { try { let reqTarget; for (const [prefix, baseUrl] of Object.entries(ghGamesBases)) { @@ -67,7 +84,6 @@ app.get("/gh-games/*", async (req, res, next) => { const ext = path.extname(reqTarget); const contentType = noMimeExts.has(ext) ? "application/octet-stream" : mime.getType(ext); - const etag = asset.headers.get("etag"); const lastModified = asset.headers.get("last-modified"); @@ -114,16 +130,16 @@ const routes = [ ]; routes.forEach(route => { - app.get(route.path, (_req, res) => { + app.get(route.path, generalLimiter, (_req, res) => { res.sendFile(path.join(__dirname, "static", route.file)); }); }); -app.use((req, res, next) => { +app.use(generalLimiter, (req, res) => { res.status(404).sendFile(path.join(__dirname, "static", "404.html")); }); -app.use((err, req, res, next) => { +app.use(generalLimiter, (err, req, res, next) => { console.error(err.stack); res.status(500).sendFile(path.join(__dirname, "static", "404.html")); }); diff --git a/package.json b/package.json index 2e88201d72..a801a08c9f 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "dotenv": "^17.2.0", "express": "^4.21.2", "express-basic-auth": "^1.2.1", + "express-rate-limit": "^8.4.1", "mime": "^4.1.0", "node-fetch": "^3.3.2" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c0028b958..a5fe38e231 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: express-basic-auth: specifier: ^1.2.1 version: 1.2.1 + express-rate-limit: + specifier: ^8.4.1 + version: 8.4.1(express@4.21.2) mime: specifier: ^4.1.0 version: 4.1.0 @@ -76,28 +79,24 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [musl] '@biomejs/cli-linux-arm64@2.2.2': resolution: {integrity: sha512-JfrK3gdmWWTh2J5tq/rcWCOsImVyzUnOS2fkjhiYKCQ+v8PqM+du5cfB7G1kXas+7KQeKSWALv18iQqdtIMvzw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [glibc] '@biomejs/cli-linux-x64-musl@2.2.2': resolution: {integrity: sha512-ZCLXcZvjZKSiRY/cFANKg+z6Fhsf9MHOzj+NrDQcM+LbqYRT97LyCLWy2AS+W2vP+i89RyRM+kbGpUzbRTYWig==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [musl] '@biomejs/cli-linux-x64@2.2.2': resolution: {integrity: sha512-Ogb+77edO5LEP/xbNicACOWVLt8mgC+E1wmpUakr+O4nKwLt9vXe74YNuT3T1dUBxC/SnrVmlzZFC7kQJEfquQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [glibc] '@biomejs/cli-win32-arm64@2.2.2': resolution: {integrity: sha512-wBe2wItayw1zvtXysmHJQoQqXlTzHSpQRyPpJKiNIR21HzH/CrZRDFic1C1jDdp+zAPtqhNExa0owKMbNwW9cQ==} @@ -466,6 +465,12 @@ packages: express-basic-auth@1.2.1: resolution: {integrity: sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==} + express-rate-limit@8.4.1: + resolution: {integrity: sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} @@ -529,6 +534,10 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -1062,6 +1071,11 @@ snapshots: dependencies: basic-auth: 2.0.1 + express-rate-limit@8.4.1(express@4.21.2): + dependencies: + express: 4.21.2 + ip-address: 10.1.0 + express@4.21.2: dependencies: accepts: 1.3.8 @@ -1170,6 +1184,8 @@ snapshots: inherits@2.0.4: {} + ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} ipaddr.js@2.2.0: {} From dd7ab8a7dc2a0d921b0291c553948a3fcd649f98 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 07:15:04 -0400 Subject: [PATCH 042/115] fix: sanitize urls to prevent xss (resolves CodeQL security alerts) --- static/assets/js/main.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 762bccde43..cdd89b4df3 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -37,6 +37,20 @@ try { } } +function sanitizeUrl(url) { + if (!url || typeof url !== "string") return null; + try { + const parsed = new URL(url); + if (["http:", "https:", "data:"].includes(parsed.protocol)) { + return url; + } + return null; + } catch { + if (!url.includes(":")) return url; + return null; + } +} + document.addEventListener("DOMContentLoaded", () => { const blockedHostnames = ["gointerstellar.app"]; @@ -73,7 +87,10 @@ document.addEventListener("DOMContentLoaded", () => { const cloakName = localStorage.getItem("CustomName") || localStorage.getItem("name"); const cloakIcon = localStorage.getItem("CustomIcon") || localStorage.getItem("icon"); if (cloakName) title.textContent = cloakName; - if (cloakIcon) icon.setAttribute("href", cloakIcon); + if (cloakIcon) { + const safeIcon = sanitizeUrl(cloakIcon); + if (safeIcon) icon.setAttribute("href", safeIcon); + } // Event Key Logic const eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; @@ -84,7 +101,8 @@ document.addEventListener("DOMContentLoaded", () => { pressedKeys.push(event.key); const recentKeys = pressedKeys.slice(-eventKey.length); if (recentKeys.length === eventKey.length && eventKey.every((key, i) => key === recentKeys[i])) { - window.location.href = pLink; + const safeLink = sanitizeUrl(pLink); + if (safeLink) window.location.href = safeLink; pressedKeys = []; } }); From aa65cd87773e04b611e54556002c94215bd6a788 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 07:22:53 -0400 Subject: [PATCH 043/115] fix: properly sanitize urls to prevent xss --- static/assets/js/main.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/static/assets/js/main.js b/static/assets/js/main.js index cdd89b4df3..c4f9daf544 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -37,16 +37,15 @@ try { } } -function sanitizeUrl(url) { - if (!url || typeof url !== "string") return null; +function reconstructSafeUrl(raw) { + if (!raw || typeof raw !== "string") return null; try { - const parsed = new URL(url); - if (["http:", "https:", "data:"].includes(parsed.protocol)) { - return url; - } - return null; + const parsed = new URL(raw); + const allowed = ["https:", "http:", "data:"]; + if (!allowed.includes(parsed.protocol)) return null; + return parsed.href; } catch { - if (!url.includes(":")) return url; + if (typeof raw === "string" && !raw.includes(":")) return raw; return null; } } @@ -88,21 +87,21 @@ document.addEventListener("DOMContentLoaded", () => { const cloakIcon = localStorage.getItem("CustomIcon") || localStorage.getItem("icon"); if (cloakName) title.textContent = cloakName; if (cloakIcon) { - const safeIcon = sanitizeUrl(cloakIcon); + const safeIcon = reconstructSafeUrl(cloakIcon); if (safeIcon) icon.setAttribute("href", safeIcon); } // Event Key Logic const eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; - const pLink = localStorage.getItem("pLink") || "https://classroom.google.com/"; + const rawPLink = localStorage.getItem("pLink") || "https://classroom.google.com/"; + const pLink = reconstructSafeUrl(rawPLink) ?? "https://classroom.google.com/"; let pressedKeys = []; document.addEventListener("keydown", event => { pressedKeys.push(event.key); const recentKeys = pressedKeys.slice(-eventKey.length); if (recentKeys.length === eventKey.length && eventKey.every((key, i) => key === recentKeys[i])) { - const safeLink = sanitizeUrl(pLink); - if (safeLink) window.location.href = safeLink; + window.location.replace(pLink); pressedKeys = []; } }); From 2ce321ca11b23828988eb646c4fb00bf0f10b31e Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 07:30:00 -0400 Subject: [PATCH 044/115] fix: properly sanitize urls to prevent xss --- static/assets/js/main.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/static/assets/js/main.js b/static/assets/js/main.js index c4f9daf544..6ee894e304 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -94,14 +94,19 @@ document.addEventListener("DOMContentLoaded", () => { // Event Key Logic const eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; const rawPLink = localStorage.getItem("pLink") || "https://classroom.google.com/"; - const pLink = reconstructSafeUrl(rawPLink) ?? "https://classroom.google.com/"; - let pressedKeys = []; + const safePLink = reconstructSafeUrl(rawPLink) ?? "https://classroom.google.com/"; + + const panicAnchor = document.createElement("a"); + panicAnchor.href = safePLink; + panicAnchor.style.display = "none"; + document.body.appendChild(panicAnchor); + let pressedKeys = []; document.addEventListener("keydown", event => { pressedKeys.push(event.key); const recentKeys = pressedKeys.slice(-eventKey.length); if (recentKeys.length === eventKey.length && eventKey.every((key, i) => key === recentKeys[i])) { - window.location.replace(pLink); + panicAnchor.click(); pressedKeys = []; } }); From 7f4c316d3da4c969c255b2340e65721599b12209 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 10:24:46 -0400 Subject: [PATCH 045/115] chore: bump deps --- package-lock.json | 362 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 356 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 564218144d..ced9398254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,10 @@ "version": "5.2.5", "license": "GPL-3.0-or-later", "dependencies": { + "@mercuryworkshop/bare-mux": "^2.1.8", + "@mercuryworkshop/epoxy-transport": "2.1.28", + "@mercuryworkshop/scramjet": "^1.0.2", + "@mercuryworkshop/wisp-js": "^0.4.1", "@nebula-services/bare-server-node": "^2.0.4", "chalk": "^5.4.1", "cookie-parser": "^1.4.7", @@ -16,6 +20,7 @@ "dotenv": "^17.2.0", "express": "^4.21.2", "express-basic-auth": "^1.2.1", + "express-rate-limit": "^8.4.1", "mime": "^4.1.0", "node-fetch": "^3.3.2" }, @@ -181,6 +186,67 @@ "node": ">=14.21.3" } }, + "node_modules/@mercuryworkshop/bare-mux": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/bare-mux/-/bare-mux-2.1.9.tgz", + "integrity": "sha512-fiOqWm3VP0Bl8T+0l+qnb7ab9zO+PpKVbtJvOnMsefUv6kWIaoDtqyr9hd/t4gA8oBwgtyZVqIwO2J9nKY9ylw==" + }, + "node_modules/@mercuryworkshop/epoxy-tls": { + "version": "2.1.18-1", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/epoxy-tls/-/epoxy-tls-2.1.18-1.tgz", + "integrity": "sha512-2N1BYn/+FJxIbRw+sipbl3mQPinRflqQDB9HGAXJEVj4Ok4FIlTlS4fO2cpXKEq5yoD3oaKb8GyNaQfndNui9w==", + "license": "AGPL-3.0-only" + }, + "node_modules/@mercuryworkshop/epoxy-transport": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/epoxy-transport/-/epoxy-transport-2.1.28.tgz", + "integrity": "sha512-lv/Kfdn37y8ZCXQaIT3Ebj4OSztBqeXdbR9rchbHQBKIw/fNSQJLGNBHV5ScXSzqt7NCwv8ZiZx7urRyk7Ua/Q==", + "license": "AGPL-3.0-only", + "dependencies": { + "@mercuryworkshop/epoxy-tls": "2.1.18-1" + } + }, + "node_modules/@mercuryworkshop/scramjet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/scramjet/-/scramjet-1.1.0.tgz", + "integrity": "sha512-T/9GZqAQX42eYr/t6VGR2m9J4BtIuncRkANo8hBVTGskrr522yuhaADhSu+65DYlhUyQnLUjDikuNYzlgv0Ejw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mercuryworkshop/bare-mux": "^2.1.9", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "htmlparser2": "10.0.0", + "idb": "^8.0.3", + "parse-domain": "^8.2.2", + "set-cookie-parser": "^2.7.1" + } + }, + "node_modules/@mercuryworkshop/wisp-js": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/wisp-js/-/wisp-js-0.4.1.tgz", + "integrity": "sha512-104LwiXiuhti/e32gmv0Da0u0yuLFDHX8JawCzleTPWJ5t5qTX4EYi4E7/ucbjBPN9wwVPWHE5g5yGqzl/NzQA==", + "license": "AGPL-3.0", + "dependencies": { + "bufferutil": "^4.0.9", + "commander": "^14.0.2", + "ipaddr.js": "^2.3.0", + "ws": "^8.18.3" + }, + "bin": { + "wisp-js-server": "src/bin/server_cli.mjs" + } + }, + "node_modules/@mercuryworkshop/wisp-js/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/@nebula-services/bare-server-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@nebula-services/bare-server-node/-/bare-server-node-2.0.4.tgz", @@ -289,6 +355,19 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, + "node_modules/bufferutil": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", + "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -329,6 +408,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/clone-regexp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", + "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", + "license": "MIT", + "dependencies": { + "is-regexp": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -359,6 +453,18 @@ "node": ">= 0.6" } }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -454,6 +560,61 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dotenv": { "version": "17.2.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", @@ -480,6 +641,18 @@ "node": ">= 0.8" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -571,6 +744,24 @@ "basic-auth": "^2.0.1" } }, + "node_modules/express-rate-limit": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.4.1.tgz", + "integrity": "sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==", + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/express/node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", @@ -660,6 +851,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", + "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -739,6 +942,37 @@ "node": ">= 0.4" } }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -767,21 +1001,76 @@ "node": ">=0.10.0" } }, + "node_modules/idb": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.3.tgz", + "integrity": "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==", + "license": "ISC" + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", "license": "MIT", "engines": { "node": ">= 10" } }, + "node_modules/is-ip": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", + "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", + "license": "MIT", + "dependencies": { + "ip-regex": "^5.0.0", + "super-regex": "^0.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -896,6 +1185,17 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -929,6 +1229,18 @@ "node": ">= 0.8" } }, + "node_modules/parse-domain": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-domain/-/parse-domain-8.3.0.tgz", + "integrity": "sha512-oOjqUI93wiFHJlywlOKU9FEw60Q0LMy8S1s/AhnVhCB9LZkwIsCIZfqujeJ16u7rRzLdTEY2OpxlGRhLdnNNYA==", + "license": "MIT", + "dependencies": { + "is-ip": "^5.0.1" + }, + "bin": { + "parse-domain-update": "bin/update.js" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1097,6 +1409,12 @@ "node": ">= 0.8.0" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -1166,6 +1484,38 @@ "node": ">= 0.8" } }, + "node_modules/super-regex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", + "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==", + "license": "MIT", + "dependencies": { + "clone-regexp": "^3.0.0", + "function-timeout": "^0.1.0", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "license": "MIT", + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1225,9 +1575,9 @@ } }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "license": "MIT", "engines": { "node": ">=10.0.0" From b379334e3768372b25bcc012e9215249555b18bf Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 10:28:02 -0400 Subject: [PATCH 046/115] chore: bump deps and ran pnpm audit --- package-lock.json | 398 ++++++++++++++++++++++++++++++---------------- package.json | 10 +- 2 files changed, 268 insertions(+), 140 deletions(-) diff --git a/package-lock.json b/package-lock.json index ced9398254..bd42f6db51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -326,29 +326,73 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -377,17 +421,27 @@ "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -524,23 +578,6 @@ "ms": "2.0.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -626,6 +663,20 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -654,13 +705,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -674,6 +722,18 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -690,39 +750,39 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -762,15 +822,6 @@ "express": ">= 4.11" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -864,16 +915,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -882,34 +938,23 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { + "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -919,9 +964,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -931,9 +976,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1071,6 +1116,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1206,9 +1260,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -1251,9 +1305,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/proxy-addr": { @@ -1279,12 +1333,12 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -1303,16 +1357,45 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1415,39 +1498,76 @@ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" diff --git a/package.json b/package.json index a801a08c9f..bf416198a1 100644 --- a/package.json +++ b/package.json @@ -33,5 +33,13 @@ "devDependencies": { "@biomejs/biome": "2.2.2" }, - "packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319" + "packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319", + "pnpm": { + "overrides": { + "qs@>=6.7.0 <=6.14.1": ">=6.14.2", + "qs@<6.14.1": ">=6.14.1", + "path-to-regexp@<0.1.13": ">=0.1.13", + "uuid@<14.0.0": ">=14.0.0" + } + } } From c563a014a7cebbb90027a173df0dbf90c569ecb2 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 10:28:55 -0400 Subject: [PATCH 047/115] chore: bump deps (forgot to run pnpm i) --- pnpm-lock.yaml | 199 ++++++++++++++++++++++++++++++------------------- 1 file changed, 122 insertions(+), 77 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5fe38e231..db31a7ad6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,12 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + qs@>=6.7.0 <=6.14.1: '>=6.14.2' + qs@<6.14.1: '>=6.14.1' + path-to-regexp@<0.1.13: '>=0.1.13' + uuid@<14.0.0: '>=14.0.0' + importers: .: @@ -333,8 +339,12 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} chalk@5.4.1: @@ -388,10 +398,6 @@ packages: supports-color: optional: true - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -421,6 +427,10 @@ packages: resolution: {integrity: sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -436,14 +446,18 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + esbuild-server@0.3.0: resolution: {integrity: sha512-8RuzIdM13gs7MyYwxn/c88nDdx086aREBvzWDk4G3cC7nudF8480OTrvAvanVmFZ9anDv9U4cRX/OKbladaRVA==} engines: {node: '>=14'} @@ -498,22 +512,20 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} hasown@2.0.2: @@ -550,6 +562,10 @@ packages: resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -610,8 +626,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -621,15 +638,15 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + qs@6.15.1: + resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} range-parser@1.2.1: @@ -657,15 +674,23 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} source-map-support@0.5.21: @@ -695,8 +720,8 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true vary@1.1.2: @@ -849,7 +874,7 @@ snapshots: '@mercuryworkshop/bare-mux@1.1.4': dependencies: '@types/uuid': 9.0.8 - uuid: 9.0.1 + uuid: 14.0.0 '@mercuryworkshop/bare-mux@2.1.8': {} @@ -927,7 +952,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.13.0 + qs: 6.15.1 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -942,13 +967,15 @@ snapshots: bytes@3.1.2: {} - call-bind@1.0.7: + call-bind-apply-helpers@1.0.2: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 chalk@5.4.1: {} @@ -984,12 +1011,6 @@ snapshots: dependencies: ms: 2.0.0 - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - depd@2.0.0: {} destroy@1.2.0: {} @@ -1016,6 +1037,12 @@ snapshots: dotenv@17.2.0: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + ee-first@1.1.1: {} encodeurl@1.0.2: {} @@ -1024,12 +1051,14 @@ snapshots: entities@4.5.0: {} - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + esbuild-server@0.3.0(esbuild@0.28.0): dependencies: esbuild: 0.28.0 @@ -1097,9 +1126,9 @@ snapshots: methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.12 + path-to-regexp: 8.4.2 proxy-addr: 2.0.7 - qs: 6.13.0 + qs: 6.15.1 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.0 @@ -1139,25 +1168,27 @@ snapshots: function-bind@1.1.2: {} - get-intrinsic@1.2.4: + get-intrinsic@1.3.0: dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 - gopd@1.0.1: + get-proto@1.0.1: dependencies: - get-intrinsic: 1.2.4 + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 + gopd@1.2.0: {} - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} hasown@2.0.2: dependencies: @@ -1192,6 +1223,8 @@ snapshots: ipaddr.js@2.3.0: {} + math-intrinsics@1.1.0: {} + media-typer@0.3.0: {} merge-descriptors@1.0.3: {} @@ -1228,7 +1261,7 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.1: {} + object-inspect@1.13.4: {} on-finished@2.4.1: dependencies: @@ -1236,16 +1269,16 @@ snapshots: parseurl@1.3.3: {} - path-to-regexp@0.1.12: {} + path-to-regexp@8.4.2: {} proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - qs@6.13.0: + qs@6.15.1: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 range-parser@1.2.1: {} @@ -1289,23 +1322,35 @@ snapshots: transitivePeerDependencies: - supports-color - set-function-length@1.2.2: + setprototypeof@1.2.0: {} + + side-channel-list@1.0.1: dependencies: - define-data-property: 1.1.4 es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 + object-inspect: 1.13.4 - setprototypeof@1.2.0: {} + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 - side-channel@1.0.6: + side-channel@1.1.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 source-map-support@0.5.21: dependencies: @@ -1327,7 +1372,7 @@ snapshots: utils-merge@1.0.1: {} - uuid@9.0.1: {} + uuid@14.0.0: {} vary@1.1.2: {} From 57b3ec3f658352e5a35a281de066ad19ab15a2e5 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 10:32:37 -0400 Subject: [PATCH 048/115] chore: update version in security.md --- SECURITY.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 19149333c7..bdbb2aadf9 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,10 +6,10 @@ Only current versions of the site are being updated, if you are using an older v | Version | Supported | | ------- | --------- | -| V5.2.x | ✔️ | -| V5.1.x | :x: | -| V5.0.x | :x: | -| V4.x.x | :x: | +| V5.4.x | ✔️ | +| V5.3.x | :x: | +| V5.2.x | :x: | +| < V5.0 | :x: | | < V4.0 | :x: | ## Reporting a Vulnerability From 8047ea666698daa13ae0e544ba5894cadaaf4b57 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 10:34:25 -0400 Subject: [PATCH 049/115] fix: resolve startup crash by reverting express-rate-limit back to v7 --- index.js | 6 +++--- package-lock.json | 20 ++++---------------- package.json | 4 ++-- pnpm-lock.yaml | 17 +++++------------ 4 files changed, 14 insertions(+), 33 deletions(-) diff --git a/index.js b/index.js index cea775bb12..d9f003cef9 100644 --- a/index.js +++ b/index.js @@ -26,8 +26,8 @@ wisp.options.allow_loopback_ips = true; wisp.options.allow_private_ips = true; const generalLimiter = rateLimit({ - windowMs: 60 * 1000, - max: 100, + windowMs: 60 * 1000, + max: 100, standardHeaders: true, legacyHeaders: false, message: "Too many requests, please try again later.", @@ -164,4 +164,4 @@ server.on("listening", () => { console.log(chalk.green(`🌍 Server is running on http://localhost:${PORT}`)); }); -server.listen({ port: PORT }); \ No newline at end of file +server.listen({ port: PORT }); diff --git a/package-lock.json b/package-lock.json index bd42f6db51..0cb523e555 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "dotenv": "^17.2.0", "express": "^4.21.2", "express-basic-auth": "^1.2.1", - "express-rate-limit": "^8.4.1", + "express-rate-limit": "^7.5.0", "mime": "^4.1.0", "node-fetch": "^3.3.2" }, @@ -805,13 +805,10 @@ } }, "node_modules/express-rate-limit": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.4.1.tgz", - "integrity": "sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", "license": "MIT", - "dependencies": { - "ip-address": "10.1.0" - }, "engines": { "node": ">= 16" }, @@ -1058,15 +1055,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/ip-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", diff --git a/package.json b/package.json index bf416198a1..a18c4ea6d0 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "dotenv": "^17.2.0", "express": "^4.21.2", "express-basic-auth": "^1.2.1", - "express-rate-limit": "^8.4.1", + "express-rate-limit": "^7.5.0", "mime": "^4.1.0", "node-fetch": "^3.3.2" }, @@ -42,4 +42,4 @@ "uuid@<14.0.0": ">=14.0.0" } } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db31a7ad6b..40733997d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: specifier: ^1.2.1 version: 1.2.1 express-rate-limit: - specifier: ^8.4.1 - version: 8.4.1(express@4.21.2) + specifier: ^7.5.0 + version: 7.5.1(express@4.21.2) mime: specifier: ^4.1.0 version: 4.1.0 @@ -479,8 +479,8 @@ packages: express-basic-auth@1.2.1: resolution: {integrity: sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==} - express-rate-limit@8.4.1: - resolution: {integrity: sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==} + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -546,10 +546,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -1100,10 +1096,9 @@ snapshots: dependencies: basic-auth: 2.0.1 - express-rate-limit@8.4.1(express@4.21.2): + express-rate-limit@7.5.1(express@4.21.2): dependencies: express: 4.21.2 - ip-address: 10.1.0 express@4.21.2: dependencies: @@ -1215,8 +1210,6 @@ snapshots: inherits@2.0.4: {} - ip-address@10.1.0: {} - ipaddr.js@1.9.1: {} ipaddr.js@2.2.0: {} From e97dc11d9b15a9be0202af7e8285745bdf2b5f19 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 4 May 2026 10:53:35 -0400 Subject: [PATCH 050/115] refactor: move proxy handling into main.js --- static/404.html | 1 - static/apps.html | 1 - static/assets/js/main.js | 20 ++++++++++++++++++++ static/assets/js/mg-pxy.js | 30 ------------------------------ static/games.html | 1 - static/index.html | 1 - static/settings.html | 1 - static/tabs.html | 1 - 8 files changed, 20 insertions(+), 36 deletions(-) delete mode 100644 static/assets/js/mg-pxy.js diff --git a/static/404.html b/static/404.html index 9da8a9e2ce..01f153c348 100644 --- a/static/404.html +++ b/static/404.html @@ -35,7 +35,6 @@

Page not found.

- diff --git a/static/apps.html b/static/apps.html index 0aca1a9099..b5aa483f40 100644 --- a/static/apps.html +++ b/static/apps.html @@ -12,7 +12,6 @@ - - diff --git a/static/index.html b/static/index.html index efaa471eec..7c94c6b253 100644 --- a/static/index.html +++ b/static/index.html @@ -31,7 +31,6 @@

Interstell - diff --git a/static/settings.html b/static/settings.html index 9e98af7abd..d9c2323506 100644 --- a/static/settings.html +++ b/static/settings.html @@ -230,7 +230,6 @@

Information

- diff --git a/static/tabs.html b/static/tabs.html index 7bbb69a21c..0ec96ab354 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -66,7 +66,6 @@ - -
-

Interstellar

-

-
-
- -
-
+
+

Interstellar

+

+
+
+ +
From 58f0f0b95b262745c1d8028746bb754aaa9f3e66 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Tue, 5 May 2026 08:33:33 -0400 Subject: [PATCH 055/115] fix: update paths for dynamic and minify js --- static/assets/dynamic/client.js | 31 ++------------------ static/assets/dynamic/config.js | 50 ++++++++++++++++---------------- static/assets/dynamic/handler.js | 2 +- static/assets/dynamic/html.js | 2 +- static/assets/dynamic/worker.js | 2 +- 5 files changed, 31 insertions(+), 56 deletions(-) diff --git a/static/assets/dynamic/client.js b/static/assets/dynamic/client.js index 40dffc9e7d..85fd893687 100644 --- a/static/assets/dynamic/client.js +++ b/static/assets/dynamic/client.js @@ -1,30 +1,5 @@ -(()=>{var aa=Object.create,Xe=Object.defineProperty,sa=Object.getOwnPropertyDescriptor,oa=Object.getOwnPropertyNames,ca=Object.getPrototypeOf,ua=Object.prototype.hasOwnProperty,la=(e,t,i)=>t in e?Xe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i,Tt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),dr=(e,t)=>{for(var i in t)Xe(e,i,{get:t[i],enumerable:!0})},ha=(e,t,i,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let n of oa(t))ua.call(e,n)||n===i||Xe(e,n,{get:()=>t[n],enumerable:!(r=sa(t,n))||r.enumerable});return e},Qe=(e,t,i)=>(i=null!=e?aa(ca(e)):{},ha(!t&&e&&e.__esModule?i:Xe(i,"default",{value:e,enumerable:!0}),e)),q=(e,t,i)=>(la(e,"symbol"!=typeof t?t+"":t,i),i),Nt=Tt((e,t)=>{function i(e){if("string"!=typeof e)throw TypeError("Path must be a string. Received "+JSON.stringify(e))}function r(e,t){for(var i,r="",n=0,s=-1,a=0,o=0;o<=e.length;++o){if(o2){var c=r.lastIndexOf("/");if(c!==r.length-1){-1===c?(r="",n=0):n=(r=r.slice(0,c)).length-1-r.lastIndexOf("/"),s=o,a=0;continue}}else if(2===r.length||1===r.length){r="",n=0,s=o,a=0;continue}}t&&(r.length>0?r+="/..":r="..",n=2)}else r.length>0?r+="/"+e.slice(s+1,o):r=e.slice(s+1,o),n=o-s-1}s=o,a=0}else 46===i&&-1!==a?++a:a=-1}return r}function n(e,t){var i=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return i?i===t.root?i+r:i+e+r:r}var s={resolve(){for(var e,t,n="",s=!1,a=arguments.length-1;a>=-1&&!s;a--)a>=0?e=arguments[a]:(void 0===t&&(t=process.cwd()),e=t),i(e),0!==e.length&&(n=e+"/"+n,s=47===e.charCodeAt(0));return n=r(n,!s),s?n.length>0?"/"+n:"/":n.length>0?n:"."},normalize(e){if(i(e),0===e.length)return".";var t=47===e.charCodeAt(0),n=47===e.charCodeAt(e.length-1);return 0!==(e=r(e,!t)).length||t||(e="."),e.length>0&&n&&(e+="/"),t?"/"+e:e},isAbsolute:e=>(i(e),e.length>0&&47===e.charCodeAt(0)),join(){if(0===arguments.length)return".";for(var e,t=0;t0&&(void 0===e?e=r:e+="/"+r)}return void 0===e?".":s.normalize(e)},relative(e,t){if(i(e),i(t),e===t||(e=s.resolve(e))===(t=s.resolve(t)))return"";for(var r=1;rl){if(47===t.charCodeAt(o+p))return t.slice(o+p+1);if(0===p)return t.slice(o+p)}else a>l&&(47===e.charCodeAt(r+p)?h=p:0===p&&(h=0));break}var d=e.charCodeAt(r+p);if(d!==t.charCodeAt(o+p))break;47===d&&(h=p)}var m="";for(p=r+h+1;p<=n;++p)(p===n||47===e.charCodeAt(p))&&(0===m.length?m+="..":m+="/..");return m.length>0?m+t.slice(o+h):(o+=h,47===t.charCodeAt(o)&&++o,t.slice(o))},_makeLong:e=>e,dirname(e){if(i(e),0===e.length)return".";for(var t=e.charCodeAt(0),r=47===t,n=-1,s=!0,a=e.length-1;a>=1;--a)if(47===(t=e.charCodeAt(a))){if(!s){n=a;break}}else s=!1;return -1===n?r?"/":".":r&&1===n?"//":e.slice(0,n)},basename(e,t){if(void 0!==t&&"string"!=typeof t)throw TypeError('"ext" argument must be a string');i(e);var r,n=0,s=-1,a=!0;if(void 0!==t&&t.length>0&&t.length<=e.length){if(t.length===e.length&&t===e)return"";var o=t.length-1,c=-1;for(r=e.length-1;r>=0;--r){var u=e.charCodeAt(r);if(47===u){if(!a){n=r+1;break}}else -1===c&&(a=!1,c=r+1),o>=0&&(u===t.charCodeAt(o)?-1==--o&&(s=r):(o=-1,s=c))}return n===s?s=c:-1===s&&(s=e.length),e.slice(n,s)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!a){n=r+1;break}}else -1===s&&(a=!1,s=r+1);return -1===s?"":e.slice(n,s)},extname(e){i(e);for(var t=-1,r=0,n=-1,s=!0,a=0,o=e.length-1;o>=0;--o){var c=e.charCodeAt(o);if(47===c){if(!s){r=o+1;break}continue}-1===n&&(s=!1,n=o+1),46===c?-1===t?t=o:1!==a&&(a=1):-1!==t&&(a=-1)}return -1===t||-1===n||0===a||1===a&&t===n-1&&t===r+1?"":e.slice(t,n)},format(e){if(null===e||"object"!=typeof e)throw TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return n("/",e)},parse(e){i(e);var t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;var r,n=e.charCodeAt(0),s=47===n;s?(t.root="/",r=1):r=0;for(var a=-1,o=0,c=-1,u=!0,l=e.length-1,h=0;l>=r;--l){if(47===(n=e.charCodeAt(l))){if(!u){o=l+1;break}continue}-1===c&&(u=!1,c=l+1),46===n?-1===a?a=l:1!==h&&(h=1):-1!==a&&(h=-1)}return -1===a||-1===c||0===h||1===h&&a===c-1&&a===o+1?-1!==c&&(0===o&&s?t.base=t.name=e.slice(1,c):t.base=t.name=e.slice(o,c)):(0===o&&s?(t.name=e.slice(1,a),t.base=e.slice(1,c)):(t.name=e.slice(o,a),t.base=e.slice(o,c)),t.ext=e.slice(a,c)),o>0?t.dir=e.slice(0,o-1):s&&(t.dir="/"),t},sep:"/",delimiter:":",win32:null,posix:null};s.posix=s,t.exports=s}),vn=Tt(e=>{e.parse=r,e.serialize=n;var t=Object.prototype.toString,i=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;function r(e,t){if("string"!=typeof e)throw TypeError("argument str must be a string");for(var i={},r=(t||{}).decode||s,n=0;n{var i={decodeValues:!0,map:!1,silent:!1};function r(e){return"string"==typeof e&&!!e.trim()}function n(e,t){var n=e.split(";").filter(r),a=s(n.shift()),o=a.name,c=a.value;t=t?Object.assign({},i,t):i;try{c=t.decodeValues?decodeURIComponent(c):c}catch(u){console.error("set-cookie-parser encountered an error while decoding a cookie with value '"+c+"'. Set options.decodeValues to false to disable this feature.",u)}var l={name:o,value:c};return n.forEach(e=>{var t=e.split("="),i=t.shift().trimLeft().toLowerCase(),r=t.join("=");"expires"===i?l.expires=new Date(r):"max-age"===i?l.maxAge=Number.parseInt(r,10):"secure"===i?l.secure=!0:"httponly"===i?l.httpOnly=!0:"samesite"===i?l.sameSite=r:l[i]=r}),l}function s(e){var t="",i="",r=e.split("=");return r.length>1?(t=r.shift(),i=r.join("=")):i=e,{name:t,value:i}}function a(e,t){if(t=t?Object.assign({},i,t):i,!e)return t.map?{}:[];if(e.headers){if("function"==typeof e.headers.getSetCookie)e=e.headers.getSetCookie();else if(e.headers["set-cookie"])e=e.headers["set-cookie"];else{var s=e.headers[Object.keys(e.headers).find(e=>"set-cookie"===e.toLowerCase())];s||!e.headers.cookie||t.silent||console.warn("Warning: set-cookie-parser appears to have been called on a request object. It is designed to parse Set-Cookie headers from responses, not Cookie headers from requests. Set the option {silent: true} to suppress this warning."),e=s}}return(Array.isArray(e)||(e=[e]),(t=t?Object.assign({},i,t):i).map)?e.filter(r).reduce((e,i)=>{var r=n(i,t);return e[r.name]=r,e},{}):e.filter(r).map(e=>n(e,t))}function o(e){if(Array.isArray(e))return e;if("string"!=typeof e)return[];var t,i,r,n,s,a=[],o=0;function c(){for(;o=e.length)&&a.push(e.substring(t,e.length))}return a}t.exports=a,t.exports.parse=a,t.exports.parseString=n,t.exports.splitCookiesString=o}),xr=Qe(Nt()),Ye={"application/ecmascript":{source:"apache",compressible:!0,extensions:["ecma"]},"application/gzip":{source:"iana",compressible:!1,extensions:["gz"]},"application/http":{source:"iana"},"application/javascript":{source:"apache",charset:"UTF-8",compressible:!0,extensions:["js"]},"application/json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["json","map"]},"application/manifest+json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["webmanifest"]},"application/marc":{source:"iana",extensions:["mrc"]},"application/mp4":{source:"iana",extensions:["mp4","mpg4","mp4s","m4p"]},"application/ogg":{source:"iana",compressible:!1,extensions:["ogx"]},"application/sql":{source:"iana",extensions:["sql"]},"application/wasm":{source:"iana",compressible:!0,extensions:["wasm"]},"application/x-bittorrent":{source:"apache",extensions:["torrent"]},"application/x-gzip":{source:"apache"},"application/x-javascript":{compressible:!0},"application/x-web-app-manifest+json":{compressible:!0,extensions:["webapp"]},"application/x-www-form-urlencoded":{source:"iana",compressible:!0},"application/xhtml+xml":{source:"iana",compressible:!0,extensions:["xhtml","xht"]},"application/xhtml-voice+xml":{source:"apache",compressible:!0},"application/xml":{source:"iana",compressible:!0,extensions:["xml","xsl","xsd","rng"]},"application/zip":{source:"iana",compressible:!1,extensions:["zip"]},"application/zlib":{source:"iana"},"audio/midi":{source:"apache",extensions:["mid","midi","kar","rmi"]},"audio/mp3":{compressible:!1,extensions:["mp3"]},"audio/mp4":{source:"iana",compressible:!1,extensions:["m4a","mp4a"]},"audio/mp4a-latm":{source:"iana"},"audio/mpa":{source:"iana"},"audio/mpa-robust":{source:"iana"},"audio/mpeg":{source:"iana",compressible:!1,extensions:["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/ogg":{source:"iana",compressible:!1,extensions:["oga","ogg","spx","opus"]},"audio/red":{source:"iana"},"audio/rtx":{source:"iana"},"audio/scip":{source:"iana"},"audio/silk":{source:"apache",extensions:["sil"]},"audio/smv":{source:"iana"},"audio/wav":{compressible:!1,extensions:["wav"]},"audio/wave":{compressible:!1,extensions:["wav"]},"audio/webm":{source:"apache",compressible:!1,extensions:["weba"]},"audio/x-aac":{source:"apache",compressible:!1,extensions:["aac"]},"audio/x-aiff":{source:"apache",extensions:["aif","aiff","aifc"]},"audio/x-caf":{source:"apache",compressible:!1,extensions:["caf"]},"audio/x-flac":{source:"apache",extensions:["flac"]},"audio/x-m4a":{source:"nginx",extensions:["m4a"]},"audio/x-matroska":{source:"apache",extensions:["mka"]},"audio/x-mpegurl":{source:"apache",extensions:["m3u"]},"audio/x-ms-wax":{source:"apache",extensions:["wax"]},"audio/x-ms-wma":{source:"apache",extensions:["wma"]},"audio/x-pn-realaudio":{source:"apache",extensions:["ram","ra"]},"audio/x-pn-realaudio-plugin":{source:"apache",extensions:["rmp"]},"audio/x-realaudio":{source:"nginx",extensions:["ra"]},"audio/x-tta":{source:"apache"},"audio/x-wav":{source:"apache",extensions:["wav"]},"audio/xm":{source:"apache",extensions:["xm"]},"font/collection":{source:"iana",extensions:["ttc"]},"font/otf":{source:"iana",compressible:!0,extensions:["otf"]},"font/sfnt":{source:"iana"},"font/ttf":{source:"iana",compressible:!0,extensions:["ttf"]},"font/woff":{source:"iana",extensions:["woff"]},"font/woff2":{source:"iana",extensions:["woff2"]},"image/gif":{source:"iana",compressible:!1,extensions:["gif"]},"image/heic":{source:"iana",extensions:["heic"]},"image/heic-sequence":{source:"iana",extensions:["heics"]},"image/heif":{source:"iana",extensions:["heif"]},"image/jpeg":{source:"iana",compressible:!1,extensions:["jpeg","jpg","jpe"]},"image/png":{source:"iana",compressible:!1,extensions:["png"]},"image/svg+xml":{source:"iana",compressible:!0,extensions:["svg","svgz"]},"image/webp":{source:"iana",extensions:["webp"]},"text/coffeescript":{extensions:["coffee","litcoffee"]},"text/css":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["css"]},"text/ecmascript":{source:"apache"},"text/html":{source:"iana",compressible:!0,extensions:["html","htm","shtml"]},"text/jade":{extensions:["jade"]},"text/javascript":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["js","mjs"]},"text/markdown":{source:"iana",compressible:!0,extensions:["md","markdown"]}},_r=/^\s*([^;\s]*)(?:;|\s|$)/,fa=/^text\//i,U={};function gr(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&Ye[t[1].toLowerCase()];return i&&i.charset?i.charset:!(!t||!fa.test(t[1]))&&"UTF-8"}function da(e){if(!e||"string"!=typeof e)return!1;var t=-1===e.indexOf("/")?U.lookup(e):e;if(!t)return!1;if(-1===t.indexOf("charset")){var i=U.charset(t);i&&(t+="; charset="+i.toLowerCase())}return t}function ma(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&U.extensions[t[1].toLowerCase()];return!(!i||!i.length)&&i[0]}function ya(e){if(!e||"string"!=typeof e)return!1;var t=(0,xr.extname)("x."+e).toLowerCase().substr(1);return t&&U.types[t]||!1}function ga(e,t){var i=["nginx","apache",void 0,"iana"];Object.keys(Ye).forEach(r=>{var n=Ye[r],s=n.extensions;if(s&&s.length){e[r]=s;for(var a=0;au||c===u&&"application/"===t[o].substr(0,12)))continue}t[o]=r}}})}U.charset=gr,U.charsets={lookup:gr},U.contentType=da,U.extension=ma,U.extensions=Object.create(null),U.lookup=ya,U.types=Object.create(null),ga(U.extensions,U.types);var br=U,Us=Qe(Nt(),1),Je={};dr(Je,{deleteDB:()=>Ca,openDB:()=>Bt,unwrap:()=>Le,wrap:()=>G});var wr,vr,xa=(e,t)=>t.some(t=>e instanceof t);function _a(){return wr||(wr=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function ba(){return vr||(vr=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey,])}var Sr=new WeakMap,Dt=new WeakMap,Er=new WeakMap,Mt=new WeakMap,Vt=new WeakMap;function wa(e){let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("success",n),e.removeEventListener("error",s)},n=()=>{t(G(e.result)),r()},s=()=>{i(e.error),r()};e.addEventListener("success",n),e.addEventListener("error",s)});return t.then(t=>{t instanceof IDBCursor&&Sr.set(t,e)}).catch(()=>{}),Vt.set(t,e),t}function va(e){if(Dt.has(e))return;let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("complete",n),e.removeEventListener("error",s),e.removeEventListener("abort",s)},n=()=>{t(),r()},s=()=>{i(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",n),e.addEventListener("error",s),e.addEventListener("abort",s)});Dt.set(e,t)}var Ot={get(e,t,i){if(e instanceof IDBTransaction){if("done"===t)return Dt.get(e);if("objectStoreNames"===t)return e.objectStoreNames||Er.get(e);if("store"===t)return i.objectStoreNames[1]?void 0:i.objectStore(i.objectStoreNames[0])}return G(e[t])},set:(e,t,i)=>(e[t]=i,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function Cr(e){Ot=e(Ot)}function Sa(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?ba().includes(e)?function(...t){return e.apply(Le(this),t),G(Sr.get(this))}:function(...t){return G(e.apply(Le(this),t))}:function(t,...i){let r=e.call(Le(this),t,...i);return Er.set(r,t.sort?t.sort():[t]),G(r)}}function Ea(e){return"function"==typeof e?Sa(e):(e instanceof IDBTransaction&&va(e),xa(e,_a())?new Proxy(e,Ot):e)}function G(e){if(e instanceof IDBRequest)return wa(e);if(Mt.has(e))return Mt.get(e);let t=Ea(e);return t!==e&&(Mt.set(e,t),Vt.set(t,e)),t}var Le=e=>Vt.get(e);function Bt(e,t,{blocked:i,upgrade:r,blocking:n,terminated:s}={}){let a=indexedDB.open(e,t),o=G(a);return r&&a.addEventListener("upgradeneeded",e=>{r(G(a.result),e.oldVersion,e.newVersion,G(a.transaction),e)}),i&&a.addEventListener("blocked",e=>i(e.oldVersion,e.newVersion,e)),o.then(e=>{s&&e.addEventListener("close",()=>s()),n&&e.addEventListener("versionchange",e=>n(e.oldVersion,e.newVersion,e))}).catch(()=>{}),o}function Ca(e,{blocked:t}={}){let i=indexedDB.deleteDatabase(e);return t&&i.addEventListener("blocked",e=>t(e.oldVersion,e)),G(i).then(()=>{})}var ka=["get","getKey","getAll","getAllKeys","count"],Aa=["put","add","delete","clear"],Ft=new Map;function kr(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&"string"==typeof t))return;if(Ft.get(t))return Ft.get(t);let i=t.replace(/FromIndex$/,""),r=t!==i,n=Aa.includes(i);if(!(i in(r?IDBIndex:IDBObjectStore).prototype)||!(n||ka.includes(i)))return;let s=async function(e,...t){let s=this.transaction(e,n?"readwrite":"readonly"),a=s.store;return r&&(a=a.index(t.shift())),(await Promise.all([a[i](...t),n&&s.done]))[0]};return Ft.set(t,s),s}Cr(e=>({...e,get:(t,i,r)=>kr(t,i)||e.get(t,i,r),has:(t,i)=>!!kr(t,i)||e.has(t,i)}));var La=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,81,2,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,10,1,2,0,49,6,4,4,14,9,5351,0,7,14,13835,9,87,9,39,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,4706,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,983,6,110,6,6,9,4759,9,787719,239,],Ir=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,68,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,4026,582,8634,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8936,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,757,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4153,7,221,3,5761,15,7472,3104,541,1507,4938,6,4191,],Pa="‌‍\xb7̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-ᫎᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_",Tr="\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꟊꟐꟑꟓꟕ-ꟙꟲ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",$t={3:"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",5:"class enum extends super const export import",6:"enum",strict:"implements interface let package private protected public static yield",strictBind:"eval arguments"},jt="break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this",Ra={5:jt,"5module":jt+" export import",6:jt+" const class extends export import super"},Ia=/^in(stanceof)?$/,Ta=RegExp("["+Tr+"]"),Na=RegExp("["+Tr+Pa+"]");function Ht(e,t){for(var i=65536,r=0;re);r+=2)if((i+=t[r+1])>=e)return!0;return!1}function ce(e,t){return e<65?36===e:e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Ta.test(String.fromCharCode(e)):!1!==t&&Ht(e,Ir)))}function be(e,t){return e<48?36===e:e<58||!(e<65)&&(e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Na.test(String.fromCharCode(e)):!1!==t&&(Ht(e,Ir)||Ht(e,La)))))}var L=function(e,t){void 0===t&&(t={}),this.label=e,this.keyword=t.keyword,this.beforeExpr=!!t.beforeExpr,this.startsExpr=!!t.startsExpr,this.isLoop=!!t.isLoop,this.isAssign=!!t.isAssign,this.prefix=!!t.prefix,this.postfix=!!t.postfix,this.binop=t.binop||null,this.updateContext=null};function z(e,t){return new L(e,{beforeExpr:!0,binop:t})}var K={beforeExpr:!0},H={startsExpr:!0},Gt={};function k(e,t){return void 0===t&&(t={}),t.keyword=e,Gt[e]=new L(e,t)}var u={num:new L("num",H),regexp:new L("regexp",H),string:new L("string",H),name:new L("name",H),privateId:new L("privateId",H),eof:new L("eof"),bracketL:new L("[",{beforeExpr:!0,startsExpr:!0}),bracketR:new L("]"),braceL:new L("{",{beforeExpr:!0,startsExpr:!0}),braceR:new L("}"),parenL:new L("(",{beforeExpr:!0,startsExpr:!0}),parenR:new L(")"),comma:new L(",",K),semi:new L(";",K),colon:new L(":",K),dot:new L("."),question:new L("?",K),questionDot:new L("?."),arrow:new L("=>",K),template:new L("template"),invalidTemplate:new L("invalidTemplate"),ellipsis:new L("...",K),backQuote:new L("`",H),dollarBraceL:new L("${",{beforeExpr:!0,startsExpr:!0}),eq:new L("=",{beforeExpr:!0,isAssign:!0}),assign:new L("_=",{beforeExpr:!0,isAssign:!0}),incDec:new L("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new L("!/~",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:z("||",1),logicalAND:z("&&",2),bitwiseOR:z("|",3),bitwiseXOR:z("^",4),bitwiseAND:z("&",5),equality:z("==/!=/===/!==",6),relational:z("/<=/>=",7),bitShift:z("<>/>>>",8),plusMin:new L("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:z("%",10),star:z("*",10),slash:z("/",10),starstar:new L("**",{beforeExpr:!0}),coalesce:z("??",1),_break:k("break"),_case:k("case",K),_catch:k("catch"),_continue:k("continue"),_debugger:k("debugger"),_default:k("default",K),_do:k("do",{isLoop:!0,beforeExpr:!0}),_else:k("else",K),_finally:k("finally"),_for:k("for",{isLoop:!0}),_function:k("function",H),_if:k("if"),_return:k("return",K),_switch:k("switch"),_throw:k("throw",K),_try:k("try"),_var:k("var"),_const:k("const"),_while:k("while",{isLoop:!0}),_with:k("with"),_new:k("new",{beforeExpr:!0,startsExpr:!0}),_this:k("this",H),_super:k("super",H),_class:k("class",H),_extends:k("extends",K),_export:k("export"),_import:k("import",H),_null:k("null",H),_true:k("true",H),_false:k("false",H),_in:k("in",{beforeExpr:!0,binop:7}),_instanceof:k("instanceof",{beforeExpr:!0,binop:7}),_typeof:k("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:k("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:k("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},Y=/\r\n?|\n|\u2028|\u2029/,Ma=RegExp(Y.source,"g");function we(e){return 10===e||13===e||8232===e||8233===e}function Nr(e,t,i){void 0===i&&(i=e.length);for(var r=t;rDa.call(e,t)),Ar=Array.isArray||(e=>"[object Array]"===Oa.call(e));function pe(e){return RegExp("^(?:"+e.replace(/ /g,"|")+")$")}function fe(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(((e-=65536)>>10)+55296,(1023&e)+56320)}var Va=/(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/,Re=function(e,t){this.line=e,this.column=t};Re.prototype.offset=function(e){return new Re(this.line,this.column+e)};var rt=function(e,t,i){this.start=t,this.end=i,null!==e.sourceFile&&(this.source=e.sourceFile)};function Or(e,t){for(var i=1,r=0;;){var n=Nr(e,r,t);if(n<0)return new Re(i,t-r);++i,r=n}}var Wt={ecmaVersion:null,sourceType:"script",onInsertedSemicolon:null,onTrailingComma:null,allowReserved:null,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowAwaitOutsideFunction:null,allowSuperOutsideMethod:null,allowHashBang:!1,checkPrivateFields:!0,locations:!1,onToken:null,onComment:null,ranges:!1,program:null,sourceFile:null,directSourceFile:null,preserveParens:!1},Lr=!1;function Fa(e){var t={};for(var i in Wt)t[i]=e&&Te(e,i)?e[i]:Wt[i];if("latest"===t.ecmaVersion?t.ecmaVersion=1e8:null==t.ecmaVersion?(!Lr&&"object"==typeof console&&console.warn&&(Lr=!0,console.warn(`Since Acorn 8.0.0, options.ecmaVersion is required. -Defaulting to 2020, but this will stop working in the future.`)),t.ecmaVersion=11):t.ecmaVersion>=2015&&(t.ecmaVersion-=2009),null==t.allowReserved&&(t.allowReserved=t.ecmaVersion<5),e&&null!=e.allowHashBang||(t.allowHashBang=t.ecmaVersion>=14),Ar(t.onToken)){var r=t.onToken;t.onToken=e=>r.push(e)}return Ar(t.onComment)&&(t.onComment=Ba(t,t.onComment)),t}function Ba(e,t){return function(i,r,n,s,a,o){var c={type:i?"Block":"Line",value:r,start:n,end:s};e.locations&&(c.loc=new rt(this,a,o)),e.ranges&&(c.range=[n,s]),t.push(c)}}var Ie=1,ve=2,zt=4,Vr=8,Fr=16,Br=32,Kt=64,$r=128,Ne=256,Xt=Ie|ve|Ne;function Qt(e,t){return ve|(e?zt:0)|(t?Vr:0)}var et=0,Yt=1,le=2,jr=3,Ur=4,Hr=5,T=function(e,t,i){this.options=e=Fa(e),this.sourceFile=e.sourceFile,this.keywords=pe(Ra[e.ecmaVersion>=6?6:"module"===e.sourceType?"5module":5]);var r="";!0!==e.allowReserved&&(r=$t[e.ecmaVersion>=6?6:5===e.ecmaVersion?5:3],"module"===e.sourceType&&(r+=" await")),this.reservedWords=pe(r);var n=(r?r+" ":"")+$t.strict;this.reservedWordsStrict=pe(n),this.reservedWordsStrictBind=pe(n+" "+$t.strictBind),this.input=String(t),this.containsEsc=!1,i?(this.pos=i,this.lineStart=this.input.lastIndexOf(` -`,i-1)+1,this.curLine=this.input.slice(0,this.lineStart).split(Y).length):(this.pos=this.lineStart=0,this.curLine=1),this.type=u.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=this.initialContext(),this.exprAllowed=!0,this.inModule="module"===e.sourceType,this.strict=this.inModule||this.strictDirective(this.pos),this.potentialArrowAt=-1,this.potentialArrowInForAwait=!1,this.yieldPos=this.awaitPos=this.awaitIdentPos=0,this.labels=[],this.undefinedExports=Object.create(null),0===this.pos&&e.allowHashBang&&"#!"===this.input.slice(0,2)&&this.skipLineComment(2),this.scopeStack=[],this.enterScope(Ie),this.regexpState=null,this.privateNameStack=[]},ie={inFunction:{configurable:!0},inGenerator:{configurable:!0},inAsync:{configurable:!0},canAwait:{configurable:!0},allowSuper:{configurable:!0},allowDirectSuper:{configurable:!0},treatFunctionsAsVar:{configurable:!0},allowNewDotTarget:{configurable:!0},inClassStaticBlock:{configurable:!0}};T.prototype.parse=function(){var e=this.options.program||this.startNode();return this.nextToken(),this.parseTopLevel(e)},ie.inFunction.get=function(){return(this.currentVarScope().flags&ve)>0},ie.inGenerator.get=function(){return(this.currentVarScope().flags&Vr)>0&&!this.currentVarScope().inClassFieldInit},ie.inAsync.get=function(){return(this.currentVarScope().flags&zt)>0&&!this.currentVarScope().inClassFieldInit},ie.canAwait.get=function(){for(var e=this.scopeStack.length-1;e>=0;e--){var t=this.scopeStack[e];if(t.inClassFieldInit||t.flags&Ne)return!1;if(t.flags&ve)return(t.flags&zt)>0}return this.inModule&&this.options.ecmaVersion>=13||this.options.allowAwaitOutsideFunction},ie.allowSuper.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&Kt)>0||i||this.options.allowSuperOutsideMethod},ie.allowDirectSuper.get=function(){return(this.currentThisScope().flags&$r)>0},ie.treatFunctionsAsVar.get=function(){return this.treatFunctionsAsVarInScope(this.currentScope())},ie.allowNewDotTarget.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&(ve|Ne))>0||i},ie.inClassStaticBlock.get=function(){return(this.currentVarScope().flags&Ne)>0},T.extend=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var i=this,r=0;r=,?^&]/.test(n)||"!"===n&&"="===this.input.charAt(r+1))}e+=t[0].length,X.lastIndex=e,e+=X.exec(this.input)[0].length,";"===this.input[e]&&e++}},$.eat=function(e){return this.type===e&&(this.next(),!0)},$.isContextual=function(e){return this.type===u.name&&this.value===e&&!this.containsEsc},$.eatContextual=function(e){return!!this.isContextual(e)&&(this.next(),!0)},$.expectContextual=function(e){this.eatContextual(e)||this.unexpected()},$.canInsertSemicolon=function(){return this.type===u.eof||this.type===u.braceR||Y.test(this.input.slice(this.lastTokEnd,this.start))},$.insertSemicolon=function(){if(this.canInsertSemicolon())return this.options.onInsertedSemicolon&&this.options.onInsertedSemicolon(this.lastTokEnd,this.lastTokEndLoc),!0},$.semicolon=function(){this.eat(u.semi)||this.insertSemicolon()||this.unexpected()},$.afterTrailingComma=function(e,t){if(this.type===e)return this.options.onTrailingComma&&this.options.onTrailingComma(this.lastTokStart,this.lastTokStartLoc),t||this.next(),!0},$.expect=function(e){this.eat(e)||this.unexpected()},$.unexpected=function(e){this.raise(e??this.start,"Unexpected token")};var nt=function(){this.shorthandAssign=this.trailingComma=this.parenthesizedAssign=this.parenthesizedBind=this.doubleProto=-1};$.checkPatternErrors=function(e,t){if(e){e.trailingComma>-1&&this.raiseRecoverable(e.trailingComma,"Comma is not permitted after the rest element");var i=t?e.parenthesizedAssign:e.parenthesizedBind;i>-1&&this.raiseRecoverable(i,t?"Assigning to rvalue":"Parenthesized pattern")}},$.checkExpressionErrors=function(e,t){if(!e)return!1;var i=e.shorthandAssign,r=e.doubleProto;if(!t)return i>=0||r>=0;i>=0&&this.raise(i,"Shorthand property assignments are valid only in destructuring patterns"),r>=0&&this.raiseRecoverable(r,"Redefinition of __proto__ property")},$.checkYieldAwaitInDefaultParams=function(){this.yieldPos&&(!this.awaitPos||this.yieldPos55295&&r<56320)return!0;if(ce(r,!0)){for(var n=i+1;be(r=this.input.charCodeAt(n),!0);)++n;if(92===r||r>55295&&r<56320)return!0;var s=this.input.slice(i,n);if(!Ia.test(s))return!0}return!1},w.isAsyncFunction=function(){if(this.options.ecmaVersion<8||!this.isContextual("async"))return!1;X.lastIndex=this.pos;var e,t=X.exec(this.input),i=this.pos+t[0].length;return!Y.test(this.input.slice(this.pos,i))&&"function"===this.input.slice(i,i+8)&&(i+8===this.input.length||!(be(e=this.input.charCodeAt(i+8))||e>55295&&e<56320))},w.parseStatement=function(e,t,i){var r,n=this.type,s=this.startNode();switch(this.isLet(e)&&(n=u._var,r="let"),n){case u._break:case u._continue:return this.parseBreakContinueStatement(s,n.keyword);case u._debugger:return this.parseDebuggerStatement(s);case u._do:return this.parseDoStatement(s);case u._for:return this.parseForStatement(s);case u._function:return e&&(this.strict||"if"!==e&&"label"!==e)&&this.options.ecmaVersion>=6&&this.unexpected(),this.parseFunctionStatement(s,!1,!e);case u._class:return e&&this.unexpected(),this.parseClass(s,!0);case u._if:return this.parseIfStatement(s);case u._return:return this.parseReturnStatement(s);case u._switch:return this.parseSwitchStatement(s);case u._throw:return this.parseThrowStatement(s);case u._try:return this.parseTryStatement(s);case u._const:case u._var:return r=r||this.value,e&&"var"!==r&&this.unexpected(),this.parseVarStatement(s,r);case u._while:return this.parseWhileStatement(s);case u._with:return this.parseWithStatement(s);case u.braceL:return this.parseBlock(!0,s);case u.semi:return this.parseEmptyStatement(s);case u._export:case u._import:if(this.options.ecmaVersion>10&&n===u._import){X.lastIndex=this.pos;var a=X.exec(this.input),o=this.pos+a[0].length,c=this.input.charCodeAt(o);if(40===c||46===c)return this.parseExpressionStatement(s,this.parseExpression())}return this.options.allowImportExportEverywhere||(t||this.raise(this.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'")),n===u._import?this.parseImport(s):this.parseExport(s,i);default:if(this.isAsyncFunction())return e&&this.unexpected(),this.next(),this.parseFunctionStatement(s,!0,!e);var l=this.value,h=this.parseExpression();return n===u.name&&"Identifier"===h.type&&this.eat(u.colon)?this.parseLabeledStatement(s,l,h,e):this.parseExpressionStatement(s,h)}},w.parseBreakContinueStatement=function(e,t){var i="break"===t;this.next(),this.eat(u.semi)||this.insertSemicolon()?e.label=null:this.type!==u.name?this.unexpected():(e.label=this.parseIdent(),this.semicolon());for(var r=0;r=6?this.eat(u.semi):this.semicolon(),this.finishNode(e,"DoWhileStatement")},w.parseForStatement=function(e){this.next();var t=this.options.ecmaVersion>=9&&this.canAwait&&this.eatContextual("await")?this.lastTokStart:-1;if(this.labels.push(Jt),this.enterScope(0),this.expect(u.parenL),this.type===u.semi)return t>-1&&this.unexpected(t),this.parseFor(e,null);var i=this.isLet();if(this.type===u._var||this.type===u._const||i){var r=this.startNode(),n=i?"let":this.value;return this.next(),this.parseVar(r,!0,n),this.finishNode(r,"VariableDeclaration"),(this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of"))&&1===r.declarations.length?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),this.parseForIn(e,r)):(t>-1&&this.unexpected(t),this.parseFor(e,r))}var s=this.isContextual("let"),a=!1,o=new nt,c=this.parseExpression(!(t>-1)||"await",o);return this.type===u._in||(a=this.options.ecmaVersion>=6&&this.isContextual("of"))?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),s&&a&&this.raise(c.start,"The left-hand side of a for-of loop may not start with 'let'."),this.toAssignable(c,!1,o),this.checkLValPattern(c),this.parseForIn(e,c)):(this.checkExpressionErrors(o,!0),t>-1&&this.unexpected(t),this.parseFor(e,c))},w.parseFunctionStatement=function(e,t,i){return this.next(),this.parseFunction(e,Pe|(i?0:qt),!1,t)},w.parseIfStatement=function(e){return this.next(),e.test=this.parseParenExpression(),e.consequent=this.parseStatement("if"),e.alternate=this.eat(u._else)?this.parseStatement("if"):null,this.finishNode(e,"IfStatement")},w.parseReturnStatement=function(e){return this.inFunction||this.options.allowReturnOutsideFunction||this.raise(this.start,"'return' outside of function"),this.next(),this.eat(u.semi)||this.insertSemicolon()?e.argument=null:(e.argument=this.parseExpression(),this.semicolon()),this.finishNode(e,"ReturnStatement")},w.parseSwitchStatement=function(e){this.next(),e.discriminant=this.parseParenExpression(),e.cases=[],this.expect(u.braceL),this.labels.push(ja),this.enterScope(0);for(var t,i=!1;this.type!==u.braceR;)if(this.type===u._case||this.type===u._default){var r=this.type===u._case;t&&this.finishNode(t,"SwitchCase"),e.cases.push(t=this.startNode()),t.consequent=[],this.next(),r?t.test=this.parseExpression():(i&&this.raiseRecoverable(this.lastTokStart,"Multiple default clauses"),i=!0,t.test=null),this.expect(u.colon)}else t||this.unexpected(),t.consequent.push(this.parseStatement(null));return this.exitScope(),t&&this.finishNode(t,"SwitchCase"),this.next(),this.labels.pop(),this.finishNode(e,"SwitchStatement")},w.parseThrowStatement=function(e){return this.next(),Y.test(this.input.slice(this.lastTokEnd,this.start))&&this.raise(this.lastTokEnd,"Illegal newline after throw"),e.argument=this.parseExpression(),this.semicolon(),this.finishNode(e,"ThrowStatement")};var Ua=[];w.parseCatchClauseParam=function(){var e=this.parseBindingAtom(),t="Identifier"===e.type;return this.enterScope(t?Br:0),this.checkLValPattern(e,t?Ur:le),this.expect(u.parenR),e},w.parseTryStatement=function(e){if(this.next(),e.block=this.parseBlock(),e.handler=null,this.type===u._catch){var t=this.startNode();this.next(),this.eat(u.parenL)?t.param=this.parseCatchClauseParam():(this.options.ecmaVersion<10&&this.unexpected(),t.param=null,this.enterScope(0)),t.body=this.parseBlock(!1),this.exitScope(),e.handler=this.finishNode(t,"CatchClause")}return e.finalizer=this.eat(u._finally)?this.parseBlock():null,e.handler||e.finalizer||this.raise(e.start,"Missing catch or finally clause"),this.finishNode(e,"TryStatement")},w.parseVarStatement=function(e,t,i){return this.next(),this.parseVar(e,!1,t,i),this.semicolon(),this.finishNode(e,"VariableDeclaration")},w.parseWhileStatement=function(e){return this.next(),e.test=this.parseParenExpression(),this.labels.push(Jt),e.body=this.parseStatement("while"),this.labels.pop(),this.finishNode(e,"WhileStatement")},w.parseWithStatement=function(e){return this.strict&&this.raise(this.start,"'with' in strict mode"),this.next(),e.object=this.parseParenExpression(),e.body=this.parseStatement("with"),this.finishNode(e,"WithStatement")},w.parseEmptyStatement=function(e){return this.next(),this.finishNode(e,"EmptyStatement")},w.parseLabeledStatement=function(e,t,i,r){for(var n=0,s=this.labels;n=0;o--){var c=this.labels[o];if(c.statementStart===e.start)c.statementStart=this.start,c.kind=a;else break}return this.labels.push({name:t,kind:a,statementStart:this.start}),e.body=this.parseStatement(r?-1===r.indexOf("label")?r+"label":r:"label"),this.labels.pop(),e.label=i,this.finishNode(e,"LabeledStatement")},w.parseExpressionStatement=function(e,t){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},w.parseBlock=function(e,t,i){for(void 0===e&&(e=!0),void 0===t&&(t=this.startNode()),t.body=[],this.expect(u.braceL),e&&this.enterScope(0);this.type!==u.braceR;){var r=this.parseStatement(null);t.body.push(r)}return i&&(this.strict=!1),this.next(),e&&this.exitScope(),this.finishNode(t,"BlockStatement")},w.parseFor=function(e,t){return e.init=t,this.expect(u.semi),e.test=this.type===u.semi?null:this.parseExpression(),this.expect(u.semi),e.update=this.type===u.parenR?null:this.parseExpression(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,"ForStatement")},w.parseForIn=function(e,t){var i=this.type===u._in;return this.next(),"VariableDeclaration"===t.type&&null!=t.declarations[0].init&&(!i||this.options.ecmaVersion<8||this.strict||"var"!==t.kind||"Identifier"!==t.declarations[0].id.type)&&this.raise(t.start,(i?"for-in":"for-of")+" loop variable declaration may not have an initializer"),e.left=t,e.right=i?this.parseExpression():this.parseMaybeAssign(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,i?"ForInStatement":"ForOfStatement")},w.parseVar=function(e,t,i,r){for(e.declarations=[],e.kind=i;;){var n=this.startNode();if(this.parseVarId(n,i),this.eat(u.eq)?n.init=this.parseMaybeAssign(t):r||"const"!==i||this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of")?r||"Identifier"===n.id.type||t&&(this.type===u._in||this.isContextual("of"))?n.init=null:this.raise(this.lastTokEnd,"Complex binding patterns require an initialization value"):this.unexpected(),e.declarations.push(this.finishNode(n,"VariableDeclarator")),!this.eat(u.comma))break}return e},w.parseVarId=function(e,t){e.id=this.parseBindingAtom(),this.checkLValPattern(e.id,"var"===t?Yt:le,!1)};var Pe=1,qt=2,Wr=4;function Ha(e,t){var i=t.key.name,r=e[i],n="true";return"MethodDefinition"===t.type&&("get"===t.kind||"set"===t.kind)&&(n=(t.static?"s":"i")+t.kind),"iget"===r&&"iset"===n||"iset"===r&&"iget"===n||"sget"===r&&"sset"===n||"sset"===r&&"sget"===n?(e[i]="true",!1):!!r||(e[i]=n,!1)}function tt(e,t){var i=e.computed,r=e.key;return!i&&("Identifier"===r.type&&r.name===t||"Literal"===r.type&&r.value===t)}w.parseFunction=function(e,t,i,r,n){this.initFunction(e),(this.options.ecmaVersion>=9||this.options.ecmaVersion>=6&&!r)&&(this.type===u.star&&t&qt&&this.unexpected(),e.generator=this.eat(u.star)),this.options.ecmaVersion>=8&&(e.async=!!r),t&Pe&&(e.id=t&Wr&&this.type!==u.name?null:this.parseIdent(),e.id&&!(t&qt)&&this.checkLValSimple(e.id,this.strict||e.generator||e.async?this.treatFunctionsAsVar?Yt:le:jr));var s=this.yieldPos,a=this.awaitPos,o=this.awaitIdentPos;return this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(e.async,e.generator)),t&Pe||(e.id=this.type===u.name?this.parseIdent():null),this.parseFunctionParams(e),this.parseFunctionBody(e,i,!1,n),this.yieldPos=s,this.awaitPos=a,this.awaitIdentPos=o,this.finishNode(e,t&Pe?"FunctionDeclaration":"FunctionExpression")},w.parseFunctionParams=function(e){this.expect(u.parenL),e.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams()},w.parseClass=function(e,t){this.next();var i=this.strict;this.strict=!0,this.parseClassId(e,t),this.parseClassSuper(e);var r=this.enterClassBody(),n=this.startNode(),s=!1;for(n.body=[],this.expect(u.braceL);this.type!==u.braceR;){var a=this.parseClassElement(null!==e.superClass);a&&(n.body.push(a),"MethodDefinition"===a.type&&"constructor"===a.kind?(s&&this.raiseRecoverable(a.start,"Duplicate constructor in the same class"),s=!0):a.key&&"PrivateIdentifier"===a.key.type&&Ha(r,a)&&this.raiseRecoverable(a.key.start,"Identifier '#"+a.key.name+"' has already been declared"))}return this.strict=i,this.next(),e.body=this.finishNode(n,"ClassBody"),this.exitClassBody(),this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},w.parseClassElement=function(e){if(this.eat(u.semi))return null;var t=this.options.ecmaVersion,i=this.startNode(),r="",n=!1,s=!1,a="method",o=!1;if(this.eatContextual("static")){if(t>=13&&this.eat(u.braceL))return this.parseClassStaticBlock(i),i;this.isClassElementNameStart()||this.type===u.star?o=!0:r="static"}if(i.static=o,!r&&t>=8&&this.eatContextual("async")&&((this.isClassElementNameStart()||this.type===u.star)&&!this.canInsertSemicolon()?s=!0:r="async"),!r&&(t>=9||!s)&&this.eat(u.star)&&(n=!0),!r&&!s&&!n){var c=this.value;(this.eatContextual("get")||this.eatContextual("set"))&&(this.isClassElementNameStart()?a=c:r=c)}if(r?(i.computed=!1,i.key=this.startNodeAt(this.lastTokStart,this.lastTokStartLoc),i.key.name=r,this.finishNode(i.key,"Identifier")):this.parseClassElementName(i),t<13||this.type===u.parenL||"method"!==a||n||s){var l=!i.static&&tt(i,"constructor");l&&"method"!==a&&this.raise(i.key.start,"Constructor can't have get/set modifier"),i.kind=l?"constructor":a,this.parseClassMethod(i,n,s,l&&e)}else this.parseClassField(i);return i},w.isClassElementNameStart=function(){return this.type===u.name||this.type===u.privateId||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword},w.parseClassElementName=function(e){this.type===u.privateId?("constructor"===this.value&&this.raise(this.start,"Classes can't have an element named '#constructor'"),e.computed=!1,e.key=this.parsePrivateIdent()):this.parsePropertyName(e)},w.parseClassMethod=function(e,t,i,r){var n=e.key;"constructor"===e.kind?(t&&this.raise(n.start,"Constructor can't be a generator"),i&&this.raise(n.start,"Constructor can't be an async method")):e.static&&tt(e,"prototype")&&this.raise(n.start,"Classes may not have a static property named prototype");var s=e.value=this.parseMethod(t,i,r);return"get"===e.kind&&0!==s.params.length&&this.raiseRecoverable(s.start,"getter should have no params"),"set"===e.kind&&1!==s.params.length&&this.raiseRecoverable(s.start,"setter should have exactly one param"),"set"===e.kind&&"RestElement"===s.params[0].type&&this.raiseRecoverable(s.params[0].start,"Setter cannot use rest params"),this.finishNode(e,"MethodDefinition")},w.parseClassField=function(e){if(tt(e,"constructor")?this.raise(e.key.start,"Classes can't have a field named 'constructor'"):e.static&&tt(e,"prototype")&&this.raise(e.key.start,"Classes can't have a static field named 'prototype'"),this.eat(u.eq)){var t=this.currentThisScope(),i=t.inClassFieldInit;t.inClassFieldInit=!0,e.value=this.parseMaybeAssign(),t.inClassFieldInit=i}else e.value=null;return this.semicolon(),this.finishNode(e,"PropertyDefinition")},w.parseClassStaticBlock=function(e){e.body=[];var t=this.labels;for(this.labels=[],this.enterScope(Ne|Kt);this.type!==u.braceR;){var i=this.parseStatement(null);e.body.push(i)}return this.next(),this.exitScope(),this.labels=t,this.finishNode(e,"StaticBlock")},w.parseClassId=function(e,t){this.type===u.name?(e.id=this.parseIdent(),t&&this.checkLValSimple(e.id,le,!1)):(!0===t&&this.unexpected(),e.id=null)},w.parseClassSuper=function(e){e.superClass=this.eat(u._extends)?this.parseExprSubscripts(null,!1):null},w.enterClassBody=function(){var e={declared:Object.create(null),used:[]};return this.privateNameStack.push(e),e.declared},w.exitClassBody=function(){var e=this.privateNameStack.pop(),t=e.declared,i=e.used;if(this.options.checkPrivateFields)for(var r=this.privateNameStack.length,n=0===r?null:this.privateNameStack[r-1],s=0;s=11&&(this.eatContextual("as")?(e.exported=this.parseModuleExportName(),this.checkExport(t,e.exported,this.lastTokStart)):e.exported=null),this.expectContextual("from"),this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom(),this.semicolon(),this.finishNode(e,"ExportAllDeclaration")},w.parseExport=function(e,t){if(this.next(),this.eat(u.star))return this.parseExportAllDeclaration(e,t);if(this.eat(u._default))return this.checkExport(t,"default",this.lastTokStart),e.declaration=this.parseExportDefaultDeclaration(),this.finishNode(e,"ExportDefaultDeclaration");if(this.shouldParseExportStatement())e.declaration=this.parseExportDeclaration(e),"VariableDeclaration"===e.declaration.type?this.checkVariableExport(t,e.declaration.declarations):this.checkExport(t,e.declaration.id,e.declaration.id.start),e.specifiers=[],e.source=null;else{if(e.declaration=null,e.specifiers=this.parseExportSpecifiers(t),this.eatContextual("from"))this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom();else{for(var i=0,r=e.specifiers;i=13&&this.type===u.string){var e=this.parseLiteral(this.value);return Va.test(e.value)&&this.raise(e.start,"An export name cannot include a lone surrogate."),e}return this.parseIdent(!0)},w.adaptDirectivePrologue=function(e){for(var t=0;t=5&&"ExpressionStatement"===e.type&&"Literal"===e.expression.type&&"string"==typeof e.expression.value&&('"'===this.input[e.start]||"'"===this.input[e.start])};var J=T.prototype;J.toAssignable=function(e,t,i){if(this.options.ecmaVersion>=6&&e)switch(e.type){case"Identifier":this.inAsync&&"await"===e.name&&this.raise(e.start,"Cannot use 'await' as identifier inside an async function");break;case"ObjectPattern":case"ArrayPattern":case"AssignmentPattern":case"RestElement":break;case"ObjectExpression":e.type="ObjectPattern",i&&this.checkPatternErrors(i,!0);for(var r=0,n=e.properties;r=8&&!o&&"async"===c.name&&!this.canInsertSemicolon()&&this.eat(u._function))return this.overrideContext(R.f_expr),this.parseFunction(this.startNodeAt(s,a),0,!1,!0,t);if(n&&!this.canInsertSemicolon()){if(this.eat(u.arrow))return this.parseArrowExpression(this.startNodeAt(s,a),[c],!1,t);if(this.options.ecmaVersion>=8&&"async"===c.name&&this.type===u.name&&!o&&(!this.potentialArrowInForAwait||"of"!==this.value||this.containsEsc))return c=this.parseIdent(!1),(this.canInsertSemicolon()||!this.eat(u.arrow))&&this.unexpected(),this.parseArrowExpression(this.startNodeAt(s,a),[c],!0,t)}return c;case u.regexp:var l=this.value;return(r=this.parseLiteral(l.value)).regex={pattern:l.pattern,flags:l.flags},r;case u.num:case u.string:return this.parseLiteral(this.value);case u._null:case u._true:case u._false:return(r=this.startNode()).value=this.type===u._null?null:this.type===u._true,r.raw=this.type.keyword,this.next(),this.finishNode(r,"Literal");case u.parenL:var h=this.start,p=this.parseParenAndDistinguishExpression(n,t);return e&&(e.parenthesizedAssign<0&&!this.isSimpleAssignTarget(p)&&(e.parenthesizedAssign=h),e.parenthesizedBind<0&&(e.parenthesizedBind=h)),p;case u.bracketL:return r=this.startNode(),this.next(),r.elements=this.parseExprList(u.bracketR,!0,!0,e),this.finishNode(r,"ArrayExpression");case u.braceL:return this.overrideContext(R.b_expr),this.parseObj(!1,e);case u._function:return r=this.startNode(),this.next(),this.parseFunction(r,0);case u._class:return this.parseClass(this.startNode(),!1);case u._new:return this.parseNew();case u.backQuote:return this.parseTemplate();case u._import:return this.options.ecmaVersion>=11?this.parseExprImport(i):this.unexpected();default:return this.parseExprAtomDefault()}},v.parseExprAtomDefault=function(){this.unexpected()},v.parseExprImport=function(e){var t=this.startNode();this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword import");var i=this.parseIdent(!0);return this.type!==u.parenL||e?this.type===u.dot?(t.meta=i,this.parseImportMeta(t)):void this.unexpected():this.parseDynamicImport(t)},v.parseDynamicImport=function(e){if(this.next(),e.source=this.parseMaybeAssign(),!this.eat(u.parenR)){var t=this.start;this.eat(u.comma)&&this.eat(u.parenR)?this.raiseRecoverable(t,"Trailing comma is not allowed in import()"):this.unexpected(t)}return this.finishNode(e,"ImportExpression")},v.parseImportMeta=function(e){this.next();var t=this.containsEsc;return e.property=this.parseIdent(!0),"meta"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for import is 'import.meta'"),t&&this.raiseRecoverable(e.start,"'import.meta' must not contain escaped characters"),"module"===this.options.sourceType||this.options.allowImportExportEverywhere||this.raiseRecoverable(e.start,"Cannot use 'import.meta' outside a module"),this.finishNode(e,"MetaProperty")},v.parseLiteral=function(e){var t=this.startNode();return t.value=e,t.raw=this.input.slice(this.start,this.end),110===t.raw.charCodeAt(t.raw.length-1)&&(t.bigint=t.raw.slice(0,-1).replace(/_/g,"")),this.next(),this.finishNode(t,"Literal")},v.parseParenExpression=function(){this.expect(u.parenL);var e=this.parseExpression();return this.expect(u.parenR),e},v.shouldParseArrow=function(e){return!this.canInsertSemicolon()},v.parseParenAndDistinguishExpression=function(e,t){var i,r=this.start,n=this.startLoc,s=this.options.ecmaVersion>=8;if(this.options.ecmaVersion>=6){this.next();var a,o=this.start,c=this.startLoc,l=[],h=!0,p=!1,d=new nt,m=this.yieldPos,f=this.awaitPos;for(this.yieldPos=0,this.awaitPos=0;this.type!==u.parenR;)if(h?h=!1:this.expect(u.comma),s&&this.afterTrailingComma(u.parenR,!0)){p=!0;break}else if(this.type===u.ellipsis){a=this.start,l.push(this.parseParenItem(this.parseRestBinding())),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element");break}else l.push(this.parseMaybeAssign(!1,d,this.parseParenItem));var $=this.lastTokEnd,y=this.lastTokEndLoc;if(this.expect(u.parenR),e&&this.shouldParseArrow(l)&&this.eat(u.arrow))return this.checkPatternErrors(d,!1),this.checkYieldAwaitInDefaultParams(),this.yieldPos=m,this.awaitPos=f,this.parseParenArrowList(r,n,l,t);(!l.length||p)&&this.unexpected(this.lastTokStart),a&&this.unexpected(a),this.checkExpressionErrors(d,!0),this.yieldPos=m||this.yieldPos,this.awaitPos=f||this.awaitPos,l.length>1?((i=this.startNodeAt(o,c)).expressions=l,this.finishNodeAt(i,"SequenceExpression",$,y)):i=l[0]}else i=this.parseParenExpression();if(!this.options.preserveParens)return i;var _=this.startNodeAt(r,n);return _.expression=i,this.finishNode(_,"ParenthesizedExpression")},v.parseParenItem=e=>e,v.parseParenArrowList=function(e,t,i,r){return this.parseArrowExpression(this.startNodeAt(e,t),i,!1,r)};var Wa=[];v.parseNew=function(){this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword new");var e=this.startNode(),t=this.parseIdent(!0);if(this.options.ecmaVersion>=6&&this.eat(u.dot)){e.meta=t;var i=this.containsEsc;return e.property=this.parseIdent(!0),"target"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for new is 'new.target'"),i&&this.raiseRecoverable(e.start,"'new.target' must not contain escaped characters"),this.allowNewDotTarget||this.raiseRecoverable(e.start,"'new.target' can only be used in functions and class static block"),this.finishNode(e,"MetaProperty")}var r=this.start,n=this.startLoc;return e.callee=this.parseSubscripts(this.parseExprAtom(null,!1,!0),r,n,!0,!1),this.eat(u.parenL)?e.arguments=this.parseExprList(u.parenR,this.options.ecmaVersion>=8,!1):e.arguments=Wa,this.finishNode(e,"NewExpression")},v.parseTemplateElement=function(e){var t=e.isTagged,i=this.startNode();return this.type===u.invalidTemplate?(t||this.raiseRecoverable(this.start,"Bad escape sequence in untagged template literal"),i.value={raw:this.value,cooked:null}):i.value={raw:this.input.slice(this.start,this.end).replace(/\r\n?/g,` -`),cooked:this.value},this.next(),i.tail=this.type===u.backQuote,this.finishNode(i,"TemplateElement")},v.parseTemplate=function(e){void 0===e&&(e={});var t=e.isTagged;void 0===t&&(t=!1);var i=this.startNode();this.next(),i.expressions=[];var r=this.parseTemplateElement({isTagged:t});for(i.quasis=[r];!r.tail;)this.type===u.eof&&this.raise(this.pos,"Unterminated template literal"),this.expect(u.dollarBraceL),i.expressions.push(this.parseExpression()),this.expect(u.braceR),i.quasis.push(r=this.parseTemplateElement({isTagged:t}));return this.next(),this.finishNode(i,"TemplateLiteral")},v.isAsyncProp=function(e){return!e.computed&&"Identifier"===e.key.type&&"async"===e.key.name&&(this.type===u.name||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword||this.options.ecmaVersion>=9&&this.type===u.star)&&!Y.test(this.input.slice(this.lastTokEnd,this.start))},v.parseObj=function(e,t){var i=this.startNode(),r=!0,n={};for(i.properties=[],this.next();!this.eat(u.braceR);){if(r)r=!1;else if(this.expect(u.comma),this.options.ecmaVersion>=5&&this.afterTrailingComma(u.braceR))break;var s=this.parseProperty(e,t);e||this.checkPropClash(s,n,t),i.properties.push(s)}return this.finishNode(i,e?"ObjectPattern":"ObjectExpression")},v.parseProperty=function(e,t){var i,r,n,s,a=this.startNode();if(this.options.ecmaVersion>=9&&this.eat(u.ellipsis))return e?(a.argument=this.parseIdent(!1),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element"),this.finishNode(a,"RestElement")):(a.argument=this.parseMaybeAssign(!1,t),this.type===u.comma&&t&&t.trailingComma<0&&(t.trailingComma=this.start),this.finishNode(a,"SpreadElement"));this.options.ecmaVersion>=6&&(a.method=!1,a.shorthand=!1,(e||t)&&(n=this.start,s=this.startLoc),e||(i=this.eat(u.star)));var o=this.containsEsc;return this.parsePropertyName(a),!e&&!o&&this.options.ecmaVersion>=8&&!i&&this.isAsyncProp(a)?(r=!0,i=this.options.ecmaVersion>=9&&this.eat(u.star),this.parsePropertyName(a)):r=!1,this.parsePropertyValue(a,e,i,r,n,s,t,o),this.finishNode(a,"Property")},v.parseGetterSetter=function(e){e.kind=e.key.name,this.parsePropertyName(e),e.value=this.parseMethod(!1);var t="get"===e.kind?0:1;if(e.value.params.length!==t){var i=e.value.start;"get"===e.kind?this.raiseRecoverable(i,"getter should have no params"):this.raiseRecoverable(i,"setter should have exactly one param")}else"set"===e.kind&&"RestElement"===e.value.params[0].type&&this.raiseRecoverable(e.value.params[0].start,"Setter cannot use rest params")},v.parsePropertyValue=function(e,t,i,r,n,s,a,o){(i||r)&&this.type===u.colon&&this.unexpected(),this.eat(u.colon)?(e.value=t?this.parseMaybeDefault(this.start,this.startLoc):this.parseMaybeAssign(!1,a),e.kind="init"):this.options.ecmaVersion>=6&&this.type===u.parenL?(t&&this.unexpected(),e.kind="init",e.method=!0,e.value=this.parseMethod(i,r)):t||o||!(this.options.ecmaVersion>=5)||e.computed||"Identifier"!==e.key.type||"get"!==e.key.name&&"set"!==e.key.name||this.type===u.comma||this.type===u.braceR||this.type===u.eq?this.options.ecmaVersion>=6&&!e.computed&&"Identifier"===e.key.type?((i||r)&&this.unexpected(),this.checkUnreserved(e.key),"await"!==e.key.name||this.awaitIdentPos||(this.awaitIdentPos=n),e.kind="init",t?e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key)):this.type===u.eq&&a?(a.shorthandAssign<0&&(a.shorthandAssign=this.start),e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key))):e.value=this.copyNode(e.key),e.shorthand=!0):this.unexpected():((i||r)&&this.unexpected(),this.parseGetterSetter(e))},v.parsePropertyName=function(e){if(this.options.ecmaVersion>=6){if(this.eat(u.bracketL))return e.computed=!0,e.key=this.parseMaybeAssign(),this.expect(u.bracketR),e.key;e.computed=!1}return e.key=this.type===u.num||this.type===u.string?this.parseExprAtom():this.parseIdent("never"!==this.options.allowReserved)},v.initFunction=function(e){e.id=null,this.options.ecmaVersion>=6&&(e.generator=e.expression=!1),this.options.ecmaVersion>=8&&(e.async=!1)},v.parseMethod=function(e,t,i){var r=this.startNode(),n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.initFunction(r),this.options.ecmaVersion>=6&&(r.generator=e),this.options.ecmaVersion>=8&&(r.async=!!t),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(t,r.generator)|Kt|(i?$r:0)),this.expect(u.parenL),r.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams(),this.parseFunctionBody(r,!1,!0,!1),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(r,"FunctionExpression")},v.parseArrowExpression=function(e,t,i,r){var n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.enterScope(Qt(i,!1)|Fr),this.initFunction(e),this.options.ecmaVersion>=8&&(e.async=!!i),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,e.params=this.toAssignableList(t,!0),this.parseFunctionBody(e,!0,!1,r),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(e,"ArrowFunctionExpression")},v.parseFunctionBody=function(e,t,i,r){var n=t&&this.type!==u.braceL,s=this.strict,a=!1;if(n)e.body=this.parseMaybeAssign(r),e.expression=!0,this.checkParams(e,!1);else{var o=this.options.ecmaVersion>=7&&!this.isSimpleParamList(e.params);(!s||o)&&(a=this.strictDirective(this.end))&&o&&this.raiseRecoverable(e.start,"Illegal 'use strict' directive in function with non-simple parameter list");var c=this.labels;this.labels=[],a&&(this.strict=!0),this.checkParams(e,!s&&!a&&!t&&!i&&this.isSimpleParamList(e.params)),this.strict&&e.id&&this.checkLValSimple(e.id,Hr),e.body=this.parseBlock(!1,void 0,a&&!s),e.expression=!1,this.adaptDirectivePrologue(e.body.body),this.labels=c}this.exitScope()},v.isSimpleParamList=e=>{for(var t,i=0,r=e;i-1||n.functions.indexOf(e)>-1||n.var.indexOf(e)>-1,n.lexical.push(e),this.inModule&&n.flags&Ie&&delete this.undefinedExports[e]}else if(t===Ur)this.currentScope().lexical.push(e);else if(t===jr){var s=this.currentScope();r=this.treatFunctionsAsVar?s.lexical.indexOf(e)>-1:s.lexical.indexOf(e)>-1||s.var.indexOf(e)>-1,s.functions.push(e)}else for(var a=this.scopeStack.length-1;a>=0;--a){var o=this.scopeStack[a];if(o.lexical.indexOf(e)>-1&&!(o.flags&Br&&o.lexical[0]===e)||!this.treatFunctionsAsVarInScope(o)&&o.functions.indexOf(e)>-1){r=!0;break}if(o.var.push(e),this.inModule&&o.flags&Ie&&delete this.undefinedExports[e],o.flags&Xt)break}r&&this.raiseRecoverable(i,"Identifier '"+e+"' has already been declared")},de.checkLocalExport=function(e){-1===this.scopeStack[0].lexical.indexOf(e.name)&&-1===this.scopeStack[0].var.indexOf(e.name)&&(this.undefinedExports[e.name]=e)},de.currentScope=function(){return this.scopeStack[this.scopeStack.length-1]},de.currentVarScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt)return t}},de.currentThisScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt&&!(t.flags&Fr))return t}};var at=function(e,t,i){this.type="",this.start=t,this.end=0,e.options.locations&&(this.loc=new rt(e,i)),e.options.directSourceFile&&(this.sourceFile=e.options.directSourceFile),e.options.ranges&&(this.range=[t,0])},Me=T.prototype;function Gr(e,t,i,r){return e.type=t,e.end=i,this.options.locations&&(e.loc.end=r),this.options.ranges&&(e.range[1]=i),e}Me.startNode=function(){return new at(this,this.start,this.startLoc)},Me.startNodeAt=function(e,t){return new at(this,e,t)},Me.finishNode=function(e,t){return Gr.call(this,e,t,this.lastTokEnd,this.lastTokEndLoc)},Me.finishNodeAt=function(e,t,i,r){return Gr.call(this,e,t,i,r)},Me.copyNode=function(e){var t=new at(this,e.start,this.startLoc);for(var i in e)t[i]=e[i];return t};var Ka,zr="ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS",Kr=zr+" Extended_Pictographic",Xr=Kr,Qr=Xr+" EBase EComp EMod EPres ExtPict",Yr=Qr,Ga=Yr,za={9:zr,10:Kr,11:Xr,12:Qr,13:Yr,14:Ga},Xa={9:"",10:"",11:"",12:"",13:"",14:"Basic_Emoji Emoji_Keycap_Sequence RGI_Emoji_Modifier_Sequence RGI_Emoji_Flag_Sequence RGI_Emoji_Tag_Sequence RGI_Emoji_ZWJ_Sequence RGI_Emoji"},Pr="Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu",Jr="Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb",Zr=Jr+" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd",en=Zr+" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho",tn=en+" Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi",rn=tn+" Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith",Qa=rn+" Hrkt Katakana_Or_Hiragana Kawi Nag_Mundari Nagm Unknown Zzzz",Ya={9:Jr,10:Zr,11:en,12:tn,13:rn,14:Qa},nn={};function Ja(e){var t=nn[e]={binary:pe(za[e]+" "+Pr),binaryOfStrings:pe(Xa[e]),nonBinary:{General_Category:pe(Pr),Script:pe(Ya[e])}};t.nonBinary.Script_Extensions=t.nonBinary.Script,t.nonBinary.gc=t.nonBinary.General_Category,t.nonBinary.sc=t.nonBinary.Script,t.nonBinary.scx=t.nonBinary.Script_Extensions}for(Ze=0,Ut=[9,10,11,12,13,14];Ze=6?"uy":"")+(e.options.ecmaVersion>=9?"s":"")+(e.options.ecmaVersion>=13?"d":"")+(e.options.ecmaVersion>=15?"v":""),this.unicodeProperties=nn[e.options.ecmaVersion>=14?14:e.options.ecmaVersion],this.source="",this.flags="",this.start=0,this.switchU=!1,this.switchV=!1,this.switchN=!1,this.pos=0,this.lastIntValue=0,this.lastStringValue="",this.lastAssertionIsQuantifiable=!1,this.numCapturingParens=0,this.maxBackReference=0,this.groupNames=[],this.backReferenceNames=[]};function an(e){return 36===e||e>=40&&e<=43||46===e||63===e||e>=91&&e<=94||e>=123&&e<=125}function Za(e){return ce(e,!0)||36===e||95===e}function es(e){return be(e,!0)||36===e||95===e||8204===e||8205===e}function sn(e){return e>=65&&e<=90||e>=97&&e<=122}function ts(e){return e>=0&&e<=1114111}re.prototype.reset=function(e,t,i){var r=-1!==i.indexOf("v"),n=-1!==i.indexOf("u");this.start=0|e,this.source=t+"",this.flags=i,r&&this.parser.options.ecmaVersion>=15?(this.switchU=!0,this.switchV=!0,this.switchN=!0):(this.switchU=n&&this.parser.options.ecmaVersion>=6,this.switchV=!1,this.switchN=n&&this.parser.options.ecmaVersion>=9)},re.prototype.raise=function(e){this.parser.raiseRecoverable(this.start,"Invalid regular expression: /"+this.source+"/: "+e)},re.prototype.at=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return -1;var n=i.charCodeAt(e);if(!(t||this.switchU)||n<=55295||n>=57344||e+1>=r)return n;var s=i.charCodeAt(e+1);return s>=56320&&s<=57343?(n<<10)+s-56613888:n},re.prototype.nextIndex=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return r;var n,s=i.charCodeAt(e);return!(t||this.switchU)||s<=55295||s>=57344||e+1>=r||(n=i.charCodeAt(e+1))<56320||n>57343?e+1:e+2},re.prototype.current=function(e){return void 0===e&&(e=!1),this.at(this.pos,e)},re.prototype.lookahead=function(e){return void 0===e&&(e=!1),this.at(this.nextIndex(this.pos,e),e)},re.prototype.advance=function(e){void 0===e&&(e=!1),this.pos=this.nextIndex(this.pos,e)},re.prototype.eat=function(e,t){return void 0===t&&(t=!1),this.current(t)===e&&(this.advance(t),!0)},re.prototype.eatChars=function(e,t){void 0===t&&(t=!1);for(var i=this.pos,r=0,n=e;r-1&&this.raise(e.start,"Duplicate regular expression flag"),"u"===a&&(r=!0),"v"===a&&(n=!0)}this.options.ecmaVersion>=15&&r&&n&&this.raise(e.start,"Invalid regular expression flag")},b.validateRegExpPattern=function(e){this.regexp_pattern(e),!e.switchN&&this.options.ecmaVersion>=9&&e.groupNames.length>0&&(e.switchN=!0,this.regexp_pattern(e))},b.regexp_pattern=function(e){e.pos=0,e.lastIntValue=0,e.lastStringValue="",e.lastAssertionIsQuantifiable=!1,e.numCapturingParens=0,e.maxBackReference=0,e.groupNames.length=0,e.backReferenceNames.length=0,this.regexp_disjunction(e),e.pos!==e.source.length&&(e.eat(41)&&e.raise("Unmatched ')'"),(e.eat(93)||e.eat(125))&&e.raise("Lone quantifier brackets")),e.maxBackReference>e.numCapturingParens&&e.raise("Invalid escape");for(var t=0,i=e.backReferenceNames;t=9&&(i=e.eat(60)),e.eat(61)||e.eat(33))return this.regexp_disjunction(e),e.eat(41)||e.raise("Unterminated group"),e.lastAssertionIsQuantifiable=!i,!0}return e.pos=t,!1},b.regexp_eatQuantifier=function(e,t){return void 0===t&&(t=!1),!!this.regexp_eatQuantifierPrefix(e,t)&&(e.eat(63),!0)},b.regexp_eatQuantifierPrefix=function(e,t){return e.eat(42)||e.eat(43)||e.eat(63)||this.regexp_eatBracedQuantifier(e,t)},b.regexp_eatBracedQuantifier=function(e,t){var i=e.pos;if(e.eat(123)){var r=0,n=-1;if(this.regexp_eatDecimalDigits(e)&&(r=e.lastIntValue,e.eat(44)&&this.regexp_eatDecimalDigits(e)&&(n=e.lastIntValue),e.eat(125)))return -1!==n&&n=9?this.regexp_groupSpecifier(e):63===e.current()&&e.raise("Invalid group"),this.regexp_disjunction(e),e.eat(41))return e.numCapturingParens+=1,!0;e.raise("Unterminated group")}return!1},b.regexp_eatExtendedAtom=function(e){return e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)||this.regexp_eatInvalidBracedQuantifier(e)||this.regexp_eatExtendedPatternCharacter(e)},b.regexp_eatInvalidBracedQuantifier=function(e){return this.regexp_eatBracedQuantifier(e,!0)&&e.raise("Nothing to repeat"),!1},b.regexp_eatSyntaxCharacter=e=>{var t=e.current();return!!an(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatPatternCharacters=e=>{for(var t=e.pos,i=0;-1!==(i=e.current())&&!an(i);)e.advance();return e.pos!==t},b.regexp_eatExtendedPatternCharacter=e=>{var t=e.current();return -1!==t&&36!==t&&(!(t>=40)||!(t<=43))&&46!==t&&63!==t&&91!==t&&94!==t&&124!==t&&(e.advance(),!0)},b.regexp_groupSpecifier=function(e){if(e.eat(63)){if(this.regexp_eatGroupName(e)){-1!==e.groupNames.indexOf(e.lastStringValue)&&e.raise("Duplicate capture group name"),e.groupNames.push(e.lastStringValue);return}e.raise("Invalid group")}},b.regexp_eatGroupName=function(e){if(e.lastStringValue="",e.eat(60)){if(this.regexp_eatRegExpIdentifierName(e)&&e.eat(62))return!0;e.raise("Invalid capture group name")}return!1},b.regexp_eatRegExpIdentifierName=function(e){if(e.lastStringValue="",this.regexp_eatRegExpIdentifierStart(e)){for(e.lastStringValue+=fe(e.lastIntValue);this.regexp_eatRegExpIdentifierPart(e);)e.lastStringValue+=fe(e.lastIntValue);return!0}return!1},b.regexp_eatRegExpIdentifierStart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),Za(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatRegExpIdentifierPart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),es(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatAtomEscape=function(e){return!!(this.regexp_eatBackReference(e)||this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)||e.switchN&&this.regexp_eatKGroupName(e))||(e.switchU&&(99===e.current()&&e.raise("Invalid unicode escape"),e.raise("Invalid escape")),!1)},b.regexp_eatBackReference=function(e){var t=e.pos;if(this.regexp_eatDecimalEscape(e)){var i=e.lastIntValue;if(e.switchU)return i>e.maxBackReference&&(e.maxBackReference=i),!0;if(i<=e.numCapturingParens)return!0;e.pos=t}return!1},b.regexp_eatKGroupName=function(e){if(e.eat(107)){if(this.regexp_eatGroupName(e))return e.backReferenceNames.push(e.lastStringValue),!0;e.raise("Invalid named reference")}return!1},b.regexp_eatCharacterEscape=function(e){return this.regexp_eatControlEscape(e)||this.regexp_eatCControlLetter(e)||this.regexp_eatZero(e)||this.regexp_eatHexEscapeSequence(e)||this.regexp_eatRegExpUnicodeEscapeSequence(e,!1)||!e.switchU&&this.regexp_eatLegacyOctalEscapeSequence(e)||this.regexp_eatIdentityEscape(e)},b.regexp_eatCControlLetter=function(e){var t=e.pos;if(e.eat(99)){if(this.regexp_eatControlLetter(e))return!0;e.pos=t}return!1},b.regexp_eatZero=e=>!(48!==e.current()||st(e.lookahead()))&&(e.lastIntValue=0,e.advance(),!0),b.regexp_eatControlEscape=e=>{var t=e.current();return 116===t?(e.lastIntValue=9,e.advance(),!0):110===t?(e.lastIntValue=10,e.advance(),!0):118===t?(e.lastIntValue=11,e.advance(),!0):102===t?(e.lastIntValue=12,e.advance(),!0):114===t&&(e.lastIntValue=13,e.advance(),!0)},b.regexp_eatControlLetter=e=>{var t=e.current();return!!sn(t)&&(e.lastIntValue=t%32,e.advance(),!0)},b.regexp_eatRegExpUnicodeEscapeSequence=function(e,t){void 0===t&&(t=!1);var i=e.pos,r=t||e.switchU;if(e.eat(117)){if(this.regexp_eatFixedHexDigits(e,4)){var n=e.lastIntValue;if(r&&n>=55296&&n<=56319){var s=e.pos;if(e.eat(92)&&e.eat(117)&&this.regexp_eatFixedHexDigits(e,4)){var a=e.lastIntValue;if(a>=56320&&a<=57343)return e.lastIntValue=(n-55296)*1024+(a-56320)+65536,!0}e.pos=s,e.lastIntValue=n}return!0}if(r&&e.eat(123)&&this.regexp_eatHexDigits(e)&&e.eat(125)&&ts(e.lastIntValue))return!0;r&&e.raise("Invalid unicode escape"),e.pos=i}return!1},b.regexp_eatIdentityEscape=function(e){if(e.switchU)return!!this.regexp_eatSyntaxCharacter(e)||!!e.eat(47)&&(e.lastIntValue=47,!0);var t=e.current();return 99!==t&&(!e.switchN||107!==t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatDecimalEscape=e=>{e.lastIntValue=0;var t=e.current();if(t>=49&&t<=57){do e.lastIntValue=10*e.lastIntValue+(t-48),e.advance();while((t=e.current())>=48&&t<=57);return!0}return!1};var on=0,ue=1,Q=2;function is(e){return 100===e||68===e||115===e||83===e||119===e||87===e}function cn(e){return sn(e)||95===e}function rs(e){return cn(e)||st(e)}function ns(e){return 33===e||e>=35&&e<=38||e>=42&&e<=44||46===e||e>=58&&e<=64||94===e||96===e||126===e}function as(e){return 40===e||41===e||45===e||47===e||e>=91&&e<=93||e>=123&&e<=125}function ss(e){return 33===e||35===e||37===e||38===e||44===e||45===e||e>=58&&e<=62||64===e||96===e||126===e}function st(e){return e>=48&&e<=57}function un(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function ln(e){return e>=65&&e<=70?10+(e-65):e>=97&&e<=102?10+(e-97):e-48}function hn(e){return e>=48&&e<=55}b.regexp_eatCharacterClassEscape=function(e){var t,i=e.current();if(is(i))return e.lastIntValue=-1,e.advance(),ue;var r=!1;if(e.switchU&&this.options.ecmaVersion>=9&&((r=80===i)||112===i)){if(e.lastIntValue=-1,e.advance(),e.eat(123)&&(t=this.regexp_eatUnicodePropertyValueExpression(e))&&e.eat(125))return r&&t===Q&&e.raise("Invalid property name"),t;e.raise("Invalid property name")}return on},b.regexp_eatUnicodePropertyValueExpression=function(e){var t=e.pos;if(this.regexp_eatUnicodePropertyName(e)&&e.eat(61)){var i=e.lastStringValue;if(this.regexp_eatUnicodePropertyValue(e)){var r=e.lastStringValue;return this.regexp_validateUnicodePropertyNameAndValue(e,i,r),ue}}if(e.pos=t,this.regexp_eatLoneUnicodePropertyNameOrValue(e)){var n=e.lastStringValue;return this.regexp_validateUnicodePropertyNameOrValue(e,n)}return on},b.regexp_validateUnicodePropertyNameAndValue=(e,t,i)=>{Te(e.unicodeProperties.nonBinary,t)||e.raise("Invalid property name"),e.unicodeProperties.nonBinary[t].test(i)||e.raise("Invalid property value")},b.regexp_validateUnicodePropertyNameOrValue=(e,t)=>e.unicodeProperties.binary.test(t)?ue:e.switchV&&e.unicodeProperties.binaryOfStrings.test(t)?Q:void e.raise("Invalid property name"),b.regexp_eatUnicodePropertyName=e=>{var t=0;for(e.lastStringValue="";cn(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatUnicodePropertyValue=e=>{var t=0;for(e.lastStringValue="";rs(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatLoneUnicodePropertyNameOrValue=function(e){return this.regexp_eatUnicodePropertyValue(e)},b.regexp_eatCharacterClass=function(e){if(e.eat(91)){var t=e.eat(94),i=this.regexp_classContents(e);return e.eat(93)||e.raise("Unterminated character class"),t&&i===Q&&e.raise("Negated character class may contain strings"),!0}return!1},b.regexp_classContents=function(e){return 93===e.current()?ue:e.switchV?this.regexp_classSetExpression(e):(this.regexp_nonEmptyClassRanges(e),ue)},b.regexp_nonEmptyClassRanges=function(e){for(;this.regexp_eatClassAtom(e);){var t=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassAtom(e)){var i=e.lastIntValue;e.switchU&&(-1===t||-1===i)&&e.raise("Invalid character class"),-1!==t&&-1!==i&&t>i&&e.raise("Range out of order in character class")}}},b.regexp_eatClassAtom=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatClassEscape(e))return!0;if(e.switchU){var i=e.current();(99===i||hn(i))&&e.raise("Invalid class escape"),e.raise("Invalid escape")}e.pos=t}var r=e.current();return 93!==r&&(e.lastIntValue=r,e.advance(),!0)},b.regexp_eatClassEscape=function(e){var t=e.pos;if(e.eat(98))return e.lastIntValue=8,!0;if(e.switchU&&e.eat(45))return e.lastIntValue=45,!0;if(!e.switchU&&e.eat(99)){if(this.regexp_eatClassControlLetter(e))return!0;e.pos=t}return this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)},b.regexp_classSetExpression=function(e){var t,i=ue;if(!this.regexp_eatClassSetRange(e)){if(t=this.regexp_eatClassSetOperand(e)){t===Q&&(i=Q);for(var r=e.pos;e.eatChars([38,38]);){if(38!==e.current()&&(t=this.regexp_eatClassSetOperand(e))){t!==Q&&(i=ue);continue}e.raise("Invalid character in character class")}if(r!==e.pos)return i;for(;e.eatChars([45,45]);)this.regexp_eatClassSetOperand(e)||e.raise("Invalid character in character class");if(r!==e.pos)return i}else e.raise("Invalid character in character class")}for(;;)if(!this.regexp_eatClassSetRange(e)){if(!(t=this.regexp_eatClassSetOperand(e)))return i;t===Q&&(i=Q)}},b.regexp_eatClassSetRange=function(e){var t=e.pos;if(this.regexp_eatClassSetCharacter(e)){var i=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassSetCharacter(e)){var r=e.lastIntValue;return -1!==i&&-1!==r&&i>r&&e.raise("Range out of order in character class"),!0}e.pos=t}return!1},b.regexp_eatClassSetOperand=function(e){return this.regexp_eatClassSetCharacter(e)?ue:this.regexp_eatClassStringDisjunction(e)||this.regexp_eatNestedClass(e)},b.regexp_eatNestedClass=function(e){var t=e.pos;if(e.eat(91)){var i=e.eat(94),r=this.regexp_classContents(e);if(e.eat(93))return i&&r===Q&&e.raise("Negated character class may contain strings"),r;e.pos=t}if(e.eat(92)){var n=this.regexp_eatCharacterClassEscape(e);if(n)return n;e.pos=t}return null},b.regexp_eatClassStringDisjunction=function(e){var t=e.pos;if(e.eatChars([92,113])){if(e.eat(123)){var i=this.regexp_classStringDisjunctionContents(e);if(e.eat(125))return i}else e.raise("Invalid escape");e.pos=t}return null},b.regexp_classStringDisjunctionContents=function(e){for(var t=this.regexp_classString(e);e.eat(124);)this.regexp_classString(e)===Q&&(t=Q);return t},b.regexp_classString=function(e){for(var t=0;this.regexp_eatClassSetCharacter(e);)t++;return 1===t?ue:Q},b.regexp_eatClassSetCharacter=function(e){var t=e.pos;if(e.eat(92))return!!(this.regexp_eatCharacterEscape(e)||this.regexp_eatClassSetReservedPunctuator(e))||(e.eat(98)?(e.lastIntValue=8,!0):(e.pos=t,!1));var i=e.current();return!(i<0||i===e.lookahead()&&ns(i)||as(i))&&(e.advance(),e.lastIntValue=i,!0)},b.regexp_eatClassSetReservedPunctuator=e=>{var t=e.current();return!!ss(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatClassControlLetter=e=>{var t=e.current();return(!!st(t)||95===t)&&(e.lastIntValue=t%32,e.advance(),!0)},b.regexp_eatHexEscapeSequence=function(e){var t=e.pos;if(e.eat(120)){if(this.regexp_eatFixedHexDigits(e,2))return!0;e.switchU&&e.raise("Invalid escape"),e.pos=t}return!1},b.regexp_eatDecimalDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;st(i=e.current());)e.lastIntValue=10*e.lastIntValue+(i-48),e.advance();return e.pos!==t},b.regexp_eatHexDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;un(i=e.current());)e.lastIntValue=16*e.lastIntValue+ln(i),e.advance();return e.pos!==t},b.regexp_eatLegacyOctalEscapeSequence=function(e){if(this.regexp_eatOctalDigit(e)){var t=e.lastIntValue;if(this.regexp_eatOctalDigit(e)){var i=e.lastIntValue;t<=3&&this.regexp_eatOctalDigit(e)?e.lastIntValue=64*t+8*i+e.lastIntValue:e.lastIntValue=8*t+i}else e.lastIntValue=t;return!0}return!1},b.regexp_eatOctalDigit=e=>{var t=e.current();return hn(t)?(e.lastIntValue=t-48,e.advance(),!0):(e.lastIntValue=0,!1)},b.regexp_eatFixedHexDigits=(e,t)=>{var i=e.pos;e.lastIntValue=0;for(var r=0;rtypeof Symbol&&(C[Symbol.iterator]=function(){return{next:()=>{var e=this.getToken();return{done:e.type===u.eof,value:e}}}}),C.nextToken=function(){var e=this.curContext();return(e&&e.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length)?this.finishToken(u.eof):e.override?e.override(this):void this.readToken(this.fullCharCodeAtPos())},C.readToken=function(e){return ce(e,this.options.ecmaVersion>=6)||92===e?this.readWord():this.getTokenFromCode(e)},C.fullCharCodeAtPos=function(){var e=this.input.charCodeAt(this.pos);if(e<=55295||e>=56320)return e;var t=this.input.charCodeAt(this.pos+1);return t<=56319||t>=57344?e:(e<<10)+t-56613888},C.skipBlockComment=function(){var e=this.options.onComment&&this.curPosition(),t=this.pos,i=this.input.indexOf("*/",this.pos+=2);if(-1===i&&this.raise(this.pos-2,"Unterminated comment"),this.pos=i+2,this.options.locations)for(var r=void 0,n=t;(r=Nr(this.input,n,this.pos))>-1;)++this.curLine,n=this.lineStart=r;this.options.onComment&&this.options.onComment(!0,this.input.slice(t+2,i),t,this.pos,e,this.curPosition())},C.skipLineComment=function(e){for(var t=this.pos,i=this.options.onComment&&this.curPosition(),r=this.input.charCodeAt(this.pos+=e);this.pos8&&e<14||e>=5760&&Mr.test(String.fromCharCode(e)))++this.pos;else break e}}},C.finishToken=function(e,t){this.end=this.pos,this.options.locations&&(this.endLoc=this.curPosition());var i=this.type;this.type=e,this.value=t,this.updateContext(i)},C.readToken_dot=function(){var e=this.input.charCodeAt(this.pos+1);if(e>=48&&e<=57)return this.readNumber(!0);var t=this.input.charCodeAt(this.pos+2);return this.options.ecmaVersion>=6&&46===e&&46===t?(this.pos+=3,this.finishToken(u.ellipsis)):(++this.pos,this.finishToken(u.dot))},C.readToken_slash=function(){var e=this.input.charCodeAt(this.pos+1);return this.exprAllowed?(++this.pos,this.readRegexp()):61===e?this.finishOp(u.assign,2):this.finishOp(u.slash,1)},C.readToken_mult_modulo_exp=function(e){var t=this.input.charCodeAt(this.pos+1),i=1,r=42===e?u.star:u.modulo;return this.options.ecmaVersion>=7&&42===e&&42===t&&(++i,r=u.starstar,t=this.input.charCodeAt(this.pos+2)),61===t?this.finishOp(u.assign,i+1):this.finishOp(r,i)},C.readToken_pipe_amp=function(e){var t=this.input.charCodeAt(this.pos+1);if(t===e)return this.options.ecmaVersion>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(124===e?u.logicalOR:u.logicalAND,2);return 61===t?this.finishOp(u.assign,2):this.finishOp(124===e?u.bitwiseOR:u.bitwiseAND,1)},C.readToken_caret=function(){return 61===this.input.charCodeAt(this.pos+1)?this.finishOp(u.assign,2):this.finishOp(u.bitwiseXOR,1)},C.readToken_plus_min=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?45===t&&!this.inModule&&62===this.input.charCodeAt(this.pos+2)&&(0===this.lastTokEnd||Y.test(this.input.slice(this.lastTokEnd,this.pos)))?(this.skipLineComment(3),this.skipSpace(),this.nextToken()):this.finishOp(u.incDec,2):61===t?this.finishOp(u.assign,2):this.finishOp(u.plusMin,1)},C.readToken_lt_gt=function(e){var t=this.input.charCodeAt(this.pos+1),i=1;return t===e?(i=62===e&&62===this.input.charCodeAt(this.pos+2)?3:2,61===this.input.charCodeAt(this.pos+i)?this.finishOp(u.assign,i+1):this.finishOp(u.bitShift,i)):33!==t||60!==e||this.inModule||45!==this.input.charCodeAt(this.pos+2)||45!==this.input.charCodeAt(this.pos+3)?(61===t&&(i=2),this.finishOp(u.relational,i)):(this.skipLineComment(4),this.skipSpace(),this.nextToken())},C.readToken_eq_excl=function(e){var t=this.input.charCodeAt(this.pos+1);return 61===t?this.finishOp(u.equality,61===this.input.charCodeAt(this.pos+2)?3:2):61===e&&62===t&&this.options.ecmaVersion>=6?(this.pos+=2,this.finishToken(u.arrow)):this.finishOp(61===e?u.eq:u.prefix,1)},C.readToken_question=function(){var e=this.options.ecmaVersion;if(e>=11){var t=this.input.charCodeAt(this.pos+1);if(46===t){var i=this.input.charCodeAt(this.pos+2);if(i<48||i>57)return this.finishOp(u.questionDot,2)}if(63===t)return e>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(u.coalesce,2)}return this.finishOp(u.question,1)},C.readToken_numberSign=function(){var e=this.options.ecmaVersion,t=35;if(e>=13&&(++this.pos,ce(t=this.fullCharCodeAtPos(),!0)||92===t))return this.finishToken(u.privateId,this.readWord1());this.raise(this.pos,"Unexpected character '"+fe(t)+"'")},C.getTokenFromCode=function(e){switch(e){case 46:return this.readToken_dot();case 40:return++this.pos,this.finishToken(u.parenL);case 41:return++this.pos,this.finishToken(u.parenR);case 59:return++this.pos,this.finishToken(u.semi);case 44:return++this.pos,this.finishToken(u.comma);case 91:return++this.pos,this.finishToken(u.bracketL);case 93:return++this.pos,this.finishToken(u.bracketR);case 123:return++this.pos,this.finishToken(u.braceL);case 125:return++this.pos,this.finishToken(u.braceR);case 58:return++this.pos,this.finishToken(u.colon);case 96:if(this.options.ecmaVersion<6)break;return++this.pos,this.finishToken(u.backQuote);case 48:var t=this.input.charCodeAt(this.pos+1);if(120===t||88===t)return this.readRadixNumber(16);if(this.options.ecmaVersion>=6){if(111===t||79===t)return this.readRadixNumber(8);if(98===t||66===t)return this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(e);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo_exp(e);case 124:case 38:return this.readToken_pipe_amp(e);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(e);case 60:case 62:return this.readToken_lt_gt(e);case 61:case 33:return this.readToken_eq_excl(e);case 63:return this.readToken_question();case 126:return this.finishOp(u.prefix,1);case 35:return this.readToken_numberSign()}this.raise(this.pos,"Unexpected character '"+fe(e)+"'")},C.finishOp=function(e,t){var i=this.input.slice(this.pos,this.pos+t);return this.pos+=t,this.finishToken(e,i)},C.readRegexp=function(){for(var e,t,i=this.pos;;){this.pos>=this.input.length&&this.raise(i,"Unterminated regular expression");var r=this.input.charAt(this.pos);if(Y.test(r)&&this.raise(i,"Unterminated regular expression"),e)e=!1;else{if("["===r)t=!0;else if("]"===r&&t)t=!1;else if("/"===r&&!t)break;e="\\"===r}++this.pos}var n=this.input.slice(i,this.pos);++this.pos;var s=this.pos,a=this.readWord1();this.containsEsc&&this.unexpected(s);var o=this.regexpState||(this.regexpState=new re(this));o.reset(i,n,a),this.validateRegExpFlags(o),this.validateRegExpPattern(o);var c=null;try{c=RegExp(n,a)}catch{}return this.finishToken(u.regexp,{pattern:n,flags:a,value:c})},C.readInt=function(e,t,i){for(var r=this.options.ecmaVersion>=12&&void 0===t,n=i&&48===this.input.charCodeAt(this.pos),s=this.pos,a=0,o=0,c=0,u=t??1/0;c=97?l-97+10:l>=65?l-65+10:l>=48&&l<=57?l-48:1/0)>=e)break;o=l,a=a*e+h}return r&&95===o&&this.raiseRecoverable(this.pos-1,"Numeric separator is not allowed at the last of digits"),this.pos===s||null!=t&&this.pos-s!==t?null:a},C.readRadixNumber=function(e){var t=this.pos;this.pos+=2;var i=this.readInt(e);return null==i&&this.raise(this.start+2,"Expected number in radix "+e),this.options.ecmaVersion>=11&&110===this.input.charCodeAt(this.pos)?(i=pn(this.input.slice(t,this.pos)),++this.pos):ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,i)},C.readNumber=function(e){var t=this.pos;e||null!==this.readInt(10,void 0,!0)||this.raise(t,"Invalid number");var i=this.pos-t>=2&&48===this.input.charCodeAt(t);i&&this.strict&&this.raise(t,"Invalid number");var r=this.input.charCodeAt(this.pos);if(!i&&!e&&this.options.ecmaVersion>=11&&110===r){var n=pn(this.input.slice(t,this.pos));return++this.pos,ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,n)}i&&/[89]/.test(this.input.slice(t,this.pos))&&(i=!1),46!==r||i||(++this.pos,this.readInt(10),r=this.input.charCodeAt(this.pos)),69!==r&&101!==r||i||((43===(r=this.input.charCodeAt(++this.pos))||45===r)&&++this.pos,null===this.readInt(10)&&this.raise(t,"Invalid number")),ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number");var s=os(this.input.slice(t,this.pos),i);return this.finishToken(u.num,s)},C.readCodePoint=function(){var e;if(123===this.input.charCodeAt(this.pos)){this.options.ecmaVersion<6&&this.unexpected();var t=++this.pos;e=this.readHexChar(this.input.indexOf("}",this.pos)-this.pos),++this.pos,e>1114111&&this.invalidStringToken(t,"Code point out of bounds")}else e=this.readHexChar(4);return e},C.readString=function(e){for(var t="",i=++this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated string constant");var r=this.input.charCodeAt(this.pos);if(r===e)break;92===r?(t+=this.input.slice(i,this.pos),t+=this.readEscapedChar(!1),i=this.pos):8232===r||8233===r?(this.options.ecmaVersion<10&&this.raise(this.start,"Unterminated string constant"),++this.pos,this.options.locations&&(this.curLine++,this.lineStart=this.pos)):(we(r)&&this.raise(this.start,"Unterminated string constant"),++this.pos)}return t+=this.input.slice(i,this.pos++),this.finishToken(u.string,t)};var fn={};C.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(e){if(e===fn)this.readInvalidTemplateToken();else throw e}this.inTemplateElement=!1},C.invalidStringToken=function(e,t){if(this.inTemplateElement&&this.options.ecmaVersion>=9)throw fn;this.raise(e,t)},C.readTmplToken=function(){for(var e="",t=this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated template");var i=this.input.charCodeAt(this.pos);if(96===i||36===i&&123===this.input.charCodeAt(this.pos+1))return this.pos===this.start&&(this.type===u.template||this.type===u.invalidTemplate)?36===i?(this.pos+=2,this.finishToken(u.dollarBraceL)):(++this.pos,this.finishToken(u.backQuote)):(e+=this.input.slice(t,this.pos),this.finishToken(u.template,e));if(92===i)e+=this.input.slice(t,this.pos),e+=this.readEscapedChar(!0),t=this.pos;else if(we(i)){switch(e+=this.input.slice(t,this.pos),++this.pos,i){case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:e+=` -`;break;default:e+=String.fromCharCode(i)}this.options.locations&&(++this.curLine,this.lineStart=this.pos),t=this.pos}else++this.pos}},C.readInvalidTemplateToken=function(){for(;this.pos=48&&t<=55){var r=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],n=Number.parseInt(r,8);return n>255&&(n=Number.parseInt(r=r.slice(0,-1),8)),this.pos+=r.length-1,t=this.input.charCodeAt(this.pos),("0"!==r||56===t||57===t)&&(this.strict||e)&&this.invalidStringToken(this.pos-1-r.length,e?"Octal literal in template string":"Octal literal in strict mode"),String.fromCharCode(n)}return we(t)?"":String.fromCharCode(t)}},C.readHexChar=function(e){var t=this.pos,i=this.readInt(16,e);return null===i&&this.invalidStringToken(t,"Bad character escape sequence"),i},C.readWord1=function(){this.containsEsc=!1;for(var e="",t=!0,i=this.pos,r=this.options.ecmaVersion>=6;this.pos>16)+(t>>16)+(i>>16)<<16|65535&i}function fs(e,t){return e<>>32-t}function ut(e,t,i,r,n,s){return ye(fs(ye(ye(t,e),ye(r,s)),n),i)}function D(e,t,i,r,n,s,a){return ut(t&i|~t&r,e,t,n,s,a)}function O(e,t,i,r,n,s,a){return ut(t&r|i&~r,e,t,n,s,a)}function V(e,t,i,r,n,s,a){return ut(t^i^r,e,t,n,s,a)}function F(e,t,i,r,n,s,a){return ut(i^(t|~r),e,t,n,s,a)}function ot(e,t){e[t>>5]|=128<>>9<<4)+14]=t;let i=1732584193,r=-271733879,n=-1732584194,s=271733878;for(let a=0;a>5]>>>r%32&255);return t}function ri(e){let t=[],i=e.length>>2;for(let r=0;r>5]|=(255&e.charCodeAt(s/8))<16&&(i=ot(i,8*e.length));for(let s=0;s<16;s+=1)r[s]=909522486^i[s],n[s]=1549556828^i[s];let a=ot(r.concat(ri(t)),512+8*t.length);return yn(ot(n.concat(a),640))}function gn(e){let t="0123456789abcdef",i="";for(let r=0;r>>4&15)+t.charAt(15&n)}return i}function ni(e){return unescape(encodeURIComponent(e))}function xn(e){return ds(ni(e))}function ys(e){return gn(xn(e))}function _n(e,t){return ms(ni(e),ni(t))}function gs(e,t){return gn(_n(e,t))}function xs(e,t,i){return t?i?_n(t,e):gs(t,e):i?xn(e):ys(e)}var ei=3072;function _s(e){let t=new Headers(e);if(e.has("x-bare-headers")){let i=e.get("x-bare-headers");if(i.length>ei){t.delete("x-bare-headers");let r=0;for(let n=0;n{s.removeEventListener("close",o),s.removeEventListener("message",c)},o=()=>{a()},c=e=>{if(a(),"string"!=typeof e.data)throw TypeError("the first websocket message was not a text frame");let t=JSON.parse(e.data);if("open"!==t.type)throw TypeError("message was not of open type");e.stopImmediatePropagation(),r({protocol:t.protocol,setCookies:t.setCookies}),n(ge.OPEN),s.dispatchEvent(new Event("open"))};return s.addEventListener("close",o),s.addEventListener("message",c),s.addEventListener("open",r=>{r.stopImmediatePropagation(),n(ge.CONNECTING),i().then(i=>ge.prototype.send.call(s,JSON.stringify({type:"connect",remote:e.toString(),protocols:t,headers:i,forwardHeaders:[]})))},{once:!0}),s}async request(e,t,i,r,n,s,a){if(r.protocol.startsWith("blob:")){let o=await ti(r),c=new mn(o.body,o);return c.rawHeaders=Object.fromEntries(o.headers),c.rawResponse=o,c}let u={};if(t instanceof Headers)for(let[l,h]of t)u[l]=h;else for(let p in t)u[p]=t[p];let d={credentials:"omit",method:e,signal:a};"only-if-cached"!==n&&(d.cache=n),void 0!==i&&(d.body=i),void 0!==s&&(d.duplex=s),d.headers=this.createBareHeaders(r,u);let m=await ti(this.http+"?cache="+xs(r.toString()),d),f=await this.readBareResponse(m),$=new mn(hs.includes(f.status)?void 0:m.body,{status:f.status,statusText:f.statusText??void 0,headers:new Headers(f.headers)});return $.rawHeaders=f.headers,$.rawResponse=m,$}async readBareResponse(e){if(!e.ok)throw new ct(e.status,await e.json());let t=bs(e.headers),i={},r=t.get("x-bare-status");null!==r&&(i.status=Number.parseInt(r));let n=t.get("x-bare-status-text");null!==n&&(i.statusText=n);let s=t.get("x-bare-headers");return null!==s&&(i.headers=JSON.parse(s)),i}createBareHeaders(e,t,i=[],r=[],n=[]){let s=new Headers;for(let a of(s.set("x-bare-url",e.toString()),s.set("x-bare-headers",JSON.stringify(t)),i))s.append("x-bare-forward-headers",a);for(let o of r)s.append("x-bare-pass-headers",o);for(let c of n)s.append("x-bare-pass-status",c.toString());return _s(s),s}},ws="!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~";function vs(e){for(let t=0;tthis.loadManifest(e)).catch(e=>{throw delete this.working,e})),this.working):this.client}getClient(){for(let[e,t]of Ss)if(this.manifest.versions.includes(e))return new t(this.server);throw Error("Unable to find compatible client version. Starting from v2.0.0, @tomphttp/bare-client only supports Bare servers v3+. For more information, see https://github.com/tomphttp/bare-client/")}createWebSocket(e,t=[],i){if(!this.client)throw TypeError("You need to wait for the client to finish fetching the manifest before creating any WebSockets. Try caching the manifest data before making this request.");try{e=new URL(e)}catch{throw new DOMException(`Faiiled to construct 'WebSocket': The URL '${e}' is invalid.`)}if(!Cs.includes(e.protocol))throw new DOMException(`Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${e.protocol}' is not allowed.`);for(let r of(Array.isArray(t)||(t=[t]),t=t.map(String)))if(!vs(r))throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${r}' is invalid.`);let n=this.client.connect(e,t,async()=>{let t="function"==typeof i.headers?await i.headers():i.headers||{},r=t instanceof Headers?Object.fromEntries(t):t;return r.Host=e.host,r.Pragma="no-cache",r["Cache-Control"]="no-cache",r.Upgrade="websocket",r.Connection="Upgrade",r},e=>{s=e.protocol,i.setCookiesCallback&&i.setCookiesCallback(e.setCookies)},e=>{a=e},i.webSocketImpl||me),s="",a=ge.CONNECTING,o=()=>{let e=Es.call(n);return e===ge.OPEN?a:e};i.readyStateHook?i.readyStateHook(n,o):Object.defineProperty(n,"readyState",{get:o,configurable:!0,enumerable:!0});let c=()=>{if(o()===ge.CONNECTING)return new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.")};i.sendErrorHook?i.sendErrorHook(n,c):n.send=function(...e){let t=c();if(t)throw t;ge.prototype.send.call(this,...e)},i.urlHook?i.urlHook(n,e):Object.defineProperty(n,"url",{get:()=>e.toString(),configurable:!0,enumerable:!0});let u=()=>s;return i.protocolHook?i.protocolHook(n,u):Object.defineProperty(n,"protocol",{get:u,configurable:!0,enumerable:!0}),n}async fetch(e,t){let i=ks(e)?new us(e,t):e,r=t?.headers||i.headers,n=r instanceof Headers?Object.fromEntries(r):r,s=t?.duplex,a=t?.body||i.body,o=new URL(i.url),c=await this.demand();for(let u=0;;u++){"host"in n?n.host=o.host:n.Host=o.host;let l=await c.request(i.method,n,a,o,i.cache,s,i.signal);l.finalURL=o.toString();let h=t?.redirect||i.redirect;if(!ps.includes(l.status))return l;switch(h){case"follow":{let p=l.headers.get("location");if(ls>u&&null!==p){o=new URL(p,o);continue}throw TypeError("Failed to fetch")}case"error":throw TypeError("Failed to fetch");case"manual":return l}}}};function ks(e){return"string"==typeof e||e instanceof URL}async function wn(e,t){let i=await bn(e,t);return new De(e,i)}var Hs=Qe(vn(),1),Nn=Qe(En(),1),{stringify:Os}=JSON;if(!String.prototype.repeat)throw Error("String.prototype.repeat is undefined, see https://github.com/davidbonnet/astring#installation");if(!String.prototype.endsWith)throw Error("String.prototype.endsWith is undefined, see https://github.com/davidbonnet/astring#installation");var ht={"||":2,"??":3,"&&":4,"|":5,"^":6,"&":7,"==":8,"!=":8,"===":8,"!==":8,"<":9,">":9,"<=":9,">=":9,in:9,instanceof:9,"<<":10,">>":10,">>>":10,"+":11,"-":11,"*":12,"%":12,"/":12,"**":13},ee=17,Vs={ArrayExpression:20,TaggedTemplateExpression:20,ThisExpression:20,Identifier:20,PrivateIdentifier:20,Literal:18,TemplateLiteral:20,Super:20,SequenceExpression:20,MemberExpression:19,ChainExpression:19,CallExpression:19,NewExpression:19,ArrowFunctionExpression:ee,ClassExpression:ee,FunctionExpression:ee,ObjectExpression:ee,UpdateExpression:16,UnaryExpression:15,AwaitExpression:15,BinaryExpression:14,LogicalExpression:13,ConditionalExpression:4,AssignmentExpression:3,YieldExpression:2,RestElement:1};function Ce(e,t){let{generator:i}=e;if(e.write("("),null!=t&&t.length>0){i[t[0].type](t[0],e);let{length:r}=t;for(let n=1;n0){e.write(r);for(let a=1;a0){i.VariableDeclarator(r[0],e);for(let s=1;s0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let{length:o}=a;for(let c=0;c0){for(;n0&&t.write(", ");let s=i[n],a=s.type[6];if("D"===a)t.write(s.local.name,s),n++;else if("N"===a)t.write("* as "+s.local.name,s),n++;else break}if(n0)for(let n=0;;){let s=i[n],{name:a}=s.local;if(t.write(a,s),a!==s.exported.name&&t.write(" as "+s.exported.name),++n "),"O"===e.body.type[0]?(t.write("("),this.ObjectExpression(e.body,t),t.write(")")):this[e.body.type](e.body,t)},ThisExpression(e,t){t.write("this",e)},Super(e,t){t.write("super",e)},RestElement:An=function(e,t){t.write("..."),this[e.argument.type](e.argument,t)},SpreadElement:An,YieldExpression(e,t){t.write(e.delegate?"yield*":"yield"),e.argument&&(t.write(" "),this[e.argument.type](e.argument,t))},AwaitExpression(e,t){t.write("await ",e),pt(t,e.argument,e)},TemplateLiteral(e,t){let{quasis:i,expressions:r}=e;t.write("`");let{length:n}=r;for(let s=0;s0){let{elements:i}=e,{length:r}=i;for(let n=0;;){let s=i[n];if(null!=s&&this[s.type](s,t),++n0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let a=","+r,{properties:o}=e,{length:c}=o;for(let u=0;;){let l=o[u];if(n&&null!=l.comments&&j(t,l.comments,s,r),t.write(s),this[l.type](l,t),++u0){let{properties:i}=e,{length:r}=i;for(let n=0;this[i[n].type](i[n],t),++n1||"U"===n[0]&&("n"===n[1]||"p"===n[1])&&r.prefix&&r.operator[0]===i&&("+"===i||"-"===i))&&t.write(" "),s?(t.write(i.length>1?" (":"("),this[n](r,t),t.write(")")):this[n](r,t)}else this[e.argument.type](e.argument,t),t.write(e.operator)},UpdateExpression(e,t){e.prefix?(t.write(e.operator),this[e.argument.type](e.argument,t)):(this[e.argument.type](e.argument,t),t.write(e.operator))},AssignmentExpression(e,t){this[e.left.type](e.left,t),t.write(" "+e.operator+" "),this[e.right.type](e.right,t)},AssignmentPattern(e,t){this[e.left.type](e.left,t),t.write(" = "),this[e.right.type](e.right,t)},BinaryExpression:Ln=(e,t)=>{let i="in"===e.operator;i&&t.write("("),pt(t,e.left,e,!1),t.write(" "+e.operator+" "),pt(t,e.right,e,!0),i&&t.write(")")},LogicalExpression:Ln,ConditionalExpression(e,t){let{test:i}=e,r=t.expressionsPrecedence[i.type];r===ee||r<=t.expressionsPrecedence.ConditionalExpression?(t.write("("),this[i.type](i,t),t.write(")")):this[i.type](i,t),t.write(" ? "),this[e.consequent.type](e.consequent,t),t.write(" : "),this[e.alternate.type](e.alternate,t)},NewExpression(e,t){t.write("new ");let i=t.expressionsPrecedence[e.callee.type];i===ee||i0&&(this.lineEndSize>0&&(1===u.length?e[c-1]===u:e.endsWith(u))?(this.line+=this.lineEndSize,this.column=0):this.column+=c)}toString(){return this.output}};function Tn(e,t){let i=new li(t);return i.generator[e.type](e,i),i.output}var hi,Mn=class{constructor(e){this.mime=br,this.idb=Je,this.path=Us,this.acorn={parse:dn},this.bare={createBareClient:wn,BareClient:De},this.base64={encode:btoa,decode:atob},this.estree={generate:Tn},this.cookie=Hs,this.setCookieParser=Nn.parse,this.ctx=e}};function pi(e,t,i,r,n="",s=!1,a=""){if(self.__dynamic$config)var o="development"==self.__dynamic$config.mode;else var o=!1;if(s){var c=[{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:e+(o?"?"+Math.floor(89999*Math.random()+1e4):"")},]},{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:t+(o?"?"+Math.floor(89999*Math.random()+1e4):"")},]},];return this.ctx.config.assets.files.inject&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:this.ctx.config.assets.files.inject+(o?"?"+Math.floor(89999*Math.random()+1e4):"")},]}),r&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(`self.__dynamic$cookies = atob("${btoa(r)}");document.currentScript?.remove();`)},]}),n&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(n+";document.currentScript?.remove();")},]}),a&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(a+";document.currentScript?.remove();")},]}),c}var u=[``,``,];return this.ctx.config.assets.files.inject&&u.unshift(``),r&&u.unshift(``),n&&u.unshift(``),a&&u.unshift(``),u}var Ve=class{constructor(e){this.generateHead=pi,this.config=[{elements:"all",tags:["style"],action:"css"},{elements:["script","iframe","embed","input","track","media","source","img","a","link","area","form","object",],tags:["src","href","action","data"],action:"url"},{elements:["source","img"],tags:["srcset"],action:"srcset"},{elements:["script","link"],tags:["integrity"],action:"rewrite",new:"nointegrity"},{elements:["script","link"],tags:["nonce"],action:"rewrite",new:"nononce"},{elements:["meta"],tags:["http-equiv"],action:"http-equiv"},{elements:["iframe"],tags:["srcdoc"],action:"html"},{elements:["link"],tags:["imagesrcset"],action:"srcset"},{elements:"all",tags:["onclick"],action:"js"},],this.ctx=e.ctx}generateRedirect(e){return` - -301 Moved -

301 Moved

-The document has moved -here. - - `}iterate(e,t){!function i(r=e){for(var n=0;n]*>/gi)||(e=""+e),e.replace(/(|)/im,`$1${i.join("")} -`).replace(/<(script|link)\b[^>]*>/g,(e,t)=>e.replace(/\snonce\s*=\s*"[^"]*"/,e=>e.replace("nonce","nononce")).replace(/\sintegrity\s*=\s*"[^"]*"/,e=>e.replace("integrity","nointegrity"))))}},Fe=class{constructor(e){this.ctx=e.ctx}rewrite(e,t,i={}){return e&&e.toString().replace(/(?:@import\s?|url\(?)['"]?(.*?)['")]/gim,(...e)=>{try{return e[0].replace(e[3],this.ctx.url.encode(e[3],t))}catch{return e[0]}})}};function fi(e,t){"object"==typeof e&&t&&function e(t,i,r){if(!("object"!=typeof t||!r)){for(let n in t.parent=i,r(t,i,r),t)"parent"!==n&&(Array.isArray(t[n])?t[n].forEach(i=>{i&&e(i,t,r)}):t[n]&&e(t[n],t,r));"function"==typeof t.iterateEnd&&t.iterateEnd()}}(e,null,t)}function di(e,t={},i,r){var n=this.ctx.modules.acorn.parse(e.toString(),{sourceType:t.module?"module":"script",allowImportExportEverywhere:!0,allowAwaitOutsideFunction:!0,allowReturnOutsideFunction:!0,ecmaVersion:"latest",preserveParens:!1,loose:!0,allowReserved:!0});return this.iterate(n,(e,n=null)=>{this.emit(e,e.type,n,i,r,t)}),e=this.ctx.modules.estree.generate(n)}function mi(e,t={}){if("string"!=typeof e.name)return!1;if(!0!==e.__dynamic){if(!["parent","top","postMessage","opener","window","self","globalThis","parent","location",].includes(e.name))return!1;if(!("CallExpression"==t.type&&t.callee==e)&&!("MemberExpression"==t.type&&t.object!==e&&!["document","window","self","globalThis"].includes(t.object.name))&&"FunctionDeclaration"!=t.type&&"VariableDeclaration"!=t.type&&!("VariableDeclarator"==t.type&&t.id==e)&&"LabeledStatement"!=t.type&&!("Property"==t.type&&t.key==e)&&!("ArrowFunctionExpression"==t.type&&t.params.includes(e))&&!("FunctionExpression"==t.type&&t.params.includes(e))&&!("FunctionExpression"==t.type&&t.id==e)&&!("CatchClause"==t.type&&t.param==e)&&"ContinueStatement"!=t.type&&"BreakStatement"!=t.type&&!("AssignmentExpression"==t.type&&t.left==e)&&"UpdateExpression"!=t.type&&"UpdateExpression"!=t.type&&!("ForInStatement"==t.type&&t.left==e)&&!("MethodDefinition"==t.type&&t.key==e)&&!("AssignmentPattern"==t.type&&t.left==e)&&"NewExpression"!=t.type&&t?.parent?.type!="NewExpression"&&!("UnaryExpression"==t.type&&t.argument==e)&&!("Property"==t.type&&!0==t.shorthand&&t.value==e)){if("__dynamic"==e.name)return e.name="undefined";if("eval"==e.name&&t.right!==e)return e.name="__dynamic$eval";e.name=`dg$(${e.name})`}}}function ke(e,t={}){Object.entries({type:"CallExpression",callee:{type:"MemberExpression",object:{type:"Identifier",name:"self"},property:{type:"Identifier",name:"__dynamic$message"}},arguments:[e.object||e,{type:"Identifier",name:"self",__dynamic:!0},]}).forEach(([t,i])=>e[t]=i)}function yi(e,t={},i={}){if(e.object.name+="","AssignmentExpression"!==t.type&&t.left!==e){if("postMessage"==e.property.value&&"CallExpression"==t.type&&t.callee==e||"postMessage"==e.object.value&&"CallExpression"==t.type&&t.callee==e)return ke(e,t);if(("postMessage"==e.property.name||"postMessage"==e.object.name)&&"Super"!==e.object.type){var r=e.object?.name;e.type="CallExpression",e.callee={type:"Identifier",name:"__dynamic$message"},e.arguments=[{type:"Identifier",name:r},{type:"Identifier",name:"self",__dynamic:!0},],"CallExpression"==t.type&&(t.arguments=t.arguments);return}}if("eval"==e.property.name&&(e.property.name="__dynamic$eval"),"eval"==e.object.name&&(e.object.name="__dynamic$eval"),"worker"!==i.destination&&("window"==e.property.name&&"top"!=e.object.name&&("self"==e.object.name||"globalThis"==e.object.name)&&"NewExpression"!==t.type&&("CallExpression"!==t.type||"CallExpression"==t.type&&e!==t.callee)&&(e.property.name="__dynamic$window"),"top"==e.object.name&&"NewExpression"!==t.type&&("CallExpression"!==t.type||"CallExpression"==t.type&&e!==t.callee)&&(e.object.name="top.__dynamic$window"),"top"==e.property.name&&("self"==e.object.name||"globalThis"==e.object.name)&&"NewExpression"!==t.type&&("CallExpression"!==t.type||"CallExpression"==t.type&&e!==t.callee)&&(e.property.name="top.__dynamic$window"),"NewExpression"!==t.type&&("CallExpression"!==t.type||"CallExpression"==t.type&&e!==t.callee)&&("window"==e.object.name&&(e.object={type:"CallExpression",callee:{type:"Identifier",name:"dg$"},arguments:[e.object],__dynamic:!0}),"parent"==e.object.name&&(e.object={type:"CallExpression",callee:{type:"Identifier",name:"dg$"},arguments:[e.object],__dynamic:!0}),"__dynamic"==e.property.name&&(e.property.name="undefined"),"self"==e.object.name&&(e.object={type:"CallExpression",callee:{type:"Identifier",name:"dg$"},arguments:[e.object],__dynamic:!0}),"document"==e.object.name&&(e.object={type:"CallExpression",callee:{type:"Identifier",name:"dg$"},arguments:[e.object],__dynamic:!0}),"globalThis"==e.object.name&&(e.object={type:"CallExpression",callee:{type:"Identifier",name:"dg$"},arguments:[e.object],__dynamic:!0})),"location"==e.object.name&&(e.object={type:"CallExpression",callee:{type:"Identifier",name:"dg$"},arguments:[e.object],__dynamic:!0}),"location"==e.property.name&&"BinaryExpression"!==t.type&&"AssignmentExpression"!==t.type)){e.property.__dynamic=!0,e.__dynamic=!0;let n=Object.assign({},e);e.type="CallExpression",e.callee={type:"Identifier",name:"dg$",__dynamic:!0},e.arguments=[n],e.__dynamic=!0}e.computed&&"worker"!==i.destination&&(e.property={type:"CallExpression",callee:{type:"Identifier",name:"dp$"},arguments:[e.property],__dynamic:!0})}function gi(e,t={}){if(!(e.value instanceof String)||("__dynamic"==e.value&&(e.value="undefined"),!["location","parent","top","postMessage"].includes(e.value)))return!1;"postMessage"==e.value&&"AssignmentExpression"!=t.type&&t.left!=e&&ke(e,t),"location"==e.value&&(e.value="__dynamic$location"),"__dynamic"==e.value&&(e.value="undefined"),"eval"==e.value&&(e.value="__dynamic$eval")}function ft(e,t={}){e.__dynamic||e.arguments.length&&(e.arguments=[{type:"CallExpression",callee:{type:"Identifier",name:"__dynamic$wrapEval",__dynamic:!0},arguments:e.arguments,__dynamic:!0},],e.__dynamic=!0)}function xi(e,t={}){if(!("AssignmentExpression"==t.type&&t.left==e)){if("Identifier"==e.callee.type){if("postMessage"==e.callee.name){e.callee.type="CallExpression",e.callee.callee={type:"Identifier",name:"__dynamic$message"},e.callee.arguments=[{type:"Identifier",name:"undefined"},{type:"Identifier",name:"self",__dynamic:!0},];return}"eval"==e.callee.name&&ft(e)}if("MemberExpression"==e.callee.type){if("postMessage"==e.callee.property.name&&"Super"!==e.callee.object.type){let i=e.callee.object;e.callee.type="CallExpression",e.callee.callee={type:"Identifier",name:"__dynamic$message"},e.callee.arguments=[i,{type:"Identifier",name:"self",__dynamic:!0},];return}"eval"==e.callee.object.name&&ft(e)}e.arguments.length>0&&e.arguments.length}}function _i(e,t={}){if("Identifier"==e.left.type&&!0!==e.left.__dynamic&&"location"==e.left.name){var i=structuredClone(e.left),r=structuredClone(e.right);e.right.type="CallExpression",e.right.callee={type:"Identifier",name:"ds$"},e.right.arguments=[i,r]}}function bi(e,t={}){"ObjectPattern"!=e.parent.type&&e.parent?.parent?.type!="AssignmentExpression"&&(e.shorthand=!1)}function wi(e,t={},i={},r={}){if("Literal"==e.type&&("ImportDeclaration"==t.type||"ExportNamedDeclaration"==t.type||"ExportAllDeclaration"==t.type)){var n=e.value+"";e.value=i.url.encode(e.value,r.meta),e.raw=e.raw.replace(n,e.value),e.__dynamic=!0}"ImportExpression"==e.type&&(e.source={type:"CallExpression",callee:{type:"Identifier",name:"__dynamic$import"},arguments:[e.source,{type:"Literal",__dynamic:!0,value:i.meta.href},]},e.__dynamic=!0)}function vi(e,t={}){if("Identifier"!==e.id.type)return!1;!0!==e.id.__dynamic&&e.id.name}function Ws(e,t,i={},r={},n={},s={}){if(!e.__dynamic){switch(t){case"Identifier":mi(e,i);break;case"MemberExpression":yi(e,i,s);break;case"Literal":gi(e,i);break;case"CallExpression":xi(e,i);break;case"AssignmentExpression":_i(e,i);break;case"ThisExpression":case"CatchClause":break;case"Property":bi(e,i);break;case"VariableDeclarator":vi(e,i)}wi(e,i,r,n)}}var Dn,Be,$e,On,Si,Vn=class{constructor(e){this.ctx=e,this.html=new Ve(this),this.srcset={encode:(e,t)=>e&&e.toString()?e.split(", ").map(e=>e.split(" ").map((e,i)=>0==i?t.url.encode(e,t.baseURL||t.meta):e).join(" ")).join(", "):e,decode:e=>e},this.js=new class{constructor(e){this.iterate=fi,this.process=di,this.emit=Ws,this.ctx=e.ctx}rewrite(e,t={},i=!0,r={}){if(!e||e instanceof Object||(e=e.toString()).includes("/* dynamic.js */"))return e;e=`/* dynamic.js */ - -${e}`;try{try{e=this.process(e,t,{module:!0,...this.ctx},r)}catch{e=this.process(e,t,{module:!1,...this.ctx},r)}}catch{}return i&&(e=` - if (typeof self !== undefined && typeof self.importScripts == 'function' && typeof self.__dynamic == 'undefined') importScripts('/assets/dynamic/config.js', '/assets/history/handler.js'+Math.floor(Math.random()*(99999-10000)+10000)); - - ${e}`),e}}(this),this.css=new Fe(this),this.man=new class{constructor(e){this.config={rewrite:[["icons","urlit"],["name"," - Dynamic"],["start_url","url"],["scope","url"],["short_name"," - Dynamic"],["shortcuts","urlev"],],delete:["serviceworker"]},this.ctx=e.ctx}rewrite(e,t){let i=JSON.parse(e);for(let r in this.config)if("rewrite"==r)for(var[n,s]of this.config[r]){if("urlit"==s&&i[n]){for(var a=0;athis.ctx.modules.setCookieParser(e,{decodeValues:!1})[0]):e[r]=this.ctx.modules.setCookieParser(e[r],{decodeValues:!1}),e[r]))await i.set(t.host,this.ctx.modules.cookie.serialize(n.name,n.value,{...n,encode:e=>e}));delete e[r];continue}}return new Headers(e)}function ki(e,t,i,r){let{referrer:n}=i;if(["origin","Origin","host","Host","referer","Referer"].forEach(t=>{e[t]&&delete e[t]}),e.Origin=`${t.protocol}//${t.host}${t.port?":"+t.port:""}`,e.Host=t.host+(t.port?":"+t.port:""),e.Referer=t.href,"strict-origin-when-cross-origin"==i.referrerPolicy&&(e.Referer=`${t.protocol}//${t.host}/`),"origin"==i.referrerPolicy&&t.origin&&(n=t.origin+"/"),r){switch(i.credentials){case"omit":break;case"same-origin":i.client&&t.origin==i.client.__dynamic$location.origin&&(e.Cookie=r),i.client||(e.Cookie=r);break;case"include":e.Cookie=r}e.Cookie=r}if(n&&n!=location.origin+"/")try{e.Referer=this.ctx.url.decode(n),"strict-origin-when-cross-origin"==i.referrerPolicy&&(e.Referer=new URL(this.ctx.url.decode(n)).origin),e.Origin=new URL(this.ctx.url.decode(n)).origin}catch{}return i.client&&(e.Origin=i.client.__dynamic$location.origin,e.Referer=i.client.__dynamic$location.href,"strict-origin-when-cross-origin"==i.referrerPolicy&&(e.Referer=i.client.__dynamic$location.origin)),this.ctx.config.tab&&this.ctx.config.tab.ua&&(delete e["user-agent"],delete e["User-Agent"],e["user-agent"]=this.ctx.config.tab.ua),e["sec-fetch-dest"]=i.destination||"empty",e["sec-fetch-mode"]=i.mode||"cors",e["sec-fetch-site"]=i.client?i.client.__dynamic$location.origin==t.origin?i.client.__dynamic$location.port==t.port?"same-origin":"same-site":"cross-origin":"none","navigate"==i.mode&&(e["sec-fetch-site"]="same-origin"),e["sec-fetch-user"]="?1",new Headers(e)}function Ai(e){return Object.assign(Object.create(Object.getPrototypeOf(e)),e)}function Li(e){try{if(new new Proxy(e,{construct:()=>({})}),!Object.getOwnPropertyNames(e).includes("arguments"))throw Error("");return!0}catch{return!1}}function Pi(e){return e.url.toString().substr(location.origin.length,e.url.toString().length).startsWith(self.__dynamic$config.assets.prefix)}async function Ri(e){let t;if("development"!==self.__dynamic$config.mode){var i=await caches.open("__dynamic$files");t=i&&await i.match(e.url)||await fetch(e)}else t=await fetch(e);let r=await t.blob();return(e.url.startsWith(location.origin+"/assets/dynamic/config.js")||e.url.startsWith(location.origin+"/assets/history/client.js"))&&(r=new Blob([`${await r.text()} -self.document?.currentScript?.remove();`,],{type:"application/javascript"})),new Response(r,{headers:t.headers,status:t.status,statusText:t.statusText})}async function Ii(e,t){}var je=class{constructor(e){this.rawHeaders={},this.headers=new Headers({}),this.status=200,this.statusText="OK",this.body=e}async blob(){return this.body}async text(){return await this.body.text()}};function Ti(e){var t=this.ctx.encoding;return t="object"==typeof this.ctx.config.encoding?{...t,...this.ctx.encoding}:{...this.ctx.encoding[this.ctx.config.encoding]},this.ctx.encoding={...this.ctx.encoding,...t},this.ctx.encoding}function Ni(e,t,i){if(!e.url.startsWith("http"))return e.url;let r=e.url.toString();return e.url.startsWith(location.origin)&&(r=r.substr(self.location.origin.length)),r=new URL(r,new URL(t.__dynamic$location.href)).href,this.ctx.url.encode(r,i)}var Mi,$n=class{constructor(e){this.route=Fn,this.routePath=Bn,this.path=Ei,this.resHeader=Ci,this.reqHeader=ki,this.clone=Ai,this.class=Li,this.file=Pi,this.edit=Ri,this.error=Ii,this.encode=Ti,this.rewritePath=Ni,this.about=je,this.ctx=e}};function Di(e,t){if(!e)return e;if((e=new String(e).toString()).startsWith("about:blank"))return location.origin+this.ctx.config.prefix+e;if(!e.match(this.ctx.regex.ProtocolRegex)&&e.match(/^([a-zA-Z0-9\-]+)\:\/\//g)||e.startsWith("chrome-extension://"))return e;if(e.startsWith("javascript:")&&!e.startsWith("javascript:__dynamic$eval")){let i=new URL(e);return`javascript:__dynamic$eval(${JSON.stringify(i.pathname)})`}if(e.match(this.ctx.regex.WeirdRegex)){var r=this.ctx.regex.WeirdRegex.exec(e);r&&(e=r[2])}if(e.startsWith(location.origin+this.ctx.config.prefix)||e.startsWith(this.ctx.config.prefix)||e.startsWith(location.origin+this.ctx.config.assets.prefix+"dynamic.")||e.match(this.ctx.regex.BypassRegex))return e;if(e.match(this.ctx.regex.DataRegex)){try{var r=this.ctx.regex.DataRegex.exec(e);if(r){var[n,s,a,o,c]=r;c="base64"==o?this.ctx.modules.base64.atob(decodeURIComponent(c)):decodeURIComponent(c),s&&("text/html"==s?c=this.ctx.rewrite.html.rewrite(c,t,this.ctx.rewrite.html.generateHead(location.origin+"/assets/history/client.js",location.origin+"/assets/dynamic/config.js","",`window.__dynamic$url = "${t.href}"; window.__dynamic$parentURL = "${location.href}";`)):"text/css"==s?c=this.ctx.rewrite.css.rewrite(c,t):("text/javascript"==s||"application/javascript"==s)&&(c=this.ctx.rewrite.js.rewrite(c,t))),c="base64"==o?this.ctx.modules.base64.btoa(c):encodeURIComponent(c),e=a?o?`data:${s};${a};${o},${c}`:`data:${s};${a},${c}`:o?`data:${s};${o},${c}`:`data:${s},${c}`}}catch{}return e}return e=new String(e).toString(),t.href.match(this.ctx.regex.BypassRegex)&&(e=new URL(e,new URL((this.ctx.parent.__dynamic||this.ctx).meta.href)).href),e=new URL(e,t.href),(this.ctx._location?.origin||("null"==location.origin?location.ancestorOrigins[0]:location.origin))+this.ctx.config.prefix+(this.ctx.encoding.encode(e.origin+e.pathname)+e.search+e.hash)}function Oi(e){if(!e||(e=new String(e).toString()).match(this.ctx.regex.BypassRegex))return e;var t=e.indexOf(this.ctx.config.prefix);if(-1==t)return e;try{if(t=(e=new URL(e,new URL(self.location.origin)).href).indexOf(this.ctx.config.prefix),"about:blank"==e.slice(t+this.ctx.config.prefix.length).trim())return"about:blank";var i=new URL(e).search+new URL(e).hash||"",r=new URL(this.ctx.encoding.decode(e.slice(t+this.ctx.config.prefix.length).replace("https://","https:/").replace("https:/","https://").split("?")[0]))}catch{return e}return e=r.origin+r.pathname+i+(new URL(e).search?r.search.replace("?","&"):r.search)}var Vi,qs,Gs,zs,jn=class{constructor(e){this.encode=Di,this.decode=Oi,this.ctx=e}},Ue=class{constructor(e){this.BypassRegex=/^(#|about:|mailto:|blob:|javascript:)/g,this.DataRegex=/^data:([a-z\/A-Z0-9\-\+]+);?(charset\=[\-A-Za-z0-9]+)?;?(base64)?[;,]*(.*)/g,this.WeirdRegex=/^([\/A-Za-z0-9\-%]+)(http[s]?:\/\/.*)/g,this.ctx=e}};function Fi(e){for(var t in e=new URL(e.href))this.ctx.meta[t]=e[t];return!0}var Bi,He=class{constructor(){}},Un=class extends He{constructor(e){super(),this.load=Fi,this.ctx=e}},Hn={csp:["cross-origin-embedder-policy","cross-origin-opener-policy","cross-origin-resource-policy","content-security-policy","content-security-policy-report-only","expect-ct","feature-policy","origin-isolation","strict-transport-security","upgrade-insecure-requests","x-content-type-options","x-frame-options","x-permitted-cross-domain-policies","x-xss-protection",],status:{empty:[204,101,205,304]},method:{body:["GET","HEAD"]}};function $i(e,t=""){return"text/css"===(this.ctx.modules.mime.contentType(t||e.pathname)||"text/css").split(";")[0]}function ji(e,t="",i=""){let r;return t||this.ctx.modules.mime.contentType(e.pathname)!=e.pathname?"text/html"===(this.ctx.modules.mime.contentType(t||e.pathname)||"text/html").split(";")[0]||i.trim().match(/\<\!(doctype|DOCTYPE) html\>/g):i.trim().match(/<(html|script|body)[^>]*>/g)&&(r=i.trim().indexOf((i.trim().match(/<(html|script|body)[^>]*>/g)||[])[0]))>-1&&r<100}function Ui(e,t=""){if(e.pathname.endsWith(".js")&&"text/plain"==t)return!0;var i=(this.ctx.modules.mime.contentType(t||e.pathname)||"application/javascript").split(";")[0];return"text/javascript"==i||"application/javascript"==i||"application/x-javascript"==i}var Hi,Wn=class{constructor(e){this.html=ji,this.js=Ui,this.css=$i,this.ctx=e}};function dt(e,t=!0){let i=t=>{let i=e.__dynamic.util.clone(t);for(var r=0;re);[...n,e.Object].forEach(e=>{delete e.prototype.__dynamic$location});let s={get:()=>e.__dynamic.location,set(t){if(t instanceof e.Location)return e.__dynamic.location=t;e.__dynamic.location.href=t},configurable:!0};try{var a=new URL(e.__dynamic$url||e.__dynamic.url.decode(e.location.pathname+e.location.search+e.location.hash))}catch{e.__dynamic$url="about:blank";var a=new URL("about:blank")}return e.__dynamic.property=a,e.__dynamic.meta.load(a),e.__dynamic.location=e.__dynamic.util.clone(e.location),["href","host","hash","origin","hostname","port","pathname","protocol","search",].forEach(t=>{e.__dynamic.define(e.__dynamic.location,t,{get:()=>"search"==t&&e.location[t]+(e.location.search?a.search.replace("?","&"):a.search)||("hash"==t?location[t]:a[t]),set(i){"href"===t?e.location[t]=e.__dynamic.url.encode(e.__dynamic.meta.href.replace(a[t],i),a):e.location[t]=i.toString()}})}),e.__dynamic.define(e.Object.prototype,"__dynamic$location",{get(){return this===e||this===e.__dynamic$window||this===e.document||this===e.__dynamic$document?this.__dynamic?.location:this.location},set(t){return this===e||this===e.__dynamic$window||this===e.document||this===e.__dynamic$document?this.__dynamic.location.href=t:this.location=t},configurable:!0}),["assign","replace","toString","reload"].forEach(t=>{e.__dynamic.define(e.__dynamic.location,t,{get:()=>"toString"==t?()=>a.href:new e.__dynamic.Function("arg",`return window.location.${t}(arg?${"reload"!==t&&"toString"!==t?"(self.__dynamic).url.encode(arg, new URL('"+a.href+"'))":"arg"}:null)`),set:()=>null})}),r.length&&e.__dynamic.define(e.__dynamic.location,"ancestorOrigins",{get:()=>i(r),set:()=>null}),n.forEach(t=>{e.__dynamic.define(t.prototype,"__dynamic$location",s)}),e.__dynamic.hashchange||(e.__dynamic.hashchange=(e.addEventListener("hashchange",e=>{}),!0)),e.__dynamic.location}function mt(e){e.__dynamic$get=t=>{var i=e.__dynamic.fire("get",[t]);if(i)return i;try{return t==e.parent?e.parent.__dynamic$window:t==e.top?e.top.__dynamic$window:t==e.location||(e.Location||e.WorkerLocation)&&t instanceof(e.Location||e.WorkerLocation)?e.__dynamic$location:e.Document&&t instanceof e.Document?e.__dynamic$document:t==e?e.__dynamic$window:"function"==typeof t&&"__d$Send"==t.name?e.__dynamic$message(t.target,e):t}catch{return t}},e.__dynamic$property=e=>"string"!=typeof e?e:"location"==e?"__dynamic$location":"eval"==e?"__dynamic$eval":e,e.__dynamic$set=(t,i)=>t?e.__dynamic.url.encode(e.__dynamic.meta.href.replace(e.__dynamic.property.href,i),e.__dynamic.property):i,e.__dynamic$var=(e,t)=>window[t]=e,e.dg$=e.__dynamic$get,e.ds$=e.__dynamic$set,e.dp$=e.__dynamic$property,e.dv$=e.__dynamic$var,e.d$g_=e.__dynamic$get,e.d$s_=e.__dynamic$set,e.d$p_=e.__dynamic$property,e.d$v_=e.__dynamic$var}function yt(e){e.__dynamic.util.CreateDocumentProxy=t=>new Proxy(t,{get(i,r){let n=i[r];return"location"==r?t.defaultView?t.defaultView.__dynamic$location:e.__dynamic$location:"documentURI"==r&&t.defaultView||"baseURI"==r&&t.defaultView?t.defaultView.__dynamic.location.toString():n&&("function"==typeof n&&n.toString==e.Object.toString?new Proxy(n,{apply:(i,r,s)=>((t.defaultView&&s[0]==t.defaultView.__dynamic$document||s[0]==e.__dynamic$document)&&(s[0]=t),n.apply(t,s))}):n)},set(e,i,r){try{try{t.defaultView.__dynamic?t.defaultView.__dynamic.Reflect.set(e,i,r):e[i]=r}catch{}return r||e[i]||!0}catch{return r||e[i]||!0}}}),e.__dynamic.util.CreateWindowProxy=t=>new Proxy(t,{get(i,r){let n=e.__dynamic.Reflect.get(i,r);if(Object.getOwnPropertyDescriptor(i,r)){var s=Object.getOwnPropertyDescriptor(i,r);if(s?.configurable===!1&&s?.writable===!1&&s?.hasOwnProperty("enumerable"))return s?.value||s?.get?.call(i)}return"__dynamic$self"==r?t.window:"location"==r?t.__dynamic$location:"parent"==r?t.parent.__dynamic$window||t.parent:"top"==r?t.top.__dynamic?t.top.__dynamic$window:t.parent.__dynamic$window:"self"==r||"globalThis"==r?t.__dynamic$window:n&&("function"==typeof n&&n.toString==e.Object.toString?new Proxy(n,{apply:(e,i,r)=>Reflect.apply(e,t,r)}):n)},set(i,r,n){try{var s=Object.getOwnPropertyDescriptor(i,r);if(s?.writable===!1&&s?.enumerable===!1)return!1;if(r.constructor==e.Symbol)return Reflect.set(i,r,n),i[r];if(i.hasOwnProperty("undefined")&&i[r]+""==r)return i[r]||n||!0;if("location"==r)return t.__dynamic$location=n;if(i.hasOwnProperty(r)&&!i.propertyIsEnumerable(r)&&!s?.writable)return i[r];try{t.__dynamic?t.__dynamic.Reflect.set(i,r,n):i[r]=n}catch{}return i[r]||!0}catch{return i[r]||!0}}}),e.__dynamic.define(e,"__dynamic$window",{value:e.__dynamic.util.CreateWindowProxy(e),configurable:!1,enumerable:!1,writable:!1}),e.document&&e.__dynamic.define(e,"__dynamic$document",{value:e.__dynamic.util.CreateDocumentProxy(e.document),configurable:!1,enumerable:!1,writable:!1}),e.__dynamic$globalThis=e.__dynamic$window,e.__dynamic$self=e.__dynamic$window}function Wi(e){e.__dynamic.rewrite.dom=(t,i)=>{if(typeof e.DOMParser>"u"||!t)return t;var r=new e.DOMParser().parseFromString(t.toString(),"text/html").documentElement;return r.querySelectorAll("script").forEach(t=>{!t.type||t.type&&"text/javascript"!==t.type&&"application/javascript"!==t.type&&"application/x-javascript"!==t.type?t.src&&(t.src=e.__dynamic.url.encode(t.getAttribute("src"),i)):t.innerHTML&&(t.innerHTML=e.__dynamic.js.encode(t.innerHTML,{type:"script"},i,{}))}),r.querySelectorAll("link").forEach(t=>{t.href&&"stylesheet"!==t.getAttribute("rel")&&(t.href=e.__dynamic.url.encode(t.getAttribute("href"),i))}),r.querySelectorAll("img").forEach(t=>{t.src&&(t.src=e.__dynamic.url.encode(t.getAttribute("src"),i)),t.srcset&&(t.srcset=e.__dynamic.rewrite.srcset.encode(t.getAttribute("srcset"),e.__dynamic))}),r.querySelectorAll("a").forEach(t=>{t.href&&(t.href=e.__dynamic.url.encode(t.getAttribute("href"),i))}),r.querySelectorAll("style").forEach(t=>{t.innerHTML&&(t.innerHTML=e.__dynamic.rewrite.css.rewrite(t.innerHTML,i))}),r.outerHTML}}function qi(e){let t=e=>new DOMParser().parseFromString(e,"text/html").body.innerHTML;if(e.__dynamic.elements.config.forEach(t=>{t.elements.forEach(i=>{t.tags.forEach(r=>{var n=Object.getOwnPropertyDescriptor(i.prototype,r);n||(n=Object.getOwnPropertyDescriptor(HTMLElement.prototype,r)),typeof i.prototype.setAttribute.__dynamic$target>"u"&&(i.prototype.setAttribute=e.__dynamic.wrap(i.prototype.setAttribute,function(t,...i){return this instanceof HTMLLinkElement&&e.__dynamic$icon&&"href"==i[0].toLowerCase()&&("icon"==this.rel||"shortcut icon"==this.rel)?(i[1]=e.__dynamic$icon,Reflect.apply(t,this,i)):-1==e.__dynamic.elements.attributes.indexOf(i[0].toLowerCase())?Reflect.apply(t,this,i):"srcset"==i[0].toLowerCase()||"imagesrcset"==i[0].toLowerCase()?(this.dataset[`dynamic_${i[0]}`]=i[1],i[1]=e.__dynamic.rewrite.srcset.encode(i[1],e.__dynamic),Reflect.apply(t,this,i)):"integrity"==i[0].toLowerCase()||"nonce"==i[0].toLowerCase()?(this.dataset[`dynamic_${i[0]}`]=i[1],this.removeAttribute(i[0]),Reflect.apply(t,this,["nointegrity",i[1]])):(this.dataset[`dynamic_${i[0]}`]=i[1],i[1]=e.__dynamic.url.encode(i[1],e.__dynamic.baseURL||e.__dynamic.meta),Reflect.apply(t,this,i))},"setAttribute"),i.prototype.setAttributeNS=e.__dynamic.wrap(i.prototype.setAttributeNS,function(t,...i){return this instanceof HTMLLinkElement&&e.__dynamic$icon&&"href"==i[1].toLowerCase()&&("icon"==this.rel||"shortcut icon"==this.rel)?(i[2]=e.__dynamic$icon,Reflect.apply(t,this,i)):-1==e.__dynamic.elements.attributes.indexOf(i[1].toLowerCase())?Reflect.apply(t,this,i):"srcset"==i[1].toLowerCase()||"imagesrcset"==i[1].toLowerCase()?(this.dataset[`dynamic_${i[1]}`]=i[2],i[2]=e.__dynamic.rewrite.srcset.encode(i[2],e.__dynamic),Reflect.apply(t,this,i)):"integrity"==i[1].toLowerCase()||"nonce"==i[1].toLowerCase()?(this.dataset[`dynamic_${i[1]}`]=i[2],this.removeAttribute(i[1]),Reflect.apply(t,this,["nointegrity",i[2]])):(this.dataset[`dynamic_${i[1]}`]=i[2],i[2]=e.__dynamic.url.encode(i[2],e.__dynamic.baseURL||e.__dynamic.meta),Reflect.apply(t,this,i))},"setAttributeNS"),i.prototype.getAttribute=e.__dynamic.wrap(i.prototype.getAttribute,function(e,...t){return this.dataset[`dynamic_${t[0]}`]?this.dataset[`dynamic_${t[0]}`]:Reflect.apply(e,this,t)},"getAttribute"),i.prototype.getAttributeNS=e.__dynamic.wrap(i.prototype.getAttributeNS,function(e,...t){return this.dataset[`dynamic_${t[1]}`]?this.dataset[`dynamic_${t[1]}`]:Reflect.apply(e,this,t)},"getAttributeNS")),e.__dynamic.define(i.prototype,r,{get(){if("window"==t.action){let i=e.__dynamic.elements.contentWindow.get.call(this),s=!0;try{i.location.href}catch{s=!1}if(s&&(i.__dynamic||e.__dynamic.elements.client(i,e.__dynamic$config,decodeURIComponent(this.src))),"contentDocument"==r)return i.document;if("contentWindow"==r)return s&&i.__dynamic$window||i}if("css"==t.action)return n.get.call(this);try{return e.__dynamic.url.decode(n.get.call(this))}catch{}return n.get.call(this)},set(i){return i&&"string"==typeof i&&(i=i.toString()),"href"==r&&this instanceof HTMLLinkElement&&e.__dynamic$icon&&("icon"==this.rel||"shortcut icon"==this.rel)&&(this.dataset[`dynamic_${r}`]=i,i=e.__dynamic$icon),"html"==t.action?(Promise.resolve(e.__dynamic.createBlobHandler(new Blob([i],{type:"text/html"}),this,i)).then(e=>{this.setAttribute(r,e)}),i):("srcset"==t.action&&(i=e.__dynamic.rewrite.srcset.encode(i,e.__dynamic)),"rewrite"==t.action?(this.dataset[`dynamic_${r}`]=i,this.removeAttribute(r),this.setAttribute(t.new,i)):("css"==t.action&&(i=e.__dynamic.rewrite.css.rewrite(i,e.__dynamic.meta)),"url"==t.action&&(i=e.__dynamic.url.encode(i,e.__dynamic.baseURL||e.__dynamic.meta)),this.dataset[`dynamic_${r}`]=i,n.set.call(this,i)))}})})})}),["innerHTML","outerHTML"].forEach(i=>{e.__dynamic.define(e.HTMLElement.prototype,i,{get(){return(this["__"+i]||e.__dynamic.elements[i].get.call(this)).toString()},set(r){return this["__"+i]=t(r),this instanceof e.HTMLTextAreaElement?e.__dynamic.elements[i].set.call(this,r):this instanceof e.HTMLScriptElement?e.__dynamic.elements[i].set.call(this,e.__dynamic.rewrite.js.rewrite(r,{type:"script"})):this instanceof e.HTMLStyleElement?e.__dynamic.elements[i].set.call(this,e.__dynamic.rewrite.css.rewrite(r,e.__dynamic.meta)):e.__dynamic.elements[i].set.call(this,e.__dynamic.rewrite.dom(r,e.__dynamic.meta))}})}),["MutationObserver","ResizeObserver","IntersectionObserver"].forEach(t=>{e[t].prototype.observe=e.__dynamic.wrap(e[t].prototype.observe,function(t,...i){return i[0]==e.__dynamic$document&&(i[0]=e.document),Reflect.apply(t,this,i)},t+".prototype.observe")}),e.__dynamic.defines(e.HTMLAnchorElement.prototype,{pathname:e.__dynamic.elements.createGetter("pathname"),origin:e.__dynamic.elements.createGetter("origin"),host:e.__dynamic.elements.createGetter("host"),hostname:e.__dynamic.elements.createGetter("hostname"),port:e.__dynamic.elements.createGetter("port"),protocol:e.__dynamic.elements.createGetter("protocol"),search:e.__dynamic.elements.createGetter("search"),hash:e.__dynamic.elements.createGetter("hash"),toString:{get:function(){return this.__toString||(()=>this.href?new URL(this.href).toString():"")},set:function(e){this.__toString=e}}}),e.HTMLElement.prototype.insertAdjacentHTML=e.__dynamic.wrap(e.HTMLElement.prototype.insertAdjacentHTML,function(t,...i){return this instanceof e.HTMLStyleElement?Reflect.apply(t,this,[i[0],e.__dynamic.rewrite.css.rewrite(i[1],e.__dynamic.meta),]):this instanceof e.HTMLScriptElement?Reflect.apply(t,this,[i[0],e.__dynamic.rewrite.js.rewrite(i[1],{type:"script"},!1,e.__dynamic),]):this instanceof e.HTMLTextAreaElement?Reflect.apply(t,this,i):Reflect.apply(t,this,[i[0],e.__dynamic.rewrite.html.rewrite(i[1],e.__dynamic.meta),])},"insertAdjacentHTML"),[[e.Node,"textContent"],[e.HTMLElement,"innerText"],].forEach(([t,i])=>{var r=Object.getOwnPropertyDescriptor(t.prototype,i);function n(){return this["__"+i]||r?.get&&r.get.call(this)}e.__dynamic.define(e.HTMLStyleElement.prototype,i,{get:n,set(t){return this["__"+i]=t,r?.set&&r.set.call(this,e.__dynamic.rewrite.css.rewrite(t,e.__dynamic.meta))}}),e.__dynamic.define(e.HTMLScriptElement.prototype,i,{get:n,set(t){return this["__"+i]=t,null!==this.type||"application/javascript"!==this.type||"text/javascript"!==this.type||"application/x-javascript"!==this.type?r?.set&&r.set.call(this,t):r?.set&&r.set.call(this,e.__dynamic.rewrite.js.rewrite(t,{type:"script"},!1,e.__dynamic))}})}),e.Text.prototype.toString=function(){return this.textContent},e.document.createElement=e.__dynamic.wrap(e.document.createElement,function(e,...t){var i=Reflect.apply(e,this,t);return i.rewritten=!0,"iframe"==t[0].toLowerCase()&&(i.src="about:blank"),i},"createElement"),!document.querySelector('link[rel="icon"], link[rel="shortcut icon"]')){var i=document.createElement("link");i.rel="icon",i.href=(e.__dynamic$icon||"/favicon.ico")+"?dynamic",i.dataset.dynamic_hidden="true",document.head.appendChild(i)}e.__dynamic.define(e.Attr.prototype,"value",{get(){return this.__value||e.__dynamic.elements.attrValue.get.call(this)},set(t){return this.__value=t,"href"==this.name||"src"==this.name?e.__dynamic.elements.attrValue.set.call(this,e.__dynamic.url.encode(t,e.__dynamic.meta)):"style"==this.name?e.__dynamic.elements.attrValue.set.call(this,e.__dynamic.rewrite.css.rewrite(t,e.__dynamic.meta)):"onclick"==this.name?e.__dynamic.elements.attrValue.set.call(this,e.__dynamic.rewrite.js.rewrite(t,{type:"script"},!1,e.__dynamic)):e.__dynamic.elements.attrValue.set.call(this,t)}})}function Gi(e){let t=e.XMLHttpRequest;e.Worker=new Proxy(e.Worker,{construct(i,r){if(r[0]){if(r[0]=r[0].toString(),r[0].trim().startsWith(`blob:${e.location.origin}`)){let n=new t;n.open("GET",r[0],!1),n.send();let s=e.__dynamic.rewrite.js.rewrite(n.responseText,{type:"worker"},!0),a=new Blob([s],{type:"application/javascript"});r[0]=URL.createObjectURL(a)}else r[0]=e.__dynamic.url.encode(r[0],e.__dynamic.meta)}return Reflect.construct(i,r)}})}function zi(e){e.__dynamic$history=function(t,...i){i[2]&&(i[2]=e.__dynamic.url.encode(i[2],e.__dynamic.meta)),e.__dynamic.Reflect.apply(t,this,i),e.__dynamic.client.location(e,!0,!1)},e.History.prototype.pushState=e.__dynamic.wrap(e.History.prototype.pushState,e.__dynamic$history),e.History.prototype.replaceState=e.__dynamic.wrap(e.History.prototype.replaceState,e.__dynamic$history)}var Ks="!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~",Xs="%";function qn(e){e=e.toString();let t="";for(let i=0;ie.location.protocol.replace("http","ws")+"//"+new URL(e.__dynamic$config.bare.path+"/v1/",new URL(location.origin)).href.replace(/http(s?):\/\//g,"").replace(/\/\//g,"/"),i=Object.getOwnPropertyDescriptor(e.WebSocket.prototype,"url");e.__dynamic.define(e.WebSocket.prototype,"url",{get(){let t=i.get.call(this);return e.__dynamic.url.decode(t)},set:e=>!1}),e.WebSocket=e.__dynamic.wrap(e.WebSocket,(i,...r)=>{console.log(r);let n=new URL(r[0]),s={remote:{host:n.hostname,port:n.port||("wss:"===n.protocol?"443":"80"),path:n.pathname+n.search,protocol:n.protocol},headers:{Host:n.hostname+(n.port?":"+n.port:""),Origin:e.__dynamic$location.origin,Pragma:"no-cache","Cache-Control":"no-cache",Upgrade:"websocket",Connection:"Upgrade"},forward_headers:["accept-encoding","accept-language","sec-websocket-extensions","sec-websocket-key","sec-websocket-version","sec-websocket-accept",]};return r[1]&&(s.headers["sec-websocket-protocol"]=r[1].toString()),[t(),["bare",qn(JSON.stringify(s))]]})}function Xi(e){e.Request=e.__dynamic.wrap(e.Request,(t,...i)=>{if(i[0]instanceof t){let r=Reflect.construct(t,i);return"navigate"===i[0].mode&&(r.mode="same-origin"),r}return i[0]&&(i[0]=e.__dynamic.url.encode(i[0],e.__dynamic.meta)),i}),e.__dynamic.define(e.Request.prototype,"url",{get(){return e.__dynamic.url.decode(e.__dynamic.http.RequestURL.get.call(this))},set:e=>e}),e.fetch=e.__dynamic.wrap(e.fetch,(t,...i)=>e.Request&&("Request"===i[0].constructor.name||i[0]instanceof e.Request)?(console.log(i[0]),Reflect.apply(t,e,i)):(i[0]&&e.__dynamic&&(i[0]=e.__dynamic.url.encode(i[0],e.__dynamic.meta)),Reflect.apply(t,e,i)),"fetch"),e.XMLHttpRequest.prototype.open=e.__dynamic.wrap(e.XMLHttpRequest.prototype.open,function(t,...i){return i[1]&&(i[1]=e.__dynamic.url.encode(i[1],e.__dynamic.meta)),!1===i[2]&&(i[2]=!0),Reflect.apply(t,this,i)},"XMLHttpRequest.prototype.open"),Object.defineProperty(e.XMLHttpRequest.prototype,"responseURL",{get(){return e.__dynamic.url.decode(e.__dynamic.http.XMLResponseURL.get.call(this))},set:e=>e}),Object.defineProperty(e.Response.prototype,"url",{get(){return e.__dynamic.url.decode(e.__dynamic.http.ResponseURL.get.call(this))},set:e=>e}),e.open=e.__dynamic.wrap(e.open,function(t,...i){""!=i[0]&&i[0]&&(i[0]=e.__dynamic.url.encode(i[0],e.__dynamic.meta)),""==i[0]&&(i[0]="about:blank");let r=Reflect.apply(t,this,i);r.opener=e.__dynamic$window;try{"about:"===new URL(i[0]).protocol?r.__dynamic$url="about:srcdoc":r.__dynamic$url=e.__dynamic.url.decode(i[0])}catch{r.__dynamic$url="about:srcdoc"}return e.__dynamic.elements.client(r,e.__dynamic$config,r.__dynamic$url),r.__dynamic$window},"window.open"),e.__dynamic.define(e,"__dynamic$import",{get:()=>(t,i)=>{try{return e.__dynamic.url.encode(t,new URL(i))}catch{return e.__dynamic.url.encode(t,e.__dynamic.meta)}},set(){}})}function gt(e){let t=t=>"Worker"==t.constructor.name||"MessagePort"==t.constructor.name||"DedicatedWorkerGlobalScope"==e.constructor.name,i=e=>"Window"==e.constructor.name||"global"==e.constructor.name,r=(e,t)=>Object.keys(window||{}).map(e=>Number.parseInt(e)).filter(e=>isFinite(e)).map(e=>window[e]).filter(e=>e||!1).find(i=>{try{return i.name==e&&i.location.href==t}catch{return!1}});e.__dynamic$message=(r,n=top)=>(r||(r=e),function s(){var a=arguments;return t(r)||!i(r)?r.postMessage.call(r,...a):(r.__dynamic$self&&(r=r.__dynamic$self),(r._postMessage||r.postMessage).call(r,[a[0],n.__dynamic$location.origin,n.location.href,n.name,n!==e,],"*",a[2]||[]))}),"Window"==e.constructor.name&&(e.addEventListener&&(e.addEventListener=new Proxy(e.addEventListener,{apply(t,i,n){if(i==e.__dynamic$window&&(i=e),!n[1]||!n[0]||"function"!=typeof n[1])return Reflect.apply(t,i,n);if("message"==n[0]){var s=n[1].bind({});n[1]=t=>s(function t(i){let n=e.__dynamic.util.clone(i),s;for(var a in i.source&&(s=r(i.data[3],i.data[2])||i.currentTarget),e.__dynamic.define(n,"isTrusted",{value:!0,writable:!1}),i.origin&&(Array.isArray(i.data)&&5==i.data.length?e.__dynamic.define(n,"origin",{value:i.data[1],writable:!1}):e.__dynamic.define(n,"origin",{value:i.origin,writable:!1})),i.data&&(Array.isArray(i.data)&&5==i.data.length?e.__dynamic.define(n,"data",{value:i.data[0],writable:!1}):e.__dynamic.define(n,"data",{value:i.data,writable:!1})),i.source&&(s?e.__dynamic.define(n,"source",{value:s?.__dynamic$window||s,writable:!0}):e.__dynamic.define(n,"source",{value:s||Array.isArray(i.data)&&3==i.data.length&&!0===i.data[2]?i.source:i.currentTarget,writable:!0})),i)"isTrusted"!==a&&"origin"!==a&&"data"!==a&&"source"!==a&&e.__dynamic.define(n,a,{value:i[a],writable:!1});return n}(t))}return Reflect.apply(t,i,n)}})),"Window"==e.constructor.name&&e.__dynamic.define(e,"onmessage",{get:()=>e._onmessage||null,set:t=>(e._onmessage&&e.removeEventListener("message",e._onmessage),e.addEventListener("message",t),e._onmessage=t)}))}function Qi(e){function t(t,...i){for(var r in i)i[r]=e.__dynamic.rewrite.dom(i[r],e.__dynamic.meta);return t.apply(this,i)}["write","writeln"].forEach(i=>{e.document[i]=e.__dynamic.wrap(e.document[i],t,`document.${i}`)})}function xt(e){e.importScripts=new Proxy(e.importScripts,{apply:(t,i,r)=>([...r].forEach((t,i)=>{r[i]=e.__dynamic.url.encode(t,e.__dynamic.meta)}),Reflect.apply(t,i,r))}),e.__dynamic.define(e.__dynamic,"_location",{value:e.location,writable:!0}),e.__dynamic.define(e.WorkerGlobalScope.prototype,"location",{get:()=>e.__dynamic.location,set:e=>e}),e.location=e.__dynamic.location}function _t(e){var t=e.Reflect.get.bind({}),i=e.Reflect.set.bind({});e.Reflect.set=e.__dynamic.wrap(e.Reflect.set,function(t,...r){return"Window"==r[0].constructor.name&&"location"==r[1]?(r[0].__dynamic$location=r[2],!0):"Location"==r[0].constructor.name?(e.__dynamic$location[r[1]]=r[2],!0):Reflect.apply(i,this,r)},"Reflect.set"),e.Reflect.get=e.__dynamic.wrap(e.Reflect.get,function(i,...r){if("object"==typeof r[0]){if("Window"==r[0].constructor.name){if("location"==r[1])return r[0].__dynamic?r[0].__dynamic$location:Reflect.apply(t,this,r);if(r[0][r[1]]&&"Window"==r[0][r[1]].constructor.name)return r[0][r[1]].__dynamic$window}if("Location"==r[0].constructor.name)return e.__dynamic$location[r[1]]}return Reflect.apply(t,this,r)},"Reflect.get"),e.__dynamic.Reflect={get:t,set:i,apply:e.Reflect.apply.bind({}),construct:e.Reflect.construct.bind({}),defineProperty:e.Reflect.defineProperty.bind({}),deleteProperty:e.Reflect.deleteProperty.bind({}),getOwnPropertyDescriptor:e.Reflect.getOwnPropertyDescriptor.bind({}),getPrototypeOf:e.Reflect.getPrototypeOf.bind({}),has:e.Reflect.has.bind({}),isExtensible:e.Reflect.isExtensible.bind({}),ownKeys:e.Reflect.ownKeys.bind({}),preventExtensions:e.Reflect.preventExtensions.bind({}),setPrototypeOf:e.Reflect.setPrototypeOf.bind({})}}function Yi(e){e.__dynamic.define(e.document,"origin",{value:e.__dynamic$location.origin,configurable:!1,enumerable:!1}),e.__dynamic.define(e.document,"domain",{value:e.__dynamic$location.hostname,configurable:!1,enumerable:!1}),["referrer","URL","documentURI"].forEach(t=>{e.__dynamic.define(e.document,t,{value:e.__dynamic$location.toString(),configurable:!1,enumerable:!1})}),[e.document,e.HTMLElement.prototype].forEach(t=>{e.__dynamic.define(t,"baseURI",{get:()=>(e.__dynamic.baseURL||e.__dynamic$location).href})}),["getEntries","getEntriesByName","getEntriesByType"].forEach(t=>{e.performance[t]=new Proxy(e.performance[t],{apply:(t,i,r)=>Reflect.apply(t,i,r).filter(t=>!t.name?.includes(e.location.origin+"/assets/history/dynamic.")).filter(t=>!t.name.includes(e.location.origin+e.__dynamic.config.prefix+"caches/")).map(t=>{if(t.name){var i=e.__dynamic.util.clone(t);for(var r in i.__defineGetter__("name",function(){return this._name}),i.__defineSetter__("name",function(e){this._name=e}),i.name=e.__dynamic.url.decode(t.name),e.__dynamic.define(i,"name",{get:void 0,set:void 0}),e.__dynamic.define(i,"name",{value:i._name,writable:!1}),delete i._name,t)if("name"!=r){if("function"==typeof t[r])var n=new Proxy(t[r],{apply(e,r,n){if("toJSON"==e.name){var s={};for(var a in i)s[a]=i[a];return s}return Reflect.apply(e,t,n)}});else var n=t[r];Object.defineProperty(i,r,{value:n,writable:!0})}t=i}return t})})}),e.MouseEvent&&(e.MouseEvent.prototype.initMouseEvent=e.__dynamic.wrap(e.MouseEvent.prototype.initMouseEvent,function(t,...i){return i.length&&(i=i.map(t=>t==e.__dynamic$window?e:t)),Reflect.apply(t,this,i)})),e.KeyboardEvent&&(e.KeyboardEvent.prototype.initKeyboardEvent=e.__dynamic.wrap(e.KeyboardEvent.prototype.initKeyboardEvent,function(t,...i){return i.length&&(i=i.map(t=>t==e.__dynamic$window?e:t)),Reflect.apply(t,this,i)})),e.StorageEvent&&(e.StorageEvent.prototype.initStorageEvent=e.__dynamic.wrap(e.StorageEvent.prototype.initStorageEvent,function(t,...i){return i.length&&(i=i.map(t=>t==e.localStorage?e.__dynamic.storage.localStorage:t==e.sessionStorage?e.__dynamic.storage.sessionStorage:t)),Reflect.apply(t,this,i)})),e.Object.defineProperty=e.__dynamic.wrap(e.Object.defineProperty,function(e,...t){try{return Reflect.apply(e,this,t)}catch(i){i.toString().includes("Cannot redefine property:")&&(t[0].__defined||(t[0].__defined={}),t[0].__defined[t[1]]=t[2])}}),"https://www.google.com"==e.__dynamic.meta.origin&&(e.setInterval=new Proxy(e.setInterval,{apply:(e,t,i)=>500==i[1]?null:Reflect.apply(e,t,i)}))}function Ji(e){e.Storage.prototype.setItem=e.__dynamic.wrap(e.Storage.prototype.setItem,function(t,...i){return i[0]&&(i[0]="__dynamic$"+e.__dynamic$location.host+"$"+i[0].toString()),Reflect.apply(t,this,i)},"Storage.prototype.setItem"),e.Storage.prototype.getItem=e.__dynamic.wrap(e.Storage.prototype.getItem,function(t,...i){return i[0]&&(i[0]="__dynamic$"+e.__dynamic$location.host+"$"+i[0].toString()),Reflect.apply(t,this,i)||null},"Storage.prototype.getItem"),e.Storage.prototype.removeItem=e.__dynamic.wrap(e.Storage.prototype.removeItem,function(t,...i){return i[0]&&(i[0]="__dynamic$"+e.__dynamic$location.host+"$"+i[0].toString()),Reflect.apply(t,this,i)},"Storage.prototype.removeItem"),e.Storage.prototype.clear=e.__dynamic.wrap(e.Storage.prototype.clear,function(t,...i){for(var r=[],n=0;n{e["__dynamic$"+t]=new Proxy(e[t],{get(i,r){if("length"==r){for(var n=[],s=0;s(e.__dynamic.storage[t].setItem("__dynamic$"+e.__dynamic$location.host+"$"+r.toString(),n),n||!0),deleteProperty:(i,r)=>e.__dynamic.storage[t].removeItem("__dynamic$"+e.__dynamic$location.host+"$"+r.toString())}),delete e[t],e[t]=e["__dynamic$"+t]})}function Zi(e){"serviceWorker"in e.navigator&&(e.__dynamic.sw=e.navigator.serviceWorker,delete e.navigator.serviceWorker,delete e.Navigator.prototype.serviceWorker),e.navigator.sendBeacon=e.__dynamic.wrap(e.navigator.sendBeacon,function(t,...i){return i[0]&&(i[0]=e.__dynamic.url.encode(i[0],e.__dynamic.meta)),Reflect.apply(t,this,i)},"navigator.sendBeacon")}var er=e=>e?e.split(";").map(e=>e.split("=")).reduce((e,t)=>(e[t[0].trim()]=t[1].trim(),e),{}):{},We=(e=[])=>e.map(e=>`${e.name}=${e.value}`).join("; ");function tr(e){if(delete e.Document.prototype.cookie,e.__dynamic.define(e.document,"cookie",{get(){return e.__dynamic.fire("getCookies",[e.__dynamic.location.host,e.__dynamic.cookie.str||"",])||(e.__dynamic.cookies.update(e.__dynamic.location.host),e.__dynamic.cookie.str||e.__dynamic.cookie.desc.get.call(this)||"")},set(t){var i=e.__dynamic.modules.setCookieParser.parse(t,{decodeValues:!1})[0],r=e.__dynamic.fire("setCookie",[e.__dynamic.location.host,t,i,]);if(r)return r;i.name=i.name.replace(/^\./g,""),Promise.resolve(e.__dynamic.cookies.set(e.__dynamic.location.host,e.__dynamic.modules.cookie.serialize(i.name,i.value,{...i,encode:e=>e}))).then(async t=>{await e.__dynamic.cookies.update(e.__dynamic.location.host),e.__dynamic.cookie.str=await e.__dynamic.cookies.get(e.__dynamic.location.host)});var n=er(e.__dynamic.cookie.str||"");n[i.name]=i.value,e.__dynamic.cookie.str=We(Object.entries(n).map(e=>({name:e[0],value:e[1]})))}}),e.navigator.serviceWorker)try{e.navigator.serviceWorker.onmessage=({data:t})=>{if(t.host==e.__dynamic.location.host&&"set-cookie"==t.type){var i=e.__dynamic.modules.cookie.parse(t.val),r=er(e.__dynamic.cookie.str||"");r[Object.entries(i)[0][0]]=Object.entries(i)[0][1],e.__dynamic.cookie.str=We(Object.entries(r).map(e=>({name:e[0],value:e[1]})))}t.host==e.__dynamic.location.host&&"cookies"==t.type&&(e.__dynamic.cookie.str=t.cookies)}}catch{}}function ir(e){e.CSSStyleDeclaration.prototype._setProperty=e.CSSStyleDeclaration.prototype.setProperty,e.CSSStyleDeclaration.prototype.setProperty=e.__dynamic.wrap(e.CSSStyleDeclaration.prototype.setProperty,function(t,...i){return("background-image"==i[0]||"background"==i[0]||"backgroundImage"==i[0])&&(i[1]=e.__dynamic.rewrite.css.rewrite(i[1],e.__dynamic.meta)),t.apply(this,i)},"CSSStyleDeclaration.prototype.setProperty"),e.__dynamic.define(e.CSSStyleDeclaration.prototype,"background",{get(){return this._background?this._background:this.getPropertyValue("background")},set(t){return this._background=t,this._setProperty("background",e.__dynamic.rewrite.css.rewrite(t,e.__dynamic.meta))}}),e.__dynamic.define(e.CSSStyleDeclaration.prototype,"backgroundImage",{get(){return this._backgroundImage?this._backgroundImage:this.getPropertyValue("background-image")},set(t){return this._backgroundImage=t,this._setProperty("background-image",e.__dynamic.rewrite.css.rewrite(t,e.__dynamic.meta))}}),e.__dynamic.define(e.CSSStyleDeclaration.prototype,"background-image",{get(){return this._backgroundImage?this._backgroundImage:this.getPropertyValue("background-image")},set(t){return this._backgroundImage=t,this._setProperty("background-image",e.__dynamic.rewrite.css.rewrite(t,e.__dynamic.meta))}})}function bt(e){e.__dynamic.createBlobHandler=async(t,i,r)=>{let n=(await e.__dynamic.sw.ready).active;e.__dynamic.sw.addEventListener("message",({data:{url:t}})=>{t&&e.__dynamic.elements.iframeSrc.set.call(i,t)},{once:!0}),n.postMessage({type:"createBlobHandler",blob:t,url:e.__dynamic.modules.base64.encode(r.toString().split("").slice(0,10)),location:e.__dynamic.location.href})}}var Gn=(e,t,i)=>((i=new MutationObserver(t=>{for(var i of t)e[i.type](i),document.dispatchEvent(new CustomEvent({attributes:"attrChanged",characterData:"characterData",childList:"nodeChanged"}[i.type],{detail:i}))})).observe(t,{subtree:!0,attributes:!0,childList:!0}),i);function wt(e,t){function i(e){if(!e.rewritten&&!(1!==e.nodeType&&3!==e.nodeType)){if((e=new Proxy(e,{get:(e,i)=>"src"==i||"href"==i||"srcset"==i||"imageSrcset"==i||"data"==i||"action"==i?t.elements.getAttribute.call(e,i.toLowerCase()):"setAttribute"==i||"getAttribute"==i||"removeAttribute"==i||"hasAttribute"==i||"cloneNode"==i||"addEventListener"==i?(...r)=>t.elements[i].call(e,...r):"node"==i?e:e[i],set:(e,i,r)=>("src"==i||"href"==i||"srcset"==i||"imageSrcset"==i||"data"==i||"action"==i?t.elements.setAttribute.call(e,i.toLowerCase(),r):e[i]=r,!0)}))instanceof HTMLScriptElement&&(e.src&&(e.dataset.dynamic_src=e.src,e.src=t.url.encode(e.src,t.meta)),e.type&&e.textContent?.length?("application/javascript"==e.type||"text/javascript"==e.type||"application/x-javascript"==e.type&&e.textContent?.length)&&(e.textContent=t.rewrite.js.rewrite(e.textContent,{type:"script"},!1,t)):!e.type&&e.textContent?.length&&(e.textContent=t.rewrite.js.rewrite(e.textContent,{type:"script"},!1,t))),e instanceof HTMLStyleElement&&e.textContent?.length&&(e.textContent=t.rewrite.css.rewrite(e.textContent,t.meta)),e instanceof HTMLIFrameElement&&(e.src&&(e.dataset.dynamic_src=e.src,e.src=t.url.encode(e.src,t.meta)),e.srcdoc)){e.dataset.dynamic_srcdoc=e.srcdoc;let i=new Blob([t.rewrite.html.rewrite(e.srcdoc,t.meta)],{type:"text/html"});e.src=URL.createObjectURL(i)}if(e instanceof HTMLLinkElement&&("stylesheet"!==e.getAttribute("rel")&&"prefetch"!==e.getAttribute("rel")&&"dns-prefetch"!==e.getAttribute("rel")?(e.href&&(e.dataset.dynamic_href=e.href,e.href=t.url.encode(e.href,t.meta)),e.imageSrcset&&(e.dataset.dynamic_imagesrcset=e.imageSrcset,e.imageSrcset=t.rewrite.srcset.encode(e.imageSrcset,t))):e.addEventListener("error",i=>{if(e instanceof HTMLLinkElement)return e.href&&(e.dataset.dynamic_href=e.href,e.href=t.url.encode(e.href,t.meta)),e.imageSrcset&&(e.dataset.dynamic_imagesrcset=e.imageSrcset,e.imageSrcset=t.rewrite.srcset.encode(e.imageSrcset,t)),i.preventDefault(),!1},{once:!0})),e instanceof HTMLAnchorElement&&e.href&&(e.dataset.dynamic_href=e.href,e.href=t.url.encode(e.href,t.meta)),e instanceof HTMLFormElement&&e.action&&(e.dataset.dynamic_action=e.action,e.action=t.url.encode(e.action,t.meta)),e instanceof HTMLObjectElement&&e.data&&(e.dataset.dynamic_data=e.data,e.data=t.url.encode(e.data,t.meta)),e instanceof HTMLSourceElement&&(e.src&&(e.dataset.dynamic_src=e.src,e.src=t.url.encode(e.src,t.meta)),e.srcset&&(e.dataset.dynamic_srcset=e.srcset,e.srcset=t.rewrite.srcset.encode(e.srcset,t))),e instanceof HTMLImageElement&&(e.src&&(e.dataset.dynamic_src=e.src,e.src=t.url.encode(e.src,t.meta)),e.srcset&&(e.dataset.dynamic_srcset=e.srcset,e.srcset=t.rewrite.srcset.encode(e.srcset,t))),e instanceof HTMLAreaElement&&e.href&&(e.dataset.dynamic_href=e.href,e.href=t.url.encode(e.href,t.meta)),e instanceof HTMLBaseElement&&e.href&&(e.dataset.dynamic_href=e.href,e.href=t.url.encode(e.href,t.meta)),e instanceof HTMLInputElement&&e.src&&(e.dataset.dynamic_src=e.src,e.src=t.url.encode(e.src,t.meta)),e instanceof HTMLAudioElement&&e.src&&(e.dataset.dynamic_src=e.src,e.src=t.url.encode(e.src,t.meta)),e instanceof HTMLVideoElement&&e.src&&(e.dataset.dynamic_src=e.src,e.src=t.url.encode(e.src,t.meta)),e instanceof HTMLTrackElement&&e.src&&(e.dataset.dynamic_src=e.src,e.src=t.url.encode(e.src,t.meta)),e instanceof HTMLMediaElement&&e.src&&(e.dataset.dynamic_src=e.src,e.src=t.url.encode(e.src,t.meta)),e instanceof HTMLMetaElement&&e.httpEquiv){if("refresh"==e.httpEquiv.toLowerCase()){var r=e.content.split(";url=")[0],n=e.content.split(";url=")[1];e.content=`${r};url=${t.url.encode(n,t.meta)}`}"content-security-policy"==e.httpEquiv.toLowerCase()&&e.remove()}return e instanceof HTMLElement&&(e.getAttribute("style")&&e.setAttribute("style",t.rewrite.css.rewrite(e.getAttribute("style"),t.meta)),e.integrity&&(e.setAttribute("nointegrity",e.integrity),e.removeAttribute("integrity")),e.nonce&&(e.setAttribute("nononce",e.nonce),e.removeAttribute("nonce"))),e.rewritten=!0}}t||(t=e.__dynamic);let r=Gn({childList(e){for(let t of(i(e.target),e.addedNodes))if(t.childNodes)for(let r of t.childNodes)i(r);if(e.target.childNodes)for(var n of e.target.childNodes)i(n)},attributes(e){},characterData(e){}},e.document);e.document.addEventListener("DOMContentLoaded",()=>{r.disconnect()},{once:!0})}function rr(e){e.__dynamic.eval=e.__dynamic.wrap(eval,function(t,...i){if(i.length){var r=i[0].toString();return r=e.__dynamic.rewrite.js.rewrite(r,{type:"script"},!1,e.__dynamic),t.apply(this,[r])}},"eval"),e.__dynamic.define(e.Object.prototype,"__dynamic$eval",{get(){return this===window?e.__dynamic.eval:this.eval},set:e=>e}),e.__dynamic$wrapEval=t=>arguments.length?e.__dynamic.fire("eval",[e,t])||(t=e.__dynamic.rewrite.js.rewrite(t,{type:"script"},!1,e.__dynamic)):arguments[0]}function nr(e){var t=e.Function.prototype.toString;e.__dynamic.Function=e.Function.bind({}),e.__dynamic.define(e.Function.prototype,"_toString",{get:()=>t,set(){}});var i=function(){try{var e=Reflect.apply(t,this,[])}catch{return`function ${this.name}() { [native code] }`}return e.includes("[native code]")?`function ${this.name}() { [native code] }`:e};e.__dynamic.define(e.Function.prototype,"toString",{get(){return this.__toString||i},set(e){this.__toString=e}}),e.Function=new Proxy(e.Function,{apply(t,i,r){var n=[...r],s=n.pop();return s=`(function anonymous(${n.toString()}) {${s}})`,s=e.__dynamic.rewrite.js.rewrite(s,{type:"script"},!1,e.__dynamic),e.eval(s)},construct(t,i){var r=[...i],n=r.pop();return n=`(function anonymous(${r.toString()}) {${n}})`,n=e.__dynamic.rewrite.js.rewrite(n,{type:"script"},!1,e.__dynamic),e.eval(n)}}),e.Function.prototype.apply=e.__dynamic.wrap(e.Function.prototype.apply,function(t,...i){return i[0]==e.__dynamic$window&&(i[0]=i[0].__dynamic$self),i[0]==e.__dynamic$document&&(i[0]=e.document),Reflect.apply(t,this,i)},"Function.prototype.apply"),e.Function.prototype.call=new Proxy(e.Function.prototype.call,{apply:(t,i,r)=>(r[0]==e.__dynamic$window&&(r[0]=r[0].__dynamic$self),r[0]==e.__dynamic$document&&(r[0]=e.document),Reflect.apply(t,i,r))}),e.Function.prototype.bind=e.__dynamic.wrap(e.Function.prototype.bind,function(t,...i){return i[0]==e.__dynamic$window&&(i[0]=i[0].__dynamic$self),i[0]==e.__dynamic$document&&(i[0]=e.document),t.apply(this,i)},"Function.prototype.bind")}function ar(e){}function sr(e){}var zn,qe=class{constructor(e){this.methods=[{name:"get",function:"self"},{name:"func",function:"self"},{name:"location",function:"self"},{name:"mutation",function:"self"},{name:"dom",function:"self"},{name:"write",function:"self"},{name:"message",function:"self"},{name:"reflect",function:"self"},{name:"window",function:"self"},{name:"eval",function:"self"},{name:"attr",function:"self"},{name:"policy",function:"self"},{name:"worker",function:"self"},{name:"history",function:"self"},{name:"ws",function:"self"},{name:"cookie",function:"self"},{name:"fetch",function:"self"},{name:"niche",function:"self"},{name:"storage",function:"self"},{name:"style",function:"self"},{name:"rtc",function:"self"},{name:"blob",function:"self"},{name:"navigator",function:"self"},],"DedicatedWorkerGlobalScope"==self.constructor.name||"SharedWorkerGlobalScope"==self.constructor.name?(this.message=gt,this.location=dt,this.window=yt,this.get=mt,this.reflect=_t,this.imports=xt,this.blob=bt,this.mutation=wt):(this.location=dt,this.get=mt,this.window=yt,this.attr=qi,this.worker=Gi,this.history=zi,this.ws=Ki,this.fetch=Xi,this.message=gt,this.policy=ar,this.write=Qi,this.imports=xt,this.reflect=_t,this.niche=Yi,this.storage=Ji,this.navigator=Zi,this.cookie=tr,this.style=ir,this.blob=bt,this.mutation=wt,this.eval=rr,this.func=nr,this.rtc=sr,this.dom=Wi),this.ctx=e}};function Qs(e,t){return e||(e=[]),e.find(e=>e.name==t.name)?e[e.findIndex(e=>e.name==t.name)]={name:t.name,value:t.value,expires:t.expires}:e.push({name:t.name,value:t.value,expires:t.expires}),e}var he={open:async()=>Bt("__dynamic$cookies",1,{async upgrade(e){await e.createObjectStore("__dynamic$cookies")}}),set:async(e,t,i)=>(t.domain&&(e=t.domain),e.startsWith(".")&&(e=e.slice(1)),t.expires&&new Date(t.expires)e.name==s&&e.value==a&&e.expires==o),t);continue}r.find(e=>e.name==s&&e.value==a)||r.push({name:s,value:a,expires:o||new Date(1e13)})}}return r},async remove(e,t,i){t.domain&&(e=t.domain),e.startsWith(".")&&(e=e.slice(1));var r=await (await i).get("__dynamic$cookies",e);return!!r&&(await (await i).put("__dynamic$cookies",r=r.filter(e=>e.name!==t.name),e),!0)},async update(e,t){var i=await (await t).get("__dynamic$cookies",e.replace(/^(.*\.)?([^.]*\..*)$/g,"$2"));if(i){for(var{name:r,value:n,expires:s}of i)if(s&&new Date(s)<=new Date){he.remove(e,{name:r,value:n,expires:s},t);continue}}return i}},Ge=class{constructor(e){this.db=he,this.ctx=e}async get(e){this._db||(this._db=this.db.open());let t=await he.get(e,this._db);return We(t)}async set(e,t=""){return t=this.ctx.modules.setCookieParser.parse(t,{decodeValues:!1})[0],this._db||(this._db=this.db.open()),await he.set(e,t,this._db)}async open(){await he.open()}async update(e){return this._db||(this._db=this.db.open()),await he.update(e,this._db)}},lr={};dr(lr,{aes:()=>po,base64:()=>mo,none:()=>fo,plain:()=>ho,xor:()=>lo});var xe=14,ne=8,ze=!1,Ys=e=>{try{return unescape(encodeURIComponent(e))}catch{throw"Error on UTF-8 encode"}},Js=e=>{try{return decodeURIComponent(escape(e))}catch{throw"Bad Key"}},Zs=e=>{var t,i,r=[];for(e.length<16&&(r=[t=16-e.length,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t]),i=0;i{var i,r,n="";if(t){if((i=e[15])>16)throw"Decryption error: Maybe bad key";if(16===i)return"";for(r=0;r<16-i;r++)n+=String.fromCharCode(e[r])}else for(r=0;r<16;r++)n+=String.fromCharCode(e[r]);return n},or=(e,t)=>{var i,r=[];for(t||(e=Ys(e)),i=0;i{var t,i=[];for(t=0;t{var i,r=xe>=12?3:2,n=[],s=[],a=[],o=[],c=e.concat(t);for(a[0]=Qn(c),o=a[0],i=1;i{t=ta(t);var r,n=Math.ceil(e.length/16),s=[],a=[];for(r=0;r{t=ta(t);var n,s=e.length/16,a=[],o=[],c="";for(n=0;n=0;n--)o[n]=no(a[n],t),o[n]=0===n?Pt(o[n],i):Pt(o[n],a[n-1]);for(n=0;n{ze=!1;var i,r=Lt(e,t,0);for(i=1;i{ze=!0;var i,r=Lt(e,t,xe);for(i=xe-1;i>-1;i--)r=Zn(r),r=Jn(r),r=Lt(r,t,i),i>0&&(r=ea(r));return r},Jn=e=>{var t,i=ze?co:ur,r=[];for(t=0;t<16;t++)r[t]=i[e[t]];return r},Zn=e=>{var t,i=[],r=ze?[0,13,10,7,4,1,14,11,8,5,2,15,12,9,6,3]:[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11];for(t=0;t<16;t++)i[t]=e[r[t]];return i},ea=e=>{var t,i=[];if(ze)for(t=0;t<4;t++)i[4*t]=At[e[4*t]]^Ct[e[1+4*t]]^kt[e[2+4*t]]^Et[e[3+4*t]],i[1+4*t]=Et[e[4*t]]^At[e[1+4*t]]^Ct[e[2+4*t]]^kt[e[3+4*t]],i[2+4*t]=kt[e[4*t]]^Et[e[1+4*t]]^At[e[2+4*t]]^Ct[e[3+4*t]],i[3+4*t]=Ct[e[4*t]]^kt[e[1+4*t]]^Et[e[2+4*t]]^At[e[3+4*t]];else for(t=0;t<4;t++)i[4*t]=vt[e[4*t]]^St[e[1+4*t]]^e[2+4*t]^e[3+4*t],i[1+4*t]=e[4*t]^vt[e[1+4*t]]^St[e[2+4*t]]^e[3+4*t],i[2+4*t]=e[4*t]^e[1+4*t]^vt[e[2+4*t]]^St[e[3+4*t]],i[3+4*t]=St[e[4*t]]^e[1+4*t]^e[2+4*t]^vt[e[3+4*t]];return i},Lt=(e,t,i)=>{var r,n=[];for(r=0;r<16;r++)n[r]=e[r]^t[i][r];return n},Pt=(e,t)=>{var i,r=[];for(i=0;i<16;i++)r[i]=e[i]^t[i];return r},ta=e=>{var t,i,r,n,s=[],a=[],o=[];for(t=0;t6&&t%ne==4&&(a=Xn(a)),r=0;r<4;r++)s[t][r]=s[t-ne][r]^a[r]}for(t=0;t{for(var t=0;t<4;t++)e[t]=ur[e[t]];return e},ao=e=>{var t,i=e[0];for(t=0;t<3;t++)e[t]=e[t+1];return e[3]=i,e},cr=(e,t)=>{var i,r=[];for(i=0;i{var t,i=[];for(t=0;t{var i,r;for(r=0,i=0;i<8;i++)r=(1&t)==1?r^e:r,e=e>127?283^e<<1:e<<1,t>>>=1;return r},Ae=e=>{var t,i=[];for(t=0;t<256;t++)i[t]=oo(e,t);return i},ur=cr("637c777bf26b6fc53001672bfed7ab76ca82c97dfa5947f0add4a2af9ca472c0b7fd9326363ff7cc34a5e5f171d8311504c723c31896059a071280e2eb27b27509832c1a1b6e5aa0523bd6b329e32f8453d100ed20fcb15b6acbbe394a4c58cfd0efaafb434d338545f9027f503c9fa851a3408f929d38f5bcb6da2110fff3d2cd0c13ec5f974417c4a77e3d645d197360814fdc222a908846eeb814de5e0bdbe0323a0a4906245cc2d3ac629195e479e7c8376d8dd54ea96c56f4ea657aae08ba78252e1ca6b4c6e8dd741f4bbd8b8a703eb5664803f60e613557b986c11d9ee1f8981169d98e949b1e87e9ce5528df8ca1890dbfe6426841992d0fb054bb16",2),co=so(ur),uo=cr("01020408102040801b366cd8ab4d9a2f5ebc63c697356ad4b37dfaefc591",2),vt=Ae(2),St=Ae(3),Et=Ae(9),Ct=Ae(11),kt=Ae(13),At=Ae(14),ia=(e,t,i)=>{var r,n=eo(8),s=Yn(or(t,i),n),a=s.key,o=s.iv,c=[[83,97,108,116,101,100,95,95].concat(n)];return e=or(e,i),r=c.concat(r=to(e,a,o)),na.encode(r)},ra=(e,t,i)=>{var r=na.decode(e),n=r.slice(8,16),s=Yn(or(t,i),n),a=s.key,o=s.iv;return e=io(r=r.slice(16,r.length),a,o,i)},Qn=e=>{function t(e,t){return e<>>32-t}function i(e,t){var i,r,n,s,a;return n=2147483648&e,s=2147483648&t,i=1073741824&e,r=1073741824&t,a=(1073741823&e)+(1073741823&t),i&r?2147483648^a^n^s:i|r?1073741824&a?3221225472^a^n^s:1073741824^a^n^s:a^n^s}function r(e,t,i){return e&t|~e&i}function n(e,t,i){return e&i|t&~i}function s(e,t,i){return e^t^i}function a(e,t,i){return t^(e|~i)}function o(e,n,s,a,o,c,u){return e=i(e,i(i(r(n,s,a),o),u)),i(t(e,c),n)}function c(e,r,s,a,o,c,u){return e=i(e,i(i(n(r,s,a),o),u)),i(t(e,c),r)}function u(e,r,n,a,o,c,u){return e=i(e,i(i(s(r,n,a),o),u)),i(t(e,c),r)}function l(e,r,n,s,o,c,u){return e=i(e,i(i(a(r,n,s),o),u)),i(t(e,c),r)}function h(e){for(var t,i=e.length,r=i+8,n=((r-r%64)/64+1)*16,s=[],a=0,o=0;o>>29,s}function p(e){var t,i,r=[];for(i=0;i<=3;i++)t=e>>>8*i&255,r=r.concat(t);return r}var d,m,f,$,y,_,g,x,v,w=[],b=cr("67452301efcdab8998badcfe10325476d76aa478e8c7b756242070dbc1bdceeef57c0faf4787c62aa8304613fd469501698098d88b44f7afffff5bb1895cd7be6b901122fd987193a679438e49b40821f61e2562c040b340265e5a51e9b6c7aad62f105d02441453d8a1e681e7d3fbc821e1cde6c33707d6f4d50d87455a14eda9e3e905fcefa3f8676f02d98d2a4c8afffa39428771f6816d9d6122fde5380ca4beea444bdecfa9f6bb4b60bebfbc70289b7ec6eaa127fad4ef308504881d05d9d4d039e6db99e51fa27cf8c4ac5665f4292244432aff97ab9423a7fc93a039655b59c38f0ccc92ffeff47d85845dd16fa87e4ffe2ce6e0a30143144e0811a1f7537e82bd3af2352ad7d2bbeb86d391",8);for(w=h(e),_=b[0],g=b[1],x=b[2],v=b[3],d=0;d{var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=e.split(""),i=(e,i)=>{var r,n,s=[],a="",o=Math.floor(16*e.length/3);for(r=0;r<16*e.length;r++)s.push(e[Math.floor(r/16)][r%16]);for(r=0;r>2],a+=t[(3&s[r])<<4|s[r+1]>>4],void 0!==s[r+1]?a+=t[(15&s[r+1])<<2|s[r+2]>>6]:a+="=",void 0!==s[r+2]?a+=t[63&s[r+2]]:a+="=";for(n=a.slice(0,64)+` -`,r=1;r{t=t.replace(/\n/g,"");var i,r=[],n=[],s=[];for(i=0;i>4,s[1]=(15&n[1])<<4|n[2]>>2,s[2]=(3&n[2])<<6|n[3],r.push(s[0],s[1],s[2]);return r.slice(0,r.length-r.length%16)};return"function"==typeof Array.indexOf&&(e=t),{encode:i,decode:r}})(),lo={encode:(e,t=2)=>e&&encodeURIComponent(e.split("").map((e,i)=>i%t?String.fromCharCode(e.charCodeAt(0)^t):e).join("")),decode:(e,t=2)=>e&&decodeURIComponent(e).split("").map((e,i)=>i%t?String.fromCharCode(e.charCodeAt(0)^t):e).join("")},ho={encode:e=>e&&encodeURIComponent(e),decode:e=>e&&decodeURIComponent(e)},po={encode:e=>e&&encodeURIComponent(ia(e,"dynamic").substring(10)),decode:e=>e&&ra("U2FsdGVkX1"+decodeURIComponent(e),"dynamic")},fo={encode:e=>e,decode:e=>e},mo={encode:e=>e&&decodeURIComponent(btoa(e)),decode:e=>e&&atob(e)},Rt=class{constructor(e){this.modules=new Mn(this),this.util=new $n(this),this.meta=new Un(this),this.regex=new Ue(this),this.rewrite=new Vn(this),this.url=new jn(this),this.is=new Wn(this),this.cookies=new Ge(this),this.client=new qe(this),this.encoding=lr,this.headers=Hn,this.listeners=[],e&&!this.config&&(this.config=e),e&&this.util.encode(self)}on(e,t){this.listeners.push({event:e,cb:t})}fire(e,t){let i=!1;for(let r of this.listeners)r.event===e&&(t=(i=!0,r.cb(...t)));return i&&t?t:null}};function hr(e,t){t||(t=e.__dynamic),t.define=new e.Proxy(e.Object.defineProperty,{apply(e,t,i){try{return Reflect.apply(e,t,i)}catch{return i[2]}}}),t.defines=new e.Proxy(e.Object.defineProperties,{apply(e,t,i){try{return Reflect.apply(e,t,i)}catch{return i[1]}}}),e.parent&&(t.parent=e.parent),e.top&&(t.top=e.top),e.document&&(t.elements={attributes:["src","href","srcset","action","data","integrity","nonce","imagesrcset",],iframeSrc:Object.getOwnPropertyDescriptor(e.HTMLIFrameElement.prototype,"src"),contentWindow:Object.getOwnPropertyDescriptor(e.HTMLIFrameElement.prototype,"contentWindow"),innerHTML:Object.getOwnPropertyDescriptor(e.Element.prototype,"innerHTML"),outerHTML:Object.getOwnPropertyDescriptor(e.Element.prototype,"outerHTML"),attrValue:Object.getOwnPropertyDescriptor(e.Attr.prototype,"value"),setAttribute:e.Element.prototype.setAttribute,getAttribute:e.Element.prototype.getAttribute,removeAttribute:e.Element.prototype.removeAttribute,hasAttribute:e.Element.prototype.hasAttribute,cloneNode:e.Node.prototype.cloneNode,addEventListener:e.Node.prototype.addEventListener,config:[{elements:[e.HTMLScriptElement,e.HTMLIFrameElement,e.HTMLEmbedElement,e.HTMLInputElement,e.HTMLTrackElement,e.HTMLMediaElement,e.HTMLSourceElement,e.Image,e.HTMLImageElement,],tags:["src"],action:"url"},{elements:[e.HTMLSourceElement,e.HTMLImageElement],tags:["srcset"],action:"srcset"},{elements:[e.HTMLAnchorElement,e.HTMLLinkElement,e.HTMLAreaElement,e.SVGImageElement,e.HTMLBaseElement,],tags:["href"],action:"url"},{elements:[e.HTMLIFrameElement],tags:["contentWindow","contentDocument"],action:"window"},{elements:[e.HTMLFormElement],tags:["action"],action:"url"},{elements:[e.HTMLObjectElement],tags:["data"],action:"url"},{elements:[e.HTMLScriptElement,e.HTMLLinkElement],tags:["integrity"],action:"rewrite",new:"nointegrity"},{elements:[e.HTMLScriptElement,e.HTMLLinkElement],tags:["nonce"],action:"rewrite",new:"nononce"},{elements:[e.HTMLIFrameElement],tags:["srcdoc"],action:"html"},{elements:[e.HTMLElement],tags:["style"],action:"css"},{elements:[e.HTMLLinkElement],tags:["imageSrcset"],action:"srcset"},],createGetter:t=>({get(){return new URL(this.href||e.__dynamic$location.href)[t]},set(e){}}),client:It},e.__dynamic.baseURL=e.document?new URL(e.__dynamic.url.decode(e.document.baseURI)):null),e.document&&(t.cookie={str:e.__dynamic$cookie||"",desc:Object.getOwnPropertyDescriptor(e.Document.prototype,"cookie")}),e.XMLHttpRequest&&(t.http={XMLResponseURL:Object.getOwnPropertyDescriptor(e.XMLHttpRequest.prototype,"responseURL"),ResponseURL:Object.getOwnPropertyDescriptor(e.Response.prototype,"url"),RequestURL:Object.getOwnPropertyDescriptor(e.Request.prototype,"url"),XMLHttpRequest:e.XMLHttpRequest}),e.Storage&&(t.storage={localStorage:e.localStorage,sessionStorage:e.sessionStorage,keys:{localStorage:Object.keys(e.localStorage),sessionStorage:Object.keys(e.sessionStorage)},methods:["getItem","setItem","removeItem","clear","length","keys","values","entries","forEach","hasOwnProperty","toString","toLocaleString","valueOf","isPrototypeOf","propertyIsEnumerable","constructor","key",]},t.storage.cloned={localStorage:t.util.clone(t.storage.localStorage),sessionStorage:t.util.clone(t.storage.sessionStorage)}),e.RTCPeerConnection&&(t.webrtc={endpoints:["stun:stun.webice.org"]}),e.trustedTypes&&(t.trustedTypes={policy:e.trustedTypes.createPolicy("dynamic",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e,createURL:e=>e}),createScript:e.TrustedTypePolicy.prototype.createScript}),e.__dynamic$config.tab&&(e.document&&e.__dynamic$config.tab.title&&(document.title=e.__dynamic$config.tab.title,t.define(e.document,"title",{get:()=>e.__dynamic$config.tab.title,set:e=>e})),e.__dynamic$config.tab.icon&&(e.__dynamic$icon=e.__dynamic$config.tab.icon),e.Navigator&&e.__dynamic$config.tab.ua&&t.define(e.navigator,"userAgent",{get:()=>e.__dynamic$config.tab.ua,set(){}}))}function pr(e){e.__dynamic.wrap=(t,i,r)=>{if(t.__dynamic$target)return t;if(t.toString().includes("{ [native code] }")&&!t.prototype){var n=i,s=t,a=function(...t){if("string"==typeof r){var i=e.__dynamic.fire(r,this?[this,...t]:t);if(i)return i}return n.call(this,s,...t)},o=function(...e){return a.call(this,...e)};return e.__dynamic.define(o,"name",{value:t.name,writable:!1}),o.__dynamic$target=t,o.toString=()=>`function ${t.name}() { [native code] }`,o}try{let c=class extends t{constructor(...e){var n=[...e],s=i.call(t,t,...e);s&&(e=s),super(...e),r&&r(this,n)}};return Object.defineProperty(c,"name",{value:t.name,writable:!1}),c}catch{return t}}}function It(e,t={},i=""){if(e.hasOwnProperty("__dynamic"))return!1;e.hasOwnProperty("__dynamic$config")||(e.__dynamic$config=t),e.parent?.__dynamic&&(e.__dynamic$bare=e.parent.__dynamic$bare);let r=new Rt(e.__dynamic$config);for(var n of(r.config.bare.path="string"==typeof r.config.bare.path||r.config.bare.path instanceof URL?new URL(r.config.bare.path,e.location):r.config.bare.path.map(t=>new URL(t,e.location)),e.__dynamic$baseURL=i||e.__dynamic$url||r.url.decode(location.pathname+location.search+location.hash)||"",e.__dynamic=r,e.__dynamic.bare=new e.__dynamic.modules.bare.BareClient(e.__dynamic$config.bare.path,e.__dynamic$bare),e.__dynamic.meta.load(new URL(e.__dynamic$baseURL)),hr(e,null),pr(e),e.__dynamic.client.methods)){let s=n.name,a=Object.entries(e.__dynamic.client).find(e=>e[0]==s);"mutation"==s&&e.frameElement||"self"==n.function&&a[1](e)}return e}var Fl=It(self)})(); /*! Bundled license information: +(()=>{var aa=Object.create,Xe=Object.defineProperty,sa=Object.getOwnPropertyDescriptor,oa=Object.getOwnPropertyNames,ca=Object.getPrototypeOf,ua=Object.prototype.hasOwnProperty,la=(e,t,i)=>t in e?Xe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i,Tt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),dr=(e,t)=>{for(var i in t)Xe(e,i,{get:t[i],enumerable:!0})},ha=(e,t,i,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let n of oa(t))ua.call(e,n)||n===i||Xe(e,n,{get:()=>t[n],enumerable:!(r=sa(t,n))||r.enumerable});return e},Qe=(e,t,i)=>(i=null!=e?aa(ca(e)):{},ha(!t&&e&&e.__esModule?i:Xe(i,"default",{value:e,enumerable:!0}),e)),q=(e,t,i)=>(la(e,"symbol"!=typeof t?t+"":t,i),i),Nt=Tt((e,t)=>{function i(e){if("string"!=typeof e)throw TypeError("Path must be a string. Received "+JSON.stringify(e))}function r(e,t){for(var i,r="",n=0,s=-1,a=0,o=0;o<=e.length;++o){if(o2){var c=r.lastIndexOf("/");if(c!==r.length-1){-1===c?(r="",n=0):n=(r=r.slice(0,c)).length-1-r.lastIndexOf("/"),s=o,a=0;continue}}else if(2===r.length||1===r.length){r="",n=0,s=o,a=0;continue}t&&(r.length>0?r+="/..":r="..",n=2)}else r.length>0?r+="/"+e.slice(s+1,o):r=e.slice(s+1,o),n=o-s-1;s=o,a=0}else 46===i&&-1!==a?++a:a=-1}return r}var n={resolve(){for(var e,t,n="",s=!1,a=arguments.length-1;a>=-1&&!s;a--)a>=0?e=arguments[a]:(void 0===t&&(t=process.cwd()),e=t),i(e),0!==e.length&&(n=e+"/"+n,s=47===e.charCodeAt(0));return n=r(n,!s),s?n.length>0?"/"+n:"/":n.length>0?n:"."},normalize(e){if(i(e),0===e.length)return".";var t=47===e.charCodeAt(0),n=47===e.charCodeAt(e.length-1);return 0!==(e=r(e,!t)).length||t||(e="."),e.length>0&&n&&(e+="/"),t?"/"+e:e},isAbsolute:e=>(i(e),e.length>0&&47===e.charCodeAt(0)),join(){if(0===arguments.length)return".";for(var e,t=0;t0&&(void 0===e?e=r:e+="/"+r)}return void 0===e?".":n.normalize(e)},relative(e,t){if(i(e),i(t),e===t||(e=n.resolve(e))===(t=n.resolve(t)))return"";for(var r=1;rl){if(47===t.charCodeAt(o+h))return t.slice(o+h+1);if(0===h)return t.slice(o+h)}else a>l&&(47===e.charCodeAt(r+h)?p=h:0===h&&(p=0));break}var u=e.charCodeAt(r+h);if(u!==t.charCodeAt(o+h))break;47===u&&(p=h)}var d="";for(h=r+p+1;h<=s;++h)(h===s||47===e.charCodeAt(h))&&(0===d.length?d+="..":d+="/..");return d.length>0?d+t.slice(o+p):(o+=p,47===t.charCodeAt(o)&&++o,t.slice(o))},_makeLong:e=>e,dirname(e){if(i(e),0===e.length)return".";for(var t=e.charCodeAt(0),r=47===t,n=-1,s=!0,a=e.length-1;a>=1;--a)if(47===(t=e.charCodeAt(a))){if(!s){n=a;break}}else s=!1;return-1===n?r?"/":".":r&&1===n?"//":e.slice(0,n)},basename(e,t){if(void 0!==t&&"string"!=typeof t)throw TypeError('"ext" argument must be a string');i(e);var r,n=0,s=-1,a=!0;if(void 0!==t&&t.length>0&&t.length<=e.length){if(t.length===e.length&&t===e)return"";var o=t.length-1,c=-1;for(r=e.length-1;r>=0;--r){var l=e.charCodeAt(r);if(47===l){if(!a){n=r+1;break}}else-1===c&&(a=!1,c=r+1),o>=0&&(l===t.charCodeAt(o)?-1==--o&&(s=r):(o=-1,s=c))}return n===s?s=c:-1===s&&(s=e.length),e.slice(n,s)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!a){n=r+1;break}}else-1===s&&(a=!1,s=r+1);return-1===s?"":e.slice(n,s)},extname(e){i(e);for(var t=-1,r=0,n=-1,s=!0,a=0,o=e.length-1;o>=0;--o){var c=e.charCodeAt(o);if(47!==c)-1===n&&(s=!1,n=o+1),46===c?-1===t?t=o:1!==a&&(a=1):-1!==t&&(a=-1);else if(!s){r=o+1;break}}return-1===t||-1===n||0===a||1===a&&t===n-1&&t===r+1?"":e.slice(t,n)},format(e){if(null===e||"object"!=typeof e)throw TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var i=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return i?i===t.root?i+r:i+e+r:r}("/",e)},parse(e){i(e);var t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;var r,n=e.charCodeAt(0),s=47===n;s?(t.root="/",r=1):r=0;for(var a=-1,o=0,c=-1,l=!0,p=e.length-1,h=0;p>=r;--p)if(47!==(n=e.charCodeAt(p)))-1===c&&(l=!1,c=p+1),46===n?-1===a?a=p:1!==h&&(h=1):-1!==a&&(h=-1);else if(!l){o=p+1;break}return-1===a||-1===c||0===h||1===h&&a===c-1&&a===o+1?-1!==c&&(t.base=t.name=0===o&&s?e.slice(1,c):e.slice(o,c)):(0===o&&s?(t.name=e.slice(1,a),t.base=e.slice(1,c)):(t.name=e.slice(o,a),t.base=e.slice(o,c)),t.ext=e.slice(a,c)),o>0?t.dir=e.slice(0,o-1):s&&(t.dir="/"),t},sep:"/",delimiter:":",win32:null,posix:null};n.posix=n,t.exports=n}),vn=Tt(e=>{e.parse=function(e,t){if("string"!=typeof e)throw TypeError("argument str must be a string");for(var i={},n=(t||{}).decode||r,s=0;s{var i={decodeValues:!0,map:!1,silent:!1};function r(e){return"string"==typeof e&&!!e.trim()}function n(e,t){var n=e.split(";").filter(r),s=function(e){var t="",i="",r=e.split("=");return r.length>1?(t=r.shift(),i=r.join("=")):i=e,{name:t,value:i}}(n.shift()),a=s.name,o=s.value;t=t?Object.assign({},i,t):i;try{o=t.decodeValues?decodeURIComponent(o):o}catch(e){console.error("set-cookie-parser encountered an error while decoding a cookie with value '"+o+"'. Set options.decodeValues to false to disable this feature.",e)}var c={name:a,value:o};return n.forEach(e=>{var t=e.split("="),i=t.shift().trimLeft().toLowerCase(),r=t.join("=");"expires"===i?c.expires=new Date(r):"max-age"===i?c.maxAge=Number.parseInt(r,10):"secure"===i?c.secure=!0:"httponly"===i?c.httpOnly=!0:"samesite"===i?c.sameSite=r:c[i]=r}),c}function s(e,t){if(t=t?Object.assign({},i,t):i,!e)return t.map?{}:[];if(e.headers)if("function"==typeof e.headers.getSetCookie)e=e.headers.getSetCookie();else if(e.headers["set-cookie"])e=e.headers["set-cookie"];else{var s=e.headers[Object.keys(e.headers).find(e=>"set-cookie"===e.toLowerCase())];s||!e.headers.cookie||t.silent||console.warn("Warning: set-cookie-parser appears to have been called on a request object. It is designed to parse Set-Cookie headers from responses, not Cookie headers from requests. Set the option {silent: true} to suppress this warning."),e=s}return Array.isArray(e)||(e=[e]),(t=t?Object.assign({},i,t):i).map?e.filter(r).reduce((e,i)=>{var r=n(i,t);return e[r.name]=r,e},{}):e.filter(r).map(e=>n(e,t))}t.exports=s,t.exports.parse=s,t.exports.parseString=n,t.exports.splitCookiesString=function(e){if(Array.isArray(e))return e;if("string"!=typeof e)return[];var t,i,r,n,s,a=[],o=0;function c(){for(;o=e.length)&&a.push(e.substring(t,e.length))}return a}}),xr=Qe(Nt()),Ye={"application/ecmascript":{source:"apache",compressible:!0,extensions:["ecma"]},"application/gzip":{source:"iana",compressible:!1,extensions:["gz"]},"application/http":{source:"iana"},"application/javascript":{source:"apache",charset:"UTF-8",compressible:!0,extensions:["js"]},"application/json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["json","map"]},"application/manifest+json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["webmanifest"]},"application/marc":{source:"iana",extensions:["mrc"]},"application/mp4":{source:"iana",extensions:["mp4","mpg4","mp4s","m4p"]},"application/ogg":{source:"iana",compressible:!1,extensions:["ogx"]},"application/sql":{source:"iana",extensions:["sql"]},"application/wasm":{source:"iana",compressible:!0,extensions:["wasm"]},"application/x-bittorrent":{source:"apache",extensions:["torrent"]},"application/x-gzip":{source:"apache"},"application/x-javascript":{compressible:!0},"application/x-web-app-manifest+json":{compressible:!0,extensions:["webapp"]},"application/x-www-form-urlencoded":{source:"iana",compressible:!0},"application/xhtml+xml":{source:"iana",compressible:!0,extensions:["xhtml","xht"]},"application/xhtml-voice+xml":{source:"apache",compressible:!0},"application/xml":{source:"iana",compressible:!0,extensions:["xml","xsl","xsd","rng"]},"application/zip":{source:"iana",compressible:!1,extensions:["zip"]},"application/zlib":{source:"iana"},"audio/midi":{source:"apache",extensions:["mid","midi","kar","rmi"]},"audio/mp3":{compressible:!1,extensions:["mp3"]},"audio/mp4":{source:"iana",compressible:!1,extensions:["m4a","mp4a"]},"audio/mp4a-latm":{source:"iana"},"audio/mpa":{source:"iana"},"audio/mpa-robust":{source:"iana"},"audio/mpeg":{source:"iana",compressible:!1,extensions:["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/ogg":{source:"iana",compressible:!1,extensions:["oga","ogg","spx","opus"]},"audio/red":{source:"iana"},"audio/rtx":{source:"iana"},"audio/scip":{source:"iana"},"audio/silk":{source:"apache",extensions:["sil"]},"audio/smv":{source:"iana"},"audio/wav":{compressible:!1,extensions:["wav"]},"audio/wave":{compressible:!1,extensions:["wav"]},"audio/webm":{source:"apache",compressible:!1,extensions:["weba"]},"audio/x-aac":{source:"apache",compressible:!1,extensions:["aac"]},"audio/x-aiff":{source:"apache",extensions:["aif","aiff","aifc"]},"audio/x-caf":{source:"apache",compressible:!1,extensions:["caf"]},"audio/x-flac":{source:"apache",extensions:["flac"]},"audio/x-m4a":{source:"nginx",extensions:["m4a"]},"audio/x-matroska":{source:"apache",extensions:["mka"]},"audio/x-mpegurl":{source:"apache",extensions:["m3u"]},"audio/x-ms-wax":{source:"apache",extensions:["wax"]},"audio/x-ms-wma":{source:"apache",extensions:["wma"]},"audio/x-pn-realaudio":{source:"apache",extensions:["ram","ra"]},"audio/x-pn-realaudio-plugin":{source:"apache",extensions:["rmp"]},"audio/x-realaudio":{source:"nginx",extensions:["ra"]},"audio/x-tta":{source:"apache"},"audio/x-wav":{source:"apache",extensions:["wav"]},"audio/xm":{source:"apache",extensions:["xm"]},"font/collection":{source:"iana",extensions:["ttc"]},"font/otf":{source:"iana",compressible:!0,extensions:["otf"]},"font/sfnt":{source:"iana"},"font/ttf":{source:"iana",compressible:!0,extensions:["ttf"]},"font/woff":{source:"iana",extensions:["woff"]},"font/woff2":{source:"iana",extensions:["woff2"]},"image/gif":{source:"iana",compressible:!1,extensions:["gif"]},"image/heic":{source:"iana",extensions:["heic"]},"image/heic-sequence":{source:"iana",extensions:["heics"]},"image/heif":{source:"iana",extensions:["heif"]},"image/jpeg":{source:"iana",compressible:!1,extensions:["jpeg","jpg","jpe"]},"image/png":{source:"iana",compressible:!1,extensions:["png"]},"image/svg+xml":{source:"iana",compressible:!0,extensions:["svg","svgz"]},"image/webp":{source:"iana",extensions:["webp"]},"text/coffeescript":{extensions:["coffee","litcoffee"]},"text/css":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["css"]},"text/ecmascript":{source:"apache"},"text/html":{source:"iana",compressible:!0,extensions:["html","htm","shtml"]},"text/jade":{extensions:["jade"]},"text/javascript":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["js","mjs"]},"text/markdown":{source:"iana",compressible:!0,extensions:["md","markdown"]}},_r=/^\s*([^;\s]*)(?:;|\s|$)/,fa=/^text\//i,U={};function gr(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&Ye[t[1].toLowerCase()];return i&&i.charset?i.charset:!(!t||!fa.test(t[1]))&&"UTF-8"}function da(e){if(!e||"string"!=typeof e)return!1;var t=-1===e.indexOf("/")?U.lookup(e):e;if(!t)return!1;if(-1===t.indexOf("charset")){var i=U.charset(t);i&&(t+="; charset="+i.toLowerCase())}return t}function ma(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&U.extensions[t[1].toLowerCase()];return!(!i||!i.length)&&i[0]}function ya(e){if(!e||"string"!=typeof e)return!1;var t=(0,xr.extname)("x."+e).toLowerCase().substr(1);return t&&U.types[t]||!1}function ga(e,t){var i=["nginx","apache",void 0,"iana"];Object.keys(Ye).forEach(r=>{var n=Ye[r],s=n.extensions;if(s&&s.length){e[r]=s;for(var a=0;al||c===l&&"application/"===t[o].substr(0,12)))continue}t[o]=r}}})}U.charset=gr,U.charsets={lookup:gr},U.contentType=da,U.extension=ma,U.extensions=Object.create(null),U.lookup=ya,U.types=Object.create(null),ga(U.extensions,U.types);var br=U,Us=Qe(Nt(),1),Je={};dr(Je,{deleteDB:()=>Ca,openDB:()=>Bt,unwrap:()=>Le,wrap:()=>G});var wr,vr,xa=(e,t)=>t.some(t=>e instanceof t);function _a(){return wr||(wr=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function ba(){return vr||(vr=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var Sr=new WeakMap,Dt=new WeakMap,Er=new WeakMap,Mt=new WeakMap,Vt=new WeakMap;function wa(e){let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("success",n),e.removeEventListener("error",s)},n=()=>{t(G(e.result)),r()},s=()=>{i(e.error),r()};e.addEventListener("success",n),e.addEventListener("error",s)});return t.then(t=>{t instanceof IDBCursor&&Sr.set(t,e)}).catch(()=>{}),Vt.set(t,e),t}function va(e){if(Dt.has(e))return;let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("complete",n),e.removeEventListener("error",s),e.removeEventListener("abort",s)},n=()=>{t(),r()},s=()=>{i(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",n),e.addEventListener("error",s),e.addEventListener("abort",s)});Dt.set(e,t)}var Ot={get(e,t,i){if(e instanceof IDBTransaction){if("done"===t)return Dt.get(e);if("objectStoreNames"===t)return e.objectStoreNames||Er.get(e);if("store"===t)return i.objectStoreNames[1]?void 0:i.objectStore(i.objectStoreNames[0])}return G(e[t])},set:(e,t,i)=>(e[t]=i,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function Cr(e){Ot=e(Ot)}function Sa(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?ba().includes(e)?function(...t){return e.apply(Le(this),t),G(Sr.get(this))}:function(...t){return G(e.apply(Le(this),t))}:function(t,...i){let r=e.call(Le(this),t,...i);return Er.set(r,t.sort?t.sort():[t]),G(r)}}function Ea(e){return"function"==typeof e?Sa(e):(e instanceof IDBTransaction&&va(e),xa(e,_a())?new Proxy(e,Ot):e)}function G(e){if(e instanceof IDBRequest)return wa(e);if(Mt.has(e))return Mt.get(e);let t=Ea(e);return t!==e&&(Mt.set(e,t),Vt.set(t,e)),t}var Le=e=>Vt.get(e);function Bt(e,t,{blocked:i,upgrade:r,blocking:n,terminated:s}={}){let a=indexedDB.open(e,t),o=G(a);return r&&a.addEventListener("upgradeneeded",e=>{r(G(a.result),e.oldVersion,e.newVersion,G(a.transaction),e)}),i&&a.addEventListener("blocked",e=>i(e.oldVersion,e.newVersion,e)),o.then(e=>{s&&e.addEventListener("close",()=>s()),n&&e.addEventListener("versionchange",e=>n(e.oldVersion,e.newVersion,e))}).catch(()=>{}),o}function Ca(e,{blocked:t}={}){let i=indexedDB.deleteDatabase(e);return t&&i.addEventListener("blocked",e=>t(e.oldVersion,e)),G(i).then(()=>{})}var ka=["get","getKey","getAll","getAllKeys","count"],Aa=["put","add","delete","clear"],Ft=new Map;function kr(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(Ft.get(t))return Ft.get(t);let i=t.replace(/FromIndex$/,""),r=t!==i,n=Aa.includes(i);if(!(i in(r?IDBIndex:IDBObjectStore).prototype)||!n&&!ka.includes(i))return;let s=async function(e,...t){let s=this.transaction(e,n?"readwrite":"readonly"),a=s.store;return r&&(a=a.index(t.shift())),(await Promise.all([a[i](...t),n&&s.done]))[0]};return Ft.set(t,s),s}Cr(e=>({...e,get:(t,i,r)=>kr(t,i)||e.get(t,i,r),has:(t,i)=>!!kr(t,i)||e.has(t,i)}));var La=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,81,2,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,10,1,2,0,49,6,4,4,14,9,5351,0,7,14,13835,9,87,9,39,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,4706,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,983,6,110,6,6,9,4759,9,787719,239],Ir=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,68,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,4026,582,8634,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8936,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,757,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4153,7,221,3,5761,15,7472,3104,541,1507,4938,6,4191],Pa="‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-ᫎᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_",Tr="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꟊꟐꟑꟓꟕ-ꟙꟲ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",$t={3:"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",5:"class enum extends super const export import",6:"enum",strict:"implements interface let package private protected public static yield",strictBind:"eval arguments"},jt="break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this",Ra={5:jt,"5module":jt+" export import",6:jt+" const class extends export import super"},Ia=/^in(stanceof)?$/,Ta=RegExp("["+Tr+"]"),Na=RegExp("["+Tr+Pa+"]");function Ht(e,t){for(var i=65536,r=0;re);r+=2)if((i+=t[r+1])>=e)return!0;return!1}function ce(e,t){return e<65?36===e:e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Ta.test(String.fromCharCode(e)):!1!==t&&Ht(e,Ir)))}function be(e,t){return e<48?36===e:e<58||!(e<65)&&(e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Na.test(String.fromCharCode(e)):!1!==t&&(Ht(e,Ir)||Ht(e,La)))))}var L=function(e,t){void 0===t&&(t={}),this.label=e,this.keyword=t.keyword,this.beforeExpr=!!t.beforeExpr,this.startsExpr=!!t.startsExpr,this.isLoop=!!t.isLoop,this.isAssign=!!t.isAssign,this.prefix=!!t.prefix,this.postfix=!!t.postfix,this.binop=t.binop||null,this.updateContext=null};function z(e,t){return new L(e,{beforeExpr:!0,binop:t})}var K={beforeExpr:!0},H={startsExpr:!0},Gt={};function k(e,t){return void 0===t&&(t={}),t.keyword=e,Gt[e]=new L(e,t)}var u={num:new L("num",H),regexp:new L("regexp",H),string:new L("string",H),name:new L("name",H),privateId:new L("privateId",H),eof:new L("eof"),bracketL:new L("[",{beforeExpr:!0,startsExpr:!0}),bracketR:new L("]"),braceL:new L("{",{beforeExpr:!0,startsExpr:!0}),braceR:new L("}"),parenL:new L("(",{beforeExpr:!0,startsExpr:!0}),parenR:new L(")"),comma:new L(",",K),semi:new L(";",K),colon:new L(":",K),dot:new L("."),question:new L("?",K),questionDot:new L("?."),arrow:new L("=>",K),template:new L("template"),invalidTemplate:new L("invalidTemplate"),ellipsis:new L("...",K),backQuote:new L("`",H),dollarBraceL:new L("${",{beforeExpr:!0,startsExpr:!0}),eq:new L("=",{beforeExpr:!0,isAssign:!0}),assign:new L("_=",{beforeExpr:!0,isAssign:!0}),incDec:new L("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new L("!/~",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:z("||",1),logicalAND:z("&&",2),bitwiseOR:z("|",3),bitwiseXOR:z("^",4),bitwiseAND:z("&",5),equality:z("==/!=/===/!==",6),relational:z("/<=/>=",7),bitShift:z("<>/>>>",8),plusMin:new L("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:z("%",10),star:z("*",10),slash:z("/",10),starstar:new L("**",{beforeExpr:!0}),coalesce:z("??",1),_break:k("break"),_case:k("case",K),_catch:k("catch"),_continue:k("continue"),_debugger:k("debugger"),_default:k("default",K),_do:k("do",{isLoop:!0,beforeExpr:!0}),_else:k("else",K),_finally:k("finally"),_for:k("for",{isLoop:!0}),_function:k("function",H),_if:k("if"),_return:k("return",K),_switch:k("switch"),_throw:k("throw",K),_try:k("try"),_var:k("var"),_const:k("const"),_while:k("while",{isLoop:!0}),_with:k("with"),_new:k("new",{beforeExpr:!0,startsExpr:!0}),_this:k("this",H),_super:k("super",H),_class:k("class",H),_extends:k("extends",K),_export:k("export"),_import:k("import",H),_null:k("null",H),_true:k("true",H),_false:k("false",H),_in:k("in",{beforeExpr:!0,binop:7}),_instanceof:k("instanceof",{beforeExpr:!0,binop:7}),_typeof:k("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:k("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:k("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},Y=/\r\n?|\n|\u2028|\u2029/,Ma=RegExp(Y.source,"g");function we(e){return 10===e||13===e||8232===e||8233===e}function Nr(e,t,i){void 0===i&&(i=e.length);for(var r=t;rDa.call(e,t)),Ar=Array.isArray||(e=>"[object Array]"===Oa.call(e));function pe(e){return RegExp("^(?:"+e.replace(/ /g,"|")+")$")}function fe(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+((e-=65536)>>10),56320+(1023&e))}var Va=/(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/,Re=function(e,t){this.line=e,this.column=t};Re.prototype.offset=function(e){return new Re(this.line,this.column+e)};var rt=function(e,t,i){this.start=t,this.end=i,null!==e.sourceFile&&(this.source=e.sourceFile)};function Or(e,t){for(var i=1,r=0;;){var n=Nr(e,r,t);if(n<0)return new Re(i,t-r);++i,r=n}}var Wt={ecmaVersion:null,sourceType:"script",onInsertedSemicolon:null,onTrailingComma:null,allowReserved:null,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowAwaitOutsideFunction:null,allowSuperOutsideMethod:null,allowHashBang:!1,checkPrivateFields:!0,locations:!1,onToken:null,onComment:null,ranges:!1,program:null,sourceFile:null,directSourceFile:null,preserveParens:!1},Lr=!1;function Fa(e){var t={};for(var i in Wt)t[i]=e&&Te(e,i)?e[i]:Wt[i];if("latest"===t.ecmaVersion?t.ecmaVersion=1e8:null==t.ecmaVersion?(!Lr&&"object"==typeof console&&console.warn&&(Lr=!0,console.warn("Since Acorn 8.0.0, options.ecmaVersion is required.\nDefaulting to 2020, but this will stop working in the future.")),t.ecmaVersion=11):t.ecmaVersion>=2015&&(t.ecmaVersion-=2009),null==t.allowReserved&&(t.allowReserved=t.ecmaVersion<5),e&&null!=e.allowHashBang||(t.allowHashBang=t.ecmaVersion>=14),Ar(t.onToken)){var r=t.onToken;t.onToken=e=>r.push(e)}return Ar(t.onComment)&&(t.onComment=Ba(t,t.onComment)),t}function Ba(e,t){return function(i,r,n,s,a,o){var c={type:i?"Block":"Line",value:r,start:n,end:s};e.locations&&(c.loc=new rt(this,a,o)),e.ranges&&(c.range=[n,s]),t.push(c)}}var Ie=1,ve=2,zt=4,Vr=8,Fr=16,Br=32,Kt=64,$r=128,Ne=256,Xt=Ie|ve|Ne;function Qt(e,t){return ve|(e?zt:0)|(t?Vr:0)}var et=0,Yt=1,le=2,jr=3,Ur=4,Hr=5,T=function(e,t,i){this.options=e=Fa(e),this.sourceFile=e.sourceFile,this.keywords=pe(Ra[e.ecmaVersion>=6?6:"module"===e.sourceType?"5module":5]);var r="";!0!==e.allowReserved&&(r=$t[e.ecmaVersion>=6?6:5===e.ecmaVersion?5:3],"module"===e.sourceType&&(r+=" await")),this.reservedWords=pe(r);var n=(r?r+" ":"")+$t.strict;this.reservedWordsStrict=pe(n),this.reservedWordsStrictBind=pe(n+" "+$t.strictBind),this.input=String(t),this.containsEsc=!1,i?(this.pos=i,this.lineStart=this.input.lastIndexOf("\n",i-1)+1,this.curLine=this.input.slice(0,this.lineStart).split(Y).length):(this.pos=this.lineStart=0,this.curLine=1),this.type=u.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=this.initialContext(),this.exprAllowed=!0,this.inModule="module"===e.sourceType,this.strict=this.inModule||this.strictDirective(this.pos),this.potentialArrowAt=-1,this.potentialArrowInForAwait=!1,this.yieldPos=this.awaitPos=this.awaitIdentPos=0,this.labels=[],this.undefinedExports=Object.create(null),0===this.pos&&e.allowHashBang&&"#!"===this.input.slice(0,2)&&this.skipLineComment(2),this.scopeStack=[],this.enterScope(Ie),this.regexpState=null,this.privateNameStack=[]},ie={inFunction:{configurable:!0},inGenerator:{configurable:!0},inAsync:{configurable:!0},canAwait:{configurable:!0},allowSuper:{configurable:!0},allowDirectSuper:{configurable:!0},treatFunctionsAsVar:{configurable:!0},allowNewDotTarget:{configurable:!0},inClassStaticBlock:{configurable:!0}};T.prototype.parse=function(){var e=this.options.program||this.startNode();return this.nextToken(),this.parseTopLevel(e)},ie.inFunction.get=function(){return(this.currentVarScope().flags&ve)>0},ie.inGenerator.get=function(){return(this.currentVarScope().flags&Vr)>0&&!this.currentVarScope().inClassFieldInit},ie.inAsync.get=function(){return(this.currentVarScope().flags&zt)>0&&!this.currentVarScope().inClassFieldInit},ie.canAwait.get=function(){for(var e=this.scopeStack.length-1;e>=0;e--){var t=this.scopeStack[e];if(t.inClassFieldInit||t.flags&Ne)return!1;if(t.flags&ve)return(t.flags&zt)>0}return this.inModule&&this.options.ecmaVersion>=13||this.options.allowAwaitOutsideFunction},ie.allowSuper.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&Kt)>0||i||this.options.allowSuperOutsideMethod},ie.allowDirectSuper.get=function(){return(this.currentThisScope().flags&$r)>0},ie.treatFunctionsAsVar.get=function(){return this.treatFunctionsAsVarInScope(this.currentScope())},ie.allowNewDotTarget.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&(ve|Ne))>0||i},ie.inClassStaticBlock.get=function(){return(this.currentVarScope().flags&Ne)>0},T.extend=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var i=this,r=0;r=,?^&]/.test(n)||"!"===n&&"="===this.input.charAt(r+1))}e+=t[0].length,X.lastIndex=e,e+=X.exec(this.input)[0].length,";"===this.input[e]&&e++}},$.eat=function(e){return this.type===e&&(this.next(),!0)},$.isContextual=function(e){return this.type===u.name&&this.value===e&&!this.containsEsc},$.eatContextual=function(e){return!!this.isContextual(e)&&(this.next(),!0)},$.expectContextual=function(e){this.eatContextual(e)||this.unexpected()},$.canInsertSemicolon=function(){return this.type===u.eof||this.type===u.braceR||Y.test(this.input.slice(this.lastTokEnd,this.start))},$.insertSemicolon=function(){if(this.canInsertSemicolon())return this.options.onInsertedSemicolon&&this.options.onInsertedSemicolon(this.lastTokEnd,this.lastTokEndLoc),!0},$.semicolon=function(){this.eat(u.semi)||this.insertSemicolon()||this.unexpected()},$.afterTrailingComma=function(e,t){if(this.type===e)return this.options.onTrailingComma&&this.options.onTrailingComma(this.lastTokStart,this.lastTokStartLoc),t||this.next(),!0},$.expect=function(e){this.eat(e)||this.unexpected()},$.unexpected=function(e){this.raise(e??this.start,"Unexpected token")};var nt=function(){this.shorthandAssign=this.trailingComma=this.parenthesizedAssign=this.parenthesizedBind=this.doubleProto=-1};$.checkPatternErrors=function(e,t){if(e){e.trailingComma>-1&&this.raiseRecoverable(e.trailingComma,"Comma is not permitted after the rest element");var i=t?e.parenthesizedAssign:e.parenthesizedBind;i>-1&&this.raiseRecoverable(i,t?"Assigning to rvalue":"Parenthesized pattern")}},$.checkExpressionErrors=function(e,t){if(!e)return!1;var i=e.shorthandAssign,r=e.doubleProto;if(!t)return i>=0||r>=0;i>=0&&this.raise(i,"Shorthand property assignments are valid only in destructuring patterns"),r>=0&&this.raiseRecoverable(r,"Redefinition of __proto__ property")},$.checkYieldAwaitInDefaultParams=function(){this.yieldPos&&(!this.awaitPos||this.yieldPos55295&&r<56320)return!0;if(ce(r,!0)){for(var n=i+1;be(r=this.input.charCodeAt(n),!0);)++n;if(92===r||r>55295&&r<56320)return!0;var s=this.input.slice(i,n);if(!Ia.test(s))return!0}return!1},w.isAsyncFunction=function(){if(this.options.ecmaVersion<8||!this.isContextual("async"))return!1;X.lastIndex=this.pos;var e,t=X.exec(this.input),i=this.pos+t[0].length;return!(Y.test(this.input.slice(this.pos,i))||"function"!==this.input.slice(i,i+8)||i+8!==this.input.length&&(be(e=this.input.charCodeAt(i+8))||e>55295&&e<56320))},w.parseStatement=function(e,t,i){var r,n=this.type,s=this.startNode();switch(this.isLet(e)&&(n=u._var,r="let"),n){case u._break:case u._continue:return this.parseBreakContinueStatement(s,n.keyword);case u._debugger:return this.parseDebuggerStatement(s);case u._do:return this.parseDoStatement(s);case u._for:return this.parseForStatement(s);case u._function:return e&&(this.strict||"if"!==e&&"label"!==e)&&this.options.ecmaVersion>=6&&this.unexpected(),this.parseFunctionStatement(s,!1,!e);case u._class:return e&&this.unexpected(),this.parseClass(s,!0);case u._if:return this.parseIfStatement(s);case u._return:return this.parseReturnStatement(s);case u._switch:return this.parseSwitchStatement(s);case u._throw:return this.parseThrowStatement(s);case u._try:return this.parseTryStatement(s);case u._const:case u._var:return r=r||this.value,e&&"var"!==r&&this.unexpected(),this.parseVarStatement(s,r);case u._while:return this.parseWhileStatement(s);case u._with:return this.parseWithStatement(s);case u.braceL:return this.parseBlock(!0,s);case u.semi:return this.parseEmptyStatement(s);case u._export:case u._import:if(this.options.ecmaVersion>10&&n===u._import){X.lastIndex=this.pos;var a=X.exec(this.input),o=this.pos+a[0].length,c=this.input.charCodeAt(o);if(40===c||46===c)return this.parseExpressionStatement(s,this.parseExpression())}return this.options.allowImportExportEverywhere||(t||this.raise(this.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'")),n===u._import?this.parseImport(s):this.parseExport(s,i);default:if(this.isAsyncFunction())return e&&this.unexpected(),this.next(),this.parseFunctionStatement(s,!0,!e);var l=this.value,p=this.parseExpression();return n===u.name&&"Identifier"===p.type&&this.eat(u.colon)?this.parseLabeledStatement(s,l,p,e):this.parseExpressionStatement(s,p)}},w.parseBreakContinueStatement=function(e,t){var i="break"===t;this.next(),this.eat(u.semi)||this.insertSemicolon()?e.label=null:this.type!==u.name?this.unexpected():(e.label=this.parseIdent(),this.semicolon());for(var r=0;r=6?this.eat(u.semi):this.semicolon(),this.finishNode(e,"DoWhileStatement")},w.parseForStatement=function(e){this.next();var t=this.options.ecmaVersion>=9&&this.canAwait&&this.eatContextual("await")?this.lastTokStart:-1;if(this.labels.push(Jt),this.enterScope(0),this.expect(u.parenL),this.type===u.semi)return t>-1&&this.unexpected(t),this.parseFor(e,null);var i=this.isLet();if(this.type===u._var||this.type===u._const||i){var r=this.startNode(),n=i?"let":this.value;return this.next(),this.parseVar(r,!0,n),this.finishNode(r,"VariableDeclaration"),(this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of"))&&1===r.declarations.length?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),this.parseForIn(e,r)):(t>-1&&this.unexpected(t),this.parseFor(e,r))}var s=this.isContextual("let"),a=!1,o=new nt,c=this.parseExpression(!(t>-1)||"await",o);return this.type===u._in||(a=this.options.ecmaVersion>=6&&this.isContextual("of"))?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),s&&a&&this.raise(c.start,"The left-hand side of a for-of loop may not start with 'let'."),this.toAssignable(c,!1,o),this.checkLValPattern(c),this.parseForIn(e,c)):(this.checkExpressionErrors(o,!0),t>-1&&this.unexpected(t),this.parseFor(e,c))},w.parseFunctionStatement=function(e,t,i){return this.next(),this.parseFunction(e,Pe|(i?0:qt),!1,t)},w.parseIfStatement=function(e){return this.next(),e.test=this.parseParenExpression(),e.consequent=this.parseStatement("if"),e.alternate=this.eat(u._else)?this.parseStatement("if"):null,this.finishNode(e,"IfStatement")},w.parseReturnStatement=function(e){return this.inFunction||this.options.allowReturnOutsideFunction||this.raise(this.start,"'return' outside of function"),this.next(),this.eat(u.semi)||this.insertSemicolon()?e.argument=null:(e.argument=this.parseExpression(),this.semicolon()),this.finishNode(e,"ReturnStatement")},w.parseSwitchStatement=function(e){this.next(),e.discriminant=this.parseParenExpression(),e.cases=[],this.expect(u.braceL),this.labels.push(ja),this.enterScope(0);for(var t,i=!1;this.type!==u.braceR;)if(this.type===u._case||this.type===u._default){var r=this.type===u._case;t&&this.finishNode(t,"SwitchCase"),e.cases.push(t=this.startNode()),t.consequent=[],this.next(),r?t.test=this.parseExpression():(i&&this.raiseRecoverable(this.lastTokStart,"Multiple default clauses"),i=!0,t.test=null),this.expect(u.colon)}else t||this.unexpected(),t.consequent.push(this.parseStatement(null));return this.exitScope(),t&&this.finishNode(t,"SwitchCase"),this.next(),this.labels.pop(),this.finishNode(e,"SwitchStatement")},w.parseThrowStatement=function(e){return this.next(),Y.test(this.input.slice(this.lastTokEnd,this.start))&&this.raise(this.lastTokEnd,"Illegal newline after throw"),e.argument=this.parseExpression(),this.semicolon(),this.finishNode(e,"ThrowStatement")};var Ua=[];w.parseCatchClauseParam=function(){var e=this.parseBindingAtom(),t="Identifier"===e.type;return this.enterScope(t?Br:0),this.checkLValPattern(e,t?Ur:le),this.expect(u.parenR),e},w.parseTryStatement=function(e){if(this.next(),e.block=this.parseBlock(),e.handler=null,this.type===u._catch){var t=this.startNode();this.next(),this.eat(u.parenL)?t.param=this.parseCatchClauseParam():(this.options.ecmaVersion<10&&this.unexpected(),t.param=null,this.enterScope(0)),t.body=this.parseBlock(!1),this.exitScope(),e.handler=this.finishNode(t,"CatchClause")}return e.finalizer=this.eat(u._finally)?this.parseBlock():null,e.handler||e.finalizer||this.raise(e.start,"Missing catch or finally clause"),this.finishNode(e,"TryStatement")},w.parseVarStatement=function(e,t,i){return this.next(),this.parseVar(e,!1,t,i),this.semicolon(),this.finishNode(e,"VariableDeclaration")},w.parseWhileStatement=function(e){return this.next(),e.test=this.parseParenExpression(),this.labels.push(Jt),e.body=this.parseStatement("while"),this.labels.pop(),this.finishNode(e,"WhileStatement")},w.parseWithStatement=function(e){return this.strict&&this.raise(this.start,"'with' in strict mode"),this.next(),e.object=this.parseParenExpression(),e.body=this.parseStatement("with"),this.finishNode(e,"WithStatement")},w.parseEmptyStatement=function(e){return this.next(),this.finishNode(e,"EmptyStatement")},w.parseLabeledStatement=function(e,t,i,r){for(var n=0,s=this.labels;n=0;o--){var c=this.labels[o];if(c.statementStart!==e.start)break;c.statementStart=this.start,c.kind=a}return this.labels.push({name:t,kind:a,statementStart:this.start}),e.body=this.parseStatement(r?-1===r.indexOf("label")?r+"label":r:"label"),this.labels.pop(),e.label=i,this.finishNode(e,"LabeledStatement")},w.parseExpressionStatement=function(e,t){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},w.parseBlock=function(e,t,i){for(void 0===e&&(e=!0),void 0===t&&(t=this.startNode()),t.body=[],this.expect(u.braceL),e&&this.enterScope(0);this.type!==u.braceR;){var r=this.parseStatement(null);t.body.push(r)}return i&&(this.strict=!1),this.next(),e&&this.exitScope(),this.finishNode(t,"BlockStatement")},w.parseFor=function(e,t){return e.init=t,this.expect(u.semi),e.test=this.type===u.semi?null:this.parseExpression(),this.expect(u.semi),e.update=this.type===u.parenR?null:this.parseExpression(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,"ForStatement")},w.parseForIn=function(e,t){var i=this.type===u._in;return this.next(),"VariableDeclaration"===t.type&&null!=t.declarations[0].init&&(!i||this.options.ecmaVersion<8||this.strict||"var"!==t.kind||"Identifier"!==t.declarations[0].id.type)&&this.raise(t.start,(i?"for-in":"for-of")+" loop variable declaration may not have an initializer"),e.left=t,e.right=i?this.parseExpression():this.parseMaybeAssign(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,i?"ForInStatement":"ForOfStatement")},w.parseVar=function(e,t,i,r){for(e.declarations=[],e.kind=i;;){var n=this.startNode();if(this.parseVarId(n,i),this.eat(u.eq)?n.init=this.parseMaybeAssign(t):r||"const"!==i||this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of")?r||"Identifier"===n.id.type||t&&(this.type===u._in||this.isContextual("of"))?n.init=null:this.raise(this.lastTokEnd,"Complex binding patterns require an initialization value"):this.unexpected(),e.declarations.push(this.finishNode(n,"VariableDeclarator")),!this.eat(u.comma))break}return e},w.parseVarId=function(e,t){e.id=this.parseBindingAtom(),this.checkLValPattern(e.id,"var"===t?Yt:le,!1)};var Pe=1,qt=2,Wr=4;function Ha(e,t){var i=t.key.name,r=e[i],n="true";return"MethodDefinition"===t.type&&("get"===t.kind||"set"===t.kind)&&(n=(t.static?"s":"i")+t.kind),"iget"===r&&"iset"===n||"iset"===r&&"iget"===n||"sget"===r&&"sset"===n||"sset"===r&&"sget"===n?(e[i]="true",!1):!!r||(e[i]=n,!1)}function tt(e,t){var i=e.computed,r=e.key;return!i&&("Identifier"===r.type&&r.name===t||"Literal"===r.type&&r.value===t)}w.parseFunction=function(e,t,i,r,n){this.initFunction(e),(this.options.ecmaVersion>=9||this.options.ecmaVersion>=6&&!r)&&(this.type===u.star&&t&qt&&this.unexpected(),e.generator=this.eat(u.star)),this.options.ecmaVersion>=8&&(e.async=!!r),t&Pe&&(e.id=t&Wr&&this.type!==u.name?null:this.parseIdent(),e.id&&!(t&qt)&&this.checkLValSimple(e.id,this.strict||e.generator||e.async?this.treatFunctionsAsVar?Yt:le:jr));var s=this.yieldPos,a=this.awaitPos,o=this.awaitIdentPos;return this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(e.async,e.generator)),t&Pe||(e.id=this.type===u.name?this.parseIdent():null),this.parseFunctionParams(e),this.parseFunctionBody(e,i,!1,n),this.yieldPos=s,this.awaitPos=a,this.awaitIdentPos=o,this.finishNode(e,t&Pe?"FunctionDeclaration":"FunctionExpression")},w.parseFunctionParams=function(e){this.expect(u.parenL),e.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams()},w.parseClass=function(e,t){this.next();var i=this.strict;this.strict=!0,this.parseClassId(e,t),this.parseClassSuper(e);var r=this.enterClassBody(),n=this.startNode(),s=!1;for(n.body=[],this.expect(u.braceL);this.type!==u.braceR;){var a=this.parseClassElement(null!==e.superClass);a&&(n.body.push(a),"MethodDefinition"===a.type&&"constructor"===a.kind?(s&&this.raiseRecoverable(a.start,"Duplicate constructor in the same class"),s=!0):a.key&&"PrivateIdentifier"===a.key.type&&Ha(r,a)&&this.raiseRecoverable(a.key.start,"Identifier '#"+a.key.name+"' has already been declared"))}return this.strict=i,this.next(),e.body=this.finishNode(n,"ClassBody"),this.exitClassBody(),this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},w.parseClassElement=function(e){if(this.eat(u.semi))return null;var t=this.options.ecmaVersion,i=this.startNode(),r="",n=!1,s=!1,a="method",o=!1;if(this.eatContextual("static")){if(t>=13&&this.eat(u.braceL))return this.parseClassStaticBlock(i),i;this.isClassElementNameStart()||this.type===u.star?o=!0:r="static"}if(i.static=o,!r&&t>=8&&this.eatContextual("async")&&(!this.isClassElementNameStart()&&this.type!==u.star||this.canInsertSemicolon()?r="async":s=!0),!r&&(t>=9||!s)&&this.eat(u.star)&&(n=!0),!r&&!s&&!n){var c=this.value;(this.eatContextual("get")||this.eatContextual("set"))&&(this.isClassElementNameStart()?a=c:r=c)}if(r?(i.computed=!1,i.key=this.startNodeAt(this.lastTokStart,this.lastTokStartLoc),i.key.name=r,this.finishNode(i.key,"Identifier")):this.parseClassElementName(i),t<13||this.type===u.parenL||"method"!==a||n||s){var l=!i.static&&tt(i,"constructor");l&&"method"!==a&&this.raise(i.key.start,"Constructor can't have get/set modifier"),i.kind=l?"constructor":a,this.parseClassMethod(i,n,s,l&&e)}else this.parseClassField(i);return i},w.isClassElementNameStart=function(){return this.type===u.name||this.type===u.privateId||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword},w.parseClassElementName=function(e){this.type===u.privateId?("constructor"===this.value&&this.raise(this.start,"Classes can't have an element named '#constructor'"),e.computed=!1,e.key=this.parsePrivateIdent()):this.parsePropertyName(e)},w.parseClassMethod=function(e,t,i,r){var n=e.key;"constructor"===e.kind?(t&&this.raise(n.start,"Constructor can't be a generator"),i&&this.raise(n.start,"Constructor can't be an async method")):e.static&&tt(e,"prototype")&&this.raise(n.start,"Classes may not have a static property named prototype");var s=e.value=this.parseMethod(t,i,r);return"get"===e.kind&&0!==s.params.length&&this.raiseRecoverable(s.start,"getter should have no params"),"set"===e.kind&&1!==s.params.length&&this.raiseRecoverable(s.start,"setter should have exactly one param"),"set"===e.kind&&"RestElement"===s.params[0].type&&this.raiseRecoverable(s.params[0].start,"Setter cannot use rest params"),this.finishNode(e,"MethodDefinition")},w.parseClassField=function(e){if(tt(e,"constructor")?this.raise(e.key.start,"Classes can't have a field named 'constructor'"):e.static&&tt(e,"prototype")&&this.raise(e.key.start,"Classes can't have a static field named 'prototype'"),this.eat(u.eq)){var t=this.currentThisScope(),i=t.inClassFieldInit;t.inClassFieldInit=!0,e.value=this.parseMaybeAssign(),t.inClassFieldInit=i}else e.value=null;return this.semicolon(),this.finishNode(e,"PropertyDefinition")},w.parseClassStaticBlock=function(e){e.body=[];var t=this.labels;for(this.labels=[],this.enterScope(Ne|Kt);this.type!==u.braceR;){var i=this.parseStatement(null);e.body.push(i)}return this.next(),this.exitScope(),this.labels=t,this.finishNode(e,"StaticBlock")},w.parseClassId=function(e,t){this.type===u.name?(e.id=this.parseIdent(),t&&this.checkLValSimple(e.id,le,!1)):(!0===t&&this.unexpected(),e.id=null)},w.parseClassSuper=function(e){e.superClass=this.eat(u._extends)?this.parseExprSubscripts(null,!1):null},w.enterClassBody=function(){var e={declared:Object.create(null),used:[]};return this.privateNameStack.push(e),e.declared},w.exitClassBody=function(){var e=this.privateNameStack.pop(),t=e.declared,i=e.used;if(this.options.checkPrivateFields)for(var r=this.privateNameStack.length,n=0===r?null:this.privateNameStack[r-1],s=0;s=11&&(this.eatContextual("as")?(e.exported=this.parseModuleExportName(),this.checkExport(t,e.exported,this.lastTokStart)):e.exported=null),this.expectContextual("from"),this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom(),this.semicolon(),this.finishNode(e,"ExportAllDeclaration")},w.parseExport=function(e,t){if(this.next(),this.eat(u.star))return this.parseExportAllDeclaration(e,t);if(this.eat(u._default))return this.checkExport(t,"default",this.lastTokStart),e.declaration=this.parseExportDefaultDeclaration(),this.finishNode(e,"ExportDefaultDeclaration");if(this.shouldParseExportStatement())e.declaration=this.parseExportDeclaration(e),"VariableDeclaration"===e.declaration.type?this.checkVariableExport(t,e.declaration.declarations):this.checkExport(t,e.declaration.id,e.declaration.id.start),e.specifiers=[],e.source=null;else{if(e.declaration=null,e.specifiers=this.parseExportSpecifiers(t),this.eatContextual("from"))this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom();else{for(var i=0,r=e.specifiers;i=13&&this.type===u.string){var e=this.parseLiteral(this.value);return Va.test(e.value)&&this.raise(e.start,"An export name cannot include a lone surrogate."),e}return this.parseIdent(!0)},w.adaptDirectivePrologue=function(e){for(var t=0;t=5&&"ExpressionStatement"===e.type&&"Literal"===e.expression.type&&"string"==typeof e.expression.value&&('"'===this.input[e.start]||"'"===this.input[e.start])};var J=T.prototype;J.toAssignable=function(e,t,i){if(this.options.ecmaVersion>=6&&e)switch(e.type){case"Identifier":this.inAsync&&"await"===e.name&&this.raise(e.start,"Cannot use 'await' as identifier inside an async function");break;case"ObjectPattern":case"ArrayPattern":case"AssignmentPattern":case"RestElement":break;case"ObjectExpression":e.type="ObjectPattern",i&&this.checkPatternErrors(i,!0);for(var r=0,n=e.properties;r=8&&!o&&"async"===c.name&&!this.canInsertSemicolon()&&this.eat(u._function))return this.overrideContext(R.f_expr),this.parseFunction(this.startNodeAt(s,a),0,!1,!0,t);if(n&&!this.canInsertSemicolon()){if(this.eat(u.arrow))return this.parseArrowExpression(this.startNodeAt(s,a),[c],!1,t);if(this.options.ecmaVersion>=8&&"async"===c.name&&this.type===u.name&&!o&&(!this.potentialArrowInForAwait||"of"!==this.value||this.containsEsc))return c=this.parseIdent(!1),(this.canInsertSemicolon()||!this.eat(u.arrow))&&this.unexpected(),this.parseArrowExpression(this.startNodeAt(s,a),[c],!0,t)}return c;case u.regexp:var l=this.value;return(r=this.parseLiteral(l.value)).regex={pattern:l.pattern,flags:l.flags},r;case u.num:case u.string:return this.parseLiteral(this.value);case u._null:case u._true:case u._false:return(r=this.startNode()).value=this.type===u._null?null:this.type===u._true,r.raw=this.type.keyword,this.next(),this.finishNode(r,"Literal");case u.parenL:var p=this.start,h=this.parseParenAndDistinguishExpression(n,t);return e&&(e.parenthesizedAssign<0&&!this.isSimpleAssignTarget(h)&&(e.parenthesizedAssign=p),e.parenthesizedBind<0&&(e.parenthesizedBind=p)),h;case u.bracketL:return r=this.startNode(),this.next(),r.elements=this.parseExprList(u.bracketR,!0,!0,e),this.finishNode(r,"ArrayExpression");case u.braceL:return this.overrideContext(R.b_expr),this.parseObj(!1,e);case u._function:return r=this.startNode(),this.next(),this.parseFunction(r,0);case u._class:return this.parseClass(this.startNode(),!1);case u._new:return this.parseNew();case u.backQuote:return this.parseTemplate();case u._import:return this.options.ecmaVersion>=11?this.parseExprImport(i):this.unexpected();default:return this.parseExprAtomDefault()}},v.parseExprAtomDefault=function(){this.unexpected()},v.parseExprImport=function(e){var t=this.startNode();this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword import");var i=this.parseIdent(!0);return this.type!==u.parenL||e?this.type===u.dot?(t.meta=i,this.parseImportMeta(t)):void this.unexpected():this.parseDynamicImport(t)},v.parseDynamicImport=function(e){if(this.next(),e.source=this.parseMaybeAssign(),!this.eat(u.parenR)){var t=this.start;this.eat(u.comma)&&this.eat(u.parenR)?this.raiseRecoverable(t,"Trailing comma is not allowed in import()"):this.unexpected(t)}return this.finishNode(e,"ImportExpression")},v.parseImportMeta=function(e){this.next();var t=this.containsEsc;return e.property=this.parseIdent(!0),"meta"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for import is 'import.meta'"),t&&this.raiseRecoverable(e.start,"'import.meta' must not contain escaped characters"),"module"===this.options.sourceType||this.options.allowImportExportEverywhere||this.raiseRecoverable(e.start,"Cannot use 'import.meta' outside a module"),this.finishNode(e,"MetaProperty")},v.parseLiteral=function(e){var t=this.startNode();return t.value=e,t.raw=this.input.slice(this.start,this.end),110===t.raw.charCodeAt(t.raw.length-1)&&(t.bigint=t.raw.slice(0,-1).replace(/_/g,"")),this.next(),this.finishNode(t,"Literal")},v.parseParenExpression=function(){this.expect(u.parenL);var e=this.parseExpression();return this.expect(u.parenR),e},v.shouldParseArrow=function(e){return!this.canInsertSemicolon()},v.parseParenAndDistinguishExpression=function(e,t){var i,r=this.start,n=this.startLoc,s=this.options.ecmaVersion>=8;if(this.options.ecmaVersion>=6){this.next();var a,o=this.start,c=this.startLoc,l=[],p=!0,h=!1,d=new nt,m=this.yieldPos,f=this.awaitPos;for(this.yieldPos=0,this.awaitPos=0;this.type!==u.parenR;){if(p?p=!1:this.expect(u.comma),s&&this.afterTrailingComma(u.parenR,!0)){h=!0;break}if(this.type===u.ellipsis){a=this.start,l.push(this.parseParenItem(this.parseRestBinding())),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element");break}l.push(this.parseMaybeAssign(!1,d,this.parseParenItem))}var y=this.lastTokEnd,g=this.lastTokEndLoc;if(this.expect(u.parenR),e&&this.shouldParseArrow(l)&&this.eat(u.arrow))return this.checkPatternErrors(d,!1),this.checkYieldAwaitInDefaultParams(),this.yieldPos=m,this.awaitPos=f,this.parseParenArrowList(r,n,l,t);(!l.length||h)&&this.unexpected(this.lastTokStart),a&&this.unexpected(a),this.checkExpressionErrors(d,!0),this.yieldPos=m||this.yieldPos,this.awaitPos=f||this.awaitPos,l.length>1?((i=this.startNodeAt(o,c)).expressions=l,this.finishNodeAt(i,"SequenceExpression",y,g)):i=l[0]}else i=this.parseParenExpression();if(!this.options.preserveParens)return i;var _=this.startNodeAt(r,n);return _.expression=i,this.finishNode(_,"ParenthesizedExpression")},v.parseParenItem=e=>e,v.parseParenArrowList=function(e,t,i,r){return this.parseArrowExpression(this.startNodeAt(e,t),i,!1,r)};var Wa=[];v.parseNew=function(){this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword new");var e=this.startNode(),t=this.parseIdent(!0);if(this.options.ecmaVersion>=6&&this.eat(u.dot)){e.meta=t;var i=this.containsEsc;return e.property=this.parseIdent(!0),"target"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for new is 'new.target'"),i&&this.raiseRecoverable(e.start,"'new.target' must not contain escaped characters"),this.allowNewDotTarget||this.raiseRecoverable(e.start,"'new.target' can only be used in functions and class static block"),this.finishNode(e,"MetaProperty")}var r=this.start,n=this.startLoc;return e.callee=this.parseSubscripts(this.parseExprAtom(null,!1,!0),r,n,!0,!1),this.eat(u.parenL)?e.arguments=this.parseExprList(u.parenR,this.options.ecmaVersion>=8,!1):e.arguments=Wa,this.finishNode(e,"NewExpression")},v.parseTemplateElement=function(e){var t=e.isTagged,i=this.startNode();return this.type===u.invalidTemplate?(t||this.raiseRecoverable(this.start,"Bad escape sequence in untagged template literal"),i.value={raw:this.value,cooked:null}):i.value={raw:this.input.slice(this.start,this.end).replace(/\r\n?/g,"\n"),cooked:this.value},this.next(),i.tail=this.type===u.backQuote,this.finishNode(i,"TemplateElement")},v.parseTemplate=function(e){void 0===e&&(e={});var t=e.isTagged;void 0===t&&(t=!1);var i=this.startNode();this.next(),i.expressions=[];var r=this.parseTemplateElement({isTagged:t});for(i.quasis=[r];!r.tail;)this.type===u.eof&&this.raise(this.pos,"Unterminated template literal"),this.expect(u.dollarBraceL),i.expressions.push(this.parseExpression()),this.expect(u.braceR),i.quasis.push(r=this.parseTemplateElement({isTagged:t}));return this.next(),this.finishNode(i,"TemplateLiteral")},v.isAsyncProp=function(e){return!e.computed&&"Identifier"===e.key.type&&"async"===e.key.name&&(this.type===u.name||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword||this.options.ecmaVersion>=9&&this.type===u.star)&&!Y.test(this.input.slice(this.lastTokEnd,this.start))},v.parseObj=function(e,t){var i=this.startNode(),r=!0,n={};for(i.properties=[],this.next();!this.eat(u.braceR);){if(r)r=!1;else if(this.expect(u.comma),this.options.ecmaVersion>=5&&this.afterTrailingComma(u.braceR))break;var s=this.parseProperty(e,t);e||this.checkPropClash(s,n,t),i.properties.push(s)}return this.finishNode(i,e?"ObjectPattern":"ObjectExpression")},v.parseProperty=function(e,t){var i,r,n,s,a=this.startNode();if(this.options.ecmaVersion>=9&&this.eat(u.ellipsis))return e?(a.argument=this.parseIdent(!1),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element"),this.finishNode(a,"RestElement")):(a.argument=this.parseMaybeAssign(!1,t),this.type===u.comma&&t&&t.trailingComma<0&&(t.trailingComma=this.start),this.finishNode(a,"SpreadElement"));this.options.ecmaVersion>=6&&(a.method=!1,a.shorthand=!1,(e||t)&&(n=this.start,s=this.startLoc),e||(i=this.eat(u.star)));var o=this.containsEsc;return this.parsePropertyName(a),!e&&!o&&this.options.ecmaVersion>=8&&!i&&this.isAsyncProp(a)?(r=!0,i=this.options.ecmaVersion>=9&&this.eat(u.star),this.parsePropertyName(a)):r=!1,this.parsePropertyValue(a,e,i,r,n,s,t,o),this.finishNode(a,"Property")},v.parseGetterSetter=function(e){e.kind=e.key.name,this.parsePropertyName(e),e.value=this.parseMethod(!1);var t="get"===e.kind?0:1;if(e.value.params.length!==t){var i=e.value.start;"get"===e.kind?this.raiseRecoverable(i,"getter should have no params"):this.raiseRecoverable(i,"setter should have exactly one param")}else"set"===e.kind&&"RestElement"===e.value.params[0].type&&this.raiseRecoverable(e.value.params[0].start,"Setter cannot use rest params")},v.parsePropertyValue=function(e,t,i,r,n,s,a,o){(i||r)&&this.type===u.colon&&this.unexpected(),this.eat(u.colon)?(e.value=t?this.parseMaybeDefault(this.start,this.startLoc):this.parseMaybeAssign(!1,a),e.kind="init"):this.options.ecmaVersion>=6&&this.type===u.parenL?(t&&this.unexpected(),e.kind="init",e.method=!0,e.value=this.parseMethod(i,r)):t||o||!(this.options.ecmaVersion>=5)||e.computed||"Identifier"!==e.key.type||"get"!==e.key.name&&"set"!==e.key.name||this.type===u.comma||this.type===u.braceR||this.type===u.eq?this.options.ecmaVersion>=6&&!e.computed&&"Identifier"===e.key.type?((i||r)&&this.unexpected(),this.checkUnreserved(e.key),"await"!==e.key.name||this.awaitIdentPos||(this.awaitIdentPos=n),e.kind="init",t?e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key)):this.type===u.eq&&a?(a.shorthandAssign<0&&(a.shorthandAssign=this.start),e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key))):e.value=this.copyNode(e.key),e.shorthand=!0):this.unexpected():((i||r)&&this.unexpected(),this.parseGetterSetter(e))},v.parsePropertyName=function(e){if(this.options.ecmaVersion>=6){if(this.eat(u.bracketL))return e.computed=!0,e.key=this.parseMaybeAssign(),this.expect(u.bracketR),e.key;e.computed=!1}return e.key=this.type===u.num||this.type===u.string?this.parseExprAtom():this.parseIdent("never"!==this.options.allowReserved)},v.initFunction=function(e){e.id=null,this.options.ecmaVersion>=6&&(e.generator=e.expression=!1),this.options.ecmaVersion>=8&&(e.async=!1)},v.parseMethod=function(e,t,i){var r=this.startNode(),n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.initFunction(r),this.options.ecmaVersion>=6&&(r.generator=e),this.options.ecmaVersion>=8&&(r.async=!!t),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(t,r.generator)|Kt|(i?$r:0)),this.expect(u.parenL),r.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams(),this.parseFunctionBody(r,!1,!0,!1),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(r,"FunctionExpression")},v.parseArrowExpression=function(e,t,i,r){var n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.enterScope(Qt(i,!1)|Fr),this.initFunction(e),this.options.ecmaVersion>=8&&(e.async=!!i),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,e.params=this.toAssignableList(t,!0),this.parseFunctionBody(e,!0,!1,r),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(e,"ArrowFunctionExpression")},v.parseFunctionBody=function(e,t,i,r){var n=t&&this.type!==u.braceL,s=this.strict,a=!1;if(n)e.body=this.parseMaybeAssign(r),e.expression=!0,this.checkParams(e,!1);else{var o=this.options.ecmaVersion>=7&&!this.isSimpleParamList(e.params);(!s||o)&&(a=this.strictDirective(this.end))&&o&&this.raiseRecoverable(e.start,"Illegal 'use strict' directive in function with non-simple parameter list");var c=this.labels;this.labels=[],a&&(this.strict=!0),this.checkParams(e,!s&&!a&&!t&&!i&&this.isSimpleParamList(e.params)),this.strict&&e.id&&this.checkLValSimple(e.id,Hr),e.body=this.parseBlock(!1,void 0,a&&!s),e.expression=!1,this.adaptDirectivePrologue(e.body.body),this.labels=c}this.exitScope()},v.isSimpleParamList=e=>{for(var t=0,i=e;t-1||n.functions.indexOf(e)>-1||n.var.indexOf(e)>-1,n.lexical.push(e),this.inModule&&n.flags&Ie&&delete this.undefinedExports[e]}else if(t===Ur)this.currentScope().lexical.push(e);else if(t===jr){var s=this.currentScope();r=this.treatFunctionsAsVar?s.lexical.indexOf(e)>-1:s.lexical.indexOf(e)>-1||s.var.indexOf(e)>-1,s.functions.push(e)}else for(var a=this.scopeStack.length-1;a>=0;--a){var o=this.scopeStack[a];if(o.lexical.indexOf(e)>-1&&!(o.flags&Br&&o.lexical[0]===e)||!this.treatFunctionsAsVarInScope(o)&&o.functions.indexOf(e)>-1){r=!0;break}if(o.var.push(e),this.inModule&&o.flags&Ie&&delete this.undefinedExports[e],o.flags&Xt)break}r&&this.raiseRecoverable(i,"Identifier '"+e+"' has already been declared")},de.checkLocalExport=function(e){-1===this.scopeStack[0].lexical.indexOf(e.name)&&-1===this.scopeStack[0].var.indexOf(e.name)&&(this.undefinedExports[e.name]=e)},de.currentScope=function(){return this.scopeStack[this.scopeStack.length-1]},de.currentVarScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt)return t}},de.currentThisScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt&&!(t.flags&Fr))return t}};var at=function(e,t,i){this.type="",this.start=t,this.end=0,e.options.locations&&(this.loc=new rt(e,i)),e.options.directSourceFile&&(this.sourceFile=e.options.directSourceFile),e.options.ranges&&(this.range=[t,0])},Me=T.prototype;function Gr(e,t,i,r){return e.type=t,e.end=i,this.options.locations&&(e.loc.end=r),this.options.ranges&&(e.range[1]=i),e}Me.startNode=function(){return new at(this,this.start,this.startLoc)},Me.startNodeAt=function(e,t){return new at(this,e,t)},Me.finishNode=function(e,t){return Gr.call(this,e,t,this.lastTokEnd,this.lastTokEndLoc)},Me.finishNodeAt=function(e,t,i,r){return Gr.call(this,e,t,i,r)},Me.copyNode=function(e){var t=new at(this,e.start,this.startLoc);for(var i in e)t[i]=e[i];return t};var Ka,zr="ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS",Kr=zr+" Extended_Pictographic",Xr=Kr,Qr=Xr+" EBase EComp EMod EPres ExtPict",Yr=Qr,Ga=Yr,za={9:zr,10:Kr,11:Xr,12:Qr,13:Yr,14:Ga},Xa={9:"",10:"",11:"",12:"",13:"",14:"Basic_Emoji Emoji_Keycap_Sequence RGI_Emoji_Modifier_Sequence RGI_Emoji_Flag_Sequence RGI_Emoji_Tag_Sequence RGI_Emoji_ZWJ_Sequence RGI_Emoji"},Pr="Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu",Jr="Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb",Zr=Jr+" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd",en=Zr+" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho",tn=en+" Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi",rn=tn+" Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith",Qa=rn+" Hrkt Katakana_Or_Hiragana Kawi Nag_Mundari Nagm Unknown Zzzz",Ya={9:Jr,10:Zr,11:en,12:tn,13:rn,14:Qa},nn={};function Ja(e){var t=nn[e]={binary:pe(za[e]+" "+Pr),binaryOfStrings:pe(Xa[e]),nonBinary:{General_Category:pe(Pr),Script:pe(Ya[e])}};t.nonBinary.Script_Extensions=t.nonBinary.Script,t.nonBinary.gc=t.nonBinary.General_Category,t.nonBinary.sc=t.nonBinary.Script,t.nonBinary.scx=t.nonBinary.Script_Extensions}for(Ze=0,Ut=[9,10,11,12,13,14];Ze=6?"uy":"")+(e.options.ecmaVersion>=9?"s":"")+(e.options.ecmaVersion>=13?"d":"")+(e.options.ecmaVersion>=15?"v":""),this.unicodeProperties=nn[e.options.ecmaVersion>=14?14:e.options.ecmaVersion],this.source="",this.flags="",this.start=0,this.switchU=!1,this.switchV=!1,this.switchN=!1,this.pos=0,this.lastIntValue=0,this.lastStringValue="",this.lastAssertionIsQuantifiable=!1,this.numCapturingParens=0,this.maxBackReference=0,this.groupNames=[],this.backReferenceNames=[]};function an(e){return 36===e||e>=40&&e<=43||46===e||63===e||e>=91&&e<=94||e>=123&&e<=125}function Za(e){return ce(e,!0)||36===e||95===e}function es(e){return be(e,!0)||36===e||95===e||8204===e||8205===e}function sn(e){return e>=65&&e<=90||e>=97&&e<=122}function ts(e){return e>=0&&e<=1114111}re.prototype.reset=function(e,t,i){var r=-1!==i.indexOf("v"),n=-1!==i.indexOf("u");this.start=0|e,this.source=t+"",this.flags=i,r&&this.parser.options.ecmaVersion>=15?(this.switchU=!0,this.switchV=!0,this.switchN=!0):(this.switchU=n&&this.parser.options.ecmaVersion>=6,this.switchV=!1,this.switchN=n&&this.parser.options.ecmaVersion>=9)},re.prototype.raise=function(e){this.parser.raiseRecoverable(this.start,"Invalid regular expression: /"+this.source+"/: "+e)},re.prototype.at=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return-1;var n=i.charCodeAt(e);if(!t&&!this.switchU||n<=55295||n>=57344||e+1>=r)return n;var s=i.charCodeAt(e+1);return s>=56320&&s<=57343?(n<<10)+s-56613888:n},re.prototype.nextIndex=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return r;var n,s=i.charCodeAt(e);return!t&&!this.switchU||s<=55295||s>=57344||e+1>=r||(n=i.charCodeAt(e+1))<56320||n>57343?e+1:e+2},re.prototype.current=function(e){return void 0===e&&(e=!1),this.at(this.pos,e)},re.prototype.lookahead=function(e){return void 0===e&&(e=!1),this.at(this.nextIndex(this.pos,e),e)},re.prototype.advance=function(e){void 0===e&&(e=!1),this.pos=this.nextIndex(this.pos,e)},re.prototype.eat=function(e,t){return void 0===t&&(t=!1),this.current(t)===e&&(this.advance(t),!0)},re.prototype.eatChars=function(e,t){void 0===t&&(t=!1);for(var i=this.pos,r=0,n=e;r-1&&this.raise(e.start,"Duplicate regular expression flag"),"u"===a&&(r=!0),"v"===a&&(n=!0)}this.options.ecmaVersion>=15&&r&&n&&this.raise(e.start,"Invalid regular expression flag")},b.validateRegExpPattern=function(e){this.regexp_pattern(e),!e.switchN&&this.options.ecmaVersion>=9&&e.groupNames.length>0&&(e.switchN=!0,this.regexp_pattern(e))},b.regexp_pattern=function(e){e.pos=0,e.lastIntValue=0,e.lastStringValue="",e.lastAssertionIsQuantifiable=!1,e.numCapturingParens=0,e.maxBackReference=0,e.groupNames.length=0,e.backReferenceNames.length=0,this.regexp_disjunction(e),e.pos!==e.source.length&&(e.eat(41)&&e.raise("Unmatched ')'"),(e.eat(93)||e.eat(125))&&e.raise("Lone quantifier brackets")),e.maxBackReference>e.numCapturingParens&&e.raise("Invalid escape");for(var t=0,i=e.backReferenceNames;t=9&&(i=e.eat(60)),e.eat(61)||e.eat(33))return this.regexp_disjunction(e),e.eat(41)||e.raise("Unterminated group"),e.lastAssertionIsQuantifiable=!i,!0}return e.pos=t,!1},b.regexp_eatQuantifier=function(e,t){return void 0===t&&(t=!1),!!this.regexp_eatQuantifierPrefix(e,t)&&(e.eat(63),!0)},b.regexp_eatQuantifierPrefix=function(e,t){return e.eat(42)||e.eat(43)||e.eat(63)||this.regexp_eatBracedQuantifier(e,t)},b.regexp_eatBracedQuantifier=function(e,t){var i=e.pos;if(e.eat(123)){var r=0,n=-1;if(this.regexp_eatDecimalDigits(e)&&(r=e.lastIntValue,e.eat(44)&&this.regexp_eatDecimalDigits(e)&&(n=e.lastIntValue),e.eat(125)))return-1!==n&&n=9?this.regexp_groupSpecifier(e):63===e.current()&&e.raise("Invalid group"),this.regexp_disjunction(e),e.eat(41))return e.numCapturingParens+=1,!0;e.raise("Unterminated group")}return!1},b.regexp_eatExtendedAtom=function(e){return e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)||this.regexp_eatInvalidBracedQuantifier(e)||this.regexp_eatExtendedPatternCharacter(e)},b.regexp_eatInvalidBracedQuantifier=function(e){return this.regexp_eatBracedQuantifier(e,!0)&&e.raise("Nothing to repeat"),!1},b.regexp_eatSyntaxCharacter=e=>{var t=e.current();return!!an(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatPatternCharacters=e=>{for(var t=e.pos,i=0;-1!==(i=e.current())&&!an(i);)e.advance();return e.pos!==t},b.regexp_eatExtendedPatternCharacter=e=>{var t=e.current();return!(-1===t||36===t||t>=40&&t<=43||46===t||63===t||91===t||94===t||124===t||(e.advance(),0))},b.regexp_groupSpecifier=function(e){if(e.eat(63)){if(this.regexp_eatGroupName(e))return-1!==e.groupNames.indexOf(e.lastStringValue)&&e.raise("Duplicate capture group name"),void e.groupNames.push(e.lastStringValue);e.raise("Invalid group")}},b.regexp_eatGroupName=function(e){if(e.lastStringValue="",e.eat(60)){if(this.regexp_eatRegExpIdentifierName(e)&&e.eat(62))return!0;e.raise("Invalid capture group name")}return!1},b.regexp_eatRegExpIdentifierName=function(e){if(e.lastStringValue="",this.regexp_eatRegExpIdentifierStart(e)){for(e.lastStringValue+=fe(e.lastIntValue);this.regexp_eatRegExpIdentifierPart(e);)e.lastStringValue+=fe(e.lastIntValue);return!0}return!1},b.regexp_eatRegExpIdentifierStart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),Za(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatRegExpIdentifierPart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),es(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatAtomEscape=function(e){return!!(this.regexp_eatBackReference(e)||this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)||e.switchN&&this.regexp_eatKGroupName(e))||(e.switchU&&(99===e.current()&&e.raise("Invalid unicode escape"),e.raise("Invalid escape")),!1)},b.regexp_eatBackReference=function(e){var t=e.pos;if(this.regexp_eatDecimalEscape(e)){var i=e.lastIntValue;if(e.switchU)return i>e.maxBackReference&&(e.maxBackReference=i),!0;if(i<=e.numCapturingParens)return!0;e.pos=t}return!1},b.regexp_eatKGroupName=function(e){if(e.eat(107)){if(this.regexp_eatGroupName(e))return e.backReferenceNames.push(e.lastStringValue),!0;e.raise("Invalid named reference")}return!1},b.regexp_eatCharacterEscape=function(e){return this.regexp_eatControlEscape(e)||this.regexp_eatCControlLetter(e)||this.regexp_eatZero(e)||this.regexp_eatHexEscapeSequence(e)||this.regexp_eatRegExpUnicodeEscapeSequence(e,!1)||!e.switchU&&this.regexp_eatLegacyOctalEscapeSequence(e)||this.regexp_eatIdentityEscape(e)},b.regexp_eatCControlLetter=function(e){var t=e.pos;if(e.eat(99)){if(this.regexp_eatControlLetter(e))return!0;e.pos=t}return!1},b.regexp_eatZero=e=>!(48!==e.current()||st(e.lookahead())||(e.lastIntValue=0,e.advance(),0)),b.regexp_eatControlEscape=e=>{var t=e.current();return 116===t?(e.lastIntValue=9,e.advance(),!0):110===t?(e.lastIntValue=10,e.advance(),!0):118===t?(e.lastIntValue=11,e.advance(),!0):102===t?(e.lastIntValue=12,e.advance(),!0):114===t&&(e.lastIntValue=13,e.advance(),!0)},b.regexp_eatControlLetter=e=>{var t=e.current();return!!sn(t)&&(e.lastIntValue=t%32,e.advance(),!0)},b.regexp_eatRegExpUnicodeEscapeSequence=function(e,t){void 0===t&&(t=!1);var i=e.pos,r=t||e.switchU;if(e.eat(117)){if(this.regexp_eatFixedHexDigits(e,4)){var n=e.lastIntValue;if(r&&n>=55296&&n<=56319){var s=e.pos;if(e.eat(92)&&e.eat(117)&&this.regexp_eatFixedHexDigits(e,4)){var a=e.lastIntValue;if(a>=56320&&a<=57343)return e.lastIntValue=1024*(n-55296)+(a-56320)+65536,!0}e.pos=s,e.lastIntValue=n}return!0}if(r&&e.eat(123)&&this.regexp_eatHexDigits(e)&&e.eat(125)&&ts(e.lastIntValue))return!0;r&&e.raise("Invalid unicode escape"),e.pos=i}return!1},b.regexp_eatIdentityEscape=function(e){if(e.switchU)return!!this.regexp_eatSyntaxCharacter(e)||!!e.eat(47)&&(e.lastIntValue=47,!0);var t=e.current();return!(99===t||e.switchN&&107===t||(e.lastIntValue=t,e.advance(),0))},b.regexp_eatDecimalEscape=e=>{e.lastIntValue=0;var t=e.current();if(t>=49&&t<=57){do{e.lastIntValue=10*e.lastIntValue+(t-48),e.advance()}while((t=e.current())>=48&&t<=57);return!0}return!1};var on=0,ue=1,Q=2;function is(e){return 100===e||68===e||115===e||83===e||119===e||87===e}function cn(e){return sn(e)||95===e}function rs(e){return cn(e)||st(e)}function ns(e){return 33===e||e>=35&&e<=38||e>=42&&e<=44||46===e||e>=58&&e<=64||94===e||96===e||126===e}function as(e){return 40===e||41===e||45===e||47===e||e>=91&&e<=93||e>=123&&e<=125}function ss(e){return 33===e||35===e||37===e||38===e||44===e||45===e||e>=58&&e<=62||64===e||96===e||126===e}function st(e){return e>=48&&e<=57}function un(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function ln(e){return e>=65&&e<=70?e-65+10:e>=97&&e<=102?e-97+10:e-48}function hn(e){return e>=48&&e<=55}b.regexp_eatCharacterClassEscape=function(e){var t,i=e.current();if(is(i))return e.lastIntValue=-1,e.advance(),ue;var r=!1;if(e.switchU&&this.options.ecmaVersion>=9&&((r=80===i)||112===i)){if(e.lastIntValue=-1,e.advance(),e.eat(123)&&(t=this.regexp_eatUnicodePropertyValueExpression(e))&&e.eat(125))return r&&t===Q&&e.raise("Invalid property name"),t;e.raise("Invalid property name")}return on},b.regexp_eatUnicodePropertyValueExpression=function(e){var t=e.pos;if(this.regexp_eatUnicodePropertyName(e)&&e.eat(61)){var i=e.lastStringValue;if(this.regexp_eatUnicodePropertyValue(e)){var r=e.lastStringValue;return this.regexp_validateUnicodePropertyNameAndValue(e,i,r),ue}}if(e.pos=t,this.regexp_eatLoneUnicodePropertyNameOrValue(e)){var n=e.lastStringValue;return this.regexp_validateUnicodePropertyNameOrValue(e,n)}return on},b.regexp_validateUnicodePropertyNameAndValue=(e,t,i)=>{Te(e.unicodeProperties.nonBinary,t)||e.raise("Invalid property name"),e.unicodeProperties.nonBinary[t].test(i)||e.raise("Invalid property value")},b.regexp_validateUnicodePropertyNameOrValue=(e,t)=>e.unicodeProperties.binary.test(t)?ue:e.switchV&&e.unicodeProperties.binaryOfStrings.test(t)?Q:void e.raise("Invalid property name"),b.regexp_eatUnicodePropertyName=e=>{var t=0;for(e.lastStringValue="";cn(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatUnicodePropertyValue=e=>{var t=0;for(e.lastStringValue="";rs(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatLoneUnicodePropertyNameOrValue=function(e){return this.regexp_eatUnicodePropertyValue(e)},b.regexp_eatCharacterClass=function(e){if(e.eat(91)){var t=e.eat(94),i=this.regexp_classContents(e);return e.eat(93)||e.raise("Unterminated character class"),t&&i===Q&&e.raise("Negated character class may contain strings"),!0}return!1},b.regexp_classContents=function(e){return 93===e.current()?ue:e.switchV?this.regexp_classSetExpression(e):(this.regexp_nonEmptyClassRanges(e),ue)},b.regexp_nonEmptyClassRanges=function(e){for(;this.regexp_eatClassAtom(e);){var t=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassAtom(e)){var i=e.lastIntValue;e.switchU&&(-1===t||-1===i)&&e.raise("Invalid character class"),-1!==t&&-1!==i&&t>i&&e.raise("Range out of order in character class")}}},b.regexp_eatClassAtom=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatClassEscape(e))return!0;if(e.switchU){var i=e.current();(99===i||hn(i))&&e.raise("Invalid class escape"),e.raise("Invalid escape")}e.pos=t}var r=e.current();return 93!==r&&(e.lastIntValue=r,e.advance(),!0)},b.regexp_eatClassEscape=function(e){var t=e.pos;if(e.eat(98))return e.lastIntValue=8,!0;if(e.switchU&&e.eat(45))return e.lastIntValue=45,!0;if(!e.switchU&&e.eat(99)){if(this.regexp_eatClassControlLetter(e))return!0;e.pos=t}return this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)},b.regexp_classSetExpression=function(e){var t,i=ue;if(!this.regexp_eatClassSetRange(e))if(t=this.regexp_eatClassSetOperand(e)){t===Q&&(i=Q);for(var r=e.pos;e.eatChars([38,38]);)38!==e.current()&&(t=this.regexp_eatClassSetOperand(e))?t!==Q&&(i=ue):e.raise("Invalid character in character class");if(r!==e.pos)return i;for(;e.eatChars([45,45]);)this.regexp_eatClassSetOperand(e)||e.raise("Invalid character in character class");if(r!==e.pos)return i}else e.raise("Invalid character in character class");for(;;)if(!this.regexp_eatClassSetRange(e)){if(!(t=this.regexp_eatClassSetOperand(e)))return i;t===Q&&(i=Q)}},b.regexp_eatClassSetRange=function(e){var t=e.pos;if(this.regexp_eatClassSetCharacter(e)){var i=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassSetCharacter(e)){var r=e.lastIntValue;return-1!==i&&-1!==r&&i>r&&e.raise("Range out of order in character class"),!0}e.pos=t}return!1},b.regexp_eatClassSetOperand=function(e){return this.regexp_eatClassSetCharacter(e)?ue:this.regexp_eatClassStringDisjunction(e)||this.regexp_eatNestedClass(e)},b.regexp_eatNestedClass=function(e){var t=e.pos;if(e.eat(91)){var i=e.eat(94),r=this.regexp_classContents(e);if(e.eat(93))return i&&r===Q&&e.raise("Negated character class may contain strings"),r;e.pos=t}if(e.eat(92)){var n=this.regexp_eatCharacterClassEscape(e);if(n)return n;e.pos=t}return null},b.regexp_eatClassStringDisjunction=function(e){var t=e.pos;if(e.eatChars([92,113])){if(e.eat(123)){var i=this.regexp_classStringDisjunctionContents(e);if(e.eat(125))return i}else e.raise("Invalid escape");e.pos=t}return null},b.regexp_classStringDisjunctionContents=function(e){for(var t=this.regexp_classString(e);e.eat(124);)this.regexp_classString(e)===Q&&(t=Q);return t},b.regexp_classString=function(e){for(var t=0;this.regexp_eatClassSetCharacter(e);)t++;return 1===t?ue:Q},b.regexp_eatClassSetCharacter=function(e){var t=e.pos;if(e.eat(92))return!(!this.regexp_eatCharacterEscape(e)&&!this.regexp_eatClassSetReservedPunctuator(e)&&(e.eat(98)?(e.lastIntValue=8,0):(e.pos=t,1)));var i=e.current();return!(i<0||i===e.lookahead()&&ns(i)||as(i)||(e.advance(),e.lastIntValue=i,0))},b.regexp_eatClassSetReservedPunctuator=e=>{var t=e.current();return!!ss(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatClassControlLetter=e=>{var t=e.current();return!(!st(t)&&95!==t||(e.lastIntValue=t%32,e.advance(),0))},b.regexp_eatHexEscapeSequence=function(e){var t=e.pos;if(e.eat(120)){if(this.regexp_eatFixedHexDigits(e,2))return!0;e.switchU&&e.raise("Invalid escape"),e.pos=t}return!1},b.regexp_eatDecimalDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;st(i=e.current());)e.lastIntValue=10*e.lastIntValue+(i-48),e.advance();return e.pos!==t},b.regexp_eatHexDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;un(i=e.current());)e.lastIntValue=16*e.lastIntValue+ln(i),e.advance();return e.pos!==t},b.regexp_eatLegacyOctalEscapeSequence=function(e){if(this.regexp_eatOctalDigit(e)){var t=e.lastIntValue;if(this.regexp_eatOctalDigit(e)){var i=e.lastIntValue;t<=3&&this.regexp_eatOctalDigit(e)?e.lastIntValue=64*t+8*i+e.lastIntValue:e.lastIntValue=8*t+i}else e.lastIntValue=t;return!0}return!1},b.regexp_eatOctalDigit=e=>{var t=e.current();return hn(t)?(e.lastIntValue=t-48,e.advance(),!0):(e.lastIntValue=0,!1)},b.regexp_eatFixedHexDigits=(e,t)=>{var i=e.pos;e.lastIntValue=0;for(var r=0;rtypeof Symbol&&(C[Symbol.iterator]=function(){return{next:()=>{var e=this.getToken();return{done:e.type===u.eof,value:e}}}}),C.nextToken=function(){var e=this.curContext();return e&&e.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length?this.finishToken(u.eof):e.override?e.override(this):void this.readToken(this.fullCharCodeAtPos())},C.readToken=function(e){return ce(e,this.options.ecmaVersion>=6)||92===e?this.readWord():this.getTokenFromCode(e)},C.fullCharCodeAtPos=function(){var e=this.input.charCodeAt(this.pos);if(e<=55295||e>=56320)return e;var t=this.input.charCodeAt(this.pos+1);return t<=56319||t>=57344?e:(e<<10)+t-56613888},C.skipBlockComment=function(){var e=this.options.onComment&&this.curPosition(),t=this.pos,i=this.input.indexOf("*/",this.pos+=2);if(-1===i&&this.raise(this.pos-2,"Unterminated comment"),this.pos=i+2,this.options.locations)for(var r=void 0,n=t;(r=Nr(this.input,n,this.pos))>-1;)++this.curLine,n=this.lineStart=r;this.options.onComment&&this.options.onComment(!0,this.input.slice(t+2,i),t,this.pos,e,this.curPosition())},C.skipLineComment=function(e){for(var t=this.pos,i=this.options.onComment&&this.curPosition(),r=this.input.charCodeAt(this.pos+=e);this.pos8&&e<14||e>=5760&&Mr.test(String.fromCharCode(e))))break e;++this.pos}}},C.finishToken=function(e,t){this.end=this.pos,this.options.locations&&(this.endLoc=this.curPosition());var i=this.type;this.type=e,this.value=t,this.updateContext(i)},C.readToken_dot=function(){var e=this.input.charCodeAt(this.pos+1);if(e>=48&&e<=57)return this.readNumber(!0);var t=this.input.charCodeAt(this.pos+2);return this.options.ecmaVersion>=6&&46===e&&46===t?(this.pos+=3,this.finishToken(u.ellipsis)):(++this.pos,this.finishToken(u.dot))},C.readToken_slash=function(){var e=this.input.charCodeAt(this.pos+1);return this.exprAllowed?(++this.pos,this.readRegexp()):61===e?this.finishOp(u.assign,2):this.finishOp(u.slash,1)},C.readToken_mult_modulo_exp=function(e){var t=this.input.charCodeAt(this.pos+1),i=1,r=42===e?u.star:u.modulo;return this.options.ecmaVersion>=7&&42===e&&42===t&&(++i,r=u.starstar,t=this.input.charCodeAt(this.pos+2)),61===t?this.finishOp(u.assign,i+1):this.finishOp(r,i)},C.readToken_pipe_amp=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?this.options.ecmaVersion>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(124===e?u.logicalOR:u.logicalAND,2):61===t?this.finishOp(u.assign,2):this.finishOp(124===e?u.bitwiseOR:u.bitwiseAND,1)},C.readToken_caret=function(){return 61===this.input.charCodeAt(this.pos+1)?this.finishOp(u.assign,2):this.finishOp(u.bitwiseXOR,1)},C.readToken_plus_min=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?45!==t||this.inModule||62!==this.input.charCodeAt(this.pos+2)||0!==this.lastTokEnd&&!Y.test(this.input.slice(this.lastTokEnd,this.pos))?this.finishOp(u.incDec,2):(this.skipLineComment(3),this.skipSpace(),this.nextToken()):61===t?this.finishOp(u.assign,2):this.finishOp(u.plusMin,1)},C.readToken_lt_gt=function(e){var t=this.input.charCodeAt(this.pos+1),i=1;return t===e?(i=62===e&&62===this.input.charCodeAt(this.pos+2)?3:2,61===this.input.charCodeAt(this.pos+i)?this.finishOp(u.assign,i+1):this.finishOp(u.bitShift,i)):33!==t||60!==e||this.inModule||45!==this.input.charCodeAt(this.pos+2)||45!==this.input.charCodeAt(this.pos+3)?(61===t&&(i=2),this.finishOp(u.relational,i)):(this.skipLineComment(4),this.skipSpace(),this.nextToken())},C.readToken_eq_excl=function(e){var t=this.input.charCodeAt(this.pos+1);return 61===t?this.finishOp(u.equality,61===this.input.charCodeAt(this.pos+2)?3:2):61===e&&62===t&&this.options.ecmaVersion>=6?(this.pos+=2,this.finishToken(u.arrow)):this.finishOp(61===e?u.eq:u.prefix,1)},C.readToken_question=function(){var e=this.options.ecmaVersion;if(e>=11){var t=this.input.charCodeAt(this.pos+1);if(46===t){var i=this.input.charCodeAt(this.pos+2);if(i<48||i>57)return this.finishOp(u.questionDot,2)}if(63===t)return e>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(u.coalesce,2)}return this.finishOp(u.question,1)},C.readToken_numberSign=function(){var e=35;if(this.options.ecmaVersion>=13&&(++this.pos,ce(e=this.fullCharCodeAtPos(),!0)||92===e))return this.finishToken(u.privateId,this.readWord1());this.raise(this.pos,"Unexpected character '"+fe(e)+"'")},C.getTokenFromCode=function(e){switch(e){case 46:return this.readToken_dot();case 40:return++this.pos,this.finishToken(u.parenL);case 41:return++this.pos,this.finishToken(u.parenR);case 59:return++this.pos,this.finishToken(u.semi);case 44:return++this.pos,this.finishToken(u.comma);case 91:return++this.pos,this.finishToken(u.bracketL);case 93:return++this.pos,this.finishToken(u.bracketR);case 123:return++this.pos,this.finishToken(u.braceL);case 125:return++this.pos,this.finishToken(u.braceR);case 58:return++this.pos,this.finishToken(u.colon);case 96:if(this.options.ecmaVersion<6)break;return++this.pos,this.finishToken(u.backQuote);case 48:var t=this.input.charCodeAt(this.pos+1);if(120===t||88===t)return this.readRadixNumber(16);if(this.options.ecmaVersion>=6){if(111===t||79===t)return this.readRadixNumber(8);if(98===t||66===t)return this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(e);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo_exp(e);case 124:case 38:return this.readToken_pipe_amp(e);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(e);case 60:case 62:return this.readToken_lt_gt(e);case 61:case 33:return this.readToken_eq_excl(e);case 63:return this.readToken_question();case 126:return this.finishOp(u.prefix,1);case 35:return this.readToken_numberSign()}this.raise(this.pos,"Unexpected character '"+fe(e)+"'")},C.finishOp=function(e,t){var i=this.input.slice(this.pos,this.pos+t);return this.pos+=t,this.finishToken(e,i)},C.readRegexp=function(){for(var e,t,i=this.pos;;){this.pos>=this.input.length&&this.raise(i,"Unterminated regular expression");var r=this.input.charAt(this.pos);if(Y.test(r)&&this.raise(i,"Unterminated regular expression"),e)e=!1;else{if("["===r)t=!0;else if("]"===r&&t)t=!1;else if("/"===r&&!t)break;e="\\"===r}++this.pos}var n=this.input.slice(i,this.pos);++this.pos;var s=this.pos,a=this.readWord1();this.containsEsc&&this.unexpected(s);var o=this.regexpState||(this.regexpState=new re(this));o.reset(i,n,a),this.validateRegExpFlags(o),this.validateRegExpPattern(o);var c=null;try{c=RegExp(n,a)}catch{}return this.finishToken(u.regexp,{pattern:n,flags:a,value:c})},C.readInt=function(e,t,i){for(var r=this.options.ecmaVersion>=12&&void 0===t,n=i&&48===this.input.charCodeAt(this.pos),s=this.pos,a=0,o=0,c=0,l=t??1/0;c=97?h-97+10:h>=65?h-65+10:h>=48&&h<=57?h-48:1/0)>=e)break;o=h,a=a*e+p}}return r&&95===o&&this.raiseRecoverable(this.pos-1,"Numeric separator is not allowed at the last of digits"),this.pos===s||null!=t&&this.pos-s!==t?null:a},C.readRadixNumber=function(e){var t=this.pos;this.pos+=2;var i=this.readInt(e);return null==i&&this.raise(this.start+2,"Expected number in radix "+e),this.options.ecmaVersion>=11&&110===this.input.charCodeAt(this.pos)?(i=pn(this.input.slice(t,this.pos)),++this.pos):ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,i)},C.readNumber=function(e){var t=this.pos;e||null!==this.readInt(10,void 0,!0)||this.raise(t,"Invalid number");var i=this.pos-t>=2&&48===this.input.charCodeAt(t);i&&this.strict&&this.raise(t,"Invalid number");var r=this.input.charCodeAt(this.pos);if(!i&&!e&&this.options.ecmaVersion>=11&&110===r){var n=pn(this.input.slice(t,this.pos));return++this.pos,ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,n)}i&&/[89]/.test(this.input.slice(t,this.pos))&&(i=!1),46!==r||i||(++this.pos,this.readInt(10),r=this.input.charCodeAt(this.pos)),69!==r&&101!==r||i||((43===(r=this.input.charCodeAt(++this.pos))||45===r)&&++this.pos,null===this.readInt(10)&&this.raise(t,"Invalid number")),ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number");var s=os(this.input.slice(t,this.pos),i);return this.finishToken(u.num,s)},C.readCodePoint=function(){var e;if(123===this.input.charCodeAt(this.pos)){this.options.ecmaVersion<6&&this.unexpected();var t=++this.pos;e=this.readHexChar(this.input.indexOf("}",this.pos)-this.pos),++this.pos,e>1114111&&this.invalidStringToken(t,"Code point out of bounds")}else e=this.readHexChar(4);return e},C.readString=function(e){for(var t="",i=++this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated string constant");var r=this.input.charCodeAt(this.pos);if(r===e)break;92===r?(t+=this.input.slice(i,this.pos),t+=this.readEscapedChar(!1),i=this.pos):8232===r||8233===r?(this.options.ecmaVersion<10&&this.raise(this.start,"Unterminated string constant"),++this.pos,this.options.locations&&(this.curLine++,this.lineStart=this.pos)):(we(r)&&this.raise(this.start,"Unterminated string constant"),++this.pos)}return t+=this.input.slice(i,this.pos++),this.finishToken(u.string,t)};var fn={};C.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(e){if(e!==fn)throw e;this.readInvalidTemplateToken()}this.inTemplateElement=!1},C.invalidStringToken=function(e,t){if(this.inTemplateElement&&this.options.ecmaVersion>=9)throw fn;this.raise(e,t)},C.readTmplToken=function(){for(var e="",t=this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated template");var i=this.input.charCodeAt(this.pos);if(96===i||36===i&&123===this.input.charCodeAt(this.pos+1))return this.pos!==this.start||this.type!==u.template&&this.type!==u.invalidTemplate?(e+=this.input.slice(t,this.pos),this.finishToken(u.template,e)):36===i?(this.pos+=2,this.finishToken(u.dollarBraceL)):(++this.pos,this.finishToken(u.backQuote));if(92===i)e+=this.input.slice(t,this.pos),e+=this.readEscapedChar(!0),t=this.pos;else if(we(i)){switch(e+=this.input.slice(t,this.pos),++this.pos,i){case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:e+="\n";break;default:e+=String.fromCharCode(i)}this.options.locations&&(++this.curLine,this.lineStart=this.pos),t=this.pos}else++this.pos}},C.readInvalidTemplateToken=function(){for(;this.pos=48&&t<=55){var r=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],n=Number.parseInt(r,8);return n>255&&(n=Number.parseInt(r=r.slice(0,-1),8)),this.pos+=r.length-1,t=this.input.charCodeAt(this.pos),("0"!==r||56===t||57===t)&&(this.strict||e)&&this.invalidStringToken(this.pos-1-r.length,e?"Octal literal in template string":"Octal literal in strict mode"),String.fromCharCode(n)}return we(t)?"":String.fromCharCode(t)}},C.readHexChar=function(e){var t=this.pos,i=this.readInt(16,e);return null===i&&this.invalidStringToken(t,"Bad character escape sequence"),i},C.readWord1=function(){this.containsEsc=!1;for(var e="",t=!0,i=this.pos,r=this.options.ecmaVersion>=6;this.pos>16)+(t>>16)+(i>>16)<<16|65535&i}function fs(e,t){return e<>>32-t}function ut(e,t,i,r,n,s){return ye(fs(ye(ye(t,e),ye(r,s)),n),i)}function D(e,t,i,r,n,s,a){return ut(t&i|~t&r,e,t,n,s,a)}function O(e,t,i,r,n,s,a){return ut(t&r|i&~r,e,t,n,s,a)}function V(e,t,i,r,n,s,a){return ut(t^i^r,e,t,n,s,a)}function F(e,t,i,r,n,s,a){return ut(i^(t|~r),e,t,n,s,a)}function ot(e,t){e[t>>5]|=128<>>9<<4)]=t;let i=1732584193,r=-271733879,n=-1732584194,s=271733878;for(let t=0;t>5]>>>r%32&255);return t}function ri(e){let t=[],i=e.length>>2;for(let e=0;e>5]|=(255&e.charCodeAt(i/8))<16&&(i=ot(i,8*e.length));for(let e=0;e<16;e+=1)r[e]=909522486^i[e],n[e]=1549556828^i[e];let s=ot(r.concat(ri(t)),512+8*t.length);return yn(ot(n.concat(s),640))}function gn(e){let t="0123456789abcdef",i="";for(let r=0;r>>4&15)+t.charAt(15&n)}return i}function ni(e){return unescape(encodeURIComponent(e))}function xn(e){return ds(ni(e))}function ys(e){return gn(xn(e))}function _n(e,t){return ms(ni(e),ni(t))}function gs(e,t){return gn(_n(e,t))}function xs(e,t,i){return t?i?_n(t,e):gs(t,e):i?xn(e):ys(e)}var ei=3072;function _s(e){let t=new Headers(e);if(e.has("x-bare-headers")){let i=e.get("x-bare-headers");if(i.length>ei){t.delete("x-bare-headers");let e=0;for(let r=0;r{s.removeEventListener("close",o),s.removeEventListener("message",c)},o=()=>{a()},c=e=>{if(a(),"string"!=typeof e.data)throw TypeError("the first websocket message was not a text frame");let t=JSON.parse(e.data);if("open"!==t.type)throw TypeError("message was not of open type");e.stopImmediatePropagation(),r({protocol:t.protocol,setCookies:t.setCookies}),n(ge.OPEN),s.dispatchEvent(new Event("open"))};return s.addEventListener("close",o),s.addEventListener("message",c),s.addEventListener("open",r=>{r.stopImmediatePropagation(),n(ge.CONNECTING),i().then(i=>ge.prototype.send.call(s,JSON.stringify({type:"connect",remote:e.toString(),protocols:t,headers:i,forwardHeaders:[]})))},{once:!0}),s}async request(e,t,i,r,n,s,a){if(r.protocol.startsWith("blob:")){let e=await ti(r),t=new mn(e.body,e);return t.rawHeaders=Object.fromEntries(e.headers),t.rawResponse=e,t}let o={};if(t instanceof Headers)for(let[e,i]of t)o[e]=i;else for(let e in t)o[e]=t[e];let c={credentials:"omit",method:e,signal:a};"only-if-cached"!==n&&(c.cache=n),void 0!==i&&(c.body=i),void 0!==s&&(c.duplex=s),c.headers=this.createBareHeaders(r,o);let l=await ti(this.http+"?cache="+xs(r.toString()),c),p=await this.readBareResponse(l),h=new mn(hs.includes(p.status)?void 0:l.body,{status:p.status,statusText:p.statusText??void 0,headers:new Headers(p.headers)});return h.rawHeaders=p.headers,h.rawResponse=l,h}async readBareResponse(e){if(!e.ok)throw new ct(e.status,await e.json());let t=bs(e.headers),i={},r=t.get("x-bare-status");null!==r&&(i.status=Number.parseInt(r));let n=t.get("x-bare-status-text");null!==n&&(i.statusText=n);let s=t.get("x-bare-headers");return null!==s&&(i.headers=JSON.parse(s)),i}createBareHeaders(e,t,i=[],r=[],n=[]){let s=new Headers;for(let r of(s.set("x-bare-url",e.toString()),s.set("x-bare-headers",JSON.stringify(t)),i))s.append("x-bare-forward-headers",r);for(let e of r)s.append("x-bare-pass-headers",e);for(let e of n)s.append("x-bare-pass-status",e.toString());return _s(s),s}},ws="!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~";function vs(e){for(let t=0;tthis.loadManifest(e)).catch(e=>{throw delete this.working,e})),this.working):this.client}getClient(){for(let[e,t]of Ss)if(this.manifest.versions.includes(e))return new t(this.server);throw Error("Unable to find compatible client version. Starting from v2.0.0, @tomphttp/bare-client only supports Bare servers v3+. For more information, see https://github.com/tomphttp/bare-client/")}createWebSocket(e,t=[],i){if(!this.client)throw TypeError("You need to wait for the client to finish fetching the manifest before creating any WebSockets. Try caching the manifest data before making this request.");try{e=new URL(e)}catch{throw new DOMException(`Faiiled to construct 'WebSocket': The URL '${e}' is invalid.`)}if(!Cs.includes(e.protocol))throw new DOMException(`Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${e.protocol}' is not allowed.`);for(let e of(Array.isArray(t)||(t=[t]),t=t.map(String)))if(!vs(e))throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${e}' is invalid.`);let r=this.client.connect(e,t,async()=>{let t="function"==typeof i.headers?await i.headers():i.headers||{},r=t instanceof Headers?Object.fromEntries(t):t;return r.Host=e.host,r.Pragma="no-cache",r["Cache-Control"]="no-cache",r.Upgrade="websocket",r.Connection="Upgrade",r},e=>{n=e.protocol,i.setCookiesCallback&&i.setCookiesCallback(e.setCookies)},e=>{s=e},i.webSocketImpl||me),n="",s=ge.CONNECTING,a=()=>{let e=Es.call(r);return e===ge.OPEN?s:e};i.readyStateHook?i.readyStateHook(r,a):Object.defineProperty(r,"readyState",{get:a,configurable:!0,enumerable:!0});let o=()=>{if(a()===ge.CONNECTING)return new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.")};i.sendErrorHook?i.sendErrorHook(r,o):r.send=function(...e){let t=o();if(t)throw t;ge.prototype.send.call(this,...e)},i.urlHook?i.urlHook(r,e):Object.defineProperty(r,"url",{get:()=>e.toString(),configurable:!0,enumerable:!0});let c=()=>n;return i.protocolHook?i.protocolHook(r,c):Object.defineProperty(r,"protocol",{get:c,configurable:!0,enumerable:!0}),r}async fetch(e,t){let i=ks(e)?new us(e,t):e,r=t?.headers||i.headers,n=r instanceof Headers?Object.fromEntries(r):r,s=t?.duplex,a=t?.body||i.body,o=new URL(i.url),c=await this.demand();for(let e=0;;e++){"host"in n?n.host=o.host:n.Host=o.host;let r=await c.request(i.method,n,a,o,i.cache,s,i.signal);r.finalURL=o.toString();let l=t?.redirect||i.redirect;if(!ps.includes(r.status))return r;switch(l){case"follow":{let t=r.headers.get("location");if(ls>e&&null!==t){o=new URL(t,o);continue}throw TypeError("Failed to fetch")}case"error":throw TypeError("Failed to fetch");case"manual":return r}}}};function ks(e){return"string"==typeof e||e instanceof URL}async function wn(e,t){let i=await bn(e,t);return new De(e,i)}var Hs=Qe(vn(),1),Nn=Qe(En(),1),{stringify:Os}=JSON;if(!String.prototype.repeat)throw Error("String.prototype.repeat is undefined, see https://github.com/davidbonnet/astring#installation");if(!String.prototype.endsWith)throw Error("String.prototype.endsWith is undefined, see https://github.com/davidbonnet/astring#installation");var ht={"||":2,"??":3,"&&":4,"|":5,"^":6,"&":7,"==":8,"!=":8,"===":8,"!==":8,"<":9,">":9,"<=":9,">=":9,in:9,instanceof:9,"<<":10,">>":10,">>>":10,"+":11,"-":11,"*":12,"%":12,"/":12,"**":13},ee=17,Vs={ArrayExpression:20,TaggedTemplateExpression:20,ThisExpression:20,Identifier:20,PrivateIdentifier:20,Literal:18,TemplateLiteral:20,Super:20,SequenceExpression:20,MemberExpression:19,ChainExpression:19,CallExpression:19,NewExpression:19,ArrowFunctionExpression:ee,ClassExpression:ee,FunctionExpression:ee,ObjectExpression:ee,UpdateExpression:16,UnaryExpression:15,AwaitExpression:15,BinaryExpression:14,LogicalExpression:13,ConditionalExpression:4,AssignmentExpression:3,YieldExpression:2,RestElement:1};function Ce(e,t){let{generator:i}=e;if(e.write("("),null!=t&&t.length>0){i[t[0].type](t[0],e);let{length:r}=t;for(let n=1;n0){e.write(r);for(let t=1;t0){i.VariableDeclarator(r[0],e);for(let t=1;t0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let{length:o}=a;for(let e=0;e0){for(;n0&&t.write(", ");let e=i[n],r=e.type[6];if("D"===r)t.write(e.local.name,e),n++;else{if("N"!==r)break;t.write("* as "+e.local.name,e),n++}}if(n0)for(let e=0;;){let n=i[e],{name:s}=n.local;if(t.write(s,n),s!==n.exported.name&&t.write(" as "+n.exported.name),!(++e "),"O"===e.body.type[0]?(t.write("("),this.ObjectExpression(e.body,t),t.write(")")):this[e.body.type](e.body,t)},ThisExpression(e,t){t.write("this",e)},Super(e,t){t.write("super",e)},RestElement:An=function(e,t){t.write("..."),this[e.argument.type](e.argument,t)},SpreadElement:An,YieldExpression(e,t){t.write(e.delegate?"yield*":"yield"),e.argument&&(t.write(" "),this[e.argument.type](e.argument,t))},AwaitExpression(e,t){t.write("await ",e),pt(t,e.argument,e)},TemplateLiteral(e,t){let{quasis:i,expressions:r}=e;t.write("`");let{length:n}=r;for(let e=0;e0){let{elements:i}=e,{length:r}=i;for(let e=0;;){let n=i[e];if(null!=n&&this[n.type](n,t),!(++e0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let a=","+r,{properties:o}=e,{length:c}=o;for(let e=0;;){let i=o[e];if(n&&null!=i.comments&&j(t,i.comments,s,r),t.write(s),this[i.type](i,t),!(++e0){let{properties:i}=e,{length:r}=i;for(let e=0;this[i[e].type](i[e],t),++e1||"U"===n[0]&&("n"===n[1]||"p"===n[1])&&r.prefix&&r.operator[0]===i&&("+"===i||"-"===i))&&t.write(" "),s?(t.write(i.length>1?" (":"("),this[n](r,t),t.write(")")):this[n](r,t)}else this[e.argument.type](e.argument,t),t.write(e.operator)},UpdateExpression(e,t){e.prefix?(t.write(e.operator),this[e.argument.type](e.argument,t)):(this[e.argument.type](e.argument,t),t.write(e.operator))},AssignmentExpression(e,t){this[e.left.type](e.left,t),t.write(" "+e.operator+" "),this[e.right.type](e.right,t)},AssignmentPattern(e,t){this[e.left.type](e.left,t),t.write(" = "),this[e.right.type](e.right,t)},BinaryExpression:Ln=(e,t)=>{let i="in"===e.operator;i&&t.write("("),pt(t,e.left,e,!1),t.write(" "+e.operator+" "),pt(t,e.right,e,!0),i&&t.write(")")},LogicalExpression:Ln,ConditionalExpression(e,t){let{test:i}=e,r=t.expressionsPrecedence[i.type];r===ee||r<=t.expressionsPrecedence.ConditionalExpression?(t.write("("),this[i.type](i,t),t.write(")")):this[i.type](i,t),t.write(" ? "),this[e.consequent.type](e.consequent,t),t.write(" : "),this[e.alternate.type](e.alternate,t)},NewExpression(e,t){t.write("new ");let i=t.expressionsPrecedence[e.callee.type];i===ee||i0&&(this.lineEndSize>0&&(1===r.length?e[i-1]===r:e.endsWith(r))?(this.line+=this.lineEndSize,this.column=0):this.column+=i)}toString(){return this.output}};function Tn(e,t){let i=new li(t);return i.generator[e.type](e,i),i.output}var hi,Mn=class{constructor(e){this.mime=br,this.idb=Je,this.path=Us,this.acorn={parse:dn},this.bare={createBareClient:wn,BareClient:De},this.base64={encode:btoa,decode:atob},this.estree={generate:Tn},this.cookie=Hs,this.setCookieParser=Nn.parse,this.ctx=e}};function pi(e,t,i,r,n="",s=!1,a=""){if(self.__dynamic$config)var o="development"==self.__dynamic$config.mode;else o=!1;if(s){var c=[{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:e+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]},{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:t+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]}];return this.ctx.config.assets.files.inject&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:this.ctx.config.assets.files.inject+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]}),r&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(`self.__dynamic$cookies = atob("${btoa(r)}");document.currentScript?.remove();`)}]}),n&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(n+";document.currentScript?.remove();")}]}),a&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(a+";document.currentScript?.remove();")}]}),c}var l=[` - - + + \ No newline at end of file diff --git a/static/apps.html b/static/apps.html index b5aa483f40..052ad3baf4 100644 --- a/static/apps.html +++ b/static/apps.html @@ -43,10 +43,10 @@
- + - + - + - + - - + + diff --git a/static/sw.js b/static/sw.js index 4bebaf06ad..a65ad680b5 100644 --- a/static/sw.js +++ b/static/sw.js @@ -1,8 +1,8 @@ -importScripts("/assets/dynamic/config.js"); -importScripts("/assets/dynamic/worker.js"); -importScripts("/assets/ultraviolet/bundle.js"); -importScripts("/assets/ultraviolet/config.js"); -importScripts(__uv$config.sw || "/assets/ultraviolet/sw.js"); +importScripts("/assets/dynamic/dynamic.config.js"); +importScripts("/assets/dynamic/dynamic.worker.js"); +importScripts("/assets/ultraviolet/ultraviolet.bundle.js"); +importScripts("/assets/ultraviolet/ultraviolet.config.js"); +importScripts(__uv$config.sw || "/assets/ultraviolet/ultraviolet.sw.js"); importScripts("/assets/scramjet/scramjet.all.js"); const { ScramjetServiceWorker } = $scramjetLoadWorker(); diff --git a/static/tabs.html b/static/tabs.html index 0ec96ab354..01a0717359 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -62,8 +62,8 @@
- - + + From 74ac7434ecc982d4ba4d3b3867955b44f2b0778f Mon Sep 17 00:00:00 2001 From: xbubbo Date: Tue, 5 May 2026 10:03:36 -0400 Subject: [PATCH 057/115] feat(particles): replaced particles.js with new system and added particles to all pages --- biome.json | 2 +- static/assets/css/global.css | 67 +++++++++++++++++++ static/assets/css/home.css | 24 ------- static/assets/js/home.js | 106 ------------------------------ static/assets/js/main.js | 11 ++++ static/assets/js/particles.min.js | 9 --- 6 files changed, 79 insertions(+), 140 deletions(-) delete mode 100644 static/assets/js/particles.min.js diff --git a/biome.json b/biome.json index 2b14ca80de..cf13ac810d 100644 --- a/biome.json +++ b/biome.json @@ -1,7 +1,7 @@ { "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", "files": { - "includes": ["**", "!**/static/assets/dynamic", "!**/static/assets/ultraviolet", "!**/static/assets/scramjet", "!**/static/assets/json/**/*.min.json", "!**/static/assets/js/particles.min.js", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb"] + "includes": ["**", "!**/static/assets/dynamic", "!**/static/assets/ultraviolet", "!**/static/assets/scramjet", "!**/static/assets/json/**/*.min.json", "!**/static/assets/css/global.css", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb"] }, "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { diff --git a/static/assets/css/global.css b/static/assets/css/global.css index 262ad6f996..1fa334ac80 100644 --- a/static/assets/css/global.css +++ b/static/assets/css/global.css @@ -76,3 +76,70 @@ body { position: absolute; z-index: 99; } + +/* CSS Parallax Pixel Stars - based on codepen.io/sarazond/pen/LYGbwj */ +#stars, +#stars2, +#stars3 { + position: fixed; + top: 0; + left: 0; + pointer-events: none; + z-index: 0; +} + +#stars { + width: 1px; + height: 1px; + background: transparent; + box-shadow: 1169px 714px #FFF , 1944px 1891px #FFF , 53px 55px #FFF , 79px 767px #FFF , 1398px 1442px #FFF , 386px 1194px #FFF , 1582px 1154px #FFF , 234px 69px #FFF , 915px 727px #FFF , 178px 525px #FFF , 542px 1601px #FFF , 1312px 46px #FFF , 1076px 1166px #FFF , 1274px 857px #FFF , 1206px 505px #FFF , 1572px 1148px #FFF , 1397px 347px #FFF , 547px 1699px #FFF , 395px 756px #FFF , 1552px 629px #FFF , 1335px 955px #FFF , 402px 1567px #FFF , 791px 873px #FFF , 1661px 581px #FFF , 779px 1357px #FFF , 809px 1015px #FFF , 525px 492px #FFF , 1575px 1728px #FFF , 1432px 614px #FFF , 1015px 242px #FFF , 1664px 1851px #FFF , 1757px 1043px #FFF , 1676px 1630px #FFF , 926px 446px #FFF , 1154px 1010px #FFF , 110px 1764px #FFF , 1613px 770px #FFF , 1895px 1263px #FFF , 941px 1083px #FFF , 641px 1870px #FFF , 1060px 932px #FFF , 393px 1814px #FFF , 1512px 1999px #FFF , 1429px 633px #FFF , 1175px 1728px #FFF , 134px 118px #FFF , 363px 1127px #FFF , 119px 1881px #FFF , 1218px 1085px #FFF , 1493px 132px #FFF , 1959px 1153px #FFF , 1260px 1633px #FFF , 1797px 1059px #FFF , 443px 110px #FFF , 1813px 102px #FFF , 1654px 1332px #FFF , 799px 586px #FFF , 1324px 1459px #FFF , 77px 148px #FFF , 909px 220px #FFF , 1380px 1727px #FFF , 1366px 709px #FFF , 525px 679px #FFF , 723px 759px #FFF , 1638px 641px #FFF , 1000px 1978px #FFF , 912px 960px #FFF , 869px 463px #FFF , 1117px 690px #FFF , 1965px 690px #FFF , 1254px 1358px #FFF , 1757px 635px #FFF , 1094px 1506px #FFF , 1824px 1508px #FFF , 200px 524px #FFF , 116px 1155px #FFF , 1401px 1606px #FFF , 912px 983px #FFF , 1119px 1885px #FFF , 864px 1759px #FFF , 933px 848px #FFF , 187px 1799px #FFF , 1470px 1873px #FFF , 1483px 1127px #FFF , 1170px 1763px #FFF , 1634px 1365px #FFF , 1171px 372px #FFF , 403px 310px #FFF , 436px 1819px #FFF , 1313px 814px #FFF , 289px 1101px #FFF , 1609px 249px #FFF , 1603px 202px #FFF , 95px 1088px #FFF , 572px 6px #FFF , 864px 1899px #FFF , 1555px 1719px #FFF , 1254px 1552px #FFF , 972px 1631px #FFF , 551px 873px #FFF , 1713px 1308px #FFF , 325px 1752px #FFF , 1174px 247px #FFF , 1935px 17px #FFF , 1886px 1657px #FFF , 656px 1166px #FFF , 1449px 1564px #FFF , 363px 531px #FFF , 892px 636px #FFF , 917px 1171px #FFF , 1940px 1605px #FFF , 1646px 1079px #FFF , 910px 1819px #FFF , 1677px 93px #FFF , 1116px 1696px #FFF , 320px 1293px #FFF , 1255px 699px #FFF , 1943px 1753px #FFF , 403px 1834px #FFF , 138px 1153px #FFF , 1551px 209px #FFF , 1419px 978px #FFF , 1183px 1102px #FFF , 561px 266px #FFF , 183px 1059px #FFF , 1196px 458px #FFF , 904px 1853px #FFF , 1360px 744px #FFF , 1862px 217px #FFF , 1500px 1604px #FFF , 1872px 528px #FFF , 1660px 1555px #FFF , 1417px 1206px #FFF , 1383px 26px #FFF , 1053px 549px #FFF , 1782px 1384px #FFF , 468px 424px #FFF , 1170px 1311px #FFF , 1404px 1508px #FFF , 969px 899px #FFF , 1652px 560px #FFF , 234px 417px #FFF , 866px 1106px #FFF , 496px 1108px #FFF , 1024px 1408px #FFF , 620px 1295px #FFF , 858px 1068px #FFF , 585px 122px #FFF , 928px 1420px #FFF , 489px 66px #FFF , 310px 708px #FFF , 1623px 1148px #FFF , 399px 289px #FFF , 907px 312px #FFF , 65px 95px #FFF , 988px 1424px #FFF , 1266px 1056px #FFF , 337px 1758px #FFF , 1784px 1224px #FFF , 666px 3px #FFF , 1197px 1969px #FFF , 1355px 1474px #FFF , 1191px 1517px #FFF , 1159px 1970px #FFF , 1945px 1305px #FFF , 81px 1551px #FFF , 201px 447px #FFF , 1015px 1644px #FFF , 1225px 1609px #FFF , 650px 386px #FFF , 523px 1808px #FFF , 1014px 651px #FFF , 867px 1517px #FFF , 93px 1519px #FFF , 851px 1571px #FFF , 1983px 1719px #FFF , 1310px 378px #FFF , 1111px 1468px #FFF , 1741px 117px #FFF , 327px 863px #FFF , 428px 649px #FFF , 649px 640px #FFF , 786px 174px #FFF , 537px 9px #FFF , 1986px 24px #FFF , 1667px 1886px #FFF , 181px 1391px #FFF , 437px 765px #FFF , 1863px 1994px #FFF , 1433px 516px #FFF , 512px 431px #FFF , 177px 211px #FFF , 1551px 1550px #FFF , 891px 919px #FFF , 1120px 1986px #FFF , 1367px 862px #FFF , 1603px 831px #FFF , 279px 95px #FFF , 240px 1981px #FFF , 149px 1607px #FFF , 1829px 1247px #FFF , 1503px 1018px #FFF , 1674px 853px #FFF , 288px 62px #FFF , 19px 1867px #FFF , 305px 625px #FFF , 1751px 1209px #FFF , 179px 805px #FFF , 995px 1266px #FFF , 532px 1253px #FFF , 1773px 1003px #FFF , 1703px 913px #FFF , 258px 1839px #FFF , 880px 1716px #FFF , 1873px 465px #FFF , 1675px 1555px #FFF , 1485px 1881px #FFF , 348px 365px #FFF , 1578px 1684px #FFF , 618px 1468px #FFF , 930px 340px #FFF , 318px 1229px #FFF , 458px 744px #FFF , 1879px 382px #FFF , 1436px 728px #FFF , 287px 1629px #FFF , 826px 1840px #FFF , 683px 230px #FFF , 597px 44px #FFF , 1278px 422px #FFF , 1390px 1859px #FFF , 253px 1784px #FFF , 1081px 1704px #FFF , 951px 932px #FFF , 652px 561px #FFF , 1793px 1242px #FFF , 1751px 1213px #FFF , 1444px 35px #FFF , 1716px 1753px #FFF , 397px 77px #FFF , 152px 502px #FFF , 657px 1719px #FFF , 1471px 1128px #FFF , 1575px 423px #FFF , 1599px 1568px #FFF , 1003px 1810px #FFF , 688px 1755px #FFF , 54px 1373px #FFF , 877px 967px #FFF , 909px 263px #FFF , 1010px 326px #FFF , 944px 708px #FFF , 1215px 123px #FFF , 1045px 1449px #FFF , 1666px 327px #FFF , 885px 1667px #FFF , 209px 968px #FFF , 1857px 1944px #FFF , 844px 1198px #FFF , 1965px 753px #FFF , 621px 1657px #FFF , 877px 1548px #FFF , 1927px 845px #FFF , 118px 907px #FFF , 265px 172px #FFF , 1817px 1542px #FFF , 1192px 829px #FFF , 1081px 1188px #FFF , 1762px 396px #FFF , 1059px 198px #FFF , 808px 494px #FFF , 822px 265px #FFF , 283px 1584px #FFF , 1999px 515px #FFF , 50px 1425px #FFF , 450px 981px #FFF , 750px 82px #FFF , 271px 1252px #FFF , 763px 565px #FFF , 1498px 769px #FFF , 1433px 1003px #FFF , 1965px 1072px #FFF , 1080px 158px #FFF , 256px 663px #FFF , 514px 1633px #FFF , 1476px 1925px #FFF , 612px 1400px #FFF , 1073px 45px #FFF , 636px 325px #FFF , 1526px 1652px #FFF , 58px 1727px #FFF , 1398px 1342px #FFF , 343px 1742px #FFF , 942px 1055px #FFF , 1098px 1225px #FFF , 1692px 445px #FFF , 68px 845px #FFF , 857px 785px #FFF , 304px 772px #FFF , 1190px 411px #FFF , 147px 1953px #FFF , 409px 1639px #FFF , 265px 1018px #FFF , 1910px 737px #FFF , 153px 1274px #FFF , 1615px 480px #FFF , 184px 457px #FFF , 598px 949px #FFF , 1260px 1343px #FFF , 366px 985px #FFF , 1202px 1630px #FFF , 12px 1075px #FFF , 332px 900px #FFF , 1747px 1961px #FFF , 1px 1562px #FFF , 550px 489px #FFF , 266px 738px #FFF , 1892px 89px #FFF , 1795px 1817px #FFF , 935px 1093px #FFF , 144px 1342px #FFF , 1938px 1583px #FFF , 1815px 1354px #FFF , 1805px 1257px #FFF , 356px 1627px #FFF , 200px 505px #FFF , 1444px 302px #FFF , 1791px 649px #FFF , 923px 1871px #FFF , 269px 53px #FFF , 1499px 970px #FFF , 339px 843px #FFF , 1334px 160px #FFF , 1772px 1158px #FFF , 1232px 1676px #FFF , 830px 437px #FFF , 800px 957px #FFF , 353px 637px #FFF , 607px 125px #FFF , 1422px 1703px #FFF , 298px 596px #FFF , 179px 1407px #FFF , 1205px 49px #FFF , 1356px 512px #FFF , 719px 27px #FFF , 289px 731px #FFF , 743px 709px #FFF , 1275px 1177px #FFF , 215px 1220px #FFF , 1317px 180px #FFF , 1497px 1009px #FFF , 1437px 1650px #FFF , 129px 1563px #FFF , 1119px 731px #FFF , 915px 771px #FFF , 1874px 1913px #FFF , 1149px 1293px #FFF , 805px 1992px #FFF , 535px 56px #FFF , 312px 209px #FFF , 1981px 1466px #FFF , 1539px 367px #FFF , 1364px 539px #FFF , 371px 1493px #FFF , 1510px 1299px #FFF , 1631px 1562px #FFF , 1323px 1228px #FFF , 120px 204px #FFF , 233px 1874px #FFF , 1214px 1372px #FFF , 326px 305px #FFF , 1798px 699px #FFF , 479px 368px #FFF , 1014px 413px #FFF , 1815px 1473px #FFF , 1165px 514px #FFF , 63px 826px #FFF , 616px 1347px #FFF , 1481px 109px #FFF , 1922px 285px #FFF , 1228px 1637px #FFF , 1621px 541px #FFF , 1832px 1677px #FFF , 1446px 1575px #FFF , 982px 48px #FFF , 1490px 1641px #FFF , 921px 1381px #FFF , 1227px 760px #FFF , 155px 645px #FFF , 1896px 756px #FFF , 1035px 414px #FFF , 1391px 493px #FFF , 488px 547px #FFF , 1719px 1148px #FFF , 1609px 988px #FFF , 200px 310px #FFF , 12px 1847px #FFF , 1388px 377px #FFF , 1626px 1523px #FFF , 555px 931px #FFF , 95px 406px #FFF , 731px 473px #FFF , 651px 658px #FFF , 29px 1068px #FFF , 1685px 293px #FFF , 524px 828px #FFF , 1761px 1204px #FFF , 1113px 44px #FFF , 591px 922px #FFF , 1380px 1190px #FFF , 1168px 753px #FFF , 955px 1621px #FFF , 568px 1087px #FFF , 1664px 326px #FFF , 1557px 4px #FFF , 747px 1029px #FFF , 102px 1836px #FFF , 999px 644px #FFF , 280px 270px #FFF , 1861px 788px #FFF , 1497px 1344px #FFF , 1169px 1350px #FFF , 783px 1523px #FFF , 970px 1619px #FFF , 978px 1574px #FFF , 1214px 1655px #FFF , 740px 1843px #FFF , 330px 1644px #FFF , 103px 1796px #FFF , 755px 1702px #FFF , 615px 1534px #FFF , 774px 1910px #FFF , 1846px 1637px #FFF , 1148px 1998px #FFF , 1168px 434px #FFF , 966px 110px #FFF , 290px 490px #FFF , 1887px 682px #FFF , 564px 72px #FFF , 712px 693px #FFF , 1445px 377px #FFF , 967px 1700px #FFF , 97px 1847px #FFF , 297px 1662px #FFF , 920px 1859px #FFF , 1653px 1434px #FFF , 1085px 1631px #FFF , 650px 1984px #FFF , 295px 94px #FFF , 1567px 954px #FFF , 771px 1394px #FFF , 574px 743px #FFF , 1372px 836px #FFF , 323px 1194px #FFF , 1220px 772px #FFF , 1241px 1023px #FFF , 870px 200px #FFF , 1659px 1421px #FFF , 1727px 1370px #FFF , 287px 747px #FFF , 43px 389px #FFF , 122px 1723px #FFF , 70px 379px #FFF , 998px 561px #FFF , 1241px 1281px #FFF , 533px 628px #FFF , 1824px 829px #FFF , 696px 383px #FFF , 1315px 878px #FFF , 66px 1890px #FFF , 1760px 602px #FFF , 808px 1695px #FFF , 172px 1255px #FFF , 110px 118px #FFF , 396px 1418px #FFF , 522px 1290px #FFF , 410px 1972px #FFF , 922px 1356px #FFF , 868px 1512px #FFF , 756px 186px #FFF , 1099px 148px #FFF , 1320px 1185px #FFF , 1472px 9px #FFF , 674px 725px #FFF , 777px 18px #FFF , 1723px 1466px #FFF , 838px 774px #FFF , 147px 443px #FFF , 1609px 1914px #FFF , 302px 385px #FFF , 164px 150px #FFF , 1954px 1688px #FFF , 1590px 1879px #FFF , 738px 1228px #FFF , 362px 400px #FFF , 500px 1705px #FFF , 1909px 641px #FFF , 1784px 664px #FFF , 748px 1516px #FFF , 1298px 1326px #FFF , 139px 135px #FFF , 1870px 1674px #FFF , 1102px 293px #FFF , 1762px 883px #FFF , 153px 1806px #FFF , 184px 1037px #FFF , 472px 1810px #FFF , 411px 777px #FFF , 332px 1124px #FFF , 385px 1575px #FFF , 608px 1917px #FFF , 1698px 447px #FFF , 899px 641px #FFF , 206px 1934px #FFF , 1655px 1751px #FFF , 1862px 291px #FFF , 1971px 504px #FFF , 972px 1006px #FFF , 492px 1341px #FFF , 1784px 94px #FFF , 1247px 1632px #FFF , 1494px 1737px #FFF , 1375px 1927px #FFF , 1289px 100px #FFF , 1581px 763px #FFF , 1509px 392px #FFF , 1332px 1089px #FFF , 11px 335px #FFF , 1652px 1041px #FFF , 377px 1949px #FFF , 1346px 1359px #FFF , 1593px 887px #FFF , 1386px 1924px #FFF , 1295px 215px #FFF , 1916px 71px #FFF , 1392px 162px #FFF , 18px 1846px #FFF , 645px 783px #FFF , 1580px 260px #FFF , 1340px 1591px #FFF , 678px 1504px #FFF , 971px 1590px #FFF , 96px 1268px #FFF , 1924px 902px #FFF , 1710px 255px #FFF , 1149px 131px #FFF , 280px 729px #FFF , 1578px 1997px #FFF , 1089px 216px #FFF , 930px 168px #FFF , 1671px 644px #FFF , 744px 1017px #FFF , 920px 399px #FFF , 886px 1308px #FFF , 1069px 1537px #FFF , 506px 365px #FFF , 1452px 469px #FFF , 1403px 1315px #FFF , 182px 372px #FFF , 502px 440px #FFF , 485px 1858px #FFF , 699px 1210px #FFF , 1349px 754px #FFF , 948px 1438px #FFF , 706px 357px #FFF , 1576px 1129px #FFF , 1634px 1691px #FFF , 497px 1028px #FFF , 455px 702px #FFF , 853px 39px #FFF , 1255px 792px #FFF , 1955px 833px #FFF , 1483px 1844px #FFF , 878px 345px #FFF , 811px 1926px #FFF , 1661px 395px #FFF , 1588px 1274px #FFF , 59px 1653px #FFF , 852px 1272px #FFF , 1881px 85px #FFF , 239px 1424px #FFF , 1188px 1522px #FFF , 1425px 1951px #FFF , 1719px 918px #FFF , 1374px 703px #FFF , 28px 1389px #FFF , 888px 1796px #FFF , 992px 1171px #FFF , 682px 1236px #FFF , 1768px 1460px #FFF , 585px 368px #FFF , 700px 1154px #FFF , 413px 1373px #FFF , 926px 1029px #FFF , 1816px 193px #FFF , 341px 674px #FFF , 1417px 1659px #FFF , 898px 1842px #FFF , 599px 179px #FFF , 131px 59px #FFF , 1421px 1234px #FFF , 1801px 1116px #FFF , 611px 1907px #FFF , 1897px 1066px #FFF , 892px 98px #FFF , 528px 1918px #FFF , 1624px 699px #FFF , 1521px 1608px #FFF , 1109px 1713px #FFF , 798px 745px #FFF , 1131px 783px #FFF , 422px 1585px #FFF , 488px 1758px #FFF , 1359px 570px #FFF , 111px 287px #FFF , 1361px 1453px #FFF , 1271px 1820px #FFF , 1009px 110px #FFF , 1373px 1969px #FFF , 294px 1417px #FFF , 177px 1909px #FFF , 1528px 116px #FFF , 223px 522px #FFF , 1809px 436px #FFF , 233px 1325px #FFF , 939px 1692px #FFF , 1150px 1366px #FFF , 26px 1232px #FFF , 1569px 91px #FFF , 1674px 1667px #FFF , 1080px 1059px #FFF , 89px 1618px #FFF , 180px 328px #FFF , 1826px 487px #FFF , 1402px 807px #FFF , 1600px 1971px #FFF , 635px 1112px #FFF , 765px 399px #FFF , 1565px 975px #FFF , 1330px 681px #FFF , 1041px 1913px #FFF , 554px 1620px #FFF , 753px 758px #FFF , 910px 546px #FFF , 217px 420px #FFF , 1293px 978px #FFF , 1028px 550px #FFF , 524px 1018px #FFF , 1184px 1281px #FFF , 457px 1339px #FFF , 11px 1804px #FFF , 856px 1042px #FFF , 343px 839px #FFF , 192px 374px #FFF , 765px 903px #FFF , 1524px 692px #FFF , 411px 518px #FFF , 390px 1918px #FFF , 617px 1125px #FFF , 746px 1820px #FFF , 1922px 821px #FFF , 1025px 916px #FFF , 1213px 512px #FFF , 1755px 1918px #FFF , 686px 453px #FFF , 828px 1021px #FFF , 1494px 1739px #FFF , 1339px 777px #FFF , 850px 1778px #FFF , 1916px 84px #FFF , 41px 278px #FFF , 26px 1351px #FFF , 713px 727px #FFF , 371px 461px #FFF , 1683px 1532px #FFF , 1483px 1872px #FFF , 726px 1931px #FFF , 1572px 988px #FFF , 1737px 1520px #FFF , 1067px 1317px #FFF , 1017px 1210px #FFF , 1017px 1726px #FFF , 391px 1775px #FFF , 1861px 964px #FFF , 761px 1452px #FFF , 1041px 171px #FFF , 807px 1774px #FFF , 838px 1656px #FFF , 1622px 539px #FFF , 1758px 602px #FFF , 1850px 1179px #FFF , 944px 50px #FFF , 1629px 513px #FFF , 1512px 1794px #FFF , 1687px 1122px #FFF , 1610px 887px #FFF , 1339px 1352px #FFF , 421px 1150px #FFF , 1167px 143px #FFF , 1455px 850px #FFF; + animation: animStar 50s linear infinite; +} +#stars::after { + content: " "; + position: absolute; + top: 2000px; + width: 1px; + height: 1px; + background: transparent; + box-shadow: inherit; +} + +#stars2 { + width: 2px; + height: 2px; + background: transparent; + box-shadow: 1550px 1644px #FFF , 1428px 214px #FFF , 1728px 1012px #FFF , 319px 227px #FFF , 1912px 1005px #FFF , 405px 115px #FFF , 1205px 1641px #FFF , 1622px 786px #FFF , 815px 457px #FFF , 522px 357px #FFF , 745px 436px #FFF , 1066px 1101px #FFF , 390px 1597px #FFF , 278px 1806px #FFF , 1038px 1414px #FFF , 1005px 1114px #FFF , 1635px 1715px #FFF , 874px 77px #FFF , 1147px 351px #FFF , 955px 1462px #FFF , 439px 405px #FFF , 1788px 1186px #FFF , 1981px 75px #FFF , 300px 1655px #FFF , 1932px 1657px #FFF , 795px 1961px #FFF , 429px 152px #FFF , 332px 612px #FFF , 331px 1980px #FFF , 1588px 405px #FFF , 70px 117px #FFF , 1963px 1286px #FFF , 728px 398px #FFF , 250px 468px #FFF , 1760px 129px #FFF , 1968px 247px #FFF , 775px 1370px #FFF , 1949px 1077px #FFF , 517px 1953px #FFF , 1713px 1757px #FFF , 764px 1659px #FFF , 1885px 1682px #FFF , 290px 910px #FFF , 760px 70px #FFF , 1054px 1618px #FFF , 1152px 475px #FFF , 888px 844px #FFF , 1414px 1443px #FFF , 816px 1018px #FFF , 1342px 1900px #FFF , 299px 372px #FFF , 1432px 391px #FFF , 284px 1707px #FFF , 255px 1903px #FFF , 771px 696px #FFF , 1548px 1756px #FFF , 1090px 1199px #FFF , 1969px 1835px #FFF , 960px 1150px #FFF , 359px 1712px #FFF , 1411px 166px #FFF , 1280px 1168px #FFF , 851px 1749px #FFF , 1596px 15px #FFF , 1172px 410px #FFF , 553px 1288px #FFF , 1406px 1847px #FFF , 922px 142px #FFF , 1142px 434px #FFF , 1300px 460px #FFF , 353px 602px #FFF , 684px 1212px #FFF , 1480px 185px #FFF , 1435px 1752px #FFF , 619px 804px #FFF , 411px 325px #FFF , 1616px 1805px #FFF , 378px 766px #FFF , 1949px 539px #FFF , 1095px 1762px #FFF , 377px 224px #FFF , 690px 1879px #FFF , 1374px 9px #FFF , 587px 1807px #FFF , 1560px 6px #FFF , 1848px 794px #FFF , 1712px 1849px #FFF , 1102px 839px #FFF , 1708px 423px #FFF , 691px 90px #FFF , 368px 1619px #FFF , 371px 332px #FFF , 337px 478px #FFF , 20px 1440px #FFF , 120px 751px #FFF , 4px 1853px #FFF , 1787px 1486px #FFF , 97px 995px #FFF , 567px 177px #FFF , 1743px 1215px #FFF , 104px 1510px #FFF , 1748px 96px #FFF , 119px 322px #FFF , 1067px 206px #FFF , 230px 1808px #FFF , 1135px 1198px #FFF , 1906px 674px #FFF , 996px 978px #FFF , 1915px 601px #FFF , 1582px 267px #FFF , 1086px 231px #FFF , 1469px 1639px #FFF , 374px 1795px #FFF , 272px 138px #FFF , 934px 300px #FFF , 1453px 386px #FFF , 1320px 636px #FFF , 1770px 561px #FFF , 1016px 624px #FFF , 1776px 1582px #FFF , 1063px 773px #FFF , 1247px 1486px #FFF , 1524px 212px #FFF , 103px 1177px #FFF , 581px 569px #FFF , 752px 513px #FFF , 1330px 868px #FFF , 1370px 1335px #FFF , 1388px 694px #FFF , 1559px 621px #FFF , 1002px 786px #FFF , 1837px 499px #FFF , 396px 408px #FFF , 429px 481px #FFF , 825px 968px #FFF , 1087px 162px #FFF , 845px 177px #FFF , 1845px 988px #FFF , 1311px 507px #FFF , 933px 583px #FFF , 1371px 873px #FFF , 1759px 1393px #FFF , 197px 872px #FFF , 242px 206px #FFF , 533px 672px #FFF , 1545px 828px #FFF , 1753px 1780px #FFF , 52px 565px #FFF , 42px 783px #FFF , 287px 152px #FFF , 1328px 1990px #FFF , 184px 1443px #FFF , 952px 111px #FFF , 1503px 1467px #FFF , 937px 1501px #FFF , 843px 43px #FFF , 694px 1873px #FFF , 1070px 853px #FFF , 669px 374px #FFF , 172px 750px #FFF , 697px 541px #FFF , 875px 1709px #FFF , 261px 1963px #FFF , 33px 295px #FFF , 1340px 260px #FFF , 1374px 964px #FFF , 1419px 592px #FFF , 1999px 687px #FFF , 305px 1552px #FFF , 359px 533px #FFF , 1608px 250px #FFF , 75px 1217px #FFF , 177px 1763px #FFF , 1696px 177px #FFF , 888px 1109px #FFF , 414px 1621px #FFF , 854px 100px #FFF , 841px 1172px #FFF , 257px 1236px #FFF , 1087px 1430px #FFF , 932px 1949px #FFF , 1402px 1416px #FFF , 1970px 1295px #FFF , 1046px 1951px #FFF , 996px 1770px #FFF , 1062px 1436px #FFF , 1883px 116px #FFF , 34px 387px #FFF , 44px 688px #FFF , 522px 213px #FFF , 673px 514px #FFF , 1273px 1566px #FFF , 220px 514px #FFF , 409px 1602px #FFF , 367px 1983px #FFF , 1166px 968px #FFF , 605px 353px #FFF , 702px 1036px #FFF , 1376px 1657px #FFF , 1994px 1779px #FFF; + animation: animStar 100s linear infinite; +} +#stars2::after { + content: " "; + position: absolute; + top: 2000px; + width: 2px; + height: 2px; + background: transparent; + box-shadow: inherit; +} + +#stars3 { + width: 3px; + height: 3px; + background: transparent; + box-shadow: 1722px 259px #FFF , 919px 383px #FFF , 1765px 793px #FFF , 1473px 1626px #FFF , 97px 673px #FFF , 1737px 727px #FFF , 433px 269px #FFF , 1217px 1752px #FFF , 661px 22px #FFF , 212px 1408px #FFF , 388px 829px #FFF , 650px 361px #FFF , 1504px 1486px #FFF , 972px 232px #FFF , 378px 532px #FFF , 559px 100px #FFF , 843px 779px #FFF , 419px 1468px #FFF , 209px 379px #FFF , 1240px 187px #FFF , 1403px 1005px #FFF , 141px 447px #FFF , 1744px 1139px #FFF , 1972px 747px #FFF , 1162px 665px #FFF , 588px 158px #FFF , 1986px 1095px #FFF , 125px 1838px #FFF , 1416px 1481px #FFF , 1204px 122px #FFF , 29px 1135px #FFF , 1597px 183px #FFF , 426px 1447px #FFF , 990px 1277px #FFF , 116px 1588px #FFF , 1562px 805px #FFF , 1323px 1331px #FFF , 1598px 492px #FFF , 1183px 1034px #FFF , 1617px 1063px #FFF , 1458px 1295px #FFF , 1626px 1924px #FFF , 1016px 352px #FFF , 1626px 808px #FFF , 1769px 1099px #FFF , 38px 1275px #FFF , 245px 1168px #FFF , 1121px 521px #FFF , 141px 699px #FFF , 1984px 894px #FFF , 566px 1572px #FFF , 396px 1577px #FFF , 511px 1251px #FFF , 1985px 1597px #FFF , 781px 686px #FFF , 1661px 964px #FFF , 1959px 1897px #FFF , 788px 1030px #FFF , 240px 1520px #FFF , 1301px 1050px #FFF , 1106px 1870px #FFF , 1614px 1091px #FFF , 835px 1445px #FFF , 1362px 589px #FFF , 1923px 715px #FFF , 392px 989px #FFF , 231px 1301px #FFF , 1501px 16px #FFF , 269px 1245px #FFF , 264px 1273px #FFF , 1733px 1599px #FFF , 1173px 279px #FFF , 27px 773px #FFF , 1801px 1385px #FFF , 1610px 736px #FFF , 1541px 1489px #FFF , 1234px 1136px #FFF , 655px 1926px #FFF , 1345px 238px #FFF , 1957px 517px #FFF , 623px 338px #FFF , 1937px 307px #FFF , 1206px 634px #FFF , 1852px 212px #FFF , 839px 90px #FFF , 628px 1108px #FFF , 1224px 1618px #FFF , 177px 192px #FFF , 283px 649px #FFF , 826px 1358px #FFF , 1270px 1619px #FFF , 329px 1277px #FFF , 1391px 141px #FFF , 775px 1380px #FFF , 1062px 1305px #FFF , 404px 8px #FFF , 376px 1063px #FFF , 205px 198px #FFF , 1831px 1499px #FFF , 1329px 434px #FFF; + animation: animStar 150s linear infinite; +} +#stars3::after { + content: " "; + position: absolute; + top: 2000px; + width: 3px; + height: 3px; + background: transparent; + box-shadow: inherit; +} + +@keyframes animStar { + from { transform: translateY(0px); } + to { transform: translateY(-2000px); } +} \ No newline at end of file diff --git a/static/assets/css/home.css b/static/assets/css/home.css index 5d62743cf1..ce5b27cf60 100644 --- a/static/assets/css/home.css +++ b/static/assets/css/home.css @@ -67,30 +67,6 @@ input { transition: 0.4s; } -#particles-js { - position: absolute; - width: 100%; - height: 100%; - top: 0vw; - background-color: var(--bg-c); - background-repeat: no-repeat; - background-size: cover; - background-position: 50% 50%; - overflow: hidden; - z-index: 0; -} - -.particles-js-canvas-el { - z-index: 0; - top: 0; - left: 0; - position: absolute; - width: 100%; - height: 100%; - pointer-events: none; - filter: drop-shadow(0 0 4px rgba(180, 220, 255, 0.8)) drop-shadow(0 0 10px rgba(120, 180, 255, 0.4)); -} - #splash { color: var(--text-dark); margin-bottom: 1em; diff --git a/static/assets/js/home.js b/static/assets/js/home.js index dc63a8006a..5c7e3c1aca 100644 --- a/static/assets/js/home.js +++ b/static/assets/js/home.js @@ -49,112 +49,6 @@ if (!inFrame && !navigator.userAgent.includes("Firefox") && localStorage.getItem }, 2000); } -document.addEventListener("DOMContentLoaded", () => { - if (localStorage.getItem("particles") !== "true") return; - - const main = document.querySelector(".main"); - const particlesDiv = document.createElement("div"); - particlesDiv.id = "particles-js"; - main.parentNode.insertBefore(particlesDiv, main); - particlesDiv.appendChild(main); - - const particlesConfig = { - particles: { - number: { - value: 200, - density: { - enable: true, - value_area: 800, - }, - }, - color: { - value: "#ffffff", - }, - shape: { - type: "star", - stroke: { - width: 0, - color: "#ffffff", - }, - polygon: { - nb_sides: 5, - }, - }, - opacity: { - value: 1, - random: true, - anim: { - enable: true, - speed: 0.9, - opacity_min: 0, - sync: false, - }, - }, - size: { - value: 4, - random: true, - anim: { - enable: true, - speed: 1.1, - size_min: 0.1, - sync: false, - }, - }, - line_linked: { - enable: false, - }, - move: { - enable: true, - speed: 4, - direction: "none", - random: true, - straight: true, - out_mode: "out", - bounce: false, - variations: true, - }, - }, - interactivity: { - detect_on: "window", - events: { - onhover: { - enable: false, - }, - onclick: { - enable: false, - mode: "push", - }, - resize: true, - }, - modes: { - push: { - particles_nb: 30, - }, - }, - }, - retina_detect: true, - }; - - const script = document.createElement("script"); - script.src = "/assets/js/particles.min.js"; - script.onload = () => { - particlesJS("particles-js", particlesConfig); - - window.addEventListener("click", e => { - const pJS = window.pJSDom?.[0]?.pJS; - if (!pJS) return; - const canvas = pJS.canvas.el; - const rect = canvas.getBoundingClientRect(); - const x = e.clientX - rect.left; - const y = e.clientY - rect.top; - for (let i = 0; i < 30; i++) { - pJS.fn.modes.pushParticles(1, { pos_x: x, pos_y: y }); - } - }); - }; - document.head.appendChild(script); -}); - // Splash texts const SplashT = [ "Over 8 Million Users since 2023", diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 694807c101..42c4f920aa 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -136,4 +136,15 @@ document.addEventListener("DOMContentLoaded", () => { if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } + + // CSS Parallax Pixel Stars - based on codepen.io/sarazond/pen/LYGbwj + if (localStorage.getItem("particles") === "true") { + ["stars", "stars2", "stars3"].forEach(id => { + if (!document.getElementById(id)) { + const el = document.createElement("div"); + el.id = id; + document.body.insertBefore(el, document.body.firstChild); + } + }); + } }); diff --git a/static/assets/js/particles.min.js b/static/assets/js/particles.min.js deleted file mode 100644 index b3d46d127f..0000000000 --- a/static/assets/js/particles.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* ----------------------------------------------- -/* Author : Vincent Garreau - vincentgarreau.com -/* MIT license: http://opensource.org/licenses/MIT -/* Demo / Generator : vincentgarreau.com/particles.js -/* GitHub : github.com/VincentGarreau/particles.js -/* How to use? : Check the GitHub README -/* v2.0.0 -/* ----------------------------------------------- */ -function hexToRgb(e){var a=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;e=e.replace(a,function(e,a,t,i){return a+a+t+t+i+i});var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}function clamp(e,a,t){return Math.min(Math.max(e,a),t)}function isInArray(e,a){return a.indexOf(e)>-1}var pJS=function(e,a){var t=document.querySelector("#"+e+" > .particles-js-canvas-el");this.pJS={canvas:{el:t,w:t.offsetWidth,h:t.offsetHeight},particles:{number:{value:400,density:{enable:!0,value_area:800}},color:{value:"#fff"},shape:{type:"circle",stroke:{width:0,color:"#ff0000"},polygon:{nb_sides:5},image:{src:"",width:100,height:100}},opacity:{value:1,random:!1,anim:{enable:!1,speed:2,opacity_min:0,sync:!1}},size:{value:20,random:!1,anim:{enable:!1,speed:20,size_min:0,sync:!1}},line_linked:{enable:!0,distance:100,color:"#fff",opacity:1,width:1},move:{enable:!0,speed:2,direction:"none",random:!1,straight:!1,out_mode:"out",bounce:!1,attract:{enable:!1,rotateX:3e3,rotateY:3e3}},array:[]},interactivity:{detect_on:"canvas",events:{onhover:{enable:!0,mode:"grab"},onclick:{enable:!0,mode:"push"},resize:!0},modes:{grab:{distance:100,line_linked:{opacity:1}},bubble:{distance:200,size:80,duration:.4},repulse:{distance:200,duration:.4},push:{particles_nb:4},remove:{particles_nb:2}},mouse:{}},retina_detect:!1,fn:{interact:{},modes:{},vendors:{}},tmp:{}};var i=this.pJS;a&&Object.deepExtend(i,a),i.tmp.obj={size_value:i.particles.size.value,size_anim_speed:i.particles.size.anim.speed,move_speed:i.particles.move.speed,line_linked_distance:i.particles.line_linked.distance,line_linked_width:i.particles.line_linked.width,mode_grab_distance:i.interactivity.modes.grab.distance,mode_bubble_distance:i.interactivity.modes.bubble.distance,mode_bubble_size:i.interactivity.modes.bubble.size,mode_repulse_distance:i.interactivity.modes.repulse.distance},i.fn.retinaInit=function(){i.retina_detect&&window.devicePixelRatio>1?(i.canvas.pxratio=window.devicePixelRatio,i.tmp.retina=!0):(i.canvas.pxratio=1,i.tmp.retina=!1),i.canvas.w=i.canvas.el.offsetWidth*i.canvas.pxratio,i.canvas.h=i.canvas.el.offsetHeight*i.canvas.pxratio,i.particles.size.value=i.tmp.obj.size_value*i.canvas.pxratio,i.particles.size.anim.speed=i.tmp.obj.size_anim_speed*i.canvas.pxratio,i.particles.move.speed=i.tmp.obj.move_speed*i.canvas.pxratio,i.particles.line_linked.distance=i.tmp.obj.line_linked_distance*i.canvas.pxratio,i.interactivity.modes.grab.distance=i.tmp.obj.mode_grab_distance*i.canvas.pxratio,i.interactivity.modes.bubble.distance=i.tmp.obj.mode_bubble_distance*i.canvas.pxratio,i.particles.line_linked.width=i.tmp.obj.line_linked_width*i.canvas.pxratio,i.interactivity.modes.bubble.size=i.tmp.obj.mode_bubble_size*i.canvas.pxratio,i.interactivity.modes.repulse.distance=i.tmp.obj.mode_repulse_distance*i.canvas.pxratio},i.fn.canvasInit=function(){i.canvas.ctx=i.canvas.el.getContext("2d")},i.fn.canvasSize=function(){i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i&&i.interactivity.events.resize&&window.addEventListener("resize",function(){i.canvas.w=i.canvas.el.offsetWidth,i.canvas.h=i.canvas.el.offsetHeight,i.tmp.retina&&(i.canvas.w*=i.canvas.pxratio,i.canvas.h*=i.canvas.pxratio),i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i.particles.move.enable||(i.fn.particlesEmpty(),i.fn.particlesCreate(),i.fn.particlesDraw(),i.fn.vendors.densityAutoParticles()),i.fn.vendors.densityAutoParticles()})},i.fn.canvasPaint=function(){i.canvas.ctx.fillRect(0,0,i.canvas.w,i.canvas.h)},i.fn.canvasClear=function(){i.canvas.ctx.clearRect(0,0,i.canvas.w,i.canvas.h)},i.fn.particle=function(e,a,t){if(this.radius=(i.particles.size.random?Math.random():1)*i.particles.size.value,i.particles.size.anim.enable&&(this.size_status=!1,this.vs=i.particles.size.anim.speed/100,i.particles.size.anim.sync||(this.vs=this.vs*Math.random())),this.x=t?t.x:Math.random()*i.canvas.w,this.y=t?t.y:Math.random()*i.canvas.h,this.x>i.canvas.w-2*this.radius?this.x=this.x-this.radius:this.x<2*this.radius&&(this.x=this.x+this.radius),this.y>i.canvas.h-2*this.radius?this.y=this.y-this.radius:this.y<2*this.radius&&(this.y=this.y+this.radius),i.particles.move.bounce&&i.fn.vendors.checkOverlap(this,t),this.color={},"object"==typeof e.value)if(e.value instanceof Array){var s=e.value[Math.floor(Math.random()*i.particles.color.value.length)];this.color.rgb=hexToRgb(s)}else void 0!=e.value.r&&void 0!=e.value.g&&void 0!=e.value.b&&(this.color.rgb={r:e.value.r,g:e.value.g,b:e.value.b}),void 0!=e.value.h&&void 0!=e.value.s&&void 0!=e.value.l&&(this.color.hsl={h:e.value.h,s:e.value.s,l:e.value.l});else"random"==e.value?this.color.rgb={r:Math.floor(256*Math.random())+0,g:Math.floor(256*Math.random())+0,b:Math.floor(256*Math.random())+0}:"string"==typeof e.value&&(this.color=e,this.color.rgb=hexToRgb(this.color.value));this.opacity=(i.particles.opacity.random?Math.random():1)*i.particles.opacity.value,i.particles.opacity.anim.enable&&(this.opacity_status=!1,this.vo=i.particles.opacity.anim.speed/100,i.particles.opacity.anim.sync||(this.vo=this.vo*Math.random()));var n={};switch(i.particles.move.direction){case"top":n={x:0,y:-1};break;case"top-right":n={x:.5,y:-.5};break;case"right":n={x:1,y:-0};break;case"bottom-right":n={x:.5,y:.5};break;case"bottom":n={x:0,y:1};break;case"bottom-left":n={x:-.5,y:1};break;case"left":n={x:-1,y:0};break;case"top-left":n={x:-.5,y:-.5};break;default:n={x:0,y:0}}i.particles.move.straight?(this.vx=n.x,this.vy=n.y,i.particles.move.random&&(this.vx=this.vx*Math.random(),this.vy=this.vy*Math.random())):(this.vx=n.x+Math.random()-.5,this.vy=n.y+Math.random()-.5),this.vx_i=this.vx,this.vy_i=this.vy;var r=i.particles.shape.type;if("object"==typeof r){if(r instanceof Array){var c=r[Math.floor(Math.random()*r.length)];this.shape=c}}else this.shape=r;if("image"==this.shape){var o=i.particles.shape;this.img={src:o.image.src,ratio:o.image.width/o.image.height},this.img.ratio||(this.img.ratio=1),"svg"==i.tmp.img_type&&void 0!=i.tmp.source_svg&&(i.fn.vendors.createSvgImg(this),i.tmp.pushing&&(this.img.loaded=!1))}},i.fn.particle.prototype.draw=function(){function e(){i.canvas.ctx.drawImage(r,a.x-t,a.y-t,2*t,2*t/a.img.ratio)}var a=this;if(void 0!=a.radius_bubble)var t=a.radius_bubble;else var t=a.radius;if(void 0!=a.opacity_bubble)var s=a.opacity_bubble;else var s=a.opacity;if(a.color.rgb)var n="rgba("+a.color.rgb.r+","+a.color.rgb.g+","+a.color.rgb.b+","+s+")";else var n="hsla("+a.color.hsl.h+","+a.color.hsl.s+"%,"+a.color.hsl.l+"%,"+s+")";switch(i.canvas.ctx.fillStyle=n,i.canvas.ctx.beginPath(),a.shape){case"circle":i.canvas.ctx.arc(a.x,a.y,t,0,2*Math.PI,!1);break;case"edge":i.canvas.ctx.rect(a.x-t,a.y-t,2*t,2*t);break;case"triangle":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t,a.y+t/1.66,2*t,3,2);break;case"polygon":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t/(i.particles.shape.polygon.nb_sides/3.5),a.y-t/.76,2.66*t/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,1);break;case"star":i.fn.vendors.drawShape(i.canvas.ctx,a.x-2*t/(i.particles.shape.polygon.nb_sides/4),a.y-t/1.52,2*t*2.66/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,2);break;case"image":if("svg"==i.tmp.img_type)var r=a.img.obj;else var r=i.tmp.img_obj;r&&e()}i.canvas.ctx.closePath(),i.particles.shape.stroke.width>0&&(i.canvas.ctx.strokeStyle=i.particles.shape.stroke.color,i.canvas.ctx.lineWidth=i.particles.shape.stroke.width,i.canvas.ctx.stroke()),i.canvas.ctx.fill()},i.fn.particlesCreate=function(){for(var e=0;e=i.particles.opacity.value&&(a.opacity_status=!1),a.opacity+=a.vo):(a.opacity<=i.particles.opacity.anim.opacity_min&&(a.opacity_status=!0),a.opacity-=a.vo),a.opacity<0&&(a.opacity=0)),i.particles.size.anim.enable&&(1==a.size_status?(a.radius>=i.particles.size.value&&(a.size_status=!1),a.radius+=a.vs):(a.radius<=i.particles.size.anim.size_min&&(a.size_status=!0),a.radius-=a.vs),a.radius<0&&(a.radius=0)),"bounce"==i.particles.move.out_mode)var s={x_left:a.radius,x_right:i.canvas.w,y_top:a.radius,y_bottom:i.canvas.h};else var s={x_left:-a.radius,x_right:i.canvas.w+a.radius,y_top:-a.radius,y_bottom:i.canvas.h+a.radius};switch(a.x-a.radius>i.canvas.w?(a.x=s.x_left,a.y=Math.random()*i.canvas.h):a.x+a.radius<0&&(a.x=s.x_right,a.y=Math.random()*i.canvas.h),a.y-a.radius>i.canvas.h?(a.y=s.y_top,a.x=Math.random()*i.canvas.w):a.y+a.radius<0&&(a.y=s.y_bottom,a.x=Math.random()*i.canvas.w),i.particles.move.out_mode){case"bounce":a.x+a.radius>i.canvas.w?a.vx=-a.vx:a.x-a.radius<0&&(a.vx=-a.vx),a.y+a.radius>i.canvas.h?a.vy=-a.vy:a.y-a.radius<0&&(a.vy=-a.vy)}if(isInArray("grab",i.interactivity.events.onhover.mode)&&i.fn.modes.grabParticle(a),(isInArray("bubble",i.interactivity.events.onhover.mode)||isInArray("bubble",i.interactivity.events.onclick.mode))&&i.fn.modes.bubbleParticle(a),(isInArray("repulse",i.interactivity.events.onhover.mode)||isInArray("repulse",i.interactivity.events.onclick.mode))&&i.fn.modes.repulseParticle(a),i.particles.line_linked.enable||i.particles.move.attract.enable)for(var n=e+1;n0){var c=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle="rgba("+c.r+","+c.g+","+c.b+","+r+")",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(a.x,a.y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}},i.fn.interact.attractParticles=function(e,a){var t=e.x-a.x,s=e.y-a.y,n=Math.sqrt(t*t+s*s);if(n<=i.particles.line_linked.distance){var r=t/(1e3*i.particles.move.attract.rotateX),c=s/(1e3*i.particles.move.attract.rotateY);e.vx-=r,e.vy-=c,a.vx+=r,a.vy+=c}},i.fn.interact.bounceParticles=function(e,a){var t=e.x-a.x,i=e.y-a.y,s=Math.sqrt(t*t+i*i),n=e.radius+a.radius;n>=s&&(e.vx=-e.vx,e.vy=-e.vy,a.vx=-a.vx,a.vy=-a.vy)},i.fn.modes.pushParticles=function(e,a){i.tmp.pushing=!0;for(var t=0;e>t;t++)i.particles.array.push(new i.fn.particle(i.particles.color,i.particles.opacity.value,{x:a?a.pos_x:Math.random()*i.canvas.w,y:a?a.pos_y:Math.random()*i.canvas.h})),t==e-1&&(i.particles.move.enable||i.fn.particlesDraw(),i.tmp.pushing=!1)},i.fn.modes.removeParticles=function(e){i.particles.array.splice(0,e),i.particles.move.enable||i.fn.particlesDraw()},i.fn.modes.bubbleParticle=function(e){function a(){e.opacity_bubble=e.opacity,e.radius_bubble=e.radius}function t(a,t,s,n,c){if(a!=t)if(i.tmp.bubble_duration_end){if(void 0!=s){var o=n-p*(n-a)/i.interactivity.modes.bubble.duration,l=a-o;d=a+l,"size"==c&&(e.radius_bubble=d),"opacity"==c&&(e.opacity_bubble=d)}}else if(r<=i.interactivity.modes.bubble.distance){if(void 0!=s)var v=s;else var v=n;if(v!=a){var d=n-p*(n-a)/i.interactivity.modes.bubble.duration;"size"==c&&(e.radius_bubble=d),"opacity"==c&&(e.opacity_bubble=d)}}else"size"==c&&(e.radius_bubble=void 0),"opacity"==c&&(e.opacity_bubble=void 0)}if(i.interactivity.events.onhover.enable&&isInArray("bubble",i.interactivity.events.onhover.mode)){var s=e.x-i.interactivity.mouse.pos_x,n=e.y-i.interactivity.mouse.pos_y,r=Math.sqrt(s*s+n*n),c=1-r/i.interactivity.modes.bubble.distance;if(r<=i.interactivity.modes.bubble.distance){if(c>=0&&"mousemove"==i.interactivity.status){if(i.interactivity.modes.bubble.size!=i.particles.size.value)if(i.interactivity.modes.bubble.size>i.particles.size.value){var o=e.radius+i.interactivity.modes.bubble.size*c;o>=0&&(e.radius_bubble=o)}else{var l=e.radius-i.interactivity.modes.bubble.size,o=e.radius-l*c;o>0?e.radius_bubble=o:e.radius_bubble=0}if(i.interactivity.modes.bubble.opacity!=i.particles.opacity.value)if(i.interactivity.modes.bubble.opacity>i.particles.opacity.value){var v=i.interactivity.modes.bubble.opacity*c;v>e.opacity&&v<=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}else{var v=e.opacity-(i.particles.opacity.value-i.interactivity.modes.bubble.opacity)*c;v=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}}}else a();"mouseleave"==i.interactivity.status&&a()}else if(i.interactivity.events.onclick.enable&&isInArray("bubble",i.interactivity.events.onclick.mode)){if(i.tmp.bubble_clicking){var s=e.x-i.interactivity.mouse.click_pos_x,n=e.y-i.interactivity.mouse.click_pos_y,r=Math.sqrt(s*s+n*n),p=((new Date).getTime()-i.interactivity.mouse.click_time)/1e3;p>i.interactivity.modes.bubble.duration&&(i.tmp.bubble_duration_end=!0),p>2*i.interactivity.modes.bubble.duration&&(i.tmp.bubble_clicking=!1,i.tmp.bubble_duration_end=!1)}i.tmp.bubble_clicking&&(t(i.interactivity.modes.bubble.size,i.particles.size.value,e.radius_bubble,e.radius,"size"),t(i.interactivity.modes.bubble.opacity,i.particles.opacity.value,e.opacity_bubble,e.opacity,"opacity"))}},i.fn.modes.repulseParticle=function(e){function a(){var a=Math.atan2(d,p);if(e.vx=u*Math.cos(a),e.vy=u*Math.sin(a),"bounce"==i.particles.move.out_mode){var t={x:e.x+e.vx,y:e.y+e.vy};t.x+e.radius>i.canvas.w?e.vx=-e.vx:t.x-e.radius<0&&(e.vx=-e.vx),t.y+e.radius>i.canvas.h?e.vy=-e.vy:t.y-e.radius<0&&(e.vy=-e.vy)}}if(i.interactivity.events.onhover.enable&&isInArray("repulse",i.interactivity.events.onhover.mode)&&"mousemove"==i.interactivity.status){var t=e.x-i.interactivity.mouse.pos_x,s=e.y-i.interactivity.mouse.pos_y,n=Math.sqrt(t*t+s*s),r={x:t/n,y:s/n},c=i.interactivity.modes.repulse.distance,o=100,l=clamp(1/c*(-1*Math.pow(n/c,2)+1)*c*o,0,50),v={x:e.x+r.x*l,y:e.y+r.y*l};"bounce"==i.particles.move.out_mode?(v.x-e.radius>0&&v.x+e.radius0&&v.y+e.radius=m&&a()}else 0==i.tmp.repulse_clicking&&(e.vx=e.vx_i,e.vy=e.vy_i)},i.fn.modes.grabParticle=function(e){if(i.interactivity.events.onhover.enable&&"mousemove"==i.interactivity.status){var a=e.x-i.interactivity.mouse.pos_x,t=e.y-i.interactivity.mouse.pos_y,s=Math.sqrt(a*a+t*t);if(s<=i.interactivity.modes.grab.distance){var n=i.interactivity.modes.grab.line_linked.opacity-s/(1/i.interactivity.modes.grab.line_linked.opacity)/i.interactivity.modes.grab.distance;if(n>0){var r=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle="rgba("+r.r+","+r.g+","+r.b+","+n+")",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(i.interactivity.mouse.pos_x,i.interactivity.mouse.pos_y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}}},i.fn.vendors.eventsListeners=function(){"window"==i.interactivity.detect_on?i.interactivity.el=window:i.interactivity.el=i.canvas.el,(i.interactivity.events.onhover.enable||i.interactivity.events.onclick.enable)&&(i.interactivity.el.addEventListener("mousemove",function(e){if(i.interactivity.el==window)var a=e.clientX,t=e.clientY;else var a=e.offsetX||e.clientX,t=e.offsetY||e.clientY;i.interactivity.mouse.pos_x=a,i.interactivity.mouse.pos_y=t,i.tmp.retina&&(i.interactivity.mouse.pos_x*=i.canvas.pxratio,i.interactivity.mouse.pos_y*=i.canvas.pxratio),i.interactivity.status="mousemove"}),i.interactivity.el.addEventListener("mouseleave",function(e){i.interactivity.mouse.pos_x=null,i.interactivity.mouse.pos_y=null,i.interactivity.status="mouseleave"})),i.interactivity.events.onclick.enable&&i.interactivity.el.addEventListener("click",function(){if(i.interactivity.mouse.click_pos_x=i.interactivity.mouse.pos_x,i.interactivity.mouse.click_pos_y=i.interactivity.mouse.pos_y,i.interactivity.mouse.click_time=(new Date).getTime(),i.interactivity.events.onclick.enable)switch(i.interactivity.events.onclick.mode){case"push":i.particles.move.enable?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):1==i.interactivity.modes.push.particles_nb?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):i.interactivity.modes.push.particles_nb>1&&i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb);break;case"remove":i.fn.modes.removeParticles(i.interactivity.modes.remove.particles_nb);break;case"bubble":i.tmp.bubble_clicking=!0;break;case"repulse":i.tmp.repulse_clicking=!0,i.tmp.repulse_count=0,i.tmp.repulse_finish=!1,setTimeout(function(){i.tmp.repulse_clicking=!1},1e3*i.interactivity.modes.repulse.duration)}})},i.fn.vendors.densityAutoParticles=function(){if(i.particles.number.density.enable){var e=i.canvas.el.width*i.canvas.el.height/1e3;i.tmp.retina&&(e/=2*i.canvas.pxratio);var a=e*i.particles.number.value/i.particles.number.density.value_area,t=i.particles.array.length-a;0>t?i.fn.modes.pushParticles(Math.abs(t)):i.fn.modes.removeParticles(t)}},i.fn.vendors.checkOverlap=function(e,a){for(var t=0;tv;v++)e.lineTo(i,0),e.translate(i,0),e.rotate(l);e.fill(),e.restore()},i.fn.vendors.exportImg=function(){window.open(i.canvas.el.toDataURL("image/png"),"_blank")},i.fn.vendors.loadImg=function(e){if(i.tmp.img_error=void 0,""!=i.particles.shape.image.src)if("svg"==e){var a=new XMLHttpRequest;a.open("GET",i.particles.shape.image.src),a.onreadystatechange=function(e){4==a.readyState&&(200==a.status?(i.tmp.source_svg=e.currentTarget.response,i.fn.vendors.checkBeforeDraw()):(console.log("Error pJS - Image not found"),i.tmp.img_error=!0))},a.send()}else{var t=new Image;t.addEventListener("load",function(){i.tmp.img_obj=t,i.fn.vendors.checkBeforeDraw()}),t.src=i.particles.shape.image.src}else console.log("Error pJS - No image.src"),i.tmp.img_error=!0},i.fn.vendors.draw=function(){"image"==i.particles.shape.type?"svg"==i.tmp.img_type?i.tmp.count_svg>=i.particles.number.value?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):void 0!=i.tmp.img_obj?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame))},i.fn.vendors.checkBeforeDraw=function(){"image"==i.particles.shape.type?"svg"==i.tmp.img_type&&void 0==i.tmp.source_svg?i.tmp.checkAnimFrame=requestAnimFrame(check):(cancelRequestAnimFrame(i.tmp.checkAnimFrame),i.tmp.img_error||(i.fn.vendors.init(),i.fn.vendors.draw())):(i.fn.vendors.init(),i.fn.vendors.draw())},i.fn.vendors.init=function(){i.fn.retinaInit(),i.fn.canvasInit(),i.fn.canvasSize(),i.fn.canvasPaint(),i.fn.particlesCreate(),i.fn.vendors.densityAutoParticles(),i.particles.line_linked.color_rgb_line=hexToRgb(i.particles.line_linked.color)},i.fn.vendors.start=function(){isInArray("image",i.particles.shape.type)?(i.tmp.img_type=i.particles.shape.image.src.substr(i.particles.shape.image.src.length-3),i.fn.vendors.loadImg(i.tmp.img_type)):i.fn.vendors.checkBeforeDraw()},i.fn.vendors.eventsListeners(),i.fn.vendors.start()};Object.deepExtend=function(e,a){for(var t in a)a[t]&&a[t].constructor&&a[t].constructor===Object?(e[t]=e[t]||{},arguments.callee(e[t],a[t])):e[t]=a[t];return e},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}}(),window.cancelRequestAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout}(),window.pJSDom=[],window.particlesJS=function(e,a){"string"!=typeof e&&(a=e,e="particles-js"),e||(e="particles-js");var t=document.getElementById(e),i="particles-js-canvas-el",s=t.getElementsByClassName(i);if(s.length)for(;s.length>0;)t.removeChild(s[0]);var n=document.createElement("canvas");n.className=i,n.style.width="100%",n.style.height="100%";var r=document.getElementById(e).appendChild(n);null!=r&&pJSDom.push(new pJS(e,a))},window.particlesJS.load=function(e,a,t){var i=new XMLHttpRequest;i.open("GET",a),i.onreadystatechange=function(a){if(4==i.readyState)if(200==i.status){var s=JSON.parse(a.currentTarget.response);window.particlesJS(e,s),t&&t()}else console.log("Error pJS - XMLHttpRequest status: "+i.status),console.log("Error pJS - File config not found")},i.send()}; \ No newline at end of file From f92c3ceed870b84ae6a94c36f5af21c795eb2a64 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 6 May 2026 13:07:45 -0400 Subject: [PATCH 058/115] feat(settings): add cursor effects and merge customization options --- static/assets/css/global.css | 13 ++- static/assets/js/main.js | 182 ++++++++++++++++++++++++++++++++++- static/assets/js/settings.js | 82 +++++++++++----- static/settings.html | 74 ++++++++------ 4 files changed, 294 insertions(+), 57 deletions(-) diff --git a/static/assets/css/global.css b/static/assets/css/global.css index 1fa334ac80..1de38ce362 100644 --- a/static/assets/css/global.css +++ b/static/assets/css/global.css @@ -77,7 +77,18 @@ body { z-index: 99; } -/* CSS Parallax Pixel Stars - based on codepen.io/sarazond/pen/LYGbwj */ +/* Pointer Effects Canvas */ +#pointer-canvas { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 9999; +} + +/* CSS Parallax Pixel Stars (based on codepen.io/sarazond/pen/LYGbwj) */ #stars, #stars2, #stars3 { diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 42c4f920aa..13fc415f80 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -133,12 +133,15 @@ document.addEventListener("DOMContentLoaded", () => { // Background Image Logic const savedBackgroundImage = localStorage.getItem("backgroundImage"); - if (savedBackgroundImage) { + if (savedBackgroundImage === "none") { + document.body.style.backgroundImage = "none"; + } else if (savedBackgroundImage) { document.body.style.backgroundImage = `url('${savedBackgroundImage}')`; } - // CSS Parallax Pixel Stars - based on codepen.io/sarazond/pen/LYGbwj + // Background Particles if (localStorage.getItem("particles") === "true") { + // CSS Parallax Pixel Stars (based on codepen.io/sarazond/pen/LYGbwj) ["stars", "stars2", "stars3"].forEach(id => { if (!document.getElementById(id)) { const el = document.createElement("div"); @@ -147,4 +150,179 @@ document.addEventListener("DOMContentLoaded", () => { } }); } + + // Pointer Effects + if (localStorage.getItem("pointer") === "rainbow-stars") { + // Rainbow Star Particles (based on codepen.io/tommyho/pen/ZEmjWGY) + if (!document.getElementById("pointer-canvas")) { + const canvas = document.createElement("canvas"); + canvas.id = "pointer-canvas"; + document.body.appendChild(canvas); + + const ctx = canvas.getContext("2d"); + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + + const bNum = 3; + const bSize = 8; + const bSpeed = 6; + const bDep = 0.1; + const bDist = 30; + const bStarVar = 2; + const bHue = 4; + + let spots = []; + let hue = 0; + const mouse = { x: undefined, y: undefined }; + + window.addEventListener("mousemove", e => { + mouse.x = e.clientX; + mouse.y = e.clientY; + for (let i = 0; i < bNum; i++) spots.push(new Particle()); + }); + + window.addEventListener("resize", () => { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + }); + + class Particle { + constructor() { + this.x = mouse.x; + this.y = mouse.y; + this.size = Math.random() * bSize + 0.1; + this.speedX = Math.random() * bSpeed - bSpeed / 2; + this.speedY = Math.random() * bSpeed - bSpeed / 2; + this.points = Math.floor(Math.random() * bStarVar) + 5; + this.radius = Math.random() * bSize + 0.1; + this.color = "hsl(" + bHue * hue + ", 100%, 50%)"; + } + draw() { + ctx.fillStyle = this.color; + ctx.beginPath(); + star(this.x, this.y, this.radius * 2, this.radius, this.points); + ctx.fill(); + } + update() { + this.x += this.speedX; + this.y += this.speedY; + if (this.size > bDep) this.size -= bDep; + } + } + + function star(x, y, radius1, radius2, npoints) { + const angle = (2 * Math.PI) / npoints; + const halfAngle = angle / 2; + ctx.moveTo(x + Math.cos(halfAngle) * radius1, y + Math.sin(halfAngle) * radius1); + for (let a = 0; a <= 2 * Math.PI; a += angle) { + ctx.lineTo(x + Math.cos(a) * radius2, y + Math.sin(a) * radius2); + ctx.lineTo(x + Math.cos(a + halfAngle) * radius1, y + Math.sin(a + halfAngle) * radius1); + } + } + + function handleParticles() { + for (let i = 0; i < spots.length; i++) { + spots[i].update(); + spots[i].draw(); + for (let j = i; j < spots.length; j++) { + const dx = spots[i].x - spots[j].x; + const dy = spots[i].y - spots[j].y; + if (Math.sqrt(dx * dx + dy * dy) < bDist) { + ctx.beginPath(); + ctx.strokeStyle = spots[i].color; + ctx.lineWidth = spots[i].size / 3; + ctx.moveTo(spots[i].x, spots[i].y); + ctx.bezierCurveTo(spots[j].x, spots[j].y, spots[j].x, spots[i].y, spots[j].x, spots[j].y); + ctx.stroke(); + } + } + if (spots[i].size <= bDep) { + spots.splice(i, 1); + i--; + } + } + hue++; + } + + (function animate() { + ctx.clearRect(0, 0, canvas.width, canvas.height); + handleParticles(); + requestAnimationFrame(animate); + })(); + } + } else if (localStorage.getItem("pointer") === "white-orbs") { + // White Orb Particles (based on codepen.io/gabezink17-cmd/pen/WbGmeyR) + if (!document.getElementById("pointer-canvas")) { + const canvas = document.createElement("canvas"); + canvas.id = "pointer-canvas"; + document.body.appendChild(canvas); + + const ctx = canvas.getContext("2d"); + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + + const mouse = { x: innerWidth / 2, y: innerHeight / 2 }; + let particles = []; + + class OrbParticle { + constructor(x, y) { + this.x = x; + this.y = y; + this.vx = (Math.random() - 0.5) * 4; + this.vy = (Math.random() - 0.5) * 4; + this.size = Math.random() * 3 + 1; + this.life = 100; + } + update() { + this.vx += (mouse.x - this.x) * 0.0005; + this.vy += (mouse.y - this.y) * 0.0005; + this.x += this.vx; + this.y += this.vy; + this.vx *= 0.96; + this.vy *= 0.96; + this.life -= 1; + } + draw() { + ctx.fillStyle = "white"; + ctx.globalAlpha = this.life / 100; + ctx.beginPath(); + ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); + ctx.fill(); + ctx.globalAlpha = 1; + } + } + + function spawn(x, y, n = 10) { + for (let i = 0; i < n; i++) particles.push(new OrbParticle(x, y)); + } + + window.addEventListener("mousemove", e => { + mouse.x = e.clientX; + mouse.y = e.clientY; + spawn(mouse.x, mouse.y, 1); + }); + + window.addEventListener("click", e => spawn(e.clientX, e.clientY, 40)); + + window.addEventListener("mousedown", () => { + for (let i = 0; i < 50; i++) spawn(mouse.x, mouse.y, 1); + }); + + window.addEventListener("resize", () => { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + }); + + (function animate() { + ctx.globalAlpha = 1; + ctx.clearRect(0, 0, canvas.width, canvas.height); + particles.forEach((p, i) => { + p.update(); + p.draw(); + if (p.life <= 0) particles.splice(i, 1); + }); + requestAnimationFrame(animate); + })(); + } + } }); diff --git a/static/assets/js/settings.js b/static/assets/js/settings.js index b0be3010b6..2291edb66e 100644 --- a/static/assets/js/settings.js +++ b/static/assets/js/settings.js @@ -58,22 +58,71 @@ document.addEventListener("DOMContentLoaded", () => { document.getElementById("ab-settings-switch").checked = true; } - const backgroundInput = document.getElementById("background-input"); - backgroundInput.value = localStorage.getItem("backgroundImage") || ""; + // Themes + const themeDropdown = document.getElementById("theme-dropdown"); + themeDropdown.value = localStorage.getItem("theme") || "d"; + themeDropdown.addEventListener("change", function () { + themeChange(this); + }); + + // Backgrounds + const bgDropdown = document.getElementById("background-dropdown"); + const bgCustomRow = document.getElementById("background-custom-row"); + const bgInput = document.getElementById("background-input"); + + const savedBg = localStorage.getItem("backgroundImage"); + const savedBgMode = localStorage.getItem("backgroundMode") || "default"; + bgDropdown.value = savedBgMode; + if (savedBgMode === "custom") { + bgCustomRow.style.display = ""; + bgInput.value = savedBg || ""; + } + + bgDropdown.addEventListener("change", function () { + const mode = this.value; + localStorage.setItem("backgroundMode", mode); + if (mode === "default") { + bgCustomRow.style.display = "none"; + localStorage.removeItem("backgroundImage"); + document.body.style.backgroundImage = ""; + window.location.reload(); + } else if (mode === "none") { + bgCustomRow.style.display = "none"; + localStorage.setItem("backgroundImage", "none"); + document.body.style.backgroundImage = "none"; + } else if (mode === "custom") { + bgCustomRow.style.display = ""; + } + }); document.getElementById("save-button").addEventListener("click", () => { - const imageURL = backgroundInput.value.trim(); - if (imageURL) { - localStorage.setItem("backgroundImage", imageURL); - document.body.style.backgroundImage = `url('${imageURL}')`; + const url = bgInput.value.trim(); + if (url) { + localStorage.setItem("backgroundImage", url); + localStorage.setItem("backgroundMode", "custom"); + document.body.style.backgroundImage = `url('${url}')`; } }); - document.getElementById("reset-button").addEventListener("click", () => { - localStorage.removeItem("backgroundImage"); - backgroundInput.value = ""; - document.body.style.backgroundImage = ""; - window.location.reload(); + // Background Particles + const particlesDropdown = document.getElementById("particles-dropdown"); + particlesDropdown.value = localStorage.getItem("particles") === "true" ? "on" : "off"; + particlesDropdown.addEventListener("change", function () { + localStorage.setItem("particles", this.value === "on" ? "true" : "false"); + }); + + // Cursor Effects + const pointerDropdown = document.getElementById("pointer-dropdown"); + pointerDropdown.value = localStorage.getItem("pointer") || "default"; + pointerDropdown.addEventListener("change", function () { + const val = this.value; + if (val === "default") { + localStorage.removeItem("pointer"); + } else { + localStorage.setItem("pointer", val); + } + const existing = document.getElementById("pointer-canvas"); + if (existing) existing.remove(); }); document.getElementById("engine").addEventListener("change", function () { @@ -83,17 +132,6 @@ document.addEventListener("DOMContentLoaded", () => { const savedEngineName = localStorage.getItem("enginename"); if (savedEngineName) document.getElementById("engine").value = savedEngineName; - - const particlesSwitch = document.getElementById("2"); - particlesSwitch.checked = localStorage.getItem("particles") === "true"; - particlesSwitch.addEventListener("change", event => { - localStorage.setItem("particles", event.currentTarget.checked ? "true" : "false"); - }); - - const themeDropdown = document.getElementById("theme-dropdown"); - themeDropdown.addEventListener("change", function () { - themeChange(this); - }); }); function saveEventKey() { diff --git a/static/settings.html b/static/settings.html index d9c2323506..9ee79f8d75 100644 --- a/static/settings.html +++ b/static/settings.html @@ -147,12 +147,49 @@

Tab Cloaker

-

Set Background Image

-

Change the site's background image.

- - - +

Visual Customization

+

Customize the look and feel of the site

+ + + + + + + + + + + + +
+

Search Engine

Change the search engine when searching.

@@ -179,33 +216,6 @@

Choose your Proxy

-
-

Particles

-

- Add the particles that are from the previous version to the new - site. -

- -
-
-

Themes!

-

Pick from a variety of themes to customize your experience.

- -

Save Data Management

Export your saved data on this site and import it on another site. From 671a9a0e1f71ff5b270f2c6ed836db1549ca63fd Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 6 May 2026 13:25:52 -0400 Subject: [PATCH 059/115] feat: added a new cursor effect --- static/assets/css/global.css | 22 ++++++ static/assets/js/main.js | 127 +++++++++++++++++++++++++++++++++++ static/settings.html | 1 + 3 files changed, 150 insertions(+) diff --git a/static/assets/css/global.css b/static/assets/css/global.css index 1de38ce362..2288fd34e4 100644 --- a/static/assets/css/global.css +++ b/static/assets/css/global.css @@ -153,4 +153,26 @@ body { @keyframes animStar { from { transform: translateY(0px); } to { transform: translateY(-2000px); } +} +/* Rainbow Trail Cursor */ +body.rainbow-trail-cursor { + cursor: none; +} + +#rainbow-trail-cursor { + position: fixed; + width: 8px; + height: 8px; + background: #fff; + border-radius: 50%; + pointer-events: none; + z-index: 9999; + transform: translate(-50%, -50%); + mix-blend-mode: difference; + transition: width 0.2s ease, height 0.2s ease; +} + +body.rainbow-trail-cursor:active #rainbow-trail-cursor { + width: 14px; + height: 14px; } \ No newline at end of file diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 13fc415f80..63751fa37f 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -324,5 +324,132 @@ document.addEventListener("DOMContentLoaded", () => { requestAnimationFrame(animate); })(); } + } else if (localStorage.getItem("pointer") === "rainbow-trail") { + // Rainbow Trail Particles (based on codepen.io/Jiironimo/pen/vEXbVNP) + if (!document.getElementById("pointer-canvas")) { + const cursorDot = document.createElement("div"); + cursorDot.id = "rainbow-trail-cursor"; + document.body.appendChild(cursorDot); + document.body.classList.add("rainbow-trail-cursor"); + + const canvas = document.createElement("canvas"); + canvas.id = "pointer-canvas"; + document.body.appendChild(canvas); + + const ctx = canvas.getContext("2d"); + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + + let W = canvas.width; + let H = canvas.height; + let mx = W / 2; + let my = H / 2; + let clicking = false; + let hue = 0; + const particles = []; + + window.addEventListener("resize", () => { + W = canvas.width = window.innerWidth; + H = canvas.height = window.innerHeight; + }); + + window.addEventListener("mousemove", e => { + mx = e.clientX; + my = e.clientY; + cursorDot.style.left = mx + "px"; + cursorDot.style.top = my + "px"; + }); + + window.addEventListener("mousedown", () => (clicking = true)); + window.addEventListener("mouseup", () => (clicking = false)); + + class RainbowTrailParticle { + constructor(x, y, isClicking) { + this.x = x + (Math.random() - 0.5) * (isClicking ? 18 : 4); + this.y = y + (Math.random() - 0.5) * (isClicking ? 18 : 4); + + const speed = isClicking ? 1.5 + Math.random() * 3.5 : 0.4 + Math.random() * 1.2; + const angle = Math.random() * Math.PI * 2; + + this.vx = Math.cos(angle) * speed; + this.vy = Math.sin(angle) * speed - (isClicking ? 0 : 0.5); + this.life = 1; + this.decay = isClicking ? 0.018 + Math.random() * 0.025 : 0.012 + Math.random() * 0.018; + this.size = isClicking ? 3 + Math.random() * 7 : 1.5 + Math.random() * 3.5; + this.hue = hue + (Math.random() - 0.5) * 40; + this.sat = 80 + Math.random() * 20; + this.lit = 55 + Math.random() * 25; + this.shape = isClicking ? Math.floor(Math.random() * 3) : 0; + this.rot = Math.random() * Math.PI * 2; + this.rotSpd = (Math.random() - 0.5) * 0.2; + } + + update() { + this.x += this.vx; + this.y += this.vy; + this.vy += 0.04; + this.vx *= 0.98; + this.life -= this.decay; + this.rot += this.rotSpd; + this.size *= 0.992; + } + + draw() { + if (this.life <= 0) return; + ctx.save(); + ctx.globalAlpha = Math.max(0, this.life * this.life); + ctx.fillStyle = `hsl(${this.hue},${this.sat}%,${this.lit}%)`; + ctx.shadowColor = `hsl(${this.hue},${this.sat}%,${this.lit}%)`; + ctx.shadowBlur = this.size * 3; + ctx.translate(this.x, this.y); + ctx.rotate(this.rot); + + if (this.shape === 1) { + ctx.fillRect(-this.size / 2, -this.size / 2, this.size, this.size); + } else if (this.shape === 2) { + ctx.beginPath(); + const r1 = this.size, + r2 = this.size * 0.4, + pts = 4; + for (let i = 0; i < pts * 2; i++) { + const r = i % 2 === 0 ? r1 : r2; + const ang = (i / (pts * 2)) * Math.PI * 2 - Math.PI / 2; + i === 0 ? ctx.moveTo(Math.cos(ang) * r, Math.sin(ang) * r) : ctx.lineTo(Math.cos(ang) * r, Math.sin(ang) * r); + } + ctx.closePath(); + ctx.fill(); + } else { + ctx.beginPath(); + ctx.arc(0, 0, this.size, 0, Math.PI * 2); + ctx.fill(); + } + + ctx.restore(); + } + } + + function spawnTrail() { + const count = clicking ? 6 : 2; + for (let i = 0; i < count; i++) { + particles.push(new RainbowTrailParticle(mx, my, clicking)); + } + } + + (function loop() { + requestAnimationFrame(loop); + ctx.clearRect(0, 0, W, H); + + hue = (hue + 0.8) % 360; + spawnTrail(); + + for (let i = particles.length - 1; i >= 0; i--) { + particles[i].update(); + particles[i].draw(); + if (particles[i].life <= 0 || particles[i].size < 0.3) { + particles.splice(i, 1); + } + } + })(); + } } }); diff --git a/static/settings.html b/static/settings.html index 9ee79f8d75..072291cc1b 100644 --- a/static/settings.html +++ b/static/settings.html @@ -185,6 +185,7 @@

Visual Customization

From 00df2a3aa12d5d201c0b9ddaeb5c989aac7d6f24 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 6 May 2026 13:34:44 -0400 Subject: [PATCH 060/115] fix(cursor): prevent rainbow trail from spawning at page center before movement --- static/assets/js/main.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 63751fa37f..fbcf15efbb 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -329,6 +329,7 @@ document.addEventListener("DOMContentLoaded", () => { if (!document.getElementById("pointer-canvas")) { const cursorDot = document.createElement("div"); cursorDot.id = "rainbow-trail-cursor"; + cursorDot.style.visibility = "hidden"; document.body.appendChild(cursorDot); document.body.classList.add("rainbow-trail-cursor"); @@ -342,8 +343,8 @@ document.addEventListener("DOMContentLoaded", () => { let W = canvas.width; let H = canvas.height; - let mx = W / 2; - let my = H / 2; + let mx = null; + let my = null; let clicking = false; let hue = 0; const particles = []; @@ -358,6 +359,7 @@ document.addEventListener("DOMContentLoaded", () => { my = e.clientY; cursorDot.style.left = mx + "px"; cursorDot.style.top = my + "px"; + cursorDot.style.visibility = "visible"; }); window.addEventListener("mousedown", () => (clicking = true)); @@ -429,6 +431,7 @@ document.addEventListener("DOMContentLoaded", () => { } function spawnTrail() { + if (mx === null || my === null) return; const count = clicking ? 6 : 2; for (let i = 0; i < count; i++) { particles.push(new RainbowTrailParticle(mx, my, clicking)); From c11dd197f4cc48d5d4ce901517abf9c0ab8783d4 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 6 May 2026 13:54:23 -0400 Subject: [PATCH 061/115] feat: added a new cursor effect (blue-orbs) --- static/assets/css/global.css | 64 ++++++++++++++++++++++++ static/assets/js/main.js | 96 ++++++++++++++++++++++++++++++++++++ static/settings.html | 1 + 3 files changed, 161 insertions(+) diff --git a/static/assets/css/global.css b/static/assets/css/global.css index 2288fd34e4..5a1a55011a 100644 --- a/static/assets/css/global.css +++ b/static/assets/css/global.css @@ -175,4 +175,68 @@ body.rainbow-trail-cursor { body.rainbow-trail-cursor:active #rainbow-trail-cursor { width: 14px; height: 14px; +} + +/* Blue Orbs Cursor */ +body.blue-orbs-cursor { + cursor: none; +} + +.blue-orbs-cursor .cursor-glow, +.blue-orbs-cursor .cursor-core, +.blue-orbs-cursor .orb-trail, +.blue-orbs-cursor .orb-spark { + position: fixed; + pointer-events: none; + border-radius: 50%; + transform: translate(-50%, -50%); +} + +.blue-orbs-cursor .cursor-glow { + width: 140px; + height: 140px; + background: radial-gradient(circle, rgba(255,255,255,0.28), rgba(0,200,255,0.12), transparent 70%); + filter: blur(10px); + mix-blend-mode: screen; + z-index: 9998; + visibility: hidden; +} + +.blue-orbs-cursor .cursor-core { + width: 16px; + height: 16px; + background: radial-gradient(circle, #ffffff 0%, #7dd3fc 45%, #22d3ee 100%); + box-shadow: + 0 0 10px rgba(255,255,255,0.8), + 0 0 20px rgba(34,211,238,0.8), + 0 0 40px rgba(34,211,238,0.4); + z-index: 9999; + visibility: hidden; +} + +.blue-orbs-cursor .orb-trail { + mix-blend-mode: screen; + background: radial-gradient(circle, rgba(255,255,255,0.9), rgba(56,189,248,0.45), rgba(168,85,247,0.15), transparent 72%); + filter: blur(2px); + position: fixed; + animation: orbFadeTrail linear forwards; +} + +.blue-orbs-cursor .orb-spark { + width: 6px; + height: 6px; + background: radial-gradient(circle, #fff, #67e8f9 60%, transparent 75%); + box-shadow: 0 0 10px rgba(103,232,249,0.9); + position: fixed; + animation: orbSparkFly 800ms linear forwards; +} + +@keyframes orbFadeTrail { + 0% { opacity: 1; transform: translate(-50%, -50%) scale(1); } + 100% { opacity: 0; transform: translate(-50%, -50%) scale(0.2); } +} + +@keyframes orbSparkFly { + 0% { opacity: 1; transform: translate(-50%, -50%) scale(1); } + 100% { opacity: 0; transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(0.2); } } \ No newline at end of file diff --git a/static/assets/js/main.js b/static/assets/js/main.js index fbcf15efbb..2e988df096 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -454,5 +454,101 @@ document.addEventListener("DOMContentLoaded", () => { } })(); } + } else if (localStorage.getItem("pointer") === "blue-orbs") { + // Blue Orbs cursor effect (based on codepen.io/perror12/pen/JoRwZwg ) + if (!document.getElementById("blue-orbs-glow")) { + document.body.classList.add("blue-orbs-cursor"); + + const glow = document.createElement("div"); + glow.id = "blue-orbs-glow"; + glow.className = "cursor-glow"; + document.body.appendChild(glow); + + const core = document.createElement("div"); + core.id = "blue-orbs-core"; + core.className = "cursor-core"; + document.body.appendChild(core); + + let mouseX = null; + let mouseY = null; + let glowX = 0; + let glowY = 0; + let lastX = 0; + let lastY = 0; + + function createTrail(x, y, speed) { + const trail = document.createElement("div"); + trail.className = "orb-trail"; + const size = Math.max(18, Math.min(60, 20 + speed * 0.35)); + trail.style.width = `${size}px`; + trail.style.height = `${size}px`; + trail.style.left = `${x}px`; + trail.style.top = `${y}px`; + trail.style.animationDuration = `${0.5 + Math.random() * 0.35}s`; + document.body.appendChild(trail); + setTimeout(() => trail.remove(), 900); + } + + function createSpark(x, y) { + const spark = document.createElement("div"); + spark.className = "orb-spark"; + spark.style.left = `${x}px`; + spark.style.top = `${y}px`; + spark.style.setProperty("--dx", `${(Math.random() - 0.5) * 80}px`); + spark.style.setProperty("--dy", `${(Math.random() - 0.5) * 80}px`); + document.body.appendChild(spark); + setTimeout(() => spark.remove(), 850); + } + + window.addEventListener("mousemove", e => { + mouseX = e.clientX; + mouseY = e.clientY; + + if (core.style.visibility !== "visible") { + core.style.visibility = "visible"; + glow.style.visibility = "visible"; + glowX = mouseX; + glowY = mouseY; + lastX = mouseX; + lastY = mouseY; + } + + const dx = mouseX - lastX; + const dy = mouseY - lastY; + const speed = Math.sqrt(dx * dx + dy * dy); + + core.style.left = `${mouseX}px`; + core.style.top = `${mouseY}px`; + + createTrail(mouseX, mouseY, speed); + if (speed > 25) { + createSpark(mouseX, mouseY); + createSpark(mouseX, mouseY); + } + + lastX = mouseX; + lastY = mouseY; + }); + + window.addEventListener("mousedown", () => { + core.style.transform = "translate(-50%, -50%) scale(1.8)"; + glow.style.transform = "translate(-50%, -50%) scale(1.2)"; + }); + + window.addEventListener("mouseup", () => { + core.style.transform = "translate(-50%, -50%) scale(1)"; + glow.style.transform = "translate(-50%, -50%) scale(1)"; + }); + + (function animateGlow() { + if (mouseX !== null) { + glowX += (mouseX - glowX) * 0.15; + glowY += (mouseY - glowY) * 0.15; + glow.style.left = `${glowX}px`; + glow.style.top = `${glowY}px`; + } + requestAnimationFrame(animateGlow); + })(); + } } }); diff --git a/static/settings.html b/static/settings.html index 072291cc1b..3a8dd13257 100644 --- a/static/settings.html +++ b/static/settings.html @@ -188,6 +188,7 @@

Visual Customization

+
From 911029562b702a46f60d17ad071f3f7c1ccfdcc2 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 6 May 2026 14:27:11 -0400 Subject: [PATCH 062/115] feat: added a new cursor effect (the-sims) --- static/assets/css/global.css | 43 ++++++++ static/assets/js/main.js | 189 +++++++++++++++++++++++++++++++++++ static/settings.html | 1 + 3 files changed, 233 insertions(+) diff --git a/static/assets/css/global.css b/static/assets/css/global.css index 5a1a55011a..db9cc8ac62 100644 --- a/static/assets/css/global.css +++ b/static/assets/css/global.css @@ -239,4 +239,47 @@ body.blue-orbs-cursor { @keyframes orbSparkFly { 0% { opacity: 1; transform: translate(-50%, -50%) scale(1); } 100% { opacity: 0; transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(0.2); } +} + +/* The Sims Cursor (Based on codepen.io/Margarita-the-solid/pen/LERbOMR) */ +body.the-sims-cursor { + cursor: none; +} + +#the-sims-cursor { + position: fixed; + pointer-events: none; + z-index: 9999; + width: 20px; + height: 28px; + transform: translate(-50%, -50%); + visibility: hidden; +} + +.sims-pt { + position: fixed; + pointer-events: none; + font-weight: 700; + font-size: 0.9rem; + opacity: 0; + z-index: 9998; + animation: simsPtUp var(--d, 1.3s) ease-out var(--dl, 0s) forwards; +} + +@keyframes simsPtUp { + 0% { opacity: 0.8; transform: translateY(0) scale(1); } + 100% { opacity: 0; transform: translateY(-100px) scale(0.1); } +} + +.sims-halo { + position: fixed; + border-radius: 50%; + pointer-events: none; + transform: translate(-50%, -50%); + animation: simsHalo 2.6s ease-in-out infinite; +} + +@keyframes simsHalo { + 0%, 100% { opacity: 0.6; transform: translate(-50%, -50%) scale(1); } + 50% { opacity: 0.1; transform: translate(-50%, -50%) scale(1.12); } } \ No newline at end of file diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 2e988df096..4477ad33bd 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -550,5 +550,194 @@ document.addEventListener("DOMContentLoaded", () => { requestAnimationFrame(animateGlow); })(); } + } else if (localStorage.getItem("pointer") === "the-sims") { + // The Sims Cursor (based on codepen.io/Margarita-the-solid/pen/LERbOMR) + if (!document.getElementById("the-sims-cursor")) { + document.body.classList.add("the-sims-cursor"); + + const NS = "http://www.w3.org/2000/svg"; + const cursorSvg = document.createElementNS(NS, "svg"); + cursorSvg.id = "the-sims-cursor"; + cursorSvg.setAttribute("viewBox", "-110 -160 220 310"); + cursorSvg.setAttribute("width", "44"); + cursorSvg.setAttribute("height", "62"); + cursorSvg.setAttribute("overflow", "visible"); + document.body.appendChild(cursorSvg); + + const halo1 = document.createElement("div"); + halo1.className = "sims-halo"; + halo1.style.cssText = "width:40px;height:40px;border:1.5px solid hsla(110,100%,60%,0.26);"; + document.body.appendChild(halo1); + + const halo2 = document.createElement("div"); + halo2.className = "sims-halo"; + halo2.style.cssText = "width:56px;height:56px;border:1px solid hsla(110,100%,60%,0.1);animation-delay:0.7s;"; + document.body.appendChild(halo2); + + const SCL = 98; + const V = [ + [0, -1.85, 0], + [0, 1.85, 0], + [1, 0, 0], + [0, 0, 1], + [-1, 0, 0], + [0, 0, -1], + ]; + const FACES = [ + [0, 2, 3, 0.68], + [0, 3, 4, 0.9], + [0, 4, 5, 0.28], + [0, 5, 2, 0.14], + [1, 3, 2, 0.82], + [1, 4, 3, 0.34], + [1, 5, 4, 0.16], + [1, 2, 5, 0.1], + ]; + + const polys = FACES.map(() => { + const p = document.createElementNS(NS, "polygon"); + p.setAttribute("stroke-linejoin", "round"); + cursorSvg.appendChild(p); + return p; + }); + + const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v)); + const dot3 = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + const cross3 = ([ax, ay, az], [bx, by, bz]) => [ay * bz - az * by, az * bx - ax * bz, ax * by - ay * bx]; + const norm3 = v => { + const l = Math.hypot(...v) || 1; + return v.map(x => x / l); + }; + const rotY = ([x, y, z], c, s) => [x * c + z * s, y, -x * s + z * c]; + + function projectV(v, c, s) { + const [rx, ry, rz] = rotY(v, c, s); + const fov = 7 / (7 - rz); + return { x: rx * SCL * fov, y: ry * SCL * fov, z: rz }; + } + + const LIGHT = norm3([-0.3, -0.55, 1.0]); + let glowHue = 110; + + function renderPlumbob(ts) { + const t = ts * 0.001; + const ry = t * 0.5; + const c = Math.cos(ry), + s = Math.sin(ry); + glowHue = 108 + Math.sin(t * 0.14) * 13; + + const gl = 54 + Math.sin(t * 2.7) * 9; + const gr = 15 + Math.sin(t * 2.7) * 6; + cursorSvg.style.filter = `drop-shadow(0 0 ${gr}px hsl(${glowHue},100%,${gl}%)) ` + `drop-shadow(0 0 ${(gr * 2.8).toFixed(0)}px hsla(${glowHue},100%,${gl - 12}%,.38))`; + + const proj = V.map(v => projectV(v, c, s)); + + const faceData = FACES.map((face, i) => { + const [vi0, vi1, vi2, baseLum] = face; + const rv0 = rotY(V[vi0], c, s); + const rv1 = rotY(V[vi1], c, s); + const rv2 = rotY(V[vi2], c, s); + const normal = norm3( + cross3( + rv1.map((v, j) => v - rv0[j]), + rv2.map((v, j) => v - rv0[j]), + ), + ); + const facing = normal[2] > 0.005; + const diffuse = clamp(dot3(normal, LIGHT), 0, 1); + const lit = baseLum * 0.65 + diffuse * 0.25 + 0.1; + const L = clamp(lit * 82, 10, 91); + const fh = glowHue + (vi0 === 1 ? -9 : 0); + const p0 = proj[vi0], + p1 = proj[vi1], + p2 = proj[vi2]; + const fmt = n => n.toFixed(1); + return { + i, + facing, + pts: `${fmt(p0.x)},${fmt(p0.y)} ${fmt(p1.x)},${fmt(p1.y)} ${fmt(p2.x)},${fmt(p2.y)}`, + fill: `hsl(${fh.toFixed(1)},65%,${L.toFixed(1)}%)`, + strokeA: (0.08 + (1 - L / 91) * 0.14).toFixed(2), + z: (p0.z + p1.z + p2.z) / 3, + }; + }); + + faceData + .filter(f => !f.facing) + .forEach(fd => { + polys[fd.i].setAttribute("fill", "none"); + polys[fd.i].setAttribute("stroke", "none"); + cursorSvg.insertBefore(polys[fd.i], cursorSvg.firstChild); + }); + faceData + .filter(f => f.facing) + .sort((a, b) => b.z - a.z) + .forEach(fd => { + const p = polys[fd.i]; + p.setAttribute("points", fd.pts); + p.setAttribute("fill", fd.fill); + p.setAttribute("stroke", `hsla(0,0%,0%,${fd.strokeA})`); + p.setAttribute("stroke-width", "1.2"); + cursorSvg.appendChild(p); + }); + + [halo1, halo2].forEach((h, i) => { + h.style.border = `${i === 0 ? 1.5 : 1}px solid hsla(${glowHue},100%,60%,${i === 0 ? 0.26 : 0.1})`; + }); + + requestAnimationFrame(renderPlumbob); + } + requestAnimationFrame(renderPlumbob); + + const COLS = ["#39FF14", "#a8ff78", "#00D4FF", "#FFE600", "#9B5DE5"]; + + function spawnSimsPt(x, y, size = 1) { + const el = document.createElement("div"); + el.className = "sims-pt"; + el.textContent = Math.random() < 0.7 ? "§" : "✦"; + el.style.left = x + "px"; + el.style.top = y + "px"; + el.style.color = COLS[Math.floor(Math.random() * COLS.length)]; + el.style.fontSize = size + "rem"; + const d = 0.8 + Math.random() * 1.2; + el.style.setProperty("--d", d + "s"); + document.body.appendChild(el); + setTimeout(() => el.remove(), (d + 0.2) * 1000); + } + + const simsInterval = setInterval(() => { + if (localStorage.getItem("pointer") !== "the-sims") { + clearInterval(simsInterval); + return; + } + spawnSimsPt(window.innerWidth * (0.1 + Math.random() * 0.8), window.innerHeight * (0.4 + Math.random() * 0.45), 0.6 + Math.random() * 0.5); + }, 420); + + const simsClickHandler = e => { + for (let i = 0; i < 12; i++) { + const ang = (i / 12) * Math.PI * 2; + const r = 20 + Math.random() * 50; + spawnSimsPt(e.clientX + Math.cos(ang) * r, e.clientY + Math.sin(ang) * r, 0.5 + Math.random() * 0.7); + } + }; + document.addEventListener("click", simsClickHandler); + + let simsMouseX = null; + let simsMouseY = null; + + document.addEventListener("mousemove", e => { + simsMouseX = e.clientX; + simsMouseY = e.clientY; + + cursorSvg.style.left = simsMouseX + "px"; + cursorSvg.style.top = simsMouseY + "px"; + cursorSvg.style.visibility = "visible"; + + halo1.style.left = simsMouseX + "px"; + halo1.style.top = simsMouseY + "px"; + halo2.style.left = simsMouseX + "px"; + halo2.style.top = simsMouseY + "px"; + }); + } } }); diff --git a/static/settings.html b/static/settings.html index 3a8dd13257..877c06d0f6 100644 --- a/static/settings.html +++ b/static/settings.html @@ -189,6 +189,7 @@

Visual Customization

+ From c36abd9eb671de9871530752fc493c94e40e9a81 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 6 May 2026 14:42:54 -0400 Subject: [PATCH 063/115] feat: added a new cursor effect (red-circle) --- static/assets/css/global.css | 27 +++++++++++++++ static/assets/js/main.js | 67 ++++++++++++++++++++++++++++++++++++ static/settings.html | 1 + 3 files changed, 95 insertions(+) diff --git a/static/assets/css/global.css b/static/assets/css/global.css index db9cc8ac62..3feb323a11 100644 --- a/static/assets/css/global.css +++ b/static/assets/css/global.css @@ -282,4 +282,31 @@ body.the-sims-cursor { @keyframes simsHalo { 0%, 100% { opacity: 0.6; transform: translate(-50%, -50%) scale(1); } 50% { opacity: 0.1; transform: translate(-50%, -50%) scale(1.12); } +} + +/* Red Circle cursor (Based on codepen.io/RoshitShrestha/pen/KwgVGwB) */ +body.red-circle-cursor, +body.red-circle-cursor *:hover { + cursor: none; +} + +#red-circle-cursor { + position: fixed; + top: 0; + left: 0; + width: 64px; + height: 64px; + transform: translate(-50%, -50%); + pointer-events: none; + z-index: 9999; + color: #df492f; + mix-blend-mode: difference; + visibility: hidden; +} + +#red-circle-cursor svg { + overflow: visible !important; + position: absolute; + top: 0; + left: 0; } \ No newline at end of file diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 4477ad33bd..22554695de 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -550,6 +550,73 @@ document.addEventListener("DOMContentLoaded", () => { requestAnimationFrame(animateGlow); })(); } + } else if (localStorage.getItem("pointer") === "red-circle") { + // Red Circle cursor (based on codepen.io/RoshitShrestha/pen/KwgVGwB) + if (!document.getElementById("red-circle-cursor")) { + document.body.classList.add("red-circle-cursor"); + + const cursorEl = document.createElement("div"); + cursorEl.id = "red-circle-cursor"; + cursorEl.innerHTML = ` + + + + + + + + + + `; + document.body.appendChild(cursorEl); + + function loadScript(src, onload) { + const s = document.createElement("script"); + s.src = src; + s.onload = onload; + document.head.appendChild(s); + } + + function initRedCircle() { + gsap.registerPlugin(MorphSVGPlugin); + + const xTo = gsap.quickTo(cursorEl, "x", { duration: 0.2, ease: "power3" }); + const yTo = gsap.quickTo(cursorEl, "y", { duration: 0.2, ease: "power3" }); + + window.addEventListener("mousemove", e => { + cursorEl.style.visibility = "visible"; + xTo(e.clientX); + yTo(e.clientY); + }); + + const cursorTl = gsap.timeline({ paused: true }); + cursorTl.to("#rc-cursorDot", { + morphSVG: "#rc-iBeamPath", + duration: 0.3, + ease: "power2.inOut", + }); + + const morphToHold = () => gsap.to("#rc-cursorDot", { morphSVG: "#rc-iBeamHold", duration: 0.4, ease: "back.out(3)" }); + const morphToIBeam = () => gsap.to("#rc-cursorDot", { morphSVG: "#rc-iBeamPath", duration: 0.4, ease: "back.out(3)" }); + + document.querySelectorAll("[data-text-hover]").forEach(el => { + el.addEventListener("mouseenter", () => cursorTl.play()); + el.addEventListener("mouseleave", () => cursorTl.reverse()); + el.addEventListener("mousedown", morphToHold); + el.addEventListener("mouseup", morphToIBeam); + }); + } + + if (typeof gsap === "undefined") { + loadScript("https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js", () => { + loadScript("https://assets.codepen.io/16327/MorphSVGPlugin3.min.js", initRedCircle); + }); + } else if (typeof MorphSVGPlugin === "undefined") { + loadScript("https://assets.codepen.io/16327/MorphSVGPlugin3.min.js", initRedCircle); + } else { + initRedCircle(); + } + } } else if (localStorage.getItem("pointer") === "the-sims") { // The Sims Cursor (based on codepen.io/Margarita-the-solid/pen/LERbOMR) if (!document.getElementById("the-sims-cursor")) { diff --git a/static/settings.html b/static/settings.html index 877c06d0f6..2b5f35d305 100644 --- a/static/settings.html +++ b/static/settings.html @@ -187,6 +187,7 @@

Visual Customization

+ From edc2d154ca7797765fc9430f21ae1b430f9d828e Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 6 May 2026 14:52:51 -0400 Subject: [PATCH 064/115] fix: reduce shakiness of red-circle cursor --- static/assets/js/main.js | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 22554695de..17b4525d53 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -580,15 +580,31 @@ document.addEventListener("DOMContentLoaded", () => { function initRedCircle() { gsap.registerPlugin(MorphSVGPlugin); - const xTo = gsap.quickTo(cursorEl, "x", { duration: 0.2, ease: "power3" }); - const yTo = gsap.quickTo(cursorEl, "y", { duration: 0.2, ease: "power3" }); + let rcTargetX = null, + rcTargetY = null; + let rcCurX = 0, + rcCurY = 0; window.addEventListener("mousemove", e => { + if (rcTargetX === null) { + rcCurX = e.clientX; + rcCurY = e.clientY; + } + rcTargetX = e.clientX; + rcTargetY = e.clientY; cursorEl.style.visibility = "visible"; - xTo(e.clientX); - yTo(e.clientY); }); + (function rcFollow() { + if (rcTargetX !== null) { + rcCurX += (rcTargetX - rcCurX) * 0.18; + rcCurY += (rcTargetY - rcCurY) * 0.18; + cursorEl.style.left = rcCurX + "px"; + cursorEl.style.top = rcCurY + "px"; + } + requestAnimationFrame(rcFollow); + })(); + const cursorTl = gsap.timeline({ paused: true }); cursorTl.to("#rc-cursorDot", { morphSVG: "#rc-iBeamPath", From d375da2bf6734568dd5c7a3a6a152729653f090c Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 8 May 2026 13:53:56 -0400 Subject: [PATCH 065/115] fix(cursor): show cursor over iframes, keep trails above elements, hide on page leave, and improve sims trail logic (#1205) --- static/assets/css/global.css | 2 + static/assets/js/main.js | 173 ++++++++++++++++++++++++++++++++--- 2 files changed, 163 insertions(+), 12 deletions(-) diff --git a/static/assets/css/global.css b/static/assets/css/global.css index 3feb323a11..3661188f41 100644 --- a/static/assets/css/global.css +++ b/static/assets/css/global.css @@ -219,6 +219,7 @@ body.blue-orbs-cursor { background: radial-gradient(circle, rgba(255,255,255,0.9), rgba(56,189,248,0.45), rgba(168,85,247,0.15), transparent 72%); filter: blur(2px); position: fixed; + z-index: 9997; animation: orbFadeTrail linear forwards; } @@ -228,6 +229,7 @@ body.blue-orbs-cursor { background: radial-gradient(circle, #fff, #67e8f9 60%, transparent 75%); box-shadow: 0 0 10px rgba(103,232,249,0.9); position: fixed; + z-index: 9997; animation: orbSparkFly 800ms linear forwards; } diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 17b4525d53..4a4de1e6ce 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -70,6 +70,41 @@ function reconstructSafeUrl(raw) { } } + +function setupIframeTracking(moveCallback, hideCallback) { + function attachToIframe(iframe) { + if (iframe.dataset.cursorTracked) return; + iframe.dataset.cursorTracked = "1"; + + function tryAttach() { + try { + const iwin = iframe.contentWindow; + if (!iwin) return; + iwin.addEventListener("mousemove", e => { + const rect = iframe.getBoundingClientRect(); + moveCallback(rect.left + e.clientX, rect.top + e.clientY); + }); + iwin.addEventListener("mouseleave", () => hideCallback()); + } catch (err) { + } + } + + if (iframe.contentDocument && iframe.contentDocument.readyState === "complete") { + tryAttach(); + } else { + iframe.addEventListener("load", tryAttach); + } + } + + document.querySelectorAll("iframe").forEach(attachToIframe); + new MutationObserver(mutations => { + mutations.forEach(m => m.addedNodes.forEach(n => { + if (n.tagName === "IFRAME") attachToIframe(n); + else if (n.querySelectorAll) n.querySelectorAll("iframe").forEach(attachToIframe); + })); + }).observe(document.body, { childList: true, subtree: true }); +} + document.addEventListener("DOMContentLoaded", () => { const blockedHostnames = ["gointerstellar.app"]; @@ -181,6 +216,18 @@ document.addEventListener("DOMContentLoaded", () => { for (let i = 0; i < bNum; i++) spots.push(new Particle()); }); + setupIframeTracking( + (x, y) => { + mouse.x = x; + mouse.y = y; + for (let i = 0; i < bNum; i++) spots.push(new Particle()); + }, + () => { + mouse.x = undefined; + mouse.y = undefined; + } + ); + window.addEventListener("resize", () => { canvas.width = window.innerWidth; canvas.height = window.innerHeight; @@ -302,6 +349,15 @@ document.addEventListener("DOMContentLoaded", () => { spawn(mouse.x, mouse.y, 1); }); + setupIframeTracking( + (x, y) => { + mouse.x = x; + mouse.y = y; + spawn(x, y, 1); + }, + () => {} + ); + window.addEventListener("click", e => spawn(e.clientX, e.clientY, 40)); window.addEventListener("mousedown", () => { @@ -362,6 +418,25 @@ document.addEventListener("DOMContentLoaded", () => { cursorDot.style.visibility = "visible"; }); + document.addEventListener("mouseleave", () => { + mx = null; + my = null; + cursorDot.style.visibility = "hidden"; + }); + + setupIframeTracking( + (x, y) => { + mx = x; my = y; + cursorDot.style.left = mx + "px"; + cursorDot.style.top = my + "px"; + cursorDot.style.visibility = "visible"; + }, + () => { + mx = null; my = null; + cursorDot.style.visibility = "hidden"; + } + ); + window.addEventListener("mousedown", () => (clicking = true)); window.addEventListener("mouseup", () => (clicking = false)); @@ -530,6 +605,36 @@ document.addEventListener("DOMContentLoaded", () => { lastY = mouseY; }); + document.addEventListener("mouseleave", () => { + mouseX = null; + mouseY = null; + core.style.visibility = "hidden"; + glow.style.visibility = "hidden"; + }); + + setupIframeTracking( + (x, y) => { + mouseX = x; mouseY = y; + if (core.style.visibility !== "visible") { + core.style.visibility = "visible"; + glow.style.visibility = "visible"; + glowX = x; glowY = y; lastX = x; lastY = y; + } + const dx = mouseX - lastX, dy = mouseY - lastY; + const speed = Math.sqrt(dx * dx + dy * dy); + core.style.left = `${mouseX}px`; + core.style.top = `${mouseY}px`; + createTrail(mouseX, mouseY, speed); + if (speed > 25) { createSpark(mouseX, mouseY); createSpark(mouseX, mouseY); } + lastX = mouseX; lastY = mouseY; + }, + () => { + mouseX = null; mouseY = null; + core.style.visibility = "hidden"; + glow.style.visibility = "hidden"; + } + ); + window.addEventListener("mousedown", () => { core.style.transform = "translate(-50%, -50%) scale(1.8)"; glow.style.transform = "translate(-50%, -50%) scale(1.2)"; @@ -585,16 +690,24 @@ document.addEventListener("DOMContentLoaded", () => { let rcCurX = 0, rcCurY = 0; - window.addEventListener("mousemove", e => { - if (rcTargetX === null) { - rcCurX = e.clientX; - rcCurY = e.clientY; - } - rcTargetX = e.clientX; - rcTargetY = e.clientY; + function rcMoveTo(x, y) { + if (rcTargetX === null) { rcCurX = x; rcCurY = y; } + rcTargetX = x; rcTargetY = y; cursorEl.style.visibility = "visible"; + } + + window.addEventListener("mousemove", e => rcMoveTo(e.clientX, e.clientY)); + + document.addEventListener("mouseleave", () => { + rcTargetX = null; rcTargetY = null; + cursorEl.style.visibility = "hidden"; }); + setupIframeTracking( + (x, y) => rcMoveTo(x, y), + () => { rcTargetX = null; rcTargetY = null; cursorEl.style.visibility = "hidden"; } + ); + (function rcFollow() { if (rcTargetX !== null) { rcCurX += (rcTargetX - rcCurX) * 0.18; @@ -788,12 +901,21 @@ document.addEventListener("DOMContentLoaded", () => { setTimeout(() => el.remove(), (d + 0.2) * 1000); } + let simsMouseX = null; + let simsMouseY = null; + const simsInterval = setInterval(() => { if (localStorage.getItem("pointer") !== "the-sims") { clearInterval(simsInterval); return; } - spawnSimsPt(window.innerWidth * (0.1 + Math.random() * 0.8), window.innerHeight * (0.4 + Math.random() * 0.45), 0.6 + Math.random() * 0.5); + if (simsMouseX === null) return; + const spread = 60; + spawnSimsPt( + simsMouseX + (Math.random() - 0.5) * spread, + simsMouseY + (Math.random() - 0.5) * spread, + 0.6 + Math.random() * 0.5 + ); }, 420); const simsClickHandler = e => { @@ -805,9 +927,6 @@ document.addEventListener("DOMContentLoaded", () => { }; document.addEventListener("click", simsClickHandler); - let simsMouseX = null; - let simsMouseY = null; - document.addEventListener("mousemove", e => { simsMouseX = e.clientX; simsMouseY = e.clientY; @@ -821,6 +940,36 @@ document.addEventListener("DOMContentLoaded", () => { halo2.style.left = simsMouseX + "px"; halo2.style.top = simsMouseY + "px"; }); + + document.addEventListener("mouseleave", () => { + simsMouseX = null; + simsMouseY = null; + cursorSvg.style.visibility = "hidden"; + halo1.style.visibility = "hidden"; + halo2.style.visibility = "hidden"; + }); + + document.addEventListener("mouseenter", () => { + halo1.style.visibility = "visible"; + halo2.style.visibility = "visible"; + }); + + setupIframeTracking( + (x, y) => { + simsMouseX = x; simsMouseY = y; + cursorSvg.style.left = x + "px"; + cursorSvg.style.top = y + "px"; + cursorSvg.style.visibility = "visible"; + halo1.style.left = x + "px"; halo1.style.top = y + "px"; halo1.style.visibility = "visible"; + halo2.style.left = x + "px"; halo2.style.top = y + "px"; halo2.style.visibility = "visible"; + }, + () => { + simsMouseX = null; simsMouseY = null; + cursorSvg.style.visibility = "hidden"; + halo1.style.visibility = "hidden"; + halo2.style.visibility = "hidden"; + } + ); } } -}); +}); \ No newline at end of file From 60fc6446088ab776eae2932ac1df35f91b96cb5a Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 8 May 2026 14:11:53 -0400 Subject: [PATCH 066/115] refactor(cursor): separate cursor logic from main.js --- static/assets/js/cursor.js | 744 +++++++++++++++++++++++++++++++++ static/assets/js/main.js | 829 +------------------------------------ 2 files changed, 753 insertions(+), 820 deletions(-) create mode 100644 static/assets/js/cursor.js diff --git a/static/assets/js/cursor.js b/static/assets/js/cursor.js new file mode 100644 index 0000000000..dcf3ba90aa --- /dev/null +++ b/static/assets/js/cursor.js @@ -0,0 +1,744 @@ +// Loaded dynamically by main.js only when a cursor effect is active. +function setupIframeTracking(moveCallback, hideCallback) { + function attachToIframe(iframe) { + if (iframe.dataset.cursorTracked) return; + iframe.dataset.cursorTracked = "1"; + + function tryAttach() { + try { + const iwin = iframe.contentWindow; + if (!iwin) return; + iwin.addEventListener("mousemove", e => { + const rect = iframe.getBoundingClientRect(); + moveCallback(rect.left + e.clientX, rect.top + e.clientY); + }); + iwin.addEventListener("mouseleave", () => hideCallback()); + } catch (_) {} + } + + if (iframe.contentDocument && iframe.contentDocument.readyState === "complete") { + tryAttach(); + } else { + iframe.addEventListener("load", tryAttach); + } + } + + document.querySelectorAll("iframe").forEach(attachToIframe); + new MutationObserver(mutations => { + mutations.forEach(m => + m.addedNodes.forEach(n => { + if (n.tagName === "IFRAME") attachToIframe(n); + else if (n.querySelectorAll) n.querySelectorAll("iframe").forEach(attachToIframe); + }), + ); + }).observe(document.body, { childList: true, subtree: true }); +} + +function createFullscreenCanvas(id) { + const canvas = document.createElement("canvas"); + canvas.id = id; + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + document.body.appendChild(canvas); + window.addEventListener("resize", () => { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + }); + return canvas; +} + +// Based on codepen.io/tommyho/pen/ZEmjWGY +function initRainbowStars() { + if (document.getElementById("pointer-canvas")) return; + + const canvas = createFullscreenCanvas("pointer-canvas"); + const ctx = canvas.getContext("2d"); + + const bNum = 3, + bSize = 8, + bSpeed = 6, + bDep = 0.1; + const bDist = 30, + bStarVar = 2, + bHue = 4; + let spots = [], + hue = 0; + const mouse = { x: undefined, y: undefined }; + + class Particle { + constructor() { + this.x = mouse.x; + this.y = mouse.y; + this.size = Math.random() * bSize + 0.1; + this.speedX = Math.random() * bSpeed - bSpeed / 2; + this.speedY = Math.random() * bSpeed - bSpeed / 2; + this.points = Math.floor(Math.random() * bStarVar) + 5; + this.radius = Math.random() * bSize + 0.1; + this.color = "hsl(" + bHue * hue + ", 100%, 50%)"; + } + draw() { + ctx.fillStyle = this.color; + ctx.beginPath(); + star(this.x, this.y, this.radius * 2, this.radius, this.points); + ctx.fill(); + } + update() { + this.x += this.speedX; + this.y += this.speedY; + if (this.size > bDep) this.size -= bDep; + } + } + + function star(x, y, r1, r2, npts) { + const angle = (2 * Math.PI) / npts; + const half = angle / 2; + ctx.moveTo(x + Math.cos(half) * r1, y + Math.sin(half) * r1); + for (let a = 0; a <= 2 * Math.PI; a += angle) { + ctx.lineTo(x + Math.cos(a) * r2, y + Math.sin(a) * r2); + ctx.lineTo(x + Math.cos(a + half) * r1, y + Math.sin(a + half) * r1); + } + } + + function onMove(x, y) { + mouse.x = x; + mouse.y = y; + for (let i = 0; i < bNum; i++) spots.push(new Particle()); + } + + window.addEventListener("mousemove", e => onMove(e.clientX, e.clientY)); + setupIframeTracking(onMove, () => { + mouse.x = undefined; + mouse.y = undefined; + }); + + (function animate() { + ctx.clearRect(0, 0, canvas.width, canvas.height); + for (let i = 0; i < spots.length; i++) { + spots[i].update(); + spots[i].draw(); + for (let j = i; j < spots.length; j++) { + const dx = spots[i].x - spots[j].x; + const dy = spots[i].y - spots[j].y; + if (Math.sqrt(dx * dx + dy * dy) < bDist) { + ctx.beginPath(); + ctx.strokeStyle = spots[i].color; + ctx.lineWidth = spots[i].size / 3; + ctx.moveTo(spots[i].x, spots[i].y); + ctx.bezierCurveTo(spots[j].x, spots[j].y, spots[j].x, spots[i].y, spots[j].x, spots[j].y); + ctx.stroke(); + } + } + if (spots[i].size <= bDep) { + spots.splice(i, 1); + i--; + } + } + hue++; + requestAnimationFrame(animate); + })(); +} + +// Based on codepen.io/gabezink17-cmd/pen/WbGmeyR +function initWhiteOrbs() { + if (document.getElementById("pointer-canvas")) return; + + const canvas = createFullscreenCanvas("pointer-canvas"); + const ctx = canvas.getContext("2d"); + const mouse = { x: innerWidth / 2, y: innerHeight / 2 }; + let particles = []; + + class OrbParticle { + constructor(x, y) { + this.x = x; + this.y = y; + this.vx = (Math.random() - 0.5) * 4; + this.vy = (Math.random() - 0.5) * 4; + this.size = Math.random() * 3 + 1; + this.life = 100; + } + update() { + this.vx += (mouse.x - this.x) * 0.0005; + this.vy += (mouse.y - this.y) * 0.0005; + this.x += this.vx; + this.y += this.vy; + this.vx *= 0.96; + this.vy *= 0.96; + this.life -= 1; + } + draw() { + ctx.fillStyle = "white"; + ctx.globalAlpha = this.life / 100; + ctx.beginPath(); + ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); + ctx.fill(); + ctx.globalAlpha = 1; + } + } + + function spawn(x, y, n = 10) { + for (let i = 0; i < n; i++) particles.push(new OrbParticle(x, y)); + } + + function onMove(x, y) { + mouse.x = x; + mouse.y = y; + spawn(x, y, 1); + } + + window.addEventListener("mousemove", e => onMove(e.clientX, e.clientY)); + window.addEventListener("click", e => spawn(e.clientX, e.clientY, 40)); + window.addEventListener("mousedown", () => { + for (let i = 0; i < 50; i++) spawn(mouse.x, mouse.y, 1); + }); + setupIframeTracking(onMove, () => {}); + + (function animate() { + ctx.globalAlpha = 1; + ctx.clearRect(0, 0, canvas.width, canvas.height); + particles.forEach((p, i) => { + p.update(); + p.draw(); + if (p.life <= 0) particles.splice(i, 1); + }); + requestAnimationFrame(animate); + })(); +} + +// Based on codepen.io/Jiironimo/pen/vEXbVNP +function initRainbowTrail() { + if (document.getElementById("pointer-canvas")) return; + + const cursorDot = document.createElement("div"); + cursorDot.id = "rainbow-trail-cursor"; + cursorDot.style.visibility = "hidden"; + document.body.appendChild(cursorDot); + document.body.classList.add("rainbow-trail-cursor"); + + const canvas = createFullscreenCanvas("pointer-canvas"); + const ctx = canvas.getContext("2d"); + let W = canvas.width, + H = canvas.height; + let mx = null, + my = null, + clicking = false, + hue = 0; + const particles = []; + + window.addEventListener("resize", () => { + W = canvas.width; + H = canvas.height; + }); + + class RainbowTrailParticle { + constructor(x, y, isClicking) { + this.x = x + (Math.random() - 0.5) * (isClicking ? 18 : 4); + this.y = y + (Math.random() - 0.5) * (isClicking ? 18 : 4); + const speed = isClicking ? 1.5 + Math.random() * 3.5 : 0.4 + Math.random() * 1.2; + const angle = Math.random() * Math.PI * 2; + this.vx = Math.cos(angle) * speed; + this.vy = Math.sin(angle) * speed - (isClicking ? 0 : 0.5); + this.life = 1; + this.decay = isClicking ? 0.018 + Math.random() * 0.025 : 0.012 + Math.random() * 0.018; + this.size = isClicking ? 3 + Math.random() * 7 : 1.5 + Math.random() * 3.5; + this.hue = hue + (Math.random() - 0.5) * 40; + this.sat = 80 + Math.random() * 20; + this.lit = 55 + Math.random() * 25; + this.shape = isClicking ? Math.floor(Math.random() * 3) : 0; + this.rot = Math.random() * Math.PI * 2; + this.rotSpd = (Math.random() - 0.5) * 0.2; + } + update() { + this.x += this.vx; + this.y += this.vy; + this.vy += 0.04; + this.vx *= 0.98; + this.life -= this.decay; + this.rot += this.rotSpd; + this.size *= 0.992; + } + draw() { + if (this.life <= 0) return; + ctx.save(); + ctx.globalAlpha = Math.max(0, this.life * this.life); + ctx.fillStyle = `hsl(${this.hue},${this.sat}%,${this.lit}%)`; + ctx.shadowColor = ctx.fillStyle; + ctx.shadowBlur = this.size * 3; + ctx.translate(this.x, this.y); + ctx.rotate(this.rot); + if (this.shape === 1) { + ctx.fillRect(-this.size / 2, -this.size / 2, this.size, this.size); + } else if (this.shape === 2) { + ctx.beginPath(); + const r1 = this.size, + r2 = this.size * 0.4, + pts = 4; + for (let i = 0; i < pts * 2; i++) { + const r = i % 2 === 0 ? r1 : r2; + const ang = (i / (pts * 2)) * Math.PI * 2 - Math.PI / 2; + i === 0 ? ctx.moveTo(Math.cos(ang) * r, Math.sin(ang) * r) : ctx.lineTo(Math.cos(ang) * r, Math.sin(ang) * r); + } + ctx.closePath(); + ctx.fill(); + } else { + ctx.beginPath(); + ctx.arc(0, 0, this.size, 0, Math.PI * 2); + ctx.fill(); + } + ctx.restore(); + } + } + + function showAt(x, y) { + mx = x; + my = y; + cursorDot.style.left = x + "px"; + cursorDot.style.top = y + "px"; + cursorDot.style.visibility = "visible"; + } + + function hide() { + mx = null; + my = null; + cursorDot.style.visibility = "hidden"; + } + + window.addEventListener("mousemove", e => showAt(e.clientX, e.clientY)); + document.addEventListener("mouseleave", hide); + window.addEventListener("mousedown", () => (clicking = true)); + window.addEventListener("mouseup", () => (clicking = false)); + setupIframeTracking(showAt, hide); + + (function loop() { + requestAnimationFrame(loop); + ctx.clearRect(0, 0, W, H); + hue = (hue + 0.8) % 360; + if (mx !== null && my !== null) { + const count = clicking ? 6 : 2; + for (let i = 0; i < count; i++) particles.push(new RainbowTrailParticle(mx, my, clicking)); + } + for (let i = particles.length - 1; i >= 0; i--) { + particles[i].update(); + particles[i].draw(); + if (particles[i].life <= 0 || particles[i].size < 0.3) particles.splice(i, 1); + } + })(); +} + +// Based on codepen.io/perror12/pen/JoRwZwg +function initBlueOrbs() { + if (document.getElementById("blue-orbs-glow")) return; + + document.body.classList.add("blue-orbs-cursor"); + + const glow = document.createElement("div"); + glow.id = "blue-orbs-glow"; + glow.className = "cursor-glow"; + document.body.appendChild(glow); + + const core = document.createElement("div"); + core.id = "blue-orbs-core"; + core.className = "cursor-core"; + document.body.appendChild(core); + + let mouseX = null, + mouseY = null; + let glowX = 0, + glowY = 0, + lastX = 0, + lastY = 0; + + function createTrail(x, y, speed) { + const trail = document.createElement("div"); + trail.className = "orb-trail"; + const size = Math.max(18, Math.min(60, 20 + speed * 0.35)); + trail.style.cssText = `width:${size}px;height:${size}px;left:${x}px;top:${y}px;animation-duration:${0.5 + Math.random() * 0.35}s`; + document.body.appendChild(trail); + setTimeout(() => trail.remove(), 900); + } + + function createSpark(x, y) { + const spark = document.createElement("div"); + spark.className = "orb-spark"; + spark.style.left = `${x}px`; + spark.style.top = `${y}px`; + spark.style.setProperty("--dx", `${(Math.random() - 0.5) * 80}px`); + spark.style.setProperty("--dy", `${(Math.random() - 0.5) * 80}px`); + document.body.appendChild(spark); + setTimeout(() => spark.remove(), 850); + } + + function onMove(x, y) { + mouseX = x; + mouseY = y; + if (core.style.visibility !== "visible") { + core.style.visibility = "visible"; + glow.style.visibility = "visible"; + glowX = x; + glowY = y; + lastX = x; + lastY = y; + } + const dx = x - lastX, + dy = y - lastY; + const speed = Math.sqrt(dx * dx + dy * dy); + core.style.left = `${x}px`; + core.style.top = `${y}px`; + createTrail(x, y, speed); + if (speed > 25) { + createSpark(x, y); + createSpark(x, y); + } + lastX = x; + lastY = y; + } + + function hide() { + mouseX = null; + mouseY = null; + core.style.visibility = "hidden"; + glow.style.visibility = "hidden"; + } + + window.addEventListener("mousemove", e => onMove(e.clientX, e.clientY)); + document.addEventListener("mouseleave", hide); + window.addEventListener("mousedown", () => { + core.style.transform = "translate(-50%, -50%) scale(1.8)"; + glow.style.transform = "translate(-50%, -50%) scale(1.2)"; + }); + window.addEventListener("mouseup", () => { + core.style.transform = "translate(-50%, -50%) scale(1)"; + glow.style.transform = "translate(-50%, -50%) scale(1)"; + }); + setupIframeTracking(onMove, hide); + + (function animateGlow() { + if (mouseX !== null) { + glowX += (mouseX - glowX) * 0.15; + glowY += (mouseY - glowY) * 0.15; + glow.style.left = `${glowX}px`; + glow.style.top = `${glowY}px`; + } + requestAnimationFrame(animateGlow); + })(); +} + +// Based on codepen.io/RoshitShrestha/pen/KwgVGwB +function initRedCircle() { + if (document.getElementById("red-circle-cursor")) return; + + document.body.classList.add("red-circle-cursor"); + + const cursorEl = document.createElement("div"); + cursorEl.id = "red-circle-cursor"; + cursorEl.innerHTML = ` + + + + + + + + + + `; + document.body.appendChild(cursorEl); + + function loadScript(src, onload) { + const s = document.createElement("script"); + s.src = src; + s.onload = onload; + document.head.appendChild(s); + } + + function setupRedCircle() { + gsap.registerPlugin(MorphSVGPlugin); + + let rcTargetX = null, + rcTargetY = null, + rcCurX = 0, + rcCurY = 0; + + function rcMoveTo(x, y) { + if (rcTargetX === null) { + rcCurX = x; + rcCurY = y; + } + rcTargetX = x; + rcTargetY = y; + cursorEl.style.visibility = "visible"; + } + + function rcHide() { + rcTargetX = null; + rcTargetY = null; + cursorEl.style.visibility = "hidden"; + } + + window.addEventListener("mousemove", e => rcMoveTo(e.clientX, e.clientY)); + document.addEventListener("mouseleave", rcHide); + setupIframeTracking(rcMoveTo, rcHide); + + (function rcFollow() { + if (rcTargetX !== null) { + rcCurX += (rcTargetX - rcCurX) * 0.18; + rcCurY += (rcTargetY - rcCurY) * 0.18; + cursorEl.style.left = rcCurX + "px"; + cursorEl.style.top = rcCurY + "px"; + } + requestAnimationFrame(rcFollow); + })(); + + const cursorTl = gsap.timeline({ paused: true }); + cursorTl.to("#rc-cursorDot", { morphSVG: "#rc-iBeamPath", duration: 0.3, ease: "power2.inOut" }); + + document.querySelectorAll("[data-text-hover]").forEach(el => { + el.addEventListener("mouseenter", () => cursorTl.play()); + el.addEventListener("mouseleave", () => cursorTl.reverse()); + el.addEventListener("mousedown", () => gsap.to("#rc-cursorDot", { morphSVG: "#rc-iBeamHold", duration: 0.4, ease: "back.out(3)" })); + el.addEventListener("mouseup", () => gsap.to("#rc-cursorDot", { morphSVG: "#rc-iBeamPath", duration: 0.4, ease: "back.out(3)" })); + }); + } + + if (typeof gsap === "undefined") { + loadScript("https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js", () => { + loadScript("https://assets.codepen.io/16327/MorphSVGPlugin3.min.js", setupRedCircle); + }); + } else if (typeof MorphSVGPlugin === "undefined") { + loadScript("https://assets.codepen.io/16327/MorphSVGPlugin3.min.js", setupRedCircle); + } else { + setupRedCircle(); + } +} + +// Based on codepen.io/Margarita-the-solid/pen/LERbOMR +function initTheSims() { + if (document.getElementById("the-sims-cursor")) return; + + document.body.classList.add("the-sims-cursor"); + + const NS = "http://www.w3.org/2000/svg"; + const cursorSvg = document.createElementNS(NS, "svg"); + cursorSvg.id = "the-sims-cursor"; + cursorSvg.setAttribute("viewBox", "-110 -160 220 310"); + cursorSvg.setAttribute("width", "44"); + cursorSvg.setAttribute("height", "62"); + cursorSvg.setAttribute("overflow", "visible"); + document.body.appendChild(cursorSvg); + + const halo1 = document.createElement("div"); + halo1.className = "sims-halo"; + halo1.style.cssText = "width:40px;height:40px;border:1.5px solid hsla(110,100%,60%,0.26);"; + document.body.appendChild(halo1); + + const halo2 = document.createElement("div"); + halo2.className = "sims-halo"; + halo2.style.cssText = "width:56px;height:56px;border:1px solid hsla(110,100%,60%,0.1);animation-delay:0.7s;"; + document.body.appendChild(halo2); + + const SCL = 98; + const V = [ + [0, -1.85, 0], + [0, 1.85, 0], + [1, 0, 0], + [0, 0, 1], + [-1, 0, 0], + [0, 0, -1], + ]; + const FACES = [ + [0, 2, 3, 0.68], + [0, 3, 4, 0.9], + [0, 4, 5, 0.28], + [0, 5, 2, 0.14], + [1, 3, 2, 0.82], + [1, 4, 3, 0.34], + [1, 5, 4, 0.16], + [1, 2, 5, 0.1], + ]; + + const polys = FACES.map(() => { + const p = document.createElementNS(NS, "polygon"); + p.setAttribute("stroke-linejoin", "round"); + cursorSvg.appendChild(p); + return p; + }); + + const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v)); + const dot3 = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + const cross3 = ([ax, ay, az], [bx, by, bz]) => [ay * bz - az * by, az * bx - ax * bz, ax * by - ay * bx]; + const norm3 = v => { + const l = Math.hypot(...v) || 1; + return v.map(x => x / l); + }; + const rotY = ([x, y, z], c, s) => [x * c + z * s, y, -x * s + z * c]; + + function projectV(v, c, s) { + const [rx, ry, rz] = rotY(v, c, s); + const fov = 7 / (7 - rz); + return { x: rx * SCL * fov, y: ry * SCL * fov, z: rz }; + } + + const LIGHT = norm3([-0.3, -0.55, 1.0]); + let glowHue = 110; + + function renderPlumbob(ts) { + const t = ts * 0.001; + const c = Math.cos(t * 0.5), + s = Math.sin(t * 0.5); + glowHue = 108 + Math.sin(t * 0.14) * 13; + const gl = 54 + Math.sin(t * 2.7) * 9, + gr = 15 + Math.sin(t * 2.7) * 6; + cursorSvg.style.filter = `drop-shadow(0 0 ${gr}px hsl(${glowHue},100%,${gl}%)) ` + `drop-shadow(0 0 ${(gr * 2.8).toFixed(0)}px hsla(${glowHue},100%,${gl - 12}%,.38))`; + + const proj = V.map(v => projectV(v, c, s)); + + const faceData = FACES.map((face, i) => { + const [vi0, vi1, vi2, baseLum] = face; + const rv0 = rotY(V[vi0], c, s), + rv1 = rotY(V[vi1], c, s), + rv2 = rotY(V[vi2], c, s); + const normal = norm3( + cross3( + rv1.map((v, j) => v - rv0[j]), + rv2.map((v, j) => v - rv0[j]), + ), + ); + const facing = normal[2] > 0.005; + const L = clamp((baseLum * 0.65 + clamp(dot3(normal, LIGHT), 0, 1) * 0.25 + 0.1) * 82, 10, 91); + const fh = glowHue + (vi0 === 1 ? -9 : 0); + const p0 = proj[vi0], + p1 = proj[vi1], + p2 = proj[vi2]; + const fmt = n => n.toFixed(1); + return { + i, + facing, + pts: `${fmt(p0.x)},${fmt(p0.y)} ${fmt(p1.x)},${fmt(p1.y)} ${fmt(p2.x)},${fmt(p2.y)}`, + fill: `hsl(${fh.toFixed(1)},65%,${L.toFixed(1)}%)`, + strokeA: (0.08 + (1 - L / 91) * 0.14).toFixed(2), + z: (p0.z + p1.z + p2.z) / 3, + }; + }); + + faceData + .filter(f => !f.facing) + .forEach(fd => { + polys[fd.i].setAttribute("fill", "none"); + polys[fd.i].setAttribute("stroke", "none"); + cursorSvg.insertBefore(polys[fd.i], cursorSvg.firstChild); + }); + faceData + .filter(f => f.facing) + .sort((a, b) => b.z - a.z) + .forEach(fd => { + const p = polys[fd.i]; + p.setAttribute("points", fd.pts); + p.setAttribute("fill", fd.fill); + p.setAttribute("stroke", `hsla(0,0%,0%,${fd.strokeA})`); + p.setAttribute("stroke-width", "1.2"); + cursorSvg.appendChild(p); + }); + + [halo1, halo2].forEach((h, i) => { + h.style.border = `${i === 0 ? 1.5 : 1}px solid hsla(${glowHue},100%,60%,${i === 0 ? 0.26 : 0.1})`; + }); + + requestAnimationFrame(renderPlumbob); + } + requestAnimationFrame(renderPlumbob); + + const COLS = ["#39FF14", "#a8ff78", "#00D4FF", "#FFE600", "#9B5DE5"]; + let simsMouseX = null, + simsMouseY = null; + + function spawnSimsPt(x, y, size = 1) { + const el = document.createElement("div"); + el.className = "sims-pt"; + el.textContent = Math.random() < 0.7 ? "§" : "✦"; + el.style.left = x + "px"; + el.style.top = y + "px"; + el.style.color = COLS[Math.floor(Math.random() * COLS.length)]; + el.style.fontSize = size + "rem"; + const d = 0.8 + Math.random() * 1.2; + el.style.setProperty("--d", d + "s"); + document.body.appendChild(el); + setTimeout(() => el.remove(), (d + 0.2) * 1000); + } + + const simsInterval = setInterval(() => { + if (localStorage.getItem("pointer") !== "the-sims") { + clearInterval(simsInterval); + return; + } + if (simsMouseX === null) return; + const spread = 60; + spawnSimsPt(simsMouseX + (Math.random() - 0.5) * spread, simsMouseY + (Math.random() - 0.5) * spread, 0.6 + Math.random() * 0.5); + }, 420); + + document.addEventListener("click", e => { + for (let i = 0; i < 12; i++) { + const ang = (i / 12) * Math.PI * 2, + r = 20 + Math.random() * 50; + spawnSimsPt(e.clientX + Math.cos(ang) * r, e.clientY + Math.sin(ang) * r, 0.5 + Math.random() * 0.7); + } + }); + + function showAt(x, y) { + simsMouseX = x; + simsMouseY = y; + cursorSvg.style.left = x + "px"; + cursorSvg.style.top = y + "px"; + cursorSvg.style.visibility = "visible"; + halo1.style.left = x + "px"; + halo1.style.top = y + "px"; + halo1.style.visibility = "visible"; + halo2.style.left = x + "px"; + halo2.style.top = y + "px"; + halo2.style.visibility = "visible"; + } + + function hide() { + simsMouseX = null; + simsMouseY = null; + cursorSvg.style.visibility = "hidden"; + halo1.style.visibility = "hidden"; + halo2.style.visibility = "hidden"; + } + + document.addEventListener("mousemove", e => showAt(e.clientX, e.clientY)); + document.addEventListener("mouseleave", hide); + document.addEventListener("mouseenter", () => { + halo1.style.visibility = "visible"; + halo2.style.visibility = "visible"; + }); + setupIframeTracking(showAt, hide); +} + +// Based on codepen.io/Jiironimo/pen/vEXbVNP +function initBlueOrbsDom() { + if (document.getElementById("blue-orbs-glow")) return; + initBlueOrbs(); +} + +function initCursorEffect() { + const pointer = localStorage.getItem("pointer"); + switch (pointer) { + case "rainbow-stars": + initRainbowStars(); + break; + case "white-orbs": + initWhiteOrbs(); + break; + case "rainbow-trail": + initRainbowTrail(); + break; + case "blue-orbs": + initBlueOrbs(); + break; + case "red-circle": + initRedCircle(); + break; + case "the-sims": + initTheSims(); + break; + } +} diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 4a4de1e6ce..99f012a3db 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -70,41 +70,6 @@ function reconstructSafeUrl(raw) { } } - -function setupIframeTracking(moveCallback, hideCallback) { - function attachToIframe(iframe) { - if (iframe.dataset.cursorTracked) return; - iframe.dataset.cursorTracked = "1"; - - function tryAttach() { - try { - const iwin = iframe.contentWindow; - if (!iwin) return; - iwin.addEventListener("mousemove", e => { - const rect = iframe.getBoundingClientRect(); - moveCallback(rect.left + e.clientX, rect.top + e.clientY); - }); - iwin.addEventListener("mouseleave", () => hideCallback()); - } catch (err) { - } - } - - if (iframe.contentDocument && iframe.contentDocument.readyState === "complete") { - tryAttach(); - } else { - iframe.addEventListener("load", tryAttach); - } - } - - document.querySelectorAll("iframe").forEach(attachToIframe); - new MutationObserver(mutations => { - mutations.forEach(m => m.addedNodes.forEach(n => { - if (n.tagName === "IFRAME") attachToIframe(n); - else if (n.querySelectorAll) n.querySelectorAll("iframe").forEach(attachToIframe); - })); - }).observe(document.body, { childList: true, subtree: true }); -} - document.addEventListener("DOMContentLoaded", () => { const blockedHostnames = ["gointerstellar.app"]; @@ -186,790 +151,14 @@ document.addEventListener("DOMContentLoaded", () => { }); } - // Pointer Effects - if (localStorage.getItem("pointer") === "rainbow-stars") { - // Rainbow Star Particles (based on codepen.io/tommyho/pen/ZEmjWGY) - if (!document.getElementById("pointer-canvas")) { - const canvas = document.createElement("canvas"); - canvas.id = "pointer-canvas"; - document.body.appendChild(canvas); - - const ctx = canvas.getContext("2d"); - canvas.width = window.innerWidth; - canvas.height = window.innerHeight; - - const bNum = 3; - const bSize = 8; - const bSpeed = 6; - const bDep = 0.1; - const bDist = 30; - const bStarVar = 2; - const bHue = 4; - - let spots = []; - let hue = 0; - const mouse = { x: undefined, y: undefined }; - - window.addEventListener("mousemove", e => { - mouse.x = e.clientX; - mouse.y = e.clientY; - for (let i = 0; i < bNum; i++) spots.push(new Particle()); - }); - - setupIframeTracking( - (x, y) => { - mouse.x = x; - mouse.y = y; - for (let i = 0; i < bNum; i++) spots.push(new Particle()); - }, - () => { - mouse.x = undefined; - mouse.y = undefined; - } - ); - - window.addEventListener("resize", () => { - canvas.width = window.innerWidth; - canvas.height = window.innerHeight; - }); - - class Particle { - constructor() { - this.x = mouse.x; - this.y = mouse.y; - this.size = Math.random() * bSize + 0.1; - this.speedX = Math.random() * bSpeed - bSpeed / 2; - this.speedY = Math.random() * bSpeed - bSpeed / 2; - this.points = Math.floor(Math.random() * bStarVar) + 5; - this.radius = Math.random() * bSize + 0.1; - this.color = "hsl(" + bHue * hue + ", 100%, 50%)"; - } - draw() { - ctx.fillStyle = this.color; - ctx.beginPath(); - star(this.x, this.y, this.radius * 2, this.radius, this.points); - ctx.fill(); - } - update() { - this.x += this.speedX; - this.y += this.speedY; - if (this.size > bDep) this.size -= bDep; - } - } - - function star(x, y, radius1, radius2, npoints) { - const angle = (2 * Math.PI) / npoints; - const halfAngle = angle / 2; - ctx.moveTo(x + Math.cos(halfAngle) * radius1, y + Math.sin(halfAngle) * radius1); - for (let a = 0; a <= 2 * Math.PI; a += angle) { - ctx.lineTo(x + Math.cos(a) * radius2, y + Math.sin(a) * radius2); - ctx.lineTo(x + Math.cos(a + halfAngle) * radius1, y + Math.sin(a + halfAngle) * radius1); - } - } - - function handleParticles() { - for (let i = 0; i < spots.length; i++) { - spots[i].update(); - spots[i].draw(); - for (let j = i; j < spots.length; j++) { - const dx = spots[i].x - spots[j].x; - const dy = spots[i].y - spots[j].y; - if (Math.sqrt(dx * dx + dy * dy) < bDist) { - ctx.beginPath(); - ctx.strokeStyle = spots[i].color; - ctx.lineWidth = spots[i].size / 3; - ctx.moveTo(spots[i].x, spots[i].y); - ctx.bezierCurveTo(spots[j].x, spots[j].y, spots[j].x, spots[i].y, spots[j].x, spots[j].y); - ctx.stroke(); - } - } - if (spots[i].size <= bDep) { - spots.splice(i, 1); - i--; - } - } - hue++; - } - - (function animate() { - ctx.clearRect(0, 0, canvas.width, canvas.height); - handleParticles(); - requestAnimationFrame(animate); - })(); - } - } else if (localStorage.getItem("pointer") === "white-orbs") { - // White Orb Particles (based on codepen.io/gabezink17-cmd/pen/WbGmeyR) - if (!document.getElementById("pointer-canvas")) { - const canvas = document.createElement("canvas"); - canvas.id = "pointer-canvas"; - document.body.appendChild(canvas); - - const ctx = canvas.getContext("2d"); - canvas.width = window.innerWidth; - canvas.height = window.innerHeight; - - const mouse = { x: innerWidth / 2, y: innerHeight / 2 }; - let particles = []; - - class OrbParticle { - constructor(x, y) { - this.x = x; - this.y = y; - this.vx = (Math.random() - 0.5) * 4; - this.vy = (Math.random() - 0.5) * 4; - this.size = Math.random() * 3 + 1; - this.life = 100; - } - update() { - this.vx += (mouse.x - this.x) * 0.0005; - this.vy += (mouse.y - this.y) * 0.0005; - this.x += this.vx; - this.y += this.vy; - this.vx *= 0.96; - this.vy *= 0.96; - this.life -= 1; - } - draw() { - ctx.fillStyle = "white"; - ctx.globalAlpha = this.life / 100; - ctx.beginPath(); - ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); - ctx.fill(); - ctx.globalAlpha = 1; - } - } - - function spawn(x, y, n = 10) { - for (let i = 0; i < n; i++) particles.push(new OrbParticle(x, y)); - } - - window.addEventListener("mousemove", e => { - mouse.x = e.clientX; - mouse.y = e.clientY; - spawn(mouse.x, mouse.y, 1); - }); - - setupIframeTracking( - (x, y) => { - mouse.x = x; - mouse.y = y; - spawn(x, y, 1); - }, - () => {} - ); + // Pointer Effects — cursor.js is only loaded when an effect is active + const CURSOR_EFFECTS = ["rainbow-stars", "white-orbs", "rainbow-trail", "blue-orbs", "red-circle", "the-sims"]; + const activePointer = localStorage.getItem("pointer"); - window.addEventListener("click", e => spawn(e.clientX, e.clientY, 40)); - - window.addEventListener("mousedown", () => { - for (let i = 0; i < 50; i++) spawn(mouse.x, mouse.y, 1); - }); - - window.addEventListener("resize", () => { - canvas.width = window.innerWidth; - canvas.height = window.innerHeight; - }); - - (function animate() { - ctx.globalAlpha = 1; - ctx.clearRect(0, 0, canvas.width, canvas.height); - particles.forEach((p, i) => { - p.update(); - p.draw(); - if (p.life <= 0) particles.splice(i, 1); - }); - requestAnimationFrame(animate); - })(); - } - } else if (localStorage.getItem("pointer") === "rainbow-trail") { - // Rainbow Trail Particles (based on codepen.io/Jiironimo/pen/vEXbVNP) - if (!document.getElementById("pointer-canvas")) { - const cursorDot = document.createElement("div"); - cursorDot.id = "rainbow-trail-cursor"; - cursorDot.style.visibility = "hidden"; - document.body.appendChild(cursorDot); - document.body.classList.add("rainbow-trail-cursor"); - - const canvas = document.createElement("canvas"); - canvas.id = "pointer-canvas"; - document.body.appendChild(canvas); - - const ctx = canvas.getContext("2d"); - canvas.width = window.innerWidth; - canvas.height = window.innerHeight; - - let W = canvas.width; - let H = canvas.height; - let mx = null; - let my = null; - let clicking = false; - let hue = 0; - const particles = []; - - window.addEventListener("resize", () => { - W = canvas.width = window.innerWidth; - H = canvas.height = window.innerHeight; - }); - - window.addEventListener("mousemove", e => { - mx = e.clientX; - my = e.clientY; - cursorDot.style.left = mx + "px"; - cursorDot.style.top = my + "px"; - cursorDot.style.visibility = "visible"; - }); - - document.addEventListener("mouseleave", () => { - mx = null; - my = null; - cursorDot.style.visibility = "hidden"; - }); - - setupIframeTracking( - (x, y) => { - mx = x; my = y; - cursorDot.style.left = mx + "px"; - cursorDot.style.top = my + "px"; - cursorDot.style.visibility = "visible"; - }, - () => { - mx = null; my = null; - cursorDot.style.visibility = "hidden"; - } - ); - - window.addEventListener("mousedown", () => (clicking = true)); - window.addEventListener("mouseup", () => (clicking = false)); - - class RainbowTrailParticle { - constructor(x, y, isClicking) { - this.x = x + (Math.random() - 0.5) * (isClicking ? 18 : 4); - this.y = y + (Math.random() - 0.5) * (isClicking ? 18 : 4); - - const speed = isClicking ? 1.5 + Math.random() * 3.5 : 0.4 + Math.random() * 1.2; - const angle = Math.random() * Math.PI * 2; - - this.vx = Math.cos(angle) * speed; - this.vy = Math.sin(angle) * speed - (isClicking ? 0 : 0.5); - this.life = 1; - this.decay = isClicking ? 0.018 + Math.random() * 0.025 : 0.012 + Math.random() * 0.018; - this.size = isClicking ? 3 + Math.random() * 7 : 1.5 + Math.random() * 3.5; - this.hue = hue + (Math.random() - 0.5) * 40; - this.sat = 80 + Math.random() * 20; - this.lit = 55 + Math.random() * 25; - this.shape = isClicking ? Math.floor(Math.random() * 3) : 0; - this.rot = Math.random() * Math.PI * 2; - this.rotSpd = (Math.random() - 0.5) * 0.2; - } - - update() { - this.x += this.vx; - this.y += this.vy; - this.vy += 0.04; - this.vx *= 0.98; - this.life -= this.decay; - this.rot += this.rotSpd; - this.size *= 0.992; - } - - draw() { - if (this.life <= 0) return; - ctx.save(); - ctx.globalAlpha = Math.max(0, this.life * this.life); - ctx.fillStyle = `hsl(${this.hue},${this.sat}%,${this.lit}%)`; - ctx.shadowColor = `hsl(${this.hue},${this.sat}%,${this.lit}%)`; - ctx.shadowBlur = this.size * 3; - ctx.translate(this.x, this.y); - ctx.rotate(this.rot); - - if (this.shape === 1) { - ctx.fillRect(-this.size / 2, -this.size / 2, this.size, this.size); - } else if (this.shape === 2) { - ctx.beginPath(); - const r1 = this.size, - r2 = this.size * 0.4, - pts = 4; - for (let i = 0; i < pts * 2; i++) { - const r = i % 2 === 0 ? r1 : r2; - const ang = (i / (pts * 2)) * Math.PI * 2 - Math.PI / 2; - i === 0 ? ctx.moveTo(Math.cos(ang) * r, Math.sin(ang) * r) : ctx.lineTo(Math.cos(ang) * r, Math.sin(ang) * r); - } - ctx.closePath(); - ctx.fill(); - } else { - ctx.beginPath(); - ctx.arc(0, 0, this.size, 0, Math.PI * 2); - ctx.fill(); - } - - ctx.restore(); - } - } - - function spawnTrail() { - if (mx === null || my === null) return; - const count = clicking ? 6 : 2; - for (let i = 0; i < count; i++) { - particles.push(new RainbowTrailParticle(mx, my, clicking)); - } - } - - (function loop() { - requestAnimationFrame(loop); - ctx.clearRect(0, 0, W, H); - - hue = (hue + 0.8) % 360; - spawnTrail(); - - for (let i = particles.length - 1; i >= 0; i--) { - particles[i].update(); - particles[i].draw(); - if (particles[i].life <= 0 || particles[i].size < 0.3) { - particles.splice(i, 1); - } - } - })(); - } - } else if (localStorage.getItem("pointer") === "blue-orbs") { - // Blue Orbs cursor effect (based on codepen.io/perror12/pen/JoRwZwg ) - if (!document.getElementById("blue-orbs-glow")) { - document.body.classList.add("blue-orbs-cursor"); - - const glow = document.createElement("div"); - glow.id = "blue-orbs-glow"; - glow.className = "cursor-glow"; - document.body.appendChild(glow); - - const core = document.createElement("div"); - core.id = "blue-orbs-core"; - core.className = "cursor-core"; - document.body.appendChild(core); - - let mouseX = null; - let mouseY = null; - let glowX = 0; - let glowY = 0; - let lastX = 0; - let lastY = 0; - - function createTrail(x, y, speed) { - const trail = document.createElement("div"); - trail.className = "orb-trail"; - const size = Math.max(18, Math.min(60, 20 + speed * 0.35)); - trail.style.width = `${size}px`; - trail.style.height = `${size}px`; - trail.style.left = `${x}px`; - trail.style.top = `${y}px`; - trail.style.animationDuration = `${0.5 + Math.random() * 0.35}s`; - document.body.appendChild(trail); - setTimeout(() => trail.remove(), 900); - } - - function createSpark(x, y) { - const spark = document.createElement("div"); - spark.className = "orb-spark"; - spark.style.left = `${x}px`; - spark.style.top = `${y}px`; - spark.style.setProperty("--dx", `${(Math.random() - 0.5) * 80}px`); - spark.style.setProperty("--dy", `${(Math.random() - 0.5) * 80}px`); - document.body.appendChild(spark); - setTimeout(() => spark.remove(), 850); - } - - window.addEventListener("mousemove", e => { - mouseX = e.clientX; - mouseY = e.clientY; - - if (core.style.visibility !== "visible") { - core.style.visibility = "visible"; - glow.style.visibility = "visible"; - glowX = mouseX; - glowY = mouseY; - lastX = mouseX; - lastY = mouseY; - } - - const dx = mouseX - lastX; - const dy = mouseY - lastY; - const speed = Math.sqrt(dx * dx + dy * dy); - - core.style.left = `${mouseX}px`; - core.style.top = `${mouseY}px`; - - createTrail(mouseX, mouseY, speed); - if (speed > 25) { - createSpark(mouseX, mouseY); - createSpark(mouseX, mouseY); - } - - lastX = mouseX; - lastY = mouseY; - }); - - document.addEventListener("mouseleave", () => { - mouseX = null; - mouseY = null; - core.style.visibility = "hidden"; - glow.style.visibility = "hidden"; - }); - - setupIframeTracking( - (x, y) => { - mouseX = x; mouseY = y; - if (core.style.visibility !== "visible") { - core.style.visibility = "visible"; - glow.style.visibility = "visible"; - glowX = x; glowY = y; lastX = x; lastY = y; - } - const dx = mouseX - lastX, dy = mouseY - lastY; - const speed = Math.sqrt(dx * dx + dy * dy); - core.style.left = `${mouseX}px`; - core.style.top = `${mouseY}px`; - createTrail(mouseX, mouseY, speed); - if (speed > 25) { createSpark(mouseX, mouseY); createSpark(mouseX, mouseY); } - lastX = mouseX; lastY = mouseY; - }, - () => { - mouseX = null; mouseY = null; - core.style.visibility = "hidden"; - glow.style.visibility = "hidden"; - } - ); - - window.addEventListener("mousedown", () => { - core.style.transform = "translate(-50%, -50%) scale(1.8)"; - glow.style.transform = "translate(-50%, -50%) scale(1.2)"; - }); - - window.addEventListener("mouseup", () => { - core.style.transform = "translate(-50%, -50%) scale(1)"; - glow.style.transform = "translate(-50%, -50%) scale(1)"; - }); - - (function animateGlow() { - if (mouseX !== null) { - glowX += (mouseX - glowX) * 0.15; - glowY += (mouseY - glowY) * 0.15; - glow.style.left = `${glowX}px`; - glow.style.top = `${glowY}px`; - } - requestAnimationFrame(animateGlow); - })(); - } - } else if (localStorage.getItem("pointer") === "red-circle") { - // Red Circle cursor (based on codepen.io/RoshitShrestha/pen/KwgVGwB) - if (!document.getElementById("red-circle-cursor")) { - document.body.classList.add("red-circle-cursor"); - - const cursorEl = document.createElement("div"); - cursorEl.id = "red-circle-cursor"; - cursorEl.innerHTML = ` - - - - - - - - - - `; - document.body.appendChild(cursorEl); - - function loadScript(src, onload) { - const s = document.createElement("script"); - s.src = src; - s.onload = onload; - document.head.appendChild(s); - } - - function initRedCircle() { - gsap.registerPlugin(MorphSVGPlugin); - - let rcTargetX = null, - rcTargetY = null; - let rcCurX = 0, - rcCurY = 0; - - function rcMoveTo(x, y) { - if (rcTargetX === null) { rcCurX = x; rcCurY = y; } - rcTargetX = x; rcTargetY = y; - cursorEl.style.visibility = "visible"; - } - - window.addEventListener("mousemove", e => rcMoveTo(e.clientX, e.clientY)); - - document.addEventListener("mouseleave", () => { - rcTargetX = null; rcTargetY = null; - cursorEl.style.visibility = "hidden"; - }); - - setupIframeTracking( - (x, y) => rcMoveTo(x, y), - () => { rcTargetX = null; rcTargetY = null; cursorEl.style.visibility = "hidden"; } - ); - - (function rcFollow() { - if (rcTargetX !== null) { - rcCurX += (rcTargetX - rcCurX) * 0.18; - rcCurY += (rcTargetY - rcCurY) * 0.18; - cursorEl.style.left = rcCurX + "px"; - cursorEl.style.top = rcCurY + "px"; - } - requestAnimationFrame(rcFollow); - })(); - - const cursorTl = gsap.timeline({ paused: true }); - cursorTl.to("#rc-cursorDot", { - morphSVG: "#rc-iBeamPath", - duration: 0.3, - ease: "power2.inOut", - }); - - const morphToHold = () => gsap.to("#rc-cursorDot", { morphSVG: "#rc-iBeamHold", duration: 0.4, ease: "back.out(3)" }); - const morphToIBeam = () => gsap.to("#rc-cursorDot", { morphSVG: "#rc-iBeamPath", duration: 0.4, ease: "back.out(3)" }); - - document.querySelectorAll("[data-text-hover]").forEach(el => { - el.addEventListener("mouseenter", () => cursorTl.play()); - el.addEventListener("mouseleave", () => cursorTl.reverse()); - el.addEventListener("mousedown", morphToHold); - el.addEventListener("mouseup", morphToIBeam); - }); - } - - if (typeof gsap === "undefined") { - loadScript("https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js", () => { - loadScript("https://assets.codepen.io/16327/MorphSVGPlugin3.min.js", initRedCircle); - }); - } else if (typeof MorphSVGPlugin === "undefined") { - loadScript("https://assets.codepen.io/16327/MorphSVGPlugin3.min.js", initRedCircle); - } else { - initRedCircle(); - } - } - } else if (localStorage.getItem("pointer") === "the-sims") { - // The Sims Cursor (based on codepen.io/Margarita-the-solid/pen/LERbOMR) - if (!document.getElementById("the-sims-cursor")) { - document.body.classList.add("the-sims-cursor"); - - const NS = "http://www.w3.org/2000/svg"; - const cursorSvg = document.createElementNS(NS, "svg"); - cursorSvg.id = "the-sims-cursor"; - cursorSvg.setAttribute("viewBox", "-110 -160 220 310"); - cursorSvg.setAttribute("width", "44"); - cursorSvg.setAttribute("height", "62"); - cursorSvg.setAttribute("overflow", "visible"); - document.body.appendChild(cursorSvg); - - const halo1 = document.createElement("div"); - halo1.className = "sims-halo"; - halo1.style.cssText = "width:40px;height:40px;border:1.5px solid hsla(110,100%,60%,0.26);"; - document.body.appendChild(halo1); - - const halo2 = document.createElement("div"); - halo2.className = "sims-halo"; - halo2.style.cssText = "width:56px;height:56px;border:1px solid hsla(110,100%,60%,0.1);animation-delay:0.7s;"; - document.body.appendChild(halo2); - - const SCL = 98; - const V = [ - [0, -1.85, 0], - [0, 1.85, 0], - [1, 0, 0], - [0, 0, 1], - [-1, 0, 0], - [0, 0, -1], - ]; - const FACES = [ - [0, 2, 3, 0.68], - [0, 3, 4, 0.9], - [0, 4, 5, 0.28], - [0, 5, 2, 0.14], - [1, 3, 2, 0.82], - [1, 4, 3, 0.34], - [1, 5, 4, 0.16], - [1, 2, 5, 0.1], - ]; - - const polys = FACES.map(() => { - const p = document.createElementNS(NS, "polygon"); - p.setAttribute("stroke-linejoin", "round"); - cursorSvg.appendChild(p); - return p; - }); - - const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v)); - const dot3 = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - const cross3 = ([ax, ay, az], [bx, by, bz]) => [ay * bz - az * by, az * bx - ax * bz, ax * by - ay * bx]; - const norm3 = v => { - const l = Math.hypot(...v) || 1; - return v.map(x => x / l); - }; - const rotY = ([x, y, z], c, s) => [x * c + z * s, y, -x * s + z * c]; - - function projectV(v, c, s) { - const [rx, ry, rz] = rotY(v, c, s); - const fov = 7 / (7 - rz); - return { x: rx * SCL * fov, y: ry * SCL * fov, z: rz }; - } - - const LIGHT = norm3([-0.3, -0.55, 1.0]); - let glowHue = 110; - - function renderPlumbob(ts) { - const t = ts * 0.001; - const ry = t * 0.5; - const c = Math.cos(ry), - s = Math.sin(ry); - glowHue = 108 + Math.sin(t * 0.14) * 13; - - const gl = 54 + Math.sin(t * 2.7) * 9; - const gr = 15 + Math.sin(t * 2.7) * 6; - cursorSvg.style.filter = `drop-shadow(0 0 ${gr}px hsl(${glowHue},100%,${gl}%)) ` + `drop-shadow(0 0 ${(gr * 2.8).toFixed(0)}px hsla(${glowHue},100%,${gl - 12}%,.38))`; - - const proj = V.map(v => projectV(v, c, s)); - - const faceData = FACES.map((face, i) => { - const [vi0, vi1, vi2, baseLum] = face; - const rv0 = rotY(V[vi0], c, s); - const rv1 = rotY(V[vi1], c, s); - const rv2 = rotY(V[vi2], c, s); - const normal = norm3( - cross3( - rv1.map((v, j) => v - rv0[j]), - rv2.map((v, j) => v - rv0[j]), - ), - ); - const facing = normal[2] > 0.005; - const diffuse = clamp(dot3(normal, LIGHT), 0, 1); - const lit = baseLum * 0.65 + diffuse * 0.25 + 0.1; - const L = clamp(lit * 82, 10, 91); - const fh = glowHue + (vi0 === 1 ? -9 : 0); - const p0 = proj[vi0], - p1 = proj[vi1], - p2 = proj[vi2]; - const fmt = n => n.toFixed(1); - return { - i, - facing, - pts: `${fmt(p0.x)},${fmt(p0.y)} ${fmt(p1.x)},${fmt(p1.y)} ${fmt(p2.x)},${fmt(p2.y)}`, - fill: `hsl(${fh.toFixed(1)},65%,${L.toFixed(1)}%)`, - strokeA: (0.08 + (1 - L / 91) * 0.14).toFixed(2), - z: (p0.z + p1.z + p2.z) / 3, - }; - }); - - faceData - .filter(f => !f.facing) - .forEach(fd => { - polys[fd.i].setAttribute("fill", "none"); - polys[fd.i].setAttribute("stroke", "none"); - cursorSvg.insertBefore(polys[fd.i], cursorSvg.firstChild); - }); - faceData - .filter(f => f.facing) - .sort((a, b) => b.z - a.z) - .forEach(fd => { - const p = polys[fd.i]; - p.setAttribute("points", fd.pts); - p.setAttribute("fill", fd.fill); - p.setAttribute("stroke", `hsla(0,0%,0%,${fd.strokeA})`); - p.setAttribute("stroke-width", "1.2"); - cursorSvg.appendChild(p); - }); - - [halo1, halo2].forEach((h, i) => { - h.style.border = `${i === 0 ? 1.5 : 1}px solid hsla(${glowHue},100%,60%,${i === 0 ? 0.26 : 0.1})`; - }); - - requestAnimationFrame(renderPlumbob); - } - requestAnimationFrame(renderPlumbob); - - const COLS = ["#39FF14", "#a8ff78", "#00D4FF", "#FFE600", "#9B5DE5"]; - - function spawnSimsPt(x, y, size = 1) { - const el = document.createElement("div"); - el.className = "sims-pt"; - el.textContent = Math.random() < 0.7 ? "§" : "✦"; - el.style.left = x + "px"; - el.style.top = y + "px"; - el.style.color = COLS[Math.floor(Math.random() * COLS.length)]; - el.style.fontSize = size + "rem"; - const d = 0.8 + Math.random() * 1.2; - el.style.setProperty("--d", d + "s"); - document.body.appendChild(el); - setTimeout(() => el.remove(), (d + 0.2) * 1000); - } - - let simsMouseX = null; - let simsMouseY = null; - - const simsInterval = setInterval(() => { - if (localStorage.getItem("pointer") !== "the-sims") { - clearInterval(simsInterval); - return; - } - if (simsMouseX === null) return; - const spread = 60; - spawnSimsPt( - simsMouseX + (Math.random() - 0.5) * spread, - simsMouseY + (Math.random() - 0.5) * spread, - 0.6 + Math.random() * 0.5 - ); - }, 420); - - const simsClickHandler = e => { - for (let i = 0; i < 12; i++) { - const ang = (i / 12) * Math.PI * 2; - const r = 20 + Math.random() * 50; - spawnSimsPt(e.clientX + Math.cos(ang) * r, e.clientY + Math.sin(ang) * r, 0.5 + Math.random() * 0.7); - } - }; - document.addEventListener("click", simsClickHandler); - - document.addEventListener("mousemove", e => { - simsMouseX = e.clientX; - simsMouseY = e.clientY; - - cursorSvg.style.left = simsMouseX + "px"; - cursorSvg.style.top = simsMouseY + "px"; - cursorSvg.style.visibility = "visible"; - - halo1.style.left = simsMouseX + "px"; - halo1.style.top = simsMouseY + "px"; - halo2.style.left = simsMouseX + "px"; - halo2.style.top = simsMouseY + "px"; - }); - - document.addEventListener("mouseleave", () => { - simsMouseX = null; - simsMouseY = null; - cursorSvg.style.visibility = "hidden"; - halo1.style.visibility = "hidden"; - halo2.style.visibility = "hidden"; - }); - - document.addEventListener("mouseenter", () => { - halo1.style.visibility = "visible"; - halo2.style.visibility = "visible"; - }); - - setupIframeTracking( - (x, y) => { - simsMouseX = x; simsMouseY = y; - cursorSvg.style.left = x + "px"; - cursorSvg.style.top = y + "px"; - cursorSvg.style.visibility = "visible"; - halo1.style.left = x + "px"; halo1.style.top = y + "px"; halo1.style.visibility = "visible"; - halo2.style.left = x + "px"; halo2.style.top = y + "px"; halo2.style.visibility = "visible"; - }, - () => { - simsMouseX = null; simsMouseY = null; - cursorSvg.style.visibility = "hidden"; - halo1.style.visibility = "hidden"; - halo2.style.visibility = "hidden"; - } - ); - } + if (CURSOR_EFFECTS.includes(activePointer)) { + const cursorScript = document.createElement("script"); + cursorScript.src = "/assets/js/cursor.js"; + cursorScript.onload = () => initCursorEffect(); + document.head.appendChild(cursorScript); } -}); \ No newline at end of file +}); From 4e5f631549c9b4b831907be4af3d021a6c83794f Mon Sep 17 00:00:00 2001 From: Bubbo <85169821+xbubbo@users.noreply.github.com> Date: Fri, 8 May 2026 19:59:35 -0400 Subject: [PATCH 067/115] chore: remove old cashapp link --- .github/FUNDING.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 01579f668b..3418c5df2a 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -10,4 +10,3 @@ liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -custom: https://cash.app/$akabubbo From b0f22a0f07c9b6a3482d7fbda747ef784584551b Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sun, 10 May 2026 07:53:46 -0400 Subject: [PATCH 068/115] feat(cursor): add curly cursor trail effect --- static/assets/js/cursor.js | 80 ++++++++++++++++++++++++++++++++++++++ static/assets/js/main.js | 2 +- static/settings.html | 1 + 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/static/assets/js/cursor.js b/static/assets/js/cursor.js index dcf3ba90aa..d49ec77a4c 100644 --- a/static/assets/js/cursor.js +++ b/static/assets/js/cursor.js @@ -719,6 +719,83 @@ function initBlueOrbsDom() { initBlueOrbs(); } +// Based on codepen.io/ksenia-k/pen/rNoBgbV +function initSnakeTrail() { + if (document.getElementById("pointer-canvas")) return; + + const canvas = createFullscreenCanvas("pointer-canvas"); + const ctx = canvas.getContext("2d"); + + const pointer = { x: null, y: null }; + const params = { + pointsNumber: 40, + widthFactor: 0.3, + spring: 0.4, + friction: 0.5, + }; + + const trail = Array.from({ length: params.pointsNumber }, () => ({ + x: window.innerWidth / 2, + y: window.innerHeight / 2, + dx: 0, + dy: 0, + })); + + function onMove(x, y) { + pointer.x = x; + pointer.y = y; + } + + window.addEventListener("mousemove", e => onMove(e.clientX, e.clientY)); + window.addEventListener("touchmove", e => onMove(e.targetTouches[0].pageX, e.targetTouches[0].pageY)); + document.addEventListener("mouseleave", () => { + pointer.x = null; + pointer.y = null; + }); + setupIframeTracking(onMove, () => { + pointer.x = null; + pointer.y = null; + }); + + function update(t) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + if (pointer.x === null) { + requestAnimationFrame(update); + return; + } + + trail.forEach((p, i) => { + const prev = i === 0 ? { x: pointer.x, y: pointer.y } : trail[i - 1]; + const spring = i === 0 ? 0.4 * params.spring : params.spring; + p.dx += (prev.x - p.x) * spring; + p.dy += (prev.y - p.y) * spring; + p.dx *= params.friction; + p.dy *= params.friction; + p.x += p.dx; + p.y += p.dy; + }); + + ctx.lineCap = "round"; + ctx.strokeStyle = getComputedStyle(document.body).getPropertyValue("--text-primary").trim() || "#ffffff"; + ctx.beginPath(); + ctx.moveTo(trail[0].x, trail[0].y); + + for (let i = 1; i < trail.length - 1; i++) { + const xc = 0.5 * (trail[i].x + trail[i + 1].x); + const yc = 0.5 * (trail[i].y + trail[i + 1].y); + ctx.quadraticCurveTo(trail[i].x, trail[i].y, xc, yc); + ctx.lineWidth = params.widthFactor * (params.pointsNumber - i); + ctx.stroke(); + } + ctx.lineTo(trail[trail.length - 1].x, trail[trail.length - 1].y); + ctx.stroke(); + + requestAnimationFrame(update); + } + + requestAnimationFrame(update); +} + function initCursorEffect() { const pointer = localStorage.getItem("pointer"); switch (pointer) { @@ -740,5 +817,8 @@ function initCursorEffect() { case "the-sims": initTheSims(); break; + case "curly-cursor": + initSnakeTrail(); + break; } } diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 99f012a3db..a3fb0d2895 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -152,7 +152,7 @@ document.addEventListener("DOMContentLoaded", () => { } // Pointer Effects — cursor.js is only loaded when an effect is active - const CURSOR_EFFECTS = ["rainbow-stars", "white-orbs", "rainbow-trail", "blue-orbs", "red-circle", "the-sims"]; + const CURSOR_EFFECTS = ["rainbow-stars", "white-orbs", "rainbow-trail", "blue-orbs", "red-circle", "the-sims", "curly-cursor"]; const activePointer = localStorage.getItem("pointer"); if (CURSOR_EFFECTS.includes(activePointer)) { diff --git a/static/settings.html b/static/settings.html index 2b5f35d305..5546053650 100644 --- a/static/settings.html +++ b/static/settings.html @@ -191,6 +191,7 @@

Visual Customization

+ From 318fcd6e4a56f05cb1a28799044b045b20e74826 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 11 May 2026 09:47:29 -0400 Subject: [PATCH 069/115] chore(lint): fixed ordering of classes --- static/assets/css/nav.css | 10 +- static/assets/css/settings.css | 22 +-- static/assets/css/tabs.css | 330 ++++++++++++++++----------------- 3 files changed, 178 insertions(+), 184 deletions(-) diff --git a/static/assets/css/nav.css b/static/assets/css/nav.css index a09e4ef1d2..0d67a2730c 100644 --- a/static/assets/css/nav.css +++ b/static/assets/css/nav.css @@ -77,6 +77,10 @@ img { right: 2%; } +.navbar-link { + margin-right: 5px; +} + .nav-bar-right .navbar-link { margin-left: 10px; text-transform: uppercase; @@ -132,17 +136,13 @@ img { transition: all 0.2s ease; } -.navbar-link { - margin-right: 5px; -} - .navbar-link:hover > .settings-icon { animation: spin 0.5s; animation-timing-function: cubic-bezier(0, 1.04, 0.91, 0.99); } @media (max-width: 768px) { - .nav-bar-right .navbar-link an { + .nav-bar-right .navbar-link a { display: none; } .nav-bar-right .fa-solid { diff --git a/static/assets/css/settings.css b/static/assets/css/settings.css index 13ae8e3e66..8c73f3c736 100644 --- a/static/assets/css/settings.css +++ b/static/assets/css/settings.css @@ -53,6 +53,17 @@ a { color: var(--text-primary); } +input { + padding: 15px; + border-radius: 10px; + background: var(--background-input); + text-align: center; + font-size: 20px; + border: none; + outline: none; + color: var(--text-primary); +} + .switch { position: relative; display: inline-block; @@ -98,17 +109,6 @@ input:checked + .slider-round:before { transform: translateX(26px); } -input { - padding: 15px; - border-radius: 10px; - background: var(--background-input); - text-align: center; - font-size: 20px; - border: none; - outline: none; - color: var(--text-primary); -} - .key-form { padding: 15px; width: 92.5%; diff --git a/static/assets/css/tabs.css b/static/assets/css/tabs.css index 3b3d53f926..8c73f3c736 100644 --- a/static/assets/css/tabs.css +++ b/static/assets/css/tabs.css @@ -1,238 +1,232 @@ -@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800&display=swap"); -@import url("https://fonts.googleapis.com/css2?family=Poppins&display=swap"); - body { + background-color: var(--background-image); font-family: "Inter", sans-serif; - text-decoration: none; + color: var(--text-primary); margin: 0; + padding: 0; + letter-spacing: 0px; overflow-x: hidden; - overflow-y: hidden; - background: var(--background-color); - color: var(--text-primary); } -.browser { - padding: 1rem; - transition: transform 0.5s ease; - border-radius: 0 10px 10px 0; - transform: translateX(0); - width: 100vw; - height: 0.5vw; +.settings-container { display: flex; - align-items: center; + flex-wrap: wrap; + justify-content: center; + gap: 20px; + padding: 20% 20px 20px 20px; } -.close-tab { - border: none; - background: none; - font-size: 12px; - color: var(--text-primary); - cursor: pointer; - transition: color 0.3s ease; - width: 20px; +.settings-title { + display: block; + font-size: 70px; + margin-block-start: 0.67em; + margin-block-end: 0.67em; + margin-inline-start: 0px; + margin-inline-end: 0px; + font-weight: bold; } -.close-tab:hover { - color: var(--text-primary); +.settings-card { + background-color: var(--background-settings); + border-radius: 10px; + padding: 20px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + width: 400px; + transition: all 0.3s ease; } -.browser-bar { - left: 0; - right: 0; - height: 2.5em; - padding: 0 25px; - background: var(--background-color); - box-sizing: border-box; - transition: 0.35s ease; - z-index: 100; - width: 100vw; - position: fixed; +.settings-card:hover { + transform: translatey(-5px); + box-shadow: 0 8px 12px rgba(0, 0, 0, 0.2); } -.browser-button { - border-radius: 10px; +.settings-card h3 { + margin-top: 0; color: var(--text-primary); - background: none; - height: 3em; - border: none; - right: 10px; - top: auto; - box-sizing: border-box; - margin-right: 10px; - transition: 0.2s ease; - margin-top: 0 auto; - margin-bottom: 0 auto; } -.browser-button:hover { - transform: scale(1.3); - cursor: pointer; +.settings-card p { + color: var(--text-placeholder); } -.nav-btn-left { - float: left; +a { + color: var(--text-primary); } -.browser-button-right { - float: right; +input { + padding: 15px; + border-radius: 10px; + background: var(--background-input); + text-align: center; + font-size: 20px; + border: none; + outline: none; + color: var(--text-primary); } -.browser-container { - min-width: 5vw; - min-height: 10vh; - display: inline; +.switch { + position: relative; + display: inline-block; + width: 60px; + height: 34px; } -.browser-left { - position: absolute; - top: 50%; - transform: translateY(-50%); - left: 1%; - width: 80%; +.switch input { + opacity: 0; + width: 0; + height: 0; } -.browser-right { +.slider-round { position: absolute; - top: 50%; - transform: translateY(-50%); - right: 1%; - width: 20%; -} - -.browser-right .nav-btn:hover { - text-transform: uppercase; cursor: pointer; - font-weight: 800; - font-family: "Inter", sans-serif; - font-style: normal; - font-size: 3vw; - transform: translateX(-20%); + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--slider-inactive-background); + transition: 0.4s; + border-radius: 34px; } -.browser-right .nav-btn:hover { - text-transform: uppercase; - cursor: pointer; - font-weight: 800; - font-family: "Inter", sans-serif; - font-style: normal; - font-size: 3vh; - transform: translateX(-20%); +.slider-round:before { + position: absolute; + content: ""; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: var(--text-primary); + transition: 0.4s; + border-radius: 50%; } -.fullscreen .browser-bar { - display: none; +input:checked + .slider-round { + background-color: var(--slider-active-background); } -.fullscreen #ifra { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; +input:checked + .slider-round:before { + transform: translateX(26px); } -.bar { - background: none; +.key-form { + padding: 15px; + width: 92.5%; + border-radius: 10px; + background: var(--background-buttons); + text-align: center; + font-size: 20px; border: none; - color: var(--text-primary); - width: 60vw; - height: 30px; - border-radius: 5px; - margin: 0 auto; - transition: 0.3s; -} - -.bar:focus { - background: var(--background-input); - box-shadow: none; outline: none; color: var(--text-primary); - transition: 0.3s; + margin-top: 10px; } -.browser-post { - padding: none; - float: right; - margin-top: 0em; +.key-button { + cursor: pointer; + border: 2px; + font-size: 20px; + transition: 0.2s; + margin-top: 10px; + background-color: var(--background-buttons); + border-radius: 10px; color: var(--text-primary); - border-radius: 5px; + height: 50px; + width: 50%; + padding: 10px; + text-align: center; } -.overlay { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - display: none; +button { + cursor: pointer; + border: 2px; + transition: 0.2s; + margin-top: 10px; + background-color: var(--background-buttons); + border-radius: 10px; + color: var(--text-primary); + height: 50px; + width: 35%; + padding: 10px; + text-align: center; } -h1 { - text-align: center; +select { + padding: 15px; + width: 100%; + border-radius: 10px; + background: var(--background-buttons); color: var(--text-primary); - font-size: 50px; - white-space: nowrap; + font-size: 20px; + border: 0px; + outline: none; } -p { - text-align: center; - color: var(--text-primary); - font-size: 25px; +#buttonLayer { + width: 400px; + display: flex; + justify-content: center; + gap: 10px; } -.frame-container iframe { - display: none; +#buttonLayer > .key-button { + flex-grow: 1; + padding: 10px; + box-sizing: border-box; } -.frame-container iframe.active { - display: block; +@media screen and (max-width: 768px) { + .settings-container { + padding: 25% 20px 20px 20px; + } + .settings-card { + width: 100%; + max-width: 400px; + } + + .settings-title { + font-size: 40px; + } + + input, + .key-form { + width: 90%; + } + + button, + .key-button { + width: 100%; + max-width: 200px; + } } -#add-tab { - padding: 0.5rem; - cursor: pointer; - background-color: var(--background-settings); - color: var(--text-primary); - border: none; - border-radius: 5px; - margin-right: 0.5rem; - transition: background-color 0.3s ease; +@media screen and (max-width: 500px) { + .settings-container { + padding-top: 35%; + } } -#add-tab:hover { - background-color: var(--tab-active-background); +@media screen and (min-width: 1000px) { + .settings-container { + padding-top: 10%; + } } -ul { - list-style-type: none; - padding: 0; - display: flex; +#last-updated { + margin-top: -3%; } -li { - padding: 0.4rem; - background-color: var(--background-settings); - margin-right: 0.5rem; - cursor: pointer; - border-radius: 5px; - transition: background-color 0.3s ease; +#ab-settings { display: flex; align-items: center; - justify-content: center; -} - -li.active { - background-color: var(--tab-active-background); + gap: 5vw; } -li:hover { - background-color: var(--tab-active-background); +#ab-settings-container { + margin-top: 13px; + margin-left: 20px; } -iframe { - position: absolute; - width: 100%; - height: 90%; - border: none; - left: 0; - top: 10%; +#warning { + color: red; } From b07ad996e6ef1bde488fd4b4aee3002c5f50a7d2 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 11 May 2026 09:55:50 -0400 Subject: [PATCH 070/115] chore(lint): resolve biome warnings --- static/assets/js/cursor.js | 52 +++++++++++++++++++----------------- static/assets/js/launcher.js | 2 +- static/assets/js/settings.js | 19 ++++++------- static/assets/js/tabs.js | 12 ++++----- 4 files changed, 45 insertions(+), 40 deletions(-) diff --git a/static/assets/js/cursor.js b/static/assets/js/cursor.js index d49ec77a4c..d9a3e4db31 100644 --- a/static/assets/js/cursor.js +++ b/static/assets/js/cursor.js @@ -25,12 +25,12 @@ function setupIframeTracking(moveCallback, hideCallback) { document.querySelectorAll("iframe").forEach(attachToIframe); new MutationObserver(mutations => { - mutations.forEach(m => + mutations.forEach(m => { m.addedNodes.forEach(n => { if (n.tagName === "IFRAME") attachToIframe(n); else if (n.querySelectorAll) n.querySelectorAll("iframe").forEach(attachToIframe); - }), - ); + }); + }); }).observe(document.body, { childList: true, subtree: true }); } @@ -74,7 +74,7 @@ function initRainbowStars() { this.speedY = Math.random() * bSpeed - bSpeed / 2; this.points = Math.floor(Math.random() * bStarVar) + 5; this.radius = Math.random() * bSize + 0.1; - this.color = "hsl(" + bHue * hue + ", 100%, 50%)"; + this.color = `hsl(${bHue * hue}, 100%, 50%)`; } draw() { ctx.fillStyle = this.color; @@ -145,7 +145,7 @@ function initWhiteOrbs() { const canvas = createFullscreenCanvas("pointer-canvas"); const ctx = canvas.getContext("2d"); const mouse = { x: innerWidth / 2, y: innerHeight / 2 }; - let particles = []; + const particles = []; class OrbParticle { constructor(x, y) { @@ -291,8 +291,8 @@ function initRainbowTrail() { function showAt(x, y) { mx = x; my = y; - cursorDot.style.left = x + "px"; - cursorDot.style.top = y + "px"; + cursorDot.style.left = `${x}px`; + cursorDot.style.top = `${y}px`; cursorDot.style.visibility = "visible"; } @@ -304,8 +304,12 @@ function initRainbowTrail() { window.addEventListener("mousemove", e => showAt(e.clientX, e.clientY)); document.addEventListener("mouseleave", hide); - window.addEventListener("mousedown", () => (clicking = true)); - window.addEventListener("mouseup", () => (clicking = false)); + window.addEventListener("mousedown", () => { + clicking = true; + }); + window.addEventListener("mouseup", () => { + clicking = false; + }); setupIframeTracking(showAt, hide); (function loop() { @@ -482,8 +486,8 @@ function initRedCircle() { if (rcTargetX !== null) { rcCurX += (rcTargetX - rcCurX) * 0.18; rcCurY += (rcTargetY - rcCurY) * 0.18; - cursorEl.style.left = rcCurX + "px"; - cursorEl.style.top = rcCurY + "px"; + cursorEl.style.left = `${rcCurX}px`; + cursorEl.style.top = `${rcCurY}px`; } requestAnimationFrame(rcFollow); })(); @@ -654,12 +658,12 @@ function initTheSims() { const el = document.createElement("div"); el.className = "sims-pt"; el.textContent = Math.random() < 0.7 ? "§" : "✦"; - el.style.left = x + "px"; - el.style.top = y + "px"; + el.style.left = `${x}px`; + el.style.top = `${y}px`; el.style.color = COLS[Math.floor(Math.random() * COLS.length)]; - el.style.fontSize = size + "rem"; + el.style.fontSize = `${size}rem`; const d = 0.8 + Math.random() * 1.2; - el.style.setProperty("--d", d + "s"); + el.style.setProperty("--d", `${d}s`); document.body.appendChild(el); setTimeout(() => el.remove(), (d + 0.2) * 1000); } @@ -685,14 +689,14 @@ function initTheSims() { function showAt(x, y) { simsMouseX = x; simsMouseY = y; - cursorSvg.style.left = x + "px"; - cursorSvg.style.top = y + "px"; + cursorSvg.style.left = `${x}px`; + cursorSvg.style.top = `${y}px`; cursorSvg.style.visibility = "visible"; - halo1.style.left = x + "px"; - halo1.style.top = y + "px"; + halo1.style.left = `${x}px`; + halo1.style.top = `${y}px`; halo1.style.visibility = "visible"; - halo2.style.left = x + "px"; - halo2.style.top = y + "px"; + halo2.style.left = `${x}px`; + halo2.style.top = `${y}px`; halo2.style.visibility = "visible"; } @@ -714,7 +718,7 @@ function initTheSims() { } // Based on codepen.io/Jiironimo/pen/vEXbVNP -function initBlueOrbsDom() { +function _initBlueOrbsDom() { if (document.getElementById("blue-orbs-glow")) return; initBlueOrbs(); } @@ -757,7 +761,7 @@ function initSnakeTrail() { pointer.y = null; }); - function update(t) { + function update(_t) { ctx.clearRect(0, 0, canvas.width, canvas.height); if (pointer.x === null) { requestAnimationFrame(update); @@ -796,7 +800,7 @@ function initSnakeTrail() { requestAnimationFrame(update); } -function initCursorEffect() { +function _initCursorEffect() { const pointer = localStorage.getItem("pointer"); switch (pointer) { case "rainbow-stars": diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index 7fee332ec4..88439745e0 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -132,7 +132,7 @@ function savePinnedApps(pins) { } function togglePin(appIndex) { - let pins = getPinnedApps(); + const pins = getPinnedApps(); const pinIndex = pins.indexOf(appIndex); const isCurrentlyPinned = pinIndex !== -1; diff --git a/static/assets/js/settings.js b/static/assets/js/settings.js index 2291edb66e..496990f125 100644 --- a/static/assets/js/settings.js +++ b/static/assets/js/settings.js @@ -19,15 +19,15 @@ document.addEventListener("DOMContentLoaded", () => { const eventKeyInput = document.getElementById("eventKeyInput"); const linkInput = document.getElementById("linkInput"); - let eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; - let eventKeyRaw = localStorage.getItem("eventKeyRaw") || "`"; + let _eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; + const eventKeyRaw = localStorage.getItem("eventKeyRaw") || "`"; let pLink = localStorage.getItem("pLink") || "https://classroom.google.com/"; eventKeyInput.value = eventKeyRaw; linkInput.value = pLink; eventKeyInput.addEventListener("input", () => { - eventKey = eventKeyInput.value.split(","); + _eventKey = eventKeyInput.value.split(","); }); linkInput.addEventListener("input", () => { pLink = linkInput.value; @@ -134,7 +134,7 @@ document.addEventListener("DOMContentLoaded", () => { if (savedEngineName) document.getElementById("engine").value = savedEngineName; }); -function saveEventKey() { +function _saveEventKey() { const eventKeyInput = document.getElementById("eventKeyInput"); const linkInput = document.getElementById("linkInput"); const eventKey = eventKeyInput.value.split(","); @@ -260,7 +260,7 @@ function redirectToMainDomain() { } } -const themeMap = { +const _themeMap = { catppuccinMocha: "/assets/css/themes/catppuccin/mocha.css", catppuccinMacchiato: "/assets/css/themes/catppuccin/macchiato.css", catppuccinFrappe: "/assets/css/themes/catppuccin/frappe.css", @@ -279,7 +279,7 @@ function themeChange(selectElement) { window.location.reload(); } -function AB() { +function _AB() { let inFrame; try { inFrame = window !== top; @@ -337,7 +337,7 @@ function AB() { location.replace(panicLink); } -function toggleAB() { +function _toggleAB() { const ab = localStorage.getItem("ab"); localStorage.setItem("ab", ab === "true" ? "false" : "true"); } @@ -367,7 +367,7 @@ function saveCustomEngine() { } } -function exportSaveData() { +function _exportSaveData() { const cookies = Object.fromEntries( document.cookie .split("; ") @@ -392,7 +392,7 @@ function exportSaveData() { URL.revokeObjectURL(url); } -function importSaveData() { +function _importSaveData() { const input = document.createElement("input"); input.type = "file"; input.accept = "application/json"; @@ -405,6 +405,7 @@ function importSaveData() { const data = JSON.parse(e.target.result); if (data.cookies) { Object.entries(data.cookies).forEach(([key, value]) => { + // biome-ignore lint/suspicious/noDocumentCookie: legacy cookie restore; CookieStore API lacks broad enough support for this use case document.cookie = `${key}=${value}; path=/`; }); } diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index 771b5b995e..fe26e03e09 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -74,17 +74,17 @@ function updateAddressBar() { } } -function reload() { +function _reload() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (activeIframe) { - activeIframe.src = activeIframe.src; + activeIframe.contentWindow.location.reload(); updateAddressBar(); } else { console.error("No active iframe found"); } } -function popoutTab() { +function _popoutTab() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (!activeIframe) { console.error("No active iframe found"); @@ -115,7 +115,7 @@ function popoutTab() { newWindow.document.body.appendChild(newIframe); } -function toggleDevTools() { +function _toggleDevTools() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (!activeIframe) { console.error("No active iframe found"); @@ -174,7 +174,7 @@ function goHome() { window.location.href = "./"; } -function goBack() { +function _goBack() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (activeIframe) { activeIframe.contentWindow.history.back(); @@ -184,7 +184,7 @@ function goBack() { } } -function goForward() { +function _goForward() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (activeIframe) { activeIframe.contentWindow.history.forward(); From 8cd083116d6e944d090d1c3ac007b86fe3bf9d00 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 11 May 2026 09:59:12 -0400 Subject: [PATCH 071/115] fix(biome): prevent HTML-callable functions from being marked as unused --- biome.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/biome.json b/biome.json index cf13ac810d..bfd721f83d 100644 --- a/biome.json +++ b/biome.json @@ -7,7 +7,11 @@ "linter": { "enabled": true, "rules": { - "recommended": true + "recommended": true, + "correctness": { + "noUnusedVariables": "off", + "noUnusedFunctionParameters": "off" + } }, "includes": ["**", "!**/pnpm-lock.yaml", "!**/dist/**", "!**/node_modules/**", "!**/assets/bundled/**", "!**/*.min.json", "!**/.astro/**"] }, From 0f0da5e155959b38999c51384ec84e53a9a2256d Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 11 May 2026 10:04:40 -0400 Subject: [PATCH 072/115] revert: undo biome unused-variable cleanup that broke global functions (b07ad996e6ef1bde488fd4b4aee3002c5f50a7d2) --- static/assets/js/cursor.js | 6 +++--- static/assets/js/settings.js | 16 ++++++++-------- static/assets/js/tabs.js | 10 +++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/static/assets/js/cursor.js b/static/assets/js/cursor.js index d9a3e4db31..4d1723ddf9 100644 --- a/static/assets/js/cursor.js +++ b/static/assets/js/cursor.js @@ -718,7 +718,7 @@ function initTheSims() { } // Based on codepen.io/Jiironimo/pen/vEXbVNP -function _initBlueOrbsDom() { +function initBlueOrbsDom() { if (document.getElementById("blue-orbs-glow")) return; initBlueOrbs(); } @@ -761,7 +761,7 @@ function initSnakeTrail() { pointer.y = null; }); - function update(_t) { + function update(t) { ctx.clearRect(0, 0, canvas.width, canvas.height); if (pointer.x === null) { requestAnimationFrame(update); @@ -800,7 +800,7 @@ function initSnakeTrail() { requestAnimationFrame(update); } -function _initCursorEffect() { +function initCursorEffect() { const pointer = localStorage.getItem("pointer"); switch (pointer) { case "rainbow-stars": diff --git a/static/assets/js/settings.js b/static/assets/js/settings.js index 496990f125..7f32004fd7 100644 --- a/static/assets/js/settings.js +++ b/static/assets/js/settings.js @@ -19,7 +19,7 @@ document.addEventListener("DOMContentLoaded", () => { const eventKeyInput = document.getElementById("eventKeyInput"); const linkInput = document.getElementById("linkInput"); - let _eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; + let eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; const eventKeyRaw = localStorage.getItem("eventKeyRaw") || "`"; let pLink = localStorage.getItem("pLink") || "https://classroom.google.com/"; @@ -27,7 +27,7 @@ document.addEventListener("DOMContentLoaded", () => { linkInput.value = pLink; eventKeyInput.addEventListener("input", () => { - _eventKey = eventKeyInput.value.split(","); + eventKey = eventKeyInput.value.split(","); }); linkInput.addEventListener("input", () => { pLink = linkInput.value; @@ -134,7 +134,7 @@ document.addEventListener("DOMContentLoaded", () => { if (savedEngineName) document.getElementById("engine").value = savedEngineName; }); -function _saveEventKey() { +function saveEventKey() { const eventKeyInput = document.getElementById("eventKeyInput"); const linkInput = document.getElementById("linkInput"); const eventKey = eventKeyInput.value.split(","); @@ -260,7 +260,7 @@ function redirectToMainDomain() { } } -const _themeMap = { +const themeMap = { catppuccinMocha: "/assets/css/themes/catppuccin/mocha.css", catppuccinMacchiato: "/assets/css/themes/catppuccin/macchiato.css", catppuccinFrappe: "/assets/css/themes/catppuccin/frappe.css", @@ -279,7 +279,7 @@ function themeChange(selectElement) { window.location.reload(); } -function _AB() { +function AB() { let inFrame; try { inFrame = window !== top; @@ -337,7 +337,7 @@ function _AB() { location.replace(panicLink); } -function _toggleAB() { +function toggleAB() { const ab = localStorage.getItem("ab"); localStorage.setItem("ab", ab === "true" ? "false" : "true"); } @@ -367,7 +367,7 @@ function saveCustomEngine() { } } -function _exportSaveData() { +function exportSaveData() { const cookies = Object.fromEntries( document.cookie .split("; ") @@ -392,7 +392,7 @@ function _exportSaveData() { URL.revokeObjectURL(url); } -function _importSaveData() { +function importSaveData() { const input = document.createElement("input"); input.type = "file"; input.accept = "application/json"; diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index fe26e03e09..5cc22052d8 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -74,7 +74,7 @@ function updateAddressBar() { } } -function _reload() { +function reload() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (activeIframe) { activeIframe.contentWindow.location.reload(); @@ -84,7 +84,7 @@ function _reload() { } } -function _popoutTab() { +function popoutTab() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (!activeIframe) { console.error("No active iframe found"); @@ -115,7 +115,7 @@ function _popoutTab() { newWindow.document.body.appendChild(newIframe); } -function _toggleDevTools() { +function toggleDevTools() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (!activeIframe) { console.error("No active iframe found"); @@ -174,7 +174,7 @@ function goHome() { window.location.href = "./"; } -function _goBack() { +function goBack() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (activeIframe) { activeIframe.contentWindow.history.back(); @@ -184,7 +184,7 @@ function _goBack() { } } -function _goForward() { +function goForward() { const activeIframe = document.querySelector("#frame-container iframe.active"); if (activeIframe) { activeIframe.contentWindow.history.forward(); From 0ff116386142aed47ca27504e81b4aace51564e3 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Mon, 11 May 2026 18:37:40 -0400 Subject: [PATCH 073/115] chore: revert 318fcd6e4a56f05cb1a28799044b045b20e74826 --- static/assets/css/tabs.css | 330 +++++++++++++++++++------------------ 1 file changed, 168 insertions(+), 162 deletions(-) diff --git a/static/assets/css/tabs.css b/static/assets/css/tabs.css index 8c73f3c736..6244147e4d 100644 --- a/static/assets/css/tabs.css +++ b/static/assets/css/tabs.css @@ -1,232 +1,238 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Poppins&display=swap"); + body { - background-color: var(--background-image); font-family: "Inter", sans-serif; - color: var(--text-primary); + text-decoration: none; margin: 0; - padding: 0; - letter-spacing: 0px; overflow-x: hidden; + overflow-y: hidden; + background: var(--background-color); + color: var(--text-primary); } -.settings-container { +.browser { + padding: 1rem; + transition: transform 0.5s ease; + border-radius: 0 10px 10px 0; + transform: translateX(0); + width: 100vw; + height: 0.5vw; display: flex; - flex-wrap: wrap; - justify-content: center; - gap: 20px; - padding: 20% 20px 20px 20px; + align-items: center; } -.settings-title { - display: block; - font-size: 70px; - margin-block-start: 0.67em; - margin-block-end: 0.67em; - margin-inline-start: 0px; - margin-inline-end: 0px; - font-weight: bold; +.close-tab { + border: none; + background: none; + font-size: 12px; + color: var(--text-primary); + cursor: pointer; + transition: color 0.3s ease; + width: 20px; } -.settings-card { - background-color: var(--background-settings); - border-radius: 10px; - padding: 20px; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - width: 400px; - transition: all 0.3s ease; +.close-tab:hover { + color: var(--text-primary); } -.settings-card:hover { - transform: translatey(-5px); - box-shadow: 0 8px 12px rgba(0, 0, 0, 0.2); +.browser-bar { + left: 0; + right: 0; + height: 2.5em; + padding: 0 25px; + background: var(--background-color); + box-sizing: border-box; + transition: 0.35s ease; + z-index: 100; + width: 100vw; + position: fixed; } -.settings-card h3 { - margin-top: 0; +.browser-button { + border-radius: 10px; color: var(--text-primary); + background: none; + height: 3em; + border: none; + right: 10px; + top: auto; + box-sizing: border-box; + margin-right: 10px; + transition: 0.2s ease; + margin-top: 0 auto; + margin-bottom: 0 auto; } -.settings-card p { - color: var(--text-placeholder); +.browser-button:hover { + transform: scale(1.3); + cursor: pointer; } -a { - color: var(--text-primary); +.nav-btn-left { + float: left; } -input { - padding: 15px; - border-radius: 10px; - background: var(--background-input); - text-align: center; - font-size: 20px; - border: none; - outline: none; - color: var(--text-primary); +.browser-button-right { + float: right; } -.switch { - position: relative; - display: inline-block; - width: 60px; - height: 34px; +.browser-container { + min-width: 5vw; + min-height: 10vh; + display: inline; } -.switch input { - opacity: 0; - width: 0; - height: 0; +.browser-left { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 1%; + width: 80%; } -.slider-round { +.browser-right { position: absolute; + top: 50%; + transform: translateY(-50%); + right: 1%; + width: 20%; +} + +.browser-right .nav-btn:hover { + text-transform: uppercase; cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: var(--slider-inactive-background); - transition: 0.4s; - border-radius: 34px; + font-weight: 800; + font-family: "Inter", sans-serif; + font-style: normal; + font-size: 3vw; + transform: translateX(-20%); } -.slider-round:before { - position: absolute; - content: ""; - height: 26px; - width: 26px; - left: 4px; - bottom: 4px; - background-color: var(--text-primary); - transition: 0.4s; - border-radius: 50%; +.browser-right .nav-btn:hover { + text-transform: uppercase; + cursor: pointer; + font-weight: 800; + font-family: "Inter", sans-serif; + font-style: normal; + font-size: 3vh; + transform: translateX(-20%); } -input:checked + .slider-round { - background-color: var(--slider-active-background); +.fullscreen .browser-bar { + display: none; } -input:checked + .slider-round:before { - transform: translateX(26px); +.fullscreen #ifra { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; } -.key-form { - padding: 15px; - width: 92.5%; - border-radius: 10px; - background: var(--background-buttons); - text-align: center; - font-size: 20px; +.bar { + background: none; border: none; - outline: none; color: var(--text-primary); - margin-top: 10px; + width: 60vw; + height: 30px; + border-radius: 5px; + margin: 0 auto; + transition: 0.3s; } -.key-button { - cursor: pointer; - border: 2px; - font-size: 20px; - transition: 0.2s; - margin-top: 10px; - background-color: var(--background-buttons); - border-radius: 10px; +.bar:focus { + background: var(--background-input); + box-shadow: none; + outline: none; color: var(--text-primary); - height: 50px; - width: 50%; - padding: 10px; - text-align: center; + transition: 0.3s; } -button { - cursor: pointer; - border: 2px; - transition: 0.2s; - margin-top: 10px; - background-color: var(--background-buttons); - border-radius: 10px; +.browser-post { + padding: none; + float: right; + margin-top: 0em; color: var(--text-primary); - height: 50px; - width: 35%; - padding: 10px; - text-align: center; + border-radius: 5px; } -select { - padding: 15px; - width: 100%; - border-radius: 10px; - background: var(--background-buttons); - color: var(--text-primary); - font-size: 20px; - border: 0px; - outline: none; +.overlay { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + display: none; } -#buttonLayer { - width: 400px; - display: flex; - justify-content: center; - gap: 10px; +h1 { + text-align: center; + color: var(--text-primary); + font-size: 50px; + white-space: nowrap; } -#buttonLayer > .key-button { - flex-grow: 1; - padding: 10px; - box-sizing: border-box; +p { + text-align: center; + color: var(--text-primary); + font-size: 25px; } -@media screen and (max-width: 768px) { - .settings-container { - padding: 25% 20px 20px 20px; - } - .settings-card { - width: 100%; - max-width: 400px; - } - - .settings-title { - font-size: 40px; - } - - input, - .key-form { - width: 90%; - } +.frame-container iframe { + display: none; +} - button, - .key-button { - width: 100%; - max-width: 200px; - } +.frame-container iframe.active { + display: block; } -@media screen and (max-width: 500px) { - .settings-container { - padding-top: 35%; - } +#add-tab { + padding: 0.5rem; + cursor: pointer; + background-color: var(--background-settings); + color: var(--text-primary); + border: none; + border-radius: 5px; + margin-right: 0.5rem; + transition: background-color 0.3s ease; } -@media screen and (min-width: 1000px) { - .settings-container { - padding-top: 10%; - } +#add-tab:hover { + background-color: var(--tab-active-background); } -#last-updated { - margin-top: -3%; +ul { + list-style-type: none; + padding: 0; + display: flex; } -#ab-settings { +li { + padding: 0.4rem; + background-color: var(--background-settings); + margin-right: 0.5rem; + cursor: pointer; + border-radius: 5px; + transition: background-color 0.3s ease; display: flex; align-items: center; - gap: 5vw; + justify-content: center; } -#ab-settings-container { - margin-top: 13px; - margin-left: 20px; +li.active { + background-color: var(--tab-active-background); } -#warning { - color: red; +li:hover { + background-color: var(--tab-active-background); } + +iframe { + position: absolute; + width: 100%; + height: 90%; + border: none; + left: 0; + top: 10%; +} \ No newline at end of file From e4bebc0c805910fe728a0889ddecec931b996a6f Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 20 May 2026 21:29:00 -0400 Subject: [PATCH 074/115] feat(build): add temporary runtime obfuscation --- .gitignore | 2 + build.js | 697 ++++++++++++++++++ index.js | 43 +- package-lock.json | 1707 --------------------------------------------- package.json | 6 +- pnpm-lock.yaml | 830 +++++++++++++++++++++- 6 files changed, 1558 insertions(+), 1727 deletions(-) create mode 100644 build.js delete mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 5ba60ba9ab..aaa88db0a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ node_modules +dist + .idea .DS_Store .hintrc diff --git a/build.js b/build.js new file mode 100644 index 0000000000..964fb61e18 --- /dev/null +++ b/build.js @@ -0,0 +1,697 @@ +import { cp, readdir, readFile, writeFile, rm, mkdir } from "node:fs/promises"; +import path from "node:path"; +import { minify } from "terser"; +import JavaScriptObfuscator from "javascript-obfuscator"; +import chalk from "chalk"; + +const OBFUSCATE = true; +const OBFUSCATE_HTML = true; + +const SRC_DIR = path.join(process.cwd(), "static"); +const DIST_DIR = path.join(process.cwd(), "dist"); +const JS_DIR = path.join(DIST_DIR, "assets", "js"); +const UV_DIR = path.join(DIST_DIR, "assets", "ultraviolet"); +const DYNAMIC_DIR = path.join(DIST_DIR, "assets", "dynamic"); + +const UV_PREFIX = "ultraviolet."; +const DYNAMIC_PREFIX = "dynamic."; + +const KEEP_IN_PLACE = new Set(); + +const SKIP_OBFUSCATE = new Set(["scramjet.all.js", "scramjet.sync.js"]); + +const OLD_DYNAMIC_PREFIX = "/assets/dynamic/"; +const OLD_UV_PREFIX = "/assets/ultraviolet/"; + +const OLD_UV_SCOPE = "/uv/"; +const OLD_SCRAMJET_SCOPE = "/uv/scramjet/"; +const OLD_DYNAMIC_SCOPE = "/uv/dynamic/"; + +const WORDS = [ + "api", + "lib", + "src", + "net", + "sys", + "io", + "pkg", + "app", + "mod", + "ext", + "math", + "calc", + "units", + "matrix", + "vector", + "scalar", + "ratio", + "delta", + "sigma", + "alpha", + "beta", + "gamma", + "omega", + "phi", + "theta", + "core", + "util", + "data", + "base", + "node", + "tree", + "heap", + "stack", + "queue", + "graph", + "hash", + "map", + "set", + "list", + "ring", + "chain", + "parse", + "fmt", + "log", + "proc", + "exec", + "init", + "boot", + "load", + "sync", + "async", + "fetch", + "emit", + "bind", + "wrap", + "pool", + "fork", + "dictionary", + "mapping", + "resolver", + "adapter", + "encoder", + "decoder", + "scheduler", + "dispatcher", + "observer", + "registry", + "factory", + "builder", + "transform", + "pipeline", + "middleware", + "handler", + "router", + "broker", + "storage", + "cache", + "buffer", + "stream", + "channel", + "socket", + "bridge", + "monitor", + "profiler", + "tracer", + "validator", + "sanitizer", + "1", + "2", + "3", + "v1", + "v2", + "v3", + "that", + "was", + "my", + "part", + "of", + "the", + "deal", + ",", + "honest", + "we", + "got", + "so", + "familiar", + "spending", + "each", + "day", + "of", + "the", + "year", + "white", + "ferrari", + "(oh)", + "good", + "times", +]; + +const FILENAMES = [ + "x", + "y", + "z", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "1", + "2", + "3", + "10", + "11", + "100", + "mod", + "lib", + "api", + "run", + "cli", + "app", + "env", + "cfg", + "index", + "main", + "core", + "init", + "loader", + "worker", + "runtime", + "parser", + "formatter", + "handler", + "manager", + "client", + "server", + "config", + "schema", + "mapper", + "adapter", + "resolver", + "encoder", + "decoder", + "sync", + "fetch", + "stream", + "buffer", + "queue", + "cache", + "router", + "dispatcher", + "emitter", + "observer", + "builder", + "factory", + "transform", + "pipeline", + "registry", + "validator", + "scheduler", + "monitor", + "tracer", + "bridge", + "channel", + "storage", + "profiler", +]; + +function randomItem(arr) { + return arr[Math.floor(Math.random() * arr.length)]; +} + +function randomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function randomSegment() { + if (Math.random() < 0.1) return `${randomItem(WORDS)}-${randomItem(WORDS)}`; + return randomItem(WORDS); +} + +function randomWord() { + return randomItem(WORDS); +} + +function randomDir() { + const depth = randomInt(1, 2); + return Array.from({ length: depth }, randomSegment).join("/"); +} + +function randomFilename() { + if (Math.random() < 0.1) return `${randomItem(FILENAMES)}-${randomItem(FILENAMES)}`; + return randomItem(FILENAMES); +} + +function escapeRegex(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} + +function applyRenameMap(content, renameMap, protectedPrefixes) { + let result = content; + for (const [original, newPublicPath] of renameMap) { + const q = `['"\`]`; + const pattern = new RegExp(`(${q})([^'"\`]*${escapeRegex(original)})(${q})`, "g"); + result = result.replace(pattern, (_m, open, inner, close) => { + if (protectedPrefixes.some(p => inner.includes(p))) return `${open}${inner}${close}`; + return `${open}${newPublicPath}${close}`; + }); + } + return result; +} + +function replaceAll(content, oldStr, newStr) { + return content.split(oldStr).join(newStr); +} + +async function runObfuscator(source) { + const minified = await minify(source, { + compress: { drop_console: false, passes: 2 }, + mangle: true, + format: { comments: false }, + }); + if (!minified.code) throw new Error("Terser returned empty output"); + + const obfuscated = JavaScriptObfuscator.obfuscate(minified.code, { + compact: true, + controlFlowFlattening: true, + controlFlowFlatteningThreshold: 0.5, + deadCodeInjection: false, + debugProtection: false, + disableConsoleOutput: false, + identifierNamesGenerator: "hexadecimal", + renameGlobals: false, + selfDefending: false, + splitStrings: true, + splitStringsChunkLength: 5, + stringArray: true, + stringArrayEncoding: ["base64"], + stringArrayThreshold: 1, + transformObjectKeys: true, + unicodeEscapeSequence: false, + }); + return obfuscated.getObfuscatedCode(); +} + +function shouldProcessInlineScript(attrs) { + if (/\bsrc\s*=/i.test(attrs)) return false; + + const typeMatch = attrs.match(/\btype\s*=\s*(["']?)([^"'\s>]+)\1/i); + if (!typeMatch) return true; + + const type = typeMatch[2].toLowerCase(); + return ["text/javascript", "application/javascript", "module"].includes(type); +} + +async function obfuscateInlineScripts(html) { + const scripts = []; + let index = 0; + + const protectedHtml = html.replace(/]*)>([\s\S]*?)<\/script>/gi, (match, attrs, source) => { + const token = `___HTML_SCRIPT_${index++}___`; + scripts.push({ token, match, attrs, source }); + return token; + }); + + const processedScripts = await Promise.all( + scripts.map(async script => { + if (!script.source.trim() || !shouldProcessInlineScript(script.attrs)) return [script.token, script.match]; + + try { + const obfuscated = await runObfuscator(script.source); + return [script.token, `${obfuscated}`]; + } catch (err) { + console.warn(chalk.yellow(` ! inline script skipped: ${err.message}`)); + return [script.token, script.match]; + } + }), + ); + + let output = protectedHtml; + for (const [token, script] of processedScripts) output = output.replace(token, script); + return output; +} + +function minifyHtml(html) { + const blocks = []; + let index = 0; + + const protectBlock = block => { + const token = `___HTML_BLOCK_${index++}___`; + blocks.push([token, block]); + return token; + }; + + let output = html + .replace(/<(script|style|pre|textarea)\b[\s\S]*?<\/\1>/gi, protectBlock) + .replace(//gi, "") + .replace(/\s{2,}/g, " ") + .replace(/>\s+<") + .replace(/\s+\/>/g, "/>") + .trim(); + + for (const [token, block] of blocks) output = output.replace(token, block); + return output; +} + +function encodeHtmlText(text) { + return text.replace(/&(?:#\d+|#x[\da-f]+|[a-z][\da-z]+);|./gis, match => { + if (match.startsWith("&") && match.endsWith(";")) return match; + return `&#${match.codePointAt(0)};`; + }); +} + +function obfuscateTextNodes(html) { + return html.replace(/>([^<>]+) { + if (!text.trim()) return `>${text}<`; + return `>${encodeHtmlText(text)}<`; + }); +} + +function obfuscateAttributeValues(html) { + const valueAttrs = "alt|aria-label|class|content|crossorigin|href|id|method|name|onclick|onchange|onkeyup|placeholder|rel|src|style|title|type|value"; + const attrPattern = new RegExp(`\\s(${valueAttrs})=(["'])(.*?)\\2`, "gis"); + + return html.replace(/<([a-z][\w:-]*)([^<>]*)>/gi, (tag, name, attrs) => { + if (/^style$/i.test(name)) return tag; + + const encodedAttrs = attrs.replace(attrPattern, (_match, attrName, quote, value) => { + if (!value) return ` ${attrName}=${quote}${value}${quote}`; + return ` ${attrName}=${quote}${encodeHtmlText(value)}${quote}`; + }); + + return `<${name}${encodedAttrs}>`; + }); +} + +function obfuscateHtmlMarkup(html) { + const blocks = []; + let index = 0; + + const protectBlock = block => { + const token = ``; + blocks.push([token, block]); + return token; + }; + + let output = html.replace(/<(script|style|pre|textarea)\b[\s\S]*?<\/\1>/gi, protectBlock); + output = obfuscateAttributeValues(output); + output = obfuscateTextNodes(output); + + for (const [token, block] of blocks) output = output.replace(token, block); + output = obfuscateAttributeValues(output); + return output; +} + +async function obfuscateHtml(html) { + return obfuscateHtmlMarkup(minifyHtml(await obfuscateInlineScripts(html))); +} + +async function getJsFiles(dir) { + let entries; + try { + entries = await readdir(dir, { withFileTypes: true }); + } catch { + return []; + } + const files = []; + for (const entry of entries) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) files.push(...(await getJsFiles(full))); + else if (entry.name.endsWith(".js")) files.push(full); + } + return files; +} + +async function getHtmlFiles(dir) { + let entries; + try { + entries = await readdir(dir, { withFileTypes: true }); + } catch { + return []; + } + const files = []; + for (const entry of entries) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) files.push(...(await getHtmlFiles(full))); + else if (entry.name.endsWith(".html")) files.push(full); + } + return files; +} + +async function updateServerRoutes(uvScope, scramjetScope, dynamicScope) { + const indexPath = path.join(process.cwd(), "index.js"); + try { + let content = await readFile(indexPath, "utf8"); + content = replaceAll(content, OLD_UV_SCOPE, uvScope); + content = replaceAll(content, OLD_SCRAMJET_SCOPE, scramjetScope); + content = replaceAll(content, OLD_DYNAMIC_SCOPE, dynamicScope); + await writeFile(indexPath, content, "utf8"); + console.log(chalk.green(" + index.js (scope routes updated)")); + } catch {} +} + +async function build() { + console.log("Cleaning dist/..."); + await rm(DIST_DIR, { recursive: true, force: true }); + + console.log("Copying static/ -> dist/..."); + await cp(SRC_DIR, DIST_DIR, { recursive: true }); + + console.log(OBFUSCATE ? chalk.yellow("Obfuscation: ON") : chalk.yellow("Obfuscation: OFF (rename + rewrite only)")); + + const uvBase = randomWord(); + const scramjetSub = randomWord(); + const dynamicSub = randomWord(); + + const NEW_UV_SCOPE = `/${uvBase}/`; + const NEW_SCRAMJET_SCOPE = `/${uvBase}/${scramjetSub}/`; + const NEW_DYNAMIC_SCOPE = `/${uvBase}/${dynamicSub}/`; + + console.log(`\nScope paths:`); + console.log(` ${OLD_UV_SCOPE} -> ${NEW_UV_SCOPE}`); + console.log(` ${OLD_SCRAMJET_SCOPE} -> ${NEW_SCRAMJET_SCOPE}`); + console.log(` ${OLD_DYNAMIC_SCOPE} -> ${NEW_DYNAMIC_SCOPE}`); + + let jsPublicDir, dynPublicDir; + do { + jsPublicDir = randomDir(); + dynPublicDir = randomDir(); + } while (jsPublicDir === dynPublicDir); + + const jsDirFull = path.join(DIST_DIR, jsPublicDir); + const dynDirFull = path.join(DIST_DIR, dynPublicDir); + await mkdir(jsDirFull, { recursive: true }); + await mkdir(dynDirFull, { recursive: true }); + + const NEW_DYNAMIC_FILE_PREFIX = `/${dynPublicDir}/`; + const NEW_UV_FILE_PREFIX = `/${jsPublicDir}/`; + + const PROTECTED = ["/bm/", "/ep/", "/bare/", "/wisp/", "/assets/scramjet/", NEW_UV_SCOPE, NEW_SCRAMJET_SCOPE, NEW_DYNAMIC_SCOPE]; + + const usedPaths = new Set(); + + function nextOutputPath(basePublicDir, baseDirFull) { + const existingSegments = new Set(basePublicDir.split("/").filter(Boolean)); + let publicPath, fullPath; + do { + const filename = `${randomFilename()}.js`; + if (Math.random() < 0.05) { + let subDir; + do { + subDir = randomWord(); + } while (existingSegments.has(subDir)); + publicPath = `/${basePublicDir}/${subDir}/${filename}`; + fullPath = path.join(baseDirFull, subDir, filename); + } else { + publicPath = `/${basePublicDir}/${filename}`; + fullPath = path.join(baseDirFull, filename); + } + } while (usedPaths.has(publicPath)); + usedPaths.add(publicPath); + return { publicPath, fullPath }; + } + + const jsRenameMap = new Map(); + const dynRenameMap = new Map(); + const plan = new Map(); + + for (const filePath of await getJsFiles(JS_DIR)) { + const basename = path.basename(filePath); + const { publicPath: newPublicPath, fullPath: newFullPath } = nextOutputPath(jsPublicDir, jsDirFull); + plan.set(filePath, { basename, newPublicPath, newFullPath, inPlace: false, group: "js" }); + jsRenameMap.set(basename, newPublicPath); + } + + for (const filePath of await getJsFiles(UV_DIR)) { + const basename = path.basename(filePath); + const { publicPath: newPublicPath, fullPath: newFullPath } = nextOutputPath(jsPublicDir, jsDirFull); + plan.set(filePath, { basename, newPublicPath, newFullPath, inPlace: false, group: "uv" }); + jsRenameMap.set(basename, newPublicPath); + } + + const ROOT_JS = ["sw.js"]; + for (const name of ROOT_JS) { + const filePath = path.join(DIST_DIR, name); + let newName; + do { + newName = `${randomFilename()}.js`; + } while (usedPaths.has(`/${newName}`)); + usedPaths.add(`/${newName}`); + const newPublicPath = `/${newName}`; + const newFullPath = path.join(DIST_DIR, newName); + plan.set(filePath, { basename: name, newPublicPath, newFullPath, inPlace: false, group: "uv" }); + jsRenameMap.set(name, newPublicPath); + } + + for (const filePath of await getJsFiles(DYNAMIC_DIR)) { + const basename = path.basename(filePath); + + if (basename.startsWith(DYNAMIC_PREFIX)) { + const { publicPath: newPublicPath, fullPath: newFullPath } = nextOutputPath(dynPublicDir, dynDirFull); + plan.set(filePath, { basename, newPublicPath, newFullPath, inPlace: false, group: "dynamic" }); + dynRenameMap.set(basename, newPublicPath); + } else { + const rel = path.relative(DIST_DIR, filePath).replace(/\\/g, "/"); + plan.set(filePath, { basename, newPublicPath: `/${rel}`, newFullPath: filePath, inPlace: true, group: "dynamic" }); + } + } + + console.log(`\nJS/UV output: /${jsPublicDir}`); + console.log(`Dynamic output: /${dynPublicDir}\n`); + + let passed = 0; + let failed = 0; + + await Promise.all( + [...plan.entries()].map(async ([filePath, { basename, newPublicPath, newFullPath, inPlace, group }]) => { + try { + let output = await readFile(filePath, "utf8"); + + output = replaceAll(output, OLD_SCRAMJET_SCOPE, NEW_SCRAMJET_SCOPE); + output = replaceAll(output, OLD_DYNAMIC_SCOPE, NEW_DYNAMIC_SCOPE); + output = replaceAll(output, OLD_UV_SCOPE, NEW_UV_SCOPE); + + if (group === "js" || group === "uv") { + output = replaceAll(output, OLD_UV_PREFIX, NEW_UV_FILE_PREFIX); + output = applyRenameMap(output, jsRenameMap, PROTECTED); + output = replaceAll(output, OLD_DYNAMIC_PREFIX, NEW_DYNAMIC_FILE_PREFIX); + output = applyRenameMap(output, dynRenameMap, PROTECTED); + } + + if (group === "dynamic") { + output = replaceAll(output, OLD_DYNAMIC_PREFIX, NEW_DYNAMIC_FILE_PREFIX); + for (const [orig, newPath] of dynRenameMap) { + const q = `['"\`]`; + const pat = new RegExp(`(${q})${escapeRegex(orig)}(${q})`, "g"); + output = output.replace(pat, `$1${newPath}$2`); + } + output = applyRenameMap(output, dynRenameMap, PROTECTED); + } + + const shouldObfuscate = OBFUSCATE && !SKIP_OBFUSCATE.has(basename); + if (shouldObfuscate) output = await runObfuscator(output); + + await mkdir(path.dirname(newFullPath), { recursive: true }); + await writeFile(newFullPath, output, "utf8"); + if (!inPlace) await rm(filePath); + + const tag = shouldObfuscate ? "(obfuscated)" : SKIP_OBFUSCATE.has(basename) ? "(skip-obfuscate)" : inPlace ? "(in place)" : "(renamed)"; + console.log(chalk.green(` + ${basename} -> ${newPublicPath} ${tag}`)); + passed++; + } catch (err) { + console.error(chalk.red(` x ${basename}: ${err.message}`)); + failed++; + } + }), + ); + + console.log(`\n${passed} processed${failed ? `, ${failed} failed` : ""}`); + + for (const dir of [JS_DIR, UV_DIR, DYNAMIC_DIR]) { + await rm(dir, { recursive: true, force: true }); + } + + const allRenames = new Map([...jsRenameMap, ...dynRenameMap]); + const htmlFiles = await getHtmlFiles(DIST_DIR); + console.log(`\nUpdating ${htmlFiles.length} HTML files${OBFUSCATE_HTML ? " + obfuscating" : ""}...\n`); + + await Promise.all( + htmlFiles.map(async htmlPath => { + let html = await readFile(htmlPath, "utf8"); + let changed = false; + + for (const [oldScope, newScope] of [ + [OLD_SCRAMJET_SCOPE, NEW_SCRAMJET_SCOPE], + [OLD_DYNAMIC_SCOPE, NEW_DYNAMIC_SCOPE], + [OLD_UV_SCOPE, NEW_UV_SCOPE], + ]) { + const updated = replaceAll(html, oldScope, newScope); + if (updated !== html) { + html = updated; + changed = true; + } + } + + for (const [original, newPublicPath] of allRenames) { + const pattern = new RegExp(`((?:src|href)=["'])[^"']*${escapeRegex(original)}(["'])`, "g"); + const updated = html.replace(pattern, `$1${newPublicPath}$2`); + if (updated !== html) { + html = updated; + changed = true; + } + } + + if (OBFUSCATE_HTML) { + const obfuscated = await obfuscateHtml(html); + if (obfuscated !== html) { + html = obfuscated; + changed = true; + } + } + + if (changed) { + await writeFile(htmlPath, html, "utf8"); + console.log(chalk.green(` + ${path.relative(DIST_DIR, htmlPath)}${OBFUSCATE_HTML ? " (html-obfuscated)" : ""}`)); + } else { + console.log(chalk.gray(` - ${path.relative(DIST_DIR, htmlPath)} (no changes)`)); + } + }), + ); + + const allJs = await getJsFiles(DIST_DIR); + const otherJs = allJs.filter(f => !f.startsWith(jsDirFull) && !f.startsWith(dynDirFull) && !f.startsWith(JS_DIR) && !f.startsWith(UV_DIR) && !f.startsWith(DYNAMIC_DIR)); + + if (otherJs.length) { + console.log(`\nUpdating ${otherJs.length} other JS files...\n`); + await Promise.all( + otherJs.map(async jsPath => { + const content = await readFile(jsPath, "utf8"); + let updated = content; + updated = replaceAll(updated, OLD_SCRAMJET_SCOPE, NEW_SCRAMJET_SCOPE); + updated = replaceAll(updated, OLD_DYNAMIC_SCOPE, NEW_DYNAMIC_SCOPE); + updated = replaceAll(updated, OLD_UV_SCOPE, NEW_UV_SCOPE); + updated = replaceAll(updated, OLD_UV_PREFIX, NEW_UV_FILE_PREFIX); + updated = replaceAll(updated, OLD_DYNAMIC_PREFIX, NEW_DYNAMIC_FILE_PREFIX); + updated = applyRenameMap(updated, allRenames, PROTECTED); + if (updated !== content) { + await writeFile(jsPath, updated, "utf8"); + console.log(chalk.green(` + ${path.relative(DIST_DIR, jsPath)}`)); + } + }), + ); + } + + console.log("\nUpdating server routes...\n"); + await updateServerRoutes(NEW_UV_SCOPE, NEW_SCRAMJET_SCOPE, NEW_DYNAMIC_SCOPE); + + console.log(chalk.green("\nBuild complete -> dist/")); + console.log(chalk.blue(`\nNew scope: ${NEW_UV_SCOPE} scramjet: ${NEW_SCRAMJET_SCOPE} dynamic: ${NEW_DYNAMIC_SCOPE}`)); +} + +build().catch(err => { + console.error(chalk.red("\nBuild failed:"), err); + process.exit(1); +}); diff --git a/index.js b/index.js index cd2b3eb484..37e0cf747d 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,4 @@ +import { existsSync } from "node:fs"; import http from "node:http"; import path from "node:path"; import bareMuxNode from "@mercuryworkshop/bare-mux/node"; @@ -15,6 +16,12 @@ import config from "./config.js"; console.log(chalk.yellow("🚀 Starting server...")); const __dirname = process.cwd(); + +const DIST_DIR = path.join(__dirname, "dist"); +const STATIC_DIR = path.join(__dirname, "static"); +const SERVE_DIR = existsSync(DIST_DIR) ? DIST_DIR : STATIC_DIR; +console.log(chalk.blue(`Serving from ${path.relative(__dirname, SERVE_DIR)}/`)); + const server = http.createServer(); const app = express(); const bareServer = createBareServer("/bare/"); @@ -57,12 +64,13 @@ const ghGamesBases = { }; const noMimeExts = new Set([".unityweb"]); -app.get("/gh-games/*", ghGamesLimiter, async (req, res, next) => { +app.get("/gh-games/:path(*)", ghGamesLimiter, async (req, res, next) => { try { + const reqPath = "/gh-games/" + req.params.path; let reqTarget; for (const [prefix, baseUrl] of Object.entries(ghGamesBases)) { - if (req.path.startsWith(prefix)) { - reqTarget = baseUrl + req.path.slice(prefix.length); + if (reqPath.startsWith(prefix)) { + reqTarget = baseUrl + reqPath.slice(prefix.length); break; } } @@ -75,10 +83,7 @@ app.get("/gh-games/*", ghGamesLimiter, async (req, res, next) => { const asset = await fetch(reqTarget, { headers: upstreamHeaders }); - if (asset.status === 304) { - return res.sendStatus(304); - } - + if (asset.status === 304) return res.sendStatus(304); if (!asset.ok) return next(); const data = Buffer.from(await asset.arrayBuffer()); @@ -116,7 +121,19 @@ const transportStaticOptions = { }, }; -app.use(express.static(path.join(__dirname, "static"))); +const jsStaticOptions = { + setHeaders: (res, filePath) => { + const ext = path.extname(filePath); + if (ext === ".js" || ext === ".mjs") { + res.type("text/javascript"); + res.setHeader("Service-Worker-Allowed", "/"); + } else if (ext === ".wasm") { + res.type("application/wasm"); + } + }, +}; + +app.use(express.static(SERVE_DIR, jsStaticOptions)); app.use("/bare", cors({ origin: true })); app.use("/bm", express.static(baremuxPath, transportStaticOptions)); app.use("/ep", express.static(epoxyDistPath, transportStaticOptions)); @@ -132,17 +149,17 @@ const routes = [ routes.forEach(route => { app.get(route.path, generalLimiter, (_req, res) => { - res.sendFile(path.join(__dirname, "static", route.file)); + res.sendFile(path.join(SERVE_DIR, route.file)); }); }); -app.use(generalLimiter, (req, res) => { - res.status(404).sendFile(path.join(__dirname, "static", "404.html")); +app.use(generalLimiter, (_req, res) => { + res.status(404).sendFile(path.join(SERVE_DIR, "404.html")); }); -app.use(generalLimiter, (err, req, res, next) => { +app.use(generalLimiter, (err, _req, res, _next) => { console.error(err.stack); - res.status(500).sendFile(path.join(__dirname, "static", "404.html")); + res.status(500).sendFile(path.join(SERVE_DIR, "404.html")); }); server.on("request", (req, res) => { diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 0cb523e555..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,1707 +0,0 @@ -{ - "name": "interstellar", - "version": "5.2.5", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "interstellar", - "version": "5.2.5", - "license": "GPL-3.0-or-later", - "dependencies": { - "@mercuryworkshop/bare-mux": "^2.1.8", - "@mercuryworkshop/epoxy-transport": "2.1.28", - "@mercuryworkshop/scramjet": "^1.0.2", - "@mercuryworkshop/wisp-js": "^0.4.1", - "@nebula-services/bare-server-node": "^2.0.4", - "chalk": "^5.4.1", - "cookie-parser": "^1.4.7", - "cors": "^2.8.5", - "dotenv": "^17.2.0", - "express": "^4.21.2", - "express-basic-auth": "^1.2.1", - "express-rate-limit": "^7.5.0", - "mime": "^4.1.0", - "node-fetch": "^3.3.2" - }, - "devDependencies": { - "@biomejs/biome": "2.2.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@biomejs/biome": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.2.tgz", - "integrity": "sha512-j1omAiQWCkhuLgwpMKisNKnsM6W8Xtt1l0WZmqY/dFj8QPNkIoTvk4tSsi40FaAAkBE1PU0AFG2RWFBWenAn+w==", - "dev": true, - "bin": { - "biome": "bin/biome" - }, - "engines": { - "node": ">=14.21.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/biome" - }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.2.2", - "@biomejs/cli-darwin-x64": "2.2.2", - "@biomejs/cli-linux-arm64": "2.2.2", - "@biomejs/cli-linux-arm64-musl": "2.2.2", - "@biomejs/cli-linux-x64": "2.2.2", - "@biomejs/cli-linux-x64-musl": "2.2.2", - "@biomejs/cli-win32-arm64": "2.2.2", - "@biomejs/cli-win32-x64": "2.2.2" - } - }, - "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.2.tgz", - "integrity": "sha512-6ePfbCeCPryWu0CXlzsWNZgVz/kBEvHiPyNpmViSt6A2eoDf4kXs3YnwQPzGjy8oBgQulrHcLnJL0nkCh80mlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.2.tgz", - "integrity": "sha512-Tn4JmVO+rXsbRslml7FvKaNrlgUeJot++FkvYIhl1OkslVCofAtS35MPlBMhXgKWF9RNr9cwHanrPTUUXcYGag==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.2.tgz", - "integrity": "sha512-JfrK3gdmWWTh2J5tq/rcWCOsImVyzUnOS2fkjhiYKCQ+v8PqM+du5cfB7G1kXas+7KQeKSWALv18iQqdtIMvzw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.2.tgz", - "integrity": "sha512-/MhYg+Bd6renn6i1ylGFL5snYUn/Ct7zoGVKhxnro3bwekiZYE8Kl39BSb0MeuqM+72sThkQv4TnNubU9njQRw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.2.tgz", - "integrity": "sha512-Ogb+77edO5LEP/xbNicACOWVLt8mgC+E1wmpUakr+O4nKwLt9vXe74YNuT3T1dUBxC/SnrVmlzZFC7kQJEfquQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.2.tgz", - "integrity": "sha512-ZCLXcZvjZKSiRY/cFANKg+z6Fhsf9MHOzj+NrDQcM+LbqYRT97LyCLWy2AS+W2vP+i89RyRM+kbGpUzbRTYWig==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.2.tgz", - "integrity": "sha512-wBe2wItayw1zvtXysmHJQoQqXlTzHSpQRyPpJKiNIR21HzH/CrZRDFic1C1jDdp+zAPtqhNExa0owKMbNwW9cQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.2.tgz", - "integrity": "sha512-DAuHhHekGfiGb6lCcsT4UyxQmVwQiBCBUMwVra/dcOSs9q8OhfaZgey51MlekT3p8UwRqtXQfFuEJBhJNdLZwg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@mercuryworkshop/bare-mux": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@mercuryworkshop/bare-mux/-/bare-mux-2.1.9.tgz", - "integrity": "sha512-fiOqWm3VP0Bl8T+0l+qnb7ab9zO+PpKVbtJvOnMsefUv6kWIaoDtqyr9hd/t4gA8oBwgtyZVqIwO2J9nKY9ylw==" - }, - "node_modules/@mercuryworkshop/epoxy-tls": { - "version": "2.1.18-1", - "resolved": "https://registry.npmjs.org/@mercuryworkshop/epoxy-tls/-/epoxy-tls-2.1.18-1.tgz", - "integrity": "sha512-2N1BYn/+FJxIbRw+sipbl3mQPinRflqQDB9HGAXJEVj4Ok4FIlTlS4fO2cpXKEq5yoD3oaKb8GyNaQfndNui9w==", - "license": "AGPL-3.0-only" - }, - "node_modules/@mercuryworkshop/epoxy-transport": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/@mercuryworkshop/epoxy-transport/-/epoxy-transport-2.1.28.tgz", - "integrity": "sha512-lv/Kfdn37y8ZCXQaIT3Ebj4OSztBqeXdbR9rchbHQBKIw/fNSQJLGNBHV5ScXSzqt7NCwv8ZiZx7urRyk7Ua/Q==", - "license": "AGPL-3.0-only", - "dependencies": { - "@mercuryworkshop/epoxy-tls": "2.1.18-1" - } - }, - "node_modules/@mercuryworkshop/scramjet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mercuryworkshop/scramjet/-/scramjet-1.1.0.tgz", - "integrity": "sha512-T/9GZqAQX42eYr/t6VGR2m9J4BtIuncRkANo8hBVTGskrr522yuhaADhSu+65DYlhUyQnLUjDikuNYzlgv0Ejw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@mercuryworkshop/bare-mux": "^2.1.9", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "htmlparser2": "10.0.0", - "idb": "^8.0.3", - "parse-domain": "^8.2.2", - "set-cookie-parser": "^2.7.1" - } - }, - "node_modules/@mercuryworkshop/wisp-js": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@mercuryworkshop/wisp-js/-/wisp-js-0.4.1.tgz", - "integrity": "sha512-104LwiXiuhti/e32gmv0Da0u0yuLFDHX8JawCzleTPWJ5t5qTX4EYi4E7/ucbjBPN9wwVPWHE5g5yGqzl/NzQA==", - "license": "AGPL-3.0", - "dependencies": { - "bufferutil": "^4.0.9", - "commander": "^14.0.2", - "ipaddr.js": "^2.3.0", - "ws": "^8.18.3" - }, - "bin": { - "wisp-js-server": "src/bin/server_cli.mjs" - } - }, - "node_modules/@mercuryworkshop/wisp-js/node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@nebula-services/bare-server-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nebula-services/bare-server-node/-/bare-server-node-2.0.4.tgz", - "integrity": "sha512-Jcr+QtkLJVmppdbBarEbRp1TtCsL4pjFIcX6+KPURRqcsOP7hZfYclhjmCserwEC7jT+WBduXpFd3qwqeRBNew==", - "license": "GPL-3.0", - "dependencies": { - "async-exit-hook": "^2.0.1", - "commander": "^10.0.1", - "dotenv": "^16.0.3", - "http-errors": "^2.0.0", - "ipaddr.js": "^2.1.0", - "source-map-support": "^0.5.21", - "ws": "^8.18.0" - }, - "bin": { - "bare-server-node": "bin.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@nebula-services/bare-server-node/node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", - "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.15.1", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/body-parser/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bufferutil": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", - "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/clone-regexp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", - "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", - "license": "MIT", - "dependencies": { - "is-regexp": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-hrtime": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", - "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", - "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", - "license": "MIT", - "dependencies": { - "cookie": "0.7.2", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-basic-auth": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz", - "integrity": "sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==", - "license": "MIT", - "dependencies": { - "basic-auth": "^2.0.1" - } - }, - "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function-timeout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", - "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idb": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.3.tgz", - "integrity": "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==", - "license": "ISC" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ip-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", - "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ipaddr.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", - "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-ip": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", - "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", - "license": "MIT", - "dependencies": { - "ip-regex": "^5.0.0", - "super-regex": "^0.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-regexp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", - "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", - "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", - "funding": [ - "https://github.com/sponsors/broofa" - ], - "bin": { - "mime": "bin/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parse-domain": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-domain/-/parse-domain-8.3.0.tgz", - "integrity": "sha512-oOjqUI93wiFHJlywlOKU9FEw60Q0LMy8S1s/AhnVhCB9LZkwIsCIZfqujeJ16u7rRzLdTEY2OpxlGRhLdnNNYA==", - "license": "MIT", - "dependencies": { - "is-ip": "^5.0.1" - }, - "bin": { - "parse-domain-update": "bin/update.js" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/super-regex": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", - "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==", - "license": "MIT", - "dependencies": { - "clone-regexp": "^3.0.0", - "function-timeout": "^0.1.0", - "time-span": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/time-span": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", - "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", - "license": "MIT", - "dependencies": { - "convert-hrtime": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/ws": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", - "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - } - } -} diff --git a/package.json b/package.json index a18c4ea6d0..65a91f4783 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ }, "scripts": { "start": "node index.js", + "build": "node build.js", "format": "pnpm biome format --write .", "precommit": "pnpm run format && pnpm biome check --write .", "lint": "biome lint --write ." @@ -31,14 +32,15 @@ "node-fetch": "^3.3.2" }, "devDependencies": { - "@biomejs/biome": "2.2.2" + "@biomejs/biome": "2.2.2", + "javascript-obfuscator": "^4.1.1", + "terser": "^5.36.0" }, "packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319", "pnpm": { "overrides": { "qs@>=6.7.0 <=6.14.1": ">=6.14.2", "qs@<6.14.1": ">=6.14.1", - "path-to-regexp@<0.1.13": ">=0.1.13", "uuid@<14.0.0": ">=14.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40733997d0..3120f42091 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,6 @@ settings: overrides: qs@>=6.7.0 <=6.14.1: '>=6.14.2' qs@<6.14.1: '>=6.14.1' - path-to-regexp@<0.1.13: '>=0.1.13' uuid@<14.0.0: '>=14.0.0' importers: @@ -60,6 +59,12 @@ importers: '@biomejs/biome': specifier: 2.2.2 version: 2.2.2 + javascript-obfuscator: + specifier: ^4.1.1 + version: 4.2.2 + terser: + specifier: ^5.36.0 + version: 5.46.2 packages: @@ -272,6 +277,41 @@ packages: cpu: [x64] os: [win32] + '@inversifyjs/common@1.3.3': + resolution: {integrity: sha512-ZH0wrgaJwIo3s9gMCDM2wZoxqrJ6gB97jWXncROfYdqZJv8f3EkqT57faZqN5OTeHWgtziQ6F6g3L8rCvGceCw==} + + '@inversifyjs/core@1.3.4': + resolution: {integrity: sha512-gCCmA4BdbHEFwvVZ2elWgHuXZWk6AOu/1frxsS+2fWhjEk2c/IhtypLo5ytSUie1BCiT6i9qnEo4bruBomQsAA==} + + '@inversifyjs/reflect-metadata-utils@0.2.3': + resolution: {integrity: sha512-d3D0o9TeSlvaGM2I24wcNw/Aj3rc4OYvHXOKDC09YEph5fMMiKd6fq1VTQd9tOkDNWvVbw+cnt45Wy9P/t5Lvw==} + peerDependencies: + reflect-metadata: 0.2.2 + + '@javascript-obfuscator/escodegen@2.3.1': + resolution: {integrity: sha512-Z0HEAVwwafOume+6LFXirAVZeuEMKWuPzpFbQhCEU9++BMz0IwEa9bmedJ+rMn/IlXRBID9j3gQ0XYAa6jM10g==} + engines: {node: '>=6.0'} + + '@javascript-obfuscator/estraverse@5.4.0': + resolution: {integrity: sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==} + engines: {node: '>=4.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mercuryworkshop/bare-mux@1.1.4': resolution: {integrity: sha512-mJPezqEpiKTCs+wu/3TowilnVXQgFs4SqoQnnbCbOc5cV6bDggaolKkyYjDnmOB9t/nptIIXDWDB31oS9vX9kA==} @@ -296,9 +336,15 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + '@types/validator@13.15.10': + resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} + '@webreflection/idb-map@0.1.3': resolution: {integrity: sha512-7lTEpXDgpy9xueW4NSNkBHgqedz/dlGgtwTZa4fRMKWJKcnC9cORVlXwV7qNyYYKarT8gpB1+wv5UNBYhjgc8w==} @@ -306,9 +352,49 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + astravel@0.6.1: resolution: {integrity: sha512-ZIkgWFIV0Yo423Vqalz7VcF+BAiISvSgplnkV2abPGACPFKofsWTcvr9SFyYM/t/vMZWqmdP/Eze6ATX7r84Dg==} @@ -320,6 +406,16 @@ packages: resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} engines: {node: '>=0.12.0'} + atomically@2.1.1: + resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + basic-auth@2.0.1: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} @@ -328,6 +424,9 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -343,22 +442,64 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + chalk@5.4.1: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chance@1.1.13: + resolution: {integrity: sha512-V6lQCljcLznE7tUYUM9EOAnnKXbctE6j/rdQkYOHIWbfGQbrzTsAXNW9CdU5XCo4ArXQCj/rb6HgxPlmGJcaUg==} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + class-validator@0.14.3: + resolution: {integrity: sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + conf@15.0.2: + resolution: {integrity: sha512-JBSrutapCafTrddF9dH3lc7+T2tBycGF4uPkI4Js+g4vLLEhG6RZcFi3aJd5zntdf5tQxAejJt8dihkoQ/eSJw==} + engines: {node: '>=20'} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -386,10 +527,17 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + debounce-fn@6.0.0: + resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} + engines: {node: '>=18'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -398,6 +546,17 @@ packages: supports-color: optional: true + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -419,6 +578,10 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-prop@10.1.0: + resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} + engines: {node: '>=20'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -446,6 +609,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -472,6 +639,31 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -489,6 +681,15 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.1: + resolution: {integrity: sha512-h2r7rcm6Ee/J8o0LD5djLuFVcfbZxhvho4vvsbeV0aMvXjUgqv4YpxpkEx0d68l6+IleVfLAdVEfhR7QNMkGHQ==} + fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -497,6 +698,10 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -512,6 +717,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -524,10 +733,21 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -546,6 +766,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inversify@6.1.4: + resolution: {integrity: sha512-PbxrZH/gTa1fpPEEGAjJQzK8tKMIp5gRg6EFNJlCtzUcycuNdmhv3uk5P8Itm/RIjgHJO16oQRLo9IHzQN51bA==} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -558,10 +781,62 @@ packages: resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + javascript-obfuscator@4.2.2: + resolution: {integrity: sha512-+7oXAUnFCA6vS0omIGHcWpSr67dUBIF7FKGYSXyzxShSLqM6LBgdugWKFl0XrYtGWyJMGfQR5F4LL85iCefkRA==} + engines: {node: '>=18.0.0'} + hasBin: true + + js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + libphonenumber-js@1.12.42: + resolution: {integrity: sha512-oKQFPTibqQwZZkChCDVMFVJXMZdyJNqDWZWYNn8BgyAaK/6yFJEowxCY0RVFirRyWP63hMRuKlkSEd9qlvbWXg==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -595,12 +870,28 @@ packages: engines: {node: '>=16'} hasBin: true + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -626,16 +917,44 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -653,15 +972,31 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -670,6 +1005,10 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -700,18 +1039,61 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + string-template@1.0.0: + resolution: {integrity: sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==} + + stringz@2.1.0: + resolution: {integrity: sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==} + + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + terser@5.46.2: + resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} + engines: {node: '>=10'} + hasBin: true + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-fest@5.6.0: + resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} + engines: {node: '>=20'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -720,6 +1102,10 @@ packages: resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true + validator@13.15.35: + resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==} + engines: {node: '>= 0.10'} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -728,6 +1114,17 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -867,6 +1264,49 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true + '@inversifyjs/common@1.3.3': {} + + '@inversifyjs/core@1.3.4(reflect-metadata@0.2.2)': + dependencies: + '@inversifyjs/common': 1.3.3 + '@inversifyjs/reflect-metadata-utils': 0.2.3(reflect-metadata@0.2.2) + transitivePeerDependencies: + - reflect-metadata + + '@inversifyjs/reflect-metadata-utils@0.2.3(reflect-metadata@0.2.2)': + dependencies: + reflect-metadata: 0.2.2 + + '@javascript-obfuscator/escodegen@2.3.1': + dependencies: + '@javascript-obfuscator/estraverse': 5.4.0 + esprima: 4.0.1 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + '@javascript-obfuscator/estraverse@5.4.0': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@mercuryworkshop/bare-mux@1.1.4': dependencies: '@types/uuid': 9.0.8 @@ -917,8 +1357,12 @@ snapshots: - bufferutil - utf-8-validate + '@types/minimatch@3.0.5': {} + '@types/uuid@9.0.8': {} + '@types/validator@13.15.10': {} + '@webreflection/idb-map@0.1.3': {} accepts@1.3.8: @@ -926,14 +1370,58 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + acorn@8.15.0: {} + + acorn@8.16.0: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + array-differ@3.0.0: {} + array-flatten@1.1.1: {} + array-union@2.1.0: {} + + arrify@2.0.1: {} + + assert@2.1.0: + dependencies: + call-bind: 1.0.9 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + astravel@0.6.1: {} astring@1.9.0: {} async-exit-hook@2.0.1: {} + atomically@2.1.1: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + balanced-match@1.0.2: {} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 @@ -955,6 +1443,11 @@ snapshots: transitivePeerDependencies: - supports-color + brace-expansion@1.1.14: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + buffer-from@1.1.2: {} bufferutil@4.1.0: @@ -968,17 +1461,65 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@5.4.1: {} + chance@1.1.13: {} + + char-regex@1.0.2: {} + + charenc@0.0.2: {} + + class-validator@0.14.3: + dependencies: + '@types/validator': 13.15.10 + libphonenumber-js: 1.12.42 + validator: 13.15.35 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + commander@10.0.1: {} + commander@12.1.0: {} + commander@14.0.3: {} + commander@2.20.3: {} + + concat-map@0.0.1: {} + + conf@15.0.2: + dependencies: + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + atomically: 2.1.1 + debounce-fn: 6.0.0 + dot-prop: 10.1.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.2 + semver: 7.7.4 + uint8array-extras: 1.5.0 + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -1001,12 +1542,32 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + crypt@0.0.2: {} + data-uri-to-buffer@4.0.1: {} + debounce-fn@6.0.0: + dependencies: + mimic-function: 5.0.1 + debug@2.6.9: dependencies: ms: 2.0.0 + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + depd@2.0.0: {} destroy@1.2.0: {} @@ -1029,6 +1590,10 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dot-prop@10.1.0: + dependencies: + type-fest: 5.6.0 + dotenv@16.6.1: {} dotenv@17.2.0: {} @@ -1047,6 +1612,8 @@ snapshots: entities@4.5.0: {} + env-paths@3.0.0: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -1090,6 +1657,23 @@ snapshots: escape-html@1.0.3: {} + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@4.2.1: {} + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + etag@1.8.1: {} express-basic-auth@1.2.1: @@ -1121,7 +1705,7 @@ snapshots: methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 8.4.2 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 qs: 6.15.1 range-parser: 1.2.1 @@ -1136,6 +1720,12 @@ snapshots: transitivePeerDependencies: - supports-color + fast-deep-equal@3.1.3: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.1: {} + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 @@ -1153,6 +1743,10 @@ snapshots: transitivePeerDependencies: - supports-color + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 @@ -1163,6 +1757,8 @@ snapshots: function-bind@1.1.2: {} + generator-function@2.0.1: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -1183,8 +1779,18 @@ snapshots: gopd@1.2.0: {} + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -1210,14 +1816,99 @@ snapshots: inherits@2.0.4: {} + inversify@6.1.4(reflect-metadata@0.2.2): + dependencies: + '@inversifyjs/common': 1.3.3 + '@inversifyjs/core': 1.3.4(reflect-metadata@0.2.2) + transitivePeerDependencies: + - reflect-metadata + ipaddr.js@1.9.1: {} ipaddr.js@2.2.0: {} ipaddr.js@2.3.0: {} + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + javascript-obfuscator@4.2.2: + dependencies: + '@javascript-obfuscator/escodegen': 2.3.1 + '@javascript-obfuscator/estraverse': 5.4.0 + acorn: 8.15.0 + assert: 2.1.0 + chalk: 4.1.2 + chance: 1.1.13 + class-validator: 0.14.3 + commander: 12.1.0 + conf: 15.0.2 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + fast-deep-equal: 3.1.3 + inversify: 6.1.4(reflect-metadata@0.2.2) + js-string-escape: 1.0.1 + md5: 2.3.0 + mkdirp: 3.0.1 + multimatch: 5.0.0 + process: 0.11.10 + reflect-metadata: 0.2.2 + source-map-support: 0.5.21 + string-template: 1.0.0 + stringz: 2.1.0 + tslib: 2.8.1 + + js-string-escape@1.0.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + libphonenumber-js@1.12.42: {} + math-intrinsics@1.1.0: {} + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + media-typer@0.3.0: {} merge-descriptors@1.0.3: {} @@ -1236,10 +1927,26 @@ snapshots: mime@4.1.0: {} + mimic-function@5.0.1: {} + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.14 + + mkdirp@3.0.1: {} + ms@2.0.0: {} ms@2.1.3: {} + multimatch@5.0.0: + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.5 + negotiator@0.6.3: {} node-domexception@1.0.0: {} @@ -1256,13 +1963,44 @@ snapshots: object-inspect@1.13.4: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + parseurl@1.3.3: {} - path-to-regexp@8.4.2: {} + path-to-regexp@0.1.12: {} + + possible-typed-array-names@1.1.0: {} + + prelude-ls@1.1.2: {} + + process@0.11.10: {} proxy-addr@2.0.7: dependencies: @@ -1282,12 +2020,24 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + reflect-metadata@0.2.2: {} + + require-from-string@2.0.2: {} + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + safer-buffer@2.1.2: {} + semver@7.7.4: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -1315,6 +2065,15 @@ snapshots: transitivePeerDependencies: - supports-color + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + setprototypeof@1.2.0: {} side-channel-list@1.0.1: @@ -1354,23 +2113,84 @@ snapshots: statuses@2.0.1: {} + string-template@1.0.0: {} + + stringz@2.1.0: + dependencies: + char-regex: 1.0.2 + + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tagged-tag@1.0.0: {} + + terser@5.46.2: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + toidentifier@1.0.1: {} + tslib@2.8.1: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-fest@5.6.0: + dependencies: + tagged-tag: 1.0.0 + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 + uint8array-extras@1.5.0: {} + unpipe@1.0.0: {} + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.20 + utils-merge@1.0.1: {} uuid@14.0.0: {} + validator@13.15.35: {} + vary@1.1.2: {} web-streams-polyfill@3.3.3: {} + when-exit@2.1.5: {} + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + word-wrap@1.2.5: {} + ws@8.18.0(bufferutil@4.1.0): optionalDependencies: bufferutil: 4.1.0 From 11952f0335aef65cfff9d803923417b43394f629 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 26 Aug 2026 00:43:29 -0400 Subject: [PATCH 075/115] feat(proxy): bump deps, fix transports, codec randomization, fix dynamic proxy (kinda) --- biome.json | 2 +- build.js | 241 ++++++++++-- index.js | 24 +- package.json | 5 +- pnpm-lock.yaml | 459 ++++++----------------- static/assets/css/tabs.css | 2 +- static/assets/dynamic/dynamic.client.js | 2 +- static/assets/dynamic/dynamic.handler.js | 2 +- static/assets/dynamic/dynamic.worker.js | 2 +- static/assets/js/search.js | 43 ++- static/assets/js/sj-tp.js | 19 +- static/assets/js/tabs.js | 19 +- static/assets/scramjet/scramjet.all.js | 8 +- static/assets/scramjet/scramjet.wasm | Bin 535994 -> 536994 bytes static/tabs.html | 4 +- 15 files changed, 419 insertions(+), 413 deletions(-) diff --git a/biome.json b/biome.json index bfd721f83d..9980184c5e 100644 --- a/biome.json +++ b/biome.json @@ -1,7 +1,7 @@ { "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", "files": { - "includes": ["**", "!**/static/assets/dynamic", "!**/static/assets/ultraviolet", "!**/static/assets/scramjet", "!**/static/assets/json/**/*.min.json", "!**/static/assets/css/global.css", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb"] + "includes": ["**", "!**/static/assets/ultraviolet", "!**/static/assets/scramjet", "!**/static/assets/dynamic", "!**/static/assets/json/**/*.min.json", "!**/static/assets/css/global.css", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb"] }, "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { diff --git a/build.js b/build.js index 964fb61e18..3dd26f3f13 100644 --- a/build.js +++ b/build.js @@ -1,9 +1,20 @@ +import { createHash } from "node:crypto"; import { cp, readdir, readFile, writeFile, rm, mkdir } from "node:fs/promises"; import path from "node:path"; import { minify } from "terser"; import JavaScriptObfuscator from "javascript-obfuscator"; import chalk from "chalk"; +const OBFUSCATOR_PROMO_PATTERN = /\[javascript-obfuscator\]|JavaScript Obfuscator Pro|obfuscator\.io/i; + +for (const method of ["log", "info", "warn"]) { + const original = console[method].bind(console); + console[method] = (...args) => { + if (args.some(arg => OBFUSCATOR_PROMO_PATTERN.test(String(arg)))) return; + original(...args); + }; +} + const OBFUSCATE = true; const OBFUSCATE_HTML = true; @@ -18,7 +29,10 @@ const DYNAMIC_PREFIX = "dynamic."; const KEEP_IN_PLACE = new Set(); -const SKIP_OBFUSCATE = new Set(["scramjet.all.js", "scramjet.sync.js"]); +// scramjet.*: already-built vendor bundles. +// sj-tp.js / ultraviolet.config.js: hold codec functions the proxies eval in another +// realm, where the obfuscator's string-array helpers do not exist. +const SKIP_OBFUSCATE = new Set(["scramjet.all.js", "scramjet.sync.js", "sj-tp.js", "ultraviolet.config.js"]); const OLD_DYNAMIC_PREFIX = "/assets/dynamic/"; const OLD_UV_PREFIX = "/assets/ultraviolet/"; @@ -128,7 +142,6 @@ const WORDS = [ "of", "the", "deal", - ",", "honest", "we", "got", @@ -142,7 +155,6 @@ const WORDS = [ "year", "white", "ferrari", - "(oh)", "good", "times", ]; @@ -266,7 +278,171 @@ function replaceAll(content, oldStr, newStr) { return content.split(oldStr).join(newStr); } -async function runObfuscator(source) { +const URL_CODEC_NAMES = ["xor"]; + +const URL_CODEC_FUNCTIONS = { + xor: { + encode: 'url => url && encodeURIComponent(url.split("").map((char, index) => (index % 2 ? String.fromCharCode(char.charCodeAt(0) ^ 2) : char)).join(""))', + decode: + 'url => { if (!url) return url; const index = url.search(/[?#]/); const value = index < 0 ? url : url.slice(0, index); const tail = index < 0 ? "" : url.slice(index); return decodeURIComponent(value).split("").map((char, index) => (index % 2 ? String.fromCharCode(char.charCodeAt(0) ^ 2) : char)).join("") + tail; }', + }, +}; + +function randomXorKey() { + const chars = "0123456789abcdefghijklmnopqrstuvwxyz"; + const firstChars = "23456789abcdefghijklmnopqrstuvwxyz"; + const length = randomInt(1, 2); + let key = randomItem(firstChars); + for (let index = 1; index < length; index++) key += randomItem(chars); + return key; +} + +function xorKeyValue(key) { + const value = /^\d+$/.test(key) ? Number(key) : parseInt(key, 36); + return Number.isFinite(value) && value > 1 ? (value % 30) + 2 : 2; +} + +function randomCodecSpec(names = URL_CODEC_NAMES, keyed = true) { + const codec = randomItem(names); + return keyed && codec === "xor" ? `${codec}:${randomXorKey()}` : codec; +} + +function parseCodecSpec(spec) { + const [codec, ...keyParts] = String(spec).split(":"); + return { codec, key: keyParts.join(":") }; +} + +function createXorCodec(key) { + if (!key) return URL_CODEC_FUNCTIONS.xor; + + const encodedKey = xorKeyValue(key); + const encodeValue = `(url => encodeURIComponent(url.split("").map((char, index) => (index % ${encodedKey} ? String.fromCharCode(char.charCodeAt(0) ^ ${encodedKey}) : char)).join("")))`; + const decodeValue = `(url => decodeURIComponent(url).split("").map((char, index) => (index % ${encodedKey} ? String.fromCharCode(char.charCodeAt(0) ^ ${encodedKey}) : char)).join(""))`; + return { + encode: `url => url && ${encodeValue}(url)`, + decode: `url => { if (!url) return url; const index = url.search(/[?#]/); const value = index < 0 ? url : url.slice(0, index); const tail = index < 0 ? "" : url.slice(index); return ${decodeValue}(value) + tail; }`, + }; +} + +function getUrlCodecFunctions(codec, key) { + if (codec === "xor") return createXorCodec(key); + return URL_CODEC_FUNCTIONS[codec]; +} + +function createProxyCodecs() { + return { + uv: randomCodecSpec(URL_CODEC_NAMES), + dynamic: randomCodecSpec(URL_CODEC_NAMES), + scramjet: randomCodecSpec(URL_CODEC_NAMES), + }; +} + +// Fatal: a half-patched build encodes and decodes with different keys, silently breaking +// every proxied URL. +class CodecPatchError extends Error { + constructor(message) { + super(message); + this.name = "CodecPatchError"; + } +} + +// Optional patches cover patterns that exist in only some files sharing a branch below. +function patchOrFail(content, pattern, replacement, label, required = true) { + if (!pattern.test(content)) { + if (!required) return content; + throw new CodecPatchError(`${label}: pattern no longer matches. Upstream file changed - update the pattern in patchProxyCodecs().`); + } + pattern.lastIndex = 0; + return content.replace(pattern, replacement); +} + +// Local patches on the vendored Dynamic bundles. A vendor drop or a formatter reflow +// aborts the build instead of shipping a half-patched proxy. See dynamic-changes.md. +const FIX2_GUARD = `("PropertyDefinition"!=t.type||t.key!=e||t.computed)`; +const FIX3_GUARD = `"MetaProperty"==e.object.type`; +const FIX4_GUARD = `"null"===e.origin?e.href:`; +const LOCAL_PATCH_ASSERTIONS = { + "dynamic.worker.js": [ + ["Fix 1 html module filename", `[["html","dynamic.html.js"]]`, 1], + ["Fix 2 PropertyDefinition.key guard", FIX2_GUARD, 1], + ["Fix 3 import.meta.url base", FIX3_GUARD, 1], + ["Fix 4 opaque-origin guard", FIX4_GUARD, 1], + ], + "dynamic.client.js": [ + ["Fix 2 PropertyDefinition.key guard", FIX2_GUARD, 1], + ["Fix 3 import.meta.url base", FIX3_GUARD, 1], + ["Fix 4 opaque-origin guard", FIX4_GUARD, 1], + ], + "dynamic.handler.js": [ + ["Fix 2 PropertyDefinition.key guard", FIX2_GUARD, 1], + ["Fix 3 import.meta.url base", FIX3_GUARD, 1], + ["Fix 4 opaque-origin guard", FIX4_GUARD, 1], + ], +}; + +function assertLocalPatches(content, basename) { + const checks = LOCAL_PATCH_ASSERTIONS[basename]; + if (!checks) return content; + for (const [label, needle, expected] of checks) { + const found = content.split(needle).length - 1; + if (found !== expected) { + throw new CodecPatchError( + `${basename}: local patch "${label}" expected ${expected} occurrence(s) in the minified source, found ${found}. The vendor bundle or the minifier changed - re-apply the patch (see static/assets/dynamic/dynamic-changes.md).`, + ); + } + } + return content; +} + +function patchProxyCodecs(content, basename, proxyCodecs) { + if (basename === "ultraviolet.config.js") { + const { codec, key } = parseCodecSpec(proxyCodecs.uv); + const uvCodec = getUrlCodecFunctions(codec, key); + content = patchOrFail(content, /encodeUrl:\s*Ultraviolet\.codec\.\w+\.encode,/, `encodeUrl: ${uvCodec.encode},`, "ultraviolet.config.js encodeUrl"); + content = patchOrFail(content, /decodeUrl:\s*Ultraviolet\.codec\.\w+\.decode,/, `decodeUrl: ${uvCodec.decode},`, "ultraviolet.config.js decodeUrl"); + } + + if (basename === "dynamic.config.js") { + content = patchOrFail(content, /encoding:\s*["']\w+["']/, 'encoding: "xor"', "dynamic.config.js encoding"); + } + + // All three bundles inline the same codec, and the client and handler rewrite in-page + // links, so patching only the worker breaks every navigation after the first. + if (basename === "dynamic.worker.js" || basename === "dynamic.client.js" || basename === "dynamic.handler.js") { + const { key } = parseCodecSpec(proxyCodecs.dynamic); + const dynamicKey = xorKeyValue(key); + content = patchOrFail( + content, + /\{encode:\(e,t=2\)=>e&&encodeURIComponent\(e\.split\(""\)\.map\(\(e,i\)=>i%t\?String\.fromCharCode\(e\.charCodeAt\(0\)\^t\):e\)\.join\(""\)\),decode:\(e,t=2\)=>e&&decodeURIComponent\(e\)\.split\(""\)\.map\(\(e,i\)=>i%t\?String\.fromCharCode\(e\.charCodeAt\(0\)\^t\):e\)\.join\(""\)\}/g, + `{encode:e=>e&&encodeURIComponent(e.split("").map((e,i)=>i%${dynamicKey}?String.fromCharCode(e.charCodeAt(0)^${dynamicKey}):e).join("")),decode:e=>e&&decodeURIComponent(e).split("").map((e,i)=>i%${dynamicKey}?String.fromCharCode(e.charCodeAt(0)^${dynamicKey}):e).join("")}`, + `${basename} xor codec`, + ); + } + + if (basename === "search.js" || basename === "tabs.js") { + const { key } = parseCodecSpec(proxyCodecs.dynamic); + const dynamicKey = JSON.stringify(key || "2"); + content = patchOrFail(content, /\/uv\/dynamic\/\$\{window\.encode\.xor\(url\)\}/g, `/uv/dynamic/\${window.encode.xor(url, ${dynamicKey})}`, `${basename} dynamic encode(url)`); + content = patchOrFail(content, /\/uv\/dynamic\/\$\{window\.encode\.xor\(value\)\}/g, `/uv/dynamic/\${window.encode.xor(value, ${dynamicKey})}`, `${basename} dynamic encode(value)`, basename === "search.js"); + content = patchOrFail(content, /return window\.decode\.xor\(str\) \+ \(search\.length/g, `return window.decode.xor(str, ${dynamicKey}) + (search.length`, `${basename} dynamic decode`, basename === "tabs.js"); + } + + if (basename === "sj-tp.js") { + const { codec, key } = parseCodecSpec(proxyCodecs.scramjet); + const sjCodec = getUrlCodecFunctions(codec, key); + content = patchOrFail(content, /codec:\s*\{[\s\S]*?\n\s*\},\n\s*files:/, `codec: {\n encode: ${sjCodec.encode},\n decode: ${sjCodec.decode},\n },\n files:`, "sj-tp.js codec"); + } + + return content; +} + +// sw.js importScripts six files into one scope and inline scripts share window, so the +// obfuscator's hex identifiers collide. Give each file its own prefix. +function identifiersPrefixFor(scopeKey) { + return `_${createHash("sha1").update(scopeKey).digest("hex").slice(0, 8)}_`; +} + +async function runObfuscator(source, scopeKey) { const minified = await minify(source, { compress: { drop_console: false, passes: 2 }, mangle: true, @@ -275,6 +451,7 @@ async function runObfuscator(source) { if (!minified.code) throw new Error("Terser returned empty output"); const obfuscated = JavaScriptObfuscator.obfuscate(minified.code, { + identifiersPrefix: identifiersPrefixFor(scopeKey), compact: true, controlFlowFlattening: true, controlFlowFlatteningThreshold: 0.5, @@ -287,7 +464,7 @@ async function runObfuscator(source) { splitStrings: true, splitStringsChunkLength: 5, stringArray: true, - stringArrayEncoding: ["base64"], + stringArrayEncoding: ["rc4"], stringArrayThreshold: 1, transformObjectKeys: true, unicodeEscapeSequence: false, @@ -305,7 +482,7 @@ function shouldProcessInlineScript(attrs) { return ["text/javascript", "application/javascript", "module"].includes(type); } -async function obfuscateInlineScripts(html) { +async function obfuscateInlineScripts(html, htmlName) { const scripts = []; let index = 0; @@ -320,7 +497,7 @@ async function obfuscateInlineScripts(html) { if (!script.source.trim() || !shouldProcessInlineScript(script.attrs)) return [script.token, script.match]; try { - const obfuscated = await runObfuscator(script.source); + const obfuscated = await runObfuscator(script.source, `${htmlName}#${script.token}`); return [script.token, `${obfuscated}`]; } catch (err) { console.warn(chalk.yellow(` ! inline script skipped: ${err.message}`)); @@ -330,7 +507,9 @@ async function obfuscateInlineScripts(html) { ); let output = protectedHtml; - for (const [token, script] of processedScripts) output = output.replace(token, script); + // Function replacement, never a string: obfuscated code contains `$&`/`$\``/`$'`, which + // String.replace would expand. + for (const [token, script] of processedScripts) output = output.replace(token, () => script); return output; } @@ -352,7 +531,7 @@ function minifyHtml(html) { .replace(/\s+\/>/g, "/>") .trim(); - for (const [token, block] of blocks) output = output.replace(token, block); + for (const [token, block] of blocks) output = output.replace(token, () => block); return output; } @@ -400,13 +579,12 @@ function obfuscateHtmlMarkup(html) { output = obfuscateAttributeValues(output); output = obfuscateTextNodes(output); - for (const [token, block] of blocks) output = output.replace(token, block); - output = obfuscateAttributeValues(output); + for (const [token, block] of blocks) output = output.replace(token, () => block); return output; } -async function obfuscateHtml(html) { - return obfuscateHtmlMarkup(minifyHtml(await obfuscateInlineScripts(html))); +async function obfuscateHtml(html, htmlName) { + return obfuscateHtmlMarkup(minifyHtml(await obfuscateInlineScripts(html, htmlName))); } async function getJsFiles(dir) { @@ -469,11 +647,16 @@ async function build() { const NEW_UV_SCOPE = `/${uvBase}/`; const NEW_SCRAMJET_SCOPE = `/${uvBase}/${scramjetSub}/`; const NEW_DYNAMIC_SCOPE = `/${uvBase}/${dynamicSub}/`; + const proxyCodecs = createProxyCodecs(); console.log(`\nScope paths:`); console.log(` ${OLD_UV_SCOPE} -> ${NEW_UV_SCOPE}`); console.log(` ${OLD_SCRAMJET_SCOPE} -> ${NEW_SCRAMJET_SCOPE}`); console.log(` ${OLD_DYNAMIC_SCOPE} -> ${NEW_DYNAMIC_SCOPE}`); + console.log(`\nURL codecs:`); + console.log(` ultraviolet: ${proxyCodecs.uv}`); + console.log(` scramjet: ${proxyCodecs.scramjet}`); + console.log(` dynamic: ${proxyCodecs.dynamic}`); let jsPublicDir, dynPublicDir; do { @@ -489,7 +672,7 @@ async function build() { const NEW_DYNAMIC_FILE_PREFIX = `/${dynPublicDir}/`; const NEW_UV_FILE_PREFIX = `/${jsPublicDir}/`; - const PROTECTED = ["/bm/", "/ep/", "/bare/", "/wisp/", "/assets/scramjet/", NEW_UV_SCOPE, NEW_SCRAMJET_SCOPE, NEW_DYNAMIC_SCOPE]; + const PROTECTED = ["/bare/", "/wisp/", "/baremux/", "/epoxy/", "/libcurl/", "/assets/scramjet/", NEW_UV_SCOPE, NEW_SCRAMJET_SCOPE, NEW_DYNAMIC_SCOPE]; const usedPaths = new Set(); @@ -550,7 +733,11 @@ async function build() { const basename = path.basename(filePath); if (basename.startsWith(DYNAMIC_PREFIX)) { - const { publicPath: newPublicPath, fullPath: newFullPath } = nextOutputPath(dynPublicDir, dynDirFull); + // Dynamic rebuilds these URLs at runtime from assets.prefix plus hardcoded + // fragments, so the filenames must survive. Randomize the directory only. + const newPublicPath = `/${dynPublicDir}/${basename}`; + const newFullPath = path.join(dynDirFull, basename); + usedPaths.add(newPublicPath); plan.set(filePath, { basename, newPublicPath, newFullPath, inPlace: false, group: "dynamic" }); dynRenameMap.set(basename, newPublicPath); } else { @@ -564,11 +751,14 @@ async function build() { let passed = 0; let failed = 0; + const codecFailures = []; await Promise.all( [...plan.entries()].map(async ([filePath, { basename, newPublicPath, newFullPath, inPlace, group }]) => { try { let output = await readFile(filePath, "utf8"); + output = assertLocalPatches(output, basename); + output = patchProxyCodecs(output, basename, proxyCodecs); output = replaceAll(output, OLD_SCRAMJET_SCOPE, NEW_SCRAMJET_SCOPE); output = replaceAll(output, OLD_DYNAMIC_SCOPE, NEW_DYNAMIC_SCOPE); @@ -582,17 +772,13 @@ async function build() { } if (group === "dynamic") { + // Directory only: absolute paths in dynamic.config.js's assets.files.* would make + // Dynamic request assets.prefix + "/dir/file.js" -> /dir//dir/file.js. output = replaceAll(output, OLD_DYNAMIC_PREFIX, NEW_DYNAMIC_FILE_PREFIX); - for (const [orig, newPath] of dynRenameMap) { - const q = `['"\`]`; - const pat = new RegExp(`(${q})${escapeRegex(orig)}(${q})`, "g"); - output = output.replace(pat, `$1${newPath}$2`); - } - output = applyRenameMap(output, dynRenameMap, PROTECTED); } const shouldObfuscate = OBFUSCATE && !SKIP_OBFUSCATE.has(basename); - if (shouldObfuscate) output = await runObfuscator(output); + if (shouldObfuscate) output = await runObfuscator(output, basename); await mkdir(path.dirname(newFullPath), { recursive: true }); await writeFile(newFullPath, output, "utf8"); @@ -602,6 +788,7 @@ async function build() { console.log(chalk.green(` + ${basename} -> ${newPublicPath} ${tag}`)); passed++; } catch (err) { + if (err instanceof CodecPatchError) codecFailures.push(err.message); console.error(chalk.red(` x ${basename}: ${err.message}`)); failed++; } @@ -610,6 +797,14 @@ async function build() { console.log(`\n${passed} processed${failed ? `, ${failed} failed` : ""}`); + if (codecFailures.length) { + console.error(chalk.red("\nAborting: URL codec patching failed.")); + console.error(chalk.red("The client and the proxy would encode/decode with mismatched keys, breaking every proxied URL.\n")); + for (const message of codecFailures) console.error(chalk.red(` - ${message}`)); + console.error(chalk.gray("\ndist/ is incomplete and will be rebuilt from static/ on the next run.\n")); + process.exit(1); + } + for (const dir of [JS_DIR, UV_DIR, DYNAMIC_DIR]) { await rm(dir, { recursive: true, force: true }); } @@ -645,7 +840,7 @@ async function build() { } if (OBFUSCATE_HTML) { - const obfuscated = await obfuscateHtml(html); + const obfuscated = await obfuscateHtml(html, path.relative(DIST_DIR, htmlPath)); if (obfuscated !== html) { html = obfuscated; changed = true; diff --git a/index.js b/index.js index 37e0cf747d..eccd90a935 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,7 @@ import { existsSync } from "node:fs"; import http from "node:http"; +import { createRequire } from "node:module"; import path from "node:path"; -import bareMuxNode from "@mercuryworkshop/bare-mux/node"; import { server as wisp } from "@mercuryworkshop/wisp-js/server"; import { createBareServer } from "@nebula-services/bare-server-node"; import chalk from "chalk"; @@ -15,7 +15,11 @@ import config from "./config.js"; console.log(chalk.yellow("🚀 Starting server...")); +const require = createRequire(import.meta.url); const __dirname = process.cwd(); +const { epoxyPath } = require("@mercuryworkshop/epoxy-transport"); +const { baremuxPath } = require("@mercuryworkshop/bare-mux/node"); +const libcurlPath = path.dirname(require.resolve("@mercuryworkshop/libcurl-transport")); const DIST_DIR = path.join(__dirname, "dist"); const STATIC_DIR = path.join(__dirname, "static"); @@ -25,8 +29,6 @@ console.log(chalk.blue(`Serving from ${path.relative(__dirname, SERVE_DIR)}/`)); const server = http.createServer(); const app = express(); const bareServer = createBareServer("/bare/"); -const { baremuxPath } = bareMuxNode; -const epoxyDistPath = path.join(__dirname, "node_modules", "@mercuryworkshop", "epoxy-transport", "dist"); const PORT = process.env.PORT || 8080; wisp.options.allow_loopback_ips = true; @@ -110,17 +112,6 @@ app.use(cookieParser()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); -const transportStaticOptions = { - setHeaders: (res, filePath) => { - const ext = path.extname(filePath); - if (ext === ".mjs" || ext === ".js") { - res.type("text/javascript"); - } else if (ext === ".wasm") { - res.type("application/wasm"); - } - }, -}; - const jsStaticOptions = { setHeaders: (res, filePath) => { const ext = path.extname(filePath); @@ -135,8 +126,9 @@ const jsStaticOptions = { app.use(express.static(SERVE_DIR, jsStaticOptions)); app.use("/bare", cors({ origin: true })); -app.use("/bm", express.static(baremuxPath, transportStaticOptions)); -app.use("/ep", express.static(epoxyDistPath, transportStaticOptions)); +app.use("/epoxy/", express.static(epoxyPath)); +app.use("/libcurl/", express.static(libcurlPath)); +app.use("/baremux/", express.static(baremuxPath)); const routes = [ { path: "/apps", file: "apps.html" }, diff --git a/package.json b/package.json index 65a91f4783..5106363a52 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,10 @@ "author": "InterstellarNetwork", "license": "GPL-3.0-or-later", "dependencies": { - "@mercuryworkshop/bare-mux": "^2.1.8", + "@mercuryworkshop/bare-mux": "^2.1.9", "@mercuryworkshop/epoxy-transport": "2.1.28", - "@mercuryworkshop/scramjet": "^1.0.2", + "@mercuryworkshop/libcurl-transport": "^2.0.5", + "@mercuryworkshop/scramjet": "^1.1.0", "@mercuryworkshop/wisp-js": "^0.4.1", "@nebula-services/bare-server-node": "^2.0.4", "chalk": "^5.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3120f42091..dfd5fd9578 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,14 +14,17 @@ importers: .: dependencies: '@mercuryworkshop/bare-mux': - specifier: ^2.1.8 - version: 2.1.8 + specifier: ^2.1.9 + version: 2.1.9 '@mercuryworkshop/epoxy-transport': specifier: 2.1.28 version: 2.1.28 + '@mercuryworkshop/libcurl-transport': + specifier: ^2.0.5 + version: 2.0.5 '@mercuryworkshop/scramjet': - specifier: ^1.0.2 - version: 1.0.2(esbuild@0.28.0) + specifier: ^1.1.0 + version: 1.1.0 '@mercuryworkshop/wisp-js': specifier: ^0.4.1 version: 0.4.1 @@ -121,162 +124,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/aix-ppc64@0.28.0': - resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.28.0': - resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.28.0': - resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.28.0': - resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.28.0': - resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.28.0': - resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.28.0': - resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.28.0': - resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.28.0': - resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.28.0': - resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.28.0': - resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.28.0': - resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.28.0': - resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.28.0': - resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.28.0': - resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.28.0': - resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.28.0': - resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.28.0': - resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.28.0': - resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.28.0': - resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.28.0': - resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.28.0': - resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.28.0': - resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.28.0': - resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.28.0': - resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.28.0': - resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@inversifyjs/common@1.3.3': resolution: {integrity: sha512-ZH0wrgaJwIo3s9gMCDM2wZoxqrJ6gB97jWXncROfYdqZJv8f3EkqT57faZqN5OTeHWgtziQ6F6g3L8rCvGceCw==} @@ -312,11 +159,8 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@mercuryworkshop/bare-mux@1.1.4': - resolution: {integrity: sha512-mJPezqEpiKTCs+wu/3TowilnVXQgFs4SqoQnnbCbOc5cV6bDggaolKkyYjDnmOB9t/nptIIXDWDB31oS9vX9kA==} - - '@mercuryworkshop/bare-mux@2.1.8': - resolution: {integrity: sha512-rI3S7Osyr2ZWmG6J6v3MLS1ZT269lx1DrAjM47q0aoBYnfgUZTRvZqY0Globb8ipTi02d5x6dTJBeUBt6dZsag==} + '@mercuryworkshop/bare-mux@2.1.9': + resolution: {integrity: sha512-fiOqWm3VP0Bl8T+0l+qnb7ab9zO+PpKVbtJvOnMsefUv6kWIaoDtqyr9hd/t4gA8oBwgtyZVqIwO2J9nKY9ylw==} '@mercuryworkshop/epoxy-tls@2.1.18-1': resolution: {integrity: sha512-2N1BYn/+FJxIbRw+sipbl3mQPinRflqQDB9HGAXJEVj4Ok4FIlTlS4fO2cpXKEq5yoD3oaKb8GyNaQfndNui9w==} @@ -324,8 +168,11 @@ packages: '@mercuryworkshop/epoxy-transport@2.1.28': resolution: {integrity: sha512-lv/Kfdn37y8ZCXQaIT3Ebj4OSztBqeXdbR9rchbHQBKIw/fNSQJLGNBHV5ScXSzqt7NCwv8ZiZx7urRyk7Ua/Q==} - '@mercuryworkshop/scramjet@1.0.2': - resolution: {integrity: sha512-65k+TXYlMAnqTrcTyVlXyG+CVymOSHMW4a8ofJtX6yHDKmWGHL4LVzls+ukoTqth6JyqOk7OoT3iQdufZMoE7g==} + '@mercuryworkshop/libcurl-transport@2.0.5': + resolution: {integrity: sha512-YkAPEAWTEUZZkEOejmRQJxNHw90+kNQnoiSqa5H2sExHBXXdGSXEtg7/35A53U8MDVaznpAwjVbXRONSsfatzw==} + + '@mercuryworkshop/scramjet@1.1.0': + resolution: {integrity: sha512-T/9GZqAQX42eYr/t6VGR2m9J4BtIuncRkANo8hBVTGskrr522yuhaADhSu+65DYlhUyQnLUjDikuNYzlgv0Ejw==} '@mercuryworkshop/wisp-js@0.4.1': resolution: {integrity: sha512-104LwiXiuhti/e32gmv0Da0u0yuLFDHX8JawCzleTPWJ5t5qTX4EYi4E7/ucbjBPN9wwVPWHE5g5yGqzl/NzQA==} @@ -339,15 +186,9 @@ packages: '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/validator@13.15.10': resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} - '@webreflection/idb-map@0.1.3': - resolution: {integrity: sha512-7lTEpXDgpy9xueW4NSNkBHgqedz/dlGgtwTZa4fRMKWJKcnC9cORVlXwV7qNyYYKarT8gpB1+wv5UNBYhjgc8w==} - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -395,13 +236,6 @@ packages: assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - astravel@0.6.1: - resolution: {integrity: sha512-ZIkgWFIV0Yo423Vqalz7VcF+BAiISvSgplnkV2abPGACPFKofsWTcvr9SFyYM/t/vMZWqmdP/Eze6ATX7r84Dg==} - - astring@1.9.0: - resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} - hasBin: true - async-exit-hook@2.0.1: resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} engines: {node: '>=0.12.0'} @@ -471,6 +305,10 @@ packages: class-validator@0.14.3: resolution: {integrity: sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==} + clone-regexp@3.0.0: + resolution: {integrity: sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==} + engines: {node: '>=12'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -508,6 +346,10 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + cookie-parser@1.4.7: resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} engines: {node: '>= 0.8.0'} @@ -609,6 +451,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -625,17 +471,6 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - esbuild-server@0.3.0: - resolution: {integrity: sha512-8RuzIdM13gs7MyYwxn/c88nDdx086aREBvzWDk4G3cC7nudF8480OTrvAvanVmFZ9anDv9U4cRX/OKbladaRVA==} - engines: {node: '>=14'} - peerDependencies: - esbuild: '>=0.17.0' - - esbuild@0.28.0: - resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} - engines: {node: '>=18'} - hasBin: true - escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -717,6 +552,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-timeout@0.1.1: + resolution: {integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==} + engines: {node: '>=14.16'} + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -752,8 +591,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - htmlparser2@9.1.0: - resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -763,12 +602,19 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + idb@8.0.3: + resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} inversify@6.1.4: resolution: {integrity: sha512-PbxrZH/gTa1fpPEEGAjJQzK8tKMIp5gRg6EFNJlCtzUcycuNdmhv3uk5P8Itm/RIjgHJO16oQRLo9IHzQN51bA==} + ip-regex@5.0.0: + resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -796,6 +642,10 @@ packages: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} + is-ip@5.0.1: + resolution: {integrity: sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==} + engines: {node: '>=14.16'} + is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -804,6 +654,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -827,6 +681,9 @@ packages: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} + libcurl.js@0.7.4: + resolution: {integrity: sha512-UpvVirvATP7fD0t4rnsxVRuUpPVIo2QvWj4+5JrMsd1KSEvYkON36+COOPAl88hPlGJddk+DfZRvyF7KG7YcSA==} + libphonenumber-js@1.12.42: resolution: {integrity: sha512-oKQFPTibqQwZZkChCDVMFVJXMZdyJNqDWZWYNn8BgyAaK/6yFJEowxCY0RVFirRyWP63hMRuKlkSEd9qlvbWXg==} @@ -844,10 +701,6 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - meriyah@4.5.0: - resolution: {integrity: sha512-Rbiu0QPIxTXgOXwiIpRVJfZRQ2FWyfzYrOGBs9SN5RbaXg1CN5ELn/plodwWwluX93yzc4qO/bNIen1ThGFCxw==} - engines: {node: '>=10.4.0'} - methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -937,6 +790,10 @@ packages: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} + parse-domain@8.3.0: + resolution: {integrity: sha512-oOjqUI93wiFHJlywlOKU9FEw60Q0LMy8S1s/AhnVhCB9LZkwIsCIZfqujeJ16u7rRzLdTEY2OpxlGRhLdnNNYA==} + hasBin: true + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -1005,6 +862,9 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -1051,6 +911,10 @@ packages: stubborn-utils@1.0.2: resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + super-regex@0.2.0: + resolution: {integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==} + engines: {node: '>=14.16'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1064,6 +928,10 @@ packages: engines: {node: '>=10'} hasBin: true + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -1098,10 +966,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@14.0.0: - resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} - hasBin: true - validator@13.15.35: resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==} engines: {node: '>= 0.10'} @@ -1186,84 +1050,6 @@ snapshots: '@biomejs/cli-win32-x64@2.2.2': optional: true - '@esbuild/aix-ppc64@0.28.0': - optional: true - - '@esbuild/android-arm64@0.28.0': - optional: true - - '@esbuild/android-arm@0.28.0': - optional: true - - '@esbuild/android-x64@0.28.0': - optional: true - - '@esbuild/darwin-arm64@0.28.0': - optional: true - - '@esbuild/darwin-x64@0.28.0': - optional: true - - '@esbuild/freebsd-arm64@0.28.0': - optional: true - - '@esbuild/freebsd-x64@0.28.0': - optional: true - - '@esbuild/linux-arm64@0.28.0': - optional: true - - '@esbuild/linux-arm@0.28.0': - optional: true - - '@esbuild/linux-ia32@0.28.0': - optional: true - - '@esbuild/linux-loong64@0.28.0': - optional: true - - '@esbuild/linux-mips64el@0.28.0': - optional: true - - '@esbuild/linux-ppc64@0.28.0': - optional: true - - '@esbuild/linux-riscv64@0.28.0': - optional: true - - '@esbuild/linux-s390x@0.28.0': - optional: true - - '@esbuild/linux-x64@0.28.0': - optional: true - - '@esbuild/netbsd-arm64@0.28.0': - optional: true - - '@esbuild/netbsd-x64@0.28.0': - optional: true - - '@esbuild/openbsd-arm64@0.28.0': - optional: true - - '@esbuild/openbsd-x64@0.28.0': - optional: true - - '@esbuild/openharmony-arm64@0.28.0': - optional: true - - '@esbuild/sunos-x64@0.28.0': - optional: true - - '@esbuild/win32-arm64@0.28.0': - optional: true - - '@esbuild/win32-ia32@0.28.0': - optional: true - - '@esbuild/win32-x64@0.28.0': - optional: true - '@inversifyjs/common@1.3.3': {} '@inversifyjs/core@1.3.4(reflect-metadata@0.2.2)': @@ -1307,12 +1093,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@mercuryworkshop/bare-mux@1.1.4': - dependencies: - '@types/uuid': 9.0.8 - uuid: 14.0.0 - - '@mercuryworkshop/bare-mux@2.1.8': {} + '@mercuryworkshop/bare-mux@2.1.9': {} '@mercuryworkshop/epoxy-tls@2.1.18-1': {} @@ -1320,20 +1101,20 @@ snapshots: dependencies: '@mercuryworkshop/epoxy-tls': 2.1.18-1 - '@mercuryworkshop/scramjet@1.0.2(esbuild@0.28.0)': + '@mercuryworkshop/libcurl-transport@2.0.5': dependencies: - '@mercuryworkshop/bare-mux': 1.1.4 - '@webreflection/idb-map': 0.1.3 - astravel: 0.6.1 - astring: 1.9.0 + libcurl.js: 0.7.4 + + '@mercuryworkshop/scramjet@1.1.0': + dependencies: + '@mercuryworkshop/bare-mux': 2.1.9 dom-serializer: 2.0.0 domhandler: 5.0.3 domutils: 3.2.2 - esbuild-server: 0.3.0(esbuild@0.28.0) - htmlparser2: 9.1.0 - meriyah: 4.5.0 - transitivePeerDependencies: - - esbuild + htmlparser2: 10.0.0 + idb: 8.0.3 + parse-domain: 8.3.0 + set-cookie-parser: 2.7.2 '@mercuryworkshop/wisp-js@0.4.1': dependencies: @@ -1359,12 +1140,8 @@ snapshots: '@types/minimatch@3.0.5': {} - '@types/uuid@9.0.8': {} - '@types/validator@13.15.10': {} - '@webreflection/idb-map@0.1.3': {} - accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -1405,10 +1182,6 @@ snapshots: object.assign: 4.1.7 util: 0.12.5 - astravel@0.6.1: {} - - astring@1.9.0: {} - async-exit-hook@2.0.1: {} atomically@2.1.1: @@ -1492,6 +1265,10 @@ snapshots: libphonenumber-js: 1.12.42 validator: 13.15.35 + clone-regexp@3.0.0: + dependencies: + is-regexp: 3.1.0 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1526,6 +1303,8 @@ snapshots: content-type@1.0.5: {} + convert-hrtime@5.0.0: {} + cookie-parser@1.4.7: dependencies: cookie: 0.7.2 @@ -1612,6 +1391,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + env-paths@3.0.0: {} es-define-property@1.0.1: {} @@ -1622,39 +1403,6 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild-server@0.3.0(esbuild@0.28.0): - dependencies: - esbuild: 0.28.0 - - esbuild@0.28.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.28.0 - '@esbuild/android-arm': 0.28.0 - '@esbuild/android-arm64': 0.28.0 - '@esbuild/android-x64': 0.28.0 - '@esbuild/darwin-arm64': 0.28.0 - '@esbuild/darwin-x64': 0.28.0 - '@esbuild/freebsd-arm64': 0.28.0 - '@esbuild/freebsd-x64': 0.28.0 - '@esbuild/linux-arm': 0.28.0 - '@esbuild/linux-arm64': 0.28.0 - '@esbuild/linux-ia32': 0.28.0 - '@esbuild/linux-loong64': 0.28.0 - '@esbuild/linux-mips64el': 0.28.0 - '@esbuild/linux-ppc64': 0.28.0 - '@esbuild/linux-riscv64': 0.28.0 - '@esbuild/linux-s390x': 0.28.0 - '@esbuild/linux-x64': 0.28.0 - '@esbuild/netbsd-arm64': 0.28.0 - '@esbuild/netbsd-x64': 0.28.0 - '@esbuild/openbsd-arm64': 0.28.0 - '@esbuild/openbsd-x64': 0.28.0 - '@esbuild/openharmony-arm64': 0.28.0 - '@esbuild/sunos-x64': 0.28.0 - '@esbuild/win32-arm64': 0.28.0 - '@esbuild/win32-ia32': 0.28.0 - '@esbuild/win32-x64': 0.28.0 - escape-html@1.0.3: {} eslint-scope@8.4.0: @@ -1757,6 +1505,8 @@ snapshots: function-bind@1.1.2: {} + function-timeout@0.1.1: {} + generator-function@2.0.1: {} get-intrinsic@1.3.0: @@ -1795,12 +1545,12 @@ snapshots: dependencies: function-bind: 1.1.2 - htmlparser2@9.1.0: + htmlparser2@10.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 - entities: 4.5.0 + entities: 6.0.1 http-errors@2.0.0: dependencies: @@ -1814,6 +1564,8 @@ snapshots: dependencies: safer-buffer: 2.1.2 + idb@8.0.3: {} + inherits@2.0.4: {} inversify@6.1.4(reflect-metadata@0.2.2): @@ -1823,6 +1575,8 @@ snapshots: transitivePeerDependencies: - reflect-metadata + ip-regex@5.0.0: {} + ipaddr.js@1.9.1: {} ipaddr.js@2.2.0: {} @@ -1846,6 +1600,11 @@ snapshots: has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 + is-ip@5.0.1: + dependencies: + ip-regex: 5.0.0 + super-regex: 0.2.0 + is-nan@1.3.2: dependencies: call-bind: 1.0.9 @@ -1858,6 +1617,8 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-regexp@3.1.0: {} + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.20 @@ -1899,6 +1660,8 @@ snapshots: prelude-ls: 1.1.2 type-check: 0.3.2 + libcurl.js@0.7.4: {} + libphonenumber-js@1.12.42: {} math-intrinsics@1.1.0: {} @@ -1913,8 +1676,6 @@ snapshots: merge-descriptors@1.0.3: {} - meriyah@4.5.0: {} - methods@1.1.2: {} mime-db@1.52.0: {} @@ -1992,6 +1753,10 @@ snapshots: type-check: 0.3.2 word-wrap: 1.2.5 + parse-domain@8.3.0: + dependencies: + is-ip: 5.0.1 + parseurl@1.3.3: {} path-to-regexp@0.1.12: {} @@ -2065,6 +1830,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-cookie-parser@2.7.2: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -2125,6 +1892,12 @@ snapshots: stubborn-utils@1.0.2: {} + super-regex@0.2.0: + dependencies: + clone-regexp: 3.0.0 + function-timeout: 0.1.1 + time-span: 5.1.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -2138,6 +1911,10 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + toidentifier@1.0.1: {} tslib@2.8.1: {} @@ -2169,8 +1946,6 @@ snapshots: utils-merge@1.0.1: {} - uuid@14.0.0: {} - validator@13.15.35: {} vary@1.1.2: {} diff --git a/static/assets/css/tabs.css b/static/assets/css/tabs.css index 6244147e4d..3b3d53f926 100644 --- a/static/assets/css/tabs.css +++ b/static/assets/css/tabs.css @@ -235,4 +235,4 @@ iframe { border: none; left: 0; top: 10%; -} \ No newline at end of file +} diff --git a/static/assets/dynamic/dynamic.client.js b/static/assets/dynamic/dynamic.client.js index fb22083262..e1f4435f93 100644 --- a/static/assets/dynamic/dynamic.client.js +++ b/static/assets/dynamic/dynamic.client.js @@ -1,4 +1,4 @@ -(()=>{var aa=Object.create,Xe=Object.defineProperty,sa=Object.getOwnPropertyDescriptor,oa=Object.getOwnPropertyNames,ca=Object.getPrototypeOf,ua=Object.prototype.hasOwnProperty,la=(e,t,i)=>t in e?Xe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i,Tt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),dr=(e,t)=>{for(var i in t)Xe(e,i,{get:t[i],enumerable:!0})},ha=(e,t,i,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let n of oa(t))ua.call(e,n)||n===i||Xe(e,n,{get:()=>t[n],enumerable:!(r=sa(t,n))||r.enumerable});return e},Qe=(e,t,i)=>(i=null!=e?aa(ca(e)):{},ha(!t&&e&&e.__esModule?i:Xe(i,"default",{value:e,enumerable:!0}),e)),q=(e,t,i)=>(la(e,"symbol"!=typeof t?t+"":t,i),i),Nt=Tt((e,t)=>{function i(e){if("string"!=typeof e)throw TypeError("Path must be a string. Received "+JSON.stringify(e))}function r(e,t){for(var i,r="",n=0,s=-1,a=0,o=0;o<=e.length;++o){if(o2){var c=r.lastIndexOf("/");if(c!==r.length-1){-1===c?(r="",n=0):n=(r=r.slice(0,c)).length-1-r.lastIndexOf("/"),s=o,a=0;continue}}else if(2===r.length||1===r.length){r="",n=0,s=o,a=0;continue}t&&(r.length>0?r+="/..":r="..",n=2)}else r.length>0?r+="/"+e.slice(s+1,o):r=e.slice(s+1,o),n=o-s-1;s=o,a=0}else 46===i&&-1!==a?++a:a=-1}return r}var n={resolve(){for(var e,t,n="",s=!1,a=arguments.length-1;a>=-1&&!s;a--)a>=0?e=arguments[a]:(void 0===t&&(t=process.cwd()),e=t),i(e),0!==e.length&&(n=e+"/"+n,s=47===e.charCodeAt(0));return n=r(n,!s),s?n.length>0?"/"+n:"/":n.length>0?n:"."},normalize(e){if(i(e),0===e.length)return".";var t=47===e.charCodeAt(0),n=47===e.charCodeAt(e.length-1);return 0!==(e=r(e,!t)).length||t||(e="."),e.length>0&&n&&(e+="/"),t?"/"+e:e},isAbsolute:e=>(i(e),e.length>0&&47===e.charCodeAt(0)),join(){if(0===arguments.length)return".";for(var e,t=0;t0&&(void 0===e?e=r:e+="/"+r)}return void 0===e?".":n.normalize(e)},relative(e,t){if(i(e),i(t),e===t||(e=n.resolve(e))===(t=n.resolve(t)))return"";for(var r=1;rl){if(47===t.charCodeAt(o+h))return t.slice(o+h+1);if(0===h)return t.slice(o+h)}else a>l&&(47===e.charCodeAt(r+h)?p=h:0===h&&(p=0));break}var u=e.charCodeAt(r+h);if(u!==t.charCodeAt(o+h))break;47===u&&(p=h)}var d="";for(h=r+p+1;h<=s;++h)(h===s||47===e.charCodeAt(h))&&(0===d.length?d+="..":d+="/..");return d.length>0?d+t.slice(o+p):(o+=p,47===t.charCodeAt(o)&&++o,t.slice(o))},_makeLong:e=>e,dirname(e){if(i(e),0===e.length)return".";for(var t=e.charCodeAt(0),r=47===t,n=-1,s=!0,a=e.length-1;a>=1;--a)if(47===(t=e.charCodeAt(a))){if(!s){n=a;break}}else s=!1;return-1===n?r?"/":".":r&&1===n?"//":e.slice(0,n)},basename(e,t){if(void 0!==t&&"string"!=typeof t)throw TypeError('"ext" argument must be a string');i(e);var r,n=0,s=-1,a=!0;if(void 0!==t&&t.length>0&&t.length<=e.length){if(t.length===e.length&&t===e)return"";var o=t.length-1,c=-1;for(r=e.length-1;r>=0;--r){var l=e.charCodeAt(r);if(47===l){if(!a){n=r+1;break}}else-1===c&&(a=!1,c=r+1),o>=0&&(l===t.charCodeAt(o)?-1==--o&&(s=r):(o=-1,s=c))}return n===s?s=c:-1===s&&(s=e.length),e.slice(n,s)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!a){n=r+1;break}}else-1===s&&(a=!1,s=r+1);return-1===s?"":e.slice(n,s)},extname(e){i(e);for(var t=-1,r=0,n=-1,s=!0,a=0,o=e.length-1;o>=0;--o){var c=e.charCodeAt(o);if(47!==c)-1===n&&(s=!1,n=o+1),46===c?-1===t?t=o:1!==a&&(a=1):-1!==t&&(a=-1);else if(!s){r=o+1;break}}return-1===t||-1===n||0===a||1===a&&t===n-1&&t===r+1?"":e.slice(t,n)},format(e){if(null===e||"object"!=typeof e)throw TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var i=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return i?i===t.root?i+r:i+e+r:r}("/",e)},parse(e){i(e);var t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;var r,n=e.charCodeAt(0),s=47===n;s?(t.root="/",r=1):r=0;for(var a=-1,o=0,c=-1,l=!0,p=e.length-1,h=0;p>=r;--p)if(47!==(n=e.charCodeAt(p)))-1===c&&(l=!1,c=p+1),46===n?-1===a?a=p:1!==h&&(h=1):-1!==a&&(h=-1);else if(!l){o=p+1;break}return-1===a||-1===c||0===h||1===h&&a===c-1&&a===o+1?-1!==c&&(t.base=t.name=0===o&&s?e.slice(1,c):e.slice(o,c)):(0===o&&s?(t.name=e.slice(1,a),t.base=e.slice(1,c)):(t.name=e.slice(o,a),t.base=e.slice(o,c)),t.ext=e.slice(a,c)),o>0?t.dir=e.slice(0,o-1):s&&(t.dir="/"),t},sep:"/",delimiter:":",win32:null,posix:null};n.posix=n,t.exports=n}),vn=Tt(e=>{e.parse=function(e,t){if("string"!=typeof e)throw TypeError("argument str must be a string");for(var i={},n=(t||{}).decode||r,s=0;s{var i={decodeValues:!0,map:!1,silent:!1};function r(e){return"string"==typeof e&&!!e.trim()}function n(e,t){var n=e.split(";").filter(r),s=function(e){var t="",i="",r=e.split("=");return r.length>1?(t=r.shift(),i=r.join("=")):i=e,{name:t,value:i}}(n.shift()),a=s.name,o=s.value;t=t?Object.assign({},i,t):i;try{o=t.decodeValues?decodeURIComponent(o):o}catch(e){console.error("set-cookie-parser encountered an error while decoding a cookie with value '"+o+"'. Set options.decodeValues to false to disable this feature.",e)}var c={name:a,value:o};return n.forEach(e=>{var t=e.split("="),i=t.shift().trimLeft().toLowerCase(),r=t.join("=");"expires"===i?c.expires=new Date(r):"max-age"===i?c.maxAge=Number.parseInt(r,10):"secure"===i?c.secure=!0:"httponly"===i?c.httpOnly=!0:"samesite"===i?c.sameSite=r:c[i]=r}),c}function s(e,t){if(t=t?Object.assign({},i,t):i,!e)return t.map?{}:[];if(e.headers)if("function"==typeof e.headers.getSetCookie)e=e.headers.getSetCookie();else if(e.headers["set-cookie"])e=e.headers["set-cookie"];else{var s=e.headers[Object.keys(e.headers).find(e=>"set-cookie"===e.toLowerCase())];s||!e.headers.cookie||t.silent||console.warn("Warning: set-cookie-parser appears to have been called on a request object. It is designed to parse Set-Cookie headers from responses, not Cookie headers from requests. Set the option {silent: true} to suppress this warning."),e=s}return Array.isArray(e)||(e=[e]),(t=t?Object.assign({},i,t):i).map?e.filter(r).reduce((e,i)=>{var r=n(i,t);return e[r.name]=r,e},{}):e.filter(r).map(e=>n(e,t))}t.exports=s,t.exports.parse=s,t.exports.parseString=n,t.exports.splitCookiesString=function(e){if(Array.isArray(e))return e;if("string"!=typeof e)return[];var t,i,r,n,s,a=[],o=0;function c(){for(;o=e.length)&&a.push(e.substring(t,e.length))}return a}}),xr=Qe(Nt()),Ye={"application/ecmascript":{source:"apache",compressible:!0,extensions:["ecma"]},"application/gzip":{source:"iana",compressible:!1,extensions:["gz"]},"application/http":{source:"iana"},"application/javascript":{source:"apache",charset:"UTF-8",compressible:!0,extensions:["js"]},"application/json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["json","map"]},"application/manifest+json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["webmanifest"]},"application/marc":{source:"iana",extensions:["mrc"]},"application/mp4":{source:"iana",extensions:["mp4","mpg4","mp4s","m4p"]},"application/ogg":{source:"iana",compressible:!1,extensions:["ogx"]},"application/sql":{source:"iana",extensions:["sql"]},"application/wasm":{source:"iana",compressible:!0,extensions:["wasm"]},"application/x-bittorrent":{source:"apache",extensions:["torrent"]},"application/x-gzip":{source:"apache"},"application/x-javascript":{compressible:!0},"application/x-web-app-manifest+json":{compressible:!0,extensions:["webapp"]},"application/x-www-form-urlencoded":{source:"iana",compressible:!0},"application/xhtml+xml":{source:"iana",compressible:!0,extensions:["xhtml","xht"]},"application/xhtml-voice+xml":{source:"apache",compressible:!0},"application/xml":{source:"iana",compressible:!0,extensions:["xml","xsl","xsd","rng"]},"application/zip":{source:"iana",compressible:!1,extensions:["zip"]},"application/zlib":{source:"iana"},"audio/midi":{source:"apache",extensions:["mid","midi","kar","rmi"]},"audio/mp3":{compressible:!1,extensions:["mp3"]},"audio/mp4":{source:"iana",compressible:!1,extensions:["m4a","mp4a"]},"audio/mp4a-latm":{source:"iana"},"audio/mpa":{source:"iana"},"audio/mpa-robust":{source:"iana"},"audio/mpeg":{source:"iana",compressible:!1,extensions:["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/ogg":{source:"iana",compressible:!1,extensions:["oga","ogg","spx","opus"]},"audio/red":{source:"iana"},"audio/rtx":{source:"iana"},"audio/scip":{source:"iana"},"audio/silk":{source:"apache",extensions:["sil"]},"audio/smv":{source:"iana"},"audio/wav":{compressible:!1,extensions:["wav"]},"audio/wave":{compressible:!1,extensions:["wav"]},"audio/webm":{source:"apache",compressible:!1,extensions:["weba"]},"audio/x-aac":{source:"apache",compressible:!1,extensions:["aac"]},"audio/x-aiff":{source:"apache",extensions:["aif","aiff","aifc"]},"audio/x-caf":{source:"apache",compressible:!1,extensions:["caf"]},"audio/x-flac":{source:"apache",extensions:["flac"]},"audio/x-m4a":{source:"nginx",extensions:["m4a"]},"audio/x-matroska":{source:"apache",extensions:["mka"]},"audio/x-mpegurl":{source:"apache",extensions:["m3u"]},"audio/x-ms-wax":{source:"apache",extensions:["wax"]},"audio/x-ms-wma":{source:"apache",extensions:["wma"]},"audio/x-pn-realaudio":{source:"apache",extensions:["ram","ra"]},"audio/x-pn-realaudio-plugin":{source:"apache",extensions:["rmp"]},"audio/x-realaudio":{source:"nginx",extensions:["ra"]},"audio/x-tta":{source:"apache"},"audio/x-wav":{source:"apache",extensions:["wav"]},"audio/xm":{source:"apache",extensions:["xm"]},"font/collection":{source:"iana",extensions:["ttc"]},"font/otf":{source:"iana",compressible:!0,extensions:["otf"]},"font/sfnt":{source:"iana"},"font/ttf":{source:"iana",compressible:!0,extensions:["ttf"]},"font/woff":{source:"iana",extensions:["woff"]},"font/woff2":{source:"iana",extensions:["woff2"]},"image/gif":{source:"iana",compressible:!1,extensions:["gif"]},"image/heic":{source:"iana",extensions:["heic"]},"image/heic-sequence":{source:"iana",extensions:["heics"]},"image/heif":{source:"iana",extensions:["heif"]},"image/jpeg":{source:"iana",compressible:!1,extensions:["jpeg","jpg","jpe"]},"image/png":{source:"iana",compressible:!1,extensions:["png"]},"image/svg+xml":{source:"iana",compressible:!0,extensions:["svg","svgz"]},"image/webp":{source:"iana",extensions:["webp"]},"text/coffeescript":{extensions:["coffee","litcoffee"]},"text/css":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["css"]},"text/ecmascript":{source:"apache"},"text/html":{source:"iana",compressible:!0,extensions:["html","htm","shtml"]},"text/jade":{extensions:["jade"]},"text/javascript":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["js","mjs"]},"text/markdown":{source:"iana",compressible:!0,extensions:["md","markdown"]}},_r=/^\s*([^;\s]*)(?:;|\s|$)/,fa=/^text\//i,U={};function gr(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&Ye[t[1].toLowerCase()];return i&&i.charset?i.charset:!(!t||!fa.test(t[1]))&&"UTF-8"}function da(e){if(!e||"string"!=typeof e)return!1;var t=-1===e.indexOf("/")?U.lookup(e):e;if(!t)return!1;if(-1===t.indexOf("charset")){var i=U.charset(t);i&&(t+="; charset="+i.toLowerCase())}return t}function ma(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&U.extensions[t[1].toLowerCase()];return!(!i||!i.length)&&i[0]}function ya(e){if(!e||"string"!=typeof e)return!1;var t=(0,xr.extname)("x."+e).toLowerCase().substr(1);return t&&U.types[t]||!1}function ga(e,t){var i=["nginx","apache",void 0,"iana"];Object.keys(Ye).forEach(r=>{var n=Ye[r],s=n.extensions;if(s&&s.length){e[r]=s;for(var a=0;al||c===l&&"application/"===t[o].substr(0,12)))continue}t[o]=r}}})}U.charset=gr,U.charsets={lookup:gr},U.contentType=da,U.extension=ma,U.extensions=Object.create(null),U.lookup=ya,U.types=Object.create(null),ga(U.extensions,U.types);var br=U,Us=Qe(Nt(),1),Je={};dr(Je,{deleteDB:()=>Ca,openDB:()=>Bt,unwrap:()=>Le,wrap:()=>G});var wr,vr,xa=(e,t)=>t.some(t=>e instanceof t);function _a(){return wr||(wr=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function ba(){return vr||(vr=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var Sr=new WeakMap,Dt=new WeakMap,Er=new WeakMap,Mt=new WeakMap,Vt=new WeakMap;function wa(e){let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("success",n),e.removeEventListener("error",s)},n=()=>{t(G(e.result)),r()},s=()=>{i(e.error),r()};e.addEventListener("success",n),e.addEventListener("error",s)});return t.then(t=>{t instanceof IDBCursor&&Sr.set(t,e)}).catch(()=>{}),Vt.set(t,e),t}function va(e){if(Dt.has(e))return;let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("complete",n),e.removeEventListener("error",s),e.removeEventListener("abort",s)},n=()=>{t(),r()},s=()=>{i(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",n),e.addEventListener("error",s),e.addEventListener("abort",s)});Dt.set(e,t)}var Ot={get(e,t,i){if(e instanceof IDBTransaction){if("done"===t)return Dt.get(e);if("objectStoreNames"===t)return e.objectStoreNames||Er.get(e);if("store"===t)return i.objectStoreNames[1]?void 0:i.objectStore(i.objectStoreNames[0])}return G(e[t])},set:(e,t,i)=>(e[t]=i,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function Cr(e){Ot=e(Ot)}function Sa(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?ba().includes(e)?function(...t){return e.apply(Le(this),t),G(Sr.get(this))}:function(...t){return G(e.apply(Le(this),t))}:function(t,...i){let r=e.call(Le(this),t,...i);return Er.set(r,t.sort?t.sort():[t]),G(r)}}function Ea(e){return"function"==typeof e?Sa(e):(e instanceof IDBTransaction&&va(e),xa(e,_a())?new Proxy(e,Ot):e)}function G(e){if(e instanceof IDBRequest)return wa(e);if(Mt.has(e))return Mt.get(e);let t=Ea(e);return t!==e&&(Mt.set(e,t),Vt.set(t,e)),t}var Le=e=>Vt.get(e);function Bt(e,t,{blocked:i,upgrade:r,blocking:n,terminated:s}={}){let a=indexedDB.open(e,t),o=G(a);return r&&a.addEventListener("upgradeneeded",e=>{r(G(a.result),e.oldVersion,e.newVersion,G(a.transaction),e)}),i&&a.addEventListener("blocked",e=>i(e.oldVersion,e.newVersion,e)),o.then(e=>{s&&e.addEventListener("close",()=>s()),n&&e.addEventListener("versionchange",e=>n(e.oldVersion,e.newVersion,e))}).catch(()=>{}),o}function Ca(e,{blocked:t}={}){let i=indexedDB.deleteDatabase(e);return t&&i.addEventListener("blocked",e=>t(e.oldVersion,e)),G(i).then(()=>{})}var ka=["get","getKey","getAll","getAllKeys","count"],Aa=["put","add","delete","clear"],Ft=new Map;function kr(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(Ft.get(t))return Ft.get(t);let i=t.replace(/FromIndex$/,""),r=t!==i,n=Aa.includes(i);if(!(i in(r?IDBIndex:IDBObjectStore).prototype)||!n&&!ka.includes(i))return;let s=async function(e,...t){let s=this.transaction(e,n?"readwrite":"readonly"),a=s.store;return r&&(a=a.index(t.shift())),(await Promise.all([a[i](...t),n&&s.done]))[0]};return Ft.set(t,s),s}Cr(e=>({...e,get:(t,i,r)=>kr(t,i)||e.get(t,i,r),has:(t,i)=>!!kr(t,i)||e.has(t,i)}));var La=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,81,2,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,10,1,2,0,49,6,4,4,14,9,5351,0,7,14,13835,9,87,9,39,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,4706,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,983,6,110,6,6,9,4759,9,787719,239],Ir=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,68,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,4026,582,8634,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8936,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,757,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4153,7,221,3,5761,15,7472,3104,541,1507,4938,6,4191],Pa="‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-ᫎᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_",Tr="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꟊꟐꟑꟓꟕ-ꟙꟲ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",$t={3:"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",5:"class enum extends super const export import",6:"enum",strict:"implements interface let package private protected public static yield",strictBind:"eval arguments"},jt="break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this",Ra={5:jt,"5module":jt+" export import",6:jt+" const class extends export import super"},Ia=/^in(stanceof)?$/,Ta=RegExp("["+Tr+"]"),Na=RegExp("["+Tr+Pa+"]");function Ht(e,t){for(var i=65536,r=0;re);r+=2)if((i+=t[r+1])>=e)return!0;return!1}function ce(e,t){return e<65?36===e:e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Ta.test(String.fromCharCode(e)):!1!==t&&Ht(e,Ir)))}function be(e,t){return e<48?36===e:e<58||!(e<65)&&(e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Na.test(String.fromCharCode(e)):!1!==t&&(Ht(e,Ir)||Ht(e,La)))))}var L=function(e,t){void 0===t&&(t={}),this.label=e,this.keyword=t.keyword,this.beforeExpr=!!t.beforeExpr,this.startsExpr=!!t.startsExpr,this.isLoop=!!t.isLoop,this.isAssign=!!t.isAssign,this.prefix=!!t.prefix,this.postfix=!!t.postfix,this.binop=t.binop||null,this.updateContext=null};function z(e,t){return new L(e,{beforeExpr:!0,binop:t})}var K={beforeExpr:!0},H={startsExpr:!0},Gt={};function k(e,t){return void 0===t&&(t={}),t.keyword=e,Gt[e]=new L(e,t)}var u={num:new L("num",H),regexp:new L("regexp",H),string:new L("string",H),name:new L("name",H),privateId:new L("privateId",H),eof:new L("eof"),bracketL:new L("[",{beforeExpr:!0,startsExpr:!0}),bracketR:new L("]"),braceL:new L("{",{beforeExpr:!0,startsExpr:!0}),braceR:new L("}"),parenL:new L("(",{beforeExpr:!0,startsExpr:!0}),parenR:new L(")"),comma:new L(",",K),semi:new L(";",K),colon:new L(":",K),dot:new L("."),question:new L("?",K),questionDot:new L("?."),arrow:new L("=>",K),template:new L("template"),invalidTemplate:new L("invalidTemplate"),ellipsis:new L("...",K),backQuote:new L("`",H),dollarBraceL:new L("${",{beforeExpr:!0,startsExpr:!0}),eq:new L("=",{beforeExpr:!0,isAssign:!0}),assign:new L("_=",{beforeExpr:!0,isAssign:!0}),incDec:new L("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new L("!/~",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:z("||",1),logicalAND:z("&&",2),bitwiseOR:z("|",3),bitwiseXOR:z("^",4),bitwiseAND:z("&",5),equality:z("==/!=/===/!==",6),relational:z("/<=/>=",7),bitShift:z("<>/>>>",8),plusMin:new L("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:z("%",10),star:z("*",10),slash:z("/",10),starstar:new L("**",{beforeExpr:!0}),coalesce:z("??",1),_break:k("break"),_case:k("case",K),_catch:k("catch"),_continue:k("continue"),_debugger:k("debugger"),_default:k("default",K),_do:k("do",{isLoop:!0,beforeExpr:!0}),_else:k("else",K),_finally:k("finally"),_for:k("for",{isLoop:!0}),_function:k("function",H),_if:k("if"),_return:k("return",K),_switch:k("switch"),_throw:k("throw",K),_try:k("try"),_var:k("var"),_const:k("const"),_while:k("while",{isLoop:!0}),_with:k("with"),_new:k("new",{beforeExpr:!0,startsExpr:!0}),_this:k("this",H),_super:k("super",H),_class:k("class",H),_extends:k("extends",K),_export:k("export"),_import:k("import",H),_null:k("null",H),_true:k("true",H),_false:k("false",H),_in:k("in",{beforeExpr:!0,binop:7}),_instanceof:k("instanceof",{beforeExpr:!0,binop:7}),_typeof:k("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:k("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:k("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},Y=/\r\n?|\n|\u2028|\u2029/,Ma=RegExp(Y.source,"g");function we(e){return 10===e||13===e||8232===e||8233===e}function Nr(e,t,i){void 0===i&&(i=e.length);for(var r=t;rDa.call(e,t)),Ar=Array.isArray||(e=>"[object Array]"===Oa.call(e));function pe(e){return RegExp("^(?:"+e.replace(/ /g,"|")+")$")}function fe(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+((e-=65536)>>10),56320+(1023&e))}var Va=/(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/,Re=function(e,t){this.line=e,this.column=t};Re.prototype.offset=function(e){return new Re(this.line,this.column+e)};var rt=function(e,t,i){this.start=t,this.end=i,null!==e.sourceFile&&(this.source=e.sourceFile)};function Or(e,t){for(var i=1,r=0;;){var n=Nr(e,r,t);if(n<0)return new Re(i,t-r);++i,r=n}}var Wt={ecmaVersion:null,sourceType:"script",onInsertedSemicolon:null,onTrailingComma:null,allowReserved:null,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowAwaitOutsideFunction:null,allowSuperOutsideMethod:null,allowHashBang:!1,checkPrivateFields:!0,locations:!1,onToken:null,onComment:null,ranges:!1,program:null,sourceFile:null,directSourceFile:null,preserveParens:!1},Lr=!1;function Fa(e){var t={};for(var i in Wt)t[i]=e&&Te(e,i)?e[i]:Wt[i];if("latest"===t.ecmaVersion?t.ecmaVersion=1e8:null==t.ecmaVersion?(!Lr&&"object"==typeof console&&console.warn&&(Lr=!0,console.warn("Since Acorn 8.0.0, options.ecmaVersion is required.\nDefaulting to 2020, but this will stop working in the future.")),t.ecmaVersion=11):t.ecmaVersion>=2015&&(t.ecmaVersion-=2009),null==t.allowReserved&&(t.allowReserved=t.ecmaVersion<5),e&&null!=e.allowHashBang||(t.allowHashBang=t.ecmaVersion>=14),Ar(t.onToken)){var r=t.onToken;t.onToken=e=>r.push(e)}return Ar(t.onComment)&&(t.onComment=Ba(t,t.onComment)),t}function Ba(e,t){return function(i,r,n,s,a,o){var c={type:i?"Block":"Line",value:r,start:n,end:s};e.locations&&(c.loc=new rt(this,a,o)),e.ranges&&(c.range=[n,s]),t.push(c)}}var Ie=1,ve=2,zt=4,Vr=8,Fr=16,Br=32,Kt=64,$r=128,Ne=256,Xt=Ie|ve|Ne;function Qt(e,t){return ve|(e?zt:0)|(t?Vr:0)}var et=0,Yt=1,le=2,jr=3,Ur=4,Hr=5,T=function(e,t,i){this.options=e=Fa(e),this.sourceFile=e.sourceFile,this.keywords=pe(Ra[e.ecmaVersion>=6?6:"module"===e.sourceType?"5module":5]);var r="";!0!==e.allowReserved&&(r=$t[e.ecmaVersion>=6?6:5===e.ecmaVersion?5:3],"module"===e.sourceType&&(r+=" await")),this.reservedWords=pe(r);var n=(r?r+" ":"")+$t.strict;this.reservedWordsStrict=pe(n),this.reservedWordsStrictBind=pe(n+" "+$t.strictBind),this.input=String(t),this.containsEsc=!1,i?(this.pos=i,this.lineStart=this.input.lastIndexOf("\n",i-1)+1,this.curLine=this.input.slice(0,this.lineStart).split(Y).length):(this.pos=this.lineStart=0,this.curLine=1),this.type=u.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=this.initialContext(),this.exprAllowed=!0,this.inModule="module"===e.sourceType,this.strict=this.inModule||this.strictDirective(this.pos),this.potentialArrowAt=-1,this.potentialArrowInForAwait=!1,this.yieldPos=this.awaitPos=this.awaitIdentPos=0,this.labels=[],this.undefinedExports=Object.create(null),0===this.pos&&e.allowHashBang&&"#!"===this.input.slice(0,2)&&this.skipLineComment(2),this.scopeStack=[],this.enterScope(Ie),this.regexpState=null,this.privateNameStack=[]},ie={inFunction:{configurable:!0},inGenerator:{configurable:!0},inAsync:{configurable:!0},canAwait:{configurable:!0},allowSuper:{configurable:!0},allowDirectSuper:{configurable:!0},treatFunctionsAsVar:{configurable:!0},allowNewDotTarget:{configurable:!0},inClassStaticBlock:{configurable:!0}};T.prototype.parse=function(){var e=this.options.program||this.startNode();return this.nextToken(),this.parseTopLevel(e)},ie.inFunction.get=function(){return(this.currentVarScope().flags&ve)>0},ie.inGenerator.get=function(){return(this.currentVarScope().flags&Vr)>0&&!this.currentVarScope().inClassFieldInit},ie.inAsync.get=function(){return(this.currentVarScope().flags&zt)>0&&!this.currentVarScope().inClassFieldInit},ie.canAwait.get=function(){for(var e=this.scopeStack.length-1;e>=0;e--){var t=this.scopeStack[e];if(t.inClassFieldInit||t.flags&Ne)return!1;if(t.flags&ve)return(t.flags&zt)>0}return this.inModule&&this.options.ecmaVersion>=13||this.options.allowAwaitOutsideFunction},ie.allowSuper.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&Kt)>0||i||this.options.allowSuperOutsideMethod},ie.allowDirectSuper.get=function(){return(this.currentThisScope().flags&$r)>0},ie.treatFunctionsAsVar.get=function(){return this.treatFunctionsAsVarInScope(this.currentScope())},ie.allowNewDotTarget.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&(ve|Ne))>0||i},ie.inClassStaticBlock.get=function(){return(this.currentVarScope().flags&Ne)>0},T.extend=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var i=this,r=0;r=,?^&]/.test(n)||"!"===n&&"="===this.input.charAt(r+1))}e+=t[0].length,X.lastIndex=e,e+=X.exec(this.input)[0].length,";"===this.input[e]&&e++}},$.eat=function(e){return this.type===e&&(this.next(),!0)},$.isContextual=function(e){return this.type===u.name&&this.value===e&&!this.containsEsc},$.eatContextual=function(e){return!!this.isContextual(e)&&(this.next(),!0)},$.expectContextual=function(e){this.eatContextual(e)||this.unexpected()},$.canInsertSemicolon=function(){return this.type===u.eof||this.type===u.braceR||Y.test(this.input.slice(this.lastTokEnd,this.start))},$.insertSemicolon=function(){if(this.canInsertSemicolon())return this.options.onInsertedSemicolon&&this.options.onInsertedSemicolon(this.lastTokEnd,this.lastTokEndLoc),!0},$.semicolon=function(){this.eat(u.semi)||this.insertSemicolon()||this.unexpected()},$.afterTrailingComma=function(e,t){if(this.type===e)return this.options.onTrailingComma&&this.options.onTrailingComma(this.lastTokStart,this.lastTokStartLoc),t||this.next(),!0},$.expect=function(e){this.eat(e)||this.unexpected()},$.unexpected=function(e){this.raise(e??this.start,"Unexpected token")};var nt=function(){this.shorthandAssign=this.trailingComma=this.parenthesizedAssign=this.parenthesizedBind=this.doubleProto=-1};$.checkPatternErrors=function(e,t){if(e){e.trailingComma>-1&&this.raiseRecoverable(e.trailingComma,"Comma is not permitted after the rest element");var i=t?e.parenthesizedAssign:e.parenthesizedBind;i>-1&&this.raiseRecoverable(i,t?"Assigning to rvalue":"Parenthesized pattern")}},$.checkExpressionErrors=function(e,t){if(!e)return!1;var i=e.shorthandAssign,r=e.doubleProto;if(!t)return i>=0||r>=0;i>=0&&this.raise(i,"Shorthand property assignments are valid only in destructuring patterns"),r>=0&&this.raiseRecoverable(r,"Redefinition of __proto__ property")},$.checkYieldAwaitInDefaultParams=function(){this.yieldPos&&(!this.awaitPos||this.yieldPos55295&&r<56320)return!0;if(ce(r,!0)){for(var n=i+1;be(r=this.input.charCodeAt(n),!0);)++n;if(92===r||r>55295&&r<56320)return!0;var s=this.input.slice(i,n);if(!Ia.test(s))return!0}return!1},w.isAsyncFunction=function(){if(this.options.ecmaVersion<8||!this.isContextual("async"))return!1;X.lastIndex=this.pos;var e,t=X.exec(this.input),i=this.pos+t[0].length;return!(Y.test(this.input.slice(this.pos,i))||"function"!==this.input.slice(i,i+8)||i+8!==this.input.length&&(be(e=this.input.charCodeAt(i+8))||e>55295&&e<56320))},w.parseStatement=function(e,t,i){var r,n=this.type,s=this.startNode();switch(this.isLet(e)&&(n=u._var,r="let"),n){case u._break:case u._continue:return this.parseBreakContinueStatement(s,n.keyword);case u._debugger:return this.parseDebuggerStatement(s);case u._do:return this.parseDoStatement(s);case u._for:return this.parseForStatement(s);case u._function:return e&&(this.strict||"if"!==e&&"label"!==e)&&this.options.ecmaVersion>=6&&this.unexpected(),this.parseFunctionStatement(s,!1,!e);case u._class:return e&&this.unexpected(),this.parseClass(s,!0);case u._if:return this.parseIfStatement(s);case u._return:return this.parseReturnStatement(s);case u._switch:return this.parseSwitchStatement(s);case u._throw:return this.parseThrowStatement(s);case u._try:return this.parseTryStatement(s);case u._const:case u._var:return r=r||this.value,e&&"var"!==r&&this.unexpected(),this.parseVarStatement(s,r);case u._while:return this.parseWhileStatement(s);case u._with:return this.parseWithStatement(s);case u.braceL:return this.parseBlock(!0,s);case u.semi:return this.parseEmptyStatement(s);case u._export:case u._import:if(this.options.ecmaVersion>10&&n===u._import){X.lastIndex=this.pos;var a=X.exec(this.input),o=this.pos+a[0].length,c=this.input.charCodeAt(o);if(40===c||46===c)return this.parseExpressionStatement(s,this.parseExpression())}return this.options.allowImportExportEverywhere||(t||this.raise(this.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'")),n===u._import?this.parseImport(s):this.parseExport(s,i);default:if(this.isAsyncFunction())return e&&this.unexpected(),this.next(),this.parseFunctionStatement(s,!0,!e);var l=this.value,p=this.parseExpression();return n===u.name&&"Identifier"===p.type&&this.eat(u.colon)?this.parseLabeledStatement(s,l,p,e):this.parseExpressionStatement(s,p)}},w.parseBreakContinueStatement=function(e,t){var i="break"===t;this.next(),this.eat(u.semi)||this.insertSemicolon()?e.label=null:this.type!==u.name?this.unexpected():(e.label=this.parseIdent(),this.semicolon());for(var r=0;r=6?this.eat(u.semi):this.semicolon(),this.finishNode(e,"DoWhileStatement")},w.parseForStatement=function(e){this.next();var t=this.options.ecmaVersion>=9&&this.canAwait&&this.eatContextual("await")?this.lastTokStart:-1;if(this.labels.push(Jt),this.enterScope(0),this.expect(u.parenL),this.type===u.semi)return t>-1&&this.unexpected(t),this.parseFor(e,null);var i=this.isLet();if(this.type===u._var||this.type===u._const||i){var r=this.startNode(),n=i?"let":this.value;return this.next(),this.parseVar(r,!0,n),this.finishNode(r,"VariableDeclaration"),(this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of"))&&1===r.declarations.length?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),this.parseForIn(e,r)):(t>-1&&this.unexpected(t),this.parseFor(e,r))}var s=this.isContextual("let"),a=!1,o=new nt,c=this.parseExpression(!(t>-1)||"await",o);return this.type===u._in||(a=this.options.ecmaVersion>=6&&this.isContextual("of"))?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),s&&a&&this.raise(c.start,"The left-hand side of a for-of loop may not start with 'let'."),this.toAssignable(c,!1,o),this.checkLValPattern(c),this.parseForIn(e,c)):(this.checkExpressionErrors(o,!0),t>-1&&this.unexpected(t),this.parseFor(e,c))},w.parseFunctionStatement=function(e,t,i){return this.next(),this.parseFunction(e,Pe|(i?0:qt),!1,t)},w.parseIfStatement=function(e){return this.next(),e.test=this.parseParenExpression(),e.consequent=this.parseStatement("if"),e.alternate=this.eat(u._else)?this.parseStatement("if"):null,this.finishNode(e,"IfStatement")},w.parseReturnStatement=function(e){return this.inFunction||this.options.allowReturnOutsideFunction||this.raise(this.start,"'return' outside of function"),this.next(),this.eat(u.semi)||this.insertSemicolon()?e.argument=null:(e.argument=this.parseExpression(),this.semicolon()),this.finishNode(e,"ReturnStatement")},w.parseSwitchStatement=function(e){this.next(),e.discriminant=this.parseParenExpression(),e.cases=[],this.expect(u.braceL),this.labels.push(ja),this.enterScope(0);for(var t,i=!1;this.type!==u.braceR;)if(this.type===u._case||this.type===u._default){var r=this.type===u._case;t&&this.finishNode(t,"SwitchCase"),e.cases.push(t=this.startNode()),t.consequent=[],this.next(),r?t.test=this.parseExpression():(i&&this.raiseRecoverable(this.lastTokStart,"Multiple default clauses"),i=!0,t.test=null),this.expect(u.colon)}else t||this.unexpected(),t.consequent.push(this.parseStatement(null));return this.exitScope(),t&&this.finishNode(t,"SwitchCase"),this.next(),this.labels.pop(),this.finishNode(e,"SwitchStatement")},w.parseThrowStatement=function(e){return this.next(),Y.test(this.input.slice(this.lastTokEnd,this.start))&&this.raise(this.lastTokEnd,"Illegal newline after throw"),e.argument=this.parseExpression(),this.semicolon(),this.finishNode(e,"ThrowStatement")};var Ua=[];w.parseCatchClauseParam=function(){var e=this.parseBindingAtom(),t="Identifier"===e.type;return this.enterScope(t?Br:0),this.checkLValPattern(e,t?Ur:le),this.expect(u.parenR),e},w.parseTryStatement=function(e){if(this.next(),e.block=this.parseBlock(),e.handler=null,this.type===u._catch){var t=this.startNode();this.next(),this.eat(u.parenL)?t.param=this.parseCatchClauseParam():(this.options.ecmaVersion<10&&this.unexpected(),t.param=null,this.enterScope(0)),t.body=this.parseBlock(!1),this.exitScope(),e.handler=this.finishNode(t,"CatchClause")}return e.finalizer=this.eat(u._finally)?this.parseBlock():null,e.handler||e.finalizer||this.raise(e.start,"Missing catch or finally clause"),this.finishNode(e,"TryStatement")},w.parseVarStatement=function(e,t,i){return this.next(),this.parseVar(e,!1,t,i),this.semicolon(),this.finishNode(e,"VariableDeclaration")},w.parseWhileStatement=function(e){return this.next(),e.test=this.parseParenExpression(),this.labels.push(Jt),e.body=this.parseStatement("while"),this.labels.pop(),this.finishNode(e,"WhileStatement")},w.parseWithStatement=function(e){return this.strict&&this.raise(this.start,"'with' in strict mode"),this.next(),e.object=this.parseParenExpression(),e.body=this.parseStatement("with"),this.finishNode(e,"WithStatement")},w.parseEmptyStatement=function(e){return this.next(),this.finishNode(e,"EmptyStatement")},w.parseLabeledStatement=function(e,t,i,r){for(var n=0,s=this.labels;n=0;o--){var c=this.labels[o];if(c.statementStart!==e.start)break;c.statementStart=this.start,c.kind=a}return this.labels.push({name:t,kind:a,statementStart:this.start}),e.body=this.parseStatement(r?-1===r.indexOf("label")?r+"label":r:"label"),this.labels.pop(),e.label=i,this.finishNode(e,"LabeledStatement")},w.parseExpressionStatement=function(e,t){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},w.parseBlock=function(e,t,i){for(void 0===e&&(e=!0),void 0===t&&(t=this.startNode()),t.body=[],this.expect(u.braceL),e&&this.enterScope(0);this.type!==u.braceR;){var r=this.parseStatement(null);t.body.push(r)}return i&&(this.strict=!1),this.next(),e&&this.exitScope(),this.finishNode(t,"BlockStatement")},w.parseFor=function(e,t){return e.init=t,this.expect(u.semi),e.test=this.type===u.semi?null:this.parseExpression(),this.expect(u.semi),e.update=this.type===u.parenR?null:this.parseExpression(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,"ForStatement")},w.parseForIn=function(e,t){var i=this.type===u._in;return this.next(),"VariableDeclaration"===t.type&&null!=t.declarations[0].init&&(!i||this.options.ecmaVersion<8||this.strict||"var"!==t.kind||"Identifier"!==t.declarations[0].id.type)&&this.raise(t.start,(i?"for-in":"for-of")+" loop variable declaration may not have an initializer"),e.left=t,e.right=i?this.parseExpression():this.parseMaybeAssign(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,i?"ForInStatement":"ForOfStatement")},w.parseVar=function(e,t,i,r){for(e.declarations=[],e.kind=i;;){var n=this.startNode();if(this.parseVarId(n,i),this.eat(u.eq)?n.init=this.parseMaybeAssign(t):r||"const"!==i||this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of")?r||"Identifier"===n.id.type||t&&(this.type===u._in||this.isContextual("of"))?n.init=null:this.raise(this.lastTokEnd,"Complex binding patterns require an initialization value"):this.unexpected(),e.declarations.push(this.finishNode(n,"VariableDeclarator")),!this.eat(u.comma))break}return e},w.parseVarId=function(e,t){e.id=this.parseBindingAtom(),this.checkLValPattern(e.id,"var"===t?Yt:le,!1)};var Pe=1,qt=2,Wr=4;function Ha(e,t){var i=t.key.name,r=e[i],n="true";return"MethodDefinition"===t.type&&("get"===t.kind||"set"===t.kind)&&(n=(t.static?"s":"i")+t.kind),"iget"===r&&"iset"===n||"iset"===r&&"iget"===n||"sget"===r&&"sset"===n||"sset"===r&&"sget"===n?(e[i]="true",!1):!!r||(e[i]=n,!1)}function tt(e,t){var i=e.computed,r=e.key;return!i&&("Identifier"===r.type&&r.name===t||"Literal"===r.type&&r.value===t)}w.parseFunction=function(e,t,i,r,n){this.initFunction(e),(this.options.ecmaVersion>=9||this.options.ecmaVersion>=6&&!r)&&(this.type===u.star&&t&qt&&this.unexpected(),e.generator=this.eat(u.star)),this.options.ecmaVersion>=8&&(e.async=!!r),t&Pe&&(e.id=t&Wr&&this.type!==u.name?null:this.parseIdent(),e.id&&!(t&qt)&&this.checkLValSimple(e.id,this.strict||e.generator||e.async?this.treatFunctionsAsVar?Yt:le:jr));var s=this.yieldPos,a=this.awaitPos,o=this.awaitIdentPos;return this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(e.async,e.generator)),t&Pe||(e.id=this.type===u.name?this.parseIdent():null),this.parseFunctionParams(e),this.parseFunctionBody(e,i,!1,n),this.yieldPos=s,this.awaitPos=a,this.awaitIdentPos=o,this.finishNode(e,t&Pe?"FunctionDeclaration":"FunctionExpression")},w.parseFunctionParams=function(e){this.expect(u.parenL),e.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams()},w.parseClass=function(e,t){this.next();var i=this.strict;this.strict=!0,this.parseClassId(e,t),this.parseClassSuper(e);var r=this.enterClassBody(),n=this.startNode(),s=!1;for(n.body=[],this.expect(u.braceL);this.type!==u.braceR;){var a=this.parseClassElement(null!==e.superClass);a&&(n.body.push(a),"MethodDefinition"===a.type&&"constructor"===a.kind?(s&&this.raiseRecoverable(a.start,"Duplicate constructor in the same class"),s=!0):a.key&&"PrivateIdentifier"===a.key.type&&Ha(r,a)&&this.raiseRecoverable(a.key.start,"Identifier '#"+a.key.name+"' has already been declared"))}return this.strict=i,this.next(),e.body=this.finishNode(n,"ClassBody"),this.exitClassBody(),this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},w.parseClassElement=function(e){if(this.eat(u.semi))return null;var t=this.options.ecmaVersion,i=this.startNode(),r="",n=!1,s=!1,a="method",o=!1;if(this.eatContextual("static")){if(t>=13&&this.eat(u.braceL))return this.parseClassStaticBlock(i),i;this.isClassElementNameStart()||this.type===u.star?o=!0:r="static"}if(i.static=o,!r&&t>=8&&this.eatContextual("async")&&(!this.isClassElementNameStart()&&this.type!==u.star||this.canInsertSemicolon()?r="async":s=!0),!r&&(t>=9||!s)&&this.eat(u.star)&&(n=!0),!r&&!s&&!n){var c=this.value;(this.eatContextual("get")||this.eatContextual("set"))&&(this.isClassElementNameStart()?a=c:r=c)}if(r?(i.computed=!1,i.key=this.startNodeAt(this.lastTokStart,this.lastTokStartLoc),i.key.name=r,this.finishNode(i.key,"Identifier")):this.parseClassElementName(i),t<13||this.type===u.parenL||"method"!==a||n||s){var l=!i.static&&tt(i,"constructor");l&&"method"!==a&&this.raise(i.key.start,"Constructor can't have get/set modifier"),i.kind=l?"constructor":a,this.parseClassMethod(i,n,s,l&&e)}else this.parseClassField(i);return i},w.isClassElementNameStart=function(){return this.type===u.name||this.type===u.privateId||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword},w.parseClassElementName=function(e){this.type===u.privateId?("constructor"===this.value&&this.raise(this.start,"Classes can't have an element named '#constructor'"),e.computed=!1,e.key=this.parsePrivateIdent()):this.parsePropertyName(e)},w.parseClassMethod=function(e,t,i,r){var n=e.key;"constructor"===e.kind?(t&&this.raise(n.start,"Constructor can't be a generator"),i&&this.raise(n.start,"Constructor can't be an async method")):e.static&&tt(e,"prototype")&&this.raise(n.start,"Classes may not have a static property named prototype");var s=e.value=this.parseMethod(t,i,r);return"get"===e.kind&&0!==s.params.length&&this.raiseRecoverable(s.start,"getter should have no params"),"set"===e.kind&&1!==s.params.length&&this.raiseRecoverable(s.start,"setter should have exactly one param"),"set"===e.kind&&"RestElement"===s.params[0].type&&this.raiseRecoverable(s.params[0].start,"Setter cannot use rest params"),this.finishNode(e,"MethodDefinition")},w.parseClassField=function(e){if(tt(e,"constructor")?this.raise(e.key.start,"Classes can't have a field named 'constructor'"):e.static&&tt(e,"prototype")&&this.raise(e.key.start,"Classes can't have a static field named 'prototype'"),this.eat(u.eq)){var t=this.currentThisScope(),i=t.inClassFieldInit;t.inClassFieldInit=!0,e.value=this.parseMaybeAssign(),t.inClassFieldInit=i}else e.value=null;return this.semicolon(),this.finishNode(e,"PropertyDefinition")},w.parseClassStaticBlock=function(e){e.body=[];var t=this.labels;for(this.labels=[],this.enterScope(Ne|Kt);this.type!==u.braceR;){var i=this.parseStatement(null);e.body.push(i)}return this.next(),this.exitScope(),this.labels=t,this.finishNode(e,"StaticBlock")},w.parseClassId=function(e,t){this.type===u.name?(e.id=this.parseIdent(),t&&this.checkLValSimple(e.id,le,!1)):(!0===t&&this.unexpected(),e.id=null)},w.parseClassSuper=function(e){e.superClass=this.eat(u._extends)?this.parseExprSubscripts(null,!1):null},w.enterClassBody=function(){var e={declared:Object.create(null),used:[]};return this.privateNameStack.push(e),e.declared},w.exitClassBody=function(){var e=this.privateNameStack.pop(),t=e.declared,i=e.used;if(this.options.checkPrivateFields)for(var r=this.privateNameStack.length,n=0===r?null:this.privateNameStack[r-1],s=0;s=11&&(this.eatContextual("as")?(e.exported=this.parseModuleExportName(),this.checkExport(t,e.exported,this.lastTokStart)):e.exported=null),this.expectContextual("from"),this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom(),this.semicolon(),this.finishNode(e,"ExportAllDeclaration")},w.parseExport=function(e,t){if(this.next(),this.eat(u.star))return this.parseExportAllDeclaration(e,t);if(this.eat(u._default))return this.checkExport(t,"default",this.lastTokStart),e.declaration=this.parseExportDefaultDeclaration(),this.finishNode(e,"ExportDefaultDeclaration");if(this.shouldParseExportStatement())e.declaration=this.parseExportDeclaration(e),"VariableDeclaration"===e.declaration.type?this.checkVariableExport(t,e.declaration.declarations):this.checkExport(t,e.declaration.id,e.declaration.id.start),e.specifiers=[],e.source=null;else{if(e.declaration=null,e.specifiers=this.parseExportSpecifiers(t),this.eatContextual("from"))this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom();else{for(var i=0,r=e.specifiers;i=13&&this.type===u.string){var e=this.parseLiteral(this.value);return Va.test(e.value)&&this.raise(e.start,"An export name cannot include a lone surrogate."),e}return this.parseIdent(!0)},w.adaptDirectivePrologue=function(e){for(var t=0;t=5&&"ExpressionStatement"===e.type&&"Literal"===e.expression.type&&"string"==typeof e.expression.value&&('"'===this.input[e.start]||"'"===this.input[e.start])};var J=T.prototype;J.toAssignable=function(e,t,i){if(this.options.ecmaVersion>=6&&e)switch(e.type){case"Identifier":this.inAsync&&"await"===e.name&&this.raise(e.start,"Cannot use 'await' as identifier inside an async function");break;case"ObjectPattern":case"ArrayPattern":case"AssignmentPattern":case"RestElement":break;case"ObjectExpression":e.type="ObjectPattern",i&&this.checkPatternErrors(i,!0);for(var r=0,n=e.properties;r=8&&!o&&"async"===c.name&&!this.canInsertSemicolon()&&this.eat(u._function))return this.overrideContext(R.f_expr),this.parseFunction(this.startNodeAt(s,a),0,!1,!0,t);if(n&&!this.canInsertSemicolon()){if(this.eat(u.arrow))return this.parseArrowExpression(this.startNodeAt(s,a),[c],!1,t);if(this.options.ecmaVersion>=8&&"async"===c.name&&this.type===u.name&&!o&&(!this.potentialArrowInForAwait||"of"!==this.value||this.containsEsc))return c=this.parseIdent(!1),(this.canInsertSemicolon()||!this.eat(u.arrow))&&this.unexpected(),this.parseArrowExpression(this.startNodeAt(s,a),[c],!0,t)}return c;case u.regexp:var l=this.value;return(r=this.parseLiteral(l.value)).regex={pattern:l.pattern,flags:l.flags},r;case u.num:case u.string:return this.parseLiteral(this.value);case u._null:case u._true:case u._false:return(r=this.startNode()).value=this.type===u._null?null:this.type===u._true,r.raw=this.type.keyword,this.next(),this.finishNode(r,"Literal");case u.parenL:var p=this.start,h=this.parseParenAndDistinguishExpression(n,t);return e&&(e.parenthesizedAssign<0&&!this.isSimpleAssignTarget(h)&&(e.parenthesizedAssign=p),e.parenthesizedBind<0&&(e.parenthesizedBind=p)),h;case u.bracketL:return r=this.startNode(),this.next(),r.elements=this.parseExprList(u.bracketR,!0,!0,e),this.finishNode(r,"ArrayExpression");case u.braceL:return this.overrideContext(R.b_expr),this.parseObj(!1,e);case u._function:return r=this.startNode(),this.next(),this.parseFunction(r,0);case u._class:return this.parseClass(this.startNode(),!1);case u._new:return this.parseNew();case u.backQuote:return this.parseTemplate();case u._import:return this.options.ecmaVersion>=11?this.parseExprImport(i):this.unexpected();default:return this.parseExprAtomDefault()}},v.parseExprAtomDefault=function(){this.unexpected()},v.parseExprImport=function(e){var t=this.startNode();this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword import");var i=this.parseIdent(!0);return this.type!==u.parenL||e?this.type===u.dot?(t.meta=i,this.parseImportMeta(t)):void this.unexpected():this.parseDynamicImport(t)},v.parseDynamicImport=function(e){if(this.next(),e.source=this.parseMaybeAssign(),!this.eat(u.parenR)){var t=this.start;this.eat(u.comma)&&this.eat(u.parenR)?this.raiseRecoverable(t,"Trailing comma is not allowed in import()"):this.unexpected(t)}return this.finishNode(e,"ImportExpression")},v.parseImportMeta=function(e){this.next();var t=this.containsEsc;return e.property=this.parseIdent(!0),"meta"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for import is 'import.meta'"),t&&this.raiseRecoverable(e.start,"'import.meta' must not contain escaped characters"),"module"===this.options.sourceType||this.options.allowImportExportEverywhere||this.raiseRecoverable(e.start,"Cannot use 'import.meta' outside a module"),this.finishNode(e,"MetaProperty")},v.parseLiteral=function(e){var t=this.startNode();return t.value=e,t.raw=this.input.slice(this.start,this.end),110===t.raw.charCodeAt(t.raw.length-1)&&(t.bigint=t.raw.slice(0,-1).replace(/_/g,"")),this.next(),this.finishNode(t,"Literal")},v.parseParenExpression=function(){this.expect(u.parenL);var e=this.parseExpression();return this.expect(u.parenR),e},v.shouldParseArrow=function(e){return!this.canInsertSemicolon()},v.parseParenAndDistinguishExpression=function(e,t){var i,r=this.start,n=this.startLoc,s=this.options.ecmaVersion>=8;if(this.options.ecmaVersion>=6){this.next();var a,o=this.start,c=this.startLoc,l=[],p=!0,h=!1,d=new nt,m=this.yieldPos,f=this.awaitPos;for(this.yieldPos=0,this.awaitPos=0;this.type!==u.parenR;){if(p?p=!1:this.expect(u.comma),s&&this.afterTrailingComma(u.parenR,!0)){h=!0;break}if(this.type===u.ellipsis){a=this.start,l.push(this.parseParenItem(this.parseRestBinding())),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element");break}l.push(this.parseMaybeAssign(!1,d,this.parseParenItem))}var y=this.lastTokEnd,g=this.lastTokEndLoc;if(this.expect(u.parenR),e&&this.shouldParseArrow(l)&&this.eat(u.arrow))return this.checkPatternErrors(d,!1),this.checkYieldAwaitInDefaultParams(),this.yieldPos=m,this.awaitPos=f,this.parseParenArrowList(r,n,l,t);(!l.length||h)&&this.unexpected(this.lastTokStart),a&&this.unexpected(a),this.checkExpressionErrors(d,!0),this.yieldPos=m||this.yieldPos,this.awaitPos=f||this.awaitPos,l.length>1?((i=this.startNodeAt(o,c)).expressions=l,this.finishNodeAt(i,"SequenceExpression",y,g)):i=l[0]}else i=this.parseParenExpression();if(!this.options.preserveParens)return i;var _=this.startNodeAt(r,n);return _.expression=i,this.finishNode(_,"ParenthesizedExpression")},v.parseParenItem=e=>e,v.parseParenArrowList=function(e,t,i,r){return this.parseArrowExpression(this.startNodeAt(e,t),i,!1,r)};var Wa=[];v.parseNew=function(){this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword new");var e=this.startNode(),t=this.parseIdent(!0);if(this.options.ecmaVersion>=6&&this.eat(u.dot)){e.meta=t;var i=this.containsEsc;return e.property=this.parseIdent(!0),"target"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for new is 'new.target'"),i&&this.raiseRecoverable(e.start,"'new.target' must not contain escaped characters"),this.allowNewDotTarget||this.raiseRecoverable(e.start,"'new.target' can only be used in functions and class static block"),this.finishNode(e,"MetaProperty")}var r=this.start,n=this.startLoc;return e.callee=this.parseSubscripts(this.parseExprAtom(null,!1,!0),r,n,!0,!1),this.eat(u.parenL)?e.arguments=this.parseExprList(u.parenR,this.options.ecmaVersion>=8,!1):e.arguments=Wa,this.finishNode(e,"NewExpression")},v.parseTemplateElement=function(e){var t=e.isTagged,i=this.startNode();return this.type===u.invalidTemplate?(t||this.raiseRecoverable(this.start,"Bad escape sequence in untagged template literal"),i.value={raw:this.value,cooked:null}):i.value={raw:this.input.slice(this.start,this.end).replace(/\r\n?/g,"\n"),cooked:this.value},this.next(),i.tail=this.type===u.backQuote,this.finishNode(i,"TemplateElement")},v.parseTemplate=function(e){void 0===e&&(e={});var t=e.isTagged;void 0===t&&(t=!1);var i=this.startNode();this.next(),i.expressions=[];var r=this.parseTemplateElement({isTagged:t});for(i.quasis=[r];!r.tail;)this.type===u.eof&&this.raise(this.pos,"Unterminated template literal"),this.expect(u.dollarBraceL),i.expressions.push(this.parseExpression()),this.expect(u.braceR),i.quasis.push(r=this.parseTemplateElement({isTagged:t}));return this.next(),this.finishNode(i,"TemplateLiteral")},v.isAsyncProp=function(e){return!e.computed&&"Identifier"===e.key.type&&"async"===e.key.name&&(this.type===u.name||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword||this.options.ecmaVersion>=9&&this.type===u.star)&&!Y.test(this.input.slice(this.lastTokEnd,this.start))},v.parseObj=function(e,t){var i=this.startNode(),r=!0,n={};for(i.properties=[],this.next();!this.eat(u.braceR);){if(r)r=!1;else if(this.expect(u.comma),this.options.ecmaVersion>=5&&this.afterTrailingComma(u.braceR))break;var s=this.parseProperty(e,t);e||this.checkPropClash(s,n,t),i.properties.push(s)}return this.finishNode(i,e?"ObjectPattern":"ObjectExpression")},v.parseProperty=function(e,t){var i,r,n,s,a=this.startNode();if(this.options.ecmaVersion>=9&&this.eat(u.ellipsis))return e?(a.argument=this.parseIdent(!1),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element"),this.finishNode(a,"RestElement")):(a.argument=this.parseMaybeAssign(!1,t),this.type===u.comma&&t&&t.trailingComma<0&&(t.trailingComma=this.start),this.finishNode(a,"SpreadElement"));this.options.ecmaVersion>=6&&(a.method=!1,a.shorthand=!1,(e||t)&&(n=this.start,s=this.startLoc),e||(i=this.eat(u.star)));var o=this.containsEsc;return this.parsePropertyName(a),!e&&!o&&this.options.ecmaVersion>=8&&!i&&this.isAsyncProp(a)?(r=!0,i=this.options.ecmaVersion>=9&&this.eat(u.star),this.parsePropertyName(a)):r=!1,this.parsePropertyValue(a,e,i,r,n,s,t,o),this.finishNode(a,"Property")},v.parseGetterSetter=function(e){e.kind=e.key.name,this.parsePropertyName(e),e.value=this.parseMethod(!1);var t="get"===e.kind?0:1;if(e.value.params.length!==t){var i=e.value.start;"get"===e.kind?this.raiseRecoverable(i,"getter should have no params"):this.raiseRecoverable(i,"setter should have exactly one param")}else"set"===e.kind&&"RestElement"===e.value.params[0].type&&this.raiseRecoverable(e.value.params[0].start,"Setter cannot use rest params")},v.parsePropertyValue=function(e,t,i,r,n,s,a,o){(i||r)&&this.type===u.colon&&this.unexpected(),this.eat(u.colon)?(e.value=t?this.parseMaybeDefault(this.start,this.startLoc):this.parseMaybeAssign(!1,a),e.kind="init"):this.options.ecmaVersion>=6&&this.type===u.parenL?(t&&this.unexpected(),e.kind="init",e.method=!0,e.value=this.parseMethod(i,r)):t||o||!(this.options.ecmaVersion>=5)||e.computed||"Identifier"!==e.key.type||"get"!==e.key.name&&"set"!==e.key.name||this.type===u.comma||this.type===u.braceR||this.type===u.eq?this.options.ecmaVersion>=6&&!e.computed&&"Identifier"===e.key.type?((i||r)&&this.unexpected(),this.checkUnreserved(e.key),"await"!==e.key.name||this.awaitIdentPos||(this.awaitIdentPos=n),e.kind="init",t?e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key)):this.type===u.eq&&a?(a.shorthandAssign<0&&(a.shorthandAssign=this.start),e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key))):e.value=this.copyNode(e.key),e.shorthand=!0):this.unexpected():((i||r)&&this.unexpected(),this.parseGetterSetter(e))},v.parsePropertyName=function(e){if(this.options.ecmaVersion>=6){if(this.eat(u.bracketL))return e.computed=!0,e.key=this.parseMaybeAssign(),this.expect(u.bracketR),e.key;e.computed=!1}return e.key=this.type===u.num||this.type===u.string?this.parseExprAtom():this.parseIdent("never"!==this.options.allowReserved)},v.initFunction=function(e){e.id=null,this.options.ecmaVersion>=6&&(e.generator=e.expression=!1),this.options.ecmaVersion>=8&&(e.async=!1)},v.parseMethod=function(e,t,i){var r=this.startNode(),n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.initFunction(r),this.options.ecmaVersion>=6&&(r.generator=e),this.options.ecmaVersion>=8&&(r.async=!!t),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(t,r.generator)|Kt|(i?$r:0)),this.expect(u.parenL),r.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams(),this.parseFunctionBody(r,!1,!0,!1),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(r,"FunctionExpression")},v.parseArrowExpression=function(e,t,i,r){var n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.enterScope(Qt(i,!1)|Fr),this.initFunction(e),this.options.ecmaVersion>=8&&(e.async=!!i),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,e.params=this.toAssignableList(t,!0),this.parseFunctionBody(e,!0,!1,r),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(e,"ArrowFunctionExpression")},v.parseFunctionBody=function(e,t,i,r){var n=t&&this.type!==u.braceL,s=this.strict,a=!1;if(n)e.body=this.parseMaybeAssign(r),e.expression=!0,this.checkParams(e,!1);else{var o=this.options.ecmaVersion>=7&&!this.isSimpleParamList(e.params);(!s||o)&&(a=this.strictDirective(this.end))&&o&&this.raiseRecoverable(e.start,"Illegal 'use strict' directive in function with non-simple parameter list");var c=this.labels;this.labels=[],a&&(this.strict=!0),this.checkParams(e,!s&&!a&&!t&&!i&&this.isSimpleParamList(e.params)),this.strict&&e.id&&this.checkLValSimple(e.id,Hr),e.body=this.parseBlock(!1,void 0,a&&!s),e.expression=!1,this.adaptDirectivePrologue(e.body.body),this.labels=c}this.exitScope()},v.isSimpleParamList=e=>{for(var t=0,i=e;t-1||n.functions.indexOf(e)>-1||n.var.indexOf(e)>-1,n.lexical.push(e),this.inModule&&n.flags&Ie&&delete this.undefinedExports[e]}else if(t===Ur)this.currentScope().lexical.push(e);else if(t===jr){var s=this.currentScope();r=this.treatFunctionsAsVar?s.lexical.indexOf(e)>-1:s.lexical.indexOf(e)>-1||s.var.indexOf(e)>-1,s.functions.push(e)}else for(var a=this.scopeStack.length-1;a>=0;--a){var o=this.scopeStack[a];if(o.lexical.indexOf(e)>-1&&!(o.flags&Br&&o.lexical[0]===e)||!this.treatFunctionsAsVarInScope(o)&&o.functions.indexOf(e)>-1){r=!0;break}if(o.var.push(e),this.inModule&&o.flags&Ie&&delete this.undefinedExports[e],o.flags&Xt)break}r&&this.raiseRecoverable(i,"Identifier '"+e+"' has already been declared")},de.checkLocalExport=function(e){-1===this.scopeStack[0].lexical.indexOf(e.name)&&-1===this.scopeStack[0].var.indexOf(e.name)&&(this.undefinedExports[e.name]=e)},de.currentScope=function(){return this.scopeStack[this.scopeStack.length-1]},de.currentVarScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt)return t}},de.currentThisScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt&&!(t.flags&Fr))return t}};var at=function(e,t,i){this.type="",this.start=t,this.end=0,e.options.locations&&(this.loc=new rt(e,i)),e.options.directSourceFile&&(this.sourceFile=e.options.directSourceFile),e.options.ranges&&(this.range=[t,0])},Me=T.prototype;function Gr(e,t,i,r){return e.type=t,e.end=i,this.options.locations&&(e.loc.end=r),this.options.ranges&&(e.range[1]=i),e}Me.startNode=function(){return new at(this,this.start,this.startLoc)},Me.startNodeAt=function(e,t){return new at(this,e,t)},Me.finishNode=function(e,t){return Gr.call(this,e,t,this.lastTokEnd,this.lastTokEndLoc)},Me.finishNodeAt=function(e,t,i,r){return Gr.call(this,e,t,i,r)},Me.copyNode=function(e){var t=new at(this,e.start,this.startLoc);for(var i in e)t[i]=e[i];return t};var Ka,zr="ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS",Kr=zr+" Extended_Pictographic",Xr=Kr,Qr=Xr+" EBase EComp EMod EPres ExtPict",Yr=Qr,Ga=Yr,za={9:zr,10:Kr,11:Xr,12:Qr,13:Yr,14:Ga},Xa={9:"",10:"",11:"",12:"",13:"",14:"Basic_Emoji Emoji_Keycap_Sequence RGI_Emoji_Modifier_Sequence RGI_Emoji_Flag_Sequence RGI_Emoji_Tag_Sequence RGI_Emoji_ZWJ_Sequence RGI_Emoji"},Pr="Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu",Jr="Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb",Zr=Jr+" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd",en=Zr+" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho",tn=en+" Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi",rn=tn+" Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith",Qa=rn+" Hrkt Katakana_Or_Hiragana Kawi Nag_Mundari Nagm Unknown Zzzz",Ya={9:Jr,10:Zr,11:en,12:tn,13:rn,14:Qa},nn={};function Ja(e){var t=nn[e]={binary:pe(za[e]+" "+Pr),binaryOfStrings:pe(Xa[e]),nonBinary:{General_Category:pe(Pr),Script:pe(Ya[e])}};t.nonBinary.Script_Extensions=t.nonBinary.Script,t.nonBinary.gc=t.nonBinary.General_Category,t.nonBinary.sc=t.nonBinary.Script,t.nonBinary.scx=t.nonBinary.Script_Extensions}for(Ze=0,Ut=[9,10,11,12,13,14];Ze=6?"uy":"")+(e.options.ecmaVersion>=9?"s":"")+(e.options.ecmaVersion>=13?"d":"")+(e.options.ecmaVersion>=15?"v":""),this.unicodeProperties=nn[e.options.ecmaVersion>=14?14:e.options.ecmaVersion],this.source="",this.flags="",this.start=0,this.switchU=!1,this.switchV=!1,this.switchN=!1,this.pos=0,this.lastIntValue=0,this.lastStringValue="",this.lastAssertionIsQuantifiable=!1,this.numCapturingParens=0,this.maxBackReference=0,this.groupNames=[],this.backReferenceNames=[]};function an(e){return 36===e||e>=40&&e<=43||46===e||63===e||e>=91&&e<=94||e>=123&&e<=125}function Za(e){return ce(e,!0)||36===e||95===e}function es(e){return be(e,!0)||36===e||95===e||8204===e||8205===e}function sn(e){return e>=65&&e<=90||e>=97&&e<=122}function ts(e){return e>=0&&e<=1114111}re.prototype.reset=function(e,t,i){var r=-1!==i.indexOf("v"),n=-1!==i.indexOf("u");this.start=0|e,this.source=t+"",this.flags=i,r&&this.parser.options.ecmaVersion>=15?(this.switchU=!0,this.switchV=!0,this.switchN=!0):(this.switchU=n&&this.parser.options.ecmaVersion>=6,this.switchV=!1,this.switchN=n&&this.parser.options.ecmaVersion>=9)},re.prototype.raise=function(e){this.parser.raiseRecoverable(this.start,"Invalid regular expression: /"+this.source+"/: "+e)},re.prototype.at=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return-1;var n=i.charCodeAt(e);if(!t&&!this.switchU||n<=55295||n>=57344||e+1>=r)return n;var s=i.charCodeAt(e+1);return s>=56320&&s<=57343?(n<<10)+s-56613888:n},re.prototype.nextIndex=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return r;var n,s=i.charCodeAt(e);return!t&&!this.switchU||s<=55295||s>=57344||e+1>=r||(n=i.charCodeAt(e+1))<56320||n>57343?e+1:e+2},re.prototype.current=function(e){return void 0===e&&(e=!1),this.at(this.pos,e)},re.prototype.lookahead=function(e){return void 0===e&&(e=!1),this.at(this.nextIndex(this.pos,e),e)},re.prototype.advance=function(e){void 0===e&&(e=!1),this.pos=this.nextIndex(this.pos,e)},re.prototype.eat=function(e,t){return void 0===t&&(t=!1),this.current(t)===e&&(this.advance(t),!0)},re.prototype.eatChars=function(e,t){void 0===t&&(t=!1);for(var i=this.pos,r=0,n=e;r-1&&this.raise(e.start,"Duplicate regular expression flag"),"u"===a&&(r=!0),"v"===a&&(n=!0)}this.options.ecmaVersion>=15&&r&&n&&this.raise(e.start,"Invalid regular expression flag")},b.validateRegExpPattern=function(e){this.regexp_pattern(e),!e.switchN&&this.options.ecmaVersion>=9&&e.groupNames.length>0&&(e.switchN=!0,this.regexp_pattern(e))},b.regexp_pattern=function(e){e.pos=0,e.lastIntValue=0,e.lastStringValue="",e.lastAssertionIsQuantifiable=!1,e.numCapturingParens=0,e.maxBackReference=0,e.groupNames.length=0,e.backReferenceNames.length=0,this.regexp_disjunction(e),e.pos!==e.source.length&&(e.eat(41)&&e.raise("Unmatched ')'"),(e.eat(93)||e.eat(125))&&e.raise("Lone quantifier brackets")),e.maxBackReference>e.numCapturingParens&&e.raise("Invalid escape");for(var t=0,i=e.backReferenceNames;t=9&&(i=e.eat(60)),e.eat(61)||e.eat(33))return this.regexp_disjunction(e),e.eat(41)||e.raise("Unterminated group"),e.lastAssertionIsQuantifiable=!i,!0}return e.pos=t,!1},b.regexp_eatQuantifier=function(e,t){return void 0===t&&(t=!1),!!this.regexp_eatQuantifierPrefix(e,t)&&(e.eat(63),!0)},b.regexp_eatQuantifierPrefix=function(e,t){return e.eat(42)||e.eat(43)||e.eat(63)||this.regexp_eatBracedQuantifier(e,t)},b.regexp_eatBracedQuantifier=function(e,t){var i=e.pos;if(e.eat(123)){var r=0,n=-1;if(this.regexp_eatDecimalDigits(e)&&(r=e.lastIntValue,e.eat(44)&&this.regexp_eatDecimalDigits(e)&&(n=e.lastIntValue),e.eat(125)))return-1!==n&&n=9?this.regexp_groupSpecifier(e):63===e.current()&&e.raise("Invalid group"),this.regexp_disjunction(e),e.eat(41))return e.numCapturingParens+=1,!0;e.raise("Unterminated group")}return!1},b.regexp_eatExtendedAtom=function(e){return e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)||this.regexp_eatInvalidBracedQuantifier(e)||this.regexp_eatExtendedPatternCharacter(e)},b.regexp_eatInvalidBracedQuantifier=function(e){return this.regexp_eatBracedQuantifier(e,!0)&&e.raise("Nothing to repeat"),!1},b.regexp_eatSyntaxCharacter=e=>{var t=e.current();return!!an(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatPatternCharacters=e=>{for(var t=e.pos,i=0;-1!==(i=e.current())&&!an(i);)e.advance();return e.pos!==t},b.regexp_eatExtendedPatternCharacter=e=>{var t=e.current();return!(-1===t||36===t||t>=40&&t<=43||46===t||63===t||91===t||94===t||124===t||(e.advance(),0))},b.regexp_groupSpecifier=function(e){if(e.eat(63)){if(this.regexp_eatGroupName(e))return-1!==e.groupNames.indexOf(e.lastStringValue)&&e.raise("Duplicate capture group name"),void e.groupNames.push(e.lastStringValue);e.raise("Invalid group")}},b.regexp_eatGroupName=function(e){if(e.lastStringValue="",e.eat(60)){if(this.regexp_eatRegExpIdentifierName(e)&&e.eat(62))return!0;e.raise("Invalid capture group name")}return!1},b.regexp_eatRegExpIdentifierName=function(e){if(e.lastStringValue="",this.regexp_eatRegExpIdentifierStart(e)){for(e.lastStringValue+=fe(e.lastIntValue);this.regexp_eatRegExpIdentifierPart(e);)e.lastStringValue+=fe(e.lastIntValue);return!0}return!1},b.regexp_eatRegExpIdentifierStart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),Za(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatRegExpIdentifierPart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),es(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatAtomEscape=function(e){return!!(this.regexp_eatBackReference(e)||this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)||e.switchN&&this.regexp_eatKGroupName(e))||(e.switchU&&(99===e.current()&&e.raise("Invalid unicode escape"),e.raise("Invalid escape")),!1)},b.regexp_eatBackReference=function(e){var t=e.pos;if(this.regexp_eatDecimalEscape(e)){var i=e.lastIntValue;if(e.switchU)return i>e.maxBackReference&&(e.maxBackReference=i),!0;if(i<=e.numCapturingParens)return!0;e.pos=t}return!1},b.regexp_eatKGroupName=function(e){if(e.eat(107)){if(this.regexp_eatGroupName(e))return e.backReferenceNames.push(e.lastStringValue),!0;e.raise("Invalid named reference")}return!1},b.regexp_eatCharacterEscape=function(e){return this.regexp_eatControlEscape(e)||this.regexp_eatCControlLetter(e)||this.regexp_eatZero(e)||this.regexp_eatHexEscapeSequence(e)||this.regexp_eatRegExpUnicodeEscapeSequence(e,!1)||!e.switchU&&this.regexp_eatLegacyOctalEscapeSequence(e)||this.regexp_eatIdentityEscape(e)},b.regexp_eatCControlLetter=function(e){var t=e.pos;if(e.eat(99)){if(this.regexp_eatControlLetter(e))return!0;e.pos=t}return!1},b.regexp_eatZero=e=>!(48!==e.current()||st(e.lookahead())||(e.lastIntValue=0,e.advance(),0)),b.regexp_eatControlEscape=e=>{var t=e.current();return 116===t?(e.lastIntValue=9,e.advance(),!0):110===t?(e.lastIntValue=10,e.advance(),!0):118===t?(e.lastIntValue=11,e.advance(),!0):102===t?(e.lastIntValue=12,e.advance(),!0):114===t&&(e.lastIntValue=13,e.advance(),!0)},b.regexp_eatControlLetter=e=>{var t=e.current();return!!sn(t)&&(e.lastIntValue=t%32,e.advance(),!0)},b.regexp_eatRegExpUnicodeEscapeSequence=function(e,t){void 0===t&&(t=!1);var i=e.pos,r=t||e.switchU;if(e.eat(117)){if(this.regexp_eatFixedHexDigits(e,4)){var n=e.lastIntValue;if(r&&n>=55296&&n<=56319){var s=e.pos;if(e.eat(92)&&e.eat(117)&&this.regexp_eatFixedHexDigits(e,4)){var a=e.lastIntValue;if(a>=56320&&a<=57343)return e.lastIntValue=1024*(n-55296)+(a-56320)+65536,!0}e.pos=s,e.lastIntValue=n}return!0}if(r&&e.eat(123)&&this.regexp_eatHexDigits(e)&&e.eat(125)&&ts(e.lastIntValue))return!0;r&&e.raise("Invalid unicode escape"),e.pos=i}return!1},b.regexp_eatIdentityEscape=function(e){if(e.switchU)return!!this.regexp_eatSyntaxCharacter(e)||!!e.eat(47)&&(e.lastIntValue=47,!0);var t=e.current();return!(99===t||e.switchN&&107===t||(e.lastIntValue=t,e.advance(),0))},b.regexp_eatDecimalEscape=e=>{e.lastIntValue=0;var t=e.current();if(t>=49&&t<=57){do{e.lastIntValue=10*e.lastIntValue+(t-48),e.advance()}while((t=e.current())>=48&&t<=57);return!0}return!1};var on=0,ue=1,Q=2;function is(e){return 100===e||68===e||115===e||83===e||119===e||87===e}function cn(e){return sn(e)||95===e}function rs(e){return cn(e)||st(e)}function ns(e){return 33===e||e>=35&&e<=38||e>=42&&e<=44||46===e||e>=58&&e<=64||94===e||96===e||126===e}function as(e){return 40===e||41===e||45===e||47===e||e>=91&&e<=93||e>=123&&e<=125}function ss(e){return 33===e||35===e||37===e||38===e||44===e||45===e||e>=58&&e<=62||64===e||96===e||126===e}function st(e){return e>=48&&e<=57}function un(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function ln(e){return e>=65&&e<=70?e-65+10:e>=97&&e<=102?e-97+10:e-48}function hn(e){return e>=48&&e<=55}b.regexp_eatCharacterClassEscape=function(e){var t,i=e.current();if(is(i))return e.lastIntValue=-1,e.advance(),ue;var r=!1;if(e.switchU&&this.options.ecmaVersion>=9&&((r=80===i)||112===i)){if(e.lastIntValue=-1,e.advance(),e.eat(123)&&(t=this.regexp_eatUnicodePropertyValueExpression(e))&&e.eat(125))return r&&t===Q&&e.raise("Invalid property name"),t;e.raise("Invalid property name")}return on},b.regexp_eatUnicodePropertyValueExpression=function(e){var t=e.pos;if(this.regexp_eatUnicodePropertyName(e)&&e.eat(61)){var i=e.lastStringValue;if(this.regexp_eatUnicodePropertyValue(e)){var r=e.lastStringValue;return this.regexp_validateUnicodePropertyNameAndValue(e,i,r),ue}}if(e.pos=t,this.regexp_eatLoneUnicodePropertyNameOrValue(e)){var n=e.lastStringValue;return this.regexp_validateUnicodePropertyNameOrValue(e,n)}return on},b.regexp_validateUnicodePropertyNameAndValue=(e,t,i)=>{Te(e.unicodeProperties.nonBinary,t)||e.raise("Invalid property name"),e.unicodeProperties.nonBinary[t].test(i)||e.raise("Invalid property value")},b.regexp_validateUnicodePropertyNameOrValue=(e,t)=>e.unicodeProperties.binary.test(t)?ue:e.switchV&&e.unicodeProperties.binaryOfStrings.test(t)?Q:void e.raise("Invalid property name"),b.regexp_eatUnicodePropertyName=e=>{var t=0;for(e.lastStringValue="";cn(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatUnicodePropertyValue=e=>{var t=0;for(e.lastStringValue="";rs(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatLoneUnicodePropertyNameOrValue=function(e){return this.regexp_eatUnicodePropertyValue(e)},b.regexp_eatCharacterClass=function(e){if(e.eat(91)){var t=e.eat(94),i=this.regexp_classContents(e);return e.eat(93)||e.raise("Unterminated character class"),t&&i===Q&&e.raise("Negated character class may contain strings"),!0}return!1},b.regexp_classContents=function(e){return 93===e.current()?ue:e.switchV?this.regexp_classSetExpression(e):(this.regexp_nonEmptyClassRanges(e),ue)},b.regexp_nonEmptyClassRanges=function(e){for(;this.regexp_eatClassAtom(e);){var t=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassAtom(e)){var i=e.lastIntValue;e.switchU&&(-1===t||-1===i)&&e.raise("Invalid character class"),-1!==t&&-1!==i&&t>i&&e.raise("Range out of order in character class")}}},b.regexp_eatClassAtom=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatClassEscape(e))return!0;if(e.switchU){var i=e.current();(99===i||hn(i))&&e.raise("Invalid class escape"),e.raise("Invalid escape")}e.pos=t}var r=e.current();return 93!==r&&(e.lastIntValue=r,e.advance(),!0)},b.regexp_eatClassEscape=function(e){var t=e.pos;if(e.eat(98))return e.lastIntValue=8,!0;if(e.switchU&&e.eat(45))return e.lastIntValue=45,!0;if(!e.switchU&&e.eat(99)){if(this.regexp_eatClassControlLetter(e))return!0;e.pos=t}return this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)},b.regexp_classSetExpression=function(e){var t,i=ue;if(!this.regexp_eatClassSetRange(e))if(t=this.regexp_eatClassSetOperand(e)){t===Q&&(i=Q);for(var r=e.pos;e.eatChars([38,38]);)38!==e.current()&&(t=this.regexp_eatClassSetOperand(e))?t!==Q&&(i=ue):e.raise("Invalid character in character class");if(r!==e.pos)return i;for(;e.eatChars([45,45]);)this.regexp_eatClassSetOperand(e)||e.raise("Invalid character in character class");if(r!==e.pos)return i}else e.raise("Invalid character in character class");for(;;)if(!this.regexp_eatClassSetRange(e)){if(!(t=this.regexp_eatClassSetOperand(e)))return i;t===Q&&(i=Q)}},b.regexp_eatClassSetRange=function(e){var t=e.pos;if(this.regexp_eatClassSetCharacter(e)){var i=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassSetCharacter(e)){var r=e.lastIntValue;return-1!==i&&-1!==r&&i>r&&e.raise("Range out of order in character class"),!0}e.pos=t}return!1},b.regexp_eatClassSetOperand=function(e){return this.regexp_eatClassSetCharacter(e)?ue:this.regexp_eatClassStringDisjunction(e)||this.regexp_eatNestedClass(e)},b.regexp_eatNestedClass=function(e){var t=e.pos;if(e.eat(91)){var i=e.eat(94),r=this.regexp_classContents(e);if(e.eat(93))return i&&r===Q&&e.raise("Negated character class may contain strings"),r;e.pos=t}if(e.eat(92)){var n=this.regexp_eatCharacterClassEscape(e);if(n)return n;e.pos=t}return null},b.regexp_eatClassStringDisjunction=function(e){var t=e.pos;if(e.eatChars([92,113])){if(e.eat(123)){var i=this.regexp_classStringDisjunctionContents(e);if(e.eat(125))return i}else e.raise("Invalid escape");e.pos=t}return null},b.regexp_classStringDisjunctionContents=function(e){for(var t=this.regexp_classString(e);e.eat(124);)this.regexp_classString(e)===Q&&(t=Q);return t},b.regexp_classString=function(e){for(var t=0;this.regexp_eatClassSetCharacter(e);)t++;return 1===t?ue:Q},b.regexp_eatClassSetCharacter=function(e){var t=e.pos;if(e.eat(92))return!(!this.regexp_eatCharacterEscape(e)&&!this.regexp_eatClassSetReservedPunctuator(e)&&(e.eat(98)?(e.lastIntValue=8,0):(e.pos=t,1)));var i=e.current();return!(i<0||i===e.lookahead()&&ns(i)||as(i)||(e.advance(),e.lastIntValue=i,0))},b.regexp_eatClassSetReservedPunctuator=e=>{var t=e.current();return!!ss(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatClassControlLetter=e=>{var t=e.current();return!(!st(t)&&95!==t||(e.lastIntValue=t%32,e.advance(),0))},b.regexp_eatHexEscapeSequence=function(e){var t=e.pos;if(e.eat(120)){if(this.regexp_eatFixedHexDigits(e,2))return!0;e.switchU&&e.raise("Invalid escape"),e.pos=t}return!1},b.regexp_eatDecimalDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;st(i=e.current());)e.lastIntValue=10*e.lastIntValue+(i-48),e.advance();return e.pos!==t},b.regexp_eatHexDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;un(i=e.current());)e.lastIntValue=16*e.lastIntValue+ln(i),e.advance();return e.pos!==t},b.regexp_eatLegacyOctalEscapeSequence=function(e){if(this.regexp_eatOctalDigit(e)){var t=e.lastIntValue;if(this.regexp_eatOctalDigit(e)){var i=e.lastIntValue;t<=3&&this.regexp_eatOctalDigit(e)?e.lastIntValue=64*t+8*i+e.lastIntValue:e.lastIntValue=8*t+i}else e.lastIntValue=t;return!0}return!1},b.regexp_eatOctalDigit=e=>{var t=e.current();return hn(t)?(e.lastIntValue=t-48,e.advance(),!0):(e.lastIntValue=0,!1)},b.regexp_eatFixedHexDigits=(e,t)=>{var i=e.pos;e.lastIntValue=0;for(var r=0;rtypeof Symbol&&(C[Symbol.iterator]=function(){return{next:()=>{var e=this.getToken();return{done:e.type===u.eof,value:e}}}}),C.nextToken=function(){var e=this.curContext();return e&&e.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length?this.finishToken(u.eof):e.override?e.override(this):void this.readToken(this.fullCharCodeAtPos())},C.readToken=function(e){return ce(e,this.options.ecmaVersion>=6)||92===e?this.readWord():this.getTokenFromCode(e)},C.fullCharCodeAtPos=function(){var e=this.input.charCodeAt(this.pos);if(e<=55295||e>=56320)return e;var t=this.input.charCodeAt(this.pos+1);return t<=56319||t>=57344?e:(e<<10)+t-56613888},C.skipBlockComment=function(){var e=this.options.onComment&&this.curPosition(),t=this.pos,i=this.input.indexOf("*/",this.pos+=2);if(-1===i&&this.raise(this.pos-2,"Unterminated comment"),this.pos=i+2,this.options.locations)for(var r=void 0,n=t;(r=Nr(this.input,n,this.pos))>-1;)++this.curLine,n=this.lineStart=r;this.options.onComment&&this.options.onComment(!0,this.input.slice(t+2,i),t,this.pos,e,this.curPosition())},C.skipLineComment=function(e){for(var t=this.pos,i=this.options.onComment&&this.curPosition(),r=this.input.charCodeAt(this.pos+=e);this.pos8&&e<14||e>=5760&&Mr.test(String.fromCharCode(e))))break e;++this.pos}}},C.finishToken=function(e,t){this.end=this.pos,this.options.locations&&(this.endLoc=this.curPosition());var i=this.type;this.type=e,this.value=t,this.updateContext(i)},C.readToken_dot=function(){var e=this.input.charCodeAt(this.pos+1);if(e>=48&&e<=57)return this.readNumber(!0);var t=this.input.charCodeAt(this.pos+2);return this.options.ecmaVersion>=6&&46===e&&46===t?(this.pos+=3,this.finishToken(u.ellipsis)):(++this.pos,this.finishToken(u.dot))},C.readToken_slash=function(){var e=this.input.charCodeAt(this.pos+1);return this.exprAllowed?(++this.pos,this.readRegexp()):61===e?this.finishOp(u.assign,2):this.finishOp(u.slash,1)},C.readToken_mult_modulo_exp=function(e){var t=this.input.charCodeAt(this.pos+1),i=1,r=42===e?u.star:u.modulo;return this.options.ecmaVersion>=7&&42===e&&42===t&&(++i,r=u.starstar,t=this.input.charCodeAt(this.pos+2)),61===t?this.finishOp(u.assign,i+1):this.finishOp(r,i)},C.readToken_pipe_amp=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?this.options.ecmaVersion>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(124===e?u.logicalOR:u.logicalAND,2):61===t?this.finishOp(u.assign,2):this.finishOp(124===e?u.bitwiseOR:u.bitwiseAND,1)},C.readToken_caret=function(){return 61===this.input.charCodeAt(this.pos+1)?this.finishOp(u.assign,2):this.finishOp(u.bitwiseXOR,1)},C.readToken_plus_min=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?45!==t||this.inModule||62!==this.input.charCodeAt(this.pos+2)||0!==this.lastTokEnd&&!Y.test(this.input.slice(this.lastTokEnd,this.pos))?this.finishOp(u.incDec,2):(this.skipLineComment(3),this.skipSpace(),this.nextToken()):61===t?this.finishOp(u.assign,2):this.finishOp(u.plusMin,1)},C.readToken_lt_gt=function(e){var t=this.input.charCodeAt(this.pos+1),i=1;return t===e?(i=62===e&&62===this.input.charCodeAt(this.pos+2)?3:2,61===this.input.charCodeAt(this.pos+i)?this.finishOp(u.assign,i+1):this.finishOp(u.bitShift,i)):33!==t||60!==e||this.inModule||45!==this.input.charCodeAt(this.pos+2)||45!==this.input.charCodeAt(this.pos+3)?(61===t&&(i=2),this.finishOp(u.relational,i)):(this.skipLineComment(4),this.skipSpace(),this.nextToken())},C.readToken_eq_excl=function(e){var t=this.input.charCodeAt(this.pos+1);return 61===t?this.finishOp(u.equality,61===this.input.charCodeAt(this.pos+2)?3:2):61===e&&62===t&&this.options.ecmaVersion>=6?(this.pos+=2,this.finishToken(u.arrow)):this.finishOp(61===e?u.eq:u.prefix,1)},C.readToken_question=function(){var e=this.options.ecmaVersion;if(e>=11){var t=this.input.charCodeAt(this.pos+1);if(46===t){var i=this.input.charCodeAt(this.pos+2);if(i<48||i>57)return this.finishOp(u.questionDot,2)}if(63===t)return e>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(u.coalesce,2)}return this.finishOp(u.question,1)},C.readToken_numberSign=function(){var e=35;if(this.options.ecmaVersion>=13&&(++this.pos,ce(e=this.fullCharCodeAtPos(),!0)||92===e))return this.finishToken(u.privateId,this.readWord1());this.raise(this.pos,"Unexpected character '"+fe(e)+"'")},C.getTokenFromCode=function(e){switch(e){case 46:return this.readToken_dot();case 40:return++this.pos,this.finishToken(u.parenL);case 41:return++this.pos,this.finishToken(u.parenR);case 59:return++this.pos,this.finishToken(u.semi);case 44:return++this.pos,this.finishToken(u.comma);case 91:return++this.pos,this.finishToken(u.bracketL);case 93:return++this.pos,this.finishToken(u.bracketR);case 123:return++this.pos,this.finishToken(u.braceL);case 125:return++this.pos,this.finishToken(u.braceR);case 58:return++this.pos,this.finishToken(u.colon);case 96:if(this.options.ecmaVersion<6)break;return++this.pos,this.finishToken(u.backQuote);case 48:var t=this.input.charCodeAt(this.pos+1);if(120===t||88===t)return this.readRadixNumber(16);if(this.options.ecmaVersion>=6){if(111===t||79===t)return this.readRadixNumber(8);if(98===t||66===t)return this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(e);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo_exp(e);case 124:case 38:return this.readToken_pipe_amp(e);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(e);case 60:case 62:return this.readToken_lt_gt(e);case 61:case 33:return this.readToken_eq_excl(e);case 63:return this.readToken_question();case 126:return this.finishOp(u.prefix,1);case 35:return this.readToken_numberSign()}this.raise(this.pos,"Unexpected character '"+fe(e)+"'")},C.finishOp=function(e,t){var i=this.input.slice(this.pos,this.pos+t);return this.pos+=t,this.finishToken(e,i)},C.readRegexp=function(){for(var e,t,i=this.pos;;){this.pos>=this.input.length&&this.raise(i,"Unterminated regular expression");var r=this.input.charAt(this.pos);if(Y.test(r)&&this.raise(i,"Unterminated regular expression"),e)e=!1;else{if("["===r)t=!0;else if("]"===r&&t)t=!1;else if("/"===r&&!t)break;e="\\"===r}++this.pos}var n=this.input.slice(i,this.pos);++this.pos;var s=this.pos,a=this.readWord1();this.containsEsc&&this.unexpected(s);var o=this.regexpState||(this.regexpState=new re(this));o.reset(i,n,a),this.validateRegExpFlags(o),this.validateRegExpPattern(o);var c=null;try{c=RegExp(n,a)}catch{}return this.finishToken(u.regexp,{pattern:n,flags:a,value:c})},C.readInt=function(e,t,i){for(var r=this.options.ecmaVersion>=12&&void 0===t,n=i&&48===this.input.charCodeAt(this.pos),s=this.pos,a=0,o=0,c=0,l=t??1/0;c=97?h-97+10:h>=65?h-65+10:h>=48&&h<=57?h-48:1/0)>=e)break;o=h,a=a*e+p}}return r&&95===o&&this.raiseRecoverable(this.pos-1,"Numeric separator is not allowed at the last of digits"),this.pos===s||null!=t&&this.pos-s!==t?null:a},C.readRadixNumber=function(e){var t=this.pos;this.pos+=2;var i=this.readInt(e);return null==i&&this.raise(this.start+2,"Expected number in radix "+e),this.options.ecmaVersion>=11&&110===this.input.charCodeAt(this.pos)?(i=pn(this.input.slice(t,this.pos)),++this.pos):ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,i)},C.readNumber=function(e){var t=this.pos;e||null!==this.readInt(10,void 0,!0)||this.raise(t,"Invalid number");var i=this.pos-t>=2&&48===this.input.charCodeAt(t);i&&this.strict&&this.raise(t,"Invalid number");var r=this.input.charCodeAt(this.pos);if(!i&&!e&&this.options.ecmaVersion>=11&&110===r){var n=pn(this.input.slice(t,this.pos));return++this.pos,ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,n)}i&&/[89]/.test(this.input.slice(t,this.pos))&&(i=!1),46!==r||i||(++this.pos,this.readInt(10),r=this.input.charCodeAt(this.pos)),69!==r&&101!==r||i||((43===(r=this.input.charCodeAt(++this.pos))||45===r)&&++this.pos,null===this.readInt(10)&&this.raise(t,"Invalid number")),ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number");var s=os(this.input.slice(t,this.pos),i);return this.finishToken(u.num,s)},C.readCodePoint=function(){var e;if(123===this.input.charCodeAt(this.pos)){this.options.ecmaVersion<6&&this.unexpected();var t=++this.pos;e=this.readHexChar(this.input.indexOf("}",this.pos)-this.pos),++this.pos,e>1114111&&this.invalidStringToken(t,"Code point out of bounds")}else e=this.readHexChar(4);return e},C.readString=function(e){for(var t="",i=++this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated string constant");var r=this.input.charCodeAt(this.pos);if(r===e)break;92===r?(t+=this.input.slice(i,this.pos),t+=this.readEscapedChar(!1),i=this.pos):8232===r||8233===r?(this.options.ecmaVersion<10&&this.raise(this.start,"Unterminated string constant"),++this.pos,this.options.locations&&(this.curLine++,this.lineStart=this.pos)):(we(r)&&this.raise(this.start,"Unterminated string constant"),++this.pos)}return t+=this.input.slice(i,this.pos++),this.finishToken(u.string,t)};var fn={};C.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(e){if(e!==fn)throw e;this.readInvalidTemplateToken()}this.inTemplateElement=!1},C.invalidStringToken=function(e,t){if(this.inTemplateElement&&this.options.ecmaVersion>=9)throw fn;this.raise(e,t)},C.readTmplToken=function(){for(var e="",t=this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated template");var i=this.input.charCodeAt(this.pos);if(96===i||36===i&&123===this.input.charCodeAt(this.pos+1))return this.pos!==this.start||this.type!==u.template&&this.type!==u.invalidTemplate?(e+=this.input.slice(t,this.pos),this.finishToken(u.template,e)):36===i?(this.pos+=2,this.finishToken(u.dollarBraceL)):(++this.pos,this.finishToken(u.backQuote));if(92===i)e+=this.input.slice(t,this.pos),e+=this.readEscapedChar(!0),t=this.pos;else if(we(i)){switch(e+=this.input.slice(t,this.pos),++this.pos,i){case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:e+="\n";break;default:e+=String.fromCharCode(i)}this.options.locations&&(++this.curLine,this.lineStart=this.pos),t=this.pos}else++this.pos}},C.readInvalidTemplateToken=function(){for(;this.pos=48&&t<=55){var r=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],n=Number.parseInt(r,8);return n>255&&(n=Number.parseInt(r=r.slice(0,-1),8)),this.pos+=r.length-1,t=this.input.charCodeAt(this.pos),("0"!==r||56===t||57===t)&&(this.strict||e)&&this.invalidStringToken(this.pos-1-r.length,e?"Octal literal in template string":"Octal literal in strict mode"),String.fromCharCode(n)}return we(t)?"":String.fromCharCode(t)}},C.readHexChar=function(e){var t=this.pos,i=this.readInt(16,e);return null===i&&this.invalidStringToken(t,"Bad character escape sequence"),i},C.readWord1=function(){this.containsEsc=!1;for(var e="",t=!0,i=this.pos,r=this.options.ecmaVersion>=6;this.pos>16)+(t>>16)+(i>>16)<<16|65535&i}function fs(e,t){return e<>>32-t}function ut(e,t,i,r,n,s){return ye(fs(ye(ye(t,e),ye(r,s)),n),i)}function D(e,t,i,r,n,s,a){return ut(t&i|~t&r,e,t,n,s,a)}function O(e,t,i,r,n,s,a){return ut(t&r|i&~r,e,t,n,s,a)}function V(e,t,i,r,n,s,a){return ut(t^i^r,e,t,n,s,a)}function F(e,t,i,r,n,s,a){return ut(i^(t|~r),e,t,n,s,a)}function ot(e,t){e[t>>5]|=128<>>9<<4)]=t;let i=1732584193,r=-271733879,n=-1732584194,s=271733878;for(let t=0;t>5]>>>r%32&255);return t}function ri(e){let t=[],i=e.length>>2;for(let e=0;e>5]|=(255&e.charCodeAt(i/8))<16&&(i=ot(i,8*e.length));for(let e=0;e<16;e+=1)r[e]=909522486^i[e],n[e]=1549556828^i[e];let s=ot(r.concat(ri(t)),512+8*t.length);return yn(ot(n.concat(s),640))}function gn(e){let t="0123456789abcdef",i="";for(let r=0;r>>4&15)+t.charAt(15&n)}return i}function ni(e){return unescape(encodeURIComponent(e))}function xn(e){return ds(ni(e))}function ys(e){return gn(xn(e))}function _n(e,t){return ms(ni(e),ni(t))}function gs(e,t){return gn(_n(e,t))}function xs(e,t,i){return t?i?_n(t,e):gs(t,e):i?xn(e):ys(e)}var ei=3072;function _s(e){let t=new Headers(e);if(e.has("x-bare-headers")){let i=e.get("x-bare-headers");if(i.length>ei){t.delete("x-bare-headers");let e=0;for(let r=0;r{s.removeEventListener("close",o),s.removeEventListener("message",c)},o=()=>{a()},c=e=>{if(a(),"string"!=typeof e.data)throw TypeError("the first websocket message was not a text frame");let t=JSON.parse(e.data);if("open"!==t.type)throw TypeError("message was not of open type");e.stopImmediatePropagation(),r({protocol:t.protocol,setCookies:t.setCookies}),n(ge.OPEN),s.dispatchEvent(new Event("open"))};return s.addEventListener("close",o),s.addEventListener("message",c),s.addEventListener("open",r=>{r.stopImmediatePropagation(),n(ge.CONNECTING),i().then(i=>ge.prototype.send.call(s,JSON.stringify({type:"connect",remote:e.toString(),protocols:t,headers:i,forwardHeaders:[]})))},{once:!0}),s}async request(e,t,i,r,n,s,a){if(r.protocol.startsWith("blob:")){let e=await ti(r),t=new mn(e.body,e);return t.rawHeaders=Object.fromEntries(e.headers),t.rawResponse=e,t}let o={};if(t instanceof Headers)for(let[e,i]of t)o[e]=i;else for(let e in t)o[e]=t[e];let c={credentials:"omit",method:e,signal:a};"only-if-cached"!==n&&(c.cache=n),void 0!==i&&(c.body=i),void 0!==s&&(c.duplex=s),c.headers=this.createBareHeaders(r,o);let l=await ti(this.http+"?cache="+xs(r.toString()),c),p=await this.readBareResponse(l),h=new mn(hs.includes(p.status)?void 0:l.body,{status:p.status,statusText:p.statusText??void 0,headers:new Headers(p.headers)});return h.rawHeaders=p.headers,h.rawResponse=l,h}async readBareResponse(e){if(!e.ok)throw new ct(e.status,await e.json());let t=bs(e.headers),i={},r=t.get("x-bare-status");null!==r&&(i.status=Number.parseInt(r));let n=t.get("x-bare-status-text");null!==n&&(i.statusText=n);let s=t.get("x-bare-headers");return null!==s&&(i.headers=JSON.parse(s)),i}createBareHeaders(e,t,i=[],r=[],n=[]){let s=new Headers;for(let r of(s.set("x-bare-url",e.toString()),s.set("x-bare-headers",JSON.stringify(t)),i))s.append("x-bare-forward-headers",r);for(let e of r)s.append("x-bare-pass-headers",e);for(let e of n)s.append("x-bare-pass-status",e.toString());return _s(s),s}},ws="!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~";function vs(e){for(let t=0;tthis.loadManifest(e)).catch(e=>{throw delete this.working,e})),this.working):this.client}getClient(){for(let[e,t]of Ss)if(this.manifest.versions.includes(e))return new t(this.server);throw Error("Unable to find compatible client version. Starting from v2.0.0, @tomphttp/bare-client only supports Bare servers v3+. For more information, see https://github.com/tomphttp/bare-client/")}createWebSocket(e,t=[],i){if(!this.client)throw TypeError("You need to wait for the client to finish fetching the manifest before creating any WebSockets. Try caching the manifest data before making this request.");try{e=new URL(e)}catch{throw new DOMException(`Faiiled to construct 'WebSocket': The URL '${e}' is invalid.`)}if(!Cs.includes(e.protocol))throw new DOMException(`Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${e.protocol}' is not allowed.`);for(let e of(Array.isArray(t)||(t=[t]),t=t.map(String)))if(!vs(e))throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${e}' is invalid.`);let r=this.client.connect(e,t,async()=>{let t="function"==typeof i.headers?await i.headers():i.headers||{},r=t instanceof Headers?Object.fromEntries(t):t;return r.Host=e.host,r.Pragma="no-cache",r["Cache-Control"]="no-cache",r.Upgrade="websocket",r.Connection="Upgrade",r},e=>{n=e.protocol,i.setCookiesCallback&&i.setCookiesCallback(e.setCookies)},e=>{s=e},i.webSocketImpl||me),n="",s=ge.CONNECTING,a=()=>{let e=Es.call(r);return e===ge.OPEN?s:e};i.readyStateHook?i.readyStateHook(r,a):Object.defineProperty(r,"readyState",{get:a,configurable:!0,enumerable:!0});let o=()=>{if(a()===ge.CONNECTING)return new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.")};i.sendErrorHook?i.sendErrorHook(r,o):r.send=function(...e){let t=o();if(t)throw t;ge.prototype.send.call(this,...e)},i.urlHook?i.urlHook(r,e):Object.defineProperty(r,"url",{get:()=>e.toString(),configurable:!0,enumerable:!0});let c=()=>n;return i.protocolHook?i.protocolHook(r,c):Object.defineProperty(r,"protocol",{get:c,configurable:!0,enumerable:!0}),r}async fetch(e,t){let i=ks(e)?new us(e,t):e,r=t?.headers||i.headers,n=r instanceof Headers?Object.fromEntries(r):r,s=t?.duplex,a=t?.body||i.body,o=new URL(i.url),c=await this.demand();for(let e=0;;e++){"host"in n?n.host=o.host:n.Host=o.host;let r=await c.request(i.method,n,a,o,i.cache,s,i.signal);r.finalURL=o.toString();let l=t?.redirect||i.redirect;if(!ps.includes(r.status))return r;switch(l){case"follow":{let t=r.headers.get("location");if(ls>e&&null!==t){o=new URL(t,o);continue}throw TypeError("Failed to fetch")}case"error":throw TypeError("Failed to fetch");case"manual":return r}}}};function ks(e){return"string"==typeof e||e instanceof URL}async function wn(e,t){let i=await bn(e,t);return new De(e,i)}var Hs=Qe(vn(),1),Nn=Qe(En(),1),{stringify:Os}=JSON;if(!String.prototype.repeat)throw Error("String.prototype.repeat is undefined, see https://github.com/davidbonnet/astring#installation");if(!String.prototype.endsWith)throw Error("String.prototype.endsWith is undefined, see https://github.com/davidbonnet/astring#installation");var ht={"||":2,"??":3,"&&":4,"|":5,"^":6,"&":7,"==":8,"!=":8,"===":8,"!==":8,"<":9,">":9,"<=":9,">=":9,in:9,instanceof:9,"<<":10,">>":10,">>>":10,"+":11,"-":11,"*":12,"%":12,"/":12,"**":13},ee=17,Vs={ArrayExpression:20,TaggedTemplateExpression:20,ThisExpression:20,Identifier:20,PrivateIdentifier:20,Literal:18,TemplateLiteral:20,Super:20,SequenceExpression:20,MemberExpression:19,ChainExpression:19,CallExpression:19,NewExpression:19,ArrowFunctionExpression:ee,ClassExpression:ee,FunctionExpression:ee,ObjectExpression:ee,UpdateExpression:16,UnaryExpression:15,AwaitExpression:15,BinaryExpression:14,LogicalExpression:13,ConditionalExpression:4,AssignmentExpression:3,YieldExpression:2,RestElement:1};function Ce(e,t){let{generator:i}=e;if(e.write("("),null!=t&&t.length>0){i[t[0].type](t[0],e);let{length:r}=t;for(let n=1;n0){e.write(r);for(let t=1;t0){i.VariableDeclarator(r[0],e);for(let t=1;t0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let{length:o}=a;for(let e=0;e0){for(;n0&&t.write(", ");let e=i[n],r=e.type[6];if("D"===r)t.write(e.local.name,e),n++;else{if("N"!==r)break;t.write("* as "+e.local.name,e),n++}}if(n0)for(let e=0;;){let n=i[e],{name:s}=n.local;if(t.write(s,n),s!==n.exported.name&&t.write(" as "+n.exported.name),!(++e "),"O"===e.body.type[0]?(t.write("("),this.ObjectExpression(e.body,t),t.write(")")):this[e.body.type](e.body,t)},ThisExpression(e,t){t.write("this",e)},Super(e,t){t.write("super",e)},RestElement:An=function(e,t){t.write("..."),this[e.argument.type](e.argument,t)},SpreadElement:An,YieldExpression(e,t){t.write(e.delegate?"yield*":"yield"),e.argument&&(t.write(" "),this[e.argument.type](e.argument,t))},AwaitExpression(e,t){t.write("await ",e),pt(t,e.argument,e)},TemplateLiteral(e,t){let{quasis:i,expressions:r}=e;t.write("`");let{length:n}=r;for(let e=0;e0){let{elements:i}=e,{length:r}=i;for(let e=0;;){let n=i[e];if(null!=n&&this[n.type](n,t),!(++e0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let a=","+r,{properties:o}=e,{length:c}=o;for(let e=0;;){let i=o[e];if(n&&null!=i.comments&&j(t,i.comments,s,r),t.write(s),this[i.type](i,t),!(++e0){let{properties:i}=e,{length:r}=i;for(let e=0;this[i[e].type](i[e],t),++e1||"U"===n[0]&&("n"===n[1]||"p"===n[1])&&r.prefix&&r.operator[0]===i&&("+"===i||"-"===i))&&t.write(" "),s?(t.write(i.length>1?" (":"("),this[n](r,t),t.write(")")):this[n](r,t)}else this[e.argument.type](e.argument,t),t.write(e.operator)},UpdateExpression(e,t){e.prefix?(t.write(e.operator),this[e.argument.type](e.argument,t)):(this[e.argument.type](e.argument,t),t.write(e.operator))},AssignmentExpression(e,t){this[e.left.type](e.left,t),t.write(" "+e.operator+" "),this[e.right.type](e.right,t)},AssignmentPattern(e,t){this[e.left.type](e.left,t),t.write(" = "),this[e.right.type](e.right,t)},BinaryExpression:Ln=(e,t)=>{let i="in"===e.operator;i&&t.write("("),pt(t,e.left,e,!1),t.write(" "+e.operator+" "),pt(t,e.right,e,!0),i&&t.write(")")},LogicalExpression:Ln,ConditionalExpression(e,t){let{test:i}=e,r=t.expressionsPrecedence[i.type];r===ee||r<=t.expressionsPrecedence.ConditionalExpression?(t.write("("),this[i.type](i,t),t.write(")")):this[i.type](i,t),t.write(" ? "),this[e.consequent.type](e.consequent,t),t.write(" : "),this[e.alternate.type](e.alternate,t)},NewExpression(e,t){t.write("new ");let i=t.expressionsPrecedence[e.callee.type];i===ee||i0&&(this.lineEndSize>0&&(1===r.length?e[i-1]===r:e.endsWith(r))?(this.line+=this.lineEndSize,this.column=0):this.column+=i)}toString(){return this.output}};function Tn(e,t){let i=new li(t);return i.generator[e.type](e,i),i.output}var hi,Mn=class{constructor(e){this.mime=br,this.idb=Je,this.path=Us,this.acorn={parse:dn},this.bare={createBareClient:wn,BareClient:De},this.base64={encode:btoa,decode:atob},this.estree={generate:Tn},this.cookie=Hs,this.setCookieParser=Nn.parse,this.ctx=e}};function pi(e,t,i,r,n="",s=!1,a=""){if(self.__dynamic$config)var o="development"==self.__dynamic$config.mode;else o=!1;if(s){var c=[{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:e+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]},{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:t+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]}];return this.ctx.config.assets.files.inject&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:this.ctx.config.assets.files.inject+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]}),r&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(`self.__dynamic$cookies = atob("${btoa(r)}");document.currentScript?.remove();`)}]}),n&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(n+";document.currentScript?.remove();")}]}),a&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(a+";document.currentScript?.remove();")}]}),c}var l=[` @@ -80,4 +80,4 @@ - \ No newline at end of file + From 699c123e22e7124e1f506a05914bfae004e72f2a Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 26 Aug 2026 01:54:37 -0400 Subject: [PATCH 076/115] fix(dynamic): improve perfomance and fix loading issues --- build.js | 20 +++++++++++++++++++- static/assets/dynamic/dynamic.client.js | 2 +- static/assets/dynamic/dynamic.handler.js | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/build.js b/build.js index 3dd26f3f13..c726f86c90 100644 --- a/build.js +++ b/build.js @@ -32,7 +32,22 @@ const KEEP_IN_PLACE = new Set(); // scramjet.*: already-built vendor bundles. // sj-tp.js / ultraviolet.config.js: hold codec functions the proxies eval in another // realm, where the obfuscator's string-array helpers do not exist. -const SKIP_OBFUSCATE = new Set(["scramjet.all.js", "scramjet.sync.js", "sj-tp.js", "ultraviolet.config.js"]); +const SKIP_OBFUSCATE = new Set([ + "scramjet.all.js", + "scramjet.sync.js", + "sj-tp.js", + "ultraviolet.config.js", + // Dynamic's rewriter (acorn parser + AST transform + codegen) runs in the service + // worker for every proxied JS file. Obfuscating it multiplies that cost per request, + // same reason scramjet.* is skipped above. + "dynamic.worker.js", + "dynamic.client.js", + "dynamic.handler.js", + "dynamic.html.js", + // Ultraviolet's bundle is the largest emitted file when obfuscated + // (784 KB -> 4.2 MB) and the service worker imports it on every load. + "ultraviolet.bundle.js", +]); const OLD_DYNAMIC_PREFIX = "/assets/dynamic/"; const OLD_UV_PREFIX = "/assets/ultraviolet/"; @@ -361,6 +376,7 @@ function patchOrFail(content, pattern, replacement, label, required = true) { const FIX2_GUARD = `("PropertyDefinition"!=t.type||t.key!=e||t.computed)`; const FIX3_GUARD = `"MetaProperty"==e.object.type`; const FIX4_GUARD = `"null"===e.origin?e.href:`; +const FIX5_GUARD = `m.set(i,v.bind(e))`; const LOCAL_PATCH_ASSERTIONS = { "dynamic.worker.js": [ ["Fix 1 html module filename", `[["html","dynamic.html.js"]]`, 1], @@ -369,11 +385,13 @@ const LOCAL_PATCH_ASSERTIONS = { ["Fix 4 opaque-origin guard", FIX4_GUARD, 1], ], "dynamic.client.js": [ + ["Fix 5 proxy bind", FIX5_GUARD, 1], ["Fix 2 PropertyDefinition.key guard", FIX2_GUARD, 1], ["Fix 3 import.meta.url base", FIX3_GUARD, 1], ["Fix 4 opaque-origin guard", FIX4_GUARD, 1], ], "dynamic.handler.js": [ + ["Fix 5 proxy bind", FIX5_GUARD, 1], ["Fix 2 PropertyDefinition.key guard", FIX2_GUARD, 1], ["Fix 3 import.meta.url base", FIX3_GUARD, 1], ["Fix 4 opaque-origin guard", FIX4_GUARD, 1], diff --git a/static/assets/dynamic/dynamic.client.js b/static/assets/dynamic/dynamic.client.js index e1f4435f93..2444031127 100644 --- a/static/assets/dynamic/dynamic.client.js +++ b/static/assets/dynamic/dynamic.client.js @@ -1,4 +1,4 @@ -(()=>{var aa=Object.create,Xe=Object.defineProperty,sa=Object.getOwnPropertyDescriptor,oa=Object.getOwnPropertyNames,ca=Object.getPrototypeOf,ua=Object.prototype.hasOwnProperty,la=(e,t,i)=>t in e?Xe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i,Tt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),dr=(e,t)=>{for(var i in t)Xe(e,i,{get:t[i],enumerable:!0})},ha=(e,t,i,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let n of oa(t))ua.call(e,n)||n===i||Xe(e,n,{get:()=>t[n],enumerable:!(r=sa(t,n))||r.enumerable});return e},Qe=(e,t,i)=>(i=null!=e?aa(ca(e)):{},ha(!t&&e&&e.__esModule?i:Xe(i,"default",{value:e,enumerable:!0}),e)),q=(e,t,i)=>(la(e,"symbol"!=typeof t?t+"":t,i),i),Nt=Tt((e,t)=>{function i(e){if("string"!=typeof e)throw TypeError("Path must be a string. Received "+JSON.stringify(e))}function r(e,t){for(var i,r="",n=0,s=-1,a=0,o=0;o<=e.length;++o){if(o2){var c=r.lastIndexOf("/");if(c!==r.length-1){-1===c?(r="",n=0):n=(r=r.slice(0,c)).length-1-r.lastIndexOf("/"),s=o,a=0;continue}}else if(2===r.length||1===r.length){r="",n=0,s=o,a=0;continue}t&&(r.length>0?r+="/..":r="..",n=2)}else r.length>0?r+="/"+e.slice(s+1,o):r=e.slice(s+1,o),n=o-s-1;s=o,a=0}else 46===i&&-1!==a?++a:a=-1}return r}var n={resolve(){for(var e,t,n="",s=!1,a=arguments.length-1;a>=-1&&!s;a--)a>=0?e=arguments[a]:(void 0===t&&(t=process.cwd()),e=t),i(e),0!==e.length&&(n=e+"/"+n,s=47===e.charCodeAt(0));return n=r(n,!s),s?n.length>0?"/"+n:"/":n.length>0?n:"."},normalize(e){if(i(e),0===e.length)return".";var t=47===e.charCodeAt(0),n=47===e.charCodeAt(e.length-1);return 0!==(e=r(e,!t)).length||t||(e="."),e.length>0&&n&&(e+="/"),t?"/"+e:e},isAbsolute:e=>(i(e),e.length>0&&47===e.charCodeAt(0)),join(){if(0===arguments.length)return".";for(var e,t=0;t0&&(void 0===e?e=r:e+="/"+r)}return void 0===e?".":n.normalize(e)},relative(e,t){if(i(e),i(t),e===t||(e=n.resolve(e))===(t=n.resolve(t)))return"";for(var r=1;rl){if(47===t.charCodeAt(o+h))return t.slice(o+h+1);if(0===h)return t.slice(o+h)}else a>l&&(47===e.charCodeAt(r+h)?p=h:0===h&&(p=0));break}var u=e.charCodeAt(r+h);if(u!==t.charCodeAt(o+h))break;47===u&&(p=h)}var d="";for(h=r+p+1;h<=s;++h)(h===s||47===e.charCodeAt(h))&&(0===d.length?d+="..":d+="/..");return d.length>0?d+t.slice(o+p):(o+=p,47===t.charCodeAt(o)&&++o,t.slice(o))},_makeLong:e=>e,dirname(e){if(i(e),0===e.length)return".";for(var t=e.charCodeAt(0),r=47===t,n=-1,s=!0,a=e.length-1;a>=1;--a)if(47===(t=e.charCodeAt(a))){if(!s){n=a;break}}else s=!1;return-1===n?r?"/":".":r&&1===n?"//":e.slice(0,n)},basename(e,t){if(void 0!==t&&"string"!=typeof t)throw TypeError('"ext" argument must be a string');i(e);var r,n=0,s=-1,a=!0;if(void 0!==t&&t.length>0&&t.length<=e.length){if(t.length===e.length&&t===e)return"";var o=t.length-1,c=-1;for(r=e.length-1;r>=0;--r){var l=e.charCodeAt(r);if(47===l){if(!a){n=r+1;break}}else-1===c&&(a=!1,c=r+1),o>=0&&(l===t.charCodeAt(o)?-1==--o&&(s=r):(o=-1,s=c))}return n===s?s=c:-1===s&&(s=e.length),e.slice(n,s)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!a){n=r+1;break}}else-1===s&&(a=!1,s=r+1);return-1===s?"":e.slice(n,s)},extname(e){i(e);for(var t=-1,r=0,n=-1,s=!0,a=0,o=e.length-1;o>=0;--o){var c=e.charCodeAt(o);if(47!==c)-1===n&&(s=!1,n=o+1),46===c?-1===t?t=o:1!==a&&(a=1):-1!==t&&(a=-1);else if(!s){r=o+1;break}}return-1===t||-1===n||0===a||1===a&&t===n-1&&t===r+1?"":e.slice(t,n)},format(e){if(null===e||"object"!=typeof e)throw TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var i=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return i?i===t.root?i+r:i+e+r:r}("/",e)},parse(e){i(e);var t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;var r,n=e.charCodeAt(0),s=47===n;s?(t.root="/",r=1):r=0;for(var a=-1,o=0,c=-1,l=!0,p=e.length-1,h=0;p>=r;--p)if(47!==(n=e.charCodeAt(p)))-1===c&&(l=!1,c=p+1),46===n?-1===a?a=p:1!==h&&(h=1):-1!==a&&(h=-1);else if(!l){o=p+1;break}return-1===a||-1===c||0===h||1===h&&a===c-1&&a===o+1?-1!==c&&(t.base=t.name=0===o&&s?e.slice(1,c):e.slice(o,c)):(0===o&&s?(t.name=e.slice(1,a),t.base=e.slice(1,c)):(t.name=e.slice(o,a),t.base=e.slice(o,c)),t.ext=e.slice(a,c)),o>0?t.dir=e.slice(0,o-1):s&&(t.dir="/"),t},sep:"/",delimiter:":",win32:null,posix:null};n.posix=n,t.exports=n}),vn=Tt(e=>{e.parse=function(e,t){if("string"!=typeof e)throw TypeError("argument str must be a string");for(var i={},n=(t||{}).decode||r,s=0;s{var i={decodeValues:!0,map:!1,silent:!1};function r(e){return"string"==typeof e&&!!e.trim()}function n(e,t){var n=e.split(";").filter(r),s=function(e){var t="",i="",r=e.split("=");return r.length>1?(t=r.shift(),i=r.join("=")):i=e,{name:t,value:i}}(n.shift()),a=s.name,o=s.value;t=t?Object.assign({},i,t):i;try{o=t.decodeValues?decodeURIComponent(o):o}catch(e){console.error("set-cookie-parser encountered an error while decoding a cookie with value '"+o+"'. Set options.decodeValues to false to disable this feature.",e)}var c={name:a,value:o};return n.forEach(e=>{var t=e.split("="),i=t.shift().trimLeft().toLowerCase(),r=t.join("=");"expires"===i?c.expires=new Date(r):"max-age"===i?c.maxAge=Number.parseInt(r,10):"secure"===i?c.secure=!0:"httponly"===i?c.httpOnly=!0:"samesite"===i?c.sameSite=r:c[i]=r}),c}function s(e,t){if(t=t?Object.assign({},i,t):i,!e)return t.map?{}:[];if(e.headers)if("function"==typeof e.headers.getSetCookie)e=e.headers.getSetCookie();else if(e.headers["set-cookie"])e=e.headers["set-cookie"];else{var s=e.headers[Object.keys(e.headers).find(e=>"set-cookie"===e.toLowerCase())];s||!e.headers.cookie||t.silent||console.warn("Warning: set-cookie-parser appears to have been called on a request object. It is designed to parse Set-Cookie headers from responses, not Cookie headers from requests. Set the option {silent: true} to suppress this warning."),e=s}return Array.isArray(e)||(e=[e]),(t=t?Object.assign({},i,t):i).map?e.filter(r).reduce((e,i)=>{var r=n(i,t);return e[r.name]=r,e},{}):e.filter(r).map(e=>n(e,t))}t.exports=s,t.exports.parse=s,t.exports.parseString=n,t.exports.splitCookiesString=function(e){if(Array.isArray(e))return e;if("string"!=typeof e)return[];var t,i,r,n,s,a=[],o=0;function c(){for(;o=e.length)&&a.push(e.substring(t,e.length))}return a}}),xr=Qe(Nt()),Ye={"application/ecmascript":{source:"apache",compressible:!0,extensions:["ecma"]},"application/gzip":{source:"iana",compressible:!1,extensions:["gz"]},"application/http":{source:"iana"},"application/javascript":{source:"apache",charset:"UTF-8",compressible:!0,extensions:["js"]},"application/json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["json","map"]},"application/manifest+json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["webmanifest"]},"application/marc":{source:"iana",extensions:["mrc"]},"application/mp4":{source:"iana",extensions:["mp4","mpg4","mp4s","m4p"]},"application/ogg":{source:"iana",compressible:!1,extensions:["ogx"]},"application/sql":{source:"iana",extensions:["sql"]},"application/wasm":{source:"iana",compressible:!0,extensions:["wasm"]},"application/x-bittorrent":{source:"apache",extensions:["torrent"]},"application/x-gzip":{source:"apache"},"application/x-javascript":{compressible:!0},"application/x-web-app-manifest+json":{compressible:!0,extensions:["webapp"]},"application/x-www-form-urlencoded":{source:"iana",compressible:!0},"application/xhtml+xml":{source:"iana",compressible:!0,extensions:["xhtml","xht"]},"application/xhtml-voice+xml":{source:"apache",compressible:!0},"application/xml":{source:"iana",compressible:!0,extensions:["xml","xsl","xsd","rng"]},"application/zip":{source:"iana",compressible:!1,extensions:["zip"]},"application/zlib":{source:"iana"},"audio/midi":{source:"apache",extensions:["mid","midi","kar","rmi"]},"audio/mp3":{compressible:!1,extensions:["mp3"]},"audio/mp4":{source:"iana",compressible:!1,extensions:["m4a","mp4a"]},"audio/mp4a-latm":{source:"iana"},"audio/mpa":{source:"iana"},"audio/mpa-robust":{source:"iana"},"audio/mpeg":{source:"iana",compressible:!1,extensions:["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/ogg":{source:"iana",compressible:!1,extensions:["oga","ogg","spx","opus"]},"audio/red":{source:"iana"},"audio/rtx":{source:"iana"},"audio/scip":{source:"iana"},"audio/silk":{source:"apache",extensions:["sil"]},"audio/smv":{source:"iana"},"audio/wav":{compressible:!1,extensions:["wav"]},"audio/wave":{compressible:!1,extensions:["wav"]},"audio/webm":{source:"apache",compressible:!1,extensions:["weba"]},"audio/x-aac":{source:"apache",compressible:!1,extensions:["aac"]},"audio/x-aiff":{source:"apache",extensions:["aif","aiff","aifc"]},"audio/x-caf":{source:"apache",compressible:!1,extensions:["caf"]},"audio/x-flac":{source:"apache",extensions:["flac"]},"audio/x-m4a":{source:"nginx",extensions:["m4a"]},"audio/x-matroska":{source:"apache",extensions:["mka"]},"audio/x-mpegurl":{source:"apache",extensions:["m3u"]},"audio/x-ms-wax":{source:"apache",extensions:["wax"]},"audio/x-ms-wma":{source:"apache",extensions:["wma"]},"audio/x-pn-realaudio":{source:"apache",extensions:["ram","ra"]},"audio/x-pn-realaudio-plugin":{source:"apache",extensions:["rmp"]},"audio/x-realaudio":{source:"nginx",extensions:["ra"]},"audio/x-tta":{source:"apache"},"audio/x-wav":{source:"apache",extensions:["wav"]},"audio/xm":{source:"apache",extensions:["xm"]},"font/collection":{source:"iana",extensions:["ttc"]},"font/otf":{source:"iana",compressible:!0,extensions:["otf"]},"font/sfnt":{source:"iana"},"font/ttf":{source:"iana",compressible:!0,extensions:["ttf"]},"font/woff":{source:"iana",extensions:["woff"]},"font/woff2":{source:"iana",extensions:["woff2"]},"image/gif":{source:"iana",compressible:!1,extensions:["gif"]},"image/heic":{source:"iana",extensions:["heic"]},"image/heic-sequence":{source:"iana",extensions:["heics"]},"image/heif":{source:"iana",extensions:["heif"]},"image/jpeg":{source:"iana",compressible:!1,extensions:["jpeg","jpg","jpe"]},"image/png":{source:"iana",compressible:!1,extensions:["png"]},"image/svg+xml":{source:"iana",compressible:!0,extensions:["svg","svgz"]},"image/webp":{source:"iana",extensions:["webp"]},"text/coffeescript":{extensions:["coffee","litcoffee"]},"text/css":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["css"]},"text/ecmascript":{source:"apache"},"text/html":{source:"iana",compressible:!0,extensions:["html","htm","shtml"]},"text/jade":{extensions:["jade"]},"text/javascript":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["js","mjs"]},"text/markdown":{source:"iana",compressible:!0,extensions:["md","markdown"]}},_r=/^\s*([^;\s]*)(?:;|\s|$)/,fa=/^text\//i,U={};function gr(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&Ye[t[1].toLowerCase()];return i&&i.charset?i.charset:!(!t||!fa.test(t[1]))&&"UTF-8"}function da(e){if(!e||"string"!=typeof e)return!1;var t=-1===e.indexOf("/")?U.lookup(e):e;if(!t)return!1;if(-1===t.indexOf("charset")){var i=U.charset(t);i&&(t+="; charset="+i.toLowerCase())}return t}function ma(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&U.extensions[t[1].toLowerCase()];return!(!i||!i.length)&&i[0]}function ya(e){if(!e||"string"!=typeof e)return!1;var t=(0,xr.extname)("x."+e).toLowerCase().substr(1);return t&&U.types[t]||!1}function ga(e,t){var i=["nginx","apache",void 0,"iana"];Object.keys(Ye).forEach(r=>{var n=Ye[r],s=n.extensions;if(s&&s.length){e[r]=s;for(var a=0;al||c===l&&"application/"===t[o].substr(0,12)))continue}t[o]=r}}})}U.charset=gr,U.charsets={lookup:gr},U.contentType=da,U.extension=ma,U.extensions=Object.create(null),U.lookup=ya,U.types=Object.create(null),ga(U.extensions,U.types);var br=U,Us=Qe(Nt(),1),Je={};dr(Je,{deleteDB:()=>Ca,openDB:()=>Bt,unwrap:()=>Le,wrap:()=>G});var wr,vr,xa=(e,t)=>t.some(t=>e instanceof t);function _a(){return wr||(wr=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function ba(){return vr||(vr=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var Sr=new WeakMap,Dt=new WeakMap,Er=new WeakMap,Mt=new WeakMap,Vt=new WeakMap;function wa(e){let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("success",n),e.removeEventListener("error",s)},n=()=>{t(G(e.result)),r()},s=()=>{i(e.error),r()};e.addEventListener("success",n),e.addEventListener("error",s)});return t.then(t=>{t instanceof IDBCursor&&Sr.set(t,e)}).catch(()=>{}),Vt.set(t,e),t}function va(e){if(Dt.has(e))return;let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("complete",n),e.removeEventListener("error",s),e.removeEventListener("abort",s)},n=()=>{t(),r()},s=()=>{i(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",n),e.addEventListener("error",s),e.addEventListener("abort",s)});Dt.set(e,t)}var Ot={get(e,t,i){if(e instanceof IDBTransaction){if("done"===t)return Dt.get(e);if("objectStoreNames"===t)return e.objectStoreNames||Er.get(e);if("store"===t)return i.objectStoreNames[1]?void 0:i.objectStore(i.objectStoreNames[0])}return G(e[t])},set:(e,t,i)=>(e[t]=i,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function Cr(e){Ot=e(Ot)}function Sa(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?ba().includes(e)?function(...t){return e.apply(Le(this),t),G(Sr.get(this))}:function(...t){return G(e.apply(Le(this),t))}:function(t,...i){let r=e.call(Le(this),t,...i);return Er.set(r,t.sort?t.sort():[t]),G(r)}}function Ea(e){return"function"==typeof e?Sa(e):(e instanceof IDBTransaction&&va(e),xa(e,_a())?new Proxy(e,Ot):e)}function G(e){if(e instanceof IDBRequest)return wa(e);if(Mt.has(e))return Mt.get(e);let t=Ea(e);return t!==e&&(Mt.set(e,t),Vt.set(t,e)),t}var Le=e=>Vt.get(e);function Bt(e,t,{blocked:i,upgrade:r,blocking:n,terminated:s}={}){let a=indexedDB.open(e,t),o=G(a);return r&&a.addEventListener("upgradeneeded",e=>{r(G(a.result),e.oldVersion,e.newVersion,G(a.transaction),e)}),i&&a.addEventListener("blocked",e=>i(e.oldVersion,e.newVersion,e)),o.then(e=>{s&&e.addEventListener("close",()=>s()),n&&e.addEventListener("versionchange",e=>n(e.oldVersion,e.newVersion,e))}).catch(()=>{}),o}function Ca(e,{blocked:t}={}){let i=indexedDB.deleteDatabase(e);return t&&i.addEventListener("blocked",e=>t(e.oldVersion,e)),G(i).then(()=>{})}var ka=["get","getKey","getAll","getAllKeys","count"],Aa=["put","add","delete","clear"],Ft=new Map;function kr(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(Ft.get(t))return Ft.get(t);let i=t.replace(/FromIndex$/,""),r=t!==i,n=Aa.includes(i);if(!(i in(r?IDBIndex:IDBObjectStore).prototype)||!n&&!ka.includes(i))return;let s=async function(e,...t){let s=this.transaction(e,n?"readwrite":"readonly"),a=s.store;return r&&(a=a.index(t.shift())),(await Promise.all([a[i](...t),n&&s.done]))[0]};return Ft.set(t,s),s}Cr(e=>({...e,get:(t,i,r)=>kr(t,i)||e.get(t,i,r),has:(t,i)=>!!kr(t,i)||e.has(t,i)}));var La=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,81,2,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,10,1,2,0,49,6,4,4,14,9,5351,0,7,14,13835,9,87,9,39,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,4706,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,983,6,110,6,6,9,4759,9,787719,239],Ir=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,68,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,4026,582,8634,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8936,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,757,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4153,7,221,3,5761,15,7472,3104,541,1507,4938,6,4191],Pa="‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-ᫎᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_",Tr="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꟊꟐꟑꟓꟕ-ꟙꟲ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",$t={3:"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",5:"class enum extends super const export import",6:"enum",strict:"implements interface let package private protected public static yield",strictBind:"eval arguments"},jt="break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this",Ra={5:jt,"5module":jt+" export import",6:jt+" const class extends export import super"},Ia=/^in(stanceof)?$/,Ta=RegExp("["+Tr+"]"),Na=RegExp("["+Tr+Pa+"]");function Ht(e,t){for(var i=65536,r=0;re);r+=2)if((i+=t[r+1])>=e)return!0;return!1}function ce(e,t){return e<65?36===e:e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Ta.test(String.fromCharCode(e)):!1!==t&&Ht(e,Ir)))}function be(e,t){return e<48?36===e:e<58||!(e<65)&&(e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Na.test(String.fromCharCode(e)):!1!==t&&(Ht(e,Ir)||Ht(e,La)))))}var L=function(e,t){void 0===t&&(t={}),this.label=e,this.keyword=t.keyword,this.beforeExpr=!!t.beforeExpr,this.startsExpr=!!t.startsExpr,this.isLoop=!!t.isLoop,this.isAssign=!!t.isAssign,this.prefix=!!t.prefix,this.postfix=!!t.postfix,this.binop=t.binop||null,this.updateContext=null};function z(e,t){return new L(e,{beforeExpr:!0,binop:t})}var K={beforeExpr:!0},H={startsExpr:!0},Gt={};function k(e,t){return void 0===t&&(t={}),t.keyword=e,Gt[e]=new L(e,t)}var u={num:new L("num",H),regexp:new L("regexp",H),string:new L("string",H),name:new L("name",H),privateId:new L("privateId",H),eof:new L("eof"),bracketL:new L("[",{beforeExpr:!0,startsExpr:!0}),bracketR:new L("]"),braceL:new L("{",{beforeExpr:!0,startsExpr:!0}),braceR:new L("}"),parenL:new L("(",{beforeExpr:!0,startsExpr:!0}),parenR:new L(")"),comma:new L(",",K),semi:new L(";",K),colon:new L(":",K),dot:new L("."),question:new L("?",K),questionDot:new L("?."),arrow:new L("=>",K),template:new L("template"),invalidTemplate:new L("invalidTemplate"),ellipsis:new L("...",K),backQuote:new L("`",H),dollarBraceL:new L("${",{beforeExpr:!0,startsExpr:!0}),eq:new L("=",{beforeExpr:!0,isAssign:!0}),assign:new L("_=",{beforeExpr:!0,isAssign:!0}),incDec:new L("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new L("!/~",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:z("||",1),logicalAND:z("&&",2),bitwiseOR:z("|",3),bitwiseXOR:z("^",4),bitwiseAND:z("&",5),equality:z("==/!=/===/!==",6),relational:z("/<=/>=",7),bitShift:z("<>/>>>",8),plusMin:new L("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:z("%",10),star:z("*",10),slash:z("/",10),starstar:new L("**",{beforeExpr:!0}),coalesce:z("??",1),_break:k("break"),_case:k("case",K),_catch:k("catch"),_continue:k("continue"),_debugger:k("debugger"),_default:k("default",K),_do:k("do",{isLoop:!0,beforeExpr:!0}),_else:k("else",K),_finally:k("finally"),_for:k("for",{isLoop:!0}),_function:k("function",H),_if:k("if"),_return:k("return",K),_switch:k("switch"),_throw:k("throw",K),_try:k("try"),_var:k("var"),_const:k("const"),_while:k("while",{isLoop:!0}),_with:k("with"),_new:k("new",{beforeExpr:!0,startsExpr:!0}),_this:k("this",H),_super:k("super",H),_class:k("class",H),_extends:k("extends",K),_export:k("export"),_import:k("import",H),_null:k("null",H),_true:k("true",H),_false:k("false",H),_in:k("in",{beforeExpr:!0,binop:7}),_instanceof:k("instanceof",{beforeExpr:!0,binop:7}),_typeof:k("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:k("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:k("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},Y=/\r\n?|\n|\u2028|\u2029/,Ma=RegExp(Y.source,"g");function we(e){return 10===e||13===e||8232===e||8233===e}function Nr(e,t,i){void 0===i&&(i=e.length);for(var r=t;rDa.call(e,t)),Ar=Array.isArray||(e=>"[object Array]"===Oa.call(e));function pe(e){return RegExp("^(?:"+e.replace(/ /g,"|")+")$")}function fe(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+((e-=65536)>>10),56320+(1023&e))}var Va=/(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/,Re=function(e,t){this.line=e,this.column=t};Re.prototype.offset=function(e){return new Re(this.line,this.column+e)};var rt=function(e,t,i){this.start=t,this.end=i,null!==e.sourceFile&&(this.source=e.sourceFile)};function Or(e,t){for(var i=1,r=0;;){var n=Nr(e,r,t);if(n<0)return new Re(i,t-r);++i,r=n}}var Wt={ecmaVersion:null,sourceType:"script",onInsertedSemicolon:null,onTrailingComma:null,allowReserved:null,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowAwaitOutsideFunction:null,allowSuperOutsideMethod:null,allowHashBang:!1,checkPrivateFields:!0,locations:!1,onToken:null,onComment:null,ranges:!1,program:null,sourceFile:null,directSourceFile:null,preserveParens:!1},Lr=!1;function Fa(e){var t={};for(var i in Wt)t[i]=e&&Te(e,i)?e[i]:Wt[i];if("latest"===t.ecmaVersion?t.ecmaVersion=1e8:null==t.ecmaVersion?(!Lr&&"object"==typeof console&&console.warn&&(Lr=!0,console.warn("Since Acorn 8.0.0, options.ecmaVersion is required.\nDefaulting to 2020, but this will stop working in the future.")),t.ecmaVersion=11):t.ecmaVersion>=2015&&(t.ecmaVersion-=2009),null==t.allowReserved&&(t.allowReserved=t.ecmaVersion<5),e&&null!=e.allowHashBang||(t.allowHashBang=t.ecmaVersion>=14),Ar(t.onToken)){var r=t.onToken;t.onToken=e=>r.push(e)}return Ar(t.onComment)&&(t.onComment=Ba(t,t.onComment)),t}function Ba(e,t){return function(i,r,n,s,a,o){var c={type:i?"Block":"Line",value:r,start:n,end:s};e.locations&&(c.loc=new rt(this,a,o)),e.ranges&&(c.range=[n,s]),t.push(c)}}var Ie=1,ve=2,zt=4,Vr=8,Fr=16,Br=32,Kt=64,$r=128,Ne=256,Xt=Ie|ve|Ne;function Qt(e,t){return ve|(e?zt:0)|(t?Vr:0)}var et=0,Yt=1,le=2,jr=3,Ur=4,Hr=5,T=function(e,t,i){this.options=e=Fa(e),this.sourceFile=e.sourceFile,this.keywords=pe(Ra[e.ecmaVersion>=6?6:"module"===e.sourceType?"5module":5]);var r="";!0!==e.allowReserved&&(r=$t[e.ecmaVersion>=6?6:5===e.ecmaVersion?5:3],"module"===e.sourceType&&(r+=" await")),this.reservedWords=pe(r);var n=(r?r+" ":"")+$t.strict;this.reservedWordsStrict=pe(n),this.reservedWordsStrictBind=pe(n+" "+$t.strictBind),this.input=String(t),this.containsEsc=!1,i?(this.pos=i,this.lineStart=this.input.lastIndexOf("\n",i-1)+1,this.curLine=this.input.slice(0,this.lineStart).split(Y).length):(this.pos=this.lineStart=0,this.curLine=1),this.type=u.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=this.initialContext(),this.exprAllowed=!0,this.inModule="module"===e.sourceType,this.strict=this.inModule||this.strictDirective(this.pos),this.potentialArrowAt=-1,this.potentialArrowInForAwait=!1,this.yieldPos=this.awaitPos=this.awaitIdentPos=0,this.labels=[],this.undefinedExports=Object.create(null),0===this.pos&&e.allowHashBang&&"#!"===this.input.slice(0,2)&&this.skipLineComment(2),this.scopeStack=[],this.enterScope(Ie),this.regexpState=null,this.privateNameStack=[]},ie={inFunction:{configurable:!0},inGenerator:{configurable:!0},inAsync:{configurable:!0},canAwait:{configurable:!0},allowSuper:{configurable:!0},allowDirectSuper:{configurable:!0},treatFunctionsAsVar:{configurable:!0},allowNewDotTarget:{configurable:!0},inClassStaticBlock:{configurable:!0}};T.prototype.parse=function(){var e=this.options.program||this.startNode();return this.nextToken(),this.parseTopLevel(e)},ie.inFunction.get=function(){return(this.currentVarScope().flags&ve)>0},ie.inGenerator.get=function(){return(this.currentVarScope().flags&Vr)>0&&!this.currentVarScope().inClassFieldInit},ie.inAsync.get=function(){return(this.currentVarScope().flags&zt)>0&&!this.currentVarScope().inClassFieldInit},ie.canAwait.get=function(){for(var e=this.scopeStack.length-1;e>=0;e--){var t=this.scopeStack[e];if(t.inClassFieldInit||t.flags&Ne)return!1;if(t.flags&ve)return(t.flags&zt)>0}return this.inModule&&this.options.ecmaVersion>=13||this.options.allowAwaitOutsideFunction},ie.allowSuper.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&Kt)>0||i||this.options.allowSuperOutsideMethod},ie.allowDirectSuper.get=function(){return(this.currentThisScope().flags&$r)>0},ie.treatFunctionsAsVar.get=function(){return this.treatFunctionsAsVarInScope(this.currentScope())},ie.allowNewDotTarget.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&(ve|Ne))>0||i},ie.inClassStaticBlock.get=function(){return(this.currentVarScope().flags&Ne)>0},T.extend=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var i=this,r=0;r=,?^&]/.test(n)||"!"===n&&"="===this.input.charAt(r+1))}e+=t[0].length,X.lastIndex=e,e+=X.exec(this.input)[0].length,";"===this.input[e]&&e++}},$.eat=function(e){return this.type===e&&(this.next(),!0)},$.isContextual=function(e){return this.type===u.name&&this.value===e&&!this.containsEsc},$.eatContextual=function(e){return!!this.isContextual(e)&&(this.next(),!0)},$.expectContextual=function(e){this.eatContextual(e)||this.unexpected()},$.canInsertSemicolon=function(){return this.type===u.eof||this.type===u.braceR||Y.test(this.input.slice(this.lastTokEnd,this.start))},$.insertSemicolon=function(){if(this.canInsertSemicolon())return this.options.onInsertedSemicolon&&this.options.onInsertedSemicolon(this.lastTokEnd,this.lastTokEndLoc),!0},$.semicolon=function(){this.eat(u.semi)||this.insertSemicolon()||this.unexpected()},$.afterTrailingComma=function(e,t){if(this.type===e)return this.options.onTrailingComma&&this.options.onTrailingComma(this.lastTokStart,this.lastTokStartLoc),t||this.next(),!0},$.expect=function(e){this.eat(e)||this.unexpected()},$.unexpected=function(e){this.raise(e??this.start,"Unexpected token")};var nt=function(){this.shorthandAssign=this.trailingComma=this.parenthesizedAssign=this.parenthesizedBind=this.doubleProto=-1};$.checkPatternErrors=function(e,t){if(e){e.trailingComma>-1&&this.raiseRecoverable(e.trailingComma,"Comma is not permitted after the rest element");var i=t?e.parenthesizedAssign:e.parenthesizedBind;i>-1&&this.raiseRecoverable(i,t?"Assigning to rvalue":"Parenthesized pattern")}},$.checkExpressionErrors=function(e,t){if(!e)return!1;var i=e.shorthandAssign,r=e.doubleProto;if(!t)return i>=0||r>=0;i>=0&&this.raise(i,"Shorthand property assignments are valid only in destructuring patterns"),r>=0&&this.raiseRecoverable(r,"Redefinition of __proto__ property")},$.checkYieldAwaitInDefaultParams=function(){this.yieldPos&&(!this.awaitPos||this.yieldPos55295&&r<56320)return!0;if(ce(r,!0)){for(var n=i+1;be(r=this.input.charCodeAt(n),!0);)++n;if(92===r||r>55295&&r<56320)return!0;var s=this.input.slice(i,n);if(!Ia.test(s))return!0}return!1},w.isAsyncFunction=function(){if(this.options.ecmaVersion<8||!this.isContextual("async"))return!1;X.lastIndex=this.pos;var e,t=X.exec(this.input),i=this.pos+t[0].length;return!(Y.test(this.input.slice(this.pos,i))||"function"!==this.input.slice(i,i+8)||i+8!==this.input.length&&(be(e=this.input.charCodeAt(i+8))||e>55295&&e<56320))},w.parseStatement=function(e,t,i){var r,n=this.type,s=this.startNode();switch(this.isLet(e)&&(n=u._var,r="let"),n){case u._break:case u._continue:return this.parseBreakContinueStatement(s,n.keyword);case u._debugger:return this.parseDebuggerStatement(s);case u._do:return this.parseDoStatement(s);case u._for:return this.parseForStatement(s);case u._function:return e&&(this.strict||"if"!==e&&"label"!==e)&&this.options.ecmaVersion>=6&&this.unexpected(),this.parseFunctionStatement(s,!1,!e);case u._class:return e&&this.unexpected(),this.parseClass(s,!0);case u._if:return this.parseIfStatement(s);case u._return:return this.parseReturnStatement(s);case u._switch:return this.parseSwitchStatement(s);case u._throw:return this.parseThrowStatement(s);case u._try:return this.parseTryStatement(s);case u._const:case u._var:return r=r||this.value,e&&"var"!==r&&this.unexpected(),this.parseVarStatement(s,r);case u._while:return this.parseWhileStatement(s);case u._with:return this.parseWithStatement(s);case u.braceL:return this.parseBlock(!0,s);case u.semi:return this.parseEmptyStatement(s);case u._export:case u._import:if(this.options.ecmaVersion>10&&n===u._import){X.lastIndex=this.pos;var a=X.exec(this.input),o=this.pos+a[0].length,c=this.input.charCodeAt(o);if(40===c||46===c)return this.parseExpressionStatement(s,this.parseExpression())}return this.options.allowImportExportEverywhere||(t||this.raise(this.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'")),n===u._import?this.parseImport(s):this.parseExport(s,i);default:if(this.isAsyncFunction())return e&&this.unexpected(),this.next(),this.parseFunctionStatement(s,!0,!e);var l=this.value,p=this.parseExpression();return n===u.name&&"Identifier"===p.type&&this.eat(u.colon)?this.parseLabeledStatement(s,l,p,e):this.parseExpressionStatement(s,p)}},w.parseBreakContinueStatement=function(e,t){var i="break"===t;this.next(),this.eat(u.semi)||this.insertSemicolon()?e.label=null:this.type!==u.name?this.unexpected():(e.label=this.parseIdent(),this.semicolon());for(var r=0;r=6?this.eat(u.semi):this.semicolon(),this.finishNode(e,"DoWhileStatement")},w.parseForStatement=function(e){this.next();var t=this.options.ecmaVersion>=9&&this.canAwait&&this.eatContextual("await")?this.lastTokStart:-1;if(this.labels.push(Jt),this.enterScope(0),this.expect(u.parenL),this.type===u.semi)return t>-1&&this.unexpected(t),this.parseFor(e,null);var i=this.isLet();if(this.type===u._var||this.type===u._const||i){var r=this.startNode(),n=i?"let":this.value;return this.next(),this.parseVar(r,!0,n),this.finishNode(r,"VariableDeclaration"),(this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of"))&&1===r.declarations.length?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),this.parseForIn(e,r)):(t>-1&&this.unexpected(t),this.parseFor(e,r))}var s=this.isContextual("let"),a=!1,o=new nt,c=this.parseExpression(!(t>-1)||"await",o);return this.type===u._in||(a=this.options.ecmaVersion>=6&&this.isContextual("of"))?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),s&&a&&this.raise(c.start,"The left-hand side of a for-of loop may not start with 'let'."),this.toAssignable(c,!1,o),this.checkLValPattern(c),this.parseForIn(e,c)):(this.checkExpressionErrors(o,!0),t>-1&&this.unexpected(t),this.parseFor(e,c))},w.parseFunctionStatement=function(e,t,i){return this.next(),this.parseFunction(e,Pe|(i?0:qt),!1,t)},w.parseIfStatement=function(e){return this.next(),e.test=this.parseParenExpression(),e.consequent=this.parseStatement("if"),e.alternate=this.eat(u._else)?this.parseStatement("if"):null,this.finishNode(e,"IfStatement")},w.parseReturnStatement=function(e){return this.inFunction||this.options.allowReturnOutsideFunction||this.raise(this.start,"'return' outside of function"),this.next(),this.eat(u.semi)||this.insertSemicolon()?e.argument=null:(e.argument=this.parseExpression(),this.semicolon()),this.finishNode(e,"ReturnStatement")},w.parseSwitchStatement=function(e){this.next(),e.discriminant=this.parseParenExpression(),e.cases=[],this.expect(u.braceL),this.labels.push(ja),this.enterScope(0);for(var t,i=!1;this.type!==u.braceR;)if(this.type===u._case||this.type===u._default){var r=this.type===u._case;t&&this.finishNode(t,"SwitchCase"),e.cases.push(t=this.startNode()),t.consequent=[],this.next(),r?t.test=this.parseExpression():(i&&this.raiseRecoverable(this.lastTokStart,"Multiple default clauses"),i=!0,t.test=null),this.expect(u.colon)}else t||this.unexpected(),t.consequent.push(this.parseStatement(null));return this.exitScope(),t&&this.finishNode(t,"SwitchCase"),this.next(),this.labels.pop(),this.finishNode(e,"SwitchStatement")},w.parseThrowStatement=function(e){return this.next(),Y.test(this.input.slice(this.lastTokEnd,this.start))&&this.raise(this.lastTokEnd,"Illegal newline after throw"),e.argument=this.parseExpression(),this.semicolon(),this.finishNode(e,"ThrowStatement")};var Ua=[];w.parseCatchClauseParam=function(){var e=this.parseBindingAtom(),t="Identifier"===e.type;return this.enterScope(t?Br:0),this.checkLValPattern(e,t?Ur:le),this.expect(u.parenR),e},w.parseTryStatement=function(e){if(this.next(),e.block=this.parseBlock(),e.handler=null,this.type===u._catch){var t=this.startNode();this.next(),this.eat(u.parenL)?t.param=this.parseCatchClauseParam():(this.options.ecmaVersion<10&&this.unexpected(),t.param=null,this.enterScope(0)),t.body=this.parseBlock(!1),this.exitScope(),e.handler=this.finishNode(t,"CatchClause")}return e.finalizer=this.eat(u._finally)?this.parseBlock():null,e.handler||e.finalizer||this.raise(e.start,"Missing catch or finally clause"),this.finishNode(e,"TryStatement")},w.parseVarStatement=function(e,t,i){return this.next(),this.parseVar(e,!1,t,i),this.semicolon(),this.finishNode(e,"VariableDeclaration")},w.parseWhileStatement=function(e){return this.next(),e.test=this.parseParenExpression(),this.labels.push(Jt),e.body=this.parseStatement("while"),this.labels.pop(),this.finishNode(e,"WhileStatement")},w.parseWithStatement=function(e){return this.strict&&this.raise(this.start,"'with' in strict mode"),this.next(),e.object=this.parseParenExpression(),e.body=this.parseStatement("with"),this.finishNode(e,"WithStatement")},w.parseEmptyStatement=function(e){return this.next(),this.finishNode(e,"EmptyStatement")},w.parseLabeledStatement=function(e,t,i,r){for(var n=0,s=this.labels;n=0;o--){var c=this.labels[o];if(c.statementStart!==e.start)break;c.statementStart=this.start,c.kind=a}return this.labels.push({name:t,kind:a,statementStart:this.start}),e.body=this.parseStatement(r?-1===r.indexOf("label")?r+"label":r:"label"),this.labels.pop(),e.label=i,this.finishNode(e,"LabeledStatement")},w.parseExpressionStatement=function(e,t){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},w.parseBlock=function(e,t,i){for(void 0===e&&(e=!0),void 0===t&&(t=this.startNode()),t.body=[],this.expect(u.braceL),e&&this.enterScope(0);this.type!==u.braceR;){var r=this.parseStatement(null);t.body.push(r)}return i&&(this.strict=!1),this.next(),e&&this.exitScope(),this.finishNode(t,"BlockStatement")},w.parseFor=function(e,t){return e.init=t,this.expect(u.semi),e.test=this.type===u.semi?null:this.parseExpression(),this.expect(u.semi),e.update=this.type===u.parenR?null:this.parseExpression(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,"ForStatement")},w.parseForIn=function(e,t){var i=this.type===u._in;return this.next(),"VariableDeclaration"===t.type&&null!=t.declarations[0].init&&(!i||this.options.ecmaVersion<8||this.strict||"var"!==t.kind||"Identifier"!==t.declarations[0].id.type)&&this.raise(t.start,(i?"for-in":"for-of")+" loop variable declaration may not have an initializer"),e.left=t,e.right=i?this.parseExpression():this.parseMaybeAssign(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,i?"ForInStatement":"ForOfStatement")},w.parseVar=function(e,t,i,r){for(e.declarations=[],e.kind=i;;){var n=this.startNode();if(this.parseVarId(n,i),this.eat(u.eq)?n.init=this.parseMaybeAssign(t):r||"const"!==i||this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of")?r||"Identifier"===n.id.type||t&&(this.type===u._in||this.isContextual("of"))?n.init=null:this.raise(this.lastTokEnd,"Complex binding patterns require an initialization value"):this.unexpected(),e.declarations.push(this.finishNode(n,"VariableDeclarator")),!this.eat(u.comma))break}return e},w.parseVarId=function(e,t){e.id=this.parseBindingAtom(),this.checkLValPattern(e.id,"var"===t?Yt:le,!1)};var Pe=1,qt=2,Wr=4;function Ha(e,t){var i=t.key.name,r=e[i],n="true";return"MethodDefinition"===t.type&&("get"===t.kind||"set"===t.kind)&&(n=(t.static?"s":"i")+t.kind),"iget"===r&&"iset"===n||"iset"===r&&"iget"===n||"sget"===r&&"sset"===n||"sset"===r&&"sget"===n?(e[i]="true",!1):!!r||(e[i]=n,!1)}function tt(e,t){var i=e.computed,r=e.key;return!i&&("Identifier"===r.type&&r.name===t||"Literal"===r.type&&r.value===t)}w.parseFunction=function(e,t,i,r,n){this.initFunction(e),(this.options.ecmaVersion>=9||this.options.ecmaVersion>=6&&!r)&&(this.type===u.star&&t&qt&&this.unexpected(),e.generator=this.eat(u.star)),this.options.ecmaVersion>=8&&(e.async=!!r),t&Pe&&(e.id=t&Wr&&this.type!==u.name?null:this.parseIdent(),e.id&&!(t&qt)&&this.checkLValSimple(e.id,this.strict||e.generator||e.async?this.treatFunctionsAsVar?Yt:le:jr));var s=this.yieldPos,a=this.awaitPos,o=this.awaitIdentPos;return this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(e.async,e.generator)),t&Pe||(e.id=this.type===u.name?this.parseIdent():null),this.parseFunctionParams(e),this.parseFunctionBody(e,i,!1,n),this.yieldPos=s,this.awaitPos=a,this.awaitIdentPos=o,this.finishNode(e,t&Pe?"FunctionDeclaration":"FunctionExpression")},w.parseFunctionParams=function(e){this.expect(u.parenL),e.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams()},w.parseClass=function(e,t){this.next();var i=this.strict;this.strict=!0,this.parseClassId(e,t),this.parseClassSuper(e);var r=this.enterClassBody(),n=this.startNode(),s=!1;for(n.body=[],this.expect(u.braceL);this.type!==u.braceR;){var a=this.parseClassElement(null!==e.superClass);a&&(n.body.push(a),"MethodDefinition"===a.type&&"constructor"===a.kind?(s&&this.raiseRecoverable(a.start,"Duplicate constructor in the same class"),s=!0):a.key&&"PrivateIdentifier"===a.key.type&&Ha(r,a)&&this.raiseRecoverable(a.key.start,"Identifier '#"+a.key.name+"' has already been declared"))}return this.strict=i,this.next(),e.body=this.finishNode(n,"ClassBody"),this.exitClassBody(),this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},w.parseClassElement=function(e){if(this.eat(u.semi))return null;var t=this.options.ecmaVersion,i=this.startNode(),r="",n=!1,s=!1,a="method",o=!1;if(this.eatContextual("static")){if(t>=13&&this.eat(u.braceL))return this.parseClassStaticBlock(i),i;this.isClassElementNameStart()||this.type===u.star?o=!0:r="static"}if(i.static=o,!r&&t>=8&&this.eatContextual("async")&&(!this.isClassElementNameStart()&&this.type!==u.star||this.canInsertSemicolon()?r="async":s=!0),!r&&(t>=9||!s)&&this.eat(u.star)&&(n=!0),!r&&!s&&!n){var c=this.value;(this.eatContextual("get")||this.eatContextual("set"))&&(this.isClassElementNameStart()?a=c:r=c)}if(r?(i.computed=!1,i.key=this.startNodeAt(this.lastTokStart,this.lastTokStartLoc),i.key.name=r,this.finishNode(i.key,"Identifier")):this.parseClassElementName(i),t<13||this.type===u.parenL||"method"!==a||n||s){var l=!i.static&&tt(i,"constructor");l&&"method"!==a&&this.raise(i.key.start,"Constructor can't have get/set modifier"),i.kind=l?"constructor":a,this.parseClassMethod(i,n,s,l&&e)}else this.parseClassField(i);return i},w.isClassElementNameStart=function(){return this.type===u.name||this.type===u.privateId||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword},w.parseClassElementName=function(e){this.type===u.privateId?("constructor"===this.value&&this.raise(this.start,"Classes can't have an element named '#constructor'"),e.computed=!1,e.key=this.parsePrivateIdent()):this.parsePropertyName(e)},w.parseClassMethod=function(e,t,i,r){var n=e.key;"constructor"===e.kind?(t&&this.raise(n.start,"Constructor can't be a generator"),i&&this.raise(n.start,"Constructor can't be an async method")):e.static&&tt(e,"prototype")&&this.raise(n.start,"Classes may not have a static property named prototype");var s=e.value=this.parseMethod(t,i,r);return"get"===e.kind&&0!==s.params.length&&this.raiseRecoverable(s.start,"getter should have no params"),"set"===e.kind&&1!==s.params.length&&this.raiseRecoverable(s.start,"setter should have exactly one param"),"set"===e.kind&&"RestElement"===s.params[0].type&&this.raiseRecoverable(s.params[0].start,"Setter cannot use rest params"),this.finishNode(e,"MethodDefinition")},w.parseClassField=function(e){if(tt(e,"constructor")?this.raise(e.key.start,"Classes can't have a field named 'constructor'"):e.static&&tt(e,"prototype")&&this.raise(e.key.start,"Classes can't have a static field named 'prototype'"),this.eat(u.eq)){var t=this.currentThisScope(),i=t.inClassFieldInit;t.inClassFieldInit=!0,e.value=this.parseMaybeAssign(),t.inClassFieldInit=i}else e.value=null;return this.semicolon(),this.finishNode(e,"PropertyDefinition")},w.parseClassStaticBlock=function(e){e.body=[];var t=this.labels;for(this.labels=[],this.enterScope(Ne|Kt);this.type!==u.braceR;){var i=this.parseStatement(null);e.body.push(i)}return this.next(),this.exitScope(),this.labels=t,this.finishNode(e,"StaticBlock")},w.parseClassId=function(e,t){this.type===u.name?(e.id=this.parseIdent(),t&&this.checkLValSimple(e.id,le,!1)):(!0===t&&this.unexpected(),e.id=null)},w.parseClassSuper=function(e){e.superClass=this.eat(u._extends)?this.parseExprSubscripts(null,!1):null},w.enterClassBody=function(){var e={declared:Object.create(null),used:[]};return this.privateNameStack.push(e),e.declared},w.exitClassBody=function(){var e=this.privateNameStack.pop(),t=e.declared,i=e.used;if(this.options.checkPrivateFields)for(var r=this.privateNameStack.length,n=0===r?null:this.privateNameStack[r-1],s=0;s=11&&(this.eatContextual("as")?(e.exported=this.parseModuleExportName(),this.checkExport(t,e.exported,this.lastTokStart)):e.exported=null),this.expectContextual("from"),this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom(),this.semicolon(),this.finishNode(e,"ExportAllDeclaration")},w.parseExport=function(e,t){if(this.next(),this.eat(u.star))return this.parseExportAllDeclaration(e,t);if(this.eat(u._default))return this.checkExport(t,"default",this.lastTokStart),e.declaration=this.parseExportDefaultDeclaration(),this.finishNode(e,"ExportDefaultDeclaration");if(this.shouldParseExportStatement())e.declaration=this.parseExportDeclaration(e),"VariableDeclaration"===e.declaration.type?this.checkVariableExport(t,e.declaration.declarations):this.checkExport(t,e.declaration.id,e.declaration.id.start),e.specifiers=[],e.source=null;else{if(e.declaration=null,e.specifiers=this.parseExportSpecifiers(t),this.eatContextual("from"))this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom();else{for(var i=0,r=e.specifiers;i=13&&this.type===u.string){var e=this.parseLiteral(this.value);return Va.test(e.value)&&this.raise(e.start,"An export name cannot include a lone surrogate."),e}return this.parseIdent(!0)},w.adaptDirectivePrologue=function(e){for(var t=0;t=5&&"ExpressionStatement"===e.type&&"Literal"===e.expression.type&&"string"==typeof e.expression.value&&('"'===this.input[e.start]||"'"===this.input[e.start])};var J=T.prototype;J.toAssignable=function(e,t,i){if(this.options.ecmaVersion>=6&&e)switch(e.type){case"Identifier":this.inAsync&&"await"===e.name&&this.raise(e.start,"Cannot use 'await' as identifier inside an async function");break;case"ObjectPattern":case"ArrayPattern":case"AssignmentPattern":case"RestElement":break;case"ObjectExpression":e.type="ObjectPattern",i&&this.checkPatternErrors(i,!0);for(var r=0,n=e.properties;r=8&&!o&&"async"===c.name&&!this.canInsertSemicolon()&&this.eat(u._function))return this.overrideContext(R.f_expr),this.parseFunction(this.startNodeAt(s,a),0,!1,!0,t);if(n&&!this.canInsertSemicolon()){if(this.eat(u.arrow))return this.parseArrowExpression(this.startNodeAt(s,a),[c],!1,t);if(this.options.ecmaVersion>=8&&"async"===c.name&&this.type===u.name&&!o&&(!this.potentialArrowInForAwait||"of"!==this.value||this.containsEsc))return c=this.parseIdent(!1),(this.canInsertSemicolon()||!this.eat(u.arrow))&&this.unexpected(),this.parseArrowExpression(this.startNodeAt(s,a),[c],!0,t)}return c;case u.regexp:var l=this.value;return(r=this.parseLiteral(l.value)).regex={pattern:l.pattern,flags:l.flags},r;case u.num:case u.string:return this.parseLiteral(this.value);case u._null:case u._true:case u._false:return(r=this.startNode()).value=this.type===u._null?null:this.type===u._true,r.raw=this.type.keyword,this.next(),this.finishNode(r,"Literal");case u.parenL:var p=this.start,h=this.parseParenAndDistinguishExpression(n,t);return e&&(e.parenthesizedAssign<0&&!this.isSimpleAssignTarget(h)&&(e.parenthesizedAssign=p),e.parenthesizedBind<0&&(e.parenthesizedBind=p)),h;case u.bracketL:return r=this.startNode(),this.next(),r.elements=this.parseExprList(u.bracketR,!0,!0,e),this.finishNode(r,"ArrayExpression");case u.braceL:return this.overrideContext(R.b_expr),this.parseObj(!1,e);case u._function:return r=this.startNode(),this.next(),this.parseFunction(r,0);case u._class:return this.parseClass(this.startNode(),!1);case u._new:return this.parseNew();case u.backQuote:return this.parseTemplate();case u._import:return this.options.ecmaVersion>=11?this.parseExprImport(i):this.unexpected();default:return this.parseExprAtomDefault()}},v.parseExprAtomDefault=function(){this.unexpected()},v.parseExprImport=function(e){var t=this.startNode();this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword import");var i=this.parseIdent(!0);return this.type!==u.parenL||e?this.type===u.dot?(t.meta=i,this.parseImportMeta(t)):void this.unexpected():this.parseDynamicImport(t)},v.parseDynamicImport=function(e){if(this.next(),e.source=this.parseMaybeAssign(),!this.eat(u.parenR)){var t=this.start;this.eat(u.comma)&&this.eat(u.parenR)?this.raiseRecoverable(t,"Trailing comma is not allowed in import()"):this.unexpected(t)}return this.finishNode(e,"ImportExpression")},v.parseImportMeta=function(e){this.next();var t=this.containsEsc;return e.property=this.parseIdent(!0),"meta"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for import is 'import.meta'"),t&&this.raiseRecoverable(e.start,"'import.meta' must not contain escaped characters"),"module"===this.options.sourceType||this.options.allowImportExportEverywhere||this.raiseRecoverable(e.start,"Cannot use 'import.meta' outside a module"),this.finishNode(e,"MetaProperty")},v.parseLiteral=function(e){var t=this.startNode();return t.value=e,t.raw=this.input.slice(this.start,this.end),110===t.raw.charCodeAt(t.raw.length-1)&&(t.bigint=t.raw.slice(0,-1).replace(/_/g,"")),this.next(),this.finishNode(t,"Literal")},v.parseParenExpression=function(){this.expect(u.parenL);var e=this.parseExpression();return this.expect(u.parenR),e},v.shouldParseArrow=function(e){return!this.canInsertSemicolon()},v.parseParenAndDistinguishExpression=function(e,t){var i,r=this.start,n=this.startLoc,s=this.options.ecmaVersion>=8;if(this.options.ecmaVersion>=6){this.next();var a,o=this.start,c=this.startLoc,l=[],p=!0,h=!1,d=new nt,m=this.yieldPos,f=this.awaitPos;for(this.yieldPos=0,this.awaitPos=0;this.type!==u.parenR;){if(p?p=!1:this.expect(u.comma),s&&this.afterTrailingComma(u.parenR,!0)){h=!0;break}if(this.type===u.ellipsis){a=this.start,l.push(this.parseParenItem(this.parseRestBinding())),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element");break}l.push(this.parseMaybeAssign(!1,d,this.parseParenItem))}var y=this.lastTokEnd,g=this.lastTokEndLoc;if(this.expect(u.parenR),e&&this.shouldParseArrow(l)&&this.eat(u.arrow))return this.checkPatternErrors(d,!1),this.checkYieldAwaitInDefaultParams(),this.yieldPos=m,this.awaitPos=f,this.parseParenArrowList(r,n,l,t);(!l.length||h)&&this.unexpected(this.lastTokStart),a&&this.unexpected(a),this.checkExpressionErrors(d,!0),this.yieldPos=m||this.yieldPos,this.awaitPos=f||this.awaitPos,l.length>1?((i=this.startNodeAt(o,c)).expressions=l,this.finishNodeAt(i,"SequenceExpression",y,g)):i=l[0]}else i=this.parseParenExpression();if(!this.options.preserveParens)return i;var _=this.startNodeAt(r,n);return _.expression=i,this.finishNode(_,"ParenthesizedExpression")},v.parseParenItem=e=>e,v.parseParenArrowList=function(e,t,i,r){return this.parseArrowExpression(this.startNodeAt(e,t),i,!1,r)};var Wa=[];v.parseNew=function(){this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword new");var e=this.startNode(),t=this.parseIdent(!0);if(this.options.ecmaVersion>=6&&this.eat(u.dot)){e.meta=t;var i=this.containsEsc;return e.property=this.parseIdent(!0),"target"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for new is 'new.target'"),i&&this.raiseRecoverable(e.start,"'new.target' must not contain escaped characters"),this.allowNewDotTarget||this.raiseRecoverable(e.start,"'new.target' can only be used in functions and class static block"),this.finishNode(e,"MetaProperty")}var r=this.start,n=this.startLoc;return e.callee=this.parseSubscripts(this.parseExprAtom(null,!1,!0),r,n,!0,!1),this.eat(u.parenL)?e.arguments=this.parseExprList(u.parenR,this.options.ecmaVersion>=8,!1):e.arguments=Wa,this.finishNode(e,"NewExpression")},v.parseTemplateElement=function(e){var t=e.isTagged,i=this.startNode();return this.type===u.invalidTemplate?(t||this.raiseRecoverable(this.start,"Bad escape sequence in untagged template literal"),i.value={raw:this.value,cooked:null}):i.value={raw:this.input.slice(this.start,this.end).replace(/\r\n?/g,"\n"),cooked:this.value},this.next(),i.tail=this.type===u.backQuote,this.finishNode(i,"TemplateElement")},v.parseTemplate=function(e){void 0===e&&(e={});var t=e.isTagged;void 0===t&&(t=!1);var i=this.startNode();this.next(),i.expressions=[];var r=this.parseTemplateElement({isTagged:t});for(i.quasis=[r];!r.tail;)this.type===u.eof&&this.raise(this.pos,"Unterminated template literal"),this.expect(u.dollarBraceL),i.expressions.push(this.parseExpression()),this.expect(u.braceR),i.quasis.push(r=this.parseTemplateElement({isTagged:t}));return this.next(),this.finishNode(i,"TemplateLiteral")},v.isAsyncProp=function(e){return!e.computed&&"Identifier"===e.key.type&&"async"===e.key.name&&(this.type===u.name||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword||this.options.ecmaVersion>=9&&this.type===u.star)&&!Y.test(this.input.slice(this.lastTokEnd,this.start))},v.parseObj=function(e,t){var i=this.startNode(),r=!0,n={};for(i.properties=[],this.next();!this.eat(u.braceR);){if(r)r=!1;else if(this.expect(u.comma),this.options.ecmaVersion>=5&&this.afterTrailingComma(u.braceR))break;var s=this.parseProperty(e,t);e||this.checkPropClash(s,n,t),i.properties.push(s)}return this.finishNode(i,e?"ObjectPattern":"ObjectExpression")},v.parseProperty=function(e,t){var i,r,n,s,a=this.startNode();if(this.options.ecmaVersion>=9&&this.eat(u.ellipsis))return e?(a.argument=this.parseIdent(!1),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element"),this.finishNode(a,"RestElement")):(a.argument=this.parseMaybeAssign(!1,t),this.type===u.comma&&t&&t.trailingComma<0&&(t.trailingComma=this.start),this.finishNode(a,"SpreadElement"));this.options.ecmaVersion>=6&&(a.method=!1,a.shorthand=!1,(e||t)&&(n=this.start,s=this.startLoc),e||(i=this.eat(u.star)));var o=this.containsEsc;return this.parsePropertyName(a),!e&&!o&&this.options.ecmaVersion>=8&&!i&&this.isAsyncProp(a)?(r=!0,i=this.options.ecmaVersion>=9&&this.eat(u.star),this.parsePropertyName(a)):r=!1,this.parsePropertyValue(a,e,i,r,n,s,t,o),this.finishNode(a,"Property")},v.parseGetterSetter=function(e){e.kind=e.key.name,this.parsePropertyName(e),e.value=this.parseMethod(!1);var t="get"===e.kind?0:1;if(e.value.params.length!==t){var i=e.value.start;"get"===e.kind?this.raiseRecoverable(i,"getter should have no params"):this.raiseRecoverable(i,"setter should have exactly one param")}else"set"===e.kind&&"RestElement"===e.value.params[0].type&&this.raiseRecoverable(e.value.params[0].start,"Setter cannot use rest params")},v.parsePropertyValue=function(e,t,i,r,n,s,a,o){(i||r)&&this.type===u.colon&&this.unexpected(),this.eat(u.colon)?(e.value=t?this.parseMaybeDefault(this.start,this.startLoc):this.parseMaybeAssign(!1,a),e.kind="init"):this.options.ecmaVersion>=6&&this.type===u.parenL?(t&&this.unexpected(),e.kind="init",e.method=!0,e.value=this.parseMethod(i,r)):t||o||!(this.options.ecmaVersion>=5)||e.computed||"Identifier"!==e.key.type||"get"!==e.key.name&&"set"!==e.key.name||this.type===u.comma||this.type===u.braceR||this.type===u.eq?this.options.ecmaVersion>=6&&!e.computed&&"Identifier"===e.key.type?((i||r)&&this.unexpected(),this.checkUnreserved(e.key),"await"!==e.key.name||this.awaitIdentPos||(this.awaitIdentPos=n),e.kind="init",t?e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key)):this.type===u.eq&&a?(a.shorthandAssign<0&&(a.shorthandAssign=this.start),e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key))):e.value=this.copyNode(e.key),e.shorthand=!0):this.unexpected():((i||r)&&this.unexpected(),this.parseGetterSetter(e))},v.parsePropertyName=function(e){if(this.options.ecmaVersion>=6){if(this.eat(u.bracketL))return e.computed=!0,e.key=this.parseMaybeAssign(),this.expect(u.bracketR),e.key;e.computed=!1}return e.key=this.type===u.num||this.type===u.string?this.parseExprAtom():this.parseIdent("never"!==this.options.allowReserved)},v.initFunction=function(e){e.id=null,this.options.ecmaVersion>=6&&(e.generator=e.expression=!1),this.options.ecmaVersion>=8&&(e.async=!1)},v.parseMethod=function(e,t,i){var r=this.startNode(),n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.initFunction(r),this.options.ecmaVersion>=6&&(r.generator=e),this.options.ecmaVersion>=8&&(r.async=!!t),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(t,r.generator)|Kt|(i?$r:0)),this.expect(u.parenL),r.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams(),this.parseFunctionBody(r,!1,!0,!1),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(r,"FunctionExpression")},v.parseArrowExpression=function(e,t,i,r){var n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.enterScope(Qt(i,!1)|Fr),this.initFunction(e),this.options.ecmaVersion>=8&&(e.async=!!i),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,e.params=this.toAssignableList(t,!0),this.parseFunctionBody(e,!0,!1,r),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(e,"ArrowFunctionExpression")},v.parseFunctionBody=function(e,t,i,r){var n=t&&this.type!==u.braceL,s=this.strict,a=!1;if(n)e.body=this.parseMaybeAssign(r),e.expression=!0,this.checkParams(e,!1);else{var o=this.options.ecmaVersion>=7&&!this.isSimpleParamList(e.params);(!s||o)&&(a=this.strictDirective(this.end))&&o&&this.raiseRecoverable(e.start,"Illegal 'use strict' directive in function with non-simple parameter list");var c=this.labels;this.labels=[],a&&(this.strict=!0),this.checkParams(e,!s&&!a&&!t&&!i&&this.isSimpleParamList(e.params)),this.strict&&e.id&&this.checkLValSimple(e.id,Hr),e.body=this.parseBlock(!1,void 0,a&&!s),e.expression=!1,this.adaptDirectivePrologue(e.body.body),this.labels=c}this.exitScope()},v.isSimpleParamList=e=>{for(var t=0,i=e;t-1||n.functions.indexOf(e)>-1||n.var.indexOf(e)>-1,n.lexical.push(e),this.inModule&&n.flags&Ie&&delete this.undefinedExports[e]}else if(t===Ur)this.currentScope().lexical.push(e);else if(t===jr){var s=this.currentScope();r=this.treatFunctionsAsVar?s.lexical.indexOf(e)>-1:s.lexical.indexOf(e)>-1||s.var.indexOf(e)>-1,s.functions.push(e)}else for(var a=this.scopeStack.length-1;a>=0;--a){var o=this.scopeStack[a];if(o.lexical.indexOf(e)>-1&&!(o.flags&Br&&o.lexical[0]===e)||!this.treatFunctionsAsVarInScope(o)&&o.functions.indexOf(e)>-1){r=!0;break}if(o.var.push(e),this.inModule&&o.flags&Ie&&delete this.undefinedExports[e],o.flags&Xt)break}r&&this.raiseRecoverable(i,"Identifier '"+e+"' has already been declared")},de.checkLocalExport=function(e){-1===this.scopeStack[0].lexical.indexOf(e.name)&&-1===this.scopeStack[0].var.indexOf(e.name)&&(this.undefinedExports[e.name]=e)},de.currentScope=function(){return this.scopeStack[this.scopeStack.length-1]},de.currentVarScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt)return t}},de.currentThisScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt&&!(t.flags&Fr))return t}};var at=function(e,t,i){this.type="",this.start=t,this.end=0,e.options.locations&&(this.loc=new rt(e,i)),e.options.directSourceFile&&(this.sourceFile=e.options.directSourceFile),e.options.ranges&&(this.range=[t,0])},Me=T.prototype;function Gr(e,t,i,r){return e.type=t,e.end=i,this.options.locations&&(e.loc.end=r),this.options.ranges&&(e.range[1]=i),e}Me.startNode=function(){return new at(this,this.start,this.startLoc)},Me.startNodeAt=function(e,t){return new at(this,e,t)},Me.finishNode=function(e,t){return Gr.call(this,e,t,this.lastTokEnd,this.lastTokEndLoc)},Me.finishNodeAt=function(e,t,i,r){return Gr.call(this,e,t,i,r)},Me.copyNode=function(e){var t=new at(this,e.start,this.startLoc);for(var i in e)t[i]=e[i];return t};var Ka,zr="ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS",Kr=zr+" Extended_Pictographic",Xr=Kr,Qr=Xr+" EBase EComp EMod EPres ExtPict",Yr=Qr,Ga=Yr,za={9:zr,10:Kr,11:Xr,12:Qr,13:Yr,14:Ga},Xa={9:"",10:"",11:"",12:"",13:"",14:"Basic_Emoji Emoji_Keycap_Sequence RGI_Emoji_Modifier_Sequence RGI_Emoji_Flag_Sequence RGI_Emoji_Tag_Sequence RGI_Emoji_ZWJ_Sequence RGI_Emoji"},Pr="Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu",Jr="Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb",Zr=Jr+" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd",en=Zr+" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho",tn=en+" Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi",rn=tn+" Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith",Qa=rn+" Hrkt Katakana_Or_Hiragana Kawi Nag_Mundari Nagm Unknown Zzzz",Ya={9:Jr,10:Zr,11:en,12:tn,13:rn,14:Qa},nn={};function Ja(e){var t=nn[e]={binary:pe(za[e]+" "+Pr),binaryOfStrings:pe(Xa[e]),nonBinary:{General_Category:pe(Pr),Script:pe(Ya[e])}};t.nonBinary.Script_Extensions=t.nonBinary.Script,t.nonBinary.gc=t.nonBinary.General_Category,t.nonBinary.sc=t.nonBinary.Script,t.nonBinary.scx=t.nonBinary.Script_Extensions}for(Ze=0,Ut=[9,10,11,12,13,14];Ze=6?"uy":"")+(e.options.ecmaVersion>=9?"s":"")+(e.options.ecmaVersion>=13?"d":"")+(e.options.ecmaVersion>=15?"v":""),this.unicodeProperties=nn[e.options.ecmaVersion>=14?14:e.options.ecmaVersion],this.source="",this.flags="",this.start=0,this.switchU=!1,this.switchV=!1,this.switchN=!1,this.pos=0,this.lastIntValue=0,this.lastStringValue="",this.lastAssertionIsQuantifiable=!1,this.numCapturingParens=0,this.maxBackReference=0,this.groupNames=[],this.backReferenceNames=[]};function an(e){return 36===e||e>=40&&e<=43||46===e||63===e||e>=91&&e<=94||e>=123&&e<=125}function Za(e){return ce(e,!0)||36===e||95===e}function es(e){return be(e,!0)||36===e||95===e||8204===e||8205===e}function sn(e){return e>=65&&e<=90||e>=97&&e<=122}function ts(e){return e>=0&&e<=1114111}re.prototype.reset=function(e,t,i){var r=-1!==i.indexOf("v"),n=-1!==i.indexOf("u");this.start=0|e,this.source=t+"",this.flags=i,r&&this.parser.options.ecmaVersion>=15?(this.switchU=!0,this.switchV=!0,this.switchN=!0):(this.switchU=n&&this.parser.options.ecmaVersion>=6,this.switchV=!1,this.switchN=n&&this.parser.options.ecmaVersion>=9)},re.prototype.raise=function(e){this.parser.raiseRecoverable(this.start,"Invalid regular expression: /"+this.source+"/: "+e)},re.prototype.at=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return-1;var n=i.charCodeAt(e);if(!t&&!this.switchU||n<=55295||n>=57344||e+1>=r)return n;var s=i.charCodeAt(e+1);return s>=56320&&s<=57343?(n<<10)+s-56613888:n},re.prototype.nextIndex=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return r;var n,s=i.charCodeAt(e);return!t&&!this.switchU||s<=55295||s>=57344||e+1>=r||(n=i.charCodeAt(e+1))<56320||n>57343?e+1:e+2},re.prototype.current=function(e){return void 0===e&&(e=!1),this.at(this.pos,e)},re.prototype.lookahead=function(e){return void 0===e&&(e=!1),this.at(this.nextIndex(this.pos,e),e)},re.prototype.advance=function(e){void 0===e&&(e=!1),this.pos=this.nextIndex(this.pos,e)},re.prototype.eat=function(e,t){return void 0===t&&(t=!1),this.current(t)===e&&(this.advance(t),!0)},re.prototype.eatChars=function(e,t){void 0===t&&(t=!1);for(var i=this.pos,r=0,n=e;r-1&&this.raise(e.start,"Duplicate regular expression flag"),"u"===a&&(r=!0),"v"===a&&(n=!0)}this.options.ecmaVersion>=15&&r&&n&&this.raise(e.start,"Invalid regular expression flag")},b.validateRegExpPattern=function(e){this.regexp_pattern(e),!e.switchN&&this.options.ecmaVersion>=9&&e.groupNames.length>0&&(e.switchN=!0,this.regexp_pattern(e))},b.regexp_pattern=function(e){e.pos=0,e.lastIntValue=0,e.lastStringValue="",e.lastAssertionIsQuantifiable=!1,e.numCapturingParens=0,e.maxBackReference=0,e.groupNames.length=0,e.backReferenceNames.length=0,this.regexp_disjunction(e),e.pos!==e.source.length&&(e.eat(41)&&e.raise("Unmatched ')'"),(e.eat(93)||e.eat(125))&&e.raise("Lone quantifier brackets")),e.maxBackReference>e.numCapturingParens&&e.raise("Invalid escape");for(var t=0,i=e.backReferenceNames;t=9&&(i=e.eat(60)),e.eat(61)||e.eat(33))return this.regexp_disjunction(e),e.eat(41)||e.raise("Unterminated group"),e.lastAssertionIsQuantifiable=!i,!0}return e.pos=t,!1},b.regexp_eatQuantifier=function(e,t){return void 0===t&&(t=!1),!!this.regexp_eatQuantifierPrefix(e,t)&&(e.eat(63),!0)},b.regexp_eatQuantifierPrefix=function(e,t){return e.eat(42)||e.eat(43)||e.eat(63)||this.regexp_eatBracedQuantifier(e,t)},b.regexp_eatBracedQuantifier=function(e,t){var i=e.pos;if(e.eat(123)){var r=0,n=-1;if(this.regexp_eatDecimalDigits(e)&&(r=e.lastIntValue,e.eat(44)&&this.regexp_eatDecimalDigits(e)&&(n=e.lastIntValue),e.eat(125)))return-1!==n&&n=9?this.regexp_groupSpecifier(e):63===e.current()&&e.raise("Invalid group"),this.regexp_disjunction(e),e.eat(41))return e.numCapturingParens+=1,!0;e.raise("Unterminated group")}return!1},b.regexp_eatExtendedAtom=function(e){return e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)||this.regexp_eatInvalidBracedQuantifier(e)||this.regexp_eatExtendedPatternCharacter(e)},b.regexp_eatInvalidBracedQuantifier=function(e){return this.regexp_eatBracedQuantifier(e,!0)&&e.raise("Nothing to repeat"),!1},b.regexp_eatSyntaxCharacter=e=>{var t=e.current();return!!an(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatPatternCharacters=e=>{for(var t=e.pos,i=0;-1!==(i=e.current())&&!an(i);)e.advance();return e.pos!==t},b.regexp_eatExtendedPatternCharacter=e=>{var t=e.current();return!(-1===t||36===t||t>=40&&t<=43||46===t||63===t||91===t||94===t||124===t||(e.advance(),0))},b.regexp_groupSpecifier=function(e){if(e.eat(63)){if(this.regexp_eatGroupName(e))return-1!==e.groupNames.indexOf(e.lastStringValue)&&e.raise("Duplicate capture group name"),void e.groupNames.push(e.lastStringValue);e.raise("Invalid group")}},b.regexp_eatGroupName=function(e){if(e.lastStringValue="",e.eat(60)){if(this.regexp_eatRegExpIdentifierName(e)&&e.eat(62))return!0;e.raise("Invalid capture group name")}return!1},b.regexp_eatRegExpIdentifierName=function(e){if(e.lastStringValue="",this.regexp_eatRegExpIdentifierStart(e)){for(e.lastStringValue+=fe(e.lastIntValue);this.regexp_eatRegExpIdentifierPart(e);)e.lastStringValue+=fe(e.lastIntValue);return!0}return!1},b.regexp_eatRegExpIdentifierStart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),Za(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatRegExpIdentifierPart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),es(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatAtomEscape=function(e){return!!(this.regexp_eatBackReference(e)||this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)||e.switchN&&this.regexp_eatKGroupName(e))||(e.switchU&&(99===e.current()&&e.raise("Invalid unicode escape"),e.raise("Invalid escape")),!1)},b.regexp_eatBackReference=function(e){var t=e.pos;if(this.regexp_eatDecimalEscape(e)){var i=e.lastIntValue;if(e.switchU)return i>e.maxBackReference&&(e.maxBackReference=i),!0;if(i<=e.numCapturingParens)return!0;e.pos=t}return!1},b.regexp_eatKGroupName=function(e){if(e.eat(107)){if(this.regexp_eatGroupName(e))return e.backReferenceNames.push(e.lastStringValue),!0;e.raise("Invalid named reference")}return!1},b.regexp_eatCharacterEscape=function(e){return this.regexp_eatControlEscape(e)||this.regexp_eatCControlLetter(e)||this.regexp_eatZero(e)||this.regexp_eatHexEscapeSequence(e)||this.regexp_eatRegExpUnicodeEscapeSequence(e,!1)||!e.switchU&&this.regexp_eatLegacyOctalEscapeSequence(e)||this.regexp_eatIdentityEscape(e)},b.regexp_eatCControlLetter=function(e){var t=e.pos;if(e.eat(99)){if(this.regexp_eatControlLetter(e))return!0;e.pos=t}return!1},b.regexp_eatZero=e=>!(48!==e.current()||st(e.lookahead())||(e.lastIntValue=0,e.advance(),0)),b.regexp_eatControlEscape=e=>{var t=e.current();return 116===t?(e.lastIntValue=9,e.advance(),!0):110===t?(e.lastIntValue=10,e.advance(),!0):118===t?(e.lastIntValue=11,e.advance(),!0):102===t?(e.lastIntValue=12,e.advance(),!0):114===t&&(e.lastIntValue=13,e.advance(),!0)},b.regexp_eatControlLetter=e=>{var t=e.current();return!!sn(t)&&(e.lastIntValue=t%32,e.advance(),!0)},b.regexp_eatRegExpUnicodeEscapeSequence=function(e,t){void 0===t&&(t=!1);var i=e.pos,r=t||e.switchU;if(e.eat(117)){if(this.regexp_eatFixedHexDigits(e,4)){var n=e.lastIntValue;if(r&&n>=55296&&n<=56319){var s=e.pos;if(e.eat(92)&&e.eat(117)&&this.regexp_eatFixedHexDigits(e,4)){var a=e.lastIntValue;if(a>=56320&&a<=57343)return e.lastIntValue=1024*(n-55296)+(a-56320)+65536,!0}e.pos=s,e.lastIntValue=n}return!0}if(r&&e.eat(123)&&this.regexp_eatHexDigits(e)&&e.eat(125)&&ts(e.lastIntValue))return!0;r&&e.raise("Invalid unicode escape"),e.pos=i}return!1},b.regexp_eatIdentityEscape=function(e){if(e.switchU)return!!this.regexp_eatSyntaxCharacter(e)||!!e.eat(47)&&(e.lastIntValue=47,!0);var t=e.current();return!(99===t||e.switchN&&107===t||(e.lastIntValue=t,e.advance(),0))},b.regexp_eatDecimalEscape=e=>{e.lastIntValue=0;var t=e.current();if(t>=49&&t<=57){do{e.lastIntValue=10*e.lastIntValue+(t-48),e.advance()}while((t=e.current())>=48&&t<=57);return!0}return!1};var on=0,ue=1,Q=2;function is(e){return 100===e||68===e||115===e||83===e||119===e||87===e}function cn(e){return sn(e)||95===e}function rs(e){return cn(e)||st(e)}function ns(e){return 33===e||e>=35&&e<=38||e>=42&&e<=44||46===e||e>=58&&e<=64||94===e||96===e||126===e}function as(e){return 40===e||41===e||45===e||47===e||e>=91&&e<=93||e>=123&&e<=125}function ss(e){return 33===e||35===e||37===e||38===e||44===e||45===e||e>=58&&e<=62||64===e||96===e||126===e}function st(e){return e>=48&&e<=57}function un(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function ln(e){return e>=65&&e<=70?e-65+10:e>=97&&e<=102?e-97+10:e-48}function hn(e){return e>=48&&e<=55}b.regexp_eatCharacterClassEscape=function(e){var t,i=e.current();if(is(i))return e.lastIntValue=-1,e.advance(),ue;var r=!1;if(e.switchU&&this.options.ecmaVersion>=9&&((r=80===i)||112===i)){if(e.lastIntValue=-1,e.advance(),e.eat(123)&&(t=this.regexp_eatUnicodePropertyValueExpression(e))&&e.eat(125))return r&&t===Q&&e.raise("Invalid property name"),t;e.raise("Invalid property name")}return on},b.regexp_eatUnicodePropertyValueExpression=function(e){var t=e.pos;if(this.regexp_eatUnicodePropertyName(e)&&e.eat(61)){var i=e.lastStringValue;if(this.regexp_eatUnicodePropertyValue(e)){var r=e.lastStringValue;return this.regexp_validateUnicodePropertyNameAndValue(e,i,r),ue}}if(e.pos=t,this.regexp_eatLoneUnicodePropertyNameOrValue(e)){var n=e.lastStringValue;return this.regexp_validateUnicodePropertyNameOrValue(e,n)}return on},b.regexp_validateUnicodePropertyNameAndValue=(e,t,i)=>{Te(e.unicodeProperties.nonBinary,t)||e.raise("Invalid property name"),e.unicodeProperties.nonBinary[t].test(i)||e.raise("Invalid property value")},b.regexp_validateUnicodePropertyNameOrValue=(e,t)=>e.unicodeProperties.binary.test(t)?ue:e.switchV&&e.unicodeProperties.binaryOfStrings.test(t)?Q:void e.raise("Invalid property name"),b.regexp_eatUnicodePropertyName=e=>{var t=0;for(e.lastStringValue="";cn(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatUnicodePropertyValue=e=>{var t=0;for(e.lastStringValue="";rs(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatLoneUnicodePropertyNameOrValue=function(e){return this.regexp_eatUnicodePropertyValue(e)},b.regexp_eatCharacterClass=function(e){if(e.eat(91)){var t=e.eat(94),i=this.regexp_classContents(e);return e.eat(93)||e.raise("Unterminated character class"),t&&i===Q&&e.raise("Negated character class may contain strings"),!0}return!1},b.regexp_classContents=function(e){return 93===e.current()?ue:e.switchV?this.regexp_classSetExpression(e):(this.regexp_nonEmptyClassRanges(e),ue)},b.regexp_nonEmptyClassRanges=function(e){for(;this.regexp_eatClassAtom(e);){var t=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassAtom(e)){var i=e.lastIntValue;e.switchU&&(-1===t||-1===i)&&e.raise("Invalid character class"),-1!==t&&-1!==i&&t>i&&e.raise("Range out of order in character class")}}},b.regexp_eatClassAtom=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatClassEscape(e))return!0;if(e.switchU){var i=e.current();(99===i||hn(i))&&e.raise("Invalid class escape"),e.raise("Invalid escape")}e.pos=t}var r=e.current();return 93!==r&&(e.lastIntValue=r,e.advance(),!0)},b.regexp_eatClassEscape=function(e){var t=e.pos;if(e.eat(98))return e.lastIntValue=8,!0;if(e.switchU&&e.eat(45))return e.lastIntValue=45,!0;if(!e.switchU&&e.eat(99)){if(this.regexp_eatClassControlLetter(e))return!0;e.pos=t}return this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)},b.regexp_classSetExpression=function(e){var t,i=ue;if(!this.regexp_eatClassSetRange(e))if(t=this.regexp_eatClassSetOperand(e)){t===Q&&(i=Q);for(var r=e.pos;e.eatChars([38,38]);)38!==e.current()&&(t=this.regexp_eatClassSetOperand(e))?t!==Q&&(i=ue):e.raise("Invalid character in character class");if(r!==e.pos)return i;for(;e.eatChars([45,45]);)this.regexp_eatClassSetOperand(e)||e.raise("Invalid character in character class");if(r!==e.pos)return i}else e.raise("Invalid character in character class");for(;;)if(!this.regexp_eatClassSetRange(e)){if(!(t=this.regexp_eatClassSetOperand(e)))return i;t===Q&&(i=Q)}},b.regexp_eatClassSetRange=function(e){var t=e.pos;if(this.regexp_eatClassSetCharacter(e)){var i=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassSetCharacter(e)){var r=e.lastIntValue;return-1!==i&&-1!==r&&i>r&&e.raise("Range out of order in character class"),!0}e.pos=t}return!1},b.regexp_eatClassSetOperand=function(e){return this.regexp_eatClassSetCharacter(e)?ue:this.regexp_eatClassStringDisjunction(e)||this.regexp_eatNestedClass(e)},b.regexp_eatNestedClass=function(e){var t=e.pos;if(e.eat(91)){var i=e.eat(94),r=this.regexp_classContents(e);if(e.eat(93))return i&&r===Q&&e.raise("Negated character class may contain strings"),r;e.pos=t}if(e.eat(92)){var n=this.regexp_eatCharacterClassEscape(e);if(n)return n;e.pos=t}return null},b.regexp_eatClassStringDisjunction=function(e){var t=e.pos;if(e.eatChars([92,113])){if(e.eat(123)){var i=this.regexp_classStringDisjunctionContents(e);if(e.eat(125))return i}else e.raise("Invalid escape");e.pos=t}return null},b.regexp_classStringDisjunctionContents=function(e){for(var t=this.regexp_classString(e);e.eat(124);)this.regexp_classString(e)===Q&&(t=Q);return t},b.regexp_classString=function(e){for(var t=0;this.regexp_eatClassSetCharacter(e);)t++;return 1===t?ue:Q},b.regexp_eatClassSetCharacter=function(e){var t=e.pos;if(e.eat(92))return!(!this.regexp_eatCharacterEscape(e)&&!this.regexp_eatClassSetReservedPunctuator(e)&&(e.eat(98)?(e.lastIntValue=8,0):(e.pos=t,1)));var i=e.current();return!(i<0||i===e.lookahead()&&ns(i)||as(i)||(e.advance(),e.lastIntValue=i,0))},b.regexp_eatClassSetReservedPunctuator=e=>{var t=e.current();return!!ss(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatClassControlLetter=e=>{var t=e.current();return!(!st(t)&&95!==t||(e.lastIntValue=t%32,e.advance(),0))},b.regexp_eatHexEscapeSequence=function(e){var t=e.pos;if(e.eat(120)){if(this.regexp_eatFixedHexDigits(e,2))return!0;e.switchU&&e.raise("Invalid escape"),e.pos=t}return!1},b.regexp_eatDecimalDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;st(i=e.current());)e.lastIntValue=10*e.lastIntValue+(i-48),e.advance();return e.pos!==t},b.regexp_eatHexDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;un(i=e.current());)e.lastIntValue=16*e.lastIntValue+ln(i),e.advance();return e.pos!==t},b.regexp_eatLegacyOctalEscapeSequence=function(e){if(this.regexp_eatOctalDigit(e)){var t=e.lastIntValue;if(this.regexp_eatOctalDigit(e)){var i=e.lastIntValue;t<=3&&this.regexp_eatOctalDigit(e)?e.lastIntValue=64*t+8*i+e.lastIntValue:e.lastIntValue=8*t+i}else e.lastIntValue=t;return!0}return!1},b.regexp_eatOctalDigit=e=>{var t=e.current();return hn(t)?(e.lastIntValue=t-48,e.advance(),!0):(e.lastIntValue=0,!1)},b.regexp_eatFixedHexDigits=(e,t)=>{var i=e.pos;e.lastIntValue=0;for(var r=0;rtypeof Symbol&&(C[Symbol.iterator]=function(){return{next:()=>{var e=this.getToken();return{done:e.type===u.eof,value:e}}}}),C.nextToken=function(){var e=this.curContext();return e&&e.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length?this.finishToken(u.eof):e.override?e.override(this):void this.readToken(this.fullCharCodeAtPos())},C.readToken=function(e){return ce(e,this.options.ecmaVersion>=6)||92===e?this.readWord():this.getTokenFromCode(e)},C.fullCharCodeAtPos=function(){var e=this.input.charCodeAt(this.pos);if(e<=55295||e>=56320)return e;var t=this.input.charCodeAt(this.pos+1);return t<=56319||t>=57344?e:(e<<10)+t-56613888},C.skipBlockComment=function(){var e=this.options.onComment&&this.curPosition(),t=this.pos,i=this.input.indexOf("*/",this.pos+=2);if(-1===i&&this.raise(this.pos-2,"Unterminated comment"),this.pos=i+2,this.options.locations)for(var r=void 0,n=t;(r=Nr(this.input,n,this.pos))>-1;)++this.curLine,n=this.lineStart=r;this.options.onComment&&this.options.onComment(!0,this.input.slice(t+2,i),t,this.pos,e,this.curPosition())},C.skipLineComment=function(e){for(var t=this.pos,i=this.options.onComment&&this.curPosition(),r=this.input.charCodeAt(this.pos+=e);this.pos8&&e<14||e>=5760&&Mr.test(String.fromCharCode(e))))break e;++this.pos}}},C.finishToken=function(e,t){this.end=this.pos,this.options.locations&&(this.endLoc=this.curPosition());var i=this.type;this.type=e,this.value=t,this.updateContext(i)},C.readToken_dot=function(){var e=this.input.charCodeAt(this.pos+1);if(e>=48&&e<=57)return this.readNumber(!0);var t=this.input.charCodeAt(this.pos+2);return this.options.ecmaVersion>=6&&46===e&&46===t?(this.pos+=3,this.finishToken(u.ellipsis)):(++this.pos,this.finishToken(u.dot))},C.readToken_slash=function(){var e=this.input.charCodeAt(this.pos+1);return this.exprAllowed?(++this.pos,this.readRegexp()):61===e?this.finishOp(u.assign,2):this.finishOp(u.slash,1)},C.readToken_mult_modulo_exp=function(e){var t=this.input.charCodeAt(this.pos+1),i=1,r=42===e?u.star:u.modulo;return this.options.ecmaVersion>=7&&42===e&&42===t&&(++i,r=u.starstar,t=this.input.charCodeAt(this.pos+2)),61===t?this.finishOp(u.assign,i+1):this.finishOp(r,i)},C.readToken_pipe_amp=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?this.options.ecmaVersion>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(124===e?u.logicalOR:u.logicalAND,2):61===t?this.finishOp(u.assign,2):this.finishOp(124===e?u.bitwiseOR:u.bitwiseAND,1)},C.readToken_caret=function(){return 61===this.input.charCodeAt(this.pos+1)?this.finishOp(u.assign,2):this.finishOp(u.bitwiseXOR,1)},C.readToken_plus_min=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?45!==t||this.inModule||62!==this.input.charCodeAt(this.pos+2)||0!==this.lastTokEnd&&!Y.test(this.input.slice(this.lastTokEnd,this.pos))?this.finishOp(u.incDec,2):(this.skipLineComment(3),this.skipSpace(),this.nextToken()):61===t?this.finishOp(u.assign,2):this.finishOp(u.plusMin,1)},C.readToken_lt_gt=function(e){var t=this.input.charCodeAt(this.pos+1),i=1;return t===e?(i=62===e&&62===this.input.charCodeAt(this.pos+2)?3:2,61===this.input.charCodeAt(this.pos+i)?this.finishOp(u.assign,i+1):this.finishOp(u.bitShift,i)):33!==t||60!==e||this.inModule||45!==this.input.charCodeAt(this.pos+2)||45!==this.input.charCodeAt(this.pos+3)?(61===t&&(i=2),this.finishOp(u.relational,i)):(this.skipLineComment(4),this.skipSpace(),this.nextToken())},C.readToken_eq_excl=function(e){var t=this.input.charCodeAt(this.pos+1);return 61===t?this.finishOp(u.equality,61===this.input.charCodeAt(this.pos+2)?3:2):61===e&&62===t&&this.options.ecmaVersion>=6?(this.pos+=2,this.finishToken(u.arrow)):this.finishOp(61===e?u.eq:u.prefix,1)},C.readToken_question=function(){var e=this.options.ecmaVersion;if(e>=11){var t=this.input.charCodeAt(this.pos+1);if(46===t){var i=this.input.charCodeAt(this.pos+2);if(i<48||i>57)return this.finishOp(u.questionDot,2)}if(63===t)return e>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(u.coalesce,2)}return this.finishOp(u.question,1)},C.readToken_numberSign=function(){var e=35;if(this.options.ecmaVersion>=13&&(++this.pos,ce(e=this.fullCharCodeAtPos(),!0)||92===e))return this.finishToken(u.privateId,this.readWord1());this.raise(this.pos,"Unexpected character '"+fe(e)+"'")},C.getTokenFromCode=function(e){switch(e){case 46:return this.readToken_dot();case 40:return++this.pos,this.finishToken(u.parenL);case 41:return++this.pos,this.finishToken(u.parenR);case 59:return++this.pos,this.finishToken(u.semi);case 44:return++this.pos,this.finishToken(u.comma);case 91:return++this.pos,this.finishToken(u.bracketL);case 93:return++this.pos,this.finishToken(u.bracketR);case 123:return++this.pos,this.finishToken(u.braceL);case 125:return++this.pos,this.finishToken(u.braceR);case 58:return++this.pos,this.finishToken(u.colon);case 96:if(this.options.ecmaVersion<6)break;return++this.pos,this.finishToken(u.backQuote);case 48:var t=this.input.charCodeAt(this.pos+1);if(120===t||88===t)return this.readRadixNumber(16);if(this.options.ecmaVersion>=6){if(111===t||79===t)return this.readRadixNumber(8);if(98===t||66===t)return this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(e);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo_exp(e);case 124:case 38:return this.readToken_pipe_amp(e);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(e);case 60:case 62:return this.readToken_lt_gt(e);case 61:case 33:return this.readToken_eq_excl(e);case 63:return this.readToken_question();case 126:return this.finishOp(u.prefix,1);case 35:return this.readToken_numberSign()}this.raise(this.pos,"Unexpected character '"+fe(e)+"'")},C.finishOp=function(e,t){var i=this.input.slice(this.pos,this.pos+t);return this.pos+=t,this.finishToken(e,i)},C.readRegexp=function(){for(var e,t,i=this.pos;;){this.pos>=this.input.length&&this.raise(i,"Unterminated regular expression");var r=this.input.charAt(this.pos);if(Y.test(r)&&this.raise(i,"Unterminated regular expression"),e)e=!1;else{if("["===r)t=!0;else if("]"===r&&t)t=!1;else if("/"===r&&!t)break;e="\\"===r}++this.pos}var n=this.input.slice(i,this.pos);++this.pos;var s=this.pos,a=this.readWord1();this.containsEsc&&this.unexpected(s);var o=this.regexpState||(this.regexpState=new re(this));o.reset(i,n,a),this.validateRegExpFlags(o),this.validateRegExpPattern(o);var c=null;try{c=RegExp(n,a)}catch{}return this.finishToken(u.regexp,{pattern:n,flags:a,value:c})},C.readInt=function(e,t,i){for(var r=this.options.ecmaVersion>=12&&void 0===t,n=i&&48===this.input.charCodeAt(this.pos),s=this.pos,a=0,o=0,c=0,l=t??1/0;c=97?h-97+10:h>=65?h-65+10:h>=48&&h<=57?h-48:1/0)>=e)break;o=h,a=a*e+p}}return r&&95===o&&this.raiseRecoverable(this.pos-1,"Numeric separator is not allowed at the last of digits"),this.pos===s||null!=t&&this.pos-s!==t?null:a},C.readRadixNumber=function(e){var t=this.pos;this.pos+=2;var i=this.readInt(e);return null==i&&this.raise(this.start+2,"Expected number in radix "+e),this.options.ecmaVersion>=11&&110===this.input.charCodeAt(this.pos)?(i=pn(this.input.slice(t,this.pos)),++this.pos):ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,i)},C.readNumber=function(e){var t=this.pos;e||null!==this.readInt(10,void 0,!0)||this.raise(t,"Invalid number");var i=this.pos-t>=2&&48===this.input.charCodeAt(t);i&&this.strict&&this.raise(t,"Invalid number");var r=this.input.charCodeAt(this.pos);if(!i&&!e&&this.options.ecmaVersion>=11&&110===r){var n=pn(this.input.slice(t,this.pos));return++this.pos,ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,n)}i&&/[89]/.test(this.input.slice(t,this.pos))&&(i=!1),46!==r||i||(++this.pos,this.readInt(10),r=this.input.charCodeAt(this.pos)),69!==r&&101!==r||i||((43===(r=this.input.charCodeAt(++this.pos))||45===r)&&++this.pos,null===this.readInt(10)&&this.raise(t,"Invalid number")),ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number");var s=os(this.input.slice(t,this.pos),i);return this.finishToken(u.num,s)},C.readCodePoint=function(){var e;if(123===this.input.charCodeAt(this.pos)){this.options.ecmaVersion<6&&this.unexpected();var t=++this.pos;e=this.readHexChar(this.input.indexOf("}",this.pos)-this.pos),++this.pos,e>1114111&&this.invalidStringToken(t,"Code point out of bounds")}else e=this.readHexChar(4);return e},C.readString=function(e){for(var t="",i=++this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated string constant");var r=this.input.charCodeAt(this.pos);if(r===e)break;92===r?(t+=this.input.slice(i,this.pos),t+=this.readEscapedChar(!1),i=this.pos):8232===r||8233===r?(this.options.ecmaVersion<10&&this.raise(this.start,"Unterminated string constant"),++this.pos,this.options.locations&&(this.curLine++,this.lineStart=this.pos)):(we(r)&&this.raise(this.start,"Unterminated string constant"),++this.pos)}return t+=this.input.slice(i,this.pos++),this.finishToken(u.string,t)};var fn={};C.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(e){if(e!==fn)throw e;this.readInvalidTemplateToken()}this.inTemplateElement=!1},C.invalidStringToken=function(e,t){if(this.inTemplateElement&&this.options.ecmaVersion>=9)throw fn;this.raise(e,t)},C.readTmplToken=function(){for(var e="",t=this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated template");var i=this.input.charCodeAt(this.pos);if(96===i||36===i&&123===this.input.charCodeAt(this.pos+1))return this.pos!==this.start||this.type!==u.template&&this.type!==u.invalidTemplate?(e+=this.input.slice(t,this.pos),this.finishToken(u.template,e)):36===i?(this.pos+=2,this.finishToken(u.dollarBraceL)):(++this.pos,this.finishToken(u.backQuote));if(92===i)e+=this.input.slice(t,this.pos),e+=this.readEscapedChar(!0),t=this.pos;else if(we(i)){switch(e+=this.input.slice(t,this.pos),++this.pos,i){case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:e+="\n";break;default:e+=String.fromCharCode(i)}this.options.locations&&(++this.curLine,this.lineStart=this.pos),t=this.pos}else++this.pos}},C.readInvalidTemplateToken=function(){for(;this.pos=48&&t<=55){var r=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],n=Number.parseInt(r,8);return n>255&&(n=Number.parseInt(r=r.slice(0,-1),8)),this.pos+=r.length-1,t=this.input.charCodeAt(this.pos),("0"!==r||56===t||57===t)&&(this.strict||e)&&this.invalidStringToken(this.pos-1-r.length,e?"Octal literal in template string":"Octal literal in strict mode"),String.fromCharCode(n)}return we(t)?"":String.fromCharCode(t)}},C.readHexChar=function(e){var t=this.pos,i=this.readInt(16,e);return null===i&&this.invalidStringToken(t,"Bad character escape sequence"),i},C.readWord1=function(){this.containsEsc=!1;for(var e="",t=!0,i=this.pos,r=this.options.ecmaVersion>=6;this.pos>16)+(t>>16)+(i>>16)<<16|65535&i}function fs(e,t){return e<>>32-t}function ut(e,t,i,r,n,s){return ye(fs(ye(ye(t,e),ye(r,s)),n),i)}function D(e,t,i,r,n,s,a){return ut(t&i|~t&r,e,t,n,s,a)}function O(e,t,i,r,n,s,a){return ut(t&r|i&~r,e,t,n,s,a)}function V(e,t,i,r,n,s,a){return ut(t^i^r,e,t,n,s,a)}function F(e,t,i,r,n,s,a){return ut(i^(t|~r),e,t,n,s,a)}function ot(e,t){e[t>>5]|=128<>>9<<4)]=t;let i=1732584193,r=-271733879,n=-1732584194,s=271733878;for(let t=0;t>5]>>>r%32&255);return t}function ri(e){let t=[],i=e.length>>2;for(let e=0;e>5]|=(255&e.charCodeAt(i/8))<16&&(i=ot(i,8*e.length));for(let e=0;e<16;e+=1)r[e]=909522486^i[e],n[e]=1549556828^i[e];let s=ot(r.concat(ri(t)),512+8*t.length);return yn(ot(n.concat(s),640))}function gn(e){let t="0123456789abcdef",i="";for(let r=0;r>>4&15)+t.charAt(15&n)}return i}function ni(e){return unescape(encodeURIComponent(e))}function xn(e){return ds(ni(e))}function ys(e){return gn(xn(e))}function _n(e,t){return ms(ni(e),ni(t))}function gs(e,t){return gn(_n(e,t))}function xs(e,t,i){return t?i?_n(t,e):gs(t,e):i?xn(e):ys(e)}var ei=3072;function _s(e){let t=new Headers(e);if(e.has("x-bare-headers")){let i=e.get("x-bare-headers");if(i.length>ei){t.delete("x-bare-headers");let e=0;for(let r=0;r{s.removeEventListener("close",o),s.removeEventListener("message",c)},o=()=>{a()},c=e=>{if(a(),"string"!=typeof e.data)throw TypeError("the first websocket message was not a text frame");let t=JSON.parse(e.data);if("open"!==t.type)throw TypeError("message was not of open type");e.stopImmediatePropagation(),r({protocol:t.protocol,setCookies:t.setCookies}),n(ge.OPEN),s.dispatchEvent(new Event("open"))};return s.addEventListener("close",o),s.addEventListener("message",c),s.addEventListener("open",r=>{r.stopImmediatePropagation(),n(ge.CONNECTING),i().then(i=>ge.prototype.send.call(s,JSON.stringify({type:"connect",remote:e.toString(),protocols:t,headers:i,forwardHeaders:[]})))},{once:!0}),s}async request(e,t,i,r,n,s,a){if(r.protocol.startsWith("blob:")){let e=await ti(r),t=new mn(e.body,e);return t.rawHeaders=Object.fromEntries(e.headers),t.rawResponse=e,t}let o={};if(t instanceof Headers)for(let[e,i]of t)o[e]=i;else for(let e in t)o[e]=t[e];let c={credentials:"omit",method:e,signal:a};"only-if-cached"!==n&&(c.cache=n),void 0!==i&&(c.body=i),void 0!==s&&(c.duplex=s),c.headers=this.createBareHeaders(r,o);let l=await ti(this.http+"?cache="+xs(r.toString()),c),p=await this.readBareResponse(l),h=new mn(hs.includes(p.status)?void 0:l.body,{status:p.status,statusText:p.statusText??void 0,headers:new Headers(p.headers)});return h.rawHeaders=p.headers,h.rawResponse=l,h}async readBareResponse(e){if(!e.ok)throw new ct(e.status,await e.json());let t=bs(e.headers),i={},r=t.get("x-bare-status");null!==r&&(i.status=Number.parseInt(r));let n=t.get("x-bare-status-text");null!==n&&(i.statusText=n);let s=t.get("x-bare-headers");return null!==s&&(i.headers=JSON.parse(s)),i}createBareHeaders(e,t,i=[],r=[],n=[]){let s=new Headers;for(let r of(s.set("x-bare-url",e.toString()),s.set("x-bare-headers",JSON.stringify(t)),i))s.append("x-bare-forward-headers",r);for(let e of r)s.append("x-bare-pass-headers",e);for(let e of n)s.append("x-bare-pass-status",e.toString());return _s(s),s}},ws="!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~";function vs(e){for(let t=0;tthis.loadManifest(e)).catch(e=>{throw delete this.working,e})),this.working):this.client}getClient(){for(let[e,t]of Ss)if(this.manifest.versions.includes(e))return new t(this.server);throw Error("Unable to find compatible client version. Starting from v2.0.0, @tomphttp/bare-client only supports Bare servers v3+. For more information, see https://github.com/tomphttp/bare-client/")}createWebSocket(e,t=[],i){if(!this.client)throw TypeError("You need to wait for the client to finish fetching the manifest before creating any WebSockets. Try caching the manifest data before making this request.");try{e=new URL(e)}catch{throw new DOMException(`Faiiled to construct 'WebSocket': The URL '${e}' is invalid.`)}if(!Cs.includes(e.protocol))throw new DOMException(`Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${e.protocol}' is not allowed.`);for(let e of(Array.isArray(t)||(t=[t]),t=t.map(String)))if(!vs(e))throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${e}' is invalid.`);let r=this.client.connect(e,t,async()=>{let t="function"==typeof i.headers?await i.headers():i.headers||{},r=t instanceof Headers?Object.fromEntries(t):t;return r.Host=e.host,r.Pragma="no-cache",r["Cache-Control"]="no-cache",r.Upgrade="websocket",r.Connection="Upgrade",r},e=>{n=e.protocol,i.setCookiesCallback&&i.setCookiesCallback(e.setCookies)},e=>{s=e},i.webSocketImpl||me),n="",s=ge.CONNECTING,a=()=>{let e=Es.call(r);return e===ge.OPEN?s:e};i.readyStateHook?i.readyStateHook(r,a):Object.defineProperty(r,"readyState",{get:a,configurable:!0,enumerable:!0});let o=()=>{if(a()===ge.CONNECTING)return new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.")};i.sendErrorHook?i.sendErrorHook(r,o):r.send=function(...e){let t=o();if(t)throw t;ge.prototype.send.call(this,...e)},i.urlHook?i.urlHook(r,e):Object.defineProperty(r,"url",{get:()=>e.toString(),configurable:!0,enumerable:!0});let c=()=>n;return i.protocolHook?i.protocolHook(r,c):Object.defineProperty(r,"protocol",{get:c,configurable:!0,enumerable:!0}),r}async fetch(e,t){let i=ks(e)?new us(e,t):e,r=t?.headers||i.headers,n=r instanceof Headers?Object.fromEntries(r):r,s=t?.duplex,a=t?.body||i.body,o=new URL(i.url),c=await this.demand();for(let e=0;;e++){"host"in n?n.host=o.host:n.Host=o.host;let r=await c.request(i.method,n,a,o,i.cache,s,i.signal);r.finalURL=o.toString();let l=t?.redirect||i.redirect;if(!ps.includes(r.status))return r;switch(l){case"follow":{let t=r.headers.get("location");if(ls>e&&null!==t){o=new URL(t,o);continue}throw TypeError("Failed to fetch")}case"error":throw TypeError("Failed to fetch");case"manual":return r}}}};function ks(e){return"string"==typeof e||e instanceof URL}async function wn(e,t){let i=await bn(e,t);return new De(e,i)}var Hs=Qe(vn(),1),Nn=Qe(En(),1),{stringify:Os}=JSON;if(!String.prototype.repeat)throw Error("String.prototype.repeat is undefined, see https://github.com/davidbonnet/astring#installation");if(!String.prototype.endsWith)throw Error("String.prototype.endsWith is undefined, see https://github.com/davidbonnet/astring#installation");var ht={"||":2,"??":3,"&&":4,"|":5,"^":6,"&":7,"==":8,"!=":8,"===":8,"!==":8,"<":9,">":9,"<=":9,">=":9,in:9,instanceof:9,"<<":10,">>":10,">>>":10,"+":11,"-":11,"*":12,"%":12,"/":12,"**":13},ee=17,Vs={ArrayExpression:20,TaggedTemplateExpression:20,ThisExpression:20,Identifier:20,PrivateIdentifier:20,Literal:18,TemplateLiteral:20,Super:20,SequenceExpression:20,MemberExpression:19,ChainExpression:19,CallExpression:19,NewExpression:19,ArrowFunctionExpression:ee,ClassExpression:ee,FunctionExpression:ee,ObjectExpression:ee,UpdateExpression:16,UnaryExpression:15,AwaitExpression:15,BinaryExpression:14,LogicalExpression:13,ConditionalExpression:4,AssignmentExpression:3,YieldExpression:2,RestElement:1};function Ce(e,t){let{generator:i}=e;if(e.write("("),null!=t&&t.length>0){i[t[0].type](t[0],e);let{length:r}=t;for(let n=1;n0){e.write(r);for(let t=1;t0){i.VariableDeclarator(r[0],e);for(let t=1;t0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let{length:o}=a;for(let e=0;e0){for(;n0&&t.write(", ");let e=i[n],r=e.type[6];if("D"===r)t.write(e.local.name,e),n++;else{if("N"!==r)break;t.write("* as "+e.local.name,e),n++}}if(n0)for(let e=0;;){let n=i[e],{name:s}=n.local;if(t.write(s,n),s!==n.exported.name&&t.write(" as "+n.exported.name),!(++e "),"O"===e.body.type[0]?(t.write("("),this.ObjectExpression(e.body,t),t.write(")")):this[e.body.type](e.body,t)},ThisExpression(e,t){t.write("this",e)},Super(e,t){t.write("super",e)},RestElement:An=function(e,t){t.write("..."),this[e.argument.type](e.argument,t)},SpreadElement:An,YieldExpression(e,t){t.write(e.delegate?"yield*":"yield"),e.argument&&(t.write(" "),this[e.argument.type](e.argument,t))},AwaitExpression(e,t){t.write("await ",e),pt(t,e.argument,e)},TemplateLiteral(e,t){let{quasis:i,expressions:r}=e;t.write("`");let{length:n}=r;for(let e=0;e0){let{elements:i}=e,{length:r}=i;for(let e=0;;){let n=i[e];if(null!=n&&this[n.type](n,t),!(++e0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let a=","+r,{properties:o}=e,{length:c}=o;for(let e=0;;){let i=o[e];if(n&&null!=i.comments&&j(t,i.comments,s,r),t.write(s),this[i.type](i,t),!(++e0){let{properties:i}=e,{length:r}=i;for(let e=0;this[i[e].type](i[e],t),++e1||"U"===n[0]&&("n"===n[1]||"p"===n[1])&&r.prefix&&r.operator[0]===i&&("+"===i||"-"===i))&&t.write(" "),s?(t.write(i.length>1?" (":"("),this[n](r,t),t.write(")")):this[n](r,t)}else this[e.argument.type](e.argument,t),t.write(e.operator)},UpdateExpression(e,t){e.prefix?(t.write(e.operator),this[e.argument.type](e.argument,t)):(this[e.argument.type](e.argument,t),t.write(e.operator))},AssignmentExpression(e,t){this[e.left.type](e.left,t),t.write(" "+e.operator+" "),this[e.right.type](e.right,t)},AssignmentPattern(e,t){this[e.left.type](e.left,t),t.write(" = "),this[e.right.type](e.right,t)},BinaryExpression:Ln=(e,t)=>{let i="in"===e.operator;i&&t.write("("),pt(t,e.left,e,!1),t.write(" "+e.operator+" "),pt(t,e.right,e,!0),i&&t.write(")")},LogicalExpression:Ln,ConditionalExpression(e,t){let{test:i}=e,r=t.expressionsPrecedence[i.type];r===ee||r<=t.expressionsPrecedence.ConditionalExpression?(t.write("("),this[i.type](i,t),t.write(")")):this[i.type](i,t),t.write(" ? "),this[e.consequent.type](e.consequent,t),t.write(" : "),this[e.alternate.type](e.alternate,t)},NewExpression(e,t){t.write("new ");let i=t.expressionsPrecedence[e.callee.type];i===ee||i0&&(this.lineEndSize>0&&(1===r.length?e[i-1]===r:e.endsWith(r))?(this.line+=this.lineEndSize,this.column=0):this.column+=i)}toString(){return this.output}};function Tn(e,t){let i=new li(t);return i.generator[e.type](e,i),i.output}var hi,Mn=class{constructor(e){this.mime=br,this.idb=Je,this.path=Us,this.acorn={parse:dn},this.bare={createBareClient:wn,BareClient:De},this.base64={encode:btoa,decode:atob},this.estree={generate:Tn},this.cookie=Hs,this.setCookieParser=Nn.parse,this.ctx=e}};function pi(e,t,i,r,n="",s=!1,a=""){if(self.__dynamic$config)var o="development"==self.__dynamic$config.mode;else o=!1;if(s){var c=[{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:e+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]},{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:t+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]}];return this.ctx.config.assets.files.inject&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:this.ctx.config.assets.files.inject+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]}),r&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(`self.__dynamic$cookies = atob("${btoa(r)}");document.currentScript?.remove();`)}]}),n&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(n+";document.currentScript?.remove();")}]}),a&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(a+";document.currentScript?.remove();")}]}),c}var l=[``).join("");return t?`${r}`:r}}},flagEnabled:a.U5,codec:{encode:a.hD,decode:a.P_}}),inUse:!1},f.push(t)):((0,a.U5)("rewriterLogs",e.base)&&console.log(`using cached rewriter ${r} from list of ${d} rewriters`),t=f[r]),t.inUse=!0,[t.rewriter,()=>t.inUse=!1]}},2015:function(e,t,r){r.d(t,{i:()=>a});var n=r(37),i=r(1478);function a(e,t,r,a){let s="",o="module"===t,l=e=>{o?s+=`import "${n.$W.files[e]}" -`:s+=`importScripts("${n.$W.files[e]}"); -`};l("wasm"),l("all"),s+=`$scramjetLoadClient().loadAndHook(${JSON.stringify(n.$W)});`;let c=(0,i.o)(e,r,a,o);return c instanceof Uint8Array&&(c=new TextDecoder().decode(c)),s+=c}},6684:function(e,t,r){r.d(t,{Sn:()=>h,YH:()=>u,Yq:()=>f,hU:()=>d,pL:()=>p,rj:()=>c});var n=r(6570);let i={none:0,"same-origin":1,"same-site":2,"cross-site":3};async function a(){return(0,n.P2)("$scramjet",1)}async function s(e){let t=await a();return await t.get("redirectTrackers",e)||null}async function o(e,t){let r=await a();await r.put("redirectTrackers",t,e)}async function l(e){let t=await a();await t.delete("redirectTrackers",e)}async function c(e,t,r){await s(e)||await o(e,{originalReferrer:t||"",mostRestrictiveSite:r,referrerPolicy:"",chainStarted:Date.now()})}async function u(e,t,r){let n=await s(e);n&&(await l(e),r&&(n.referrerPolicy=r),await o(t,n))}async function d(e,t){let r=await s(e);if(!r)return t;let n=i[r.mostRestrictiveSite];return(i[t]??0)>n?(r.mostRestrictiveSite=t,await o(e,r),t):r.mostRestrictiveSite}async function h(e){await l(e)}async function p(e,t,r){let n=await a();await n.put("referrerPolicies",{policy:t,referrer:r},e)}async function f(e){let t=await a();return await t.get("referrerPolicies",e)||null}},2416:function(e,t,r){r(6684),r(8228)},8228:function(e,t,r){r.d(t,{ps:()=>l});var n=r(6570);let i="publicSuffixList";async function a(){return(0,n.P2)("$scramjet",1)}async function s(){let e=await a();return await e.get("publicSuffixList",i)||null}async function o(e){let t=await a();await t.put("publicSuffixList",{data:e,expiry:Date.now()+36e5},i)}async function l(e,t,r){return t?e.origin.origin===t.origin?"same-origin":await c(e.origin,t,r)?"same-site":"cross-site":"none"}async function c(e,t,r){return await u(e,r)===await u(t,r)}async function u(e,t){let r=await d(t),n=e.hostname.toLowerCase().split("."),i="",a=!1;for(let e of r){let t=e.startsWith("!")?e.substring(1):e;if(function(e,t){if(e.lengthi.length&&(i=t)}}if(!i)return n.slice(-2).join(".");let s=i.split(".").length,o=a?s:s+1;return n.slice(-o).join(".")}async function d(e){let t,r=await s();if(r&&Date.now(){let t=e.trim(),r=t.indexOf(" ");return r>-1?t.substring(0,r):t}).filter(e=>e&&!e.startsWith("//"));return await o(n),n}},2794:function(e,t,r){r.d(t,{pX:()=>n,zr:()=>i});let n=Symbol.for("scramjet client global"),i=Symbol.for("scramjet frame handle")},5956:function(e,t,r){function n(e,t){let r=` + `, + i = y(p.encode(n)); + return [t(c.$W.files.wasm), t(c.$W.files.all), t("data:application/javascript;base64," + i)]; + } + let p = new TextEncoder(); + function f(e, t, r, c = !1) { + let g = performance.now(), + m = (function (e, t, r, c = !1) { + let d = new i.DV((e, t) => t), + f = new n.iX(d); + if ( + (f.write(e), + f.end(), + (function e(t, r, n) { + if (("base" === t.name && void 0 !== t.attribs.href && (n.base = new URL(t.attribs.href, n.origin)), t.attribs)) { + for (let e of u.V) + for (let i in e) { + let a = e[i.toLowerCase()]; + if ("function" != typeof a && ("*" === a || a.includes(t.name)) && void 0 !== t.attribs[i]) { + let a = t.attribs[i], + s = e.fn(a, n, r); + null === s ? delete t.attribs[i] : (t.attribs[i] = s), (t.attribs[`scramjet-attr-${i}`] = a); + } + } + for (let [e, r] of Object.entries(t.attribs)) b.includes(e) && ((t.attribs[`scramjet-attr-${e}`] = r), (t.attribs[e] = (0, l.o)(r, `(inline ${e} on element)`, n))); + } + if ( + ("style" === t.name && void 0 !== t.children[0] && (t.children[0].data = (0, o.s)(t.children[0].data, n)), + "script" === t.name && "module" === t.attribs.type && t.attribs.src && (t.attribs.src = t.attribs.src + "?type=module"), + "script" === t.name && "importmap" === t.attribs.type && void 0 !== t.children[0]) + ) { + let e = t.children[0].data; + try { + let r = JSON.parse(e); + if (r.imports) + for (let e in r.imports) { + let t = r.imports[e]; + "string" == typeof t && ((t = (0, s.Oy)(t, n)), (r.imports[e] = t)); + } + t.children[0].data = JSON.stringify(r); + } catch (e) { + console.error("Failed to parse importmap JSON:", e); + } + } + if ("script" === t.name && /(application|text)\/javascript|module|undefined/.test(t.attribs.type) && void 0 !== t.children[0]) { + let e = t.children[0].data, + r = "module" === t.attribs.type; + (t.attribs["scramjet-attr-script-source-src"] = y(p.encode(e))), (e = e.replace(//g, "")), (t.children[0].data = (0, l.o)(e, "(inline script element)", n, r)); + } + if ("meta" === t.name && void 0 !== t.attribs["http-equiv"]) { + if ("content-security-policy" === t.attribs["http-equiv"].toLowerCase()) t = new i.Mw(t.attribs.content); + else if ("refresh" === t.attribs["http-equiv"] && t.attribs.content.includes("url")) { + let e = t.attribs.content.split("url="); + e[1] && (e[1] = (0, s.Oy)(e[1].trim(), n)), (t.attribs.content = e.join("url=")); + } + } + if (t.childNodes) for (let i in t.childNodes) t.childNodes[i] = e(t.childNodes[i], r, n); + return t; + })(d.root, t, r), + c) + ) { + let e = (function e(t) { + if (t.type === n.RJ.vw && "head" === t.name) return t; + if (t.childNodes) + for (let r of t.childNodes) { + let t = e(r); + if (t) return t; + } + return null; + })(d.root); + e || ((e = new i.Hg("head", {}, [])), d.root.children.unshift(e)), e.children.unshift(...h(t, e => new i.Hg("script", { src: e }))); + } + return (0, a.A)(d.root, { encodeEntities: "utf8", decodeEntities: !1 }); + })(e, t, r, c); + return d.time(r, g, "html rewrite"), m; + } + function g(e) { + let t = new i.DV((e, t) => t), + r = new n.iX(t); + return ( + r.write(e), + r.end(), + !(function e(t) { + if ("attribs" in t) + for (let e in t.attribs) { + if ("scramjet-attr-script-source-src" == e) { + t.children[0] && "data" in t.children[0] && (t.children[0].data = atob(t.attribs[e])); + continue; + } + e.startsWith("scramjet-attr-") && ((t.attribs[e.slice(14)] = t.attribs[e]), delete t.attribs[e]); + } + if ("childNodes" in t) for (let r of t.childNodes) e(r); + })(t.root), + (0, a.A)(t.root, { decodeEntities: !1 }) + ); + } + function m(e, t) { + return e + .split(/ .*,/) + .map(e => e.trim()) + .map(e => { + let [r, ...n] = e.split(/\s+/), + i = (0, s.Oy)(r.trim(), t); + return n.length > 0 ? `${i} ${n.join(" ")}` : i; + }) + .join(", "); + } + function y(e) { + return btoa(Array.from(e, e => String.fromCodePoint(e)).join("")); + } + let b = [ + "onbeforexrselect", + "onabort", + "onbeforeinput", + "onbeforematch", + "onbeforetoggle", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontentvisibilityautostatechange", + "oncontextlost", + "oncontextmenu", + "oncontextrestored", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "onformdata", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmouseenter", + "onmouseleave", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onresize", + "onscroll", + "onsecuritypolicyviolation", + "onseeked", + "onseeking", + "onselect", + "onslotchange", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "ontoggle", + "onvolumechange", + "onwaiting", + "onwebkitanimationend", + "onwebkitanimationiteration", + "onwebkitanimationstart", + "onwebkittransitionend", + "onwheel", + "onauxclick", + "ongotpointercapture", + "onlostpointercapture", + "onpointerdown", + "onpointermove", + "onpointerrawupdate", + "onpointerup", + "onpointercancel", + "onpointerover", + "onpointerout", + "onpointerenter", + "onpointerleave", + "onselectstart", + "onselectionchange", + "onanimationend", + "onanimationiteration", + "onanimationstart", + "ontransitionrun", + "ontransitionstart", + "ontransitionend", + "ontransitioncancel", + "oncopy", + "oncut", + "onpaste", + "onscrollend", + "onscrollsnapchange", + "onscrollsnapchanging", + ]; + }, + 9381: function (e, t, r) { + r(2614), r(4435), r(884), r(1478), r(1472), r(2015), r(1561); + }, + 1478: function (e, t, r) { + r.d(t, { o: () => s }); + var n = r(37), + i = r(1561), + a = r(8665).A; + function s(e, t, r, o = !1) { + try { + let s = (function (e, t, r, n = !1) { + return (function (e, t, r, n) { + let [s, o] = (0, i.nb)(r); + try { + let o, + l = performance.now(); + (o = "string" == typeof e ? s.rewrite_js(e, r.base.href, t || "(unknown)", n) : s.rewrite_js_bytes(e, r.base.href, t || "(unknown)", n)), a.time(r, l, `oxc rewrite for "${t || "(unknown)"}"`); + let { js: c, map: u, scramtag: d, errors: h } = o; + return { js: "string" == typeof e ? i.su.decode(c) : c, tag: d, map: u, errors: h }; + } finally { + o(); + } + })(e, t, r, n); + })(e, t, r, o), + l = s.js; + if ((0, n.U5)("sourcemaps", r.base)) { + let e = globalThis[n.$W.globals.pushsourcemapfn]; + if (e) e(Array.from(s.map), s.tag); + else { + l instanceof Uint8Array && (l = new TextDecoder().decode(l)); + let e = `${n.$W.globals.pushsourcemapfn}([${s.map.join(",")}], "${s.tag}");`, + t = /^\s*(['"])use strict\1;?/; + l = t.test(l) + ? l.replace( + t, + `$& +${e}`, + ) + : `${e} +${l}`; + } + } + if ((0, n.U5)("rewriterLogs", r.base)) for (let e of s.errors) console.error("oxc parse error", e); + return l; + } catch (a) { + if ((console.warn("failed rewriting js for", t || "(unknown)", a.message, e instanceof Uint8Array ? i.su.decode(e) : e), (0, n.U5)("allowInvalidJs", r.base))) return e; + throw a; + } + } + Error.stackTraceLimit = 50; + }, + 1472: function (e, t, r) { + r.d(t, { $n: () => o, IP: () => s, Oy: () => l, v2: () => c }); + var n = r(37), + i = r(1478); + function a(e, t) { + try { + return new URL(e, t); + } catch { + return null; + } + } + function s(e, t) { + let r = new URL(e.substring(5)); + return "blob:" + t.origin.origin + r.pathname; + } + function o(e) { + let t = new URL(e.substring(5)); + return "blob:" + location.origin + t.pathname; + } + function l(e, t) { + if ((e instanceof URL && (e = e.toString()), e.startsWith("javascript:"))) return "javascript:" + (0, i.o)(e.slice(11), "(javascript: url)", t); + { + if (e.startsWith("blob:") || e.startsWith("data:")) return location.origin + n.$W.prefix + e; + if (e.startsWith("mailto:") || e.startsWith("about:")) return e; + let r = t.base.href; + r.startsWith("about:") && (r = c(self.location.href)); + let i = a(e, r); + if (!i) return e; + let s = (0, n.hD)(i.hash.slice(1)); + return (i.hash = ""), location.origin + n.$W.prefix + (0, n.hD)(i.href) + (s ? "#" + s : ""); + } + } + function c(e) { + e instanceof URL && (e = e.toString()); + let t = location.origin + n.$W.prefix; + if (e.startsWith("javascript:")) return e; + { + if (e.startsWith("blob:")) return e; + if (e.startsWith(t + "blob:") || e.startsWith(t + "data:")) return e.substring(t.length); + if (e.startsWith("mailto:") || e.startsWith("about:")) return e; + let r = a(e); + if (!r) return e; + let i = (0, n.P_)(r.hash.slice(1)); + return (r.hash = ""), (0, n.P_)(r.href.slice(t.length) + (i ? "#" + i : "")); + } + } + }, + 1561: function (e, t, r) { + let n; + r.d(t, { n$: () => d, nb: () => g, su: () => h }); + var i = r(3907), + a = r(37), + s = r(1472), + o = r(2393), + l = r(2614), + c = r(1478), + u = r(884); + async function d() { + n = new Uint8Array(await fetch(a.$W.files.wasm).then(e => e.arrayBuffer())); + } + self.WASM && (n = Uint8Array.from(atob(self.WASM), e => e.charCodeAt(0))); + let h = new TextDecoder(), + p = "\0asm".split("").map(e => e.charCodeAt(0)), + f = []; + function g(e) { + let t; + if (!(n instanceof Uint8Array)) throw Error("rewriter wasm not found (was it fetched correctly?)"); + if (![...n.slice(0, 4)].every((e, t) => e === p[t])) throw Error("rewriter wasm does not have wasm magic (was it fetched correctly?)\nrewriter wasm contents: " + h.decode(n)); + (0, i.QR)({ module: new WebAssembly.Module(n) }); + let r = f.findIndex(e => !e.inUse), + d = f.length; + return ( + -1 === r + ? ((0, a.U5)("rewriterLogs", e.base) && console.log(`creating new rewriter, ${d} rewriters made already`), + (t = { + rewriter: new i.LW({ + config: a.$W, + shared: { + rewrite: { + htmlRules: o.V, + rewriteUrl: s.Oy, + rewriteCss: l.s, + rewriteJs: c.o, + getHtmlInjectCode(e, t) { + let r = (0, u.Uk)(e, e => ``).join(""); + return t ? `${r}` : r; + }, + }, + }, + flagEnabled: a.U5, + codec: { encode: a.hD, decode: a.P_ }, + }), + inUse: !1, + }), + f.push(t)) + : ((0, a.U5)("rewriterLogs", e.base) && console.log(`using cached rewriter ${r} from list of ${d} rewriters`), (t = f[r])), + (t.inUse = !0), + [t.rewriter, () => (t.inUse = !1)] + ); + } + }, + 2015: function (e, t, r) { + r.d(t, { i: () => a }); + var n = r(37), + i = r(1478); + function a(e, t, r, a) { + let s = "", + o = "module" === t, + l = e => { + o + ? (s += `import "${n.$W.files[e]}" +`) + : (s += `importScripts("${n.$W.files[e]}"); +`); + }; + l("wasm"), l("all"), (s += `$scramjetLoadClient().loadAndHook(${JSON.stringify(n.$W)});`); + let c = (0, i.o)(e, r, a, o); + return c instanceof Uint8Array && (c = new TextDecoder().decode(c)), (s += c); + } + }, + 6684: function (e, t, r) { + r.d(t, { Sn: () => h, YH: () => u, Yq: () => f, hU: () => d, pL: () => p, rj: () => c }); + var n = r(6570); + let i = { none: 0, "same-origin": 1, "same-site": 2, "cross-site": 3 }; + async function a() { + return (0, n.P2)("$scramjet", 1); + } + async function s(e) { + let t = await a(); + return (await t.get("redirectTrackers", e)) || null; + } + async function o(e, t) { + let r = await a(); + await r.put("redirectTrackers", t, e); + } + async function l(e) { + let t = await a(); + await t.delete("redirectTrackers", e); + } + async function c(e, t, r) { + (await s(e)) || (await o(e, { originalReferrer: t || "", mostRestrictiveSite: r, referrerPolicy: "", chainStarted: Date.now() })); + } + async function u(e, t, r) { + let n = await s(e); + n && (await l(e), r && (n.referrerPolicy = r), await o(t, n)); + } + async function d(e, t) { + let r = await s(e); + if (!r) return t; + let n = i[r.mostRestrictiveSite]; + return (i[t] ?? 0) > n ? ((r.mostRestrictiveSite = t), await o(e, r), t) : r.mostRestrictiveSite; + } + async function h(e) { + await l(e); + } + async function p(e, t, r) { + let n = await a(); + await n.put("referrerPolicies", { policy: t, referrer: r }, e); + } + async function f(e) { + let t = await a(); + return (await t.get("referrerPolicies", e)) || null; + } + }, + 2416: function (e, t, r) { + r(6684), r(8228); + }, + 8228: function (e, t, r) { + r.d(t, { ps: () => l }); + var n = r(6570); + let i = "publicSuffixList"; + async function a() { + return (0, n.P2)("$scramjet", 1); + } + async function s() { + let e = await a(); + return (await e.get("publicSuffixList", i)) || null; + } + async function o(e) { + let t = await a(); + await t.put("publicSuffixList", { data: e, expiry: Date.now() + 36e5 }, i); + } + async function l(e, t, r) { + return t ? (e.origin.origin === t.origin ? "same-origin" : (await c(e.origin, t, r)) ? "same-site" : "cross-site") : "none"; + } + async function c(e, t, r) { + return (await u(e, r)) === (await u(t, r)); + } + async function u(e, t) { + let r = await d(t), + n = e.hostname.toLowerCase().split("."), + i = "", + a = !1; + for (let e of r) { + let t = e.startsWith("!") ? e.substring(1) : e; + if ( + (function (e, t) { + if (e.length < t.length) return !1; + let r = e.length - t.length; + for (let n = 0; n < t.length; n++) { + let i = e[r + n], + a = t[n]; + if ("*" !== a && i !== a) return !1; + } + return !0; + })(n, t.split(".")) + ) { + if (e.startsWith("!")) { + (i = t), (a = !0); + break; + } + !a && t.length > i.length && (i = t); + } + } + if (!i) return n.slice(-2).join("."); + let s = i.split(".").length, + o = a ? s : s + 1; + return n.slice(-o).join("."); + } + async function d(e) { + let t, + r = await s(); + if (r && Date.now() < r.expiry) return r.data; + try { + t = await e.fetch("https://publicsuffix.org/list/public_suffix_list.dat"); + } catch (e) { + throw Error(`Failed to fetch public suffix list: ${e}`); + } + let n = (await t.text()) + .split("\n") + .map(e => { + let t = e.trim(), + r = t.indexOf(" "); + return r > -1 ? t.substring(0, r) : t; + }) + .filter(e => e && !e.startsWith("//")); + return await o(n), n; + } + }, + 2794: function (e, t, r) { + r.d(t, { pX: () => n, zr: () => i }); + let n = Symbol.for("scramjet client global"), + i = Symbol.for("scramjet frame handle"); + }, + 5956: function (e, t, r) { + function n(e, t) { + let r = ` errorTrace.value = ${JSON.stringify(e)}; fetchedURL.textContent = ${JSON.stringify(t)}; for (const node of document.querySelectorAll("#hostname")) node.textContent = ${JSON.stringify(location.hostname)}; reload.addEventListener("click", () => location.reload()); - version.textContent = ${JSON.stringify(globalThis.$scramjetVersion?.version||"unknown")}; - build.textContent = ${JSON.stringify(globalThis.$scramjetVersion?.build||"unknown")}; + version.textContent = ${JSON.stringify(globalThis.$scramjetVersion?.version || "unknown")}; + build.textContent = ${JSON.stringify(globalThis.$scramjetVersion?.build || "unknown")}; document.getElementById('copy-button').addEventListener('click', async () => { const text = document.getElementById('errorTrace').value; @@ -33,7 +3238,8 @@ ${l}`}}if((0,n.U5)("rewriterLogs",r.base))for(let e of s.errors)console.error("o btn.textContent = 'Copied!'; setTimeout(() => btn.textContent = 'Copy', 2000); }); - `;return` + `; + return ` @@ -185,12 +3391,2461 @@ ${l}`}}if((0,n.U5)("rewriterLogs",r.base))for(let e of s.errors)console.error("o

Scramjet v (build )

- + - `}function i(e,t){let r={"content-type":"text/html"};return crossOriginIsolated&&(r["Cross-Origin-Embedder-Policy"]="require-corp"),new Response(n(String(e),t),{status:500,headers:r})}r.d(t,{B:()=>n,v:()=>i})},1403:function(e,t,r){r.d(t,{H:()=>n});class n{handle;origin;syncToken=0;promises={};messageChannel=new MessageChannel;connected=!1;constructor(e,t){this.handle=e,this.origin=t,this.messageChannel.port1.addEventListener("message",e=>{"scramjet$type"in e.data&&("init"===e.data.scramjet$type?this.connected=!0:this.handleMessage(e.data))}),this.messageChannel.port1.start(),this.handle.postMessage({scramjet$type:"init",scramjet$port:this.messageChannel.port2},[this.messageChannel.port2])}handleMessage(e){let t=this.promises[e.scramjet$token];t&&(t(e),delete this.promises[e.scramjet$token])}async fetch(e){let t=this.syncToken++,r={scramjet$type:"fetch",scramjet$token:t,scramjet$request:{url:e.url,body:e.body,headers:Array.from(e.headers.entries()),method:e.method,mode:e.mode,destinitation:e.destination}},n=e.body?[e.body]:[];this.handle.postMessage(r,n);let{scramjet$response:i}=await new Promise(e=>{this.promises[t]=e});return!!i&&new Response(i.body,{headers:i.headers,status:i.status,statusText:i.statusText})}}},5790:function(e,t,r){r.d(t,{Pf:()=>m,V3:()=>S,dT:()=>w});var n=r(5956),i=r(8228),a=r(6684),s=r(1472),o=r(1478),l=r(1427),c=r(37),u=r(4435),d=r(884),h=r(2614),p=r(2015),f=r(8665).A;function g(e){return e.status>=300&&e.status<400}async function m(e,t){try{let r,n,o=new URL(e.url);if(o.pathname===this.config.files.wasm)return fetch(this.config.files.wasm).then(async e=>{let t=await e.arrayBuffer(),r=btoa(new Uint8Array(t).reduce((e,t)=>(e.push(String.fromCharCode(t)),e),[]).join("")),n="";return n+=`if ('document' in self && document.currentScript) { document.currentScript.remove(); } -self.WASM = '${r}';`,new Response(n,{headers:{"content-type":"text/javascript"}})});let u="",d={};for(let[e,t]of[...o.searchParams.entries()]){switch(e){case"type":u=t;break;case"dest":break;case"topFrame":r=t;break;case"parentFrame":n=t;break;default:f.warn(`${o.href} extraneous query parameter ${e}. Assuming
element`),d[e]=t}o.searchParams.delete(e)}let h=new URL((0,s.v2)(o));for(let[e,t]of Object.entries(d))h.searchParams.set(e,t);let p={origin:h,base:h,topFrameName:r,parentFrameName:n};if(o.pathname.startsWith(`${this.config.prefix}blob:`)||o.pathname.startsWith(`${this.config.prefix}data:`)){let t,r=o.pathname.substring(this.config.prefix.length);r.startsWith("blob:")&&(r=(0,s.$n)(r));let n=await fetch(r,{});n.finalURL=r.startsWith("blob:")?r:"(data url)",n.body&&(t=await b(n,p,e.destination,u,this.cookieStore));let i=Object.fromEntries(n.headers.entries());return crossOriginIsolated&&(i["Cross-Origin-Opener-Policy"]="same-origin",i["Cross-Origin-Embedder-Policy"]="require-corp"),new Response(t,{status:n.status,statusText:n.statusText,headers:i})}let g=this.serviceWorkers.find(e=>e.origin===h.origin);if(g?.connected&&"swruntime"!==o.searchParams.get("from")){let t=await g.fetch(e);if(t)return t}if(h.origin===new URL(e.url).origin)throw Error("attempted to fetch from same origin - this means the site has obtained a reference to the real origin, aborting");let m=new l.u;for(let[t,r]of e.headers.entries())m.set(t,r);if(t&&new URL(t.url).pathname.startsWith(c.$W.prefix)){let e=new URL((0,s.v2)(t.url));e.toString().includes("youtube.com")||(m.set("Referer",e.href),m.set("Origin",e.origin))}let w=this.cookieStore.getCookies(h,!1);w.length&&m.set("Cookie",w);let v=!1;if("iframe"===e.destination&&"navigate"===e.mode&&e.referrer&&"no-referrer"!==e.referrer&&e.referrer!==location.origin+c.$W.prefix+"no-referrer"){let t=e.referrer,r=await self.clients.matchAll({type:"window"});for(;t;){if(!t.includes(c.$W.prefix)){v=!0;break}let e=r.find(e=>e.url===t),n=await (0,a.Yq)(t);if(!n||!n.referrer){e&&t.startsWith(location.origin)&&(v=!0);break}if(e&&"nested"===e.frameType)t=n.referrer;else break}}v?(m.set("Sec-Fetch-Dest","document"),m.set("Sec-Fetch-Mode","navigate")):(m.set("Sec-Fetch-Dest",e.destination||"empty"),m.set("Sec-Fetch-Mode",e.mode));let x="none";if(e.referrer&&""!==e.referrer&&"no-referrer"!==e.referrer&&e.referrer!==location.origin+c.$W.prefix+"no-referrer"&&e.referrer.includes(c.$W.prefix)){let t=(0,s.v2)(e.referrer);if(t){let e=new URL(t);x=await (0,i.ps)(p,e,this.client)}}await (0,a.rj)(h.toString(),e.referrer?(0,s.v2)(e.referrer):null,x),m.set("Sec-Fetch-Site",await (0,a.hU)(h.toString(),x));let E=new S(h,m.headers,e.body,e.method,e.destination,t);this.dispatchEvent(E);let T=await E.response||await this.client.fetch(E.url,{method:E.method,body:E.body,headers:E.requestHeaders,credentials:"omit",mode:"cors"===e.mode?e.mode:"same-origin",cache:e.cache,redirect:"manual",duplex:"half"});return T.finalURL=E.url.href,await y(h,p,u,e.destination,e.mode,T,this.cookieStore,t,this.client,this,e.referrer)}catch(i){let t={message:i.message,url:e.url,destination:e.destination};if(i.cause&&(t.cause=i.cause,i.cause instanceof AggregateError&&(t.causeErrors=i.cause.errors)),i.stack&&(t.stack=i.stack),console.error("ERROR FROM SERVICE WORKER FETCH: ",t),console.error(i),!["document","iframe"].includes(e.destination))return new Response(void 0,{status:500});let r=Object.entries(t).map(([e,t])=>`${e.charAt(0).toUpperCase()+e.slice(1)}: ${t}`).join("\n\n");return(0,n.v)(r,(0,s.v2)(e.url))}}async function y(e,t,r,n,o,l,d,h,p,f,m){let y,S="navigate"===o&&["document","iframe"].includes(n),v=await (0,u.l)(l.rawHeaders,t,p,{get:a.Yq,set:a.pL});if(S&&v["referrer-policy"]&&m&&await (0,a.pL)(e.href,v["referrer-policy"],m),g(l)){let t=new URL((0,s.v2)(v.location));await (0,a.YH)(e.toString(),t.toString(),v["referrer-policy"]);let n=await (0,i.ps)({origin:t,base:t},e,p);if(await (0,a.hU)(t.toString(),n),r){let e=new URL(v.location);e.searchParams.set("type",r),v.location=e.href}}let x=v["set-cookie"]||[];for(let t in x)if(h){let r=f.dispatch(h,{scramjet$type:"cookie",cookie:t,url:e.href});"document"!==n&&"iframe"!==n&&await r}for(let t in await d.setCookies(x instanceof Array?x:[x],e),v)Array.isArray(v[t])&&(v[t]=v[t][0]);if(function(e,t){if(["document","iframe"].includes(t)){let t=e["content-disposition"];if(t){if("inline"!==t)return!0}else{let t=e["content-type"]?.split(";")[0].trim().toLowerCase();if(t&&!["text/html","text/plain","text/css","text/javascript","text/xml","application/javascript","application/json","application/xml","application/pdf"].includes(t)&&!t.startsWith("text")&&!t.startsWith("image")&&!t.startsWith("font")&&!t.startsWith("video"))return!0}}return!1}(v,n)&&!g(l))if((0,c.U5)("interceptDownloads",e)){if(!h)throw Error("cant find client");let t=null,r=v["content-disposition"];if("string"==typeof r){let e=r.match(/filename=["']?([^"';\n]*)["']?/i);e&&e[1]&&(t=e[1])}let n=v["content-length"],i=await clients.matchAll({});if((i=i.filter(e=>!e.url.includes(c.$W.prefix))).length<1)throw Error("couldn't find a controller client to dispatch download to");let a={filename:t,url:e.href,type:v["content-type"],body:l.body,length:Number(n)};i[0].postMessage({scramjet$type:"download",download:a},[l.body]),await new Promise(()=>{})}else{let e=v["content-disposition"];if(!/\s*?((inline|attachment);\s*?)filename=/i.test(e)){let t=/^\s*?attachment/i.test(e)?"attachment":"inline",[r]=new URL(l.finalURL).pathname.split("/").slice(-1);v["content-disposition"]=`${t}; filename=${JSON.stringify(r)}`}}l.body&&!g(l)&&(y=await b(l,t,n,r,d)),"text/event-stream"===v.accept&&(v["content-type"]="text/event-stream"),delete v["permissions-policy"],crossOriginIsolated&&["document","iframe","worker","sharedworker","style","script"].includes(n)&&(v["Cross-Origin-Embedder-Policy"]="require-corp",v["Cross-Origin-Opener-Policy"]="same-origin");let E=new w(y,v,l.status,l.statusText,n,e,l,h);return f.dispatchEvent(E),g(l)||await (0,a.Sn)(e.toString()),new Response(E.responseBody,{headers:E.responseHeaders,status:E.status,statusText:E.statusText})}async function b(e,t,r,n,i){switch(r){case"iframe":case"document":if(e.headers.get("content-type")?.startsWith("text/html"))return(0,d.Qs)(await e.text(),i,t,!0);return e.body;case"script":return(0,o.o)(new Uint8Array(await e.arrayBuffer()),e.finalURL,t,"module"===n);case"style":return(0,h.s)(await e.text(),t);case"sharedworker":case"worker":return(0,p.i)(new Uint8Array(await e.arrayBuffer()),n,e.finalURL,t);default:return e.body}}class w extends Event{responseBody;responseHeaders;status;statusText;destination;url;rawResponse;client;constructor(e,t,r,n,i,a,s,o){super("handleResponse"),this.responseBody=e,this.responseHeaders=t,this.status=r,this.statusText=n,this.destination=i,this.url=a,this.rawResponse=s,this.client=o}}class S extends Event{url;requestHeaders;body;method;destination;client;constructor(e,t,r,n,i,a){super("request"),this.url=e,this.requestHeaders=t,this.body=r,this.method=n,this.destination=i,this.client=a}response}},7510:function(e,t,r){r.r(t),r.d(t,{FakeServiceWorker:()=>n.H,ScramjetHandleResponseEvent:()=>i.dT,ScramjetRequestEvent:()=>i.V3,ScramjetServiceWorker:()=>d,errorTemplate:()=>u.B,handleFetch:()=>i.Pf,renderError:()=>u.v});var n=r(1403),i=r(5790),a=r(4110),s=r(1561),o=r(3831),l=r(6570),c=r(37),u=r(5956);class d extends EventTarget{client;config;syncPool={};synctoken=0;cookieStore=new o.k;serviceWorkers=[];constructor(){super(),this.client=new a.Ay,(async()=>{let e=await (0,l.P2)("$scramjet",1),t=await e.get("cookies","cookies");t&&this.cookieStore.load(t)})(),addEventListener("message",async({data:e})=>{if("scramjet$type"in e){if("scramjet$token"in e){let t=this.syncPool[e.scramjet$token];delete this.syncPool[e.scramjet$token],t(e);return}if("registerServiceWorker"===e.scramjet$type)return void this.serviceWorkers.push(new n.H(e.port,e.origin));if("cookie"===e.scramjet$type){this.cookieStore.setCookies([e.cookie],new URL(e.url));let t=await (0,l.P2)("$scramjet",1);await t.put("cookies",JSON.parse(this.cookieStore.dump()),"cookies")}"loadConfig"===e.scramjet$type&&(this.config=e.config)}})}async dispatch(e,t){let r,n=this.synctoken++,i=new Promise(e=>r=e);return this.syncPool[n]=r,t.scramjet$token=n,e.postMessage(t),await i}async loadConfig(){if(this.config)return;let e=await (0,l.P2)("$scramjet",1);this.config=await e.get("config","config"),this.config&&((0,c.Nk)(this.config),await (0,s.n$)())}route({request:e}){return!!e.url.startsWith(location.origin+this.config.prefix)||!!e.url.startsWith(location.origin+this.config.files.wasm)}async fetch({request:e,clientId:t}){this.config||await this.loadConfig();let r=await self.clients.get(t);return i.Pf.call(this,e,r)}}},4110:function(e,t,r){r.d(t,{Ay:()=>S,DD:()=>w});let n=globalThis.fetch,i=globalThis.SharedWorker,a=globalThis.localStorage,s=globalThis.navigator.serviceWorker,o=MessagePort.prototype.postMessage,l={prototype:{send:WebSocket.prototype.send},CLOSED:WebSocket.CLOSED,CLOSING:WebSocket.CLOSING,CONNECTING:WebSocket.CONNECTING,OPEN:WebSocket.OPEN};async function c(){let e=Promise.race([Promise.any((await self.clients.matchAll({type:"window",includeUncontrolled:!0})).map(async e=>{let t,r=await (t=new MessageChannel,new Promise(r=>{e.postMessage({type:"getPort",port:t.port2},[t.port2]),t.port1.onmessage=e=>{r(e.data)}}));return await u(r),r})),new Promise((e,t)=>setTimeout(t,1e3,TypeError("timeout")))]);try{return await e}catch(e){if(e instanceof AggregateError)throw console.error("bare-mux: failed to get a bare-mux SharedWorker MessagePort as all clients returned an invalid MessagePort."),Error("All clients returned an invalid MessagePort.",{cause:e});return console.warn("bare-mux: failed to get a bare-mux SharedWorker MessagePort within 1s, retrying"),await c()}}function u(e){let t=new MessageChannel,r=new Promise((e,r)=>{t.port1.onmessage=t=>{"pong"===t.data.type&&e()},setTimeout(r,1500)});return o.call(e,{message:{type:"ping"},port:t.port2},[t.port2]),r}function d(e,t){let r=new i(e,"bare-mux-worker");return t&&s.addEventListener("message",t=>{if("getPort"===t.data.type&&t.data.port){console.debug("bare-mux: recieved request for port from sw");let r=new i(e,"bare-mux-worker");o.call(t.data.port,r.port,[r.port])}}),r.port}let h=null;class p{channel;port;workerPath;constructor(e){this.channel=new BroadcastChannel("bare-mux"),e instanceof MessagePort||e instanceof Promise?this.port=e:this.createChannel(e,!0)}createChannel(e,t){if(self.clients)this.port=c(),this.channel.onmessage=e=>{"refreshPort"===e.data.type&&(this.port=c())};else if(e&&SharedWorker){if(!e.startsWith("/")&&!e.includes(":"))throw Error("Invalid URL. Must be absolute or start at the root.");this.port=d(e,t),console.debug("bare-mux: setting localStorage bare-mux-path to",e),a["bare-mux-path"]=e}else{if(!SharedWorker)throw Error("Unable to get a channel to the SharedWorker.");{let e=a["bare-mux-path"];if(console.debug("bare-mux: got localStorage bare-mux-path:",e),!e)throw Error("Unable to get bare-mux workerPath from localStorage.");this.port=d(e,t)}}}async sendMessage(e,t){this.port instanceof Promise&&(this.port=await this.port);try{await u(this.port)}catch{return console.warn("bare-mux: Failed to get a ping response from the worker within 1.5s. Assuming port is dead."),this.createChannel(),await this.sendMessage(e,t)}let r=new MessageChannel,n=[r.port2,...t||[]],i=new Promise((e,t)=>{r.port1.onmessage=r=>{let n=r.data;"error"===n.type?t(n.error):e(n)}});return o.call(this.port,{message:e,port:r.port2},n),await i}}class f extends EventTarget{protocols;url;readyState=l.CONNECTING;channel;constructor(e,t=[],r,n){super(),this.protocols=t,this.url=e.toString(),this.protocols=t;const i=e=>{this.protocols=e,this.readyState=l.OPEN;let t=new Event("open");this.dispatchEvent(t)},a=async e=>{let t=new MessageEvent("message",{data:e});this.dispatchEvent(t)},s=(e,t)=>{this.readyState=l.CLOSED;let r=new CloseEvent("close",{code:e,reason:t});this.dispatchEvent(r)},o=()=>{this.readyState=l.CLOSED;let e=new Event("error");this.dispatchEvent(e)};this.channel=new MessageChannel,this.channel.port1.onmessage=e=>{"open"===e.data.type?i(e.data.args[0]):"message"===e.data.type?a(e.data.args[0]):"close"===e.data.type?s(e.data.args[0],e.data.args[1]):"error"===e.data.type&&o()},r.sendMessage({type:"websocket",websocket:{url:e.toString(),protocols:t,requestHeaders:n,channel:this.channel.port2}},[this.channel.port2])}send(...e){if(this.readyState===l.CONNECTING)throw new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.");let t=e[0];t.buffer&&(t=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)),o.call(this.channel.port1,{type:"data",data:t},t instanceof ArrayBuffer?[t]:[])}close(e,t){o.call(this.channel.port1,{type:"close",closeCode:e,closeReason:t})}}function g(e,t,r){console.error(`error while processing '${r}': `,t),e.postMessage({type:"error",error:t})}let m=["ws:","wss:"],y=[101,204,205,304],b=[301,302,303,307,308];class w{worker;constructor(e){this.worker=new p(e)}async getTransport(){return(await this.worker.sendMessage({type:"get"})).name}async setTransport(e,t,r){await this.setManualTransport(` + `; + } + function i(e, t) { + let r = { "content-type": "text/html" }; + return crossOriginIsolated && (r["Cross-Origin-Embedder-Policy"] = "require-corp"), new Response(n(String(e), t), { status: 500, headers: r }); + } + r.d(t, { B: () => n, v: () => i }); + }, + 1403: function (e, t, r) { + r.d(t, { H: () => n }); + class n { + handle; + origin; + syncToken = 0; + promises = {}; + messageChannel = new MessageChannel(); + connected = !1; + constructor(e, t) { + (this.handle = e), + (this.origin = t), + this.messageChannel.port1.addEventListener("message", e => { + "scramjet$type" in e.data && ("init" === e.data.scramjet$type ? (this.connected = !0) : this.handleMessage(e.data)); + }), + this.messageChannel.port1.start(), + this.handle.postMessage({ scramjet$type: "init", scramjet$port: this.messageChannel.port2 }, [this.messageChannel.port2]); + } + handleMessage(e) { + let t = this.promises[e.scramjet$token]; + t && (t(e), delete this.promises[e.scramjet$token]); + } + async fetch(e) { + let t = this.syncToken++, + r = { scramjet$type: "fetch", scramjet$token: t, scramjet$request: { url: e.url, body: e.body, headers: Array.from(e.headers.entries()), method: e.method, mode: e.mode, destinitation: e.destination } }, + n = e.body ? [e.body] : []; + this.handle.postMessage(r, n); + let { scramjet$response: i } = await new Promise(e => { + this.promises[t] = e; + }); + return !!i && new Response(i.body, { headers: i.headers, status: i.status, statusText: i.statusText }); + } + } + }, + 5790: function (e, t, r) { + r.d(t, { Pf: () => m, V3: () => S, dT: () => w }); + var n = r(5956), + i = r(8228), + a = r(6684), + s = r(1472), + o = r(1478), + l = r(1427), + c = r(37), + u = r(4435), + d = r(884), + h = r(2614), + p = r(2015), + f = r(8665).A; + function g(e) { + return e.status >= 300 && e.status < 400; + } + async function m(e, t) { + try { + let r, + n, + o = new URL(e.url); + if (o.pathname === this.config.files.wasm) + return fetch(this.config.files.wasm).then(async e => { + let t = await e.arrayBuffer(), + r = btoa(new Uint8Array(t).reduce((e, t) => (e.push(String.fromCharCode(t)), e), []).join("")), + n = ""; + return ( + (n += `if ('document' in self && document.currentScript) { document.currentScript.remove(); } +self.WASM = '${r}';`), + new Response(n, { headers: { "content-type": "text/javascript" } }) + ); + }); + let u = "", + d = {}; + for (let [e, t] of [...o.searchParams.entries()]) { + switch (e) { + case "type": + u = t; + break; + case "dest": + break; + case "topFrame": + r = t; + break; + case "parentFrame": + n = t; + break; + default: + f.warn(`${o.href} extraneous query parameter ${e}. Assuming element`), (d[e] = t); + } + o.searchParams.delete(e); + } + let h = new URL((0, s.v2)(o)); + for (let [e, t] of Object.entries(d)) h.searchParams.set(e, t); + let p = { origin: h, base: h, topFrameName: r, parentFrameName: n }; + if (o.pathname.startsWith(`${this.config.prefix}blob:`) || o.pathname.startsWith(`${this.config.prefix}data:`)) { + let t, + r = o.pathname.substring(this.config.prefix.length); + r.startsWith("blob:") && (r = (0, s.$n)(r)); + let n = await fetch(r, {}); + (n.finalURL = r.startsWith("blob:") ? r : "(data url)"), n.body && (t = await b(n, p, e.destination, u, this.cookieStore)); + let i = Object.fromEntries(n.headers.entries()); + return crossOriginIsolated && ((i["Cross-Origin-Opener-Policy"] = "same-origin"), (i["Cross-Origin-Embedder-Policy"] = "require-corp")), new Response(t, { status: n.status, statusText: n.statusText, headers: i }); + } + let g = this.serviceWorkers.find(e => e.origin === h.origin); + if (g?.connected && "swruntime" !== o.searchParams.get("from")) { + let t = await g.fetch(e); + if (t) return t; + } + if (h.origin === new URL(e.url).origin) throw Error("attempted to fetch from same origin - this means the site has obtained a reference to the real origin, aborting"); + let m = new l.u(); + for (let [t, r] of e.headers.entries()) m.set(t, r); + if (t && new URL(t.url).pathname.startsWith(c.$W.prefix)) { + let e = new URL((0, s.v2)(t.url)); + e.toString().includes("youtube.com") || (m.set("Referer", e.href), m.set("Origin", e.origin)); + } + let w = this.cookieStore.getCookies(h, !1); + w.length && m.set("Cookie", w); + let v = !1; + if ("iframe" === e.destination && "navigate" === e.mode && e.referrer && "no-referrer" !== e.referrer && e.referrer !== location.origin + c.$W.prefix + "no-referrer") { + let t = e.referrer, + r = await self.clients.matchAll({ type: "window" }); + for (; t; ) { + if (!t.includes(c.$W.prefix)) { + v = !0; + break; + } + let e = r.find(e => e.url === t), + n = await (0, a.Yq)(t); + if (!n || !n.referrer) { + e && t.startsWith(location.origin) && (v = !0); + break; + } + if (e && "nested" === e.frameType) t = n.referrer; + else break; + } + } + v ? (m.set("Sec-Fetch-Dest", "document"), m.set("Sec-Fetch-Mode", "navigate")) : (m.set("Sec-Fetch-Dest", e.destination || "empty"), m.set("Sec-Fetch-Mode", e.mode)); + let x = "none"; + if (e.referrer && "" !== e.referrer && "no-referrer" !== e.referrer && e.referrer !== location.origin + c.$W.prefix + "no-referrer" && e.referrer.includes(c.$W.prefix)) { + let t = (0, s.v2)(e.referrer); + if (t) { + let e = new URL(t); + x = await (0, i.ps)(p, e, this.client); + } + } + await (0, a.rj)(h.toString(), e.referrer ? (0, s.v2)(e.referrer) : null, x), m.set("Sec-Fetch-Site", await (0, a.hU)(h.toString(), x)); + let E = new S(h, m.headers, e.body, e.method, e.destination, t); + this.dispatchEvent(E); + let T = (await E.response) || (await this.client.fetch(E.url, { method: E.method, body: E.body, headers: E.requestHeaders, credentials: "omit", mode: "cors" === e.mode ? e.mode : "same-origin", cache: e.cache, redirect: "manual", duplex: "half" })); + return (T.finalURL = E.url.href), await y(h, p, u, e.destination, e.mode, T, this.cookieStore, t, this.client, this, e.referrer); + } catch (i) { + let t = { message: i.message, url: e.url, destination: e.destination }; + if ((i.cause && ((t.cause = i.cause), i.cause instanceof AggregateError && (t.causeErrors = i.cause.errors)), i.stack && (t.stack = i.stack), console.error("ERROR FROM SERVICE WORKER FETCH: ", t), console.error(i), !["document", "iframe"].includes(e.destination))) + return new Response(void 0, { status: 500 }); + let r = Object.entries(t) + .map(([e, t]) => `${e.charAt(0).toUpperCase() + e.slice(1)}: ${t}`) + .join("\n\n"); + return (0, n.v)(r, (0, s.v2)(e.url)); + } + } + async function y(e, t, r, n, o, l, d, h, p, f, m) { + let y, + S = "navigate" === o && ["document", "iframe"].includes(n), + v = await (0, u.l)(l.rawHeaders, t, p, { get: a.Yq, set: a.pL }); + if ((S && v["referrer-policy"] && m && (await (0, a.pL)(e.href, v["referrer-policy"], m)), g(l))) { + let t = new URL((0, s.v2)(v.location)); + await (0, a.YH)(e.toString(), t.toString(), v["referrer-policy"]); + let n = await (0, i.ps)({ origin: t, base: t }, e, p); + if ((await (0, a.hU)(t.toString(), n), r)) { + let e = new URL(v.location); + e.searchParams.set("type", r), (v.location = e.href); + } + } + let x = v["set-cookie"] || []; + for (let t in x) + if (h) { + let r = f.dispatch(h, { scramjet$type: "cookie", cookie: t, url: e.href }); + "document" !== n && "iframe" !== n && (await r); + } + for (let t in (await d.setCookies(x instanceof Array ? x : [x], e), v)) Array.isArray(v[t]) && (v[t] = v[t][0]); + if ( + (function (e, t) { + if (["document", "iframe"].includes(t)) { + let t = e["content-disposition"]; + if (t) { + if ("inline" !== t) return !0; + } else { + let t = e["content-type"]?.split(";")[0].trim().toLowerCase(); + if (t && !["text/html", "text/plain", "text/css", "text/javascript", "text/xml", "application/javascript", "application/json", "application/xml", "application/pdf"].includes(t) && !t.startsWith("text") && !t.startsWith("image") && !t.startsWith("font") && !t.startsWith("video")) return !0; + } + } + return !1; + })(v, n) && + !g(l) + ) + if ((0, c.U5)("interceptDownloads", e)) { + if (!h) throw Error("cant find client"); + let t = null, + r = v["content-disposition"]; + if ("string" == typeof r) { + let e = r.match(/filename=["']?([^"';\n]*)["']?/i); + e && e[1] && (t = e[1]); + } + let n = v["content-length"], + i = await clients.matchAll({}); + if ((i = i.filter(e => !e.url.includes(c.$W.prefix))).length < 1) throw Error("couldn't find a controller client to dispatch download to"); + let a = { filename: t, url: e.href, type: v["content-type"], body: l.body, length: Number(n) }; + i[0].postMessage({ scramjet$type: "download", download: a }, [l.body]), await new Promise(() => {}); + } else { + let e = v["content-disposition"]; + if (!/\s*?((inline|attachment);\s*?)filename=/i.test(e)) { + let t = /^\s*?attachment/i.test(e) ? "attachment" : "inline", + [r] = new URL(l.finalURL).pathname.split("/").slice(-1); + v["content-disposition"] = `${t}; filename=${JSON.stringify(r)}`; + } + } + l.body && !g(l) && (y = await b(l, t, n, r, d)), + "text/event-stream" === v.accept && (v["content-type"] = "text/event-stream"), + delete v["permissions-policy"], + crossOriginIsolated && ["document", "iframe", "worker", "sharedworker", "style", "script"].includes(n) && ((v["Cross-Origin-Embedder-Policy"] = "require-corp"), (v["Cross-Origin-Opener-Policy"] = "same-origin")); + let E = new w(y, v, l.status, l.statusText, n, e, l, h); + return f.dispatchEvent(E), g(l) || (await (0, a.Sn)(e.toString())), new Response(E.responseBody, { headers: E.responseHeaders, status: E.status, statusText: E.statusText }); + } + async function b(e, t, r, n, i) { + switch (r) { + case "iframe": + case "document": + if (e.headers.get("content-type")?.startsWith("text/html")) return (0, d.Qs)(await e.text(), i, t, !0); + return e.body; + case "script": + return (0, o.o)(new Uint8Array(await e.arrayBuffer()), e.finalURL, t, "module" === n); + case "style": + return (0, h.s)(await e.text(), t); + case "sharedworker": + case "worker": + return (0, p.i)(new Uint8Array(await e.arrayBuffer()), n, e.finalURL, t); + default: + return e.body; + } + } + class w extends Event { + responseBody; + responseHeaders; + status; + statusText; + destination; + url; + rawResponse; + client; + constructor(e, t, r, n, i, a, s, o) { + super("handleResponse"), (this.responseBody = e), (this.responseHeaders = t), (this.status = r), (this.statusText = n), (this.destination = i), (this.url = a), (this.rawResponse = s), (this.client = o); + } + } + class S extends Event { + url; + requestHeaders; + body; + method; + destination; + client; + constructor(e, t, r, n, i, a) { + super("request"), (this.url = e), (this.requestHeaders = t), (this.body = r), (this.method = n), (this.destination = i), (this.client = a); + } + response; + } + }, + 7510: function (e, t, r) { + r.r(t), r.d(t, { FakeServiceWorker: () => n.H, ScramjetHandleResponseEvent: () => i.dT, ScramjetRequestEvent: () => i.V3, ScramjetServiceWorker: () => d, errorTemplate: () => u.B, handleFetch: () => i.Pf, renderError: () => u.v }); + var n = r(1403), + i = r(5790), + a = r(4110), + s = r(1561), + o = r(3831), + l = r(6570), + c = r(37), + u = r(5956); + class d extends EventTarget { + client; + config; + syncPool = {}; + synctoken = 0; + cookieStore = new o.k(); + serviceWorkers = []; + constructor() { + super(), + (this.client = new a.Ay()), + (async () => { + let e = await (0, l.P2)("$scramjet", 1), + t = await e.get("cookies", "cookies"); + t && this.cookieStore.load(t); + })(), + addEventListener("message", async ({ data: e }) => { + if ("scramjet$type" in e) { + if ("scramjet$token" in e) { + let t = this.syncPool[e.scramjet$token]; + delete this.syncPool[e.scramjet$token], t(e); + return; + } + if ("registerServiceWorker" === e.scramjet$type) return void this.serviceWorkers.push(new n.H(e.port, e.origin)); + if ("cookie" === e.scramjet$type) { + this.cookieStore.setCookies([e.cookie], new URL(e.url)); + let t = await (0, l.P2)("$scramjet", 1); + await t.put("cookies", JSON.parse(this.cookieStore.dump()), "cookies"); + } + "loadConfig" === e.scramjet$type && (this.config = e.config); + } + }); + } + async dispatch(e, t) { + let r, + n = this.synctoken++, + i = new Promise(e => (r = e)); + return (this.syncPool[n] = r), (t.scramjet$token = n), e.postMessage(t), await i; + } + async loadConfig() { + if (this.config) return; + let e = await (0, l.P2)("$scramjet", 1); + (this.config = await e.get("config", "config")), this.config && ((0, c.Nk)(this.config), await (0, s.n$)()); + } + route({ request: e }) { + return !!e.url.startsWith(location.origin + this.config.prefix) || !!e.url.startsWith(location.origin + this.config.files.wasm); + } + async fetch({ request: e, clientId: t }) { + this.config || (await this.loadConfig()); + let r = await self.clients.get(t); + return i.Pf.call(this, e, r); + } + } + }, + 4110: function (e, t, r) { + r.d(t, { Ay: () => S, DD: () => w }); + let n = globalThis.fetch, + i = globalThis.SharedWorker, + a = globalThis.localStorage, + s = globalThis.navigator.serviceWorker, + o = MessagePort.prototype.postMessage, + l = { prototype: { send: WebSocket.prototype.send }, CLOSED: WebSocket.CLOSED, CLOSING: WebSocket.CLOSING, CONNECTING: WebSocket.CONNECTING, OPEN: WebSocket.OPEN }; + async function c() { + let e = Promise.race([ + Promise.any( + (await self.clients.matchAll({ type: "window", includeUncontrolled: !0 })).map(async e => { + let t, + r = await ((t = new MessageChannel()), + new Promise(r => { + e.postMessage({ type: "getPort", port: t.port2 }, [t.port2]), + (t.port1.onmessage = e => { + r(e.data); + }); + })); + return await u(r), r; + }), + ), + new Promise((e, t) => setTimeout(t, 1e3, TypeError("timeout"))), + ]); + try { + return await e; + } catch (e) { + if (e instanceof AggregateError) throw (console.error("bare-mux: failed to get a bare-mux SharedWorker MessagePort as all clients returned an invalid MessagePort."), Error("All clients returned an invalid MessagePort.", { cause: e })); + return console.warn("bare-mux: failed to get a bare-mux SharedWorker MessagePort within 1s, retrying"), await c(); + } + } + function u(e) { + let t = new MessageChannel(), + r = new Promise((e, r) => { + (t.port1.onmessage = t => { + "pong" === t.data.type && e(); + }), + setTimeout(r, 1500); + }); + return o.call(e, { message: { type: "ping" }, port: t.port2 }, [t.port2]), r; + } + function d(e, t) { + let r = new i(e, "bare-mux-worker"); + return ( + t && + s.addEventListener("message", t => { + if ("getPort" === t.data.type && t.data.port) { + console.debug("bare-mux: recieved request for port from sw"); + let r = new i(e, "bare-mux-worker"); + o.call(t.data.port, r.port, [r.port]); + } + }), + r.port + ); + } + let h = null; + class p { + channel; + port; + workerPath; + constructor(e) { + (this.channel = new BroadcastChannel("bare-mux")), e instanceof MessagePort || e instanceof Promise ? (this.port = e) : this.createChannel(e, !0); + } + createChannel(e, t) { + if (self.clients) + (this.port = c()), + (this.channel.onmessage = e => { + "refreshPort" === e.data.type && (this.port = c()); + }); + else if (e && SharedWorker) { + if (!e.startsWith("/") && !e.includes(":")) throw Error("Invalid URL. Must be absolute or start at the root."); + (this.port = d(e, t)), console.debug("bare-mux: setting localStorage bare-mux-path to", e), (a["bare-mux-path"] = e); + } else { + if (!SharedWorker) throw Error("Unable to get a channel to the SharedWorker."); + { + let e = a["bare-mux-path"]; + if ((console.debug("bare-mux: got localStorage bare-mux-path:", e), !e)) throw Error("Unable to get bare-mux workerPath from localStorage."); + this.port = d(e, t); + } + } + } + async sendMessage(e, t) { + this.port instanceof Promise && (this.port = await this.port); + try { + await u(this.port); + } catch { + return console.warn("bare-mux: Failed to get a ping response from the worker within 1.5s. Assuming port is dead."), this.createChannel(), await this.sendMessage(e, t); + } + let r = new MessageChannel(), + n = [r.port2, ...(t || [])], + i = new Promise((e, t) => { + r.port1.onmessage = r => { + let n = r.data; + "error" === n.type ? t(n.error) : e(n); + }; + }); + return o.call(this.port, { message: e, port: r.port2 }, n), await i; + } + } + class f extends EventTarget { + protocols; + url; + readyState = l.CONNECTING; + channel; + constructor(e, t = [], r, n) { + super(), (this.protocols = t), (this.url = e.toString()), (this.protocols = t); + const i = e => { + (this.protocols = e), (this.readyState = l.OPEN); + let t = new Event("open"); + this.dispatchEvent(t); + }, + a = async e => { + let t = new MessageEvent("message", { data: e }); + this.dispatchEvent(t); + }, + s = (e, t) => { + this.readyState = l.CLOSED; + let r = new CloseEvent("close", { code: e, reason: t }); + this.dispatchEvent(r); + }, + o = () => { + this.readyState = l.CLOSED; + let e = new Event("error"); + this.dispatchEvent(e); + }; + (this.channel = new MessageChannel()), + (this.channel.port1.onmessage = e => { + "open" === e.data.type ? i(e.data.args[0]) : "message" === e.data.type ? a(e.data.args[0]) : "close" === e.data.type ? s(e.data.args[0], e.data.args[1]) : "error" === e.data.type && o(); + }), + r.sendMessage({ type: "websocket", websocket: { url: e.toString(), protocols: t, requestHeaders: n, channel: this.channel.port2 } }, [this.channel.port2]); + } + send(...e) { + if (this.readyState === l.CONNECTING) throw new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state."); + let t = e[0]; + t.buffer && (t = t.buffer.slice(t.byteOffset, t.byteOffset + t.byteLength)), o.call(this.channel.port1, { type: "data", data: t }, t instanceof ArrayBuffer ? [t] : []); + } + close(e, t) { + o.call(this.channel.port1, { type: "close", closeCode: e, closeReason: t }); + } + } + function g(e, t, r) { + console.error(`error while processing '${r}': `, t), e.postMessage({ type: "error", error: t }); + } + let m = ["ws:", "wss:"], + y = [101, 204, 205, 304], + b = [301, 302, 303, 307, 308]; + class w { + worker; + constructor(e) { + this.worker = new p(e); + } + async getTransport() { + return (await this.worker.sendMessage({ type: "get" })).name; + } + async setTransport(e, t, r) { + await this.setManualTransport( + ` const { default: BareTransport } = await import("${e}"); return [BareTransport, "${e}"]; - `,t,r)}async setManualTransport(e,t,r){if("bare-mux-remote"===e)throw Error("Use setRemoteTransport.");await this.worker.sendMessage({type:"set",client:{function:e,args:t}},r)}async setRemoteTransport(e,t){let r=new MessageChannel;r.port1.onmessage=async t=>{let r=t.data.port,n=t.data.message;if("fetch"===n.type)try{e.ready||await e.init(),await async function(e,t,r){let n=await r.request(new URL(e.fetch.remote),e.fetch.method,e.fetch.body,e.fetch.headers,null);if(!function(){if(null===h){let e,t=new MessageChannel,r=new ReadableStream;try{o.call(t.port1,r,[r]),e=!0}catch(t){e=!1}return h=e,e}return h}()&&n.body instanceof ReadableStream){let e=new Response(n.body);n.body=await e.arrayBuffer()}n.body instanceof ReadableStream||n.body instanceof ArrayBuffer?o.call(t,{type:"fetch",fetch:n},[n.body]):o.call(t,{type:"fetch",fetch:n})}(n,r,e)}catch(e){g(r,e,"fetch")}else if("websocket"===n.type)try{e.ready||await e.init(),await async function(e,t,r){let[n,i]=r.connect(new URL(e.websocket.url),e.websocket.protocols,e.websocket.requestHeaders,t=>{o.call(e.websocket.channel,{type:"open",args:[t]})},t=>{t instanceof ArrayBuffer?o.call(e.websocket.channel,{type:"message",args:[t]},[t]):o.call(e.websocket.channel,{type:"message",args:[t]})},(t,r)=>{o.call(e.websocket.channel,{type:"close",args:[t,r]})},t=>{o.call(e.websocket.channel,{type:"error",args:[t]})});e.websocket.channel.onmessage=e=>{"data"===e.data.type?n(e.data.data):"close"===e.data.type&&i(e.data.closeCode,e.data.closeReason)},o.call(t,{type:"websocket"})}(n,r,e)}catch(e){g(r,e,"websocket")}},await this.worker.sendMessage({type:"set",client:{function:"bare-mux-remote",args:[r.port2,t]}},[r.port2])}getInnerPort(){return this.worker.port}}class S{worker;constructor(e){this.worker=new p(e)}createWebSocket(e,t=[],r,n){try{e=new URL(e)}catch(t){throw new DOMException(`Faiiled to construct 'WebSocket': The URL '${e}' is invalid.`)}if(!m.includes(e.protocol))throw new DOMException(`Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${e.protocol}' is not allowed.`);for(let e of(Array.isArray(t)||(t=[t]),t=t.map(String)))if(!function(e){for(let t=0;te&&null!==t){o=new URL(t,o);continue}throw TypeError("Failed to fetch")}case"error":throw TypeError("Failed to fetch");case"manual":return i}}}}console.debug("bare-mux: running v2.1.9 (build dc9dc6e)")},8832:function(e,t,r){r.d(t,{H:()=>n,L:()=>i});let n=new Map(["altGlyph","altGlyphDef","altGlyphItem","animateColor","animateMotion","animateTransform","clipPath","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","foreignObject","glyphRef","linearGradient","radialGradient","textPath"].map(e=>[e.toLowerCase(),e])),i=new Map(["definitionURL","attributeName","attributeType","baseFrequency","baseProfile","calcMode","clipPathUnits","diffuseConstant","edgeMode","filterUnits","glyphRef","gradientTransform","gradientUnits","kernelMatrix","kernelUnitLength","keyPoints","keySplines","keyTimes","lengthAdjust","limitingConeAngle","markerHeight","markerUnits","markerWidth","maskContentUnits","maskUnits","numOctaves","pathLength","patternContentUnits","patternTransform","patternUnits","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","refX","refY","repeatCount","repeatDur","requiredExtensions","requiredFeatures","specularConstant","specularExponent","spreadMethod","startOffset","stdDeviation","stitchTiles","surfaceScale","systemLanguage","tableValues","targetX","targetY","textLength","viewBox","viewTarget","xChannelSelector","yChannelSelector","zoomAndPan"].map(e=>[e.toLowerCase(),e]))},6498:function(e,t,r){r.d(t,{A:()=>c});var n=r(2743),i=r(8466),a=r(8832);let s=new Set(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]);function o(e){return e.replace(/"/g,""")}let l=new Set(["area","base","basefont","br","col","command","embed","frame","hr","img","input","isindex","keygen","link","meta","param","source","track","wbr"]),c=function e(t,r={}){let c="length"in t?t:[t],h="";for(let t=0;t`;case n.Mw:return h=t,``;case n.KB:return p=t,``;case n.eF:case n.OF:case n.vw:return function(t,r){var n;"foreign"===r.xmlMode&&(t.name=null!=(n=a.H.get(t.name))?n:t.name,t.parent&&u.has(t.parent.name)&&(r={...r,xmlMode:!1})),!r.xmlMode&&d.has(t.name)&&(r={...r,xmlMode:"foreign"});let s=`<${t.name}`,c=function(e,t){var r;if(!e)return;let n=(null!=(r=t.encodeEntities)?r:t.decodeEntities)===!1?o:t.xmlMode||"utf8"!==t.encodeEntities?i.WY:i.Gj;return Object.keys(e).map(r=>{var i,s;let o=null!=(i=e[r])?i:"";return("foreign"===t.xmlMode&&(r=null!=(s=a.L.get(r))?s:r),t.emptyAttrs||t.xmlMode||""!==o)?`${r}="${n(o)}"`:r}).join(" ")}(t.attribs,r);return c&&(s+=` ${c}`),0===t.children.length&&(r.xmlMode?!1!==r.selfClosingTags:r.selfClosingTags&&l.has(t.name))?(r.xmlMode||(s+=" "),s+="/>"):(s+=">",t.children.length>0&&(s+=e(t.children,r)),(r.xmlMode||!l.has(t.name))&&(s+=``)),s}(t,r);case n.EY:return function(e,t){var r;let n=e.data||"";return(null!=(r=t.encodeEntities)?r:t.decodeEntities)===!1||!t.xmlMode&&e.parent&&s.has(e.parent.name)||(n=t.xmlMode||"utf8"!==t.encodeEntities?(0,i.WY)(n):(0,i.X1)(n)),n}(t,r)}}(c[t],r);return h},u=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"]),d=new Set(["svg","math"])},2743:function(e,t,r){var n,i;function a(e){return e.type===n.Tag||e.type===n.Script||e.type===n.Style}r.d(t,{EY:()=>o,KB:()=>p,Mw:()=>c,OF:()=>d,RJ:()=>n,WL:()=>l,bL:()=>s,dz:()=>a,eF:()=>u,fl:()=>f,vw:()=>h}),(i=n||(n={})).Root="root",i.Text="text",i.Directive="directive",i.Comment="comment",i.Script="script",i.Style="style",i.Tag="tag",i.CDATA="cdata",i.Doctype="doctype";let s=n.Root,o=n.Text,l=n.Directive,c=n.Comment,u=n.Script,d=n.Style,h=n.Tag,p=n.CDATA,f=n.Doctype},8866:function(e,t,r){r.d(t,{DV:()=>s,Hg:()=>i.Hg,Mw:()=>i.Mw});var n=r(2743),i=r(6072);let a={withStartIndices:!1,withEndIndices:!1,xmlMode:!1};class s{constructor(e,t,r){this.dom=[],this.root=new i.yo(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null,"function"==typeof t&&(r=t,t=a),"object"==typeof e&&(t=e,e=void 0),this.callback=null!=e?e:null,this.options=null!=t?t:a,this.elementCB=null!=r?r:null}onparserinit(e){this.parser=e}onreset(){this.dom=[],this.root=new i.yo(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null}onend(){this.done||(this.done=!0,this.parser=null,this.handleCallback(null))}onerror(e){this.handleCallback(e)}onclosetag(){this.lastNode=null;let e=this.tagStack.pop();this.options.withEndIndices&&(e.endIndex=this.parser.endIndex),this.elementCB&&this.elementCB(e)}onopentag(e,t){let r=this.options.xmlMode?n.RJ.Tag:void 0,a=new i.Hg(e,t,void 0,r);this.addNode(a),this.tagStack.push(a)}ontext(e){let{lastNode:t}=this;if(t&&t.type===n.RJ.Text)t.data+=e,this.options.withEndIndices&&(t.endIndex=this.parser.endIndex);else{let t=new i.EY(e);this.addNode(t),this.lastNode=t}}oncomment(e){if(this.lastNode&&this.lastNode.type===n.RJ.Comment){this.lastNode.data+=e;return}let t=new i.Mw(e);this.addNode(t),this.lastNode=t}oncommentend(){this.lastNode=null}oncdatastart(){let e=new i.EY(""),t=new i.KB([e]);this.addNode(t),e.parent=t,this.lastNode=e}oncdataend(){this.lastNode=null}onprocessinginstruction(e,t){let r=new i.Cd(e,t);this.addNode(r)}handleCallback(e){if("function"==typeof this.callback)this.callback(e,this.dom);else if(e)throw e}addNode(e){let t=this.tagStack[this.tagStack.length-1],r=t.children[t.children.length-1];this.options.withStartIndices&&(e.startIndex=this.parser.startIndex),this.options.withEndIndices&&(e.endIndex=this.parser.endIndex),t.children.push(e),r&&(e.prev=r,r.next=e),e.parent=t,this.lastNode=null}}},6072:function(e,t,r){r.d(t,{Cd:()=>l,EY:()=>s,Hg:()=>h,KB:()=>u,Mw:()=>o,yo:()=>d});var n=r(2743);class i{constructor(){this.parent=null,this.prev=null,this.next=null,this.startIndex=null,this.endIndex=null}get parentNode(){return this.parent}set parentNode(e){this.parent=e}get previousSibling(){return this.prev}set previousSibling(e){this.prev=e}get nextSibling(){return this.next}set nextSibling(e){this.next=e}cloneNode(e=!1){return p(this,e)}}class a extends i{constructor(e){super(),this.data=e}get nodeValue(){return this.data}set nodeValue(e){this.data=e}}class s extends a{constructor(){super(...arguments),this.type=n.RJ.Text}get nodeType(){return 3}}class o extends a{constructor(){super(...arguments),this.type=n.RJ.Comment}get nodeType(){return 8}}class l extends a{constructor(e,t){super(t),this.name=e,this.type=n.RJ.Directive}get nodeType(){return 1}}class c extends i{constructor(e){super(),this.children=e}get firstChild(){var e;return null!=(e=this.children[0])?e:null}get lastChild(){return this.children.length>0?this.children[this.children.length-1]:null}get childNodes(){return this.children}set childNodes(e){this.children=e}}class u extends c{constructor(){super(...arguments),this.type=n.RJ.CDATA}get nodeType(){return 4}}class d extends c{constructor(){super(...arguments),this.type=n.RJ.Root}get nodeType(){return 9}}class h extends c{constructor(e,t,r=[],i="script"===e?n.RJ.Script:"style"===e?n.RJ.Style:n.RJ.Tag){super(r),this.name=e,this.attribs=t,this.type=i}get nodeType(){return 1}get tagName(){return this.name}set tagName(e){this.name=e}get attributes(){return Object.keys(this.attribs).map(e=>{var t,r;return{name:e,value:this.attribs[e],namespace:null==(t=this["x-attribsNamespace"])?void 0:t[e],prefix:null==(r=this["x-attribsPrefix"])?void 0:r[e]}})}}function p(e,t=!1){let r;if(e.type===n.RJ.Text)r=new s(e.data);else if(e.type===n.RJ.Comment)r=new o(e.data);else if((0,n.dz)(e)){let n=t?f(e.children):[],i=new h(e.name,{...e.attribs},n);n.forEach(e=>e.parent=i),null!=e.namespace&&(i.namespace=e.namespace),e["x-attribsNamespace"]&&(i["x-attribsNamespace"]={...e["x-attribsNamespace"]}),e["x-attribsPrefix"]&&(i["x-attribsPrefix"]={...e["x-attribsPrefix"]}),r=i}else if(e.type===n.RJ.CDATA){let n=t?f(e.children):[],i=new u(n);n.forEach(e=>e.parent=i),r=i}else if(e.type===n.RJ.Root){let n=t?f(e.children):[],i=new d(n);n.forEach(e=>e.parent=i),e["x-mode"]&&(i["x-mode"]=e["x-mode"]),r=i}else if(e.type===n.RJ.Directive){let t=new l(e.name,e.data);null!=e["x-name"]&&(t["x-name"]=e["x-name"],t["x-publicId"]=e["x-publicId"],t["x-systemId"]=e["x-systemId"]),r=t}else throw Error(`Not implemented yet: ${e.type}`);return r.startIndex=e.startIndex,r.endIndex=e.endIndex,null!=e.sourceCodeLocation&&(r.sourceCodeLocation=e.sourceCodeLocation),r}function f(e){let t=e.map(e=>p(e,!0));for(let e=1;ea,y6:()=>s});let i=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),a=null!=(n=String.fromCodePoint)?n:function(e){let t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+=String.fromCharCode(e)};function s(e){var t;return e>=55296&&e<=57343||e>1114111?65533:null!=(t=i.get(e))?t:e}},2990:function(e,t,r){r.d(t,{FJ:()=>u,MK:()=>p.MK,Wf:()=>g,qN:()=>d.q,sr:()=>h.s});var n,i,a,s,o,l,c,u,d=r(7259),h=r(5949),p=r(2146);function f(e){return e>=o.ZERO&&e<=o.NINE}(n=o||(o={}))[n.NUM=35]="NUM",n[n.SEMI=59]="SEMI",n[n.EQUALS=61]="EQUALS",n[n.ZERO=48]="ZERO",n[n.NINE=57]="NINE",n[n.LOWER_A=97]="LOWER_A",n[n.LOWER_F=102]="LOWER_F",n[n.LOWER_X=120]="LOWER_X",n[n.LOWER_Z=122]="LOWER_Z",n[n.UPPER_A=65]="UPPER_A",n[n.UPPER_F=70]="UPPER_F",n[n.UPPER_Z=90]="UPPER_Z",(i=l||(l={}))[i.VALUE_LENGTH=49152]="VALUE_LENGTH",i[i.BRANCH_LENGTH=16256]="BRANCH_LENGTH",i[i.JUMP_TABLE=127]="JUMP_TABLE",(a=c||(c={}))[a.EntityStart=0]="EntityStart",a[a.NumericStart=1]="NumericStart",a[a.NumericDecimal=2]="NumericDecimal",a[a.NumericHex=3]="NumericHex",a[a.NamedEntity=4]="NamedEntity",(s=u||(u={}))[s.Legacy=0]="Legacy",s[s.Strict=1]="Strict",s[s.Attribute=2]="Attribute";class g{constructor(e,t,r){this.decodeTree=e,this.emitCodePoint=t,this.errors=r,this.state=c.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=u.Strict}startEntity(e){this.decodeMode=e,this.state=c.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(e,t){switch(this.state){case c.EntityStart:if(e.charCodeAt(t)===o.NUM)return this.state=c.NumericStart,this.consumed+=1,this.stateNumericStart(e,t+1);return this.state=c.NamedEntity,this.stateNamedEntity(e,t);case c.NumericStart:return this.stateNumericStart(e,t);case c.NumericDecimal:return this.stateNumericDecimal(e,t);case c.NumericHex:return this.stateNumericHex(e,t);case c.NamedEntity:return this.stateNamedEntity(e,t)}}stateNumericStart(e,t){return t>=e.length?-1:(32|e.charCodeAt(t))===o.LOWER_X?(this.state=c.NumericHex,this.consumed+=1,this.stateNumericHex(e,t+1)):(this.state=c.NumericDecimal,this.stateNumericDecimal(e,t))}addToNumericResult(e,t,r,n){if(t!==r){let i=r-t;this.result=this.result*Math.pow(n,i)+Number.parseInt(e.substr(t,i),n),this.consumed+=i}}stateNumericHex(e,t){let r=t;for(;t=o.UPPER_A)||!(n<=o.UPPER_F))&&(!(n>=o.LOWER_A)||!(n<=o.LOWER_F)))return this.addToNumericResult(e,r,t,16),this.emitNumericEntity(i,3);t+=1}return this.addToNumericResult(e,r,t,16),-1}stateNumericDecimal(e,t){let r=t;for(;t>14;for(;t>7,a=t&l.JUMP_TABLE;if(0===i)return 0!==a&&n===a?r:-1;if(a){let t=n-a;return t<0||t>=i?-1:e[r+t]-1}let s=r,o=s+i-1;for(;s<=o;){let t=s+o>>>1,r=e[t];if(rn))return e[t+i];o=t-1}}return -1}(r,n,this.treeIndex+Math.max(1,i),a),this.treeIndex<0)return 0===this.result||this.decodeMode===u.Attribute&&(0===i||function(e){var t;return e===o.EQUALS||(t=e)>=o.UPPER_A&&t<=o.UPPER_Z||t>=o.LOWER_A&&t<=o.LOWER_Z||f(t)}(a))?0:this.emitNotTerminatedNamedEntity();if(0!=(i=((n=r[this.treeIndex])&l.VALUE_LENGTH)>>14)){if(a===o.SEMI)return this.emitNamedEntityData(this.treeIndex,i,this.consumed+this.excess);this.decodeMode!==u.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return -1}emitNotTerminatedNamedEntity(){var e;let{result:t,decodeTree:r}=this,n=(r[t]&l.VALUE_LENGTH)>>14;return this.emitNamedEntityData(t,n,this.consumed),null==(e=this.errors)||e.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(e,t,r){let{decodeTree:n}=this;return this.emitCodePoint(1===t?n[e]&~l.VALUE_LENGTH:n[e+1],r),3===t&&this.emitCodePoint(n[e+2],r),r}end(){var e;switch(this.state){case c.NamedEntity:return 0!==this.result&&(this.decodeMode!==u.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case c.NumericDecimal:return this.emitNumericEntity(0,2);case c.NumericHex:return this.emitNumericEntity(0,3);case c.NumericStart:return null==(e=this.errors)||e.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case c.EntityStart:return 0}}}},466:function(e,t,r){r(9496),r(747)},747:function(e,t,r){r.d(t,{Gj:()=>l,WY:()=>s,X1:()=>c});let n=/["$&'<>\u0080-\uFFFF]/g,i=new Map([[34,"""],[38,"&"],[39,"'"],[60,"<"],[62,">"]]),a=null==String.prototype.codePointAt?(e,t)=>(64512&e.charCodeAt(t))==55296?(e.charCodeAt(t)-55296)*1024+e.charCodeAt(t+1)-56320+65536:e.charCodeAt(t):(e,t)=>e.codePointAt(t);function s(e){let t,r="",s=0;for(;null!==(t=n.exec(e));){let{index:o}=t,l=e.charCodeAt(o),c=i.get(l);void 0===c?(r+=`${e.substring(s,o)}&#x${a(e,o).toString(16)};`,s=n.lastIndex+=Number((64512&l)==55296)):(r+=e.substring(s,o)+c,s=o+1)}return r+e.substr(s)}function o(e,t){return function(r){let n,i=0,a="";for(;n=e.exec(r);)i!==n.index&&(a+=r.substring(i,n.index)),a+=t.get(n[0].charCodeAt(0)),i=n.index+1;return a+r.substring(i)}}let l=o(/["&\u00A0]/g,new Map([[34,"""],[38,"&"],[160," "]])),c=o(/[&<>\u00A0]/g,new Map([[38,"&"],[60,"<"],[62,">"],[160," "]]))},7259:function(e,t,r){r.d(t,{q:()=>n});let n=new Uint16Array('ᵁ<\xd5ıʊҝջאٵ۞ޢߖࠏ੊ઑඡ๭༉༦჊ረዡᐕᒝᓃᓟᔥ\0\0\0\0\0\0ᕫᛍᦍᰒᷝ὾⁠↰⊍⏀⏻⑂⠤⤒ⴈ⹈⿎〖㊺㘹㞬㣾㨨㩱㫠㬮ࠀEMabcfglmnoprstu\\bfms\x7f\x84\x8b\x90\x95\x98\xa6\xb3\xb9\xc8\xcflig耻\xc6䃆P耻&䀦cute耻\xc1䃁reve;䄂Āiyx}rc耻\xc2䃂;䐐r;쀀\ud835\udd04rave耻\xc0䃀pha;䎑acr;䄀d;橓Āgp\x9d\xa1on;䄄f;쀀\ud835\udd38plyFunction;恡ing耻\xc5䃅Ācs\xbe\xc3r;쀀\ud835\udc9cign;扔ilde耻\xc3䃃ml耻\xc4䃄Ѐaceforsu\xe5\xfb\xfeėĜĢħĪĀcr\xea\xf2kslash;或Ŷ\xf6\xf8;櫧ed;挆y;䐑ƀcrtąċĔause;戵noullis;愬a;䎒r;쀀\ud835\udd05pf;쀀\ud835\udd39eve;䋘c\xf2ēmpeq;扎܀HOacdefhilorsuōőŖƀƞƢƵƷƺǜȕɳɸɾcy;䐧PY耻\xa9䂩ƀcpyŝŢźute;䄆Ā;iŧŨ拒talDifferentialD;慅leys;愭ȀaeioƉƎƔƘron;䄌dil耻\xc7䃇rc;䄈nint;戰ot;䄊ĀdnƧƭilla;䂸terDot;䂷\xf2ſi;䎧rcleȀDMPTLJNjǑǖot;抙inus;抖lus;投imes;抗oĀcsǢǸkwiseContourIntegral;戲eCurlyĀDQȃȏoubleQuote;思uote;怙ȀlnpuȞȨɇɕonĀ;eȥȦ户;橴ƀgitȯȶȺruent;扡nt;戯ourIntegral;戮ĀfrɌɎ;愂oduct;成nterClockwiseContourIntegral;戳oss;樯cr;쀀\ud835\udc9epĀ;Cʄʅ拓ap;才րDJSZacefiosʠʬʰʴʸˋ˗ˡ˦̳ҍĀ;oŹʥtrahd;椑cy;䐂cy;䐅cy;䐏ƀgrsʿ˄ˇger;怡r;憡hv;櫤Āayː˕ron;䄎;䐔lĀ;t˝˞戇a;䎔r;쀀\ud835\udd07Āaf˫̧Ācm˰̢riticalȀADGT̖̜̀̆cute;䂴oŴ̋̍;䋙bleAcute;䋝rave;䁠ilde;䋜ond;拄ferentialD;慆Ѱ̽\0\0\0͔͂\0Ѕf;쀀\ud835\udd3bƀ;DE͈͉͍䂨ot;惜qual;扐blèCDLRUVͣͲ΂ϏϢϸontourIntegra\xecȹoɴ͹\0\0ͻ\xbb͉nArrow;懓Āeo·ΤftƀARTΐΖΡrrow;懐ightArrow;懔e\xe5ˊngĀLRΫτeftĀARγιrrow;柸ightArrow;柺ightArrow;柹ightĀATϘϞrrow;懒ee;抨pɁϩ\0\0ϯrrow;懑ownArrow;懕erticalBar;戥ǹABLRTaВЪаўѿͼrrowƀ;BUНОТ憓ar;椓pArrow;懵reve;䌑eft˒к\0ц\0ѐightVector;楐eeVector;楞ectorĀ;Bљњ憽ar;楖ightǔѧ\0ѱeeVector;楟ectorĀ;BѺѻ懁ar;楗eeĀ;A҆҇护rrow;憧ĀctҒҗr;쀀\ud835\udc9frok;䄐ࠀNTacdfglmopqstuxҽӀӄӋӞӢӧӮӵԡԯԶՒ՝ՠեG;䅊H耻\xd0䃐cute耻\xc9䃉ƀaiyӒӗӜron;䄚rc耻\xca䃊;䐭ot;䄖r;쀀\ud835\udd08rave耻\xc8䃈ement;戈ĀapӺӾcr;䄒tyɓԆ\0\0ԒmallSquare;旻erySmallSquare;斫ĀgpԦԪon;䄘f;쀀\ud835\udd3csilon;䎕uĀaiԼՉlĀ;TՂՃ橵ilde;扂librium;懌Āci՗՚r;愰m;橳a;䎗ml耻\xcb䃋Āipժկsts;戃onentialE;慇ʀcfiosօֈ֍ֲ׌y;䐤r;쀀\ud835\udd09lledɓ֗\0\0֣mallSquare;旼erySmallSquare;斪Ͱֺ\0ֿ\0\0ׄf;쀀\ud835\udd3dAll;戀riertrf;愱c\xf2׋؀JTabcdfgorstר׬ׯ׺؀ؒؖ؛؝أ٬ٲcy;䐃耻>䀾mmaĀ;d׷׸䎓;䏜reve;䄞ƀeiy؇،ؐdil;䄢rc;䄜;䐓ot;䄠r;쀀\ud835\udd0a;拙pf;쀀\ud835\udd3eeater̀EFGLSTصلَٖٛ٦qualĀ;Lؾؿ扥ess;招ullEqual;执reater;檢ess;扷lantEqual;橾ilde;扳cr;쀀\ud835\udca2;扫ЀAacfiosuڅڋږڛڞڪھۊRDcy;䐪Āctڐڔek;䋇;䁞irc;䄤r;愌lbertSpace;愋ǰگ\0ڲf;愍izontalLine;攀Āctۃۅ\xf2کrok;䄦mpńېۘownHum\xf0įqual;扏܀EJOacdfgmnostuۺ۾܃܇܎ܚܞܡܨ݄ݸދޏޕcy;䐕lig;䄲cy;䐁cute耻\xcd䃍Āiyܓܘrc耻\xce䃎;䐘ot;䄰r;愑rave耻\xcc䃌ƀ;apܠܯܿĀcgܴܷr;䄪inaryI;慈lie\xf3ϝǴ݉\0ݢĀ;eݍݎ戬Āgrݓݘral;戫section;拂isibleĀCTݬݲomma;恣imes;恢ƀgptݿރވon;䄮f;쀀\ud835\udd40a;䎙cr;愐ilde;䄨ǫޚ\0ޞcy;䐆l耻\xcf䃏ʀcfosuެ޷޼߂ߐĀiyޱ޵rc;䄴;䐙r;쀀\ud835\udd0dpf;쀀\ud835\udd41ǣ߇\0ߌr;쀀\ud835\udca5rcy;䐈kcy;䐄΀HJacfosߤߨ߽߬߱ࠂࠈcy;䐥cy;䐌ppa;䎚Āey߶߻dil;䄶;䐚r;쀀\ud835\udd0epf;쀀\ud835\udd42cr;쀀\ud835\udca6րJTaceflmostࠥࠩࠬࡐࡣ঳সে্਷ੇcy;䐉耻<䀼ʀcmnpr࠷࠼ࡁࡄࡍute;䄹bda;䎛g;柪lacetrf;愒r;憞ƀaeyࡗ࡜ࡡron;䄽dil;䄻;䐛Āfsࡨ॰tԀACDFRTUVarࡾࢩࢱࣦ࣠ࣼयज़ΐ४Ānrࢃ࢏gleBracket;柨rowƀ;BR࢙࢚࢞憐ar;懤ightArrow;懆eiling;挈oǵࢷ\0ࣃbleBracket;柦nǔࣈ\0࣒eeVector;楡ectorĀ;Bࣛࣜ懃ar;楙loor;挊ightĀAV࣯ࣵrrow;憔ector;楎Āerँगeƀ;AVउऊऐ抣rrow;憤ector;楚iangleƀ;BEतथऩ抲ar;槏qual;抴pƀDTVषूौownVector;楑eeVector;楠ectorĀ;Bॖॗ憿ar;楘ectorĀ;B॥०憼ar;楒ight\xe1Μs̀EFGLSTॾঋকঝঢভqualGreater;拚ullEqual;扦reater;扶ess;檡lantEqual;橽ilde;扲r;쀀\ud835\udd0fĀ;eঽা拘ftarrow;懚idot;䄿ƀnpw৔ਖਛgȀLRlr৞৷ਂਐeftĀAR০৬rrow;柵ightArrow;柷ightArrow;柶eftĀarγਊight\xe1οight\xe1ϊf;쀀\ud835\udd43erĀLRਢਬeftArrow;憙ightArrow;憘ƀchtਾੀੂ\xf2ࡌ;憰rok;䅁;扪Ѐacefiosuਗ਼੝੠੷੼અઋ઎p;椅y;䐜Ādl੥੯iumSpace;恟lintrf;愳r;쀀\ud835\udd10nusPlus;戓pf;쀀\ud835\udd44c\xf2੶;䎜ҀJacefostuણધભીଔଙඑ඗ඞcy;䐊cute;䅃ƀaey઴હાron;䅇dil;䅅;䐝ƀgswે૰଎ativeƀMTV૓૟૨ediumSpace;怋hiĀcn૦૘\xeb૙eryThi\xee૙tedĀGL૸ଆreaterGreate\xf2ٳessLes\xf3ੈLine;䀊r;쀀\ud835\udd11ȀBnptଢନଷ଺reak;恠BreakingSpace;䂠f;愕ڀ;CDEGHLNPRSTV୕ୖ୪୼஡௫ఄ౞಄ದ೘ൡඅ櫬Āou୛୤ngruent;扢pCap;扭oubleVerticalBar;戦ƀlqxஃஊ஛ement;戉ualĀ;Tஒஓ扠ilde;쀀≂̸ists;戄reater΀;EFGLSTஶஷ஽௉௓௘௥扯qual;扱ullEqual;쀀≧̸reater;쀀≫̸ess;批lantEqual;쀀⩾̸ilde;扵umpń௲௽ownHump;쀀≎̸qual;쀀≏̸eĀfsఊధtTriangleƀ;BEచఛడ拪ar;쀀⧏̸qual;括s̀;EGLSTవశ఼ౄోౘ扮qual;扰reater;扸ess;쀀≪̸lantEqual;쀀⩽̸ilde;扴estedĀGL౨౹reaterGreater;쀀⪢̸essLess;쀀⪡̸recedesƀ;ESಒಓಛ技qual;쀀⪯̸lantEqual;拠ĀeiಫಹverseElement;戌ghtTriangleƀ;BEೋೌ೒拫ar;쀀⧐̸qual;拭ĀquೝഌuareSuĀbp೨೹setĀ;E೰ೳ쀀⊏̸qual;拢ersetĀ;Eഃആ쀀⊐̸qual;拣ƀbcpഓതൎsetĀ;Eഛഞ쀀⊂⃒qual;抈ceedsȀ;ESTലള഻െ抁qual;쀀⪰̸lantEqual;拡ilde;쀀≿̸ersetĀ;E൘൛쀀⊃⃒qual;抉ildeȀ;EFT൮൯൵ൿ扁qual;扄ullEqual;扇ilde;扉erticalBar;戤cr;쀀\ud835\udca9ilde耻\xd1䃑;䎝܀Eacdfgmoprstuvලෂ෉෕ෛ෠෧෼ขภยา฿ไlig;䅒cute耻\xd3䃓Āiy෎ීrc耻\xd4䃔;䐞blac;䅐r;쀀\ud835\udd12rave耻\xd2䃒ƀaei෮ෲ෶cr;䅌ga;䎩cron;䎟pf;쀀\ud835\udd46enCurlyĀDQฎบoubleQuote;怜uote;怘;橔Āclวฬr;쀀\ud835\udcaaash耻\xd8䃘iŬื฼de耻\xd5䃕es;樷ml耻\xd6䃖erĀBP๋๠Āar๐๓r;怾acĀek๚๜;揞et;掴arenthesis;揜Ҁacfhilors๿ງຊຏຒດຝະ໼rtialD;戂y;䐟r;쀀\ud835\udd13i;䎦;䎠usMinus;䂱Āipຢອncareplan\xe5ڝf;愙Ȁ;eio຺ູ໠໤檻cedesȀ;EST່້໏໚扺qual;檯lantEqual;扼ilde;找me;怳Ādp໩໮uct;戏ortionĀ;aȥ໹l;戝Āci༁༆r;쀀\ud835\udcab;䎨ȀUfos༑༖༛༟OT耻"䀢r;쀀\ud835\udd14pf;愚cr;쀀\ud835\udcac؀BEacefhiorsu༾གྷཇའཱིྦྷྪྭ႖ႩႴႾarr;椐G耻\xae䂮ƀcnrཎནབute;䅔g;柫rĀ;tཛྷཝ憠l;椖ƀaeyཧཬཱron;䅘dil;䅖;䐠Ā;vླྀཹ愜erseĀEUྂྙĀlq྇ྎement;戋uilibrium;懋pEquilibrium;楯r\xbbཹo;䎡ghtЀACDFTUVa࿁࿫࿳ဢဨၛႇϘĀnr࿆࿒gleBracket;柩rowƀ;BL࿜࿝࿡憒ar;懥eftArrow;懄eiling;按oǵ࿹\0စbleBracket;柧nǔည\0နeeVector;楝ectorĀ;Bဝသ懂ar;楕loor;挋Āerိ၃eƀ;AVဵံြ抢rrow;憦ector;楛iangleƀ;BEၐၑၕ抳ar;槐qual;抵pƀDTVၣၮၸownVector;楏eeVector;楜ectorĀ;Bႂႃ憾ar;楔ectorĀ;B႑႒懀ar;楓Āpuႛ႞f;愝ndImplies;楰ightarrow;懛ĀchႹႼr;愛;憱leDelayed;槴ڀHOacfhimoqstuფჱჷჽᄙᄞᅑᅖᅡᅧᆵᆻᆿĀCcჩხHcy;䐩y;䐨FTcy;䐬cute;䅚ʀ;aeiyᄈᄉᄎᄓᄗ檼ron;䅠dil;䅞rc;䅜;䐡r;쀀\ud835\udd16ortȀDLRUᄪᄴᄾᅉownArrow\xbbОeftArrow\xbb࢚ightArrow\xbb࿝pArrow;憑gma;䎣allCircle;战pf;쀀\ud835\udd4aɲᅭ\0\0ᅰt;戚areȀ;ISUᅻᅼᆉᆯ斡ntersection;抓uĀbpᆏᆞsetĀ;Eᆗᆘ抏qual;抑ersetĀ;Eᆨᆩ抐qual;抒nion;抔cr;쀀\ud835\udcaear;拆ȀbcmpᇈᇛሉላĀ;sᇍᇎ拐etĀ;Eᇍᇕqual;抆ĀchᇠህeedsȀ;ESTᇭᇮᇴᇿ扻qual;檰lantEqual;扽ilde;承Th\xe1ྌ;我ƀ;esሒሓሣ拑rsetĀ;Eሜም抃qual;抇et\xbbሓրHRSacfhiorsሾቄ቉ቕ቞ቱቶኟዂወዑORN耻\xde䃞ADE;愢ĀHc቎ቒcy;䐋y;䐦Ābuቚቜ;䀉;䎤ƀaeyብቪቯron;䅤dil;䅢;䐢r;쀀\ud835\udd17Āeiቻ኉Dzኀ\0ኇefore;戴a;䎘Ācn኎ኘkSpace;쀀  Space;怉ldeȀ;EFTካኬኲኼ戼qual;扃ullEqual;扅ilde;扈pf;쀀\ud835\udd4bipleDot;惛Āctዖዛr;쀀\ud835\udcafrok;䅦ૡዷጎጚጦ\0ጬጱ\0\0\0\0\0ጸጽ፷ᎅ\0᏿ᐄᐊᐐĀcrዻጁute耻\xda䃚rĀ;oጇገ憟cir;楉rǣጓ\0጖y;䐎ve;䅬Āiyጞጣrc耻\xdb䃛;䐣blac;䅰r;쀀\ud835\udd18rave耻\xd9䃙acr;䅪Ādiፁ፩erĀBPፈ፝Āarፍፐr;䁟acĀekፗፙ;揟et;掵arenthesis;揝onĀ;P፰፱拃lus;抎Āgp፻፿on;䅲f;쀀\ud835\udd4cЀADETadps᎕ᎮᎸᏄϨᏒᏗᏳrrowƀ;BDᅐᎠᎤar;椒ownArrow;懅ownArrow;憕quilibrium;楮eeĀ;AᏋᏌ报rrow;憥own\xe1ϳerĀLRᏞᏨeftArrow;憖ightArrow;憗iĀ;lᏹᏺ䏒on;䎥ing;䅮cr;쀀\ud835\udcb0ilde;䅨ml耻\xdc䃜ҀDbcdefosvᐧᐬᐰᐳᐾᒅᒊᒐᒖash;披ar;櫫y;䐒ashĀ;lᐻᐼ抩;櫦Āerᑃᑅ;拁ƀbtyᑌᑐᑺar;怖Ā;iᑏᑕcalȀBLSTᑡᑥᑪᑴar;戣ine;䁼eparator;杘ilde;所ThinSpace;怊r;쀀\ud835\udd19pf;쀀\ud835\udd4dcr;쀀\ud835\udcb1dash;抪ʀcefosᒧᒬᒱᒶᒼirc;䅴dge;拀r;쀀\ud835\udd1apf;쀀\ud835\udd4ecr;쀀\ud835\udcb2Ȁfiosᓋᓐᓒᓘr;쀀\ud835\udd1b;䎞pf;쀀\ud835\udd4fcr;쀀\ud835\udcb3ҀAIUacfosuᓱᓵᓹᓽᔄᔏᔔᔚᔠcy;䐯cy;䐇cy;䐮cute耻\xdd䃝Āiyᔉᔍrc;䅶;䐫r;쀀\ud835\udd1cpf;쀀\ud835\udd50cr;쀀\ud835\udcb4ml;䅸ЀHacdefosᔵᔹᔿᕋᕏᕝᕠᕤcy;䐖cute;䅹Āayᕄᕉron;䅽;䐗ot;䅻Dzᕔ\0ᕛoWidt\xe8૙a;䎖r;愨pf;愤cr;쀀\ud835\udcb5௡ᖃᖊᖐ\0ᖰᖶᖿ\0\0\0\0ᗆᗛᗫᙟ᙭\0ᚕ᚛ᚲᚹ\0ᚾcute耻\xe1䃡reve;䄃̀;Ediuyᖜᖝᖡᖣᖨᖭ戾;쀀∾̳;房rc耻\xe2䃢te肻\xb4̆;䐰lig耻\xe6䃦Ā;r\xb2ᖺ;쀀\ud835\udd1erave耻\xe0䃠ĀepᗊᗖĀfpᗏᗔsym;愵\xe8ᗓha;䎱ĀapᗟcĀclᗤᗧr;䄁g;樿ɤᗰ\0\0ᘊʀ;adsvᗺᗻᗿᘁᘇ戧nd;橕;橜lope;橘;橚΀;elmrszᘘᘙᘛᘞᘿᙏᙙ戠;榤e\xbbᘙsdĀ;aᘥᘦ戡ѡᘰᘲᘴᘶᘸᘺᘼᘾ;榨;榩;榪;榫;榬;榭;榮;榯tĀ;vᙅᙆ戟bĀ;dᙌᙍ抾;榝Āptᙔᙗh;戢\xbb\xb9arr;捼Āgpᙣᙧon;䄅f;쀀\ud835\udd52΀;Eaeiop዁ᙻᙽᚂᚄᚇᚊ;橰cir;橯;扊d;手s;䀧roxĀ;e዁ᚒ\xf1ᚃing耻\xe5䃥ƀctyᚡᚦᚨr;쀀\ud835\udcb6;䀪mpĀ;e዁ᚯ\xf1ʈilde耻\xe3䃣ml耻\xe4䃤Āciᛂᛈonin\xf4ɲnt;樑ࠀNabcdefiklnoprsu᛭ᛱᜰ᜼ᝃᝈ᝸᝽០៦ᠹᡐᜍ᤽᥈ᥰot;櫭Ācrᛶ᜞kȀcepsᜀᜅᜍᜓong;扌psilon;䏶rime;怵imĀ;e᜚᜛戽q;拍Ŷᜢᜦee;抽edĀ;gᜬᜭ挅e\xbbᜭrkĀ;t፜᜷brk;掶Āoyᜁᝁ;䐱quo;怞ʀcmprtᝓ᝛ᝡᝤᝨausĀ;eĊĉptyv;榰s\xe9ᜌno\xf5ēƀahwᝯ᝱ᝳ;䎲;愶een;扬r;쀀\ud835\udd1fg΀costuvwឍឝឳេ៕៛៞ƀaiuបពរ\xf0ݠrc;旯p\xbb፱ƀdptឤឨឭot;樀lus;樁imes;樂ɱឹ\0\0ើcup;樆ar;昅riangleĀdu៍្own;施p;斳plus;樄e\xe5ᑄ\xe5ᒭarow;植ƀako៭ᠦᠵĀcn៲ᠣkƀlst៺֫᠂ozenge;槫riangleȀ;dlr᠒᠓᠘᠝斴own;斾eft;旂ight;斸k;搣Ʊᠫ\0ᠳƲᠯ\0ᠱ;斒;斑4;斓ck;斈ĀeoᠾᡍĀ;qᡃᡆ쀀=⃥uiv;쀀≡⃥t;挐Ȁptwxᡙᡞᡧᡬf;쀀\ud835\udd53Ā;tᏋᡣom\xbbᏌtie;拈؀DHUVbdhmptuvᢅᢖᢪᢻᣗᣛᣬ᣿ᤅᤊᤐᤡȀLRlrᢎᢐᢒᢔ;敗;敔;敖;敓ʀ;DUduᢡᢢᢤᢦᢨ敐;敦;敩;敤;敧ȀLRlrᢳᢵᢷᢹ;敝;敚;敜;教΀;HLRhlrᣊᣋᣍᣏᣑᣓᣕ救;敬;散;敠;敫;敢;敟ox;槉ȀLRlrᣤᣦᣨᣪ;敕;敒;攐;攌ʀ;DUduڽ᣷᣹᣻᣽;敥;敨;攬;攴inus;抟lus;択imes;抠ȀLRlrᤙᤛᤝ᤟;敛;敘;攘;攔΀;HLRhlrᤰᤱᤳᤵᤷ᤻᤹攂;敪;敡;敞;攼;攤;攜Āevģ᥂bar耻\xa6䂦Ȁceioᥑᥖᥚᥠr;쀀\ud835\udcb7mi;恏mĀ;e᜚᜜lƀ;bhᥨᥩᥫ䁜;槅sub;柈Ŭᥴ᥾lĀ;e᥹᥺怢t\xbb᥺pƀ;Eeįᦅᦇ;檮Ā;qۜۛೡᦧ\0᧨ᨑᨕᨲ\0ᨷᩐ\0\0᪴\0\0᫁\0\0ᬡᬮ᭍᭒\0᯽\0ᰌƀcpr᦭ᦲ᧝ute;䄇̀;abcdsᦿᧀᧄ᧊᧕᧙戩nd;橄rcup;橉Āau᧏᧒p;橋p;橇ot;橀;쀀∩︀Āeo᧢᧥t;恁\xeeړȀaeiu᧰᧻ᨁᨅǰ᧵\0᧸s;橍on;䄍dil耻\xe7䃧rc;䄉psĀ;sᨌᨍ橌m;橐ot;䄋ƀdmnᨛᨠᨦil肻\xb8ƭptyv;榲t脀\xa2;eᨭᨮ䂢r\xe4Ʋr;쀀\ud835\udd20ƀceiᨽᩀᩍy;䑇ckĀ;mᩇᩈ朓ark\xbbᩈ;䏇r΀;Ecefms᩟᩠ᩢᩫ᪤᪪᪮旋;槃ƀ;elᩩᩪᩭ䋆q;扗eɡᩴ\0\0᪈rrowĀlr᩼᪁eft;憺ight;憻ʀRSacd᪒᪔᪖᪚᪟\xbbཇ;擈st;抛irc;抚ash;抝nint;樐id;櫯cir;槂ubsĀ;u᪻᪼晣it\xbb᪼ˬ᫇᫔᫺\0ᬊonĀ;eᫍᫎ䀺Ā;q\xc7\xc6ɭ᫙\0\0᫢aĀ;t᫞᫟䀬;䁀ƀ;fl᫨᫩᫫戁\xeeᅠeĀmx᫱᫶ent\xbb᫩e\xf3ɍǧ᫾\0ᬇĀ;dኻᬂot;橭n\xf4Ɇƀfryᬐᬔᬗ;쀀\ud835\udd54o\xe4ɔ脀\xa9;sŕᬝr;愗Āaoᬥᬩrr;憵ss;朗Ācuᬲᬷr;쀀\ud835\udcb8Ābpᬼ᭄Ā;eᭁᭂ櫏;櫑Ā;eᭉᭊ櫐;櫒dot;拯΀delprvw᭠᭬᭷ᮂᮬᯔ᯹arrĀlr᭨᭪;椸;椵ɰ᭲\0\0᭵r;拞c;拟arrĀ;p᭿ᮀ憶;椽̀;bcdosᮏᮐᮖᮡᮥᮨ截rcap;橈Āauᮛᮞp;橆p;橊ot;抍r;橅;쀀∪︀Ȁalrv᮵ᮿᯞᯣrrĀ;mᮼᮽ憷;椼yƀevwᯇᯔᯘqɰᯎ\0\0ᯒre\xe3᭳u\xe3᭵ee;拎edge;拏en耻\xa4䂤earrowĀlrᯮ᯳eft\xbbᮀight\xbbᮽe\xe4ᯝĀciᰁᰇonin\xf4Ƿnt;戱lcty;挭ঀAHabcdefhijlorstuwz᰸᰻᰿ᱝᱩᱵᲊᲞᲬᲷ᳻᳿ᴍᵻᶑᶫᶻ᷆᷍r\xf2΁ar;楥Ȁglrs᱈ᱍ᱒᱔ger;怠eth;愸\xf2ᄳhĀ;vᱚᱛ怐\xbbऊūᱡᱧarow;椏a\xe3̕Āayᱮᱳron;䄏;䐴ƀ;ao̲ᱼᲄĀgrʿᲁr;懊tseq;橷ƀglmᲑᲔᲘ耻\xb0䂰ta;䎴ptyv;榱ĀirᲣᲨsht;楿;쀀\ud835\udd21arĀlrᲳᲵ\xbbࣜ\xbbသʀaegsv᳂͸᳖᳜᳠mƀ;oș᳊᳔ndĀ;ș᳑uit;晦amma;䏝in;拲ƀ;io᳧᳨᳸䃷de脀\xf7;o᳧ᳰntimes;拇n\xf8᳷cy;䑒cɯᴆ\0\0ᴊrn;挞op;挍ʀlptuwᴘᴝᴢᵉᵕlar;䀤f;쀀\ud835\udd55ʀ;emps̋ᴭᴷᴽᵂqĀ;d͒ᴳot;扑inus;戸lus;戔quare;抡blebarwedg\xe5\xfanƀadhᄮᵝᵧownarrow\xf3ᲃarpoonĀlrᵲᵶef\xf4Ჴigh\xf4ᲶŢᵿᶅkaro\xf7གɯᶊ\0\0ᶎrn;挟op;挌ƀcotᶘᶣᶦĀryᶝᶡ;쀀\ud835\udcb9;䑕l;槶rok;䄑Ādrᶰᶴot;拱iĀ;fᶺ᠖斿Āah᷀᷃r\xf2Щa\xf2ྦangle;榦Āci᷒ᷕy;䑟grarr;柿ऀDacdefglmnopqrstuxḁḉḙḸոḼṉṡṾấắẽỡἪἷὄ὎὚ĀDoḆᴴo\xf4ᲉĀcsḎḔute耻\xe9䃩ter;橮ȀaioyḢḧḱḶron;䄛rĀ;cḭḮ扖耻\xea䃪lon;払;䑍ot;䄗ĀDrṁṅot;扒;쀀\ud835\udd22ƀ;rsṐṑṗ檚ave耻\xe8䃨Ā;dṜṝ檖ot;檘Ȁ;ilsṪṫṲṴ檙nters;揧;愓Ā;dṹṺ檕ot;檗ƀapsẅẉẗcr;䄓tyƀ;svẒẓẕ戅et\xbbẓpĀ1;ẝẤijạả;怄;怅怃ĀgsẪẬ;䅋p;怂ĀgpẴẸon;䄙f;쀀\ud835\udd56ƀalsỄỎỒrĀ;sỊị拕l;槣us;橱iƀ;lvỚớở䎵on\xbbớ;䏵ȀcsuvỪỳἋἣĀioữḱrc\xbbḮɩỹ\0\0ỻ\xedՈantĀglἂἆtr\xbbṝess\xbbṺƀaeiἒ἖Ἒls;䀽st;扟vĀ;DȵἠD;橸parsl;槥ĀDaἯἳot;打rr;楱ƀcdiἾὁỸr;愯o\xf4͒ĀahὉὋ;䎷耻\xf0䃰Āmrὓὗl耻\xeb䃫o;悬ƀcipὡὤὧl;䀡s\xf4ծĀeoὬὴctatio\xeeՙnential\xe5չৡᾒ\0ᾞ\0ᾡᾧ\0\0ῆῌ\0ΐ\0ῦῪ \0 ⁚llingdotse\xf1Ṅy;䑄male;晀ƀilrᾭᾳ῁lig;耀ffiɩᾹ\0\0᾽g;耀ffig;耀ffl;쀀\ud835\udd23lig;耀filig;쀀fjƀaltῙ῜ῡt;晭ig;耀flns;斱of;䆒ǰ΅\0ῳf;쀀\ud835\udd57ĀakֿῷĀ;vῼ´拔;櫙artint;樍Āao‌⁕Ācs‑⁒ႉ‸⁅⁈\0⁐β•‥‧‪‬\0‮耻\xbd䂽;慓耻\xbc䂼;慕;慙;慛Ƴ‴\0‶;慔;慖ʴ‾⁁\0\0⁃耻\xbe䂾;慗;慜5;慘ƶ⁌\0⁎;慚;慝8;慞l;恄wn;挢cr;쀀\ud835\udcbbࢀEabcdefgijlnorstv₂₉₟₥₰₴⃰⃵⃺⃿℃ℒℸ̗ℾ⅒↞Ā;lٍ₇;檌ƀcmpₐₕ₝ute;䇵maĀ;dₜ᳚䎳;檆reve;䄟Āiy₪₮rc;䄝;䐳ot;䄡Ȁ;lqsؾق₽⃉ƀ;qsؾٌ⃄lan\xf4٥Ȁ;cdl٥⃒⃥⃕c;檩otĀ;o⃜⃝檀Ā;l⃢⃣檂;檄Ā;e⃪⃭쀀⋛︀s;檔r;쀀\ud835\udd24Ā;gٳ؛mel;愷cy;䑓Ȁ;Eajٚℌℎℐ;檒;檥;檤ȀEaesℛℝ℩ℴ;扩pĀ;p℣ℤ檊rox\xbbℤĀ;q℮ℯ檈Ā;q℮ℛim;拧pf;쀀\ud835\udd58Āci⅃ⅆr;愊mƀ;el٫ⅎ⅐;檎;檐茀>;cdlqr׮ⅠⅪⅮⅳⅹĀciⅥⅧ;檧r;橺ot;拗Par;榕uest;橼ʀadelsↄⅪ←ٖ↛ǰ↉\0↎pro\xf8₞r;楸qĀlqؿ↖les\xf3₈i\xed٫Āen↣↭rtneqq;쀀≩︀\xc5↪ԀAabcefkosy⇄⇇⇱⇵⇺∘∝∯≨≽r\xf2ΠȀilmr⇐⇔⇗⇛rs\xf0ᒄf\xbb․il\xf4کĀdr⇠⇤cy;䑊ƀ;cwࣴ⇫⇯ir;楈;憭ar;意irc;䄥ƀalr∁∎∓rtsĀ;u∉∊晥it\xbb∊lip;怦con;抹r;쀀\ud835\udd25sĀew∣∩arow;椥arow;椦ʀamopr∺∾≃≞≣rr;懿tht;戻kĀlr≉≓eftarrow;憩ightarrow;憪f;쀀\ud835\udd59bar;怕ƀclt≯≴≸r;쀀\ud835\udcbdas\xe8⇴rok;䄧Ābp⊂⊇ull;恃hen\xbbᱛૡ⊣\0⊪\0⊸⋅⋎\0⋕⋳\0\0⋸⌢⍧⍢⍿\0⎆⎪⎴cute耻\xed䃭ƀ;iyݱ⊰⊵rc耻\xee䃮;䐸Ācx⊼⊿y;䐵cl耻\xa1䂡ĀfrΟ⋉;쀀\ud835\udd26rave耻\xec䃬Ȁ;inoܾ⋝⋩⋮Āin⋢⋦nt;樌t;戭fin;槜ta;愩lig;䄳ƀaop⋾⌚⌝ƀcgt⌅⌈⌗r;䄫ƀelpܟ⌏⌓in\xe5ގar\xf4ܠh;䄱f;抷ed;䆵ʀ;cfotӴ⌬⌱⌽⍁are;愅inĀ;t⌸⌹戞ie;槝do\xf4⌙ʀ;celpݗ⍌⍐⍛⍡al;抺Āgr⍕⍙er\xf3ᕣ\xe3⍍arhk;樗rod;樼Ȁcgpt⍯⍲⍶⍻y;䑑on;䄯f;쀀\ud835\udd5aa;䎹uest耻\xbf䂿Āci⎊⎏r;쀀\ud835\udcbenʀ;EdsvӴ⎛⎝⎡ӳ;拹ot;拵Ā;v⎦⎧拴;拳Ā;iݷ⎮lde;䄩ǫ⎸\0⎼cy;䑖l耻\xef䃯̀cfmosu⏌⏗⏜⏡⏧⏵Āiy⏑⏕rc;䄵;䐹r;쀀\ud835\udd27ath;䈷pf;쀀\ud835\udd5bǣ⏬\0⏱r;쀀\ud835\udcbfrcy;䑘kcy;䑔Ѐacfghjos␋␖␢␧␭␱␵␻ppaĀ;v␓␔䎺;䏰Āey␛␠dil;䄷;䐺r;쀀\ud835\udd28reen;䄸cy;䑅cy;䑜pf;쀀\ud835\udd5ccr;쀀\ud835\udcc0஀ABEHabcdefghjlmnoprstuv⑰⒁⒆⒍⒑┎┽╚▀♎♞♥♹♽⚚⚲⛘❝❨➋⟀⠁⠒ƀart⑷⑺⑼r\xf2৆\xf2Εail;椛arr;椎Ā;gঔ⒋;檋ar;楢ॣ⒥\0⒪\0⒱\0\0\0\0\0⒵Ⓔ\0ⓆⓈⓍ\0⓹ute;䄺mptyv;榴ra\xeeࡌbda;䎻gƀ;dlࢎⓁⓃ;榑\xe5ࢎ;檅uo耻\xab䂫rЀ;bfhlpst࢙ⓞⓦⓩ⓫⓮⓱⓵Ā;f࢝ⓣs;椟s;椝\xeb≒p;憫l;椹im;楳l;憢ƀ;ae⓿─┄檫il;椙Ā;s┉┊檭;쀀⪭︀ƀabr┕┙┝rr;椌rk;杲Āak┢┬cĀek┨┪;䁻;䁛Āes┱┳;榋lĀdu┹┻;榏;榍Ȁaeuy╆╋╖╘ron;䄾Ādi═╔il;䄼\xecࢰ\xe2┩;䐻Ȁcqrs╣╦╭╽a;椶uoĀ;rนᝆĀdu╲╷har;楧shar;楋h;憲ʀ;fgqs▋▌উ◳◿扤tʀahlrt▘▤▷◂◨rrowĀ;t࢙□a\xe9⓶arpoonĀdu▯▴own\xbbњp\xbb०eftarrows;懇ightƀahs◍◖◞rrowĀ;sࣴࢧarpoon\xf3྘quigarro\xf7⇰hreetimes;拋ƀ;qs▋ও◺lan\xf4বʀ;cdgsব☊☍☝☨c;檨otĀ;o☔☕橿Ā;r☚☛檁;檃Ā;e☢☥쀀⋚︀s;檓ʀadegs☳☹☽♉♋ppro\xf8Ⓠot;拖qĀgq♃♅\xf4উgt\xf2⒌\xf4ছi\xedলƀilr♕࣡♚sht;楼;쀀\ud835\udd29Ā;Eজ♣;檑š♩♶rĀdu▲♮Ā;l॥♳;楪lk;斄cy;䑙ʀ;achtੈ⚈⚋⚑⚖r\xf2◁orne\xf2ᴈard;楫ri;旺Āio⚟⚤dot;䅀ustĀ;a⚬⚭掰che\xbb⚭ȀEaes⚻⚽⛉⛔;扨pĀ;p⛃⛄檉rox\xbb⛄Ā;q⛎⛏檇Ā;q⛎⚻im;拦Ѐabnoptwz⛩⛴⛷✚✯❁❇❐Ānr⛮⛱g;柬r;懽r\xebࣁgƀlmr⛿✍✔eftĀar০✇ight\xe1৲apsto;柼ight\xe1৽parrowĀlr✥✩ef\xf4⓭ight;憬ƀafl✶✹✽r;榅;쀀\ud835\udd5dus;樭imes;樴š❋❏st;戗\xe1ፎƀ;ef❗❘᠀旊nge\xbb❘arĀ;l❤❥䀨t;榓ʀachmt❳❶❼➅➇r\xf2ࢨorne\xf2ᶌarĀ;d྘➃;業;怎ri;抿̀achiqt➘➝ੀ➢➮➻quo;怹r;쀀\ud835\udcc1mƀ;egল➪➬;檍;檏Ābu┪➳oĀ;rฟ➹;怚rok;䅂萀<;cdhilqrࠫ⟒☹⟜⟠⟥⟪⟰Āci⟗⟙;檦r;橹re\xe5◲mes;拉arr;楶uest;橻ĀPi⟵⟹ar;榖ƀ;ef⠀भ᠛旃rĀdu⠇⠍shar;楊har;楦Āen⠗⠡rtneqq;쀀≨︀\xc5⠞܀Dacdefhilnopsu⡀⡅⢂⢎⢓⢠⢥⢨⣚⣢⣤ઃ⣳⤂Dot;戺Ȁclpr⡎⡒⡣⡽r耻\xaf䂯Āet⡗⡙;時Ā;e⡞⡟朠se\xbb⡟Ā;sျ⡨toȀ;dluျ⡳⡷⡻ow\xeeҌef\xf4ए\xf0Ꮡker;斮Āoy⢇⢌mma;権;䐼ash;怔asuredangle\xbbᘦr;쀀\ud835\udd2ao;愧ƀcdn⢯⢴⣉ro耻\xb5䂵Ȁ;acdᑤ⢽⣀⣄s\xf4ᚧir;櫰ot肻\xb7Ƶusƀ;bd⣒ᤃ⣓戒Ā;uᴼ⣘;横ţ⣞⣡p;櫛\xf2−\xf0ઁĀdp⣩⣮els;抧f;쀀\ud835\udd5eĀct⣸⣽r;쀀\ud835\udcc2pos\xbbᖝƀ;lm⤉⤊⤍䎼timap;抸ఀGLRVabcdefghijlmoprstuvw⥂⥓⥾⦉⦘⧚⧩⨕⨚⩘⩝⪃⪕⪤⪨⬄⬇⭄⭿⮮ⰴⱧⱼ⳩Āgt⥇⥋;쀀⋙̸Ā;v⥐௏쀀≫⃒ƀelt⥚⥲⥶ftĀar⥡⥧rrow;懍ightarrow;懎;쀀⋘̸Ā;v⥻ే쀀≪⃒ightarrow;懏ĀDd⦎⦓ash;抯ash;抮ʀbcnpt⦣⦧⦬⦱⧌la\xbb˞ute;䅄g;쀀∠⃒ʀ;Eiop඄⦼⧀⧅⧈;쀀⩰̸d;쀀≋̸s;䅉ro\xf8඄urĀ;a⧓⧔普lĀ;s⧓ସdz⧟\0⧣p肻\xa0ଷmpĀ;e௹ఀʀaeouy⧴⧾⨃⨐⨓ǰ⧹\0⧻;橃on;䅈dil;䅆ngĀ;dൾ⨊ot;쀀⩭̸p;橂;䐽ash;怓΀;Aadqsxஒ⨩⨭⨻⩁⩅⩐rr;懗rĀhr⨳⨶k;椤Ā;oᏲᏰot;쀀≐̸ui\xf6ୣĀei⩊⩎ar;椨\xed஘istĀ;s஠டr;쀀\ud835\udd2bȀEest௅⩦⩹⩼ƀ;qs஼⩭௡ƀ;qs஼௅⩴lan\xf4௢i\xed௪Ā;rஶ⪁\xbbஷƀAap⪊⪍⪑r\xf2⥱rr;憮ar;櫲ƀ;svྍ⪜ྌĀ;d⪡⪢拼;拺cy;䑚΀AEadest⪷⪺⪾⫂⫅⫶⫹r\xf2⥦;쀀≦̸rr;憚r;急Ȁ;fqs఻⫎⫣⫯tĀar⫔⫙rro\xf7⫁ightarro\xf7⪐ƀ;qs఻⪺⫪lan\xf4ౕĀ;sౕ⫴\xbbశi\xedౝĀ;rవ⫾iĀ;eచథi\xe4ඐĀpt⬌⬑f;쀀\ud835\udd5f膀\xac;in⬙⬚⬶䂬nȀ;Edvஉ⬤⬨⬮;쀀⋹̸ot;쀀⋵̸ǡஉ⬳⬵;拷;拶iĀ;vಸ⬼ǡಸ⭁⭃;拾;拽ƀaor⭋⭣⭩rȀ;ast୻⭕⭚⭟lle\xec୻l;쀀⫽⃥;쀀∂̸lint;樔ƀ;ceಒ⭰⭳u\xe5ಥĀ;cಘ⭸Ā;eಒ⭽\xf1ಘȀAait⮈⮋⮝⮧r\xf2⦈rrƀ;cw⮔⮕⮙憛;쀀⤳̸;쀀↝̸ghtarrow\xbb⮕riĀ;eೋೖ΀chimpqu⮽⯍⯙⬄୸⯤⯯Ȁ;cerല⯆ഷ⯉u\xe5൅;쀀\ud835\udcc3ortɭ⬅\0\0⯖ar\xe1⭖mĀ;e൮⯟Ā;q൴൳suĀbp⯫⯭\xe5೸\xe5ഋƀbcp⯶ⰑⰙȀ;Ees⯿ⰀഢⰄ抄;쀀⫅̸etĀ;eഛⰋqĀ;qണⰀcĀ;eലⰗ\xf1സȀ;EesⰢⰣൟⰧ抅;쀀⫆̸etĀ;e൘ⰮqĀ;qൠⰣȀgilrⰽⰿⱅⱇ\xecௗlde耻\xf1䃱\xe7ృiangleĀlrⱒⱜeftĀ;eచⱚ\xf1దightĀ;eೋⱥ\xf1೗Ā;mⱬⱭ䎽ƀ;esⱴⱵⱹ䀣ro;愖p;怇ҀDHadgilrsⲏⲔⲙⲞⲣⲰⲶⳓⳣash;抭arr;椄p;쀀≍⃒ash;抬ĀetⲨⲬ;쀀≥⃒;쀀>⃒nfin;槞ƀAetⲽⳁⳅrr;椂;쀀≤⃒Ā;rⳊⳍ쀀<⃒ie;쀀⊴⃒ĀAtⳘⳜrr;椃rie;쀀⊵⃒im;쀀∼⃒ƀAan⳰⳴ⴂrr;懖rĀhr⳺⳽k;椣Ā;oᏧᏥear;椧ቓ᪕\0\0\0\0\0\0\0\0\0\0\0\0\0ⴭ\0ⴸⵈⵠⵥ⵲ⶄᬇ\0\0ⶍⶫ\0ⷈⷎ\0ⷜ⸙⸫⸾⹃Ācsⴱ᪗ute耻\xf3䃳ĀiyⴼⵅrĀ;c᪞ⵂ耻\xf4䃴;䐾ʀabios᪠ⵒⵗLjⵚlac;䅑v;樸old;榼lig;䅓Ācr⵩⵭ir;榿;쀀\ud835\udd2cͯ⵹\0\0⵼\0ⶂn;䋛ave耻\xf2䃲;槁Ābmⶈ෴ar;榵Ȁacitⶕ⶘ⶥⶨr\xf2᪀Āir⶝ⶠr;榾oss;榻n\xe5๒;槀ƀaeiⶱⶵⶹcr;䅍ga;䏉ƀcdnⷀⷅǍron;䎿;榶pf;쀀\ud835\udd60ƀaelⷔ⷗ǒr;榷rp;榹΀;adiosvⷪⷫⷮ⸈⸍⸐⸖戨r\xf2᪆Ȁ;efmⷷⷸ⸂⸅橝rĀ;oⷾⷿ愴f\xbbⷿ耻\xaa䂪耻\xba䂺gof;抶r;橖lope;橗;橛ƀclo⸟⸡⸧\xf2⸁ash耻\xf8䃸l;折iŬⸯ⸴de耻\xf5䃵esĀ;aǛ⸺s;樶ml耻\xf6䃶bar;挽ૡ⹞\0⹽\0⺀⺝\0⺢⺹\0\0⻋ຜ\0⼓\0\0⼫⾼\0⿈rȀ;astЃ⹧⹲຅脀\xb6;l⹭⹮䂶le\xecЃɩ⹸\0\0⹻m;櫳;櫽y;䐿rʀcimpt⺋⺏⺓ᡥ⺗nt;䀥od;䀮il;怰enk;怱r;쀀\ud835\udd2dƀimo⺨⺰⺴Ā;v⺭⺮䏆;䏕ma\xf4੶ne;明ƀ;tv⺿⻀⻈䏀chfork\xbb´;䏖Āau⻏⻟nĀck⻕⻝kĀ;h⇴⻛;愎\xf6⇴sҀ;abcdemst⻳⻴ᤈ⻹⻽⼄⼆⼊⼎䀫cir;樣ir;樢Āouᵀ⼂;樥;橲n肻\xb1ຝim;樦wo;樧ƀipu⼙⼠⼥ntint;樕f;쀀\ud835\udd61nd耻\xa3䂣Ԁ;Eaceinosu່⼿⽁⽄⽇⾁⾉⾒⽾⾶;檳p;檷u\xe5໙Ā;c໎⽌̀;acens່⽙⽟⽦⽨⽾ppro\xf8⽃urlye\xf1໙\xf1໎ƀaes⽯⽶⽺pprox;檹qq;檵im;拨i\xedໟmeĀ;s⾈ຮ怲ƀEas⽸⾐⽺\xf0⽵ƀdfp໬⾙⾯ƀals⾠⾥⾪lar;挮ine;挒urf;挓Ā;t໻⾴\xef໻rel;抰Āci⿀⿅r;쀀\ud835\udcc5;䏈ncsp;怈̀fiopsu⿚⋢⿟⿥⿫⿱r;쀀\ud835\udd2epf;쀀\ud835\udd62rime;恗cr;쀀\ud835\udcc6ƀaeo⿸〉〓tĀei⿾々rnion\xf3ڰnt;樖stĀ;e【】䀿\xf1Ἑ\xf4༔઀ABHabcdefhilmnoprstux぀けさすムㄎㄫㅇㅢㅲㆎ㈆㈕㈤㈩㉘㉮㉲㊐㊰㊷ƀartぇおがr\xf2Ⴓ\xf2ϝail;検ar\xf2ᱥar;楤΀cdenqrtとふへみわゔヌĀeuねぱ;쀀∽̱te;䅕i\xe3ᅮmptyv;榳gȀ;del࿑らるろ;榒;榥\xe5࿑uo耻\xbb䂻rր;abcfhlpstw࿜ガクシスゼゾダッデナp;極Ā;f࿠ゴs;椠;椳s;椞\xeb≝\xf0✮l;楅im;楴l;憣;憝Āaiパフil;椚oĀ;nホボ戶al\xf3༞ƀabrョリヮr\xf2៥rk;杳ĀakンヽcĀekヹ・;䁽;䁝Āes㄂㄄;榌lĀduㄊㄌ;榎;榐Ȁaeuyㄗㄜㄧㄩron;䅙Ādiㄡㄥil;䅗\xec࿲\xe2ヺ;䑀Ȁclqsㄴㄷㄽㅄa;椷dhar;楩uoĀ;rȎȍh;憳ƀacgㅎㅟངlȀ;ipsླྀㅘㅛႜn\xe5Ⴛar\xf4ྩt;断ƀilrㅩဣㅮsht;楽;쀀\ud835\udd2fĀaoㅷㆆrĀduㅽㅿ\xbbѻĀ;l႑ㆄ;楬Ā;vㆋㆌ䏁;䏱ƀgns㆕ㇹㇼht̀ahlrstㆤㆰ㇂㇘㇤㇮rrowĀ;t࿜ㆭa\xe9トarpoonĀduㆻㆿow\xeeㅾp\xbb႒eftĀah㇊㇐rrow\xf3࿪arpoon\xf3Ցightarrows;應quigarro\xf7ニhreetimes;拌g;䋚ingdotse\xf1ἲƀahm㈍㈐㈓r\xf2࿪a\xf2Ց;怏oustĀ;a㈞㈟掱che\xbb㈟mid;櫮Ȁabpt㈲㈽㉀㉒Ānr㈷㈺g;柭r;懾r\xebဃƀafl㉇㉊㉎r;榆;쀀\ud835\udd63us;樮imes;樵Āap㉝㉧rĀ;g㉣㉤䀩t;榔olint;樒ar\xf2㇣Ȁachq㉻㊀Ⴜ㊅quo;怺r;쀀\ud835\udcc7Ābu・㊊oĀ;rȔȓƀhir㊗㊛㊠re\xe5ㇸmes;拊iȀ;efl㊪ၙᠡ㊫方tri;槎luhar;楨;愞ൡ㋕㋛㋟㌬㌸㍱\0㍺㎤\0\0㏬㏰\0㐨㑈㑚㒭㒱㓊㓱\0㘖\0\0㘳cute;䅛qu\xef➺Ԁ;Eaceinpsyᇭ㋳㋵㋿㌂㌋㌏㌟㌦㌩;檴ǰ㋺\0㋼;檸on;䅡u\xe5ᇾĀ;dᇳ㌇il;䅟rc;䅝ƀEas㌖㌘㌛;檶p;檺im;择olint;樓i\xedሄ;䑁otƀ;be㌴ᵇ㌵担;橦΀Aacmstx㍆㍊㍗㍛㍞㍣㍭rr;懘rĀhr㍐㍒\xeb∨Ā;oਸ਼਴t耻\xa7䂧i;䀻war;椩mĀin㍩\xf0nu\xf3\xf1t;朶rĀ;o㍶⁕쀀\ud835\udd30Ȁacoy㎂㎆㎑㎠rp;景Āhy㎋㎏cy;䑉;䑈rtɭ㎙\0\0㎜i\xe4ᑤara\xec⹯耻\xad䂭Āgm㎨㎴maƀ;fv㎱㎲㎲䏃;䏂Ѐ;deglnprካ㏅㏉㏎㏖㏞㏡㏦ot;橪Ā;q኱ኰĀ;E㏓㏔檞;檠Ā;E㏛㏜檝;檟e;扆lus;樤arr;楲ar\xf2ᄽȀaeit㏸㐈㐏㐗Āls㏽㐄lsetm\xe9㍪hp;樳parsl;槤Ādlᑣ㐔e;挣Ā;e㐜㐝檪Ā;s㐢㐣檬;쀀⪬︀ƀflp㐮㐳㑂tcy;䑌Ā;b㐸㐹䀯Ā;a㐾㐿槄r;挿f;쀀\ud835\udd64aĀdr㑍ЂesĀ;u㑔㑕晠it\xbb㑕ƀcsu㑠㑹㒟Āau㑥㑯pĀ;sᆈ㑫;쀀⊓︀pĀ;sᆴ㑵;쀀⊔︀uĀbp㑿㒏ƀ;esᆗᆜ㒆etĀ;eᆗ㒍\xf1ᆝƀ;esᆨᆭ㒖etĀ;eᆨ㒝\xf1ᆮƀ;afᅻ㒦ְrť㒫ֱ\xbbᅼar\xf2ᅈȀcemt㒹㒾㓂㓅r;쀀\ud835\udcc8tm\xee\xf1i\xec㐕ar\xe6ᆾĀar㓎㓕rĀ;f㓔ឿ昆Āan㓚㓭ightĀep㓣㓪psilo\xeeỠh\xe9⺯s\xbb⡒ʀbcmnp㓻㕞ሉ㖋㖎Ҁ;Edemnprs㔎㔏㔑㔕㔞㔣㔬㔱㔶抂;櫅ot;檽Ā;dᇚ㔚ot;櫃ult;櫁ĀEe㔨㔪;櫋;把lus;檿arr;楹ƀeiu㔽㕒㕕tƀ;en㔎㕅㕋qĀ;qᇚ㔏eqĀ;q㔫㔨m;櫇Ābp㕚㕜;櫕;櫓c̀;acensᇭ㕬㕲㕹㕻㌦ppro\xf8㋺urlye\xf1ᇾ\xf1ᇳƀaes㖂㖈㌛ppro\xf8㌚q\xf1㌗g;晪ڀ123;Edehlmnps㖩㖬㖯ሜ㖲㖴㗀㗉㗕㗚㗟㗨㗭耻\xb9䂹耻\xb2䂲耻\xb3䂳;櫆Āos㖹㖼t;檾ub;櫘Ā;dሢ㗅ot;櫄sĀou㗏㗒l;柉b;櫗arr;楻ult;櫂ĀEe㗤㗦;櫌;抋lus;櫀ƀeiu㗴㘉㘌tƀ;enሜ㗼㘂qĀ;qሢ㖲eqĀ;q㗧㗤m;櫈Ābp㘑㘓;櫔;櫖ƀAan㘜㘠㘭rr;懙rĀhr㘦㘨\xeb∮Ā;oਫ਩war;椪lig耻\xdf䃟௡㙑㙝㙠ዎ㙳㙹\0㙾㛂\0\0\0\0\0㛛㜃\0㜉㝬\0\0\0㞇ɲ㙖\0\0㙛get;挖;䏄r\xeb๟ƀaey㙦㙫㙰ron;䅥dil;䅣;䑂lrec;挕r;쀀\ud835\udd31Ȁeiko㚆㚝㚵㚼Dz㚋\0㚑eĀ4fኄኁaƀ;sv㚘㚙㚛䎸ym;䏑Ācn㚢㚲kĀas㚨㚮ppro\xf8዁im\xbbኬs\xf0ኞĀas㚺㚮\xf0዁rn耻\xfe䃾Ǭ̟㛆⋧es膀\xd7;bd㛏㛐㛘䃗Ā;aᤏ㛕r;樱;樰ƀeps㛡㛣㜀\xe1⩍Ȁ;bcf҆㛬㛰㛴ot;挶ir;櫱Ā;o㛹㛼쀀\ud835\udd65rk;櫚\xe1㍢rime;怴ƀaip㜏㜒㝤d\xe5ቈ΀adempst㜡㝍㝀㝑㝗㝜㝟ngleʀ;dlqr㜰㜱㜶㝀㝂斵own\xbbᶻeftĀ;e⠀㜾\xf1म;扜ightĀ;e㊪㝋\xf1ၚot;旬inus;樺lus;樹b;槍ime;樻ezium;揢ƀcht㝲㝽㞁Āry㝷㝻;쀀\ud835\udcc9;䑆cy;䑛rok;䅧Āio㞋㞎x\xf4᝷headĀlr㞗㞠eftarro\xf7ࡏightarrow\xbbཝऀAHabcdfghlmoprstuw㟐㟓㟗㟤㟰㟼㠎㠜㠣㠴㡑㡝㡫㢩㣌㣒㣪㣶r\xf2ϭar;楣Ācr㟜㟢ute耻\xfa䃺\xf2ᅐrǣ㟪\0㟭y;䑞ve;䅭Āiy㟵㟺rc耻\xfb䃻;䑃ƀabh㠃㠆㠋r\xf2Ꭽlac;䅱a\xf2ᏃĀir㠓㠘sht;楾;쀀\ud835\udd32rave耻\xf9䃹š㠧㠱rĀlr㠬㠮\xbbॗ\xbbႃlk;斀Āct㠹㡍ɯ㠿\0\0㡊rnĀ;e㡅㡆挜r\xbb㡆op;挏ri;旸Āal㡖㡚cr;䅫肻\xa8͉Āgp㡢㡦on;䅳f;쀀\ud835\udd66̀adhlsuᅋ㡸㡽፲㢑㢠own\xe1ᎳarpoonĀlr㢈㢌ef\xf4㠭igh\xf4㠯iƀ;hl㢙㢚㢜䏅\xbbᏺon\xbb㢚parrows;懈ƀcit㢰㣄㣈ɯ㢶\0\0㣁rnĀ;e㢼㢽挝r\xbb㢽op;挎ng;䅯ri;旹cr;쀀\ud835\udccaƀdir㣙㣝㣢ot;拰lde;䅩iĀ;f㜰㣨\xbb᠓Āam㣯㣲r\xf2㢨l耻\xfc䃼angle;榧ހABDacdeflnoprsz㤜㤟㤩㤭㦵㦸㦽㧟㧤㧨㧳㧹㧽㨁㨠r\xf2ϷarĀ;v㤦㤧櫨;櫩as\xe8ϡĀnr㤲㤷grt;榜΀eknprst㓣㥆㥋㥒㥝㥤㦖app\xe1␕othin\xe7ẖƀhir㓫⻈㥙op\xf4⾵Ā;hᎷ㥢\xefㆍĀiu㥩㥭gm\xe1㎳Ābp㥲㦄setneqĀ;q㥽㦀쀀⊊︀;쀀⫋︀setneqĀ;q㦏㦒쀀⊋︀;쀀⫌︀Āhr㦛㦟et\xe1㚜iangleĀlr㦪㦯eft\xbbथight\xbbၑy;䐲ash\xbbံƀelr㧄㧒㧗ƀ;beⷪ㧋㧏ar;抻q;扚lip;拮Ābt㧜ᑨa\xf2ᑩr;쀀\ud835\udd33tr\xe9㦮suĀbp㧯㧱\xbbജ\xbb൙pf;쀀\ud835\udd67ro\xf0໻tr\xe9㦴Ācu㨆㨋r;쀀\ud835\udccbĀbp㨐㨘nĀEe㦀㨖\xbb㥾nĀEe㦒㨞\xbb㦐igzag;榚΀cefoprs㨶㨻㩖㩛㩔㩡㩪irc;䅵Ādi㩀㩑Ābg㩅㩉ar;機eĀ;qᗺ㩏;扙erp;愘r;쀀\ud835\udd34pf;쀀\ud835\udd68Ā;eᑹ㩦at\xe8ᑹcr;쀀\ud835\udcccૣណ㪇\0㪋\0㪐㪛\0\0㪝㪨㪫㪯\0\0㫃㫎\0㫘ៜ៟tr\xe9៑r;쀀\ud835\udd35ĀAa㪔㪗r\xf2σr\xf2৶;䎾ĀAa㪡㪤r\xf2θr\xf2৫a\xf0✓is;拻ƀdptឤ㪵㪾Āfl㪺ឩ;쀀\ud835\udd69im\xe5ឲĀAa㫇㫊r\xf2ώr\xf2ਁĀcq㫒ីr;쀀\ud835\udccdĀpt៖㫜r\xe9។Ѐacefiosu㫰㫽㬈㬌㬑㬕㬛㬡cĀuy㫶㫻te耻\xfd䃽;䑏Āiy㬂㬆rc;䅷;䑋n耻\xa5䂥r;쀀\ud835\udd36cy;䑗pf;쀀\ud835\udd6acr;쀀\ud835\udcceĀcm㬦㬩y;䑎l耻\xff䃿Ԁacdefhiosw㭂㭈㭔㭘㭤㭩㭭㭴㭺㮀cute;䅺Āay㭍㭒ron;䅾;䐷ot;䅼Āet㭝㭡tr\xe6ᕟa;䎶r;쀀\ud835\udd37cy;䐶grarr;懝pf;쀀\ud835\udd6bcr;쀀\ud835\udccfĀjn㮅㮇;怍j;怌'.split("").map(e=>e.charCodeAt(0)))},5949:function(e,t,r){r.d(t,{s:()=>n});let n=new Uint16Array("Ȁaglq \x15\x18\x1bɭ\x0f\0\0\x12p;䀦os;䀧t;䀾t;䀼uot;䀢".split("").map(e=>e.charCodeAt(0)))},9496:function(){},8466:function(e,t,r){r.d(t,{Gj:()=>o.Gj,WY:()=>o.WY,X1:()=>o.X1}),r(2990),r(466);var n,i,a,s,o=r(747);(n=a||(a={}))[n.XML=0]="XML",n[n.HTML=1]="HTML",(i=s||(s={}))[i.UTF8=0]="UTF8",i[i.ASCII=1]="ASCII",i[i.Extensive=2]="Extensive",i[i.Attribute=3]="Attribute",i[i.Text=4]="Text"},4645:function(e,t,r){r.d(t,{i:()=>g});var n=r(5645),i=r(2990);let a=new Set(["input","option","optgroup","select","button","datalist","textarea"]),s=new Set(["p"]),o=new Set(["thead","tbody"]),l=new Set(["dd","dt"]),c=new Set(["rt","rp"]),u=new Map([["tr",new Set(["tr","th","td"])],["th",new Set(["th"])],["td",new Set(["thead","th","td"])],["body",new Set(["head","link","script"])],["li",new Set(["li"])],["p",s],["h1",s],["h2",s],["h3",s],["h4",s],["h5",s],["h6",s],["select",a],["input",a],["output",a],["button",a],["datalist",a],["textarea",a],["option",new Set(["option"])],["optgroup",new Set(["optgroup","option"])],["dd",l],["dt",l],["address",s],["article",s],["aside",s],["blockquote",s],["details",s],["div",s],["dl",s],["fieldset",s],["figcaption",s],["figure",s],["footer",s],["form",s],["header",s],["hr",s],["main",s],["nav",s],["ol",s],["pre",s],["section",s],["table",s],["ul",s],["rt",c],["rp",c],["tbody",o],["tfoot",o]]),d=new Set(["area","base","basefont","br","col","command","embed","frame","hr","img","input","isindex","keygen","link","meta","param","source","track","wbr"]),h=new Set(["math","svg"]),p=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignobject","desc","title"]),f=/\s|\//;class g{constructor(e,t={}){var r,i,a,s,o,l;this.options=t,this.startIndex=0,this.endIndex=0,this.openTagStart=0,this.tagname="",this.attribname="",this.attribvalue="",this.attribs=null,this.stack=[],this.buffers=[],this.bufferOffset=0,this.writeIndex=0,this.ended=!1,this.cbs=null!=e?e:{},this.htmlMode=!this.options.xmlMode,this.lowerCaseTagNames=null!=(r=t.lowerCaseTags)?r:this.htmlMode,this.lowerCaseAttributeNames=null!=(i=t.lowerCaseAttributeNames)?i:this.htmlMode,this.recognizeSelfClosing=null!=(a=t.recognizeSelfClosing)?a:!this.htmlMode,this.tokenizer=new(null!=(s=t.Tokenizer)?s:n.A)(this.options,this),this.foreignContext=[!this.htmlMode],null==(l=(o=this.cbs).onparserinit)||l.call(o,this)}ontext(e,t){var r,n;let i=this.getSlice(e,t);this.endIndex=t-1,null==(n=(r=this.cbs).ontext)||n.call(r,i),this.startIndex=t}ontextentity(e,t){var r,n;this.endIndex=t-1,null==(n=(r=this.cbs).ontext)||n.call(r,(0,i.MK)(e)),this.startIndex=t}isVoidElement(e){return this.htmlMode&&d.has(e)}onopentagname(e,t){this.endIndex=t;let r=this.getSlice(e,t);this.lowerCaseTagNames&&(r=r.toLowerCase()),this.emitOpenTag(r)}emitOpenTag(e){var t,r,n,i;this.openTagStart=this.startIndex,this.tagname=e;let a=this.htmlMode&&u.get(e);if(a)for(;this.stack.length>0&&a.has(this.stack[0]);){let e=this.stack.shift();null==(r=(t=this.cbs).onclosetag)||r.call(t,e,!0)}!this.isVoidElement(e)&&(this.stack.unshift(e),this.htmlMode&&(h.has(e)?this.foreignContext.unshift(!0):p.has(e)&&this.foreignContext.unshift(!1))),null==(i=(n=this.cbs).onopentagname)||i.call(n,e),this.cbs.onopentag&&(this.attribs={})}endOpenTag(e){var t,r;this.startIndex=this.openTagStart,this.attribs&&(null==(r=(t=this.cbs).onopentag)||r.call(t,this.tagname,this.attribs,e),this.attribs=null),this.cbs.onclosetag&&this.isVoidElement(this.tagname)&&this.cbs.onclosetag(this.tagname,!0),this.tagname=""}onopentagend(e){this.endIndex=e,this.endOpenTag(!1),this.startIndex=e+1}onclosetag(e,t){var r,n,i,a,s,o,l,c;this.endIndex=t;let u=this.getSlice(e,t);if(this.lowerCaseTagNames&&(u=u.toLowerCase()),this.htmlMode&&(h.has(u)||p.has(u))&&this.foreignContext.shift(),this.isVoidElement(u))this.htmlMode&&"br"===u&&(null==(a=(i=this.cbs).onopentagname)||a.call(i,"br"),null==(o=(s=this.cbs).onopentag)||o.call(s,"br",{},!0),null==(c=(l=this.cbs).onclosetag)||c.call(l,"br",!1));else{let e=this.stack.indexOf(u);if(-1!==e)for(let t=0;t<=e;t++){let i=this.stack.shift();null==(n=(r=this.cbs).onclosetag)||n.call(r,i,t!==e)}else this.htmlMode&&"p"===u&&(this.emitOpenTag("p"),this.closeCurrentTag(!0))}this.startIndex=t+1}onselfclosingtag(e){this.endIndex=e,this.recognizeSelfClosing||this.foreignContext[0]?(this.closeCurrentTag(!1),this.startIndex=e+1):this.onopentagend(e)}closeCurrentTag(e){var t,r;let n=this.tagname;this.endOpenTag(e),this.stack[0]===n&&(null==(r=(t=this.cbs).onclosetag)||r.call(t,n,!e),this.stack.shift())}onattribname(e,t){this.startIndex=e;let r=this.getSlice(e,t);this.attribname=this.lowerCaseAttributeNames?r.toLowerCase():r}onattribdata(e,t){this.attribvalue+=this.getSlice(e,t)}onattribentity(e){this.attribvalue+=(0,i.MK)(e)}onattribend(e,t){var r,i;this.endIndex=t,null==(i=(r=this.cbs).onattribute)||i.call(r,this.attribname,this.attribvalue,e===n.X.Double?'"':e===n.X.Single?"'":e===n.X.NoValue?void 0:null),this.attribs&&!Object.prototype.hasOwnProperty.call(this.attribs,this.attribname)&&(this.attribs[this.attribname]=this.attribvalue),this.attribvalue=""}getInstructionName(e){let t=e.search(f),r=t<0?e:e.substr(0,t);return this.lowerCaseTagNames&&(r=r.toLowerCase()),r}ondeclaration(e,t){this.endIndex=t;let r=this.getSlice(e,t);if(this.cbs.onprocessinginstruction){let e=this.getInstructionName(r);this.cbs.onprocessinginstruction(`!${e}`,`!${r}`)}this.startIndex=t+1}onprocessinginstruction(e,t){this.endIndex=t;let r=this.getSlice(e,t);if(this.cbs.onprocessinginstruction){let e=this.getInstructionName(r);this.cbs.onprocessinginstruction(`?${e}`,`?${r}`)}this.startIndex=t+1}oncomment(e,t,r){var n,i,a,s;this.endIndex=t,null==(i=(n=this.cbs).oncomment)||i.call(n,this.getSlice(e,t-r)),null==(s=(a=this.cbs).oncommentend)||s.call(a),this.startIndex=t+1}oncdata(e,t,r){var n,i,a,s,o,l,c,u,d,h;this.endIndex=t;let p=this.getSlice(e,t-r);!this.htmlMode||this.options.recognizeCDATA?(null==(i=(n=this.cbs).oncdatastart)||i.call(n),null==(s=(a=this.cbs).ontext)||s.call(a,p),null==(l=(o=this.cbs).oncdataend)||l.call(o)):(null==(u=(c=this.cbs).oncomment)||u.call(c,`[CDATA[${p}]]`),null==(h=(d=this.cbs).oncommentend)||h.call(d)),this.startIndex=t+1}onend(){var e,t;if(this.cbs.onclosetag){this.endIndex=this.startIndex;for(let e=0;e=this.buffers[0].length;)this.shiftBuffer();let r=this.buffers[0].slice(e-this.bufferOffset,t-this.bufferOffset);for(;t-this.bufferOffset>this.buffers[0].length;)this.shiftBuffer(),r+=this.buffers[0].slice(0,t-this.bufferOffset);return r}shiftBuffer(){this.bufferOffset+=this.buffers[0].length,this.writeIndex--,this.buffers.shift()}write(e){var t,r;if(this.ended){null==(r=(t=this.cbs).onerror)||r.call(t,Error(".write() after done!"));return}this.buffers.push(e),this.tokenizer.running&&(this.tokenizer.write(e),this.writeIndex++)}end(e){var t,r;if(this.ended){null==(r=(t=this.cbs).onerror)||r.call(t,Error(".end() after done!"));return}e&&this.write(e),this.ended=!0,this.tokenizer.end()}pause(){this.tokenizer.pause()}resume(){for(this.tokenizer.resume();this.tokenizer.running&&this.writeIndexp,X:()=>l});var n,i,a,s,o,l,c=r(2990);function u(e){return e===s.Space||e===s.NewLine||e===s.Tab||e===s.FormFeed||e===s.CarriageReturn}function d(e){return e===s.Slash||e===s.Gt||u(e)}(n=s||(s={}))[n.Tab=9]="Tab",n[n.NewLine=10]="NewLine",n[n.FormFeed=12]="FormFeed",n[n.CarriageReturn=13]="CarriageReturn",n[n.Space=32]="Space",n[n.ExclamationMark=33]="ExclamationMark",n[n.Number=35]="Number",n[n.Amp=38]="Amp",n[n.SingleQuote=39]="SingleQuote",n[n.DoubleQuote=34]="DoubleQuote",n[n.Dash=45]="Dash",n[n.Slash=47]="Slash",n[n.Zero=48]="Zero",n[n.Nine=57]="Nine",n[n.Semi=59]="Semi",n[n.Lt=60]="Lt",n[n.Eq=61]="Eq",n[n.Gt=62]="Gt",n[n.Questionmark=63]="Questionmark",n[n.UpperA=65]="UpperA",n[n.LowerA=97]="LowerA",n[n.UpperF=70]="UpperF",n[n.LowerF=102]="LowerF",n[n.UpperZ=90]="UpperZ",n[n.LowerZ=122]="LowerZ",n[n.LowerX=120]="LowerX",n[n.OpeningSquareBracket=91]="OpeningSquareBracket",(i=o||(o={}))[i.Text=1]="Text",i[i.BeforeTagName=2]="BeforeTagName",i[i.InTagName=3]="InTagName",i[i.InSelfClosingTag=4]="InSelfClosingTag",i[i.BeforeClosingTagName=5]="BeforeClosingTagName",i[i.InClosingTagName=6]="InClosingTagName",i[i.AfterClosingTagName=7]="AfterClosingTagName",i[i.BeforeAttributeName=8]="BeforeAttributeName",i[i.InAttributeName=9]="InAttributeName",i[i.AfterAttributeName=10]="AfterAttributeName",i[i.BeforeAttributeValue=11]="BeforeAttributeValue",i[i.InAttributeValueDq=12]="InAttributeValueDq",i[i.InAttributeValueSq=13]="InAttributeValueSq",i[i.InAttributeValueNq=14]="InAttributeValueNq",i[i.BeforeDeclaration=15]="BeforeDeclaration",i[i.InDeclaration=16]="InDeclaration",i[i.InProcessingInstruction=17]="InProcessingInstruction",i[i.BeforeComment=18]="BeforeComment",i[i.CDATASequence=19]="CDATASequence",i[i.InSpecialComment=20]="InSpecialComment",i[i.InCommentLike=21]="InCommentLike",i[i.BeforeSpecialS=22]="BeforeSpecialS",i[i.BeforeSpecialT=23]="BeforeSpecialT",i[i.SpecialStartSequence=24]="SpecialStartSequence",i[i.InSpecialTag=25]="InSpecialTag",i[i.InEntity=26]="InEntity",(a=l||(l={}))[a.NoValue=0]="NoValue",a[a.Unquoted=1]="Unquoted",a[a.Single=2]="Single",a[a.Double=3]="Double";let h={Cdata:new Uint8Array([67,68,65,84,65,91]),CdataEnd:new Uint8Array([93,93,62]),CommentEnd:new Uint8Array([45,45,62]),ScriptEnd:new Uint8Array([60,47,115,99,114,105,112,116]),StyleEnd:new Uint8Array([60,47,115,116,121,108,101]),TitleEnd:new Uint8Array([60,47,116,105,116,108,101]),TextareaEnd:new Uint8Array([60,47,116,101,120,116,97,114,101,97]),XmpEnd:new Uint8Array([60,47,120,109,112])};class p{constructor({xmlMode:e=!1,decodeEntities:t=!0},r){this.cbs=r,this.state=o.Text,this.buffer="",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=o.Text,this.isSpecial=!1,this.running=!0,this.offset=0,this.currentSequence=void 0,this.sequenceIndex=0,this.xmlMode=e,this.decodeEntities=t,this.entityDecoder=new c.Wf(e?c.sr:c.qN,(e,t)=>this.emitCodePoint(e,t))}reset(){this.state=o.Text,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=o.Text,this.currentSequence=void 0,this.running=!0,this.offset=0}write(e){this.offset+=this.buffer.length,this.buffer=e,this.parse()}end(){this.running&&this.finish()}pause(){this.running=!1}resume(){this.running=!0,this.indexthis.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=o.BeforeTagName,this.sectionStart=this.index):this.decodeEntities&&e===s.Amp&&this.startEntity()}stateSpecialStartSequence(e){let t=this.sequenceIndex===this.currentSequence.length;if(t?d(e):(32|e)===this.currentSequence[this.sequenceIndex]){if(!t)return void this.sequenceIndex++}else this.isSpecial=!1;this.sequenceIndex=0,this.state=o.InTagName,this.stateInTagName(e)}stateInSpecialTag(e){if(this.sequenceIndex===this.currentSequence.length){if(e===s.Gt||u(e)){let t=this.index-this.currentSequence.length;if(this.sectionStart=s.LowerA&&e<=s.LowerZ||e>=s.UpperA&&e<=s.UpperZ}startSpecial(e,t){this.isSpecial=!0,this.currentSequence=e,this.sequenceIndex=t,this.state=o.SpecialStartSequence}stateBeforeTagName(e){if(e===s.ExclamationMark)this.state=o.BeforeDeclaration,this.sectionStart=this.index+1;else if(e===s.Questionmark)this.state=o.InProcessingInstruction,this.sectionStart=this.index+1;else if(this.isTagStartChar(e)){let t=32|e;this.sectionStart=this.index,this.xmlMode?this.state=o.InTagName:t===h.ScriptEnd[2]?this.state=o.BeforeSpecialS:t===h.TitleEnd[2]||t===h.XmpEnd[2]?this.state=o.BeforeSpecialT:this.state=o.InTagName}else e===s.Slash?this.state=o.BeforeClosingTagName:(this.state=o.Text,this.stateText(e))}stateInTagName(e){d(e)&&(this.cbs.onopentagname(this.sectionStart,this.index),this.sectionStart=-1,this.state=o.BeforeAttributeName,this.stateBeforeAttributeName(e))}stateBeforeClosingTagName(e){u(e)||(e===s.Gt?this.state=o.Text:(this.state=this.isTagStartChar(e)?o.InClosingTagName:o.InSpecialComment,this.sectionStart=this.index))}stateInClosingTagName(e){(e===s.Gt||u(e))&&(this.cbs.onclosetag(this.sectionStart,this.index),this.sectionStart=-1,this.state=o.AfterClosingTagName,this.stateAfterClosingTagName(e))}stateAfterClosingTagName(e){(e===s.Gt||this.fastForwardTo(s.Gt))&&(this.state=o.Text,this.sectionStart=this.index+1)}stateBeforeAttributeName(e){e===s.Gt?(this.cbs.onopentagend(this.index),this.isSpecial?(this.state=o.InSpecialTag,this.sequenceIndex=0):this.state=o.Text,this.sectionStart=this.index+1):e===s.Slash?this.state=o.InSelfClosingTag:u(e)||(this.state=o.InAttributeName,this.sectionStart=this.index)}stateInSelfClosingTag(e){e===s.Gt?(this.cbs.onselfclosingtag(this.index),this.state=o.Text,this.sectionStart=this.index+1,this.isSpecial=!1):u(e)||(this.state=o.BeforeAttributeName,this.stateBeforeAttributeName(e))}stateInAttributeName(e){(e===s.Eq||d(e))&&(this.cbs.onattribname(this.sectionStart,this.index),this.sectionStart=this.index,this.state=o.AfterAttributeName,this.stateAfterAttributeName(e))}stateAfterAttributeName(e){e===s.Eq?this.state=o.BeforeAttributeValue:e===s.Slash||e===s.Gt?(this.cbs.onattribend(l.NoValue,this.sectionStart),this.sectionStart=-1,this.state=o.BeforeAttributeName,this.stateBeforeAttributeName(e)):u(e)||(this.cbs.onattribend(l.NoValue,this.sectionStart),this.state=o.InAttributeName,this.sectionStart=this.index)}stateBeforeAttributeValue(e){e===s.DoubleQuote?(this.state=o.InAttributeValueDq,this.sectionStart=this.index+1):e===s.SingleQuote?(this.state=o.InAttributeValueSq,this.sectionStart=this.index+1):u(e)||(this.sectionStart=this.index,this.state=o.InAttributeValueNq,this.stateInAttributeValueNoQuotes(e))}handleInAttributeValue(e,t){e===t||!this.decodeEntities&&this.fastForwardTo(t)?(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(t===s.DoubleQuote?l.Double:l.Single,this.index+1),this.state=o.BeforeAttributeName):this.decodeEntities&&e===s.Amp&&this.startEntity()}stateInAttributeValueDoubleQuotes(e){this.handleInAttributeValue(e,s.DoubleQuote)}stateInAttributeValueSingleQuotes(e){this.handleInAttributeValue(e,s.SingleQuote)}stateInAttributeValueNoQuotes(e){u(e)||e===s.Gt?(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(l.Unquoted,this.index),this.state=o.BeforeAttributeName,this.stateBeforeAttributeName(e)):this.decodeEntities&&e===s.Amp&&this.startEntity()}stateBeforeDeclaration(e){e===s.OpeningSquareBracket?(this.state=o.CDATASequence,this.sequenceIndex=0):this.state=e===s.Dash?o.BeforeComment:o.InDeclaration}stateInDeclaration(e){(e===s.Gt||this.fastForwardTo(s.Gt))&&(this.cbs.ondeclaration(this.sectionStart,this.index),this.state=o.Text,this.sectionStart=this.index+1)}stateInProcessingInstruction(e){(e===s.Gt||this.fastForwardTo(s.Gt))&&(this.cbs.onprocessinginstruction(this.sectionStart,this.index),this.state=o.Text,this.sectionStart=this.index+1)}stateBeforeComment(e){e===s.Dash?(this.state=o.InCommentLike,this.currentSequence=h.CommentEnd,this.sequenceIndex=2,this.sectionStart=this.index+1):this.state=o.InDeclaration}stateInSpecialComment(e){(e===s.Gt||this.fastForwardTo(s.Gt))&&(this.cbs.oncomment(this.sectionStart,this.index,0),this.state=o.Text,this.sectionStart=this.index+1)}stateBeforeSpecialS(e){let t=32|e;t===h.ScriptEnd[3]?this.startSpecial(h.ScriptEnd,4):t===h.StyleEnd[3]?this.startSpecial(h.StyleEnd,4):(this.state=o.InTagName,this.stateInTagName(e))}stateBeforeSpecialT(e){switch(32|e){case h.TitleEnd[3]:this.startSpecial(h.TitleEnd,4);break;case h.TextareaEnd[3]:this.startSpecial(h.TextareaEnd,4);break;case h.XmpEnd[3]:this.startSpecial(h.XmpEnd,4);break;default:this.state=o.InTagName,this.stateInTagName(e)}}startEntity(){this.baseState=this.state,this.state=o.InEntity,this.entityStart=this.index,this.entityDecoder.startEntity(this.xmlMode?c.FJ.Strict:this.baseState===o.Text||this.baseState===o.InSpecialTag?c.FJ.Legacy:c.FJ.Attribute)}stateInEntity(){let e=this.entityDecoder.write(this.buffer,this.index-this.offset);e>=0?(this.state=this.baseState,0===e&&(this.index=this.entityStart)):this.index=this.offset+this.buffer.length-1}cleanup(){this.running&&this.sectionStart!==this.index&&(this.state===o.Text||this.state===o.InSpecialTag&&0===this.sequenceIndex?(this.cbs.ontext(this.sectionStart,this.index),this.sectionStart=this.index):(this.state===o.InAttributeValueDq||this.state===o.InAttributeValueSq||this.state===o.InAttributeValueNq)&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=this.index))}shouldContinue(){return this.index=e||(this.state===o.InCommentLike?this.currentSequence===h.CdataEnd?this.cbs.oncdata(this.sectionStart,e,0):this.cbs.oncomment(this.sectionStart,e,0):this.state===o.InTagName||this.state===o.BeforeAttributeName||this.state===o.BeforeAttributeValue||this.state===o.AfterAttributeName||this.state===o.InAttributeName||this.state===o.InAttributeValueSq||this.state===o.InAttributeValueDq||this.state===o.InAttributeValueNq||this.state===o.InClosingTagName||this.cbs.ontext(this.sectionStart,e))}emitCodePoint(e,t){this.baseState!==o.Text&&this.baseState!==o.InSpecialTag?(this.sectionStarti,iX:()=>n.i});var n=r(4645);r(8866),r(5645);var i=r(2743);r(4993)},6570:function(e,t,r){let n,i,a,s;r.d(t,{P2:()=>f});let o=(e,t)=>t.some(t=>e instanceof t),l=new WeakMap,c=new WeakMap,u=new WeakMap,d={get(e,t,r){if(e instanceof IDBTransaction){if("done"===t)return l.get(e);if("store"===t)return r.objectStoreNames[1]?void 0:r.objectStore(r.objectStoreNames[0])}return h(e[t])},set:(e,t,r)=>(e[t]=r,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function h(e){if(e instanceof IDBRequest){let t;return t=new Promise((t,r)=>{let n=()=>{e.removeEventListener("success",i),e.removeEventListener("error",a)},i=()=>{t(h(e.result)),n()},a=()=>{r(e.error),n()};e.addEventListener("success",i),e.addEventListener("error",a)}),u.set(t,e),t}if(c.has(e))return c.get(e);let t=function(e){if("function"==typeof e)return(i||(i=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(p(this),t),h(this.request)}:function(...t){return h(e.apply(p(this),t))};return(e instanceof IDBTransaction&&function(e){if(l.has(e))return;let t=new Promise((t,r)=>{let n=()=>{e.removeEventListener("complete",i),e.removeEventListener("error",a),e.removeEventListener("abort",a)},i=()=>{t(),n()},a=()=>{r(e.error||new DOMException("AbortError","AbortError")),n()};e.addEventListener("complete",i),e.addEventListener("error",a),e.addEventListener("abort",a)});l.set(e,t)}(e),o(e,n||(n=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])))?new Proxy(e,d):e}(e);return t!==e&&(c.set(e,t),u.set(t,e)),t}let p=e=>u.get(e);function f(e,t,{blocked:r,upgrade:n,blocking:i,terminated:a}={}){let s=indexedDB.open(e,t),o=h(s);return n&&s.addEventListener("upgradeneeded",e=>{n(h(s.result),e.oldVersion,e.newVersion,h(s.transaction),e)}),r&&s.addEventListener("blocked",e=>r(e.oldVersion,e.newVersion,e)),o.then(e=>{a&&e.addEventListener("close",()=>a()),i&&e.addEventListener("versionchange",e=>i(e.oldVersion,e.newVersion,e))}).catch(()=>{}),o}let g=["get","getKey","getAll","getAllKeys","count"],m=["put","add","delete","clear"],y=new Map;function b(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&"string"==typeof t))return;if(y.get(t))return y.get(t);let r=t.replace(/FromIndex$/,""),n=t!==r,i=m.includes(r);if(!(r in(n?IDBIndex:IDBObjectStore).prototype)||!(i||g.includes(r)))return;let a=async function(e,...t){let a=this.transaction(e,i?"readwrite":"readonly"),s=a.store;return n&&(s=s.index(t.shift())),(await Promise.all([s[r](...t),i&&a.done]))[0]};return y.set(t,a),a}d={...a=d,get:(e,t,r)=>b(e,t)||a.get(e,t,r),has:(e,t)=>!!b(e,t)||a.has(e,t)};let w=["continue","continuePrimaryKey","advance"],S={},v=new WeakMap,x=new WeakMap,E={get(e,t){if(!w.includes(t))return e[t];let r=S[t];return r||(r=S[t]=function(...e){v.set(this,x.get(this)[t](...e))}),r}};async function*T(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;let r=new Proxy(t,E);for(x.set(r,t),u.set(r,p(t));t;)yield r,t=await (v.get(r)||t.continue()),v.delete(r)}function k(e,t){return t===Symbol.asyncIterator&&o(e,[IDBIndex,IDBObjectStore,IDBCursor])||"iterate"===t&&o(e,[IDBIndex,IDBObjectStore])}d={...s=d,get:(e,t,r)=>k(e,t)?T:s.get(e,t,r),has:(e,t)=>k(e,t)||s.has(e,t)}},1652:function(e,t,r){r.d(t,{N:()=>n});function n(){return"10000000000".replace(/[018]/g,e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16))}},3907:function(e,t,r){let n;r.d(t,{LW:()=>b,QR:()=>x});var i=r(1652);function a(e,t){try{return e.apply(this,t)}catch(r){let e,t=(e=n.__externref_table_alloc(),n.__wbindgen_export_2.set(e,r),e);n.__wbindgen_exn_store(t)}}let s="undefined"!=typeof TextDecoder?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};"undefined"!=typeof TextDecoder&&s.decode();let o=null;function l(){return(null===o||0===o.byteLength)&&(o=new Uint8Array(n.memory.buffer)),o}function c(e,t){return e>>>=0,s.decode(l().subarray(e,e+t))}let u=0,d="undefined"!=typeof TextEncoder?new TextEncoder("utf-8"):{encode:()=>{throw Error("TextEncoder not available")}},h="function"==typeof d.encodeInto?function(e,t){return d.encodeInto(e,t)}:function(e,t){let r=d.encode(e);return t.set(r),{read:e.length,written:r.length}};function p(e,t,r){if(void 0===r){let r=d.encode(e),n=t(r.length,1)>>>0;return l().subarray(n,n+r.length).set(r),u=r.length,n}let n=e.length,i=t(n,1)>>>0,a=l(),s=0;for(;s127)break;a[i+s]=t}if(s!==n){0!==s&&(e=e.slice(s)),i=r(i,n,n=s+3*e.length,1)>>>0;let t=h(e,l().subarray(i+s,i+n));s+=t.written,i=r(i,n,s,1)>>>0}return u=s,i}let f=null;function g(){return(null===f||!0===f.buffer.detached||void 0===f.buffer.detached&&f.buffer!==n.memory.buffer)&&(f=new DataView(n.memory.buffer)),f}function m(e){let t=n.__wbindgen_export_2.get(e);return n.__externref_table_dealloc(e),t}let y="undefined"==typeof FinalizationRegistry?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(e=>n.__wbg_rewriter_free(e>>>0,1));class b{__destroy_into_raw(){let e=this.__wbg_ptr;return this.__wbg_ptr=0,y.unregister(this),e}free(){let e=this.__destroy_into_raw();n.__wbg_rewriter_free(e,0)}rewrite_js(e,t,r,i){let a=p(e,n.__wbindgen_malloc,n.__wbindgen_realloc),s=u,o=p(t,n.__wbindgen_malloc,n.__wbindgen_realloc),l=u,c=p(r,n.__wbindgen_malloc,n.__wbindgen_realloc),d=u,h=n.rewriter_rewrite_js(this.__wbg_ptr,a,s,o,l,c,d,i);if(h[2])throw m(h[1]);return m(h[0])}rewrite_js_bytes(e,t,r,i){let a,s=(a=(0,n.__wbindgen_malloc)(+e.length,1)>>>0,l().set(e,a/1),u=e.length,a),o=u,c=p(t,n.__wbindgen_malloc,n.__wbindgen_realloc),d=u,h=p(r,n.__wbindgen_malloc,n.__wbindgen_realloc),f=u,g=n.rewriter_rewrite_js_bytes(this.__wbg_ptr,s,o,c,d,h,f,i);if(g[2])throw m(g[1]);return m(g[0])}constructor(e){const t=n.rewriter_new(e);if(t[2])throw m(t[1]);return this.__wbg_ptr=t[0]>>>0,y.register(this,this.__wbg_ptr,this),this}}async function w(e,t){if("function"==typeof Response&&e instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(e,t)}catch(t){if("application/wasm"!=e.headers.get("Content-Type"))console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",t);else throw t}let r=await e.arrayBuffer();return await WebAssembly.instantiate(r,t)}{let r=await WebAssembly.instantiate(e,t);return r instanceof WebAssembly.Instance?{instance:r,module:e}:r}}function S(){let e={};return e.wbg={},e.wbg.__wbg_buffer_609cc3eee51ed158=function(e){return e.buffer},e.wbg.__wbg_call_7cccdd69e0791ae2=function(){return a(function(e,t,r){return e.call(t,r)},arguments)},e.wbg.__wbg_call_833bed5770ea2041=function(){return a(function(e,t,r,n){return e.call(t,r,n)},arguments)},e.wbg.__wbg_get_67b2ba62fc30de12=function(){return a(function(e,t){return Reflect.get(e,t)},arguments)},e.wbg.__wbg_new_405e22f390576ce2=function(){return{}},e.wbg.__wbg_new_78feb108b6472713=function(){return[]},e.wbg.__wbg_new_9ffbe0a71eff35e3=function(){return a(function(e,t){return new URL(c(e,t))},arguments)},e.wbg.__wbg_new_a12002a7f91c75be=function(e){return new Uint8Array(e)},e.wbg.__wbg_newwithbase_161c299e7a34e2eb=function(){return a(function(e,t,r,n){return new URL(c(e,t),c(r,n))},arguments)},e.wbg.__wbg_newwithbyteoffsetandlength_d97e637ebe145a9a=function(e,t,r){return new Uint8Array(e,t>>>0,r>>>0)},e.wbg.__wbg_scramtag_3a255d78b157986d=function(e){let t=p((0,i.N)(),n.__wbindgen_malloc,n.__wbindgen_realloc),r=u;g().setInt32(e+4,r,!0),g().setInt32(e+0,t,!0)},e.wbg.__wbg_set_bb8cecf6a62b9f46=function(){return a(function(e,t,r){return Reflect.set(e,t,r)},arguments)},e.wbg.__wbg_toString_5285597960676b7b=function(e){return e.toString()},e.wbg.__wbg_toString_c813bbd34d063839=function(e){return e.toString()},e.wbg.__wbindgen_boolean_get=function(e){return"boolean"==typeof e?+!!e:2},e.wbg.__wbindgen_error_new=function(e,t){return Error(c(e,t))},e.wbg.__wbindgen_init_externref_table=function(){let e=n.__wbindgen_export_2,t=e.grow(4);e.set(0,void 0),e.set(t+0,void 0),e.set(t+1,null),e.set(t+2,!0),e.set(t+3,!1)},e.wbg.__wbindgen_is_function=function(e){return"function"==typeof e},e.wbg.__wbindgen_memory=function(){return n.memory},e.wbg.__wbindgen_string_get=function(e,t){let r="string"==typeof t?t:void 0;var i=null==r?0:p(r,n.__wbindgen_malloc,n.__wbindgen_realloc),a=u;g().setInt32(e+4,a,!0),g().setInt32(e+0,i,!0)},e.wbg.__wbindgen_string_new=function(e,t){return c(e,t)},e.wbg.__wbindgen_throw=function(e,t){throw Error(c(e,t))},e}function v(e,t){return n=e.exports,E.__wbindgen_wasm_module=t,f=null,o=null,n.__wbindgen_start(),n}function x(e){if(void 0!==n)return n;void 0!==e&&(Object.getPrototypeOf(e)===Object.prototype?{module:e}=e:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));let t=S();return e instanceof WebAssembly.Module||(e=new WebAssembly.Module(e)),v(new WebAssembly.Instance(e,t),e)}async function E(e){if(void 0!==n)return n;void 0!==e&&(Object.getPrototypeOf(e)===Object.prototype?{module_or_path:e}=e:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),void 0===e&&(e=new URL("wasm_bg.wasm",""));let t=S();("string"==typeof e||"function"==typeof Request&&e instanceof Request||"function"==typeof URL&&e instanceof URL)&&(e=fetch(e));let{instance:r,module:i}=await w(await e,t);return v(r,i)}}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},globalThis.$scramjetRequire=function(e){return r(409)(e)},globalThis.$scramjetLoadController=function(){return r(9052)},globalThis.$scramjetLoadClient=function(){return r(1323)},globalThis.$scramjetLoadWorker=function(){return r(7510)},globalThis.$scramjetVersion={build:"57ba89e",version:"1.1.0"},"document"in globalThis&&document?.currentScript&&document.currentScript.remove()})(); -//# sourceMappingURL=scramjet.all.js.map \ No newline at end of file + `, + t, + r, + ); + } + async setManualTransport(e, t, r) { + if ("bare-mux-remote" === e) throw Error("Use setRemoteTransport."); + await this.worker.sendMessage({ type: "set", client: { function: e, args: t } }, r); + } + async setRemoteTransport(e, t) { + let r = new MessageChannel(); + (r.port1.onmessage = async t => { + let r = t.data.port, + n = t.data.message; + if ("fetch" === n.type) + try { + e.ready || (await e.init()), + await (async function (e, t, r) { + let n = await r.request(new URL(e.fetch.remote), e.fetch.method, e.fetch.body, e.fetch.headers, null); + if ( + !(function () { + if (null === h) { + let e, + t = new MessageChannel(), + r = new ReadableStream(); + try { + o.call(t.port1, r, [r]), (e = !0); + } catch (t) { + e = !1; + } + return (h = e), e; + } + return h; + })() && + n.body instanceof ReadableStream + ) { + let e = new Response(n.body); + n.body = await e.arrayBuffer(); + } + n.body instanceof ReadableStream || n.body instanceof ArrayBuffer ? o.call(t, { type: "fetch", fetch: n }, [n.body]) : o.call(t, { type: "fetch", fetch: n }); + })(n, r, e); + } catch (e) { + g(r, e, "fetch"); + } + else if ("websocket" === n.type) + try { + e.ready || (await e.init()), + await (async function (e, t, r) { + let [n, i] = r.connect( + new URL(e.websocket.url), + e.websocket.protocols, + e.websocket.requestHeaders, + t => { + o.call(e.websocket.channel, { type: "open", args: [t] }); + }, + t => { + t instanceof ArrayBuffer ? o.call(e.websocket.channel, { type: "message", args: [t] }, [t]) : o.call(e.websocket.channel, { type: "message", args: [t] }); + }, + (t, r) => { + o.call(e.websocket.channel, { type: "close", args: [t, r] }); + }, + t => { + o.call(e.websocket.channel, { type: "error", args: [t] }); + }, + ); + (e.websocket.channel.onmessage = e => { + "data" === e.data.type ? n(e.data.data) : "close" === e.data.type && i(e.data.closeCode, e.data.closeReason); + }), + o.call(t, { type: "websocket" }); + })(n, r, e); + } catch (e) { + g(r, e, "websocket"); + } + }), + await this.worker.sendMessage({ type: "set", client: { function: "bare-mux-remote", args: [r.port2, t] } }, [r.port2]); + } + getInnerPort() { + return this.worker.port; + } + } + class S { + worker; + constructor(e) { + this.worker = new p(e); + } + createWebSocket(e, t = [], r, n) { + try { + e = new URL(e); + } catch (t) { + throw new DOMException(`Faiiled to construct 'WebSocket': The URL '${e}' is invalid.`); + } + if (!m.includes(e.protocol)) throw new DOMException(`Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${e.protocol}' is not allowed.`); + for (let e of (Array.isArray(t) || (t = [t]), (t = t.map(String)))) + if ( + !(function (e) { + for (let t = 0; t < e.length; t++) { + let r = e[t]; + if (!"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~".includes(r)) return !1; + } + return !0; + })(e) + ) + throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${e}' is invalid.`); + return (n = n || {}), new f(e, t, this.worker, n); + } + async fetch(e, t) { + let r = new Request(e, t), + i = t?.headers || r.headers, + a = i instanceof Headers ? Object.fromEntries(i) : i, + s = r.body, + o = new URL(r.url); + if (o.protocol.startsWith("blob:")) { + let e = await n(o), + t = new Response(e.body, e); + return (t.rawHeaders = Object.fromEntries(e.headers)), (t.rawResponse = { body: e.body, headers: Object.fromEntries(e.headers), status: e.status, statusText: e.statusText }), (t.finalURL = o.toString()), t; + } + for (let e = 0; ; e++) { + let n = (await this.worker.sendMessage({ type: "fetch", fetch: { remote: o.toString(), method: r.method, headers: a, body: s || void 0 } }, s ? [s] : [])).fetch, + i = new Response(y.includes(n.status) ? void 0 : n.body, { headers: new Headers(n.headers), status: n.status, statusText: n.statusText }); + (i.rawHeaders = n.headers), (i.rawResponse = n), (i.finalURL = o.toString()); + let l = t?.redirect || r.redirect; + if (!b.includes(i.status)) return i; + switch (l) { + case "follow": { + let t = i.headers.get("location"); + if (20 > e && null !== t) { + o = new URL(t, o); + continue; + } + throw TypeError("Failed to fetch"); + } + case "error": + throw TypeError("Failed to fetch"); + case "manual": + return i; + } + } + } + } + console.debug("bare-mux: running v2.1.9 (build dc9dc6e)"); + }, + 8832: function (e, t, r) { + r.d(t, { H: () => n, L: () => i }); + let n = new Map( + [ + "altGlyph", + "altGlyphDef", + "altGlyphItem", + "animateColor", + "animateMotion", + "animateTransform", + "clipPath", + "feBlend", + "feColorMatrix", + "feComponentTransfer", + "feComposite", + "feConvolveMatrix", + "feDiffuseLighting", + "feDisplacementMap", + "feDistantLight", + "feDropShadow", + "feFlood", + "feFuncA", + "feFuncB", + "feFuncG", + "feFuncR", + "feGaussianBlur", + "feImage", + "feMerge", + "feMergeNode", + "feMorphology", + "feOffset", + "fePointLight", + "feSpecularLighting", + "feSpotLight", + "feTile", + "feTurbulence", + "foreignObject", + "glyphRef", + "linearGradient", + "radialGradient", + "textPath", + ].map(e => [e.toLowerCase(), e]), + ), + i = new Map( + [ + "definitionURL", + "attributeName", + "attributeType", + "baseFrequency", + "baseProfile", + "calcMode", + "clipPathUnits", + "diffuseConstant", + "edgeMode", + "filterUnits", + "glyphRef", + "gradientTransform", + "gradientUnits", + "kernelMatrix", + "kernelUnitLength", + "keyPoints", + "keySplines", + "keyTimes", + "lengthAdjust", + "limitingConeAngle", + "markerHeight", + "markerUnits", + "markerWidth", + "maskContentUnits", + "maskUnits", + "numOctaves", + "pathLength", + "patternContentUnits", + "patternTransform", + "patternUnits", + "pointsAtX", + "pointsAtY", + "pointsAtZ", + "preserveAlpha", + "preserveAspectRatio", + "primitiveUnits", + "refX", + "refY", + "repeatCount", + "repeatDur", + "requiredExtensions", + "requiredFeatures", + "specularConstant", + "specularExponent", + "spreadMethod", + "startOffset", + "stdDeviation", + "stitchTiles", + "surfaceScale", + "systemLanguage", + "tableValues", + "targetX", + "targetY", + "textLength", + "viewBox", + "viewTarget", + "xChannelSelector", + "yChannelSelector", + "zoomAndPan", + ].map(e => [e.toLowerCase(), e]), + ); + }, + 6498: function (e, t, r) { + r.d(t, { A: () => c }); + var n = r(2743), + i = r(8466), + a = r(8832); + let s = new Set(["style", "script", "xmp", "iframe", "noembed", "noframes", "plaintext", "noscript"]); + function o(e) { + return e.replace(/"/g, """); + } + let l = new Set(["area", "base", "basefont", "br", "col", "command", "embed", "frame", "hr", "img", "input", "isindex", "keygen", "link", "meta", "param", "source", "track", "wbr"]), + c = function e(t, r = {}) { + let c = "length" in t ? t : [t], + h = ""; + for (let t = 0; t < c.length; t++) + h += (function (t, r) { + var c, h, p; + switch (t.type) { + case n.bL: + return e(t.children, r); + case n.fl: + case n.WL: + return (c = t), `<${c.data}>`; + case n.Mw: + return (h = t), ``; + case n.KB: + return (p = t), ``; + case n.eF: + case n.OF: + case n.vw: + return (function (t, r) { + var n; + "foreign" === r.xmlMode && ((t.name = null != (n = a.H.get(t.name)) ? n : t.name), t.parent && u.has(t.parent.name) && (r = { ...r, xmlMode: !1 })), !r.xmlMode && d.has(t.name) && (r = { ...r, xmlMode: "foreign" }); + let s = `<${t.name}`, + c = (function (e, t) { + var r; + if (!e) return; + let n = (null != (r = t.encodeEntities) ? r : t.decodeEntities) === !1 ? o : t.xmlMode || "utf8" !== t.encodeEntities ? i.WY : i.Gj; + return Object.keys(e) + .map(r => { + var i, s; + let o = null != (i = e[r]) ? i : ""; + return ("foreign" === t.xmlMode && (r = null != (s = a.L.get(r)) ? s : r), t.emptyAttrs || t.xmlMode || "" !== o) ? `${r}="${n(o)}"` : r; + }) + .join(" "); + })(t.attribs, r); + return c && (s += ` ${c}`), 0 === t.children.length && (r.xmlMode ? !1 !== r.selfClosingTags : r.selfClosingTags && l.has(t.name)) ? (r.xmlMode || (s += " "), (s += "/>")) : ((s += ">"), t.children.length > 0 && (s += e(t.children, r)), (r.xmlMode || !l.has(t.name)) && (s += ``)), s; + })(t, r); + case n.EY: + return (function (e, t) { + var r; + let n = e.data || ""; + return (null != (r = t.encodeEntities) ? r : t.decodeEntities) === !1 || (!t.xmlMode && e.parent && s.has(e.parent.name)) || (n = t.xmlMode || "utf8" !== t.encodeEntities ? (0, i.WY)(n) : (0, i.X1)(n)), n; + })(t, r); + } + })(c[t], r); + return h; + }, + u = new Set(["mi", "mo", "mn", "ms", "mtext", "annotation-xml", "foreignObject", "desc", "title"]), + d = new Set(["svg", "math"]); + }, + 2743: function (e, t, r) { + var n, i; + function a(e) { + return e.type === n.Tag || e.type === n.Script || e.type === n.Style; + } + r.d(t, { EY: () => o, KB: () => p, Mw: () => c, OF: () => d, RJ: () => n, WL: () => l, bL: () => s, dz: () => a, eF: () => u, fl: () => f, vw: () => h }), + ((i = n || (n = {})).Root = "root"), + (i.Text = "text"), + (i.Directive = "directive"), + (i.Comment = "comment"), + (i.Script = "script"), + (i.Style = "style"), + (i.Tag = "tag"), + (i.CDATA = "cdata"), + (i.Doctype = "doctype"); + let s = n.Root, + o = n.Text, + l = n.Directive, + c = n.Comment, + u = n.Script, + d = n.Style, + h = n.Tag, + p = n.CDATA, + f = n.Doctype; + }, + 8866: function (e, t, r) { + r.d(t, { DV: () => s, Hg: () => i.Hg, Mw: () => i.Mw }); + var n = r(2743), + i = r(6072); + let a = { withStartIndices: !1, withEndIndices: !1, xmlMode: !1 }; + class s { + constructor(e, t, r) { + (this.dom = []), + (this.root = new i.yo(this.dom)), + (this.done = !1), + (this.tagStack = [this.root]), + (this.lastNode = null), + (this.parser = null), + "function" == typeof t && ((r = t), (t = a)), + "object" == typeof e && ((t = e), (e = void 0)), + (this.callback = null != e ? e : null), + (this.options = null != t ? t : a), + (this.elementCB = null != r ? r : null); + } + onparserinit(e) { + this.parser = e; + } + onreset() { + (this.dom = []), (this.root = new i.yo(this.dom)), (this.done = !1), (this.tagStack = [this.root]), (this.lastNode = null), (this.parser = null); + } + onend() { + this.done || ((this.done = !0), (this.parser = null), this.handleCallback(null)); + } + onerror(e) { + this.handleCallback(e); + } + onclosetag() { + this.lastNode = null; + let e = this.tagStack.pop(); + this.options.withEndIndices && (e.endIndex = this.parser.endIndex), this.elementCB && this.elementCB(e); + } + onopentag(e, t) { + let r = this.options.xmlMode ? n.RJ.Tag : void 0, + a = new i.Hg(e, t, void 0, r); + this.addNode(a), this.tagStack.push(a); + } + ontext(e) { + let { lastNode: t } = this; + if (t && t.type === n.RJ.Text) (t.data += e), this.options.withEndIndices && (t.endIndex = this.parser.endIndex); + else { + let t = new i.EY(e); + this.addNode(t), (this.lastNode = t); + } + } + oncomment(e) { + if (this.lastNode && this.lastNode.type === n.RJ.Comment) { + this.lastNode.data += e; + return; + } + let t = new i.Mw(e); + this.addNode(t), (this.lastNode = t); + } + oncommentend() { + this.lastNode = null; + } + oncdatastart() { + let e = new i.EY(""), + t = new i.KB([e]); + this.addNode(t), (e.parent = t), (this.lastNode = e); + } + oncdataend() { + this.lastNode = null; + } + onprocessinginstruction(e, t) { + let r = new i.Cd(e, t); + this.addNode(r); + } + handleCallback(e) { + if ("function" == typeof this.callback) this.callback(e, this.dom); + else if (e) throw e; + } + addNode(e) { + let t = this.tagStack[this.tagStack.length - 1], + r = t.children[t.children.length - 1]; + this.options.withStartIndices && (e.startIndex = this.parser.startIndex), this.options.withEndIndices && (e.endIndex = this.parser.endIndex), t.children.push(e), r && ((e.prev = r), (r.next = e)), (e.parent = t), (this.lastNode = null); + } + } + }, + 6072: function (e, t, r) { + r.d(t, { Cd: () => l, EY: () => s, Hg: () => h, KB: () => u, Mw: () => o, yo: () => d }); + var n = r(2743); + class i { + constructor() { + (this.parent = null), (this.prev = null), (this.next = null), (this.startIndex = null), (this.endIndex = null); + } + get parentNode() { + return this.parent; + } + set parentNode(e) { + this.parent = e; + } + get previousSibling() { + return this.prev; + } + set previousSibling(e) { + this.prev = e; + } + get nextSibling() { + return this.next; + } + set nextSibling(e) { + this.next = e; + } + cloneNode(e = !1) { + return p(this, e); + } + } + class a extends i { + constructor(e) { + super(), (this.data = e); + } + get nodeValue() { + return this.data; + } + set nodeValue(e) { + this.data = e; + } + } + class s extends a { + constructor() { + super(...arguments), (this.type = n.RJ.Text); + } + get nodeType() { + return 3; + } + } + class o extends a { + constructor() { + super(...arguments), (this.type = n.RJ.Comment); + } + get nodeType() { + return 8; + } + } + class l extends a { + constructor(e, t) { + super(t), (this.name = e), (this.type = n.RJ.Directive); + } + get nodeType() { + return 1; + } + } + class c extends i { + constructor(e) { + super(), (this.children = e); + } + get firstChild() { + var e; + return null != (e = this.children[0]) ? e : null; + } + get lastChild() { + return this.children.length > 0 ? this.children[this.children.length - 1] : null; + } + get childNodes() { + return this.children; + } + set childNodes(e) { + this.children = e; + } + } + class u extends c { + constructor() { + super(...arguments), (this.type = n.RJ.CDATA); + } + get nodeType() { + return 4; + } + } + class d extends c { + constructor() { + super(...arguments), (this.type = n.RJ.Root); + } + get nodeType() { + return 9; + } + } + class h extends c { + constructor(e, t, r = [], i = "script" === e ? n.RJ.Script : "style" === e ? n.RJ.Style : n.RJ.Tag) { + super(r), (this.name = e), (this.attribs = t), (this.type = i); + } + get nodeType() { + return 1; + } + get tagName() { + return this.name; + } + set tagName(e) { + this.name = e; + } + get attributes() { + return Object.keys(this.attribs).map(e => { + var t, r; + return { name: e, value: this.attribs[e], namespace: null == (t = this["x-attribsNamespace"]) ? void 0 : t[e], prefix: null == (r = this["x-attribsPrefix"]) ? void 0 : r[e] }; + }); + } + } + function p(e, t = !1) { + let r; + if (e.type === n.RJ.Text) r = new s(e.data); + else if (e.type === n.RJ.Comment) r = new o(e.data); + else if ((0, n.dz)(e)) { + let n = t ? f(e.children) : [], + i = new h(e.name, { ...e.attribs }, n); + n.forEach(e => (e.parent = i)), null != e.namespace && (i.namespace = e.namespace), e["x-attribsNamespace"] && (i["x-attribsNamespace"] = { ...e["x-attribsNamespace"] }), e["x-attribsPrefix"] && (i["x-attribsPrefix"] = { ...e["x-attribsPrefix"] }), (r = i); + } else if (e.type === n.RJ.CDATA) { + let n = t ? f(e.children) : [], + i = new u(n); + n.forEach(e => (e.parent = i)), (r = i); + } else if (e.type === n.RJ.Root) { + let n = t ? f(e.children) : [], + i = new d(n); + n.forEach(e => (e.parent = i)), e["x-mode"] && (i["x-mode"] = e["x-mode"]), (r = i); + } else if (e.type === n.RJ.Directive) { + let t = new l(e.name, e.data); + null != e["x-name"] && ((t["x-name"] = e["x-name"]), (t["x-publicId"] = e["x-publicId"]), (t["x-systemId"] = e["x-systemId"])), (r = t); + } else throw Error(`Not implemented yet: ${e.type}`); + return (r.startIndex = e.startIndex), (r.endIndex = e.endIndex), null != e.sourceCodeLocation && (r.sourceCodeLocation = e.sourceCodeLocation), r; + } + function f(e) { + let t = e.map(e => p(e, !0)); + for (let e = 1; e < t.length; e++) (t[e].prev = t[e - 1]), (t[e - 1].next = t[e]); + return t; + } + }, + 3256: function (e, t, r) { + r(5016), r(1050); + }, + 6812: function (e, t, r) { + var n, i; + r(8866), ((i = n || (n = {}))[(i.DISCONNECTED = 1)] = "DISCONNECTED"), (i[(i.PRECEDING = 2)] = "PRECEDING"), (i[(i.FOLLOWING = 4)] = "FOLLOWING"), (i[(i.CONTAINS = 8)] = "CONTAINS"), (i[(i.CONTAINED_BY = 16)] = "CONTAINED_BY"); + }, + 4993: function (e, t, r) { + r(5016), r(4647), r(9861), r(1050), r(6812), r(3256), r(8866); + }, + 1050: function (e, t, r) { + r(8866), r(9861); + }, + 9861: function (e, t, r) { + r(8866); + }, + 5016: function (e, t, r) { + r(8866), r(6498), r(2743); + }, + 4647: function (e, t, r) { + r(8866); + }, + 2146: function (e, t, r) { + var n; + r.d(t, { MK: () => a, y6: () => s }); + let i = new Map([ + [0, 65533], + [128, 8364], + [130, 8218], + [131, 402], + [132, 8222], + [133, 8230], + [134, 8224], + [135, 8225], + [136, 710], + [137, 8240], + [138, 352], + [139, 8249], + [140, 338], + [142, 381], + [145, 8216], + [146, 8217], + [147, 8220], + [148, 8221], + [149, 8226], + [150, 8211], + [151, 8212], + [152, 732], + [153, 8482], + [154, 353], + [155, 8250], + [156, 339], + [158, 382], + [159, 376], + ]), + a = + null != (n = String.fromCodePoint) + ? n + : function (e) { + let t = ""; + return e > 65535 && ((e -= 65536), (t += String.fromCharCode(((e >>> 10) & 1023) | 55296)), (e = 56320 | (1023 & e))), (t += String.fromCharCode(e)); + }; + function s(e) { + var t; + return (e >= 55296 && e <= 57343) || e > 1114111 ? 65533 : null != (t = i.get(e)) ? t : e; + } + }, + 2990: function (e, t, r) { + r.d(t, { FJ: () => u, MK: () => p.MK, Wf: () => g, qN: () => d.q, sr: () => h.s }); + var n, + i, + a, + s, + o, + l, + c, + u, + d = r(7259), + h = r(5949), + p = r(2146); + function f(e) { + return e >= o.ZERO && e <= o.NINE; + } + ((n = o || (o = {}))[(n.NUM = 35)] = "NUM"), + (n[(n.SEMI = 59)] = "SEMI"), + (n[(n.EQUALS = 61)] = "EQUALS"), + (n[(n.ZERO = 48)] = "ZERO"), + (n[(n.NINE = 57)] = "NINE"), + (n[(n.LOWER_A = 97)] = "LOWER_A"), + (n[(n.LOWER_F = 102)] = "LOWER_F"), + (n[(n.LOWER_X = 120)] = "LOWER_X"), + (n[(n.LOWER_Z = 122)] = "LOWER_Z"), + (n[(n.UPPER_A = 65)] = "UPPER_A"), + (n[(n.UPPER_F = 70)] = "UPPER_F"), + (n[(n.UPPER_Z = 90)] = "UPPER_Z"), + ((i = l || (l = {}))[(i.VALUE_LENGTH = 49152)] = "VALUE_LENGTH"), + (i[(i.BRANCH_LENGTH = 16256)] = "BRANCH_LENGTH"), + (i[(i.JUMP_TABLE = 127)] = "JUMP_TABLE"), + ((a = c || (c = {}))[(a.EntityStart = 0)] = "EntityStart"), + (a[(a.NumericStart = 1)] = "NumericStart"), + (a[(a.NumericDecimal = 2)] = "NumericDecimal"), + (a[(a.NumericHex = 3)] = "NumericHex"), + (a[(a.NamedEntity = 4)] = "NamedEntity"), + ((s = u || (u = {}))[(s.Legacy = 0)] = "Legacy"), + (s[(s.Strict = 1)] = "Strict"), + (s[(s.Attribute = 2)] = "Attribute"); + class g { + constructor(e, t, r) { + (this.decodeTree = e), (this.emitCodePoint = t), (this.errors = r), (this.state = c.EntityStart), (this.consumed = 1), (this.result = 0), (this.treeIndex = 0), (this.excess = 1), (this.decodeMode = u.Strict); + } + startEntity(e) { + (this.decodeMode = e), (this.state = c.EntityStart), (this.result = 0), (this.treeIndex = 0), (this.excess = 1), (this.consumed = 1); + } + write(e, t) { + switch (this.state) { + case c.EntityStart: + if (e.charCodeAt(t) === o.NUM) return (this.state = c.NumericStart), (this.consumed += 1), this.stateNumericStart(e, t + 1); + return (this.state = c.NamedEntity), this.stateNamedEntity(e, t); + case c.NumericStart: + return this.stateNumericStart(e, t); + case c.NumericDecimal: + return this.stateNumericDecimal(e, t); + case c.NumericHex: + return this.stateNumericHex(e, t); + case c.NamedEntity: + return this.stateNamedEntity(e, t); + } + } + stateNumericStart(e, t) { + return t >= e.length ? -1 : (32 | e.charCodeAt(t)) === o.LOWER_X ? ((this.state = c.NumericHex), (this.consumed += 1), this.stateNumericHex(e, t + 1)) : ((this.state = c.NumericDecimal), this.stateNumericDecimal(e, t)); + } + addToNumericResult(e, t, r, n) { + if (t !== r) { + let i = r - t; + (this.result = this.result * Math.pow(n, i) + Number.parseInt(e.substr(t, i), n)), (this.consumed += i); + } + } + stateNumericHex(e, t) { + let r = t; + for (; t < e.length; ) { + var n; + let i = e.charCodeAt(t); + if (!f(i) && (!((n = i) >= o.UPPER_A) || !(n <= o.UPPER_F)) && (!(n >= o.LOWER_A) || !(n <= o.LOWER_F))) return this.addToNumericResult(e, r, t, 16), this.emitNumericEntity(i, 3); + t += 1; + } + return this.addToNumericResult(e, r, t, 16), -1; + } + stateNumericDecimal(e, t) { + let r = t; + for (; t < e.length; ) { + let n = e.charCodeAt(t); + if (!f(n)) return this.addToNumericResult(e, r, t, 10), this.emitNumericEntity(n, 2); + t += 1; + } + return this.addToNumericResult(e, r, t, 10), -1; + } + emitNumericEntity(e, t) { + var r; + if (this.consumed <= t) return null == (r = this.errors) || r.absenceOfDigitsInNumericCharacterReference(this.consumed), 0; + if (e === o.SEMI) this.consumed += 1; + else if (this.decodeMode === u.Strict) return 0; + return this.emitCodePoint((0, p.y6)(this.result), this.consumed), this.errors && (e !== o.SEMI && this.errors.missingSemicolonAfterCharacterReference(), this.errors.validateNumericCharacterReference(this.result)), this.consumed; + } + stateNamedEntity(e, t) { + let { decodeTree: r } = this, + n = r[this.treeIndex], + i = (n & l.VALUE_LENGTH) >> 14; + for (; t < e.length; t++, this.excess++) { + let a = e.charCodeAt(t); + if ( + ((this.treeIndex = (function (e, t, r, n) { + let i = (t & l.BRANCH_LENGTH) >> 7, + a = t & l.JUMP_TABLE; + if (0 === i) return 0 !== a && n === a ? r : -1; + if (a) { + let t = n - a; + return t < 0 || t >= i ? -1 : e[r + t] - 1; + } + let s = r, + o = s + i - 1; + for (; s <= o; ) { + let t = (s + o) >>> 1, + r = e[t]; + if (r < n) s = t + 1; + else { + if (!(r > n)) return e[t + i]; + o = t - 1; + } + } + return -1; + })(r, n, this.treeIndex + Math.max(1, i), a)), + this.treeIndex < 0) + ) + return 0 === this.result || + (this.decodeMode === u.Attribute && + (0 === i || + (function (e) { + var t; + return e === o.EQUALS || ((t = e) >= o.UPPER_A && t <= o.UPPER_Z) || (t >= o.LOWER_A && t <= o.LOWER_Z) || f(t); + })(a))) + ? 0 + : this.emitNotTerminatedNamedEntity(); + if (0 != (i = ((n = r[this.treeIndex]) & l.VALUE_LENGTH) >> 14)) { + if (a === o.SEMI) return this.emitNamedEntityData(this.treeIndex, i, this.consumed + this.excess); + this.decodeMode !== u.Strict && ((this.result = this.treeIndex), (this.consumed += this.excess), (this.excess = 0)); + } + } + return -1; + } + emitNotTerminatedNamedEntity() { + var e; + let { result: t, decodeTree: r } = this, + n = (r[t] & l.VALUE_LENGTH) >> 14; + return this.emitNamedEntityData(t, n, this.consumed), null == (e = this.errors) || e.missingSemicolonAfterCharacterReference(), this.consumed; + } + emitNamedEntityData(e, t, r) { + let { decodeTree: n } = this; + return this.emitCodePoint(1 === t ? n[e] & ~l.VALUE_LENGTH : n[e + 1], r), 3 === t && this.emitCodePoint(n[e + 2], r), r; + } + end() { + var e; + switch (this.state) { + case c.NamedEntity: + return 0 !== this.result && (this.decodeMode !== u.Attribute || this.result === this.treeIndex) ? this.emitNotTerminatedNamedEntity() : 0; + case c.NumericDecimal: + return this.emitNumericEntity(0, 2); + case c.NumericHex: + return this.emitNumericEntity(0, 3); + case c.NumericStart: + return null == (e = this.errors) || e.absenceOfDigitsInNumericCharacterReference(this.consumed), 0; + case c.EntityStart: + return 0; + } + } + } + }, + 466: function (e, t, r) { + r(9496), r(747); + }, + 747: function (e, t, r) { + r.d(t, { Gj: () => l, WY: () => s, X1: () => c }); + let n = /["$&'<>\u0080-\uFFFF]/g, + i = new Map([ + [34, """], + [38, "&"], + [39, "'"], + [60, "<"], + [62, ">"], + ]), + a = null == String.prototype.codePointAt ? (e, t) => ((64512 & e.charCodeAt(t)) == 55296 ? (e.charCodeAt(t) - 55296) * 1024 + e.charCodeAt(t + 1) - 56320 + 65536 : e.charCodeAt(t)) : (e, t) => e.codePointAt(t); + function s(e) { + let t, + r = "", + s = 0; + for (; null !== (t = n.exec(e)); ) { + let { index: o } = t, + l = e.charCodeAt(o), + c = i.get(l); + void 0 === c ? ((r += `${e.substring(s, o)}&#x${a(e, o).toString(16)};`), (s = n.lastIndex += Number((64512 & l) == 55296))) : ((r += e.substring(s, o) + c), (s = o + 1)); + } + return r + e.substr(s); + } + function o(e, t) { + return function (r) { + let n, + i = 0, + a = ""; + for (; (n = e.exec(r)); ) i !== n.index && (a += r.substring(i, n.index)), (a += t.get(n[0].charCodeAt(0))), (i = n.index + 1); + return a + r.substring(i); + }; + } + let l = o( + /["&\u00A0]/g, + new Map([ + [34, """], + [38, "&"], + [160, " "], + ]), + ), + c = o( + /[&<>\u00A0]/g, + new Map([ + [38, "&"], + [60, "<"], + [62, ">"], + [160, " "], + ]), + ); + }, + 7259: function (e, t, r) { + r.d(t, { q: () => n }); + let n = new Uint16Array( + 'ᵁ<\xd5ıʊҝջאٵ۞ޢߖࠏ੊ઑඡ๭༉༦჊ረዡᐕᒝᓃᓟᔥ\0\0\0\0\0\0ᕫᛍᦍᰒᷝ὾⁠↰⊍⏀⏻⑂⠤⤒ⴈ⹈⿎〖㊺㘹㞬㣾㨨㩱㫠㬮ࠀEMabcfglmnoprstu\\bfms\x7f\x84\x8b\x90\x95\x98\xa6\xb3\xb9\xc8\xcflig耻\xc6䃆P耻&䀦cute耻\xc1䃁reve;䄂Āiyx}rc耻\xc2䃂;䐐r;쀀\ud835\udd04rave耻\xc0䃀pha;䎑acr;䄀d;橓Āgp\x9d\xa1on;䄄f;쀀\ud835\udd38plyFunction;恡ing耻\xc5䃅Ācs\xbe\xc3r;쀀\ud835\udc9cign;扔ilde耻\xc3䃃ml耻\xc4䃄Ѐaceforsu\xe5\xfb\xfeėĜĢħĪĀcr\xea\xf2kslash;或Ŷ\xf6\xf8;櫧ed;挆y;䐑ƀcrtąċĔause;戵noullis;愬a;䎒r;쀀\ud835\udd05pf;쀀\ud835\udd39eve;䋘c\xf2ēmpeq;扎܀HOacdefhilorsuōőŖƀƞƢƵƷƺǜȕɳɸɾcy;䐧PY耻\xa9䂩ƀcpyŝŢźute;䄆Ā;iŧŨ拒talDifferentialD;慅leys;愭ȀaeioƉƎƔƘron;䄌dil耻\xc7䃇rc;䄈nint;戰ot;䄊ĀdnƧƭilla;䂸terDot;䂷\xf2ſi;䎧rcleȀDMPTLJNjǑǖot;抙inus;抖lus;投imes;抗oĀcsǢǸkwiseContourIntegral;戲eCurlyĀDQȃȏoubleQuote;思uote;怙ȀlnpuȞȨɇɕonĀ;eȥȦ户;橴ƀgitȯȶȺruent;扡nt;戯ourIntegral;戮ĀfrɌɎ;愂oduct;成nterClockwiseContourIntegral;戳oss;樯cr;쀀\ud835\udc9epĀ;Cʄʅ拓ap;才րDJSZacefiosʠʬʰʴʸˋ˗ˡ˦̳ҍĀ;oŹʥtrahd;椑cy;䐂cy;䐅cy;䐏ƀgrsʿ˄ˇger;怡r;憡hv;櫤Āayː˕ron;䄎;䐔lĀ;t˝˞戇a;䎔r;쀀\ud835\udd07Āaf˫̧Ācm˰̢riticalȀADGT̖̜̀̆cute;䂴oŴ̋̍;䋙bleAcute;䋝rave;䁠ilde;䋜ond;拄ferentialD;慆Ѱ̽\0\0\0͔͂\0Ѕf;쀀\ud835\udd3bƀ;DE͈͉͍䂨ot;惜qual;扐blèCDLRUVͣͲ΂ϏϢϸontourIntegra\xecȹoɴ͹\0\0ͻ\xbb͉nArrow;懓Āeo·ΤftƀARTΐΖΡrrow;懐ightArrow;懔e\xe5ˊngĀLRΫτeftĀARγιrrow;柸ightArrow;柺ightArrow;柹ightĀATϘϞrrow;懒ee;抨pɁϩ\0\0ϯrrow;懑ownArrow;懕erticalBar;戥ǹABLRTaВЪаўѿͼrrowƀ;BUНОТ憓ar;椓pArrow;懵reve;䌑eft˒к\0ц\0ѐightVector;楐eeVector;楞ectorĀ;Bљњ憽ar;楖ightǔѧ\0ѱeeVector;楟ectorĀ;BѺѻ懁ar;楗eeĀ;A҆҇护rrow;憧ĀctҒҗr;쀀\ud835\udc9frok;䄐ࠀNTacdfglmopqstuxҽӀӄӋӞӢӧӮӵԡԯԶՒ՝ՠեG;䅊H耻\xd0䃐cute耻\xc9䃉ƀaiyӒӗӜron;䄚rc耻\xca䃊;䐭ot;䄖r;쀀\ud835\udd08rave耻\xc8䃈ement;戈ĀapӺӾcr;䄒tyɓԆ\0\0ԒmallSquare;旻erySmallSquare;斫ĀgpԦԪon;䄘f;쀀\ud835\udd3csilon;䎕uĀaiԼՉlĀ;TՂՃ橵ilde;扂librium;懌Āci՗՚r;愰m;橳a;䎗ml耻\xcb䃋Āipժկsts;戃onentialE;慇ʀcfiosօֈ֍ֲ׌y;䐤r;쀀\ud835\udd09lledɓ֗\0\0֣mallSquare;旼erySmallSquare;斪Ͱֺ\0ֿ\0\0ׄf;쀀\ud835\udd3dAll;戀riertrf;愱c\xf2׋؀JTabcdfgorstר׬ׯ׺؀ؒؖ؛؝أ٬ٲcy;䐃耻>䀾mmaĀ;d׷׸䎓;䏜reve;䄞ƀeiy؇،ؐdil;䄢rc;䄜;䐓ot;䄠r;쀀\ud835\udd0a;拙pf;쀀\ud835\udd3eeater̀EFGLSTصلَٖٛ٦qualĀ;Lؾؿ扥ess;招ullEqual;执reater;檢ess;扷lantEqual;橾ilde;扳cr;쀀\ud835\udca2;扫ЀAacfiosuڅڋږڛڞڪھۊRDcy;䐪Āctڐڔek;䋇;䁞irc;䄤r;愌lbertSpace;愋ǰگ\0ڲf;愍izontalLine;攀Āctۃۅ\xf2کrok;䄦mpńېۘownHum\xf0įqual;扏܀EJOacdfgmnostuۺ۾܃܇܎ܚܞܡܨ݄ݸދޏޕcy;䐕lig;䄲cy;䐁cute耻\xcd䃍Āiyܓܘrc耻\xce䃎;䐘ot;䄰r;愑rave耻\xcc䃌ƀ;apܠܯܿĀcgܴܷr;䄪inaryI;慈lie\xf3ϝǴ݉\0ݢĀ;eݍݎ戬Āgrݓݘral;戫section;拂isibleĀCTݬݲomma;恣imes;恢ƀgptݿރވon;䄮f;쀀\ud835\udd40a;䎙cr;愐ilde;䄨ǫޚ\0ޞcy;䐆l耻\xcf䃏ʀcfosuެ޷޼߂ߐĀiyޱ޵rc;䄴;䐙r;쀀\ud835\udd0dpf;쀀\ud835\udd41ǣ߇\0ߌr;쀀\ud835\udca5rcy;䐈kcy;䐄΀HJacfosߤߨ߽߬߱ࠂࠈcy;䐥cy;䐌ppa;䎚Āey߶߻dil;䄶;䐚r;쀀\ud835\udd0epf;쀀\ud835\udd42cr;쀀\ud835\udca6րJTaceflmostࠥࠩࠬࡐࡣ঳সে্਷ੇcy;䐉耻<䀼ʀcmnpr࠷࠼ࡁࡄࡍute;䄹bda;䎛g;柪lacetrf;愒r;憞ƀaeyࡗ࡜ࡡron;䄽dil;䄻;䐛Āfsࡨ॰tԀACDFRTUVarࡾࢩࢱࣦ࣠ࣼयज़ΐ४Ānrࢃ࢏gleBracket;柨rowƀ;BR࢙࢚࢞憐ar;懤ightArrow;懆eiling;挈oǵࢷ\0ࣃbleBracket;柦nǔࣈ\0࣒eeVector;楡ectorĀ;Bࣛࣜ懃ar;楙loor;挊ightĀAV࣯ࣵrrow;憔ector;楎Āerँगeƀ;AVउऊऐ抣rrow;憤ector;楚iangleƀ;BEतथऩ抲ar;槏qual;抴pƀDTVषूौownVector;楑eeVector;楠ectorĀ;Bॖॗ憿ar;楘ectorĀ;B॥०憼ar;楒ight\xe1Μs̀EFGLSTॾঋকঝঢভqualGreater;拚ullEqual;扦reater;扶ess;檡lantEqual;橽ilde;扲r;쀀\ud835\udd0fĀ;eঽা拘ftarrow;懚idot;䄿ƀnpw৔ਖਛgȀLRlr৞৷ਂਐeftĀAR০৬rrow;柵ightArrow;柷ightArrow;柶eftĀarγਊight\xe1οight\xe1ϊf;쀀\ud835\udd43erĀLRਢਬeftArrow;憙ightArrow;憘ƀchtਾੀੂ\xf2ࡌ;憰rok;䅁;扪Ѐacefiosuਗ਼੝੠੷੼અઋ઎p;椅y;䐜Ādl੥੯iumSpace;恟lintrf;愳r;쀀\ud835\udd10nusPlus;戓pf;쀀\ud835\udd44c\xf2੶;䎜ҀJacefostuણધભીଔଙඑ඗ඞcy;䐊cute;䅃ƀaey઴હાron;䅇dil;䅅;䐝ƀgswે૰଎ativeƀMTV૓૟૨ediumSpace;怋hiĀcn૦૘\xeb૙eryThi\xee૙tedĀGL૸ଆreaterGreate\xf2ٳessLes\xf3ੈLine;䀊r;쀀\ud835\udd11ȀBnptଢନଷ଺reak;恠BreakingSpace;䂠f;愕ڀ;CDEGHLNPRSTV୕ୖ୪୼஡௫ఄ౞಄ದ೘ൡඅ櫬Āou୛୤ngruent;扢pCap;扭oubleVerticalBar;戦ƀlqxஃஊ஛ement;戉ualĀ;Tஒஓ扠ilde;쀀≂̸ists;戄reater΀;EFGLSTஶஷ஽௉௓௘௥扯qual;扱ullEqual;쀀≧̸reater;쀀≫̸ess;批lantEqual;쀀⩾̸ilde;扵umpń௲௽ownHump;쀀≎̸qual;쀀≏̸eĀfsఊధtTriangleƀ;BEచఛడ拪ar;쀀⧏̸qual;括s̀;EGLSTవశ఼ౄోౘ扮qual;扰reater;扸ess;쀀≪̸lantEqual;쀀⩽̸ilde;扴estedĀGL౨౹reaterGreater;쀀⪢̸essLess;쀀⪡̸recedesƀ;ESಒಓಛ技qual;쀀⪯̸lantEqual;拠ĀeiಫಹverseElement;戌ghtTriangleƀ;BEೋೌ೒拫ar;쀀⧐̸qual;拭ĀquೝഌuareSuĀbp೨೹setĀ;E೰ೳ쀀⊏̸qual;拢ersetĀ;Eഃആ쀀⊐̸qual;拣ƀbcpഓതൎsetĀ;Eഛഞ쀀⊂⃒qual;抈ceedsȀ;ESTലള഻െ抁qual;쀀⪰̸lantEqual;拡ilde;쀀≿̸ersetĀ;E൘൛쀀⊃⃒qual;抉ildeȀ;EFT൮൯൵ൿ扁qual;扄ullEqual;扇ilde;扉erticalBar;戤cr;쀀\ud835\udca9ilde耻\xd1䃑;䎝܀Eacdfgmoprstuvලෂ෉෕ෛ෠෧෼ขภยา฿ไlig;䅒cute耻\xd3䃓Āiy෎ීrc耻\xd4䃔;䐞blac;䅐r;쀀\ud835\udd12rave耻\xd2䃒ƀaei෮ෲ෶cr;䅌ga;䎩cron;䎟pf;쀀\ud835\udd46enCurlyĀDQฎบoubleQuote;怜uote;怘;橔Āclวฬr;쀀\ud835\udcaaash耻\xd8䃘iŬื฼de耻\xd5䃕es;樷ml耻\xd6䃖erĀBP๋๠Āar๐๓r;怾acĀek๚๜;揞et;掴arenthesis;揜Ҁacfhilors๿ງຊຏຒດຝະ໼rtialD;戂y;䐟r;쀀\ud835\udd13i;䎦;䎠usMinus;䂱Āipຢອncareplan\xe5ڝf;愙Ȁ;eio຺ູ໠໤檻cedesȀ;EST່້໏໚扺qual;檯lantEqual;扼ilde;找me;怳Ādp໩໮uct;戏ortionĀ;aȥ໹l;戝Āci༁༆r;쀀\ud835\udcab;䎨ȀUfos༑༖༛༟OT耻"䀢r;쀀\ud835\udd14pf;愚cr;쀀\ud835\udcac؀BEacefhiorsu༾གྷཇའཱིྦྷྪྭ႖ႩႴႾarr;椐G耻\xae䂮ƀcnrཎནབute;䅔g;柫rĀ;tཛྷཝ憠l;椖ƀaeyཧཬཱron;䅘dil;䅖;䐠Ā;vླྀཹ愜erseĀEUྂྙĀlq྇ྎement;戋uilibrium;懋pEquilibrium;楯r\xbbཹo;䎡ghtЀACDFTUVa࿁࿫࿳ဢဨၛႇϘĀnr࿆࿒gleBracket;柩rowƀ;BL࿜࿝࿡憒ar;懥eftArrow;懄eiling;按oǵ࿹\0စbleBracket;柧nǔည\0နeeVector;楝ectorĀ;Bဝသ懂ar;楕loor;挋Āerိ၃eƀ;AVဵံြ抢rrow;憦ector;楛iangleƀ;BEၐၑၕ抳ar;槐qual;抵pƀDTVၣၮၸownVector;楏eeVector;楜ectorĀ;Bႂႃ憾ar;楔ectorĀ;B႑႒懀ar;楓Āpuႛ႞f;愝ndImplies;楰ightarrow;懛ĀchႹႼr;愛;憱leDelayed;槴ڀHOacfhimoqstuფჱჷჽᄙᄞᅑᅖᅡᅧᆵᆻᆿĀCcჩხHcy;䐩y;䐨FTcy;䐬cute;䅚ʀ;aeiyᄈᄉᄎᄓᄗ檼ron;䅠dil;䅞rc;䅜;䐡r;쀀\ud835\udd16ortȀDLRUᄪᄴᄾᅉownArrow\xbbОeftArrow\xbb࢚ightArrow\xbb࿝pArrow;憑gma;䎣allCircle;战pf;쀀\ud835\udd4aɲᅭ\0\0ᅰt;戚areȀ;ISUᅻᅼᆉᆯ斡ntersection;抓uĀbpᆏᆞsetĀ;Eᆗᆘ抏qual;抑ersetĀ;Eᆨᆩ抐qual;抒nion;抔cr;쀀\ud835\udcaear;拆ȀbcmpᇈᇛሉላĀ;sᇍᇎ拐etĀ;Eᇍᇕqual;抆ĀchᇠህeedsȀ;ESTᇭᇮᇴᇿ扻qual;檰lantEqual;扽ilde;承Th\xe1ྌ;我ƀ;esሒሓሣ拑rsetĀ;Eሜም抃qual;抇et\xbbሓրHRSacfhiorsሾቄ቉ቕ቞ቱቶኟዂወዑORN耻\xde䃞ADE;愢ĀHc቎ቒcy;䐋y;䐦Ābuቚቜ;䀉;䎤ƀaeyብቪቯron;䅤dil;䅢;䐢r;쀀\ud835\udd17Āeiቻ኉Dzኀ\0ኇefore;戴a;䎘Ācn኎ኘkSpace;쀀  Space;怉ldeȀ;EFTካኬኲኼ戼qual;扃ullEqual;扅ilde;扈pf;쀀\ud835\udd4bipleDot;惛Āctዖዛr;쀀\ud835\udcafrok;䅦ૡዷጎጚጦ\0ጬጱ\0\0\0\0\0ጸጽ፷ᎅ\0᏿ᐄᐊᐐĀcrዻጁute耻\xda䃚rĀ;oጇገ憟cir;楉rǣጓ\0጖y;䐎ve;䅬Āiyጞጣrc耻\xdb䃛;䐣blac;䅰r;쀀\ud835\udd18rave耻\xd9䃙acr;䅪Ādiፁ፩erĀBPፈ፝Āarፍፐr;䁟acĀekፗፙ;揟et;掵arenthesis;揝onĀ;P፰፱拃lus;抎Āgp፻፿on;䅲f;쀀\ud835\udd4cЀADETadps᎕ᎮᎸᏄϨᏒᏗᏳrrowƀ;BDᅐᎠᎤar;椒ownArrow;懅ownArrow;憕quilibrium;楮eeĀ;AᏋᏌ报rrow;憥own\xe1ϳerĀLRᏞᏨeftArrow;憖ightArrow;憗iĀ;lᏹᏺ䏒on;䎥ing;䅮cr;쀀\ud835\udcb0ilde;䅨ml耻\xdc䃜ҀDbcdefosvᐧᐬᐰᐳᐾᒅᒊᒐᒖash;披ar;櫫y;䐒ashĀ;lᐻᐼ抩;櫦Āerᑃᑅ;拁ƀbtyᑌᑐᑺar;怖Ā;iᑏᑕcalȀBLSTᑡᑥᑪᑴar;戣ine;䁼eparator;杘ilde;所ThinSpace;怊r;쀀\ud835\udd19pf;쀀\ud835\udd4dcr;쀀\ud835\udcb1dash;抪ʀcefosᒧᒬᒱᒶᒼirc;䅴dge;拀r;쀀\ud835\udd1apf;쀀\ud835\udd4ecr;쀀\ud835\udcb2Ȁfiosᓋᓐᓒᓘr;쀀\ud835\udd1b;䎞pf;쀀\ud835\udd4fcr;쀀\ud835\udcb3ҀAIUacfosuᓱᓵᓹᓽᔄᔏᔔᔚᔠcy;䐯cy;䐇cy;䐮cute耻\xdd䃝Āiyᔉᔍrc;䅶;䐫r;쀀\ud835\udd1cpf;쀀\ud835\udd50cr;쀀\ud835\udcb4ml;䅸ЀHacdefosᔵᔹᔿᕋᕏᕝᕠᕤcy;䐖cute;䅹Āayᕄᕉron;䅽;䐗ot;䅻Dzᕔ\0ᕛoWidt\xe8૙a;䎖r;愨pf;愤cr;쀀\ud835\udcb5௡ᖃᖊᖐ\0ᖰᖶᖿ\0\0\0\0ᗆᗛᗫᙟ᙭\0ᚕ᚛ᚲᚹ\0ᚾcute耻\xe1䃡reve;䄃̀;Ediuyᖜᖝᖡᖣᖨᖭ戾;쀀∾̳;房rc耻\xe2䃢te肻\xb4̆;䐰lig耻\xe6䃦Ā;r\xb2ᖺ;쀀\ud835\udd1erave耻\xe0䃠ĀepᗊᗖĀfpᗏᗔsym;愵\xe8ᗓha;䎱ĀapᗟcĀclᗤᗧr;䄁g;樿ɤᗰ\0\0ᘊʀ;adsvᗺᗻᗿᘁᘇ戧nd;橕;橜lope;橘;橚΀;elmrszᘘᘙᘛᘞᘿᙏᙙ戠;榤e\xbbᘙsdĀ;aᘥᘦ戡ѡᘰᘲᘴᘶᘸᘺᘼᘾ;榨;榩;榪;榫;榬;榭;榮;榯tĀ;vᙅᙆ戟bĀ;dᙌᙍ抾;榝Āptᙔᙗh;戢\xbb\xb9arr;捼Āgpᙣᙧon;䄅f;쀀\ud835\udd52΀;Eaeiop዁ᙻᙽᚂᚄᚇᚊ;橰cir;橯;扊d;手s;䀧roxĀ;e዁ᚒ\xf1ᚃing耻\xe5䃥ƀctyᚡᚦᚨr;쀀\ud835\udcb6;䀪mpĀ;e዁ᚯ\xf1ʈilde耻\xe3䃣ml耻\xe4䃤Āciᛂᛈonin\xf4ɲnt;樑ࠀNabcdefiklnoprsu᛭ᛱᜰ᜼ᝃᝈ᝸᝽០៦ᠹᡐᜍ᤽᥈ᥰot;櫭Ācrᛶ᜞kȀcepsᜀᜅᜍᜓong;扌psilon;䏶rime;怵imĀ;e᜚᜛戽q;拍Ŷᜢᜦee;抽edĀ;gᜬᜭ挅e\xbbᜭrkĀ;t፜᜷brk;掶Āoyᜁᝁ;䐱quo;怞ʀcmprtᝓ᝛ᝡᝤᝨausĀ;eĊĉptyv;榰s\xe9ᜌno\xf5ēƀahwᝯ᝱ᝳ;䎲;愶een;扬r;쀀\ud835\udd1fg΀costuvwឍឝឳេ៕៛៞ƀaiuបពរ\xf0ݠrc;旯p\xbb፱ƀdptឤឨឭot;樀lus;樁imes;樂ɱឹ\0\0ើcup;樆ar;昅riangleĀdu៍្own;施p;斳plus;樄e\xe5ᑄ\xe5ᒭarow;植ƀako៭ᠦᠵĀcn៲ᠣkƀlst៺֫᠂ozenge;槫riangleȀ;dlr᠒᠓᠘᠝斴own;斾eft;旂ight;斸k;搣Ʊᠫ\0ᠳƲᠯ\0ᠱ;斒;斑4;斓ck;斈ĀeoᠾᡍĀ;qᡃᡆ쀀=⃥uiv;쀀≡⃥t;挐Ȁptwxᡙᡞᡧᡬf;쀀\ud835\udd53Ā;tᏋᡣom\xbbᏌtie;拈؀DHUVbdhmptuvᢅᢖᢪᢻᣗᣛᣬ᣿ᤅᤊᤐᤡȀLRlrᢎᢐᢒᢔ;敗;敔;敖;敓ʀ;DUduᢡᢢᢤᢦᢨ敐;敦;敩;敤;敧ȀLRlrᢳᢵᢷᢹ;敝;敚;敜;教΀;HLRhlrᣊᣋᣍᣏᣑᣓᣕ救;敬;散;敠;敫;敢;敟ox;槉ȀLRlrᣤᣦᣨᣪ;敕;敒;攐;攌ʀ;DUduڽ᣷᣹᣻᣽;敥;敨;攬;攴inus;抟lus;択imes;抠ȀLRlrᤙᤛᤝ᤟;敛;敘;攘;攔΀;HLRhlrᤰᤱᤳᤵᤷ᤻᤹攂;敪;敡;敞;攼;攤;攜Āevģ᥂bar耻\xa6䂦Ȁceioᥑᥖᥚᥠr;쀀\ud835\udcb7mi;恏mĀ;e᜚᜜lƀ;bhᥨᥩᥫ䁜;槅sub;柈Ŭᥴ᥾lĀ;e᥹᥺怢t\xbb᥺pƀ;Eeįᦅᦇ;檮Ā;qۜۛೡᦧ\0᧨ᨑᨕᨲ\0ᨷᩐ\0\0᪴\0\0᫁\0\0ᬡᬮ᭍᭒\0᯽\0ᰌƀcpr᦭ᦲ᧝ute;䄇̀;abcdsᦿᧀᧄ᧊᧕᧙戩nd;橄rcup;橉Āau᧏᧒p;橋p;橇ot;橀;쀀∩︀Āeo᧢᧥t;恁\xeeړȀaeiu᧰᧻ᨁᨅǰ᧵\0᧸s;橍on;䄍dil耻\xe7䃧rc;䄉psĀ;sᨌᨍ橌m;橐ot;䄋ƀdmnᨛᨠᨦil肻\xb8ƭptyv;榲t脀\xa2;eᨭᨮ䂢r\xe4Ʋr;쀀\ud835\udd20ƀceiᨽᩀᩍy;䑇ckĀ;mᩇᩈ朓ark\xbbᩈ;䏇r΀;Ecefms᩟᩠ᩢᩫ᪤᪪᪮旋;槃ƀ;elᩩᩪᩭ䋆q;扗eɡᩴ\0\0᪈rrowĀlr᩼᪁eft;憺ight;憻ʀRSacd᪒᪔᪖᪚᪟\xbbཇ;擈st;抛irc;抚ash;抝nint;樐id;櫯cir;槂ubsĀ;u᪻᪼晣it\xbb᪼ˬ᫇᫔᫺\0ᬊonĀ;eᫍᫎ䀺Ā;q\xc7\xc6ɭ᫙\0\0᫢aĀ;t᫞᫟䀬;䁀ƀ;fl᫨᫩᫫戁\xeeᅠeĀmx᫱᫶ent\xbb᫩e\xf3ɍǧ᫾\0ᬇĀ;dኻᬂot;橭n\xf4Ɇƀfryᬐᬔᬗ;쀀\ud835\udd54o\xe4ɔ脀\xa9;sŕᬝr;愗Āaoᬥᬩrr;憵ss;朗Ācuᬲᬷr;쀀\ud835\udcb8Ābpᬼ᭄Ā;eᭁᭂ櫏;櫑Ā;eᭉᭊ櫐;櫒dot;拯΀delprvw᭠᭬᭷ᮂᮬᯔ᯹arrĀlr᭨᭪;椸;椵ɰ᭲\0\0᭵r;拞c;拟arrĀ;p᭿ᮀ憶;椽̀;bcdosᮏᮐᮖᮡᮥᮨ截rcap;橈Āauᮛᮞp;橆p;橊ot;抍r;橅;쀀∪︀Ȁalrv᮵ᮿᯞᯣrrĀ;mᮼᮽ憷;椼yƀevwᯇᯔᯘqɰᯎ\0\0ᯒre\xe3᭳u\xe3᭵ee;拎edge;拏en耻\xa4䂤earrowĀlrᯮ᯳eft\xbbᮀight\xbbᮽe\xe4ᯝĀciᰁᰇonin\xf4Ƿnt;戱lcty;挭ঀAHabcdefhijlorstuwz᰸᰻᰿ᱝᱩᱵᲊᲞᲬᲷ᳻᳿ᴍᵻᶑᶫᶻ᷆᷍r\xf2΁ar;楥Ȁglrs᱈ᱍ᱒᱔ger;怠eth;愸\xf2ᄳhĀ;vᱚᱛ怐\xbbऊūᱡᱧarow;椏a\xe3̕Āayᱮᱳron;䄏;䐴ƀ;ao̲ᱼᲄĀgrʿᲁr;懊tseq;橷ƀglmᲑᲔᲘ耻\xb0䂰ta;䎴ptyv;榱ĀirᲣᲨsht;楿;쀀\ud835\udd21arĀlrᲳᲵ\xbbࣜ\xbbသʀaegsv᳂͸᳖᳜᳠mƀ;oș᳊᳔ndĀ;ș᳑uit;晦amma;䏝in;拲ƀ;io᳧᳨᳸䃷de脀\xf7;o᳧ᳰntimes;拇n\xf8᳷cy;䑒cɯᴆ\0\0ᴊrn;挞op;挍ʀlptuwᴘᴝᴢᵉᵕlar;䀤f;쀀\ud835\udd55ʀ;emps̋ᴭᴷᴽᵂqĀ;d͒ᴳot;扑inus;戸lus;戔quare;抡blebarwedg\xe5\xfanƀadhᄮᵝᵧownarrow\xf3ᲃarpoonĀlrᵲᵶef\xf4Ჴigh\xf4ᲶŢᵿᶅkaro\xf7གɯᶊ\0\0ᶎrn;挟op;挌ƀcotᶘᶣᶦĀryᶝᶡ;쀀\ud835\udcb9;䑕l;槶rok;䄑Ādrᶰᶴot;拱iĀ;fᶺ᠖斿Āah᷀᷃r\xf2Щa\xf2ྦangle;榦Āci᷒ᷕy;䑟grarr;柿ऀDacdefglmnopqrstuxḁḉḙḸոḼṉṡṾấắẽỡἪἷὄ὎὚ĀDoḆᴴo\xf4ᲉĀcsḎḔute耻\xe9䃩ter;橮ȀaioyḢḧḱḶron;䄛rĀ;cḭḮ扖耻\xea䃪lon;払;䑍ot;䄗ĀDrṁṅot;扒;쀀\ud835\udd22ƀ;rsṐṑṗ檚ave耻\xe8䃨Ā;dṜṝ檖ot;檘Ȁ;ilsṪṫṲṴ檙nters;揧;愓Ā;dṹṺ檕ot;檗ƀapsẅẉẗcr;䄓tyƀ;svẒẓẕ戅et\xbbẓpĀ1;ẝẤijạả;怄;怅怃ĀgsẪẬ;䅋p;怂ĀgpẴẸon;䄙f;쀀\ud835\udd56ƀalsỄỎỒrĀ;sỊị拕l;槣us;橱iƀ;lvỚớở䎵on\xbbớ;䏵ȀcsuvỪỳἋἣĀioữḱrc\xbbḮɩỹ\0\0ỻ\xedՈantĀglἂἆtr\xbbṝess\xbbṺƀaeiἒ἖Ἒls;䀽st;扟vĀ;DȵἠD;橸parsl;槥ĀDaἯἳot;打rr;楱ƀcdiἾὁỸr;愯o\xf4͒ĀahὉὋ;䎷耻\xf0䃰Āmrὓὗl耻\xeb䃫o;悬ƀcipὡὤὧl;䀡s\xf4ծĀeoὬὴctatio\xeeՙnential\xe5չৡᾒ\0ᾞ\0ᾡᾧ\0\0ῆῌ\0ΐ\0ῦῪ \0 ⁚llingdotse\xf1Ṅy;䑄male;晀ƀilrᾭᾳ῁lig;耀ffiɩᾹ\0\0᾽g;耀ffig;耀ffl;쀀\ud835\udd23lig;耀filig;쀀fjƀaltῙ῜ῡt;晭ig;耀flns;斱of;䆒ǰ΅\0ῳf;쀀\ud835\udd57ĀakֿῷĀ;vῼ´拔;櫙artint;樍Āao‌⁕Ācs‑⁒ႉ‸⁅⁈\0⁐β•‥‧‪‬\0‮耻\xbd䂽;慓耻\xbc䂼;慕;慙;慛Ƴ‴\0‶;慔;慖ʴ‾⁁\0\0⁃耻\xbe䂾;慗;慜5;慘ƶ⁌\0⁎;慚;慝8;慞l;恄wn;挢cr;쀀\ud835\udcbbࢀEabcdefgijlnorstv₂₉₟₥₰₴⃰⃵⃺⃿℃ℒℸ̗ℾ⅒↞Ā;lٍ₇;檌ƀcmpₐₕ₝ute;䇵maĀ;dₜ᳚䎳;檆reve;䄟Āiy₪₮rc;䄝;䐳ot;䄡Ȁ;lqsؾق₽⃉ƀ;qsؾٌ⃄lan\xf4٥Ȁ;cdl٥⃒⃥⃕c;檩otĀ;o⃜⃝檀Ā;l⃢⃣檂;檄Ā;e⃪⃭쀀⋛︀s;檔r;쀀\ud835\udd24Ā;gٳ؛mel;愷cy;䑓Ȁ;Eajٚℌℎℐ;檒;檥;檤ȀEaesℛℝ℩ℴ;扩pĀ;p℣ℤ檊rox\xbbℤĀ;q℮ℯ檈Ā;q℮ℛim;拧pf;쀀\ud835\udd58Āci⅃ⅆr;愊mƀ;el٫ⅎ⅐;檎;檐茀>;cdlqr׮ⅠⅪⅮⅳⅹĀciⅥⅧ;檧r;橺ot;拗Par;榕uest;橼ʀadelsↄⅪ←ٖ↛ǰ↉\0↎pro\xf8₞r;楸qĀlqؿ↖les\xf3₈i\xed٫Āen↣↭rtneqq;쀀≩︀\xc5↪ԀAabcefkosy⇄⇇⇱⇵⇺∘∝∯≨≽r\xf2ΠȀilmr⇐⇔⇗⇛rs\xf0ᒄf\xbb․il\xf4کĀdr⇠⇤cy;䑊ƀ;cwࣴ⇫⇯ir;楈;憭ar;意irc;䄥ƀalr∁∎∓rtsĀ;u∉∊晥it\xbb∊lip;怦con;抹r;쀀\ud835\udd25sĀew∣∩arow;椥arow;椦ʀamopr∺∾≃≞≣rr;懿tht;戻kĀlr≉≓eftarrow;憩ightarrow;憪f;쀀\ud835\udd59bar;怕ƀclt≯≴≸r;쀀\ud835\udcbdas\xe8⇴rok;䄧Ābp⊂⊇ull;恃hen\xbbᱛૡ⊣\0⊪\0⊸⋅⋎\0⋕⋳\0\0⋸⌢⍧⍢⍿\0⎆⎪⎴cute耻\xed䃭ƀ;iyݱ⊰⊵rc耻\xee䃮;䐸Ācx⊼⊿y;䐵cl耻\xa1䂡ĀfrΟ⋉;쀀\ud835\udd26rave耻\xec䃬Ȁ;inoܾ⋝⋩⋮Āin⋢⋦nt;樌t;戭fin;槜ta;愩lig;䄳ƀaop⋾⌚⌝ƀcgt⌅⌈⌗r;䄫ƀelpܟ⌏⌓in\xe5ގar\xf4ܠh;䄱f;抷ed;䆵ʀ;cfotӴ⌬⌱⌽⍁are;愅inĀ;t⌸⌹戞ie;槝do\xf4⌙ʀ;celpݗ⍌⍐⍛⍡al;抺Āgr⍕⍙er\xf3ᕣ\xe3⍍arhk;樗rod;樼Ȁcgpt⍯⍲⍶⍻y;䑑on;䄯f;쀀\ud835\udd5aa;䎹uest耻\xbf䂿Āci⎊⎏r;쀀\ud835\udcbenʀ;EdsvӴ⎛⎝⎡ӳ;拹ot;拵Ā;v⎦⎧拴;拳Ā;iݷ⎮lde;䄩ǫ⎸\0⎼cy;䑖l耻\xef䃯̀cfmosu⏌⏗⏜⏡⏧⏵Āiy⏑⏕rc;䄵;䐹r;쀀\ud835\udd27ath;䈷pf;쀀\ud835\udd5bǣ⏬\0⏱r;쀀\ud835\udcbfrcy;䑘kcy;䑔Ѐacfghjos␋␖␢␧␭␱␵␻ppaĀ;v␓␔䎺;䏰Āey␛␠dil;䄷;䐺r;쀀\ud835\udd28reen;䄸cy;䑅cy;䑜pf;쀀\ud835\udd5ccr;쀀\ud835\udcc0஀ABEHabcdefghjlmnoprstuv⑰⒁⒆⒍⒑┎┽╚▀♎♞♥♹♽⚚⚲⛘❝❨➋⟀⠁⠒ƀart⑷⑺⑼r\xf2৆\xf2Εail;椛arr;椎Ā;gঔ⒋;檋ar;楢ॣ⒥\0⒪\0⒱\0\0\0\0\0⒵Ⓔ\0ⓆⓈⓍ\0⓹ute;䄺mptyv;榴ra\xeeࡌbda;䎻gƀ;dlࢎⓁⓃ;榑\xe5ࢎ;檅uo耻\xab䂫rЀ;bfhlpst࢙ⓞⓦⓩ⓫⓮⓱⓵Ā;f࢝ⓣs;椟s;椝\xeb≒p;憫l;椹im;楳l;憢ƀ;ae⓿─┄檫il;椙Ā;s┉┊檭;쀀⪭︀ƀabr┕┙┝rr;椌rk;杲Āak┢┬cĀek┨┪;䁻;䁛Āes┱┳;榋lĀdu┹┻;榏;榍Ȁaeuy╆╋╖╘ron;䄾Ādi═╔il;䄼\xecࢰ\xe2┩;䐻Ȁcqrs╣╦╭╽a;椶uoĀ;rนᝆĀdu╲╷har;楧shar;楋h;憲ʀ;fgqs▋▌উ◳◿扤tʀahlrt▘▤▷◂◨rrowĀ;t࢙□a\xe9⓶arpoonĀdu▯▴own\xbbњp\xbb०eftarrows;懇ightƀahs◍◖◞rrowĀ;sࣴࢧarpoon\xf3྘quigarro\xf7⇰hreetimes;拋ƀ;qs▋ও◺lan\xf4বʀ;cdgsব☊☍☝☨c;檨otĀ;o☔☕橿Ā;r☚☛檁;檃Ā;e☢☥쀀⋚︀s;檓ʀadegs☳☹☽♉♋ppro\xf8Ⓠot;拖qĀgq♃♅\xf4উgt\xf2⒌\xf4ছi\xedলƀilr♕࣡♚sht;楼;쀀\ud835\udd29Ā;Eজ♣;檑š♩♶rĀdu▲♮Ā;l॥♳;楪lk;斄cy;䑙ʀ;achtੈ⚈⚋⚑⚖r\xf2◁orne\xf2ᴈard;楫ri;旺Āio⚟⚤dot;䅀ustĀ;a⚬⚭掰che\xbb⚭ȀEaes⚻⚽⛉⛔;扨pĀ;p⛃⛄檉rox\xbb⛄Ā;q⛎⛏檇Ā;q⛎⚻im;拦Ѐabnoptwz⛩⛴⛷✚✯❁❇❐Ānr⛮⛱g;柬r;懽r\xebࣁgƀlmr⛿✍✔eftĀar০✇ight\xe1৲apsto;柼ight\xe1৽parrowĀlr✥✩ef\xf4⓭ight;憬ƀafl✶✹✽r;榅;쀀\ud835\udd5dus;樭imes;樴š❋❏st;戗\xe1ፎƀ;ef❗❘᠀旊nge\xbb❘arĀ;l❤❥䀨t;榓ʀachmt❳❶❼➅➇r\xf2ࢨorne\xf2ᶌarĀ;d྘➃;業;怎ri;抿̀achiqt➘➝ੀ➢➮➻quo;怹r;쀀\ud835\udcc1mƀ;egল➪➬;檍;檏Ābu┪➳oĀ;rฟ➹;怚rok;䅂萀<;cdhilqrࠫ⟒☹⟜⟠⟥⟪⟰Āci⟗⟙;檦r;橹re\xe5◲mes;拉arr;楶uest;橻ĀPi⟵⟹ar;榖ƀ;ef⠀भ᠛旃rĀdu⠇⠍shar;楊har;楦Āen⠗⠡rtneqq;쀀≨︀\xc5⠞܀Dacdefhilnopsu⡀⡅⢂⢎⢓⢠⢥⢨⣚⣢⣤ઃ⣳⤂Dot;戺Ȁclpr⡎⡒⡣⡽r耻\xaf䂯Āet⡗⡙;時Ā;e⡞⡟朠se\xbb⡟Ā;sျ⡨toȀ;dluျ⡳⡷⡻ow\xeeҌef\xf4ए\xf0Ꮡker;斮Āoy⢇⢌mma;権;䐼ash;怔asuredangle\xbbᘦr;쀀\ud835\udd2ao;愧ƀcdn⢯⢴⣉ro耻\xb5䂵Ȁ;acdᑤ⢽⣀⣄s\xf4ᚧir;櫰ot肻\xb7Ƶusƀ;bd⣒ᤃ⣓戒Ā;uᴼ⣘;横ţ⣞⣡p;櫛\xf2−\xf0ઁĀdp⣩⣮els;抧f;쀀\ud835\udd5eĀct⣸⣽r;쀀\ud835\udcc2pos\xbbᖝƀ;lm⤉⤊⤍䎼timap;抸ఀGLRVabcdefghijlmoprstuvw⥂⥓⥾⦉⦘⧚⧩⨕⨚⩘⩝⪃⪕⪤⪨⬄⬇⭄⭿⮮ⰴⱧⱼ⳩Āgt⥇⥋;쀀⋙̸Ā;v⥐௏쀀≫⃒ƀelt⥚⥲⥶ftĀar⥡⥧rrow;懍ightarrow;懎;쀀⋘̸Ā;v⥻ే쀀≪⃒ightarrow;懏ĀDd⦎⦓ash;抯ash;抮ʀbcnpt⦣⦧⦬⦱⧌la\xbb˞ute;䅄g;쀀∠⃒ʀ;Eiop඄⦼⧀⧅⧈;쀀⩰̸d;쀀≋̸s;䅉ro\xf8඄urĀ;a⧓⧔普lĀ;s⧓ସdz⧟\0⧣p肻\xa0ଷmpĀ;e௹ఀʀaeouy⧴⧾⨃⨐⨓ǰ⧹\0⧻;橃on;䅈dil;䅆ngĀ;dൾ⨊ot;쀀⩭̸p;橂;䐽ash;怓΀;Aadqsxஒ⨩⨭⨻⩁⩅⩐rr;懗rĀhr⨳⨶k;椤Ā;oᏲᏰot;쀀≐̸ui\xf6ୣĀei⩊⩎ar;椨\xed஘istĀ;s஠டr;쀀\ud835\udd2bȀEest௅⩦⩹⩼ƀ;qs஼⩭௡ƀ;qs஼௅⩴lan\xf4௢i\xed௪Ā;rஶ⪁\xbbஷƀAap⪊⪍⪑r\xf2⥱rr;憮ar;櫲ƀ;svྍ⪜ྌĀ;d⪡⪢拼;拺cy;䑚΀AEadest⪷⪺⪾⫂⫅⫶⫹r\xf2⥦;쀀≦̸rr;憚r;急Ȁ;fqs఻⫎⫣⫯tĀar⫔⫙rro\xf7⫁ightarro\xf7⪐ƀ;qs఻⪺⫪lan\xf4ౕĀ;sౕ⫴\xbbశi\xedౝĀ;rవ⫾iĀ;eచథi\xe4ඐĀpt⬌⬑f;쀀\ud835\udd5f膀\xac;in⬙⬚⬶䂬nȀ;Edvஉ⬤⬨⬮;쀀⋹̸ot;쀀⋵̸ǡஉ⬳⬵;拷;拶iĀ;vಸ⬼ǡಸ⭁⭃;拾;拽ƀaor⭋⭣⭩rȀ;ast୻⭕⭚⭟lle\xec୻l;쀀⫽⃥;쀀∂̸lint;樔ƀ;ceಒ⭰⭳u\xe5ಥĀ;cಘ⭸Ā;eಒ⭽\xf1ಘȀAait⮈⮋⮝⮧r\xf2⦈rrƀ;cw⮔⮕⮙憛;쀀⤳̸;쀀↝̸ghtarrow\xbb⮕riĀ;eೋೖ΀chimpqu⮽⯍⯙⬄୸⯤⯯Ȁ;cerല⯆ഷ⯉u\xe5൅;쀀\ud835\udcc3ortɭ⬅\0\0⯖ar\xe1⭖mĀ;e൮⯟Ā;q൴൳suĀbp⯫⯭\xe5೸\xe5ഋƀbcp⯶ⰑⰙȀ;Ees⯿ⰀഢⰄ抄;쀀⫅̸etĀ;eഛⰋqĀ;qണⰀcĀ;eലⰗ\xf1സȀ;EesⰢⰣൟⰧ抅;쀀⫆̸etĀ;e൘ⰮqĀ;qൠⰣȀgilrⰽⰿⱅⱇ\xecௗlde耻\xf1䃱\xe7ృiangleĀlrⱒⱜeftĀ;eచⱚ\xf1దightĀ;eೋⱥ\xf1೗Ā;mⱬⱭ䎽ƀ;esⱴⱵⱹ䀣ro;愖p;怇ҀDHadgilrsⲏⲔⲙⲞⲣⲰⲶⳓⳣash;抭arr;椄p;쀀≍⃒ash;抬ĀetⲨⲬ;쀀≥⃒;쀀>⃒nfin;槞ƀAetⲽⳁⳅrr;椂;쀀≤⃒Ā;rⳊⳍ쀀<⃒ie;쀀⊴⃒ĀAtⳘⳜrr;椃rie;쀀⊵⃒im;쀀∼⃒ƀAan⳰⳴ⴂrr;懖rĀhr⳺⳽k;椣Ā;oᏧᏥear;椧ቓ᪕\0\0\0\0\0\0\0\0\0\0\0\0\0ⴭ\0ⴸⵈⵠⵥ⵲ⶄᬇ\0\0ⶍⶫ\0ⷈⷎ\0ⷜ⸙⸫⸾⹃Ācsⴱ᪗ute耻\xf3䃳ĀiyⴼⵅrĀ;c᪞ⵂ耻\xf4䃴;䐾ʀabios᪠ⵒⵗLjⵚlac;䅑v;樸old;榼lig;䅓Ācr⵩⵭ir;榿;쀀\ud835\udd2cͯ⵹\0\0⵼\0ⶂn;䋛ave耻\xf2䃲;槁Ābmⶈ෴ar;榵Ȁacitⶕ⶘ⶥⶨr\xf2᪀Āir⶝ⶠr;榾oss;榻n\xe5๒;槀ƀaeiⶱⶵⶹcr;䅍ga;䏉ƀcdnⷀⷅǍron;䎿;榶pf;쀀\ud835\udd60ƀaelⷔ⷗ǒr;榷rp;榹΀;adiosvⷪⷫⷮ⸈⸍⸐⸖戨r\xf2᪆Ȁ;efmⷷⷸ⸂⸅橝rĀ;oⷾⷿ愴f\xbbⷿ耻\xaa䂪耻\xba䂺gof;抶r;橖lope;橗;橛ƀclo⸟⸡⸧\xf2⸁ash耻\xf8䃸l;折iŬⸯ⸴de耻\xf5䃵esĀ;aǛ⸺s;樶ml耻\xf6䃶bar;挽ૡ⹞\0⹽\0⺀⺝\0⺢⺹\0\0⻋ຜ\0⼓\0\0⼫⾼\0⿈rȀ;astЃ⹧⹲຅脀\xb6;l⹭⹮䂶le\xecЃɩ⹸\0\0⹻m;櫳;櫽y;䐿rʀcimpt⺋⺏⺓ᡥ⺗nt;䀥od;䀮il;怰enk;怱r;쀀\ud835\udd2dƀimo⺨⺰⺴Ā;v⺭⺮䏆;䏕ma\xf4੶ne;明ƀ;tv⺿⻀⻈䏀chfork\xbb´;䏖Āau⻏⻟nĀck⻕⻝kĀ;h⇴⻛;愎\xf6⇴sҀ;abcdemst⻳⻴ᤈ⻹⻽⼄⼆⼊⼎䀫cir;樣ir;樢Āouᵀ⼂;樥;橲n肻\xb1ຝim;樦wo;樧ƀipu⼙⼠⼥ntint;樕f;쀀\ud835\udd61nd耻\xa3䂣Ԁ;Eaceinosu່⼿⽁⽄⽇⾁⾉⾒⽾⾶;檳p;檷u\xe5໙Ā;c໎⽌̀;acens່⽙⽟⽦⽨⽾ppro\xf8⽃urlye\xf1໙\xf1໎ƀaes⽯⽶⽺pprox;檹qq;檵im;拨i\xedໟmeĀ;s⾈ຮ怲ƀEas⽸⾐⽺\xf0⽵ƀdfp໬⾙⾯ƀals⾠⾥⾪lar;挮ine;挒urf;挓Ā;t໻⾴\xef໻rel;抰Āci⿀⿅r;쀀\ud835\udcc5;䏈ncsp;怈̀fiopsu⿚⋢⿟⿥⿫⿱r;쀀\ud835\udd2epf;쀀\ud835\udd62rime;恗cr;쀀\ud835\udcc6ƀaeo⿸〉〓tĀei⿾々rnion\xf3ڰnt;樖stĀ;e【】䀿\xf1Ἑ\xf4༔઀ABHabcdefhilmnoprstux぀けさすムㄎㄫㅇㅢㅲㆎ㈆㈕㈤㈩㉘㉮㉲㊐㊰㊷ƀartぇおがr\xf2Ⴓ\xf2ϝail;検ar\xf2ᱥar;楤΀cdenqrtとふへみわゔヌĀeuねぱ;쀀∽̱te;䅕i\xe3ᅮmptyv;榳gȀ;del࿑らるろ;榒;榥\xe5࿑uo耻\xbb䂻rր;abcfhlpstw࿜ガクシスゼゾダッデナp;極Ā;f࿠ゴs;椠;椳s;椞\xeb≝\xf0✮l;楅im;楴l;憣;憝Āaiパフil;椚oĀ;nホボ戶al\xf3༞ƀabrョリヮr\xf2៥rk;杳ĀakンヽcĀekヹ・;䁽;䁝Āes㄂㄄;榌lĀduㄊㄌ;榎;榐Ȁaeuyㄗㄜㄧㄩron;䅙Ādiㄡㄥil;䅗\xec࿲\xe2ヺ;䑀Ȁclqsㄴㄷㄽㅄa;椷dhar;楩uoĀ;rȎȍh;憳ƀacgㅎㅟངlȀ;ipsླྀㅘㅛႜn\xe5Ⴛar\xf4ྩt;断ƀilrㅩဣㅮsht;楽;쀀\ud835\udd2fĀaoㅷㆆrĀduㅽㅿ\xbbѻĀ;l႑ㆄ;楬Ā;vㆋㆌ䏁;䏱ƀgns㆕ㇹㇼht̀ahlrstㆤㆰ㇂㇘㇤㇮rrowĀ;t࿜ㆭa\xe9トarpoonĀduㆻㆿow\xeeㅾp\xbb႒eftĀah㇊㇐rrow\xf3࿪arpoon\xf3Ցightarrows;應quigarro\xf7ニhreetimes;拌g;䋚ingdotse\xf1ἲƀahm㈍㈐㈓r\xf2࿪a\xf2Ց;怏oustĀ;a㈞㈟掱che\xbb㈟mid;櫮Ȁabpt㈲㈽㉀㉒Ānr㈷㈺g;柭r;懾r\xebဃƀafl㉇㉊㉎r;榆;쀀\ud835\udd63us;樮imes;樵Āap㉝㉧rĀ;g㉣㉤䀩t;榔olint;樒ar\xf2㇣Ȁachq㉻㊀Ⴜ㊅quo;怺r;쀀\ud835\udcc7Ābu・㊊oĀ;rȔȓƀhir㊗㊛㊠re\xe5ㇸmes;拊iȀ;efl㊪ၙᠡ㊫方tri;槎luhar;楨;愞ൡ㋕㋛㋟㌬㌸㍱\0㍺㎤\0\0㏬㏰\0㐨㑈㑚㒭㒱㓊㓱\0㘖\0\0㘳cute;䅛qu\xef➺Ԁ;Eaceinpsyᇭ㋳㋵㋿㌂㌋㌏㌟㌦㌩;檴ǰ㋺\0㋼;檸on;䅡u\xe5ᇾĀ;dᇳ㌇il;䅟rc;䅝ƀEas㌖㌘㌛;檶p;檺im;择olint;樓i\xedሄ;䑁otƀ;be㌴ᵇ㌵担;橦΀Aacmstx㍆㍊㍗㍛㍞㍣㍭rr;懘rĀhr㍐㍒\xeb∨Ā;oਸ਼਴t耻\xa7䂧i;䀻war;椩mĀin㍩\xf0nu\xf3\xf1t;朶rĀ;o㍶⁕쀀\ud835\udd30Ȁacoy㎂㎆㎑㎠rp;景Āhy㎋㎏cy;䑉;䑈rtɭ㎙\0\0㎜i\xe4ᑤara\xec⹯耻\xad䂭Āgm㎨㎴maƀ;fv㎱㎲㎲䏃;䏂Ѐ;deglnprካ㏅㏉㏎㏖㏞㏡㏦ot;橪Ā;q኱ኰĀ;E㏓㏔檞;檠Ā;E㏛㏜檝;檟e;扆lus;樤arr;楲ar\xf2ᄽȀaeit㏸㐈㐏㐗Āls㏽㐄lsetm\xe9㍪hp;樳parsl;槤Ādlᑣ㐔e;挣Ā;e㐜㐝檪Ā;s㐢㐣檬;쀀⪬︀ƀflp㐮㐳㑂tcy;䑌Ā;b㐸㐹䀯Ā;a㐾㐿槄r;挿f;쀀\ud835\udd64aĀdr㑍ЂesĀ;u㑔㑕晠it\xbb㑕ƀcsu㑠㑹㒟Āau㑥㑯pĀ;sᆈ㑫;쀀⊓︀pĀ;sᆴ㑵;쀀⊔︀uĀbp㑿㒏ƀ;esᆗᆜ㒆etĀ;eᆗ㒍\xf1ᆝƀ;esᆨᆭ㒖etĀ;eᆨ㒝\xf1ᆮƀ;afᅻ㒦ְrť㒫ֱ\xbbᅼar\xf2ᅈȀcemt㒹㒾㓂㓅r;쀀\ud835\udcc8tm\xee\xf1i\xec㐕ar\xe6ᆾĀar㓎㓕rĀ;f㓔ឿ昆Āan㓚㓭ightĀep㓣㓪psilo\xeeỠh\xe9⺯s\xbb⡒ʀbcmnp㓻㕞ሉ㖋㖎Ҁ;Edemnprs㔎㔏㔑㔕㔞㔣㔬㔱㔶抂;櫅ot;檽Ā;dᇚ㔚ot;櫃ult;櫁ĀEe㔨㔪;櫋;把lus;檿arr;楹ƀeiu㔽㕒㕕tƀ;en㔎㕅㕋qĀ;qᇚ㔏eqĀ;q㔫㔨m;櫇Ābp㕚㕜;櫕;櫓c̀;acensᇭ㕬㕲㕹㕻㌦ppro\xf8㋺urlye\xf1ᇾ\xf1ᇳƀaes㖂㖈㌛ppro\xf8㌚q\xf1㌗g;晪ڀ123;Edehlmnps㖩㖬㖯ሜ㖲㖴㗀㗉㗕㗚㗟㗨㗭耻\xb9䂹耻\xb2䂲耻\xb3䂳;櫆Āos㖹㖼t;檾ub;櫘Ā;dሢ㗅ot;櫄sĀou㗏㗒l;柉b;櫗arr;楻ult;櫂ĀEe㗤㗦;櫌;抋lus;櫀ƀeiu㗴㘉㘌tƀ;enሜ㗼㘂qĀ;qሢ㖲eqĀ;q㗧㗤m;櫈Ābp㘑㘓;櫔;櫖ƀAan㘜㘠㘭rr;懙rĀhr㘦㘨\xeb∮Ā;oਫ਩war;椪lig耻\xdf䃟௡㙑㙝㙠ዎ㙳㙹\0㙾㛂\0\0\0\0\0㛛㜃\0㜉㝬\0\0\0㞇ɲ㙖\0\0㙛get;挖;䏄r\xeb๟ƀaey㙦㙫㙰ron;䅥dil;䅣;䑂lrec;挕r;쀀\ud835\udd31Ȁeiko㚆㚝㚵㚼Dz㚋\0㚑eĀ4fኄኁaƀ;sv㚘㚙㚛䎸ym;䏑Ācn㚢㚲kĀas㚨㚮ppro\xf8዁im\xbbኬs\xf0ኞĀas㚺㚮\xf0዁rn耻\xfe䃾Ǭ̟㛆⋧es膀\xd7;bd㛏㛐㛘䃗Ā;aᤏ㛕r;樱;樰ƀeps㛡㛣㜀\xe1⩍Ȁ;bcf҆㛬㛰㛴ot;挶ir;櫱Ā;o㛹㛼쀀\ud835\udd65rk;櫚\xe1㍢rime;怴ƀaip㜏㜒㝤d\xe5ቈ΀adempst㜡㝍㝀㝑㝗㝜㝟ngleʀ;dlqr㜰㜱㜶㝀㝂斵own\xbbᶻeftĀ;e⠀㜾\xf1म;扜ightĀ;e㊪㝋\xf1ၚot;旬inus;樺lus;樹b;槍ime;樻ezium;揢ƀcht㝲㝽㞁Āry㝷㝻;쀀\ud835\udcc9;䑆cy;䑛rok;䅧Āio㞋㞎x\xf4᝷headĀlr㞗㞠eftarro\xf7ࡏightarrow\xbbཝऀAHabcdfghlmoprstuw㟐㟓㟗㟤㟰㟼㠎㠜㠣㠴㡑㡝㡫㢩㣌㣒㣪㣶r\xf2ϭar;楣Ācr㟜㟢ute耻\xfa䃺\xf2ᅐrǣ㟪\0㟭y;䑞ve;䅭Āiy㟵㟺rc耻\xfb䃻;䑃ƀabh㠃㠆㠋r\xf2Ꭽlac;䅱a\xf2ᏃĀir㠓㠘sht;楾;쀀\ud835\udd32rave耻\xf9䃹š㠧㠱rĀlr㠬㠮\xbbॗ\xbbႃlk;斀Āct㠹㡍ɯ㠿\0\0㡊rnĀ;e㡅㡆挜r\xbb㡆op;挏ri;旸Āal㡖㡚cr;䅫肻\xa8͉Āgp㡢㡦on;䅳f;쀀\ud835\udd66̀adhlsuᅋ㡸㡽፲㢑㢠own\xe1ᎳarpoonĀlr㢈㢌ef\xf4㠭igh\xf4㠯iƀ;hl㢙㢚㢜䏅\xbbᏺon\xbb㢚parrows;懈ƀcit㢰㣄㣈ɯ㢶\0\0㣁rnĀ;e㢼㢽挝r\xbb㢽op;挎ng;䅯ri;旹cr;쀀\ud835\udccaƀdir㣙㣝㣢ot;拰lde;䅩iĀ;f㜰㣨\xbb᠓Āam㣯㣲r\xf2㢨l耻\xfc䃼angle;榧ހABDacdeflnoprsz㤜㤟㤩㤭㦵㦸㦽㧟㧤㧨㧳㧹㧽㨁㨠r\xf2ϷarĀ;v㤦㤧櫨;櫩as\xe8ϡĀnr㤲㤷grt;榜΀eknprst㓣㥆㥋㥒㥝㥤㦖app\xe1␕othin\xe7ẖƀhir㓫⻈㥙op\xf4⾵Ā;hᎷ㥢\xefㆍĀiu㥩㥭gm\xe1㎳Ābp㥲㦄setneqĀ;q㥽㦀쀀⊊︀;쀀⫋︀setneqĀ;q㦏㦒쀀⊋︀;쀀⫌︀Āhr㦛㦟et\xe1㚜iangleĀlr㦪㦯eft\xbbथight\xbbၑy;䐲ash\xbbံƀelr㧄㧒㧗ƀ;beⷪ㧋㧏ar;抻q;扚lip;拮Ābt㧜ᑨa\xf2ᑩr;쀀\ud835\udd33tr\xe9㦮suĀbp㧯㧱\xbbജ\xbb൙pf;쀀\ud835\udd67ro\xf0໻tr\xe9㦴Ācu㨆㨋r;쀀\ud835\udccbĀbp㨐㨘nĀEe㦀㨖\xbb㥾nĀEe㦒㨞\xbb㦐igzag;榚΀cefoprs㨶㨻㩖㩛㩔㩡㩪irc;䅵Ādi㩀㩑Ābg㩅㩉ar;機eĀ;qᗺ㩏;扙erp;愘r;쀀\ud835\udd34pf;쀀\ud835\udd68Ā;eᑹ㩦at\xe8ᑹcr;쀀\ud835\udcccૣណ㪇\0㪋\0㪐㪛\0\0㪝㪨㪫㪯\0\0㫃㫎\0㫘ៜ៟tr\xe9៑r;쀀\ud835\udd35ĀAa㪔㪗r\xf2σr\xf2৶;䎾ĀAa㪡㪤r\xf2θr\xf2৫a\xf0✓is;拻ƀdptឤ㪵㪾Āfl㪺ឩ;쀀\ud835\udd69im\xe5ឲĀAa㫇㫊r\xf2ώr\xf2ਁĀcq㫒ីr;쀀\ud835\udccdĀpt៖㫜r\xe9។Ѐacefiosu㫰㫽㬈㬌㬑㬕㬛㬡cĀuy㫶㫻te耻\xfd䃽;䑏Āiy㬂㬆rc;䅷;䑋n耻\xa5䂥r;쀀\ud835\udd36cy;䑗pf;쀀\ud835\udd6acr;쀀\ud835\udcceĀcm㬦㬩y;䑎l耻\xff䃿Ԁacdefhiosw㭂㭈㭔㭘㭤㭩㭭㭴㭺㮀cute;䅺Āay㭍㭒ron;䅾;䐷ot;䅼Āet㭝㭡tr\xe6ᕟa;䎶r;쀀\ud835\udd37cy;䐶grarr;懝pf;쀀\ud835\udd6bcr;쀀\ud835\udccfĀjn㮅㮇;怍j;怌' + .split("") + .map(e => e.charCodeAt(0)), + ); + }, + 5949: function (e, t, r) { + r.d(t, { s: () => n }); + let n = new Uint16Array("Ȁaglq \x15\x18\x1bɭ\x0f\0\0\x12p;䀦os;䀧t;䀾t;䀼uot;䀢".split("").map(e => e.charCodeAt(0))); + }, + 9496: function () {}, + 8466: function (e, t, r) { + r.d(t, { Gj: () => o.Gj, WY: () => o.WY, X1: () => o.X1 }), r(2990), r(466); + var n, + i, + a, + s, + o = r(747); + ((n = a || (a = {}))[(n.XML = 0)] = "XML"), (n[(n.HTML = 1)] = "HTML"), ((i = s || (s = {}))[(i.UTF8 = 0)] = "UTF8"), (i[(i.ASCII = 1)] = "ASCII"), (i[(i.Extensive = 2)] = "Extensive"), (i[(i.Attribute = 3)] = "Attribute"), (i[(i.Text = 4)] = "Text"); + }, + 4645: function (e, t, r) { + r.d(t, { i: () => g }); + var n = r(5645), + i = r(2990); + let a = new Set(["input", "option", "optgroup", "select", "button", "datalist", "textarea"]), + s = new Set(["p"]), + o = new Set(["thead", "tbody"]), + l = new Set(["dd", "dt"]), + c = new Set(["rt", "rp"]), + u = new Map([ + ["tr", new Set(["tr", "th", "td"])], + ["th", new Set(["th"])], + ["td", new Set(["thead", "th", "td"])], + ["body", new Set(["head", "link", "script"])], + ["li", new Set(["li"])], + ["p", s], + ["h1", s], + ["h2", s], + ["h3", s], + ["h4", s], + ["h5", s], + ["h6", s], + ["select", a], + ["input", a], + ["output", a], + ["button", a], + ["datalist", a], + ["textarea", a], + ["option", new Set(["option"])], + ["optgroup", new Set(["optgroup", "option"])], + ["dd", l], + ["dt", l], + ["address", s], + ["article", s], + ["aside", s], + ["blockquote", s], + ["details", s], + ["div", s], + ["dl", s], + ["fieldset", s], + ["figcaption", s], + ["figure", s], + ["footer", s], + ["form", s], + ["header", s], + ["hr", s], + ["main", s], + ["nav", s], + ["ol", s], + ["pre", s], + ["section", s], + ["table", s], + ["ul", s], + ["rt", c], + ["rp", c], + ["tbody", o], + ["tfoot", o], + ]), + d = new Set(["area", "base", "basefont", "br", "col", "command", "embed", "frame", "hr", "img", "input", "isindex", "keygen", "link", "meta", "param", "source", "track", "wbr"]), + h = new Set(["math", "svg"]), + p = new Set(["mi", "mo", "mn", "ms", "mtext", "annotation-xml", "foreignobject", "desc", "title"]), + f = /\s|\//; + class g { + constructor(e, t = {}) { + var r, i, a, s, o, l; + (this.options = t), + (this.startIndex = 0), + (this.endIndex = 0), + (this.openTagStart = 0), + (this.tagname = ""), + (this.attribname = ""), + (this.attribvalue = ""), + (this.attribs = null), + (this.stack = []), + (this.buffers = []), + (this.bufferOffset = 0), + (this.writeIndex = 0), + (this.ended = !1), + (this.cbs = null != e ? e : {}), + (this.htmlMode = !this.options.xmlMode), + (this.lowerCaseTagNames = null != (r = t.lowerCaseTags) ? r : this.htmlMode), + (this.lowerCaseAttributeNames = null != (i = t.lowerCaseAttributeNames) ? i : this.htmlMode), + (this.recognizeSelfClosing = null != (a = t.recognizeSelfClosing) ? a : !this.htmlMode), + (this.tokenizer = new (null != (s = t.Tokenizer) ? s : n.A)(this.options, this)), + (this.foreignContext = [!this.htmlMode]), + null == (l = (o = this.cbs).onparserinit) || l.call(o, this); + } + ontext(e, t) { + var r, n; + let i = this.getSlice(e, t); + (this.endIndex = t - 1), null == (n = (r = this.cbs).ontext) || n.call(r, i), (this.startIndex = t); + } + ontextentity(e, t) { + var r, n; + (this.endIndex = t - 1), null == (n = (r = this.cbs).ontext) || n.call(r, (0, i.MK)(e)), (this.startIndex = t); + } + isVoidElement(e) { + return this.htmlMode && d.has(e); + } + onopentagname(e, t) { + this.endIndex = t; + let r = this.getSlice(e, t); + this.lowerCaseTagNames && (r = r.toLowerCase()), this.emitOpenTag(r); + } + emitOpenTag(e) { + var t, r, n, i; + (this.openTagStart = this.startIndex), (this.tagname = e); + let a = this.htmlMode && u.get(e); + if (a) + for (; this.stack.length > 0 && a.has(this.stack[0]); ) { + let e = this.stack.shift(); + null == (r = (t = this.cbs).onclosetag) || r.call(t, e, !0); + } + !this.isVoidElement(e) && (this.stack.unshift(e), this.htmlMode && (h.has(e) ? this.foreignContext.unshift(!0) : p.has(e) && this.foreignContext.unshift(!1))), null == (i = (n = this.cbs).onopentagname) || i.call(n, e), this.cbs.onopentag && (this.attribs = {}); + } + endOpenTag(e) { + var t, r; + (this.startIndex = this.openTagStart), this.attribs && (null == (r = (t = this.cbs).onopentag) || r.call(t, this.tagname, this.attribs, e), (this.attribs = null)), this.cbs.onclosetag && this.isVoidElement(this.tagname) && this.cbs.onclosetag(this.tagname, !0), (this.tagname = ""); + } + onopentagend(e) { + (this.endIndex = e), this.endOpenTag(!1), (this.startIndex = e + 1); + } + onclosetag(e, t) { + var r, n, i, a, s, o, l, c; + this.endIndex = t; + let u = this.getSlice(e, t); + if ((this.lowerCaseTagNames && (u = u.toLowerCase()), this.htmlMode && (h.has(u) || p.has(u)) && this.foreignContext.shift(), this.isVoidElement(u))) + this.htmlMode && "br" === u && (null == (a = (i = this.cbs).onopentagname) || a.call(i, "br"), null == (o = (s = this.cbs).onopentag) || o.call(s, "br", {}, !0), null == (c = (l = this.cbs).onclosetag) || c.call(l, "br", !1)); + else { + let e = this.stack.indexOf(u); + if (-1 !== e) + for (let t = 0; t <= e; t++) { + let i = this.stack.shift(); + null == (n = (r = this.cbs).onclosetag) || n.call(r, i, t !== e); + } + else this.htmlMode && "p" === u && (this.emitOpenTag("p"), this.closeCurrentTag(!0)); + } + this.startIndex = t + 1; + } + onselfclosingtag(e) { + (this.endIndex = e), this.recognizeSelfClosing || this.foreignContext[0] ? (this.closeCurrentTag(!1), (this.startIndex = e + 1)) : this.onopentagend(e); + } + closeCurrentTag(e) { + var t, r; + let n = this.tagname; + this.endOpenTag(e), this.stack[0] === n && (null == (r = (t = this.cbs).onclosetag) || r.call(t, n, !e), this.stack.shift()); + } + onattribname(e, t) { + this.startIndex = e; + let r = this.getSlice(e, t); + this.attribname = this.lowerCaseAttributeNames ? r.toLowerCase() : r; + } + onattribdata(e, t) { + this.attribvalue += this.getSlice(e, t); + } + onattribentity(e) { + this.attribvalue += (0, i.MK)(e); + } + onattribend(e, t) { + var r, i; + (this.endIndex = t), + null == (i = (r = this.cbs).onattribute) || i.call(r, this.attribname, this.attribvalue, e === n.X.Double ? '"' : e === n.X.Single ? "'" : e === n.X.NoValue ? void 0 : null), + this.attribs && !Object.prototype.hasOwnProperty.call(this.attribs, this.attribname) && (this.attribs[this.attribname] = this.attribvalue), + (this.attribvalue = ""); + } + getInstructionName(e) { + let t = e.search(f), + r = t < 0 ? e : e.substr(0, t); + return this.lowerCaseTagNames && (r = r.toLowerCase()), r; + } + ondeclaration(e, t) { + this.endIndex = t; + let r = this.getSlice(e, t); + if (this.cbs.onprocessinginstruction) { + let e = this.getInstructionName(r); + this.cbs.onprocessinginstruction(`!${e}`, `!${r}`); + } + this.startIndex = t + 1; + } + onprocessinginstruction(e, t) { + this.endIndex = t; + let r = this.getSlice(e, t); + if (this.cbs.onprocessinginstruction) { + let e = this.getInstructionName(r); + this.cbs.onprocessinginstruction(`?${e}`, `?${r}`); + } + this.startIndex = t + 1; + } + oncomment(e, t, r) { + var n, i, a, s; + (this.endIndex = t), null == (i = (n = this.cbs).oncomment) || i.call(n, this.getSlice(e, t - r)), null == (s = (a = this.cbs).oncommentend) || s.call(a), (this.startIndex = t + 1); + } + oncdata(e, t, r) { + var n, i, a, s, o, l, c, u, d, h; + this.endIndex = t; + let p = this.getSlice(e, t - r); + !this.htmlMode || this.options.recognizeCDATA + ? (null == (i = (n = this.cbs).oncdatastart) || i.call(n), null == (s = (a = this.cbs).ontext) || s.call(a, p), null == (l = (o = this.cbs).oncdataend) || l.call(o)) + : (null == (u = (c = this.cbs).oncomment) || u.call(c, `[CDATA[${p}]]`), null == (h = (d = this.cbs).oncommentend) || h.call(d)), + (this.startIndex = t + 1); + } + onend() { + var e, t; + if (this.cbs.onclosetag) { + this.endIndex = this.startIndex; + for (let e = 0; e < this.stack.length; e++) this.cbs.onclosetag(this.stack[e], !0); + } + null == (t = (e = this.cbs).onend) || t.call(e); + } + reset() { + var e, t, r, n; + null == (t = (e = this.cbs).onreset) || t.call(e), + this.tokenizer.reset(), + (this.tagname = ""), + (this.attribname = ""), + (this.attribs = null), + (this.stack.length = 0), + (this.startIndex = 0), + (this.endIndex = 0), + null == (n = (r = this.cbs).onparserinit) || n.call(r, this), + (this.buffers.length = 0), + (this.foreignContext.length = 0), + this.foreignContext.unshift(!this.htmlMode), + (this.bufferOffset = 0), + (this.writeIndex = 0), + (this.ended = !1); + } + parseComplete(e) { + this.reset(), this.end(e); + } + getSlice(e, t) { + for (; e - this.bufferOffset >= this.buffers[0].length; ) this.shiftBuffer(); + let r = this.buffers[0].slice(e - this.bufferOffset, t - this.bufferOffset); + for (; t - this.bufferOffset > this.buffers[0].length; ) this.shiftBuffer(), (r += this.buffers[0].slice(0, t - this.bufferOffset)); + return r; + } + shiftBuffer() { + (this.bufferOffset += this.buffers[0].length), this.writeIndex--, this.buffers.shift(); + } + write(e) { + var t, r; + if (this.ended) { + null == (r = (t = this.cbs).onerror) || r.call(t, Error(".write() after done!")); + return; + } + this.buffers.push(e), this.tokenizer.running && (this.tokenizer.write(e), this.writeIndex++); + } + end(e) { + var t, r; + if (this.ended) { + null == (r = (t = this.cbs).onerror) || r.call(t, Error(".end() after done!")); + return; + } + e && this.write(e), (this.ended = !0), this.tokenizer.end(); + } + pause() { + this.tokenizer.pause(); + } + resume() { + for (this.tokenizer.resume(); this.tokenizer.running && this.writeIndex < this.buffers.length; ) this.tokenizer.write(this.buffers[this.writeIndex++]); + this.ended && this.tokenizer.end(); + } + parseChunk(e) { + this.write(e); + } + done(e) { + this.end(e); + } + } + }, + 5645: function (e, t, r) { + r.d(t, { A: () => p, X: () => l }); + var n, + i, + a, + s, + o, + l, + c = r(2990); + function u(e) { + return e === s.Space || e === s.NewLine || e === s.Tab || e === s.FormFeed || e === s.CarriageReturn; + } + function d(e) { + return e === s.Slash || e === s.Gt || u(e); + } + ((n = s || (s = {}))[(n.Tab = 9)] = "Tab"), + (n[(n.NewLine = 10)] = "NewLine"), + (n[(n.FormFeed = 12)] = "FormFeed"), + (n[(n.CarriageReturn = 13)] = "CarriageReturn"), + (n[(n.Space = 32)] = "Space"), + (n[(n.ExclamationMark = 33)] = "ExclamationMark"), + (n[(n.Number = 35)] = "Number"), + (n[(n.Amp = 38)] = "Amp"), + (n[(n.SingleQuote = 39)] = "SingleQuote"), + (n[(n.DoubleQuote = 34)] = "DoubleQuote"), + (n[(n.Dash = 45)] = "Dash"), + (n[(n.Slash = 47)] = "Slash"), + (n[(n.Zero = 48)] = "Zero"), + (n[(n.Nine = 57)] = "Nine"), + (n[(n.Semi = 59)] = "Semi"), + (n[(n.Lt = 60)] = "Lt"), + (n[(n.Eq = 61)] = "Eq"), + (n[(n.Gt = 62)] = "Gt"), + (n[(n.Questionmark = 63)] = "Questionmark"), + (n[(n.UpperA = 65)] = "UpperA"), + (n[(n.LowerA = 97)] = "LowerA"), + (n[(n.UpperF = 70)] = "UpperF"), + (n[(n.LowerF = 102)] = "LowerF"), + (n[(n.UpperZ = 90)] = "UpperZ"), + (n[(n.LowerZ = 122)] = "LowerZ"), + (n[(n.LowerX = 120)] = "LowerX"), + (n[(n.OpeningSquareBracket = 91)] = "OpeningSquareBracket"), + ((i = o || (o = {}))[(i.Text = 1)] = "Text"), + (i[(i.BeforeTagName = 2)] = "BeforeTagName"), + (i[(i.InTagName = 3)] = "InTagName"), + (i[(i.InSelfClosingTag = 4)] = "InSelfClosingTag"), + (i[(i.BeforeClosingTagName = 5)] = "BeforeClosingTagName"), + (i[(i.InClosingTagName = 6)] = "InClosingTagName"), + (i[(i.AfterClosingTagName = 7)] = "AfterClosingTagName"), + (i[(i.BeforeAttributeName = 8)] = "BeforeAttributeName"), + (i[(i.InAttributeName = 9)] = "InAttributeName"), + (i[(i.AfterAttributeName = 10)] = "AfterAttributeName"), + (i[(i.BeforeAttributeValue = 11)] = "BeforeAttributeValue"), + (i[(i.InAttributeValueDq = 12)] = "InAttributeValueDq"), + (i[(i.InAttributeValueSq = 13)] = "InAttributeValueSq"), + (i[(i.InAttributeValueNq = 14)] = "InAttributeValueNq"), + (i[(i.BeforeDeclaration = 15)] = "BeforeDeclaration"), + (i[(i.InDeclaration = 16)] = "InDeclaration"), + (i[(i.InProcessingInstruction = 17)] = "InProcessingInstruction"), + (i[(i.BeforeComment = 18)] = "BeforeComment"), + (i[(i.CDATASequence = 19)] = "CDATASequence"), + (i[(i.InSpecialComment = 20)] = "InSpecialComment"), + (i[(i.InCommentLike = 21)] = "InCommentLike"), + (i[(i.BeforeSpecialS = 22)] = "BeforeSpecialS"), + (i[(i.BeforeSpecialT = 23)] = "BeforeSpecialT"), + (i[(i.SpecialStartSequence = 24)] = "SpecialStartSequence"), + (i[(i.InSpecialTag = 25)] = "InSpecialTag"), + (i[(i.InEntity = 26)] = "InEntity"), + ((a = l || (l = {}))[(a.NoValue = 0)] = "NoValue"), + (a[(a.Unquoted = 1)] = "Unquoted"), + (a[(a.Single = 2)] = "Single"), + (a[(a.Double = 3)] = "Double"); + let h = { + Cdata: new Uint8Array([67, 68, 65, 84, 65, 91]), + CdataEnd: new Uint8Array([93, 93, 62]), + CommentEnd: new Uint8Array([45, 45, 62]), + ScriptEnd: new Uint8Array([60, 47, 115, 99, 114, 105, 112, 116]), + StyleEnd: new Uint8Array([60, 47, 115, 116, 121, 108, 101]), + TitleEnd: new Uint8Array([60, 47, 116, 105, 116, 108, 101]), + TextareaEnd: new Uint8Array([60, 47, 116, 101, 120, 116, 97, 114, 101, 97]), + XmpEnd: new Uint8Array([60, 47, 120, 109, 112]), + }; + class p { + constructor({ xmlMode: e = !1, decodeEntities: t = !0 }, r) { + (this.cbs = r), + (this.state = o.Text), + (this.buffer = ""), + (this.sectionStart = 0), + (this.index = 0), + (this.entityStart = 0), + (this.baseState = o.Text), + (this.isSpecial = !1), + (this.running = !0), + (this.offset = 0), + (this.currentSequence = void 0), + (this.sequenceIndex = 0), + (this.xmlMode = e), + (this.decodeEntities = t), + (this.entityDecoder = new c.Wf(e ? c.sr : c.qN, (e, t) => this.emitCodePoint(e, t))); + } + reset() { + (this.state = o.Text), (this.buffer = ""), (this.sectionStart = 0), (this.index = 0), (this.baseState = o.Text), (this.currentSequence = void 0), (this.running = !0), (this.offset = 0); + } + write(e) { + (this.offset += this.buffer.length), (this.buffer = e), this.parse(); + } + end() { + this.running && this.finish(); + } + pause() { + this.running = !1; + } + resume() { + (this.running = !0), this.index < this.buffer.length + this.offset && this.parse(); + } + stateText(e) { + e === s.Lt || (!this.decodeEntities && this.fastForwardTo(s.Lt)) ? (this.index > this.sectionStart && this.cbs.ontext(this.sectionStart, this.index), (this.state = o.BeforeTagName), (this.sectionStart = this.index)) : this.decodeEntities && e === s.Amp && this.startEntity(); + } + stateSpecialStartSequence(e) { + let t = this.sequenceIndex === this.currentSequence.length; + if (t ? d(e) : (32 | e) === this.currentSequence[this.sequenceIndex]) { + if (!t) return void this.sequenceIndex++; + } else this.isSpecial = !1; + (this.sequenceIndex = 0), (this.state = o.InTagName), this.stateInTagName(e); + } + stateInSpecialTag(e) { + if (this.sequenceIndex === this.currentSequence.length) { + if (e === s.Gt || u(e)) { + let t = this.index - this.currentSequence.length; + if (this.sectionStart < t) { + let e = this.index; + (this.index = t), this.cbs.ontext(this.sectionStart, t), (this.index = e); + } + (this.isSpecial = !1), (this.sectionStart = t + 2), this.stateInClosingTagName(e); + return; + } + this.sequenceIndex = 0; + } + (32 | e) === this.currentSequence[this.sequenceIndex] ? (this.sequenceIndex += 1) : 0 === this.sequenceIndex ? (this.currentSequence === h.TitleEnd ? this.decodeEntities && e === s.Amp && this.startEntity() : this.fastForwardTo(s.Lt) && (this.sequenceIndex = 1)) : (this.sequenceIndex = Number(e === s.Lt)); + } + stateCDATASequence(e) { + e === h.Cdata[this.sequenceIndex] ? ++this.sequenceIndex === h.Cdata.length && ((this.state = o.InCommentLike), (this.currentSequence = h.CdataEnd), (this.sequenceIndex = 0), (this.sectionStart = this.index + 1)) : ((this.sequenceIndex = 0), (this.state = o.InDeclaration), this.stateInDeclaration(e)); + } + fastForwardTo(e) { + for (; ++this.index < this.buffer.length + this.offset; ) if (this.buffer.charCodeAt(this.index - this.offset) === e) return !0; + return (this.index = this.buffer.length + this.offset - 1), !1; + } + stateInCommentLike(e) { + e === this.currentSequence[this.sequenceIndex] + ? ++this.sequenceIndex === this.currentSequence.length && (this.currentSequence === h.CdataEnd ? this.cbs.oncdata(this.sectionStart, this.index, 2) : this.cbs.oncomment(this.sectionStart, this.index, 2), (this.sequenceIndex = 0), (this.sectionStart = this.index + 1), (this.state = o.Text)) + : 0 === this.sequenceIndex + ? this.fastForwardTo(this.currentSequence[0]) && (this.sequenceIndex = 1) + : e !== this.currentSequence[this.sequenceIndex - 1] && (this.sequenceIndex = 0); + } + isTagStartChar(e) { + return this.xmlMode ? !d(e) : (e >= s.LowerA && e <= s.LowerZ) || (e >= s.UpperA && e <= s.UpperZ); + } + startSpecial(e, t) { + (this.isSpecial = !0), (this.currentSequence = e), (this.sequenceIndex = t), (this.state = o.SpecialStartSequence); + } + stateBeforeTagName(e) { + if (e === s.ExclamationMark) (this.state = o.BeforeDeclaration), (this.sectionStart = this.index + 1); + else if (e === s.Questionmark) (this.state = o.InProcessingInstruction), (this.sectionStart = this.index + 1); + else if (this.isTagStartChar(e)) { + let t = 32 | e; + (this.sectionStart = this.index), this.xmlMode ? (this.state = o.InTagName) : t === h.ScriptEnd[2] ? (this.state = o.BeforeSpecialS) : t === h.TitleEnd[2] || t === h.XmpEnd[2] ? (this.state = o.BeforeSpecialT) : (this.state = o.InTagName); + } else e === s.Slash ? (this.state = o.BeforeClosingTagName) : ((this.state = o.Text), this.stateText(e)); + } + stateInTagName(e) { + d(e) && (this.cbs.onopentagname(this.sectionStart, this.index), (this.sectionStart = -1), (this.state = o.BeforeAttributeName), this.stateBeforeAttributeName(e)); + } + stateBeforeClosingTagName(e) { + u(e) || (e === s.Gt ? (this.state = o.Text) : ((this.state = this.isTagStartChar(e) ? o.InClosingTagName : o.InSpecialComment), (this.sectionStart = this.index))); + } + stateInClosingTagName(e) { + (e === s.Gt || u(e)) && (this.cbs.onclosetag(this.sectionStart, this.index), (this.sectionStart = -1), (this.state = o.AfterClosingTagName), this.stateAfterClosingTagName(e)); + } + stateAfterClosingTagName(e) { + (e === s.Gt || this.fastForwardTo(s.Gt)) && ((this.state = o.Text), (this.sectionStart = this.index + 1)); + } + stateBeforeAttributeName(e) { + e === s.Gt + ? (this.cbs.onopentagend(this.index), this.isSpecial ? ((this.state = o.InSpecialTag), (this.sequenceIndex = 0)) : (this.state = o.Text), (this.sectionStart = this.index + 1)) + : e === s.Slash + ? (this.state = o.InSelfClosingTag) + : u(e) || ((this.state = o.InAttributeName), (this.sectionStart = this.index)); + } + stateInSelfClosingTag(e) { + e === s.Gt ? (this.cbs.onselfclosingtag(this.index), (this.state = o.Text), (this.sectionStart = this.index + 1), (this.isSpecial = !1)) : u(e) || ((this.state = o.BeforeAttributeName), this.stateBeforeAttributeName(e)); + } + stateInAttributeName(e) { + (e === s.Eq || d(e)) && (this.cbs.onattribname(this.sectionStart, this.index), (this.sectionStart = this.index), (this.state = o.AfterAttributeName), this.stateAfterAttributeName(e)); + } + stateAfterAttributeName(e) { + e === s.Eq + ? (this.state = o.BeforeAttributeValue) + : e === s.Slash || e === s.Gt + ? (this.cbs.onattribend(l.NoValue, this.sectionStart), (this.sectionStart = -1), (this.state = o.BeforeAttributeName), this.stateBeforeAttributeName(e)) + : u(e) || (this.cbs.onattribend(l.NoValue, this.sectionStart), (this.state = o.InAttributeName), (this.sectionStart = this.index)); + } + stateBeforeAttributeValue(e) { + e === s.DoubleQuote + ? ((this.state = o.InAttributeValueDq), (this.sectionStart = this.index + 1)) + : e === s.SingleQuote + ? ((this.state = o.InAttributeValueSq), (this.sectionStart = this.index + 1)) + : u(e) || ((this.sectionStart = this.index), (this.state = o.InAttributeValueNq), this.stateInAttributeValueNoQuotes(e)); + } + handleInAttributeValue(e, t) { + e === t || (!this.decodeEntities && this.fastForwardTo(t)) + ? (this.cbs.onattribdata(this.sectionStart, this.index), (this.sectionStart = -1), this.cbs.onattribend(t === s.DoubleQuote ? l.Double : l.Single, this.index + 1), (this.state = o.BeforeAttributeName)) + : this.decodeEntities && e === s.Amp && this.startEntity(); + } + stateInAttributeValueDoubleQuotes(e) { + this.handleInAttributeValue(e, s.DoubleQuote); + } + stateInAttributeValueSingleQuotes(e) { + this.handleInAttributeValue(e, s.SingleQuote); + } + stateInAttributeValueNoQuotes(e) { + u(e) || e === s.Gt ? (this.cbs.onattribdata(this.sectionStart, this.index), (this.sectionStart = -1), this.cbs.onattribend(l.Unquoted, this.index), (this.state = o.BeforeAttributeName), this.stateBeforeAttributeName(e)) : this.decodeEntities && e === s.Amp && this.startEntity(); + } + stateBeforeDeclaration(e) { + e === s.OpeningSquareBracket ? ((this.state = o.CDATASequence), (this.sequenceIndex = 0)) : (this.state = e === s.Dash ? o.BeforeComment : o.InDeclaration); + } + stateInDeclaration(e) { + (e === s.Gt || this.fastForwardTo(s.Gt)) && (this.cbs.ondeclaration(this.sectionStart, this.index), (this.state = o.Text), (this.sectionStart = this.index + 1)); + } + stateInProcessingInstruction(e) { + (e === s.Gt || this.fastForwardTo(s.Gt)) && (this.cbs.onprocessinginstruction(this.sectionStart, this.index), (this.state = o.Text), (this.sectionStart = this.index + 1)); + } + stateBeforeComment(e) { + e === s.Dash ? ((this.state = o.InCommentLike), (this.currentSequence = h.CommentEnd), (this.sequenceIndex = 2), (this.sectionStart = this.index + 1)) : (this.state = o.InDeclaration); + } + stateInSpecialComment(e) { + (e === s.Gt || this.fastForwardTo(s.Gt)) && (this.cbs.oncomment(this.sectionStart, this.index, 0), (this.state = o.Text), (this.sectionStart = this.index + 1)); + } + stateBeforeSpecialS(e) { + let t = 32 | e; + t === h.ScriptEnd[3] ? this.startSpecial(h.ScriptEnd, 4) : t === h.StyleEnd[3] ? this.startSpecial(h.StyleEnd, 4) : ((this.state = o.InTagName), this.stateInTagName(e)); + } + stateBeforeSpecialT(e) { + switch (32 | e) { + case h.TitleEnd[3]: + this.startSpecial(h.TitleEnd, 4); + break; + case h.TextareaEnd[3]: + this.startSpecial(h.TextareaEnd, 4); + break; + case h.XmpEnd[3]: + this.startSpecial(h.XmpEnd, 4); + break; + default: + (this.state = o.InTagName), this.stateInTagName(e); + } + } + startEntity() { + (this.baseState = this.state), (this.state = o.InEntity), (this.entityStart = this.index), this.entityDecoder.startEntity(this.xmlMode ? c.FJ.Strict : this.baseState === o.Text || this.baseState === o.InSpecialTag ? c.FJ.Legacy : c.FJ.Attribute); + } + stateInEntity() { + let e = this.entityDecoder.write(this.buffer, this.index - this.offset); + e >= 0 ? ((this.state = this.baseState), 0 === e && (this.index = this.entityStart)) : (this.index = this.offset + this.buffer.length - 1); + } + cleanup() { + this.running && + this.sectionStart !== this.index && + (this.state === o.Text || (this.state === o.InSpecialTag && 0 === this.sequenceIndex) + ? (this.cbs.ontext(this.sectionStart, this.index), (this.sectionStart = this.index)) + : (this.state === o.InAttributeValueDq || this.state === o.InAttributeValueSq || this.state === o.InAttributeValueNq) && (this.cbs.onattribdata(this.sectionStart, this.index), (this.sectionStart = this.index))); + } + shouldContinue() { + return this.index < this.buffer.length + this.offset && this.running; + } + parse() { + for (; this.shouldContinue(); ) { + let e = this.buffer.charCodeAt(this.index - this.offset); + switch (this.state) { + case o.Text: + this.stateText(e); + break; + case o.SpecialStartSequence: + this.stateSpecialStartSequence(e); + break; + case o.InSpecialTag: + this.stateInSpecialTag(e); + break; + case o.CDATASequence: + this.stateCDATASequence(e); + break; + case o.InAttributeValueDq: + this.stateInAttributeValueDoubleQuotes(e); + break; + case o.InAttributeName: + this.stateInAttributeName(e); + break; + case o.InCommentLike: + this.stateInCommentLike(e); + break; + case o.InSpecialComment: + this.stateInSpecialComment(e); + break; + case o.BeforeAttributeName: + this.stateBeforeAttributeName(e); + break; + case o.InTagName: + this.stateInTagName(e); + break; + case o.InClosingTagName: + this.stateInClosingTagName(e); + break; + case o.BeforeTagName: + this.stateBeforeTagName(e); + break; + case o.AfterAttributeName: + this.stateAfterAttributeName(e); + break; + case o.InAttributeValueSq: + this.stateInAttributeValueSingleQuotes(e); + break; + case o.BeforeAttributeValue: + this.stateBeforeAttributeValue(e); + break; + case o.BeforeClosingTagName: + this.stateBeforeClosingTagName(e); + break; + case o.AfterClosingTagName: + this.stateAfterClosingTagName(e); + break; + case o.BeforeSpecialS: + this.stateBeforeSpecialS(e); + break; + case o.BeforeSpecialT: + this.stateBeforeSpecialT(e); + break; + case o.InAttributeValueNq: + this.stateInAttributeValueNoQuotes(e); + break; + case o.InSelfClosingTag: + this.stateInSelfClosingTag(e); + break; + case o.InDeclaration: + this.stateInDeclaration(e); + break; + case o.BeforeDeclaration: + this.stateBeforeDeclaration(e); + break; + case o.BeforeComment: + this.stateBeforeComment(e); + break; + case o.InProcessingInstruction: + this.stateInProcessingInstruction(e); + break; + case o.InEntity: + this.stateInEntity(); + } + this.index++; + } + this.cleanup(); + } + finish() { + this.state === o.InEntity && (this.entityDecoder.end(), (this.state = this.baseState)), this.handleTrailingData(), this.cbs.onend(); + } + handleTrailingData() { + let e = this.buffer.length + this.offset; + this.sectionStart >= e || + (this.state === o.InCommentLike + ? this.currentSequence === h.CdataEnd + ? this.cbs.oncdata(this.sectionStart, e, 0) + : this.cbs.oncomment(this.sectionStart, e, 0) + : this.state === o.InTagName || + this.state === o.BeforeAttributeName || + this.state === o.BeforeAttributeValue || + this.state === o.AfterAttributeName || + this.state === o.InAttributeName || + this.state === o.InAttributeValueSq || + this.state === o.InAttributeValueDq || + this.state === o.InAttributeValueNq || + this.state === o.InClosingTagName || + this.cbs.ontext(this.sectionStart, e)); + } + emitCodePoint(e, t) { + this.baseState !== o.Text && this.baseState !== o.InSpecialTag + ? (this.sectionStart < this.entityStart && this.cbs.onattribdata(this.sectionStart, this.entityStart), (this.sectionStart = this.entityStart + t), (this.index = this.sectionStart - 1), this.cbs.onattribentity(e)) + : (this.sectionStart < this.entityStart && this.cbs.ontext(this.sectionStart, this.entityStart), (this.sectionStart = this.entityStart + t), (this.index = this.sectionStart - 1), this.cbs.ontextentity(e, this.sectionStart)); + } + } + }, + 3808: function (e, t, r) { + r.d(t, { RJ: () => i, iX: () => n.i }); + var n = r(4645); + r(8866), r(5645); + var i = r(2743); + r(4993); + }, + 6570: function (e, t, r) { + let n, i, a, s; + r.d(t, { P2: () => f }); + let o = (e, t) => t.some(t => e instanceof t), + l = new WeakMap(), + c = new WeakMap(), + u = new WeakMap(), + d = { + get(e, t, r) { + if (e instanceof IDBTransaction) { + if ("done" === t) return l.get(e); + if ("store" === t) return r.objectStoreNames[1] ? void 0 : r.objectStore(r.objectStoreNames[0]); + } + return h(e[t]); + }, + set: (e, t, r) => ((e[t] = r), !0), + has: (e, t) => (e instanceof IDBTransaction && ("done" === t || "store" === t)) || t in e, + }; + function h(e) { + if (e instanceof IDBRequest) { + let t; + return ( + (t = new Promise((t, r) => { + let n = () => { + e.removeEventListener("success", i), e.removeEventListener("error", a); + }, + i = () => { + t(h(e.result)), n(); + }, + a = () => { + r(e.error), n(); + }; + e.addEventListener("success", i), e.addEventListener("error", a); + })), + u.set(t, e), + t + ); + } + if (c.has(e)) return c.get(e); + let t = (function (e) { + if ("function" == typeof e) + return (i || (i = [IDBCursor.prototype.advance, IDBCursor.prototype.continue, IDBCursor.prototype.continuePrimaryKey])).includes(e) + ? function (...t) { + return e.apply(p(this), t), h(this.request); + } + : function (...t) { + return h(e.apply(p(this), t)); + }; + return (e instanceof IDBTransaction && + (function (e) { + if (l.has(e)) return; + let t = new Promise((t, r) => { + let n = () => { + e.removeEventListener("complete", i), e.removeEventListener("error", a), e.removeEventListener("abort", a); + }, + i = () => { + t(), n(); + }, + a = () => { + r(e.error || new DOMException("AbortError", "AbortError")), n(); + }; + e.addEventListener("complete", i), e.addEventListener("error", a), e.addEventListener("abort", a); + }); + l.set(e, t); + })(e), + o(e, n || (n = [IDBDatabase, IDBObjectStore, IDBIndex, IDBCursor, IDBTransaction]))) + ? new Proxy(e, d) + : e; + })(e); + return t !== e && (c.set(e, t), u.set(t, e)), t; + } + let p = e => u.get(e); + function f(e, t, { blocked: r, upgrade: n, blocking: i, terminated: a } = {}) { + let s = indexedDB.open(e, t), + o = h(s); + return ( + n && + s.addEventListener("upgradeneeded", e => { + n(h(s.result), e.oldVersion, e.newVersion, h(s.transaction), e); + }), + r && s.addEventListener("blocked", e => r(e.oldVersion, e.newVersion, e)), + o + .then(e => { + a && e.addEventListener("close", () => a()), i && e.addEventListener("versionchange", e => i(e.oldVersion, e.newVersion, e)); + }) + .catch(() => {}), + o + ); + } + let g = ["get", "getKey", "getAll", "getAllKeys", "count"], + m = ["put", "add", "delete", "clear"], + y = new Map(); + function b(e, t) { + if (!(e instanceof IDBDatabase && !(t in e) && "string" == typeof t)) return; + if (y.get(t)) return y.get(t); + let r = t.replace(/FromIndex$/, ""), + n = t !== r, + i = m.includes(r); + if (!(r in (n ? IDBIndex : IDBObjectStore).prototype) || !(i || g.includes(r))) return; + let a = async function (e, ...t) { + let a = this.transaction(e, i ? "readwrite" : "readonly"), + s = a.store; + return n && (s = s.index(t.shift())), (await Promise.all([s[r](...t), i && a.done]))[0]; + }; + return y.set(t, a), a; + } + d = { ...(a = d), get: (e, t, r) => b(e, t) || a.get(e, t, r), has: (e, t) => !!b(e, t) || a.has(e, t) }; + let w = ["continue", "continuePrimaryKey", "advance"], + S = {}, + v = new WeakMap(), + x = new WeakMap(), + E = { + get(e, t) { + if (!w.includes(t)) return e[t]; + let r = S[t]; + return ( + r || + (r = S[t] = + function (...e) { + v.set(this, x.get(this)[t](...e)); + }), + r + ); + }, + }; + async function* T(...e) { + let t = this; + if ((t instanceof IDBCursor || (t = await t.openCursor(...e)), !t)) return; + let r = new Proxy(t, E); + for (x.set(r, t), u.set(r, p(t)); t; ) yield r, (t = await (v.get(r) || t.continue())), v.delete(r); + } + function k(e, t) { + return (t === Symbol.asyncIterator && o(e, [IDBIndex, IDBObjectStore, IDBCursor])) || ("iterate" === t && o(e, [IDBIndex, IDBObjectStore])); + } + d = { ...(s = d), get: (e, t, r) => (k(e, t) ? T : s.get(e, t, r)), has: (e, t) => k(e, t) || s.has(e, t) }; + }, + 1652: function (e, t, r) { + r.d(t, { N: () => n }); + function n() { + return "10000000000".replace(/[018]/g, e => (e ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (e / 4)))).toString(16)); + } + }, + 3907: function (e, t, r) { + let n; + r.d(t, { LW: () => b, QR: () => x }); + var i = r(1652); + function a(e, t) { + try { + return e.apply(this, t); + } catch (r) { + let e, + t = ((e = n.__externref_table_alloc()), n.__wbindgen_export_2.set(e, r), e); + n.__wbindgen_exn_store(t); + } + } + let s = + "undefined" != typeof TextDecoder + ? new TextDecoder("utf-8", { ignoreBOM: !0, fatal: !0 }) + : { + decode: () => { + throw Error("TextDecoder not available"); + }, + }; + "undefined" != typeof TextDecoder && s.decode(); + let o = null; + function l() { + return (null === o || 0 === o.byteLength) && (o = new Uint8Array(n.memory.buffer)), o; + } + function c(e, t) { + return (e >>>= 0), s.decode(l().subarray(e, e + t)); + } + let u = 0, + d = + "undefined" != typeof TextEncoder + ? new TextEncoder("utf-8") + : { + encode: () => { + throw Error("TextEncoder not available"); + }, + }, + h = + "function" == typeof d.encodeInto + ? function (e, t) { + return d.encodeInto(e, t); + } + : function (e, t) { + let r = d.encode(e); + return t.set(r), { read: e.length, written: r.length }; + }; + function p(e, t, r) { + if (void 0 === r) { + let r = d.encode(e), + n = t(r.length, 1) >>> 0; + return ( + l() + .subarray(n, n + r.length) + .set(r), + (u = r.length), + n + ); + } + let n = e.length, + i = t(n, 1) >>> 0, + a = l(), + s = 0; + for (; s < n; s++) { + let t = e.charCodeAt(s); + if (t > 127) break; + a[i + s] = t; + } + if (s !== n) { + 0 !== s && (e = e.slice(s)), (i = r(i, n, (n = s + 3 * e.length), 1) >>> 0); + let t = h(e, l().subarray(i + s, i + n)); + (s += t.written), (i = r(i, n, s, 1) >>> 0); + } + return (u = s), i; + } + let f = null; + function g() { + return (null === f || !0 === f.buffer.detached || (void 0 === f.buffer.detached && f.buffer !== n.memory.buffer)) && (f = new DataView(n.memory.buffer)), f; + } + function m(e) { + let t = n.__wbindgen_export_2.get(e); + return n.__externref_table_dealloc(e), t; + } + let y = "undefined" == typeof FinalizationRegistry ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(e => n.__wbg_rewriter_free(e >>> 0, 1)); + class b { + __destroy_into_raw() { + let e = this.__wbg_ptr; + return (this.__wbg_ptr = 0), y.unregister(this), e; + } + free() { + let e = this.__destroy_into_raw(); + n.__wbg_rewriter_free(e, 0); + } + rewrite_js(e, t, r, i) { + let a = p(e, n.__wbindgen_malloc, n.__wbindgen_realloc), + s = u, + o = p(t, n.__wbindgen_malloc, n.__wbindgen_realloc), + l = u, + c = p(r, n.__wbindgen_malloc, n.__wbindgen_realloc), + d = u, + h = n.rewriter_rewrite_js(this.__wbg_ptr, a, s, o, l, c, d, i); + if (h[2]) throw m(h[1]); + return m(h[0]); + } + rewrite_js_bytes(e, t, r, i) { + let a, + s = ((a = (0, n.__wbindgen_malloc)(+e.length, 1) >>> 0), l().set(e, a / 1), (u = e.length), a), + o = u, + c = p(t, n.__wbindgen_malloc, n.__wbindgen_realloc), + d = u, + h = p(r, n.__wbindgen_malloc, n.__wbindgen_realloc), + f = u, + g = n.rewriter_rewrite_js_bytes(this.__wbg_ptr, s, o, c, d, h, f, i); + if (g[2]) throw m(g[1]); + return m(g[0]); + } + constructor(e) { + const t = n.rewriter_new(e); + if (t[2]) throw m(t[1]); + return (this.__wbg_ptr = t[0] >>> 0), y.register(this, this.__wbg_ptr, this), this; + } + } + async function w(e, t) { + if ("function" == typeof Response && e instanceof Response) { + if ("function" == typeof WebAssembly.instantiateStreaming) + try { + return await WebAssembly.instantiateStreaming(e, t); + } catch (t) { + if ("application/wasm" != e.headers.get("Content-Type")) console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", t); + else throw t; + } + let r = await e.arrayBuffer(); + return await WebAssembly.instantiate(r, t); + } + { + let r = await WebAssembly.instantiate(e, t); + return r instanceof WebAssembly.Instance ? { instance: r, module: e } : r; + } + } + function S() { + let e = {}; + return ( + (e.wbg = {}), + (e.wbg.__wbg_buffer_609cc3eee51ed158 = function (e) { + return e.buffer; + }), + (e.wbg.__wbg_call_7cccdd69e0791ae2 = function () { + return a(function (e, t, r) { + return e.call(t, r); + }, arguments); + }), + (e.wbg.__wbg_call_833bed5770ea2041 = function () { + return a(function (e, t, r, n) { + return e.call(t, r, n); + }, arguments); + }), + (e.wbg.__wbg_get_67b2ba62fc30de12 = function () { + return a(function (e, t) { + return Reflect.get(e, t); + }, arguments); + }), + (e.wbg.__wbg_new_405e22f390576ce2 = function () { + return {}; + }), + (e.wbg.__wbg_new_78feb108b6472713 = function () { + return []; + }), + (e.wbg.__wbg_new_9ffbe0a71eff35e3 = function () { + return a(function (e, t) { + return new URL(c(e, t)); + }, arguments); + }), + (e.wbg.__wbg_new_a12002a7f91c75be = function (e) { + return new Uint8Array(e); + }), + (e.wbg.__wbg_newwithbase_161c299e7a34e2eb = function () { + return a(function (e, t, r, n) { + return new URL(c(e, t), c(r, n)); + }, arguments); + }), + (e.wbg.__wbg_newwithbyteoffsetandlength_d97e637ebe145a9a = function (e, t, r) { + return new Uint8Array(e, t >>> 0, r >>> 0); + }), + (e.wbg.__wbg_scramtag_3a255d78b157986d = function (e) { + let t = p((0, i.N)(), n.__wbindgen_malloc, n.__wbindgen_realloc), + r = u; + g().setInt32(e + 4, r, !0), g().setInt32(e + 0, t, !0); + }), + (e.wbg.__wbg_set_bb8cecf6a62b9f46 = function () { + return a(function (e, t, r) { + return Reflect.set(e, t, r); + }, arguments); + }), + (e.wbg.__wbg_toString_5285597960676b7b = function (e) { + return e.toString(); + }), + (e.wbg.__wbg_toString_c813bbd34d063839 = function (e) { + return e.toString(); + }), + (e.wbg.__wbindgen_boolean_get = function (e) { + return "boolean" == typeof e ? +!!e : 2; + }), + (e.wbg.__wbindgen_error_new = function (e, t) { + return Error(c(e, t)); + }), + (e.wbg.__wbindgen_init_externref_table = function () { + let e = n.__wbindgen_export_2, + t = e.grow(4); + e.set(0, void 0), e.set(t + 0, void 0), e.set(t + 1, null), e.set(t + 2, !0), e.set(t + 3, !1); + }), + (e.wbg.__wbindgen_is_function = function (e) { + return "function" == typeof e; + }), + (e.wbg.__wbindgen_memory = function () { + return n.memory; + }), + (e.wbg.__wbindgen_string_get = function (e, t) { + let r = "string" == typeof t ? t : void 0; + var i = null == r ? 0 : p(r, n.__wbindgen_malloc, n.__wbindgen_realloc), + a = u; + g().setInt32(e + 4, a, !0), g().setInt32(e + 0, i, !0); + }), + (e.wbg.__wbindgen_string_new = function (e, t) { + return c(e, t); + }), + (e.wbg.__wbindgen_throw = function (e, t) { + throw Error(c(e, t)); + }), + e + ); + } + function v(e, t) { + return (n = e.exports), (E.__wbindgen_wasm_module = t), (f = null), (o = null), n.__wbindgen_start(), n; + } + function x(e) { + if (void 0 !== n) return n; + void 0 !== e && (Object.getPrototypeOf(e) === Object.prototype ? ({ module: e } = e) : console.warn("using deprecated parameters for `initSync()`; pass a single object instead")); + let t = S(); + return e instanceof WebAssembly.Module || (e = new WebAssembly.Module(e)), v(new WebAssembly.Instance(e, t), e); + } + async function E(e) { + if (void 0 !== n) return n; + void 0 !== e && (Object.getPrototypeOf(e) === Object.prototype ? ({ module_or_path: e } = e) : console.warn("using deprecated parameters for the initialization function; pass a single object instead")), void 0 === e && (e = new URL("wasm_bg.wasm", "")); + let t = S(); + ("string" == typeof e || ("function" == typeof Request && e instanceof Request) || ("function" == typeof URL && e instanceof URL)) && (e = fetch(e)); + let { instance: r, module: i } = await w(await e, t); + return v(r, i); + } + }, + }, + t = {}; + function r(n) { + var i = t[n]; + if (void 0 !== i) return i.exports; + var a = (t[n] = { exports: {} }); + return e[n](a, a.exports, r), a.exports; + } + (r.n = e => { + var t = e && e.__esModule ? () => e.default : () => e; + return r.d(t, { a: t }), t; + }), + (r.d = (e, t) => { + for (var n in t) r.o(t, n) && !r.o(e, n) && Object.defineProperty(e, n, { enumerable: !0, get: t[n] }); + }), + (r.o = (e, t) => Object.prototype.hasOwnProperty.call(e, t)), + (r.r = e => { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 }); + }), + (globalThis.$scramjetRequire = function (e) { + return r(409)(e); + }), + (globalThis.$scramjetLoadController = function () { + return r(9052); + }), + (globalThis.$scramjetLoadClient = function () { + return r(1323); + }), + (globalThis.$scramjetLoadWorker = function () { + return r(7510); + }), + (globalThis.$scramjetVersion = { build: "57ba89e", version: "1.1.0" }), + "document" in globalThis && document?.currentScript && document.currentScript.remove(); +})(); +//# sourceMappingURL=scramjet.all.js.map diff --git a/static/assets/scramjet/scramjet.sync.js b/static/assets/scramjet/scramjet.sync.js index 451d64340f..c36f0e2d83 100644 --- a/static/assets/scramjet/scramjet.sync.js +++ b/static/assets/scramjet/scramjet.sync.js @@ -1,2 +1,39 @@ -addEventListener("message",({data:{sab:e,args:[t,n,s,r,o],body:a,headers:g}})=>{let i=new DataView(e),l=new Uint8Array(e),d=new XMLHttpRequest;if(d.responseType="arraybuffer",d.open(t,n,!0,r,o),g)for(let[e,t]of Object.entries(g))d.setRequestHeader(e,t);d.send(a),d.onload=()=>{let t=1;i.setUint16(t,d.status),t+=2;let n=d.getAllResponseHeaders();i.setUint32(t,n.length),t+=4,e.byteLength{console.error("xhr failed"),i.setUint8(0,1)}}); -//# sourceMappingURL=scramjet.sync.js.map \ No newline at end of file +addEventListener( + "message", + ({ + data: { + sab: e, + args: [t, n, s, r, o], + body: a, + headers: g, + }, + }) => { + let i = new DataView(e), + l = new Uint8Array(e), + d = new XMLHttpRequest(); + if (((d.responseType = "arraybuffer"), d.open(t, n, !0, r, o), g)) for (let [e, t] of Object.entries(g)) d.setRequestHeader(e, t); + d.send(a), + (d.onload = () => { + let t = 1; + i.setUint16(t, d.status), (t += 2); + let n = d.getAllResponseHeaders(); + i.setUint32(t, n.length), + (t += 4), + e.byteLength < t + n.length && e.grow(t + n.length), + l.set(new TextEncoder().encode(n), t), + (t += n.length), + i.setUint32(t, d.response.byteLength), + (t += 4), + e.byteLength < t + d.response.byteLength && e.grow(t + d.response.byteLength), + l.set(new Uint8Array(d.response), t), + i.setUint8(0, 1); + }), + (d.ontimeout = + d.onerror = + d.onabort = + () => { + console.error("xhr failed"), i.setUint8(0, 1); + }); + }, +); +//# sourceMappingURL=scramjet.sync.js.map From a2cc044cb4b390c9273edeb1e0b72757f45acbef Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sat, 5 Sep 2026 19:39:35 -0400 Subject: [PATCH 080/115] fix(tabs): intercept _top links (#1224) --- static/assets/js/tabs.js | 54 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index 843255c559..3798102ed7 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -259,6 +259,44 @@ document.addEventListener("DOMContentLoaded", () => { for (const frame of iframeContainer.querySelectorAll("iframe")) frame.classList.remove("active"); } + function openInNewTab(destination) { + const proxyUrl = + destination.startsWith("/") || destination.startsWith(window.location.origin) + ? destination + : window.__encodeProxyUrl + ? window.__encodeProxyUrl(destination) + : `/uv/${__uv$config.encodeUrl(destination)}`; + sessionStorage.setItem("URL", proxyUrl); + createNewTab(); + } + + // The sandbox has no allow-top-navigation, so "_top" from inside a tab is dead on arrival. + // Grab it here and open the destination in a new tab; leave every other target alone. + function handleTopNavigation(event) { + const isSubmit = event.type === "submit"; + const source = isSubmit ? event.target : event.target?.closest?.("a[target], area[target]"); + if (source?.target?.toLowerCase() !== "_top") return; + + let destination; + if (isSubmit) { + // Can't fold a POST body into a URL, so just let POST forms submit in place. + // (A scripted form.submit() fires no submit event — the shim in createNewTab handles it.) + if ((source.method || "get").toLowerCase() !== "get") { + source.target = "_self"; + return; + } + const action = new URL(source.action, source.ownerDocument.baseURI); + action.search = new URLSearchParams(new FormData(source)).toString(); + destination = action.href; + } else { + destination = source.href; + } + if (!destination) return; + + event.preventDefault(); + openInNewTab(destination); + } + function createNewTab() { const newTab = document.createElement("li"); const tabTitle = document.createElement("span"); @@ -299,6 +337,22 @@ document.addEventListener("DOMContentLoaded", () => { createNewTab(); return null; }; + + // Some logins frame-bust by scripting form.submit() to _top. That fires no submit + // event for handleTopNavigation to catch, so retarget it here and let the POST run + // in this tab. + const formProto = newIframe.contentWindow.HTMLFormElement.prototype; + for (const method of ["submit", "requestSubmit"]) { + const original = formProto[method]; + formProto[method] = function (...args) { + if (this.target?.toLowerCase() === "_top") this.target = "_self"; + return original.apply(this, args); + }; + } + + const doc = newIframe.contentDocument; + doc.addEventListener("click", handleTopNavigation, true); + doc.addEventListener("submit", handleTopNavigation, true); } catch {} updateAddressBar(); }); From 5f60c201b165a405b7b0e85675d11bafd4eb1cdd Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sat, 5 Sep 2026 19:44:27 -0400 Subject: [PATCH 081/115] chore: prevent Outlook from forcing Dynamic and remove Character AI --- static/assets/json/apps.json | 10 +--------- static/assets/json/apps.min.json | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/static/assets/json/apps.json b/static/assets/json/apps.json index 0eee58815e..da16be6c6f 100644 --- a/static/assets/json/apps.json +++ b/static/assets/json/apps.json @@ -49,12 +49,6 @@ "image": "/assets/media/icons/temu.webp", "categories": ["all"] }, - { - "name": "Character AI", - "link": "https://now.gg/iframe/snippet?app_pkg=ai.character.app&partner=interstellar", - "image": "/assets/media/icons/characterai.webp", - "categories": ["all", "emu", "android"] - }, { "name": "Aptoide", "link": "https://now.gg/iframe/snippet?app_pkg=com.aptoide.partners.nowgg.store&partner=interstellar", @@ -358,9 +352,7 @@ "name": "Outlook", "link": "https://outlook.live.com/", "image": "/assets/media/icons/outlook.webp", - "categories": ["all", "mail"], - "dy": "true", - "partial": "true" + "categories": ["all", "mail"] }, { "name": "Snapchat", diff --git a/static/assets/json/apps.min.json b/static/assets/json/apps.min.json index 3decc7a574..123804be11 100644 --- a/static/assets/json/apps.min.json +++ b/static/assets/json/apps.min.json @@ -1 +1 @@ -[{"name":"Request An App","link":"https://forms.gle/vwdHN3iPz5cLaHaMA","image":"/assets/media/icons/request.webp","categories":["all"]},{"name":"Create Custom App","image":"/assets/media/icons/custom.webp","categories":["all"],"custom":"true"},{"name":"Amazon","link":"https://amazon.com/","image":"/assets/media/icons/amazon.webp","categories":["all"]},{"name":"Steam","link":"https://store.steampowered.com/","image":"/assets/media/icons/steam.webp","categories":["all"],"say":"Steam can't actually be added because it's an app, not a website. This only lets you browse the Steam website, you can't actually play any games unless you use Geforce Now.","partial":true},{"name":"BuzzFeed Quizzes","link":"https://www.buzzfeed.com/quizzes","image":"/assets/media/icons/buzzfeed.webp","categories":["all"]},{"name":"Guilded","link":"https://www.guilded.gg/","image":"/assets/media/icons/guilded.webp","categories":["all","social"]},{"name":"Android","link":"https://now.gg/iframe/snippet?app_pkg=com.uncube.launcher3&partner=interstellar","image":"/assets/media/icons/android.webp","categories":["all","emu","android"]},{"name":"Temu","link":"https://www.temu.com/","image":"/assets/media/icons/temu.webp","categories":["all"]},{"name":"Character AI","link":"https://now.gg/iframe/snippet?app_pkg=ai.character.app&partner=interstellar","image":"/assets/media/icons/characterai.webp","categories":["all","emu","android"]},{"name":"Aptoide","link":"https://now.gg/iframe/snippet?app_pkg=com.aptoide.partners.nowgg.store&partner=interstellar","image":"/assets/media/icons/aptoide.webp","categories":["all","emu","android"]},{"name":"Scratch","link":"https://scratch.mit.edu","image":"/assets/media/icons/scratch.webp","categories":["all","social","game"]},{"name":"Chess.com","link":"https://www.chess.com/","image":"/assets/media/icons/chess.webp","categories":["all","game"]},{"name":"Cool Math Games","link":"https://www.coolmathgames.com/","image":"/assets/media/icons/coolmath.webp","categories":["all","game"]},{"name":"Discord","links":[{"name":"Discord","url":"https://discord.com"},{"name":"Discord Canary","url":"https://canary.discord.com"},{"name":"Discord PTB","url":"https://ptb.discord.com"}],"image":"/assets/media/icons/dc.jpg","categories":["all","social"]},{"name":"ESPN","link":"https://www.espn.com/watch/","image":"/assets/media/icons/espn.webp","categories":["all"]},{"name":"Fifa Rosters","link":"https://fifarosters.com/","image":"/assets/media/icons/fifa.webp","categories":["all"]},{"name":"Firefox Web Browser","link":"https://replit.com/@cooleddie001/Firefox-Legacy?v=1","image":"/assets/media/icons/firefox.webp","categories":["all"]},{"name":"Flix HQ","link":"https://flixhq.to","image":"/assets/media/icons/flixhq.webp","categories":["all","media"]},{"name":"Geforce NOW","link":"https://play.geforcenow.com","image":"/assets/media/icons/geforce-now.webp","categories":["all","stream","cloud"]},{"name":"Github","link":"https://github.com","image":"/assets/media/icons/github.webp","categories":["all"]},{"name":"Google","link":"https://google.com","image":"/assets/media/icons/google.webp","categories":["all"]},{"name":"HBO MAX","link":"https://www.hbomax.com/","image":"/assets/media/icons/hbo.webp","categories":["all","stream"]},{"name":"Messenger","link":"https://messenger.com/","image":"/assets/media/icons/messenger.webp","categories":["all","social","message"]},{"name":"MLB","link":"https://mlb.com","image":"/assets/media/icons/mlb.webp","categories":["all"]},{"name":"NFL","link":"https://nfl.com","image":"/assets/media/icons/nfl.webp","categories":["all"]},{"name":"NBA","link":"https://nba.com","image":"assets/media/icons/nba.webp","categories":["all"]},{"name":"Paramount Plus","link":"https://paramountplus.com","image":"/assets/media/icons/paramount.webp","categories":["all","stream"]},{"name":"Pinterest","link":"https://pinterest.com","image":"/assets/media/icons/pinterest.webp","categories":["all"]},{"name":"Pixlr","link":"https://pixlr.com/","image":"/assets/media/icons/pix.webp","categories":["all"]},{"name":"Poki","link":"https://poki.com","image":"/assets/media/icons/poki.webp","categories":["all","game"]},{"name":"Premier League","link":"https://premierleague.com","image":"/assets/media/icons/pl.webp","categories":["all"]},{"name":"Soundcloud","link":"https://soundcloud.com","image":"/assets/media/icons/soundcloud.webp","categories":["all"]},{"name":"Spotify","image":"/assets/media/icons/spotify.webp","categories":["all"],"error":true},{"name":"Telegram","link":"https://web.telegram.org/","image":"/assets/media/icons/telegram.webp","categories":["all","social"]},{"name":"Tiktok","link":"https://tiktok.com","image":"/assets/media/icons/tiktok.webp","categories":["all","social"]},{"name":"Free Media Heck Yeah","link":"https://fmhy.pages.dev","image":"/assets/media/icons/fmhy.webp","categories":["all","media"]},{"name":"Canva","link":"https://canva.com","image":"/assets/media/icons/canva.webp","categories":["all"]},{"name":"Wikipedia","link":"https://en.wikipedia.org","image":"/assets/media/icons/wiki.webp","categories":["all"]},{"name":"GOAL","link":"https://goal.com","image":"/assets/media/icons/goal.webp","categories":["all"]},{"name":"Trello","link":"https://trello.com","image":"/assets/media/icons/trello.webp","categories":["all"]},{"name":"Gidd.io Games","link":"https://gidd.io","image":"/assets/media/icons/gidd.webp","categories":["all"]},{"name":"Tumblr","link":"https://tumblr.com/","image":"/assets/media/icons/tumblr.webp","categories":["all","social"]},{"name":"Twitch","link":"https://twitch.tv","image":"/assets/media/icons/twitch.webp","categories":["all","stream"]},{"name":"Twitter","link":"https://twitter.com","image":"/assets/media/icons/twitter.webp","categories":["all","social"]},{"name":"VS Code","link":"https://vscode.dev","image":"/assets/media/icons/vscode.webp","categories":["all","tool"]},{"name":"Y8 Games","link":"https://y8.com/","image":"/assets/media/icons/y8.webp","categories":["all","game"]},{"name":"YouTube","link":"https://youtube.com","image":"/assets/media/icons/youtube.webp","categories":["all","social","stream"],"proxy":"sj"},{"name":"YouTube Alternative (Invidious)","link":"https://vid.puffyan.us/","image":"/assets/media/icons/youtube.webp","categories":["all","social","stream"]},{"name":"Whatsapp","image":"/assets/media/icons/whatsapp.webp","categories":["all","message","social"],"error":true},{"name":"Wattpad","link":"https://www.wattpad.com/","image":"/assets/media/icons/wattpad.webp","categories":["all","social"]},{"name":"Discord - Login","links":[{"name":"Discord","url":"https://discord.com/login"},{"name":"Discord Canary","url":"https://canary.discord.com/login"},{"name":"Discord PTB","url":"https://ptb.discord.com/login"}],"image":"/assets/media/icons/dc.jpg","categories":["all","social"],"blank":"true"},{"name":"HD Today","link":"https://hdtoday.tv","image":"/assets/media/icons/hd.webp","categories":["all","stream","media"]},{"name":"Now.GG","link":"https://now.gg","image":"/assets/media/icons/now-gg.webp","categories":["all","emu","android"]},{"name":"Now.GG (NowGG.me) [Working]","link":"https://nowgg.me","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Vercel","link":"https://vercel.com","image":"/assets/media/icons/vercel.webp","categories":["all","tool"]},{"name":"Amazon Luna","link":"https://luna.amazon.com/","image":"/assets/media/icons/amazon-luna.webp","categories":["all","game","cloud"],"blank":"true"},{"name":"Google Gemini","link":"https://gemini.google.com","image":"/assets/media/icons/gemini.webp","categories":["all","ai"]},{"name":"Google Mail (Gmail)","link":"https://mail.google.com/","image":"/assets/media/icons/gmail.webp","categories":["all","mail"],"blank":"true","partial":"true"},{"name":"Outlook","link":"https://outlook.live.com/","image":"/assets/media/icons/outlook.webp","categories":["all","mail"],"dy":"true","partial":"true"},{"name":"Snapchat","image":"/assets/media/icons/snap.webp","categories":["all","social","message"],"error":"true"},{"name":"W3Schools","link":"https://www.w3schools.com","image":"/assets/media/icons/W3Schools.webp","categories":["all"]},{"name":"Newgrounds","link":"https://www.newgrounds.com","image":"/assets/media/icons/newgrounds.webp","categories":["all","social","game"]},{"name":"Instagram","image":"/assets/media/icons/insta.webp","categories":["all","social","message"],"error":"true"},{"name":"Proton Mail","image":"/assets/media/icons/proton.webp","categories":["all"],"error":"true"},{"name":"SpaceHey","link":"https://www.spacehey.com","image":"/assets/media/icons/spacehey.png","categories":["all","social"]},{"name":"FMovies.to","link":"https://fmovies24.to/","image":"/assets/media/icons/FM.png","categories":["all","media"]},{"name":"EMovies.si","link":"https://emovies.si","categories":["all","media"]},{"name":"Movie Web","link":"https://movie-web-me.vercel.app/","image":"/assets/media/icons/MW.png","say":"This is not an official domain for Movie Web","categories":["all","media"]},{"name":"Sudo-Flix.Lol (Movie Web Clone)","link":"https://sudo-flix.lol/","image":"/assets/media/icons/MW.png","say":"This is not an official domain for Movie Web","categories":["all","media"]},{"name":"GBA Games","link":"https://gba.js.org/","image":"/assets/media/icons/gba.png","categories":["all","emu"]},{"name":"GPTZero.me","link":"https://gptzero.me/","image":"/assets/media/icons/gz.webp","categories":["all","ad"]},{"name":"ZeroGPT.com","link":"https://www.zerogpt.com/","image":"/assets/media/icons/zg.webp","categories":["all","ad"]},{"name":"ChatGPT","link":"https://chat.openai.com","image":"/assets/media/icons/gpt.jpg","categories":["all","ai"],"error":"true","say":"You must have a ChatGPT account to use the site, also the site may have some issues if you don't minimize tabs while using it."},{"name":"CopyLeaks.com","link":"https://copyleaks.com/ai-content-detector","image":"/assets/media/icons/cl.jpg","categories":["all","ad"]},{"name":"Writer.com","link":"https://writer.com/ai-content-detector/","image":"/assets/media/icons/wr.png","categories":["all","ad"]},{"name":"Quillbot.com AI Detector","link":"https://quillbot.com/ai-content-detector","image":"/assets/media/icons/qb.jpg","categories":["all","ad"]},{"name":"Kome.ai YouTube Transcript","link":"https://kome.ai/tools/youtube-transcript-generator","image":"/assets/media/icons/km.webp","categories":["all","ts"]},{"name":"NoteGPT.io YouTube Transcript","link":"https://notegpt.io/youtube-transcript-generator","image":"/assets/media/icons/ng.jpg","categories":["all","ts"]},{"name":"Grammarly Plagiarism Checker","link":"https://www.grammarly.com/plagiarism-checker","image":"/assets/media/icons/gm.png","categories":["all","pc"]},{"name":"Plagiarism Detector","link":"https://plagiarismdetector.net/","image":"/assets/media/icons/pdn.png","categories":["all","pc"]},{"name":"Blooket Cheats","link":"https://github.com/005konz/Blooket-Cheats","image":"/assets/media/icons/bl.webp","categories":["all","bl","cs"]},{"name":"Edpuzzle Cheats","link":"https://github.com/ading2210/edpuzzle-answers","image":"/assets/media/icons/ep.png","categories":["all","ep","cs"]},{"name":"DeepAI.org","link":"https://deepai.org/","image":"/assets/media/icons/da.webp","categories":["all","ai"]},{"name":"FreedomGPT","link":"https://chat.freedomgpt.com/","categories":["all","ai"]},{"name":"TalkAI.info","link":"https://talkai.info/chat/","image":"/assets/media/icons/ta.webp","categories":["all","ai"]}] \ No newline at end of file +[{"name":"Request An App","link":"https://forms.gle/vwdHN3iPz5cLaHaMA","image":"/assets/media/icons/request.webp","categories":["all"]},{"name":"Create Custom App","image":"/assets/media/icons/custom.webp","categories":["all"],"custom":"true"},{"name":"Amazon","link":"https://amazon.com/","image":"/assets/media/icons/amazon.webp","categories":["all"]},{"name":"Steam","link":"https://store.steampowered.com/","image":"/assets/media/icons/steam.webp","categories":["all"],"say":"Steam can't actually be added because it's an app, not a website. This only lets you browse the Steam website, you can't actually play any games unless you use Geforce Now.","partial":true},{"name":"BuzzFeed Quizzes","link":"https://www.buzzfeed.com/quizzes","image":"/assets/media/icons/buzzfeed.webp","categories":["all"]},{"name":"Guilded","link":"https://www.guilded.gg/","image":"/assets/media/icons/guilded.webp","categories":["all","social"]},{"name":"Android","link":"https://now.gg/iframe/snippet?app_pkg=com.uncube.launcher3&partner=interstellar","image":"/assets/media/icons/android.webp","categories":["all","emu","android"]},{"name":"Temu","link":"https://www.temu.com/","image":"/assets/media/icons/temu.webp","categories":["all"]},{"name":"Aptoide","link":"https://now.gg/iframe/snippet?app_pkg=com.aptoide.partners.nowgg.store&partner=interstellar","image":"/assets/media/icons/aptoide.webp","categories":["all","emu","android"]},{"name":"Scratch","link":"https://scratch.mit.edu","image":"/assets/media/icons/scratch.webp","categories":["all","social","game"]},{"name":"Chess.com","link":"https://www.chess.com/","image":"/assets/media/icons/chess.webp","categories":["all","game"]},{"name":"Cool Math Games","link":"https://www.coolmathgames.com/","image":"/assets/media/icons/coolmath.webp","categories":["all","game"]},{"name":"Discord","links":[{"name":"Discord","url":"https://discord.com"},{"name":"Discord Canary","url":"https://canary.discord.com"},{"name":"Discord PTB","url":"https://ptb.discord.com"}],"image":"/assets/media/icons/dc.jpg","categories":["all","social"]},{"name":"ESPN","link":"https://www.espn.com/watch/","image":"/assets/media/icons/espn.webp","categories":["all"]},{"name":"Fifa Rosters","link":"https://fifarosters.com/","image":"/assets/media/icons/fifa.webp","categories":["all"]},{"name":"Firefox Web Browser","link":"https://replit.com/@cooleddie001/Firefox-Legacy?v=1","image":"/assets/media/icons/firefox.webp","categories":["all"]},{"name":"Flix HQ","link":"https://flixhq.to","image":"/assets/media/icons/flixhq.webp","categories":["all","media"]},{"name":"Geforce NOW","link":"https://play.geforcenow.com","image":"/assets/media/icons/geforce-now.webp","categories":["all","stream","cloud"]},{"name":"Github","link":"https://github.com","image":"/assets/media/icons/github.webp","categories":["all"]},{"name":"Google","link":"https://google.com","image":"/assets/media/icons/google.webp","categories":["all"]},{"name":"HBO MAX","link":"https://www.hbomax.com/","image":"/assets/media/icons/hbo.webp","categories":["all","stream"]},{"name":"Messenger","link":"https://messenger.com/","image":"/assets/media/icons/messenger.webp","categories":["all","social","message"]},{"name":"MLB","link":"https://mlb.com","image":"/assets/media/icons/mlb.webp","categories":["all"]},{"name":"NFL","link":"https://nfl.com","image":"/assets/media/icons/nfl.webp","categories":["all"]},{"name":"NBA","link":"https://nba.com","image":"assets/media/icons/nba.webp","categories":["all"]},{"name":"Paramount Plus","link":"https://paramountplus.com","image":"/assets/media/icons/paramount.webp","categories":["all","stream"]},{"name":"Pinterest","link":"https://pinterest.com","image":"/assets/media/icons/pinterest.webp","categories":["all"]},{"name":"Pixlr","link":"https://pixlr.com/","image":"/assets/media/icons/pix.webp","categories":["all"]},{"name":"Poki","link":"https://poki.com","image":"/assets/media/icons/poki.webp","categories":["all","game"]},{"name":"Premier League","link":"https://premierleague.com","image":"/assets/media/icons/pl.webp","categories":["all"]},{"name":"Soundcloud","link":"https://soundcloud.com","image":"/assets/media/icons/soundcloud.webp","categories":["all"]},{"name":"Spotify","image":"/assets/media/icons/spotify.webp","categories":["all"],"error":true},{"name":"Telegram","link":"https://web.telegram.org/","image":"/assets/media/icons/telegram.webp","categories":["all","social"]},{"name":"Tiktok","link":"https://tiktok.com","image":"/assets/media/icons/tiktok.webp","categories":["all","social"]},{"name":"Free Media Heck Yeah","link":"https://fmhy.pages.dev","image":"/assets/media/icons/fmhy.webp","categories":["all","media"]},{"name":"Canva","link":"https://canva.com","image":"/assets/media/icons/canva.webp","categories":["all"]},{"name":"Wikipedia","link":"https://en.wikipedia.org","image":"/assets/media/icons/wiki.webp","categories":["all"]},{"name":"GOAL","link":"https://goal.com","image":"/assets/media/icons/goal.webp","categories":["all"]},{"name":"Trello","link":"https://trello.com","image":"/assets/media/icons/trello.webp","categories":["all"]},{"name":"Gidd.io Games","link":"https://gidd.io","image":"/assets/media/icons/gidd.webp","categories":["all"]},{"name":"Tumblr","link":"https://tumblr.com/","image":"/assets/media/icons/tumblr.webp","categories":["all","social"]},{"name":"Twitch","link":"https://twitch.tv","image":"/assets/media/icons/twitch.webp","categories":["all","stream"]},{"name":"Twitter","link":"https://twitter.com","image":"/assets/media/icons/twitter.webp","categories":["all","social"]},{"name":"VS Code","link":"https://vscode.dev","image":"/assets/media/icons/vscode.webp","categories":["all","tool"]},{"name":"Y8 Games","link":"https://y8.com/","image":"/assets/media/icons/y8.webp","categories":["all","game"]},{"name":"YouTube","link":"https://youtube.com","image":"/assets/media/icons/youtube.webp","categories":["all","social","stream"],"proxy":"sj"},{"name":"YouTube Alternative (Invidious)","link":"https://vid.puffyan.us/","image":"/assets/media/icons/youtube.webp","categories":["all","social","stream"]},{"name":"Whatsapp","image":"/assets/media/icons/whatsapp.webp","categories":["all","message","social"],"error":true},{"name":"Wattpad","link":"https://www.wattpad.com/","image":"/assets/media/icons/wattpad.webp","categories":["all","social"]},{"name":"Discord - Login","links":[{"name":"Discord","url":"https://discord.com/login"},{"name":"Discord Canary","url":"https://canary.discord.com/login"},{"name":"Discord PTB","url":"https://ptb.discord.com/login"}],"image":"/assets/media/icons/dc.jpg","categories":["all","social"],"blank":"true"},{"name":"HD Today","link":"https://hdtoday.tv","image":"/assets/media/icons/hd.webp","categories":["all","stream","media"]},{"name":"Now.GG","link":"https://now.gg","image":"/assets/media/icons/now-gg.webp","categories":["all","emu","android"]},{"name":"Now.GG (NowGG.me) [Working]","link":"https://nowgg.me","image":"/assets/media/icons/shuttle.webp","categories":["all","emu","android"]},{"name":"Vercel","link":"https://vercel.com","image":"/assets/media/icons/vercel.webp","categories":["all","tool"]},{"name":"Amazon Luna","link":"https://luna.amazon.com/","image":"/assets/media/icons/amazon-luna.webp","categories":["all","game","cloud"],"blank":"true"},{"name":"Google Gemini","link":"https://gemini.google.com","image":"/assets/media/icons/gemini.webp","categories":["all","ai"]},{"name":"Google Mail (Gmail)","link":"https://mail.google.com/","image":"/assets/media/icons/gmail.webp","categories":["all","mail"],"blank":"true","partial":"true"},{"name":"Outlook","link":"https://outlook.live.com/","image":"/assets/media/icons/outlook.webp","categories":["all","mail"]},{"name":"Snapchat","image":"/assets/media/icons/snap.webp","categories":["all","social","message"],"error":"true"},{"name":"W3Schools","link":"https://www.w3schools.com","image":"/assets/media/icons/W3Schools.webp","categories":["all"]},{"name":"Newgrounds","link":"https://www.newgrounds.com","image":"/assets/media/icons/newgrounds.webp","categories":["all","social","game"]},{"name":"Instagram","image":"/assets/media/icons/insta.webp","categories":["all","social","message"],"error":"true"},{"name":"Proton Mail","image":"/assets/media/icons/proton.webp","categories":["all"],"error":"true"},{"name":"SpaceHey","link":"https://www.spacehey.com","image":"/assets/media/icons/spacehey.png","categories":["all","social"]},{"name":"FMovies.to","link":"https://fmovies24.to/","image":"/assets/media/icons/FM.png","categories":["all","media"]},{"name":"EMovies.si","link":"https://emovies.si","categories":["all","media"]},{"name":"Movie Web","link":"https://movie-web-me.vercel.app/","image":"/assets/media/icons/MW.png","say":"This is not an official domain for Movie Web","categories":["all","media"]},{"name":"Sudo-Flix.Lol (Movie Web Clone)","link":"https://sudo-flix.lol/","image":"/assets/media/icons/MW.png","say":"This is not an official domain for Movie Web","categories":["all","media"]},{"name":"GBA Games","link":"https://gba.js.org/","image":"/assets/media/icons/gba.png","categories":["all","emu"]},{"name":"GPTZero.me","link":"https://gptzero.me/","image":"/assets/media/icons/gz.webp","categories":["all","ad"]},{"name":"ZeroGPT.com","link":"https://www.zerogpt.com/","image":"/assets/media/icons/zg.webp","categories":["all","ad"]},{"name":"ChatGPT","link":"https://chat.openai.com","image":"/assets/media/icons/gpt.jpg","categories":["all","ai"],"error":"true","say":"You must have a ChatGPT account to use the site, also the site may have some issues if you don't minimize tabs while using it."},{"name":"CopyLeaks.com","link":"https://copyleaks.com/ai-content-detector","image":"/assets/media/icons/cl.jpg","categories":["all","ad"]},{"name":"Writer.com","link":"https://writer.com/ai-content-detector/","image":"/assets/media/icons/wr.png","categories":["all","ad"]},{"name":"Quillbot.com AI Detector","link":"https://quillbot.com/ai-content-detector","image":"/assets/media/icons/qb.jpg","categories":["all","ad"]},{"name":"Kome.ai YouTube Transcript","link":"https://kome.ai/tools/youtube-transcript-generator","image":"/assets/media/icons/km.webp","categories":["all","ts"]},{"name":"NoteGPT.io YouTube Transcript","link":"https://notegpt.io/youtube-transcript-generator","image":"/assets/media/icons/ng.jpg","categories":["all","ts"]},{"name":"Grammarly Plagiarism Checker","link":"https://www.grammarly.com/plagiarism-checker","image":"/assets/media/icons/gm.png","categories":["all","pc"]},{"name":"Plagiarism Detector","link":"https://plagiarismdetector.net/","image":"/assets/media/icons/pdn.png","categories":["all","pc"]},{"name":"Blooket Cheats","link":"https://github.com/005konz/Blooket-Cheats","image":"/assets/media/icons/bl.webp","categories":["all","bl","cs"]},{"name":"Edpuzzle Cheats","link":"https://github.com/ading2210/edpuzzle-answers","image":"/assets/media/icons/ep.png","categories":["all","ep","cs"]},{"name":"DeepAI.org","link":"https://deepai.org/","image":"/assets/media/icons/da.webp","categories":["all","ai"]},{"name":"FreedomGPT","link":"https://chat.freedomgpt.com/","categories":["all","ai"]},{"name":"TalkAI.info","link":"https://talkai.info/chat/","image":"/assets/media/icons/ta.webp","categories":["all","ai"]}] \ No newline at end of file From e7fd5bc761f39802ac0ab43f08916251820dda89 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Sat, 5 Sep 2026 20:02:03 -0400 Subject: [PATCH 082/115] refactor: remove Dynamic proxy --- biome.json | 2 +- build.js | 141 ++--------------------- static/assets/dynamic/dynamic.client.js | 11 -- static/assets/dynamic/dynamic.config.js | 26 ----- static/assets/dynamic/dynamic.handler.js | 11 -- static/assets/dynamic/dynamic.html.js | 1 - static/assets/dynamic/dynamic.worker.js | 11 -- static/assets/js/launcher.js | 4 +- static/assets/js/main.js | 2 +- static/assets/js/search.js | 9 +- static/assets/js/tabs.js | 19 +-- static/settings.html | 1 - static/sw.js | 8 -- 13 files changed, 14 insertions(+), 232 deletions(-) delete mode 100644 static/assets/dynamic/dynamic.client.js delete mode 100644 static/assets/dynamic/dynamic.config.js delete mode 100644 static/assets/dynamic/dynamic.handler.js delete mode 100644 static/assets/dynamic/dynamic.html.js delete mode 100644 static/assets/dynamic/dynamic.worker.js diff --git a/biome.json b/biome.json index 342f1eded0..bce08448e6 100644 --- a/biome.json +++ b/biome.json @@ -1,7 +1,7 @@ { "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", "files": { - "includes": ["**", "!**/static/assets/ultraviolet", "!**/static/assets/dynamic", "!**/static/assets/json/**/*.min.json", "!**/static/assets/css/global.css", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb"] + "includes": ["**", "!**/static/assets/ultraviolet", "!**/static/assets/json/**/*.min.json", "!**/static/assets/css/global.css", "!**/node_modules", "!**/package-lock.json", "!**/package.json", "!**/*.md", "!**/bun.lockb"] }, "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { diff --git a/build.js b/build.js index c726f86c90..2d22b2b850 100644 --- a/build.js +++ b/build.js @@ -22,10 +22,8 @@ const SRC_DIR = path.join(process.cwd(), "static"); const DIST_DIR = path.join(process.cwd(), "dist"); const JS_DIR = path.join(DIST_DIR, "assets", "js"); const UV_DIR = path.join(DIST_DIR, "assets", "ultraviolet"); -const DYNAMIC_DIR = path.join(DIST_DIR, "assets", "dynamic"); const UV_PREFIX = "ultraviolet."; -const DYNAMIC_PREFIX = "dynamic."; const KEEP_IN_PLACE = new Set(); @@ -37,24 +35,15 @@ const SKIP_OBFUSCATE = new Set([ "scramjet.sync.js", "sj-tp.js", "ultraviolet.config.js", - // Dynamic's rewriter (acorn parser + AST transform + codegen) runs in the service - // worker for every proxied JS file. Obfuscating it multiplies that cost per request, - // same reason scramjet.* is skipped above. - "dynamic.worker.js", - "dynamic.client.js", - "dynamic.handler.js", - "dynamic.html.js", // Ultraviolet's bundle is the largest emitted file when obfuscated // (784 KB -> 4.2 MB) and the service worker imports it on every load. "ultraviolet.bundle.js", ]); -const OLD_DYNAMIC_PREFIX = "/assets/dynamic/"; const OLD_UV_PREFIX = "/assets/ultraviolet/"; const OLD_UV_SCOPE = "/uv/"; const OLD_SCRAMJET_SCOPE = "/uv/scramjet/"; -const OLD_DYNAMIC_SCOPE = "/uv/dynamic/"; const WORDS = [ "api", @@ -347,7 +336,6 @@ function getUrlCodecFunctions(codec, key) { function createProxyCodecs() { return { uv: randomCodecSpec(URL_CODEC_NAMES), - dynamic: randomCodecSpec(URL_CODEC_NAMES), scramjet: randomCodecSpec(URL_CODEC_NAMES), }; } @@ -371,47 +359,6 @@ function patchOrFail(content, pattern, replacement, label, required = true) { return content.replace(pattern, replacement); } -// Local patches on the vendored Dynamic bundles. A vendor drop or a formatter reflow -// aborts the build instead of shipping a half-patched proxy. See dynamic-changes.md. -const FIX2_GUARD = `("PropertyDefinition"!=t.type||t.key!=e||t.computed)`; -const FIX3_GUARD = `"MetaProperty"==e.object.type`; -const FIX4_GUARD = `"null"===e.origin?e.href:`; -const FIX5_GUARD = `m.set(i,v.bind(e))`; -const LOCAL_PATCH_ASSERTIONS = { - "dynamic.worker.js": [ - ["Fix 1 html module filename", `[["html","dynamic.html.js"]]`, 1], - ["Fix 2 PropertyDefinition.key guard", FIX2_GUARD, 1], - ["Fix 3 import.meta.url base", FIX3_GUARD, 1], - ["Fix 4 opaque-origin guard", FIX4_GUARD, 1], - ], - "dynamic.client.js": [ - ["Fix 5 proxy bind", FIX5_GUARD, 1], - ["Fix 2 PropertyDefinition.key guard", FIX2_GUARD, 1], - ["Fix 3 import.meta.url base", FIX3_GUARD, 1], - ["Fix 4 opaque-origin guard", FIX4_GUARD, 1], - ], - "dynamic.handler.js": [ - ["Fix 5 proxy bind", FIX5_GUARD, 1], - ["Fix 2 PropertyDefinition.key guard", FIX2_GUARD, 1], - ["Fix 3 import.meta.url base", FIX3_GUARD, 1], - ["Fix 4 opaque-origin guard", FIX4_GUARD, 1], - ], -}; - -function assertLocalPatches(content, basename) { - const checks = LOCAL_PATCH_ASSERTIONS[basename]; - if (!checks) return content; - for (const [label, needle, expected] of checks) { - const found = content.split(needle).length - 1; - if (found !== expected) { - throw new CodecPatchError( - `${basename}: local patch "${label}" expected ${expected} occurrence(s) in the minified source, found ${found}. The vendor bundle or the minifier changed - re-apply the patch (see static/assets/dynamic/dynamic-changes.md).`, - ); - } - } - return content; -} - function patchProxyCodecs(content, basename, proxyCodecs) { if (basename === "ultraviolet.config.js") { const { codec, key } = parseCodecSpec(proxyCodecs.uv); @@ -420,31 +367,6 @@ function patchProxyCodecs(content, basename, proxyCodecs) { content = patchOrFail(content, /decodeUrl:\s*Ultraviolet\.codec\.\w+\.decode,/, `decodeUrl: ${uvCodec.decode},`, "ultraviolet.config.js decodeUrl"); } - if (basename === "dynamic.config.js") { - content = patchOrFail(content, /encoding:\s*["']\w+["']/, 'encoding: "xor"', "dynamic.config.js encoding"); - } - - // All three bundles inline the same codec, and the client and handler rewrite in-page - // links, so patching only the worker breaks every navigation after the first. - if (basename === "dynamic.worker.js" || basename === "dynamic.client.js" || basename === "dynamic.handler.js") { - const { key } = parseCodecSpec(proxyCodecs.dynamic); - const dynamicKey = xorKeyValue(key); - content = patchOrFail( - content, - /\{encode:\(e,t=2\)=>e&&encodeURIComponent\(e\.split\(""\)\.map\(\(e,i\)=>i%t\?String\.fromCharCode\(e\.charCodeAt\(0\)\^t\):e\)\.join\(""\)\),decode:\(e,t=2\)=>e&&decodeURIComponent\(e\)\.split\(""\)\.map\(\(e,i\)=>i%t\?String\.fromCharCode\(e\.charCodeAt\(0\)\^t\):e\)\.join\(""\)\}/g, - `{encode:e=>e&&encodeURIComponent(e.split("").map((e,i)=>i%${dynamicKey}?String.fromCharCode(e.charCodeAt(0)^${dynamicKey}):e).join("")),decode:e=>e&&decodeURIComponent(e).split("").map((e,i)=>i%${dynamicKey}?String.fromCharCode(e.charCodeAt(0)^${dynamicKey}):e).join("")}`, - `${basename} xor codec`, - ); - } - - if (basename === "search.js" || basename === "tabs.js") { - const { key } = parseCodecSpec(proxyCodecs.dynamic); - const dynamicKey = JSON.stringify(key || "2"); - content = patchOrFail(content, /\/uv\/dynamic\/\$\{window\.encode\.xor\(url\)\}/g, `/uv/dynamic/\${window.encode.xor(url, ${dynamicKey})}`, `${basename} dynamic encode(url)`); - content = patchOrFail(content, /\/uv\/dynamic\/\$\{window\.encode\.xor\(value\)\}/g, `/uv/dynamic/\${window.encode.xor(value, ${dynamicKey})}`, `${basename} dynamic encode(value)`, basename === "search.js"); - content = patchOrFail(content, /return window\.decode\.xor\(str\) \+ \(search\.length/g, `return window.decode.xor(str, ${dynamicKey}) + (search.length`, `${basename} dynamic decode`, basename === "tabs.js"); - } - if (basename === "sj-tp.js") { const { codec, key } = parseCodecSpec(proxyCodecs.scramjet); const sjCodec = getUrlCodecFunctions(codec, key); @@ -637,13 +559,12 @@ async function getHtmlFiles(dir) { return files; } -async function updateServerRoutes(uvScope, scramjetScope, dynamicScope) { +async function updateServerRoutes(uvScope, scramjetScope) { const indexPath = path.join(process.cwd(), "index.js"); try { let content = await readFile(indexPath, "utf8"); content = replaceAll(content, OLD_UV_SCOPE, uvScope); content = replaceAll(content, OLD_SCRAMJET_SCOPE, scramjetScope); - content = replaceAll(content, OLD_DYNAMIC_SCOPE, dynamicScope); await writeFile(indexPath, content, "utf8"); console.log(chalk.green(" + index.js (scope routes updated)")); } catch {} @@ -660,37 +581,25 @@ async function build() { const uvBase = randomWord(); const scramjetSub = randomWord(); - const dynamicSub = randomWord(); const NEW_UV_SCOPE = `/${uvBase}/`; const NEW_SCRAMJET_SCOPE = `/${uvBase}/${scramjetSub}/`; - const NEW_DYNAMIC_SCOPE = `/${uvBase}/${dynamicSub}/`; const proxyCodecs = createProxyCodecs(); console.log(`\nScope paths:`); console.log(` ${OLD_UV_SCOPE} -> ${NEW_UV_SCOPE}`); console.log(` ${OLD_SCRAMJET_SCOPE} -> ${NEW_SCRAMJET_SCOPE}`); - console.log(` ${OLD_DYNAMIC_SCOPE} -> ${NEW_DYNAMIC_SCOPE}`); console.log(`\nURL codecs:`); console.log(` ultraviolet: ${proxyCodecs.uv}`); console.log(` scramjet: ${proxyCodecs.scramjet}`); - console.log(` dynamic: ${proxyCodecs.dynamic}`); - - let jsPublicDir, dynPublicDir; - do { - jsPublicDir = randomDir(); - dynPublicDir = randomDir(); - } while (jsPublicDir === dynPublicDir); + const jsPublicDir = randomDir(); const jsDirFull = path.join(DIST_DIR, jsPublicDir); - const dynDirFull = path.join(DIST_DIR, dynPublicDir); await mkdir(jsDirFull, { recursive: true }); - await mkdir(dynDirFull, { recursive: true }); - const NEW_DYNAMIC_FILE_PREFIX = `/${dynPublicDir}/`; const NEW_UV_FILE_PREFIX = `/${jsPublicDir}/`; - const PROTECTED = ["/bare/", "/wisp/", "/baremux/", "/epoxy/", "/libcurl/", "/assets/scramjet/", NEW_UV_SCOPE, NEW_SCRAMJET_SCOPE, NEW_DYNAMIC_SCOPE]; + const PROTECTED = ["/bare/", "/wisp/", "/baremux/", "/epoxy/", "/libcurl/", "/assets/scramjet/", NEW_UV_SCOPE, NEW_SCRAMJET_SCOPE]; const usedPaths = new Set(); @@ -716,7 +625,6 @@ async function build() { } const jsRenameMap = new Map(); - const dynRenameMap = new Map(); const plan = new Map(); for (const filePath of await getJsFiles(JS_DIR)) { @@ -747,25 +655,7 @@ async function build() { jsRenameMap.set(name, newPublicPath); } - for (const filePath of await getJsFiles(DYNAMIC_DIR)) { - const basename = path.basename(filePath); - - if (basename.startsWith(DYNAMIC_PREFIX)) { - // Dynamic rebuilds these URLs at runtime from assets.prefix plus hardcoded - // fragments, so the filenames must survive. Randomize the directory only. - const newPublicPath = `/${dynPublicDir}/${basename}`; - const newFullPath = path.join(dynDirFull, basename); - usedPaths.add(newPublicPath); - plan.set(filePath, { basename, newPublicPath, newFullPath, inPlace: false, group: "dynamic" }); - dynRenameMap.set(basename, newPublicPath); - } else { - const rel = path.relative(DIST_DIR, filePath).replace(/\\/g, "/"); - plan.set(filePath, { basename, newPublicPath: `/${rel}`, newFullPath: filePath, inPlace: true, group: "dynamic" }); - } - } - - console.log(`\nJS/UV output: /${jsPublicDir}`); - console.log(`Dynamic output: /${dynPublicDir}\n`); + console.log(`\nJS/UV output: /${jsPublicDir}\n`); let passed = 0; let failed = 0; @@ -775,24 +665,14 @@ async function build() { [...plan.entries()].map(async ([filePath, { basename, newPublicPath, newFullPath, inPlace, group }]) => { try { let output = await readFile(filePath, "utf8"); - output = assertLocalPatches(output, basename); output = patchProxyCodecs(output, basename, proxyCodecs); output = replaceAll(output, OLD_SCRAMJET_SCOPE, NEW_SCRAMJET_SCOPE); - output = replaceAll(output, OLD_DYNAMIC_SCOPE, NEW_DYNAMIC_SCOPE); output = replaceAll(output, OLD_UV_SCOPE, NEW_UV_SCOPE); if (group === "js" || group === "uv") { output = replaceAll(output, OLD_UV_PREFIX, NEW_UV_FILE_PREFIX); output = applyRenameMap(output, jsRenameMap, PROTECTED); - output = replaceAll(output, OLD_DYNAMIC_PREFIX, NEW_DYNAMIC_FILE_PREFIX); - output = applyRenameMap(output, dynRenameMap, PROTECTED); - } - - if (group === "dynamic") { - // Directory only: absolute paths in dynamic.config.js's assets.files.* would make - // Dynamic request assets.prefix + "/dir/file.js" -> /dir//dir/file.js. - output = replaceAll(output, OLD_DYNAMIC_PREFIX, NEW_DYNAMIC_FILE_PREFIX); } const shouldObfuscate = OBFUSCATE && !SKIP_OBFUSCATE.has(basename); @@ -823,11 +703,11 @@ async function build() { process.exit(1); } - for (const dir of [JS_DIR, UV_DIR, DYNAMIC_DIR]) { + for (const dir of [JS_DIR, UV_DIR]) { await rm(dir, { recursive: true, force: true }); } - const allRenames = new Map([...jsRenameMap, ...dynRenameMap]); + const allRenames = new Map([...jsRenameMap]); const htmlFiles = await getHtmlFiles(DIST_DIR); console.log(`\nUpdating ${htmlFiles.length} HTML files${OBFUSCATE_HTML ? " + obfuscating" : ""}...\n`); @@ -838,7 +718,6 @@ async function build() { for (const [oldScope, newScope] of [ [OLD_SCRAMJET_SCOPE, NEW_SCRAMJET_SCOPE], - [OLD_DYNAMIC_SCOPE, NEW_DYNAMIC_SCOPE], [OLD_UV_SCOPE, NEW_UV_SCOPE], ]) { const updated = replaceAll(html, oldScope, newScope); @@ -875,7 +754,7 @@ async function build() { ); const allJs = await getJsFiles(DIST_DIR); - const otherJs = allJs.filter(f => !f.startsWith(jsDirFull) && !f.startsWith(dynDirFull) && !f.startsWith(JS_DIR) && !f.startsWith(UV_DIR) && !f.startsWith(DYNAMIC_DIR)); + const otherJs = allJs.filter(f => !f.startsWith(jsDirFull) && !f.startsWith(JS_DIR) && !f.startsWith(UV_DIR)); if (otherJs.length) { console.log(`\nUpdating ${otherJs.length} other JS files...\n`); @@ -884,10 +763,8 @@ async function build() { const content = await readFile(jsPath, "utf8"); let updated = content; updated = replaceAll(updated, OLD_SCRAMJET_SCOPE, NEW_SCRAMJET_SCOPE); - updated = replaceAll(updated, OLD_DYNAMIC_SCOPE, NEW_DYNAMIC_SCOPE); updated = replaceAll(updated, OLD_UV_SCOPE, NEW_UV_SCOPE); updated = replaceAll(updated, OLD_UV_PREFIX, NEW_UV_FILE_PREFIX); - updated = replaceAll(updated, OLD_DYNAMIC_PREFIX, NEW_DYNAMIC_FILE_PREFIX); updated = applyRenameMap(updated, allRenames, PROTECTED); if (updated !== content) { await writeFile(jsPath, updated, "utf8"); @@ -898,10 +775,10 @@ async function build() { } console.log("\nUpdating server routes...\n"); - await updateServerRoutes(NEW_UV_SCOPE, NEW_SCRAMJET_SCOPE, NEW_DYNAMIC_SCOPE); + await updateServerRoutes(NEW_UV_SCOPE, NEW_SCRAMJET_SCOPE); console.log(chalk.green("\nBuild complete -> dist/")); - console.log(chalk.blue(`\nNew scope: ${NEW_UV_SCOPE} scramjet: ${NEW_SCRAMJET_SCOPE} dynamic: ${NEW_DYNAMIC_SCOPE}`)); + console.log(chalk.blue(`\nNew scope: ${NEW_UV_SCOPE} scramjet: ${NEW_SCRAMJET_SCOPE}`)); } build().catch(err => { diff --git a/static/assets/dynamic/dynamic.client.js b/static/assets/dynamic/dynamic.client.js deleted file mode 100644 index 2444031127..0000000000 --- a/static/assets/dynamic/dynamic.client.js +++ /dev/null @@ -1,11 +0,0 @@ -(()=>{var aa=Object.create,Xe=Object.defineProperty,sa=Object.getOwnPropertyDescriptor,oa=Object.getOwnPropertyNames,ca=Object.getPrototypeOf,ua=Object.prototype.hasOwnProperty,la=(e,t,i)=>t in e?Xe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i,Tt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),dr=(e,t)=>{for(var i in t)Xe(e,i,{get:t[i],enumerable:!0})},ha=(e,t,i,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let n of oa(t))ua.call(e,n)||n===i||Xe(e,n,{get:()=>t[n],enumerable:!(r=sa(t,n))||r.enumerable});return e},Qe=(e,t,i)=>(i=null!=e?aa(ca(e)):{},ha(!t&&e&&e.__esModule?i:Xe(i,"default",{value:e,enumerable:!0}),e)),q=(e,t,i)=>(la(e,"symbol"!=typeof t?t+"":t,i),i),Nt=Tt((e,t)=>{function i(e){if("string"!=typeof e)throw TypeError("Path must be a string. Received "+JSON.stringify(e))}function r(e,t){for(var i,r="",n=0,s=-1,a=0,o=0;o<=e.length;++o){if(o2){var c=r.lastIndexOf("/");if(c!==r.length-1){-1===c?(r="",n=0):n=(r=r.slice(0,c)).length-1-r.lastIndexOf("/"),s=o,a=0;continue}}else if(2===r.length||1===r.length){r="",n=0,s=o,a=0;continue}t&&(r.length>0?r+="/..":r="..",n=2)}else r.length>0?r+="/"+e.slice(s+1,o):r=e.slice(s+1,o),n=o-s-1;s=o,a=0}else 46===i&&-1!==a?++a:a=-1}return r}var n={resolve(){for(var e,t,n="",s=!1,a=arguments.length-1;a>=-1&&!s;a--)a>=0?e=arguments[a]:(void 0===t&&(t=process.cwd()),e=t),i(e),0!==e.length&&(n=e+"/"+n,s=47===e.charCodeAt(0));return n=r(n,!s),s?n.length>0?"/"+n:"/":n.length>0?n:"."},normalize(e){if(i(e),0===e.length)return".";var t=47===e.charCodeAt(0),n=47===e.charCodeAt(e.length-1);return 0!==(e=r(e,!t)).length||t||(e="."),e.length>0&&n&&(e+="/"),t?"/"+e:e},isAbsolute:e=>(i(e),e.length>0&&47===e.charCodeAt(0)),join(){if(0===arguments.length)return".";for(var e,t=0;t0&&(void 0===e?e=r:e+="/"+r)}return void 0===e?".":n.normalize(e)},relative(e,t){if(i(e),i(t),e===t||(e=n.resolve(e))===(t=n.resolve(t)))return"";for(var r=1;rl){if(47===t.charCodeAt(o+h))return t.slice(o+h+1);if(0===h)return t.slice(o+h)}else a>l&&(47===e.charCodeAt(r+h)?p=h:0===h&&(p=0));break}var u=e.charCodeAt(r+h);if(u!==t.charCodeAt(o+h))break;47===u&&(p=h)}var d="";for(h=r+p+1;h<=s;++h)(h===s||47===e.charCodeAt(h))&&(0===d.length?d+="..":d+="/..");return d.length>0?d+t.slice(o+p):(o+=p,47===t.charCodeAt(o)&&++o,t.slice(o))},_makeLong:e=>e,dirname(e){if(i(e),0===e.length)return".";for(var t=e.charCodeAt(0),r=47===t,n=-1,s=!0,a=e.length-1;a>=1;--a)if(47===(t=e.charCodeAt(a))){if(!s){n=a;break}}else s=!1;return-1===n?r?"/":".":r&&1===n?"//":e.slice(0,n)},basename(e,t){if(void 0!==t&&"string"!=typeof t)throw TypeError('"ext" argument must be a string');i(e);var r,n=0,s=-1,a=!0;if(void 0!==t&&t.length>0&&t.length<=e.length){if(t.length===e.length&&t===e)return"";var o=t.length-1,c=-1;for(r=e.length-1;r>=0;--r){var l=e.charCodeAt(r);if(47===l){if(!a){n=r+1;break}}else-1===c&&(a=!1,c=r+1),o>=0&&(l===t.charCodeAt(o)?-1==--o&&(s=r):(o=-1,s=c))}return n===s?s=c:-1===s&&(s=e.length),e.slice(n,s)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!a){n=r+1;break}}else-1===s&&(a=!1,s=r+1);return-1===s?"":e.slice(n,s)},extname(e){i(e);for(var t=-1,r=0,n=-1,s=!0,a=0,o=e.length-1;o>=0;--o){var c=e.charCodeAt(o);if(47!==c)-1===n&&(s=!1,n=o+1),46===c?-1===t?t=o:1!==a&&(a=1):-1!==t&&(a=-1);else if(!s){r=o+1;break}}return-1===t||-1===n||0===a||1===a&&t===n-1&&t===r+1?"":e.slice(t,n)},format(e){if(null===e||"object"!=typeof e)throw TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var i=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return i?i===t.root?i+r:i+e+r:r}("/",e)},parse(e){i(e);var t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;var r,n=e.charCodeAt(0),s=47===n;s?(t.root="/",r=1):r=0;for(var a=-1,o=0,c=-1,l=!0,p=e.length-1,h=0;p>=r;--p)if(47!==(n=e.charCodeAt(p)))-1===c&&(l=!1,c=p+1),46===n?-1===a?a=p:1!==h&&(h=1):-1!==a&&(h=-1);else if(!l){o=p+1;break}return-1===a||-1===c||0===h||1===h&&a===c-1&&a===o+1?-1!==c&&(t.base=t.name=0===o&&s?e.slice(1,c):e.slice(o,c)):(0===o&&s?(t.name=e.slice(1,a),t.base=e.slice(1,c)):(t.name=e.slice(o,a),t.base=e.slice(o,c)),t.ext=e.slice(a,c)),o>0?t.dir=e.slice(0,o-1):s&&(t.dir="/"),t},sep:"/",delimiter:":",win32:null,posix:null};n.posix=n,t.exports=n}),vn=Tt(e=>{e.parse=function(e,t){if("string"!=typeof e)throw TypeError("argument str must be a string");for(var i={},n=(t||{}).decode||r,s=0;s{var i={decodeValues:!0,map:!1,silent:!1};function r(e){return"string"==typeof e&&!!e.trim()}function n(e,t){var n=e.split(";").filter(r),s=function(e){var t="",i="",r=e.split("=");return r.length>1?(t=r.shift(),i=r.join("=")):i=e,{name:t,value:i}}(n.shift()),a=s.name,o=s.value;t=t?Object.assign({},i,t):i;try{o=t.decodeValues?decodeURIComponent(o):o}catch(e){console.error("set-cookie-parser encountered an error while decoding a cookie with value '"+o+"'. Set options.decodeValues to false to disable this feature.",e)}var c={name:a,value:o};return n.forEach(e=>{var t=e.split("="),i=t.shift().trimLeft().toLowerCase(),r=t.join("=");"expires"===i?c.expires=new Date(r):"max-age"===i?c.maxAge=Number.parseInt(r,10):"secure"===i?c.secure=!0:"httponly"===i?c.httpOnly=!0:"samesite"===i?c.sameSite=r:c[i]=r}),c}function s(e,t){if(t=t?Object.assign({},i,t):i,!e)return t.map?{}:[];if(e.headers)if("function"==typeof e.headers.getSetCookie)e=e.headers.getSetCookie();else if(e.headers["set-cookie"])e=e.headers["set-cookie"];else{var s=e.headers[Object.keys(e.headers).find(e=>"set-cookie"===e.toLowerCase())];s||!e.headers.cookie||t.silent||console.warn("Warning: set-cookie-parser appears to have been called on a request object. It is designed to parse Set-Cookie headers from responses, not Cookie headers from requests. Set the option {silent: true} to suppress this warning."),e=s}return Array.isArray(e)||(e=[e]),(t=t?Object.assign({},i,t):i).map?e.filter(r).reduce((e,i)=>{var r=n(i,t);return e[r.name]=r,e},{}):e.filter(r).map(e=>n(e,t))}t.exports=s,t.exports.parse=s,t.exports.parseString=n,t.exports.splitCookiesString=function(e){if(Array.isArray(e))return e;if("string"!=typeof e)return[];var t,i,r,n,s,a=[],o=0;function c(){for(;o=e.length)&&a.push(e.substring(t,e.length))}return a}}),xr=Qe(Nt()),Ye={"application/ecmascript":{source:"apache",compressible:!0,extensions:["ecma"]},"application/gzip":{source:"iana",compressible:!1,extensions:["gz"]},"application/http":{source:"iana"},"application/javascript":{source:"apache",charset:"UTF-8",compressible:!0,extensions:["js"]},"application/json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["json","map"]},"application/manifest+json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["webmanifest"]},"application/marc":{source:"iana",extensions:["mrc"]},"application/mp4":{source:"iana",extensions:["mp4","mpg4","mp4s","m4p"]},"application/ogg":{source:"iana",compressible:!1,extensions:["ogx"]},"application/sql":{source:"iana",extensions:["sql"]},"application/wasm":{source:"iana",compressible:!0,extensions:["wasm"]},"application/x-bittorrent":{source:"apache",extensions:["torrent"]},"application/x-gzip":{source:"apache"},"application/x-javascript":{compressible:!0},"application/x-web-app-manifest+json":{compressible:!0,extensions:["webapp"]},"application/x-www-form-urlencoded":{source:"iana",compressible:!0},"application/xhtml+xml":{source:"iana",compressible:!0,extensions:["xhtml","xht"]},"application/xhtml-voice+xml":{source:"apache",compressible:!0},"application/xml":{source:"iana",compressible:!0,extensions:["xml","xsl","xsd","rng"]},"application/zip":{source:"iana",compressible:!1,extensions:["zip"]},"application/zlib":{source:"iana"},"audio/midi":{source:"apache",extensions:["mid","midi","kar","rmi"]},"audio/mp3":{compressible:!1,extensions:["mp3"]},"audio/mp4":{source:"iana",compressible:!1,extensions:["m4a","mp4a"]},"audio/mp4a-latm":{source:"iana"},"audio/mpa":{source:"iana"},"audio/mpa-robust":{source:"iana"},"audio/mpeg":{source:"iana",compressible:!1,extensions:["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/ogg":{source:"iana",compressible:!1,extensions:["oga","ogg","spx","opus"]},"audio/red":{source:"iana"},"audio/rtx":{source:"iana"},"audio/scip":{source:"iana"},"audio/silk":{source:"apache",extensions:["sil"]},"audio/smv":{source:"iana"},"audio/wav":{compressible:!1,extensions:["wav"]},"audio/wave":{compressible:!1,extensions:["wav"]},"audio/webm":{source:"apache",compressible:!1,extensions:["weba"]},"audio/x-aac":{source:"apache",compressible:!1,extensions:["aac"]},"audio/x-aiff":{source:"apache",extensions:["aif","aiff","aifc"]},"audio/x-caf":{source:"apache",compressible:!1,extensions:["caf"]},"audio/x-flac":{source:"apache",extensions:["flac"]},"audio/x-m4a":{source:"nginx",extensions:["m4a"]},"audio/x-matroska":{source:"apache",extensions:["mka"]},"audio/x-mpegurl":{source:"apache",extensions:["m3u"]},"audio/x-ms-wax":{source:"apache",extensions:["wax"]},"audio/x-ms-wma":{source:"apache",extensions:["wma"]},"audio/x-pn-realaudio":{source:"apache",extensions:["ram","ra"]},"audio/x-pn-realaudio-plugin":{source:"apache",extensions:["rmp"]},"audio/x-realaudio":{source:"nginx",extensions:["ra"]},"audio/x-tta":{source:"apache"},"audio/x-wav":{source:"apache",extensions:["wav"]},"audio/xm":{source:"apache",extensions:["xm"]},"font/collection":{source:"iana",extensions:["ttc"]},"font/otf":{source:"iana",compressible:!0,extensions:["otf"]},"font/sfnt":{source:"iana"},"font/ttf":{source:"iana",compressible:!0,extensions:["ttf"]},"font/woff":{source:"iana",extensions:["woff"]},"font/woff2":{source:"iana",extensions:["woff2"]},"image/gif":{source:"iana",compressible:!1,extensions:["gif"]},"image/heic":{source:"iana",extensions:["heic"]},"image/heic-sequence":{source:"iana",extensions:["heics"]},"image/heif":{source:"iana",extensions:["heif"]},"image/jpeg":{source:"iana",compressible:!1,extensions:["jpeg","jpg","jpe"]},"image/png":{source:"iana",compressible:!1,extensions:["png"]},"image/svg+xml":{source:"iana",compressible:!0,extensions:["svg","svgz"]},"image/webp":{source:"iana",extensions:["webp"]},"text/coffeescript":{extensions:["coffee","litcoffee"]},"text/css":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["css"]},"text/ecmascript":{source:"apache"},"text/html":{source:"iana",compressible:!0,extensions:["html","htm","shtml"]},"text/jade":{extensions:["jade"]},"text/javascript":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["js","mjs"]},"text/markdown":{source:"iana",compressible:!0,extensions:["md","markdown"]}},_r=/^\s*([^;\s]*)(?:;|\s|$)/,fa=/^text\//i,U={};function gr(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&Ye[t[1].toLowerCase()];return i&&i.charset?i.charset:!(!t||!fa.test(t[1]))&&"UTF-8"}function da(e){if(!e||"string"!=typeof e)return!1;var t=-1===e.indexOf("/")?U.lookup(e):e;if(!t)return!1;if(-1===t.indexOf("charset")){var i=U.charset(t);i&&(t+="; charset="+i.toLowerCase())}return t}function ma(e){if(!e||"string"!=typeof e)return!1;var t=_r.exec(e),i=t&&U.extensions[t[1].toLowerCase()];return!(!i||!i.length)&&i[0]}function ya(e){if(!e||"string"!=typeof e)return!1;var t=(0,xr.extname)("x."+e).toLowerCase().substr(1);return t&&U.types[t]||!1}function ga(e,t){var i=["nginx","apache",void 0,"iana"];Object.keys(Ye).forEach(r=>{var n=Ye[r],s=n.extensions;if(s&&s.length){e[r]=s;for(var a=0;al||c===l&&"application/"===t[o].substr(0,12)))continue}t[o]=r}}})}U.charset=gr,U.charsets={lookup:gr},U.contentType=da,U.extension=ma,U.extensions=Object.create(null),U.lookup=ya,U.types=Object.create(null),ga(U.extensions,U.types);var br=U,Us=Qe(Nt(),1),Je={};dr(Je,{deleteDB:()=>Ca,openDB:()=>Bt,unwrap:()=>Le,wrap:()=>G});var wr,vr,xa=(e,t)=>t.some(t=>e instanceof t);function _a(){return wr||(wr=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function ba(){return vr||(vr=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var Sr=new WeakMap,Dt=new WeakMap,Er=new WeakMap,Mt=new WeakMap,Vt=new WeakMap;function wa(e){let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("success",n),e.removeEventListener("error",s)},n=()=>{t(G(e.result)),r()},s=()=>{i(e.error),r()};e.addEventListener("success",n),e.addEventListener("error",s)});return t.then(t=>{t instanceof IDBCursor&&Sr.set(t,e)}).catch(()=>{}),Vt.set(t,e),t}function va(e){if(Dt.has(e))return;let t=new Promise((t,i)=>{let r=()=>{e.removeEventListener("complete",n),e.removeEventListener("error",s),e.removeEventListener("abort",s)},n=()=>{t(),r()},s=()=>{i(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",n),e.addEventListener("error",s),e.addEventListener("abort",s)});Dt.set(e,t)}var Ot={get(e,t,i){if(e instanceof IDBTransaction){if("done"===t)return Dt.get(e);if("objectStoreNames"===t)return e.objectStoreNames||Er.get(e);if("store"===t)return i.objectStoreNames[1]?void 0:i.objectStore(i.objectStoreNames[0])}return G(e[t])},set:(e,t,i)=>(e[t]=i,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function Cr(e){Ot=e(Ot)}function Sa(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?ba().includes(e)?function(...t){return e.apply(Le(this),t),G(Sr.get(this))}:function(...t){return G(e.apply(Le(this),t))}:function(t,...i){let r=e.call(Le(this),t,...i);return Er.set(r,t.sort?t.sort():[t]),G(r)}}function Ea(e){return"function"==typeof e?Sa(e):(e instanceof IDBTransaction&&va(e),xa(e,_a())?new Proxy(e,Ot):e)}function G(e){if(e instanceof IDBRequest)return wa(e);if(Mt.has(e))return Mt.get(e);let t=Ea(e);return t!==e&&(Mt.set(e,t),Vt.set(t,e)),t}var Le=e=>Vt.get(e);function Bt(e,t,{blocked:i,upgrade:r,blocking:n,terminated:s}={}){let a=indexedDB.open(e,t),o=G(a);return r&&a.addEventListener("upgradeneeded",e=>{r(G(a.result),e.oldVersion,e.newVersion,G(a.transaction),e)}),i&&a.addEventListener("blocked",e=>i(e.oldVersion,e.newVersion,e)),o.then(e=>{s&&e.addEventListener("close",()=>s()),n&&e.addEventListener("versionchange",e=>n(e.oldVersion,e.newVersion,e))}).catch(()=>{}),o}function Ca(e,{blocked:t}={}){let i=indexedDB.deleteDatabase(e);return t&&i.addEventListener("blocked",e=>t(e.oldVersion,e)),G(i).then(()=>{})}var ka=["get","getKey","getAll","getAllKeys","count"],Aa=["put","add","delete","clear"],Ft=new Map;function kr(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(Ft.get(t))return Ft.get(t);let i=t.replace(/FromIndex$/,""),r=t!==i,n=Aa.includes(i);if(!(i in(r?IDBIndex:IDBObjectStore).prototype)||!n&&!ka.includes(i))return;let s=async function(e,...t){let s=this.transaction(e,n?"readwrite":"readonly"),a=s.store;return r&&(a=a.index(t.shift())),(await Promise.all([a[i](...t),n&&s.done]))[0]};return Ft.set(t,s),s}Cr(e=>({...e,get:(t,i,r)=>kr(t,i)||e.get(t,i,r),has:(t,i)=>!!kr(t,i)||e.has(t,i)}));var La=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,81,2,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,10,1,2,0,49,6,4,4,14,9,5351,0,7,14,13835,9,87,9,39,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,4706,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,983,6,110,6,6,9,4759,9,787719,239],Ir=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,68,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,4026,582,8634,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8936,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,757,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4153,7,221,3,5761,15,7472,3104,541,1507,4938,6,4191],Pa="‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-ᫎᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_",Tr="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꟊꟐꟑꟓꟕ-ꟙꟲ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",$t={3:"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",5:"class enum extends super const export import",6:"enum",strict:"implements interface let package private protected public static yield",strictBind:"eval arguments"},jt="break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this",Ra={5:jt,"5module":jt+" export import",6:jt+" const class extends export import super"},Ia=/^in(stanceof)?$/,Ta=RegExp("["+Tr+"]"),Na=RegExp("["+Tr+Pa+"]");function Ht(e,t){for(var i=65536,r=0;re);r+=2)if((i+=t[r+1])>=e)return!0;return!1}function ce(e,t){return e<65?36===e:e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Ta.test(String.fromCharCode(e)):!1!==t&&Ht(e,Ir)))}function be(e,t){return e<48?36===e:e<58||!(e<65)&&(e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Na.test(String.fromCharCode(e)):!1!==t&&(Ht(e,Ir)||Ht(e,La)))))}var L=function(e,t){void 0===t&&(t={}),this.label=e,this.keyword=t.keyword,this.beforeExpr=!!t.beforeExpr,this.startsExpr=!!t.startsExpr,this.isLoop=!!t.isLoop,this.isAssign=!!t.isAssign,this.prefix=!!t.prefix,this.postfix=!!t.postfix,this.binop=t.binop||null,this.updateContext=null};function z(e,t){return new L(e,{beforeExpr:!0,binop:t})}var K={beforeExpr:!0},H={startsExpr:!0},Gt={};function k(e,t){return void 0===t&&(t={}),t.keyword=e,Gt[e]=new L(e,t)}var u={num:new L("num",H),regexp:new L("regexp",H),string:new L("string",H),name:new L("name",H),privateId:new L("privateId",H),eof:new L("eof"),bracketL:new L("[",{beforeExpr:!0,startsExpr:!0}),bracketR:new L("]"),braceL:new L("{",{beforeExpr:!0,startsExpr:!0}),braceR:new L("}"),parenL:new L("(",{beforeExpr:!0,startsExpr:!0}),parenR:new L(")"),comma:new L(",",K),semi:new L(";",K),colon:new L(":",K),dot:new L("."),question:new L("?",K),questionDot:new L("?."),arrow:new L("=>",K),template:new L("template"),invalidTemplate:new L("invalidTemplate"),ellipsis:new L("...",K),backQuote:new L("`",H),dollarBraceL:new L("${",{beforeExpr:!0,startsExpr:!0}),eq:new L("=",{beforeExpr:!0,isAssign:!0}),assign:new L("_=",{beforeExpr:!0,isAssign:!0}),incDec:new L("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new L("!/~",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:z("||",1),logicalAND:z("&&",2),bitwiseOR:z("|",3),bitwiseXOR:z("^",4),bitwiseAND:z("&",5),equality:z("==/!=/===/!==",6),relational:z("/<=/>=",7),bitShift:z("<>/>>>",8),plusMin:new L("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:z("%",10),star:z("*",10),slash:z("/",10),starstar:new L("**",{beforeExpr:!0}),coalesce:z("??",1),_break:k("break"),_case:k("case",K),_catch:k("catch"),_continue:k("continue"),_debugger:k("debugger"),_default:k("default",K),_do:k("do",{isLoop:!0,beforeExpr:!0}),_else:k("else",K),_finally:k("finally"),_for:k("for",{isLoop:!0}),_function:k("function",H),_if:k("if"),_return:k("return",K),_switch:k("switch"),_throw:k("throw",K),_try:k("try"),_var:k("var"),_const:k("const"),_while:k("while",{isLoop:!0}),_with:k("with"),_new:k("new",{beforeExpr:!0,startsExpr:!0}),_this:k("this",H),_super:k("super",H),_class:k("class",H),_extends:k("extends",K),_export:k("export"),_import:k("import",H),_null:k("null",H),_true:k("true",H),_false:k("false",H),_in:k("in",{beforeExpr:!0,binop:7}),_instanceof:k("instanceof",{beforeExpr:!0,binop:7}),_typeof:k("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:k("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:k("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},Y=/\r\n?|\n|\u2028|\u2029/,Ma=RegExp(Y.source,"g");function we(e){return 10===e||13===e||8232===e||8233===e}function Nr(e,t,i){void 0===i&&(i=e.length);for(var r=t;rDa.call(e,t)),Ar=Array.isArray||(e=>"[object Array]"===Oa.call(e));function pe(e){return RegExp("^(?:"+e.replace(/ /g,"|")+")$")}function fe(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+((e-=65536)>>10),56320+(1023&e))}var Va=/(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/,Re=function(e,t){this.line=e,this.column=t};Re.prototype.offset=function(e){return new Re(this.line,this.column+e)};var rt=function(e,t,i){this.start=t,this.end=i,null!==e.sourceFile&&(this.source=e.sourceFile)};function Or(e,t){for(var i=1,r=0;;){var n=Nr(e,r,t);if(n<0)return new Re(i,t-r);++i,r=n}}var Wt={ecmaVersion:null,sourceType:"script",onInsertedSemicolon:null,onTrailingComma:null,allowReserved:null,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowAwaitOutsideFunction:null,allowSuperOutsideMethod:null,allowHashBang:!1,checkPrivateFields:!0,locations:!1,onToken:null,onComment:null,ranges:!1,program:null,sourceFile:null,directSourceFile:null,preserveParens:!1},Lr=!1;function Fa(e){var t={};for(var i in Wt)t[i]=e&&Te(e,i)?e[i]:Wt[i];if("latest"===t.ecmaVersion?t.ecmaVersion=1e8:null==t.ecmaVersion?(!Lr&&"object"==typeof console&&console.warn&&(Lr=!0,console.warn("Since Acorn 8.0.0, options.ecmaVersion is required.\nDefaulting to 2020, but this will stop working in the future.")),t.ecmaVersion=11):t.ecmaVersion>=2015&&(t.ecmaVersion-=2009),null==t.allowReserved&&(t.allowReserved=t.ecmaVersion<5),e&&null!=e.allowHashBang||(t.allowHashBang=t.ecmaVersion>=14),Ar(t.onToken)){var r=t.onToken;t.onToken=e=>r.push(e)}return Ar(t.onComment)&&(t.onComment=Ba(t,t.onComment)),t}function Ba(e,t){return function(i,r,n,s,a,o){var c={type:i?"Block":"Line",value:r,start:n,end:s};e.locations&&(c.loc=new rt(this,a,o)),e.ranges&&(c.range=[n,s]),t.push(c)}}var Ie=1,ve=2,zt=4,Vr=8,Fr=16,Br=32,Kt=64,$r=128,Ne=256,Xt=Ie|ve|Ne;function Qt(e,t){return ve|(e?zt:0)|(t?Vr:0)}var et=0,Yt=1,le=2,jr=3,Ur=4,Hr=5,T=function(e,t,i){this.options=e=Fa(e),this.sourceFile=e.sourceFile,this.keywords=pe(Ra[e.ecmaVersion>=6?6:"module"===e.sourceType?"5module":5]);var r="";!0!==e.allowReserved&&(r=$t[e.ecmaVersion>=6?6:5===e.ecmaVersion?5:3],"module"===e.sourceType&&(r+=" await")),this.reservedWords=pe(r);var n=(r?r+" ":"")+$t.strict;this.reservedWordsStrict=pe(n),this.reservedWordsStrictBind=pe(n+" "+$t.strictBind),this.input=String(t),this.containsEsc=!1,i?(this.pos=i,this.lineStart=this.input.lastIndexOf("\n",i-1)+1,this.curLine=this.input.slice(0,this.lineStart).split(Y).length):(this.pos=this.lineStart=0,this.curLine=1),this.type=u.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=this.initialContext(),this.exprAllowed=!0,this.inModule="module"===e.sourceType,this.strict=this.inModule||this.strictDirective(this.pos),this.potentialArrowAt=-1,this.potentialArrowInForAwait=!1,this.yieldPos=this.awaitPos=this.awaitIdentPos=0,this.labels=[],this.undefinedExports=Object.create(null),0===this.pos&&e.allowHashBang&&"#!"===this.input.slice(0,2)&&this.skipLineComment(2),this.scopeStack=[],this.enterScope(Ie),this.regexpState=null,this.privateNameStack=[]},ie={inFunction:{configurable:!0},inGenerator:{configurable:!0},inAsync:{configurable:!0},canAwait:{configurable:!0},allowSuper:{configurable:!0},allowDirectSuper:{configurable:!0},treatFunctionsAsVar:{configurable:!0},allowNewDotTarget:{configurable:!0},inClassStaticBlock:{configurable:!0}};T.prototype.parse=function(){var e=this.options.program||this.startNode();return this.nextToken(),this.parseTopLevel(e)},ie.inFunction.get=function(){return(this.currentVarScope().flags&ve)>0},ie.inGenerator.get=function(){return(this.currentVarScope().flags&Vr)>0&&!this.currentVarScope().inClassFieldInit},ie.inAsync.get=function(){return(this.currentVarScope().flags&zt)>0&&!this.currentVarScope().inClassFieldInit},ie.canAwait.get=function(){for(var e=this.scopeStack.length-1;e>=0;e--){var t=this.scopeStack[e];if(t.inClassFieldInit||t.flags&Ne)return!1;if(t.flags&ve)return(t.flags&zt)>0}return this.inModule&&this.options.ecmaVersion>=13||this.options.allowAwaitOutsideFunction},ie.allowSuper.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&Kt)>0||i||this.options.allowSuperOutsideMethod},ie.allowDirectSuper.get=function(){return(this.currentThisScope().flags&$r)>0},ie.treatFunctionsAsVar.get=function(){return this.treatFunctionsAsVarInScope(this.currentScope())},ie.allowNewDotTarget.get=function(){var e=this.currentThisScope(),t=e.flags,i=e.inClassFieldInit;return(t&(ve|Ne))>0||i},ie.inClassStaticBlock.get=function(){return(this.currentVarScope().flags&Ne)>0},T.extend=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var i=this,r=0;r=,?^&]/.test(n)||"!"===n&&"="===this.input.charAt(r+1))}e+=t[0].length,X.lastIndex=e,e+=X.exec(this.input)[0].length,";"===this.input[e]&&e++}},$.eat=function(e){return this.type===e&&(this.next(),!0)},$.isContextual=function(e){return this.type===u.name&&this.value===e&&!this.containsEsc},$.eatContextual=function(e){return!!this.isContextual(e)&&(this.next(),!0)},$.expectContextual=function(e){this.eatContextual(e)||this.unexpected()},$.canInsertSemicolon=function(){return this.type===u.eof||this.type===u.braceR||Y.test(this.input.slice(this.lastTokEnd,this.start))},$.insertSemicolon=function(){if(this.canInsertSemicolon())return this.options.onInsertedSemicolon&&this.options.onInsertedSemicolon(this.lastTokEnd,this.lastTokEndLoc),!0},$.semicolon=function(){this.eat(u.semi)||this.insertSemicolon()||this.unexpected()},$.afterTrailingComma=function(e,t){if(this.type===e)return this.options.onTrailingComma&&this.options.onTrailingComma(this.lastTokStart,this.lastTokStartLoc),t||this.next(),!0},$.expect=function(e){this.eat(e)||this.unexpected()},$.unexpected=function(e){this.raise(e??this.start,"Unexpected token")};var nt=function(){this.shorthandAssign=this.trailingComma=this.parenthesizedAssign=this.parenthesizedBind=this.doubleProto=-1};$.checkPatternErrors=function(e,t){if(e){e.trailingComma>-1&&this.raiseRecoverable(e.trailingComma,"Comma is not permitted after the rest element");var i=t?e.parenthesizedAssign:e.parenthesizedBind;i>-1&&this.raiseRecoverable(i,t?"Assigning to rvalue":"Parenthesized pattern")}},$.checkExpressionErrors=function(e,t){if(!e)return!1;var i=e.shorthandAssign,r=e.doubleProto;if(!t)return i>=0||r>=0;i>=0&&this.raise(i,"Shorthand property assignments are valid only in destructuring patterns"),r>=0&&this.raiseRecoverable(r,"Redefinition of __proto__ property")},$.checkYieldAwaitInDefaultParams=function(){this.yieldPos&&(!this.awaitPos||this.yieldPos55295&&r<56320)return!0;if(ce(r,!0)){for(var n=i+1;be(r=this.input.charCodeAt(n),!0);)++n;if(92===r||r>55295&&r<56320)return!0;var s=this.input.slice(i,n);if(!Ia.test(s))return!0}return!1},w.isAsyncFunction=function(){if(this.options.ecmaVersion<8||!this.isContextual("async"))return!1;X.lastIndex=this.pos;var e,t=X.exec(this.input),i=this.pos+t[0].length;return!(Y.test(this.input.slice(this.pos,i))||"function"!==this.input.slice(i,i+8)||i+8!==this.input.length&&(be(e=this.input.charCodeAt(i+8))||e>55295&&e<56320))},w.parseStatement=function(e,t,i){var r,n=this.type,s=this.startNode();switch(this.isLet(e)&&(n=u._var,r="let"),n){case u._break:case u._continue:return this.parseBreakContinueStatement(s,n.keyword);case u._debugger:return this.parseDebuggerStatement(s);case u._do:return this.parseDoStatement(s);case u._for:return this.parseForStatement(s);case u._function:return e&&(this.strict||"if"!==e&&"label"!==e)&&this.options.ecmaVersion>=6&&this.unexpected(),this.parseFunctionStatement(s,!1,!e);case u._class:return e&&this.unexpected(),this.parseClass(s,!0);case u._if:return this.parseIfStatement(s);case u._return:return this.parseReturnStatement(s);case u._switch:return this.parseSwitchStatement(s);case u._throw:return this.parseThrowStatement(s);case u._try:return this.parseTryStatement(s);case u._const:case u._var:return r=r||this.value,e&&"var"!==r&&this.unexpected(),this.parseVarStatement(s,r);case u._while:return this.parseWhileStatement(s);case u._with:return this.parseWithStatement(s);case u.braceL:return this.parseBlock(!0,s);case u.semi:return this.parseEmptyStatement(s);case u._export:case u._import:if(this.options.ecmaVersion>10&&n===u._import){X.lastIndex=this.pos;var a=X.exec(this.input),o=this.pos+a[0].length,c=this.input.charCodeAt(o);if(40===c||46===c)return this.parseExpressionStatement(s,this.parseExpression())}return this.options.allowImportExportEverywhere||(t||this.raise(this.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'")),n===u._import?this.parseImport(s):this.parseExport(s,i);default:if(this.isAsyncFunction())return e&&this.unexpected(),this.next(),this.parseFunctionStatement(s,!0,!e);var l=this.value,p=this.parseExpression();return n===u.name&&"Identifier"===p.type&&this.eat(u.colon)?this.parseLabeledStatement(s,l,p,e):this.parseExpressionStatement(s,p)}},w.parseBreakContinueStatement=function(e,t){var i="break"===t;this.next(),this.eat(u.semi)||this.insertSemicolon()?e.label=null:this.type!==u.name?this.unexpected():(e.label=this.parseIdent(),this.semicolon());for(var r=0;r=6?this.eat(u.semi):this.semicolon(),this.finishNode(e,"DoWhileStatement")},w.parseForStatement=function(e){this.next();var t=this.options.ecmaVersion>=9&&this.canAwait&&this.eatContextual("await")?this.lastTokStart:-1;if(this.labels.push(Jt),this.enterScope(0),this.expect(u.parenL),this.type===u.semi)return t>-1&&this.unexpected(t),this.parseFor(e,null);var i=this.isLet();if(this.type===u._var||this.type===u._const||i){var r=this.startNode(),n=i?"let":this.value;return this.next(),this.parseVar(r,!0,n),this.finishNode(r,"VariableDeclaration"),(this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of"))&&1===r.declarations.length?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),this.parseForIn(e,r)):(t>-1&&this.unexpected(t),this.parseFor(e,r))}var s=this.isContextual("let"),a=!1,o=new nt,c=this.parseExpression(!(t>-1)||"await",o);return this.type===u._in||(a=this.options.ecmaVersion>=6&&this.isContextual("of"))?(this.options.ecmaVersion>=9&&(this.type===u._in?t>-1&&this.unexpected(t):e.await=t>-1),s&&a&&this.raise(c.start,"The left-hand side of a for-of loop may not start with 'let'."),this.toAssignable(c,!1,o),this.checkLValPattern(c),this.parseForIn(e,c)):(this.checkExpressionErrors(o,!0),t>-1&&this.unexpected(t),this.parseFor(e,c))},w.parseFunctionStatement=function(e,t,i){return this.next(),this.parseFunction(e,Pe|(i?0:qt),!1,t)},w.parseIfStatement=function(e){return this.next(),e.test=this.parseParenExpression(),e.consequent=this.parseStatement("if"),e.alternate=this.eat(u._else)?this.parseStatement("if"):null,this.finishNode(e,"IfStatement")},w.parseReturnStatement=function(e){return this.inFunction||this.options.allowReturnOutsideFunction||this.raise(this.start,"'return' outside of function"),this.next(),this.eat(u.semi)||this.insertSemicolon()?e.argument=null:(e.argument=this.parseExpression(),this.semicolon()),this.finishNode(e,"ReturnStatement")},w.parseSwitchStatement=function(e){this.next(),e.discriminant=this.parseParenExpression(),e.cases=[],this.expect(u.braceL),this.labels.push(ja),this.enterScope(0);for(var t,i=!1;this.type!==u.braceR;)if(this.type===u._case||this.type===u._default){var r=this.type===u._case;t&&this.finishNode(t,"SwitchCase"),e.cases.push(t=this.startNode()),t.consequent=[],this.next(),r?t.test=this.parseExpression():(i&&this.raiseRecoverable(this.lastTokStart,"Multiple default clauses"),i=!0,t.test=null),this.expect(u.colon)}else t||this.unexpected(),t.consequent.push(this.parseStatement(null));return this.exitScope(),t&&this.finishNode(t,"SwitchCase"),this.next(),this.labels.pop(),this.finishNode(e,"SwitchStatement")},w.parseThrowStatement=function(e){return this.next(),Y.test(this.input.slice(this.lastTokEnd,this.start))&&this.raise(this.lastTokEnd,"Illegal newline after throw"),e.argument=this.parseExpression(),this.semicolon(),this.finishNode(e,"ThrowStatement")};var Ua=[];w.parseCatchClauseParam=function(){var e=this.parseBindingAtom(),t="Identifier"===e.type;return this.enterScope(t?Br:0),this.checkLValPattern(e,t?Ur:le),this.expect(u.parenR),e},w.parseTryStatement=function(e){if(this.next(),e.block=this.parseBlock(),e.handler=null,this.type===u._catch){var t=this.startNode();this.next(),this.eat(u.parenL)?t.param=this.parseCatchClauseParam():(this.options.ecmaVersion<10&&this.unexpected(),t.param=null,this.enterScope(0)),t.body=this.parseBlock(!1),this.exitScope(),e.handler=this.finishNode(t,"CatchClause")}return e.finalizer=this.eat(u._finally)?this.parseBlock():null,e.handler||e.finalizer||this.raise(e.start,"Missing catch or finally clause"),this.finishNode(e,"TryStatement")},w.parseVarStatement=function(e,t,i){return this.next(),this.parseVar(e,!1,t,i),this.semicolon(),this.finishNode(e,"VariableDeclaration")},w.parseWhileStatement=function(e){return this.next(),e.test=this.parseParenExpression(),this.labels.push(Jt),e.body=this.parseStatement("while"),this.labels.pop(),this.finishNode(e,"WhileStatement")},w.parseWithStatement=function(e){return this.strict&&this.raise(this.start,"'with' in strict mode"),this.next(),e.object=this.parseParenExpression(),e.body=this.parseStatement("with"),this.finishNode(e,"WithStatement")},w.parseEmptyStatement=function(e){return this.next(),this.finishNode(e,"EmptyStatement")},w.parseLabeledStatement=function(e,t,i,r){for(var n=0,s=this.labels;n=0;o--){var c=this.labels[o];if(c.statementStart!==e.start)break;c.statementStart=this.start,c.kind=a}return this.labels.push({name:t,kind:a,statementStart:this.start}),e.body=this.parseStatement(r?-1===r.indexOf("label")?r+"label":r:"label"),this.labels.pop(),e.label=i,this.finishNode(e,"LabeledStatement")},w.parseExpressionStatement=function(e,t){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},w.parseBlock=function(e,t,i){for(void 0===e&&(e=!0),void 0===t&&(t=this.startNode()),t.body=[],this.expect(u.braceL),e&&this.enterScope(0);this.type!==u.braceR;){var r=this.parseStatement(null);t.body.push(r)}return i&&(this.strict=!1),this.next(),e&&this.exitScope(),this.finishNode(t,"BlockStatement")},w.parseFor=function(e,t){return e.init=t,this.expect(u.semi),e.test=this.type===u.semi?null:this.parseExpression(),this.expect(u.semi),e.update=this.type===u.parenR?null:this.parseExpression(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,"ForStatement")},w.parseForIn=function(e,t){var i=this.type===u._in;return this.next(),"VariableDeclaration"===t.type&&null!=t.declarations[0].init&&(!i||this.options.ecmaVersion<8||this.strict||"var"!==t.kind||"Identifier"!==t.declarations[0].id.type)&&this.raise(t.start,(i?"for-in":"for-of")+" loop variable declaration may not have an initializer"),e.left=t,e.right=i?this.parseExpression():this.parseMaybeAssign(),this.expect(u.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,i?"ForInStatement":"ForOfStatement")},w.parseVar=function(e,t,i,r){for(e.declarations=[],e.kind=i;;){var n=this.startNode();if(this.parseVarId(n,i),this.eat(u.eq)?n.init=this.parseMaybeAssign(t):r||"const"!==i||this.type===u._in||this.options.ecmaVersion>=6&&this.isContextual("of")?r||"Identifier"===n.id.type||t&&(this.type===u._in||this.isContextual("of"))?n.init=null:this.raise(this.lastTokEnd,"Complex binding patterns require an initialization value"):this.unexpected(),e.declarations.push(this.finishNode(n,"VariableDeclarator")),!this.eat(u.comma))break}return e},w.parseVarId=function(e,t){e.id=this.parseBindingAtom(),this.checkLValPattern(e.id,"var"===t?Yt:le,!1)};var Pe=1,qt=2,Wr=4;function Ha(e,t){var i=t.key.name,r=e[i],n="true";return"MethodDefinition"===t.type&&("get"===t.kind||"set"===t.kind)&&(n=(t.static?"s":"i")+t.kind),"iget"===r&&"iset"===n||"iset"===r&&"iget"===n||"sget"===r&&"sset"===n||"sset"===r&&"sget"===n?(e[i]="true",!1):!!r||(e[i]=n,!1)}function tt(e,t){var i=e.computed,r=e.key;return!i&&("Identifier"===r.type&&r.name===t||"Literal"===r.type&&r.value===t)}w.parseFunction=function(e,t,i,r,n){this.initFunction(e),(this.options.ecmaVersion>=9||this.options.ecmaVersion>=6&&!r)&&(this.type===u.star&&t&qt&&this.unexpected(),e.generator=this.eat(u.star)),this.options.ecmaVersion>=8&&(e.async=!!r),t&Pe&&(e.id=t&Wr&&this.type!==u.name?null:this.parseIdent(),e.id&&!(t&qt)&&this.checkLValSimple(e.id,this.strict||e.generator||e.async?this.treatFunctionsAsVar?Yt:le:jr));var s=this.yieldPos,a=this.awaitPos,o=this.awaitIdentPos;return this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(e.async,e.generator)),t&Pe||(e.id=this.type===u.name?this.parseIdent():null),this.parseFunctionParams(e),this.parseFunctionBody(e,i,!1,n),this.yieldPos=s,this.awaitPos=a,this.awaitIdentPos=o,this.finishNode(e,t&Pe?"FunctionDeclaration":"FunctionExpression")},w.parseFunctionParams=function(e){this.expect(u.parenL),e.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams()},w.parseClass=function(e,t){this.next();var i=this.strict;this.strict=!0,this.parseClassId(e,t),this.parseClassSuper(e);var r=this.enterClassBody(),n=this.startNode(),s=!1;for(n.body=[],this.expect(u.braceL);this.type!==u.braceR;){var a=this.parseClassElement(null!==e.superClass);a&&(n.body.push(a),"MethodDefinition"===a.type&&"constructor"===a.kind?(s&&this.raiseRecoverable(a.start,"Duplicate constructor in the same class"),s=!0):a.key&&"PrivateIdentifier"===a.key.type&&Ha(r,a)&&this.raiseRecoverable(a.key.start,"Identifier '#"+a.key.name+"' has already been declared"))}return this.strict=i,this.next(),e.body=this.finishNode(n,"ClassBody"),this.exitClassBody(),this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},w.parseClassElement=function(e){if(this.eat(u.semi))return null;var t=this.options.ecmaVersion,i=this.startNode(),r="",n=!1,s=!1,a="method",o=!1;if(this.eatContextual("static")){if(t>=13&&this.eat(u.braceL))return this.parseClassStaticBlock(i),i;this.isClassElementNameStart()||this.type===u.star?o=!0:r="static"}if(i.static=o,!r&&t>=8&&this.eatContextual("async")&&(!this.isClassElementNameStart()&&this.type!==u.star||this.canInsertSemicolon()?r="async":s=!0),!r&&(t>=9||!s)&&this.eat(u.star)&&(n=!0),!r&&!s&&!n){var c=this.value;(this.eatContextual("get")||this.eatContextual("set"))&&(this.isClassElementNameStart()?a=c:r=c)}if(r?(i.computed=!1,i.key=this.startNodeAt(this.lastTokStart,this.lastTokStartLoc),i.key.name=r,this.finishNode(i.key,"Identifier")):this.parseClassElementName(i),t<13||this.type===u.parenL||"method"!==a||n||s){var l=!i.static&&tt(i,"constructor");l&&"method"!==a&&this.raise(i.key.start,"Constructor can't have get/set modifier"),i.kind=l?"constructor":a,this.parseClassMethod(i,n,s,l&&e)}else this.parseClassField(i);return i},w.isClassElementNameStart=function(){return this.type===u.name||this.type===u.privateId||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword},w.parseClassElementName=function(e){this.type===u.privateId?("constructor"===this.value&&this.raise(this.start,"Classes can't have an element named '#constructor'"),e.computed=!1,e.key=this.parsePrivateIdent()):this.parsePropertyName(e)},w.parseClassMethod=function(e,t,i,r){var n=e.key;"constructor"===e.kind?(t&&this.raise(n.start,"Constructor can't be a generator"),i&&this.raise(n.start,"Constructor can't be an async method")):e.static&&tt(e,"prototype")&&this.raise(n.start,"Classes may not have a static property named prototype");var s=e.value=this.parseMethod(t,i,r);return"get"===e.kind&&0!==s.params.length&&this.raiseRecoverable(s.start,"getter should have no params"),"set"===e.kind&&1!==s.params.length&&this.raiseRecoverable(s.start,"setter should have exactly one param"),"set"===e.kind&&"RestElement"===s.params[0].type&&this.raiseRecoverable(s.params[0].start,"Setter cannot use rest params"),this.finishNode(e,"MethodDefinition")},w.parseClassField=function(e){if(tt(e,"constructor")?this.raise(e.key.start,"Classes can't have a field named 'constructor'"):e.static&&tt(e,"prototype")&&this.raise(e.key.start,"Classes can't have a static field named 'prototype'"),this.eat(u.eq)){var t=this.currentThisScope(),i=t.inClassFieldInit;t.inClassFieldInit=!0,e.value=this.parseMaybeAssign(),t.inClassFieldInit=i}else e.value=null;return this.semicolon(),this.finishNode(e,"PropertyDefinition")},w.parseClassStaticBlock=function(e){e.body=[];var t=this.labels;for(this.labels=[],this.enterScope(Ne|Kt);this.type!==u.braceR;){var i=this.parseStatement(null);e.body.push(i)}return this.next(),this.exitScope(),this.labels=t,this.finishNode(e,"StaticBlock")},w.parseClassId=function(e,t){this.type===u.name?(e.id=this.parseIdent(),t&&this.checkLValSimple(e.id,le,!1)):(!0===t&&this.unexpected(),e.id=null)},w.parseClassSuper=function(e){e.superClass=this.eat(u._extends)?this.parseExprSubscripts(null,!1):null},w.enterClassBody=function(){var e={declared:Object.create(null),used:[]};return this.privateNameStack.push(e),e.declared},w.exitClassBody=function(){var e=this.privateNameStack.pop(),t=e.declared,i=e.used;if(this.options.checkPrivateFields)for(var r=this.privateNameStack.length,n=0===r?null:this.privateNameStack[r-1],s=0;s=11&&(this.eatContextual("as")?(e.exported=this.parseModuleExportName(),this.checkExport(t,e.exported,this.lastTokStart)):e.exported=null),this.expectContextual("from"),this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom(),this.semicolon(),this.finishNode(e,"ExportAllDeclaration")},w.parseExport=function(e,t){if(this.next(),this.eat(u.star))return this.parseExportAllDeclaration(e,t);if(this.eat(u._default))return this.checkExport(t,"default",this.lastTokStart),e.declaration=this.parseExportDefaultDeclaration(),this.finishNode(e,"ExportDefaultDeclaration");if(this.shouldParseExportStatement())e.declaration=this.parseExportDeclaration(e),"VariableDeclaration"===e.declaration.type?this.checkVariableExport(t,e.declaration.declarations):this.checkExport(t,e.declaration.id,e.declaration.id.start),e.specifiers=[],e.source=null;else{if(e.declaration=null,e.specifiers=this.parseExportSpecifiers(t),this.eatContextual("from"))this.type!==u.string&&this.unexpected(),e.source=this.parseExprAtom();else{for(var i=0,r=e.specifiers;i=13&&this.type===u.string){var e=this.parseLiteral(this.value);return Va.test(e.value)&&this.raise(e.start,"An export name cannot include a lone surrogate."),e}return this.parseIdent(!0)},w.adaptDirectivePrologue=function(e){for(var t=0;t=5&&"ExpressionStatement"===e.type&&"Literal"===e.expression.type&&"string"==typeof e.expression.value&&('"'===this.input[e.start]||"'"===this.input[e.start])};var J=T.prototype;J.toAssignable=function(e,t,i){if(this.options.ecmaVersion>=6&&e)switch(e.type){case"Identifier":this.inAsync&&"await"===e.name&&this.raise(e.start,"Cannot use 'await' as identifier inside an async function");break;case"ObjectPattern":case"ArrayPattern":case"AssignmentPattern":case"RestElement":break;case"ObjectExpression":e.type="ObjectPattern",i&&this.checkPatternErrors(i,!0);for(var r=0,n=e.properties;r=8&&!o&&"async"===c.name&&!this.canInsertSemicolon()&&this.eat(u._function))return this.overrideContext(R.f_expr),this.parseFunction(this.startNodeAt(s,a),0,!1,!0,t);if(n&&!this.canInsertSemicolon()){if(this.eat(u.arrow))return this.parseArrowExpression(this.startNodeAt(s,a),[c],!1,t);if(this.options.ecmaVersion>=8&&"async"===c.name&&this.type===u.name&&!o&&(!this.potentialArrowInForAwait||"of"!==this.value||this.containsEsc))return c=this.parseIdent(!1),(this.canInsertSemicolon()||!this.eat(u.arrow))&&this.unexpected(),this.parseArrowExpression(this.startNodeAt(s,a),[c],!0,t)}return c;case u.regexp:var l=this.value;return(r=this.parseLiteral(l.value)).regex={pattern:l.pattern,flags:l.flags},r;case u.num:case u.string:return this.parseLiteral(this.value);case u._null:case u._true:case u._false:return(r=this.startNode()).value=this.type===u._null?null:this.type===u._true,r.raw=this.type.keyword,this.next(),this.finishNode(r,"Literal");case u.parenL:var p=this.start,h=this.parseParenAndDistinguishExpression(n,t);return e&&(e.parenthesizedAssign<0&&!this.isSimpleAssignTarget(h)&&(e.parenthesizedAssign=p),e.parenthesizedBind<0&&(e.parenthesizedBind=p)),h;case u.bracketL:return r=this.startNode(),this.next(),r.elements=this.parseExprList(u.bracketR,!0,!0,e),this.finishNode(r,"ArrayExpression");case u.braceL:return this.overrideContext(R.b_expr),this.parseObj(!1,e);case u._function:return r=this.startNode(),this.next(),this.parseFunction(r,0);case u._class:return this.parseClass(this.startNode(),!1);case u._new:return this.parseNew();case u.backQuote:return this.parseTemplate();case u._import:return this.options.ecmaVersion>=11?this.parseExprImport(i):this.unexpected();default:return this.parseExprAtomDefault()}},v.parseExprAtomDefault=function(){this.unexpected()},v.parseExprImport=function(e){var t=this.startNode();this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword import");var i=this.parseIdent(!0);return this.type!==u.parenL||e?this.type===u.dot?(t.meta=i,this.parseImportMeta(t)):void this.unexpected():this.parseDynamicImport(t)},v.parseDynamicImport=function(e){if(this.next(),e.source=this.parseMaybeAssign(),!this.eat(u.parenR)){var t=this.start;this.eat(u.comma)&&this.eat(u.parenR)?this.raiseRecoverable(t,"Trailing comma is not allowed in import()"):this.unexpected(t)}return this.finishNode(e,"ImportExpression")},v.parseImportMeta=function(e){this.next();var t=this.containsEsc;return e.property=this.parseIdent(!0),"meta"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for import is 'import.meta'"),t&&this.raiseRecoverable(e.start,"'import.meta' must not contain escaped characters"),"module"===this.options.sourceType||this.options.allowImportExportEverywhere||this.raiseRecoverable(e.start,"Cannot use 'import.meta' outside a module"),this.finishNode(e,"MetaProperty")},v.parseLiteral=function(e){var t=this.startNode();return t.value=e,t.raw=this.input.slice(this.start,this.end),110===t.raw.charCodeAt(t.raw.length-1)&&(t.bigint=t.raw.slice(0,-1).replace(/_/g,"")),this.next(),this.finishNode(t,"Literal")},v.parseParenExpression=function(){this.expect(u.parenL);var e=this.parseExpression();return this.expect(u.parenR),e},v.shouldParseArrow=function(e){return!this.canInsertSemicolon()},v.parseParenAndDistinguishExpression=function(e,t){var i,r=this.start,n=this.startLoc,s=this.options.ecmaVersion>=8;if(this.options.ecmaVersion>=6){this.next();var a,o=this.start,c=this.startLoc,l=[],p=!0,h=!1,d=new nt,m=this.yieldPos,f=this.awaitPos;for(this.yieldPos=0,this.awaitPos=0;this.type!==u.parenR;){if(p?p=!1:this.expect(u.comma),s&&this.afterTrailingComma(u.parenR,!0)){h=!0;break}if(this.type===u.ellipsis){a=this.start,l.push(this.parseParenItem(this.parseRestBinding())),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element");break}l.push(this.parseMaybeAssign(!1,d,this.parseParenItem))}var y=this.lastTokEnd,g=this.lastTokEndLoc;if(this.expect(u.parenR),e&&this.shouldParseArrow(l)&&this.eat(u.arrow))return this.checkPatternErrors(d,!1),this.checkYieldAwaitInDefaultParams(),this.yieldPos=m,this.awaitPos=f,this.parseParenArrowList(r,n,l,t);(!l.length||h)&&this.unexpected(this.lastTokStart),a&&this.unexpected(a),this.checkExpressionErrors(d,!0),this.yieldPos=m||this.yieldPos,this.awaitPos=f||this.awaitPos,l.length>1?((i=this.startNodeAt(o,c)).expressions=l,this.finishNodeAt(i,"SequenceExpression",y,g)):i=l[0]}else i=this.parseParenExpression();if(!this.options.preserveParens)return i;var _=this.startNodeAt(r,n);return _.expression=i,this.finishNode(_,"ParenthesizedExpression")},v.parseParenItem=e=>e,v.parseParenArrowList=function(e,t,i,r){return this.parseArrowExpression(this.startNodeAt(e,t),i,!1,r)};var Wa=[];v.parseNew=function(){this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword new");var e=this.startNode(),t=this.parseIdent(!0);if(this.options.ecmaVersion>=6&&this.eat(u.dot)){e.meta=t;var i=this.containsEsc;return e.property=this.parseIdent(!0),"target"!==e.property.name&&this.raiseRecoverable(e.property.start,"The only valid meta property for new is 'new.target'"),i&&this.raiseRecoverable(e.start,"'new.target' must not contain escaped characters"),this.allowNewDotTarget||this.raiseRecoverable(e.start,"'new.target' can only be used in functions and class static block"),this.finishNode(e,"MetaProperty")}var r=this.start,n=this.startLoc;return e.callee=this.parseSubscripts(this.parseExprAtom(null,!1,!0),r,n,!0,!1),this.eat(u.parenL)?e.arguments=this.parseExprList(u.parenR,this.options.ecmaVersion>=8,!1):e.arguments=Wa,this.finishNode(e,"NewExpression")},v.parseTemplateElement=function(e){var t=e.isTagged,i=this.startNode();return this.type===u.invalidTemplate?(t||this.raiseRecoverable(this.start,"Bad escape sequence in untagged template literal"),i.value={raw:this.value,cooked:null}):i.value={raw:this.input.slice(this.start,this.end).replace(/\r\n?/g,"\n"),cooked:this.value},this.next(),i.tail=this.type===u.backQuote,this.finishNode(i,"TemplateElement")},v.parseTemplate=function(e){void 0===e&&(e={});var t=e.isTagged;void 0===t&&(t=!1);var i=this.startNode();this.next(),i.expressions=[];var r=this.parseTemplateElement({isTagged:t});for(i.quasis=[r];!r.tail;)this.type===u.eof&&this.raise(this.pos,"Unterminated template literal"),this.expect(u.dollarBraceL),i.expressions.push(this.parseExpression()),this.expect(u.braceR),i.quasis.push(r=this.parseTemplateElement({isTagged:t}));return this.next(),this.finishNode(i,"TemplateLiteral")},v.isAsyncProp=function(e){return!e.computed&&"Identifier"===e.key.type&&"async"===e.key.name&&(this.type===u.name||this.type===u.num||this.type===u.string||this.type===u.bracketL||this.type.keyword||this.options.ecmaVersion>=9&&this.type===u.star)&&!Y.test(this.input.slice(this.lastTokEnd,this.start))},v.parseObj=function(e,t){var i=this.startNode(),r=!0,n={};for(i.properties=[],this.next();!this.eat(u.braceR);){if(r)r=!1;else if(this.expect(u.comma),this.options.ecmaVersion>=5&&this.afterTrailingComma(u.braceR))break;var s=this.parseProperty(e,t);e||this.checkPropClash(s,n,t),i.properties.push(s)}return this.finishNode(i,e?"ObjectPattern":"ObjectExpression")},v.parseProperty=function(e,t){var i,r,n,s,a=this.startNode();if(this.options.ecmaVersion>=9&&this.eat(u.ellipsis))return e?(a.argument=this.parseIdent(!1),this.type===u.comma&&this.raiseRecoverable(this.start,"Comma is not permitted after the rest element"),this.finishNode(a,"RestElement")):(a.argument=this.parseMaybeAssign(!1,t),this.type===u.comma&&t&&t.trailingComma<0&&(t.trailingComma=this.start),this.finishNode(a,"SpreadElement"));this.options.ecmaVersion>=6&&(a.method=!1,a.shorthand=!1,(e||t)&&(n=this.start,s=this.startLoc),e||(i=this.eat(u.star)));var o=this.containsEsc;return this.parsePropertyName(a),!e&&!o&&this.options.ecmaVersion>=8&&!i&&this.isAsyncProp(a)?(r=!0,i=this.options.ecmaVersion>=9&&this.eat(u.star),this.parsePropertyName(a)):r=!1,this.parsePropertyValue(a,e,i,r,n,s,t,o),this.finishNode(a,"Property")},v.parseGetterSetter=function(e){e.kind=e.key.name,this.parsePropertyName(e),e.value=this.parseMethod(!1);var t="get"===e.kind?0:1;if(e.value.params.length!==t){var i=e.value.start;"get"===e.kind?this.raiseRecoverable(i,"getter should have no params"):this.raiseRecoverable(i,"setter should have exactly one param")}else"set"===e.kind&&"RestElement"===e.value.params[0].type&&this.raiseRecoverable(e.value.params[0].start,"Setter cannot use rest params")},v.parsePropertyValue=function(e,t,i,r,n,s,a,o){(i||r)&&this.type===u.colon&&this.unexpected(),this.eat(u.colon)?(e.value=t?this.parseMaybeDefault(this.start,this.startLoc):this.parseMaybeAssign(!1,a),e.kind="init"):this.options.ecmaVersion>=6&&this.type===u.parenL?(t&&this.unexpected(),e.kind="init",e.method=!0,e.value=this.parseMethod(i,r)):t||o||!(this.options.ecmaVersion>=5)||e.computed||"Identifier"!==e.key.type||"get"!==e.key.name&&"set"!==e.key.name||this.type===u.comma||this.type===u.braceR||this.type===u.eq?this.options.ecmaVersion>=6&&!e.computed&&"Identifier"===e.key.type?((i||r)&&this.unexpected(),this.checkUnreserved(e.key),"await"!==e.key.name||this.awaitIdentPos||(this.awaitIdentPos=n),e.kind="init",t?e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key)):this.type===u.eq&&a?(a.shorthandAssign<0&&(a.shorthandAssign=this.start),e.value=this.parseMaybeDefault(n,s,this.copyNode(e.key))):e.value=this.copyNode(e.key),e.shorthand=!0):this.unexpected():((i||r)&&this.unexpected(),this.parseGetterSetter(e))},v.parsePropertyName=function(e){if(this.options.ecmaVersion>=6){if(this.eat(u.bracketL))return e.computed=!0,e.key=this.parseMaybeAssign(),this.expect(u.bracketR),e.key;e.computed=!1}return e.key=this.type===u.num||this.type===u.string?this.parseExprAtom():this.parseIdent("never"!==this.options.allowReserved)},v.initFunction=function(e){e.id=null,this.options.ecmaVersion>=6&&(e.generator=e.expression=!1),this.options.ecmaVersion>=8&&(e.async=!1)},v.parseMethod=function(e,t,i){var r=this.startNode(),n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.initFunction(r),this.options.ecmaVersion>=6&&(r.generator=e),this.options.ecmaVersion>=8&&(r.async=!!t),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Qt(t,r.generator)|Kt|(i?$r:0)),this.expect(u.parenL),r.params=this.parseBindingList(u.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams(),this.parseFunctionBody(r,!1,!0,!1),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(r,"FunctionExpression")},v.parseArrowExpression=function(e,t,i,r){var n=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.enterScope(Qt(i,!1)|Fr),this.initFunction(e),this.options.ecmaVersion>=8&&(e.async=!!i),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,e.params=this.toAssignableList(t,!0),this.parseFunctionBody(e,!0,!1,r),this.yieldPos=n,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(e,"ArrowFunctionExpression")},v.parseFunctionBody=function(e,t,i,r){var n=t&&this.type!==u.braceL,s=this.strict,a=!1;if(n)e.body=this.parseMaybeAssign(r),e.expression=!0,this.checkParams(e,!1);else{var o=this.options.ecmaVersion>=7&&!this.isSimpleParamList(e.params);(!s||o)&&(a=this.strictDirective(this.end))&&o&&this.raiseRecoverable(e.start,"Illegal 'use strict' directive in function with non-simple parameter list");var c=this.labels;this.labels=[],a&&(this.strict=!0),this.checkParams(e,!s&&!a&&!t&&!i&&this.isSimpleParamList(e.params)),this.strict&&e.id&&this.checkLValSimple(e.id,Hr),e.body=this.parseBlock(!1,void 0,a&&!s),e.expression=!1,this.adaptDirectivePrologue(e.body.body),this.labels=c}this.exitScope()},v.isSimpleParamList=e=>{for(var t=0,i=e;t-1||n.functions.indexOf(e)>-1||n.var.indexOf(e)>-1,n.lexical.push(e),this.inModule&&n.flags&Ie&&delete this.undefinedExports[e]}else if(t===Ur)this.currentScope().lexical.push(e);else if(t===jr){var s=this.currentScope();r=this.treatFunctionsAsVar?s.lexical.indexOf(e)>-1:s.lexical.indexOf(e)>-1||s.var.indexOf(e)>-1,s.functions.push(e)}else for(var a=this.scopeStack.length-1;a>=0;--a){var o=this.scopeStack[a];if(o.lexical.indexOf(e)>-1&&!(o.flags&Br&&o.lexical[0]===e)||!this.treatFunctionsAsVarInScope(o)&&o.functions.indexOf(e)>-1){r=!0;break}if(o.var.push(e),this.inModule&&o.flags&Ie&&delete this.undefinedExports[e],o.flags&Xt)break}r&&this.raiseRecoverable(i,"Identifier '"+e+"' has already been declared")},de.checkLocalExport=function(e){-1===this.scopeStack[0].lexical.indexOf(e.name)&&-1===this.scopeStack[0].var.indexOf(e.name)&&(this.undefinedExports[e.name]=e)},de.currentScope=function(){return this.scopeStack[this.scopeStack.length-1]},de.currentVarScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt)return t}},de.currentThisScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Xt&&!(t.flags&Fr))return t}};var at=function(e,t,i){this.type="",this.start=t,this.end=0,e.options.locations&&(this.loc=new rt(e,i)),e.options.directSourceFile&&(this.sourceFile=e.options.directSourceFile),e.options.ranges&&(this.range=[t,0])},Me=T.prototype;function Gr(e,t,i,r){return e.type=t,e.end=i,this.options.locations&&(e.loc.end=r),this.options.ranges&&(e.range[1]=i),e}Me.startNode=function(){return new at(this,this.start,this.startLoc)},Me.startNodeAt=function(e,t){return new at(this,e,t)},Me.finishNode=function(e,t){return Gr.call(this,e,t,this.lastTokEnd,this.lastTokEndLoc)},Me.finishNodeAt=function(e,t,i,r){return Gr.call(this,e,t,i,r)},Me.copyNode=function(e){var t=new at(this,e.start,this.startLoc);for(var i in e)t[i]=e[i];return t};var Ka,zr="ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS",Kr=zr+" Extended_Pictographic",Xr=Kr,Qr=Xr+" EBase EComp EMod EPres ExtPict",Yr=Qr,Ga=Yr,za={9:zr,10:Kr,11:Xr,12:Qr,13:Yr,14:Ga},Xa={9:"",10:"",11:"",12:"",13:"",14:"Basic_Emoji Emoji_Keycap_Sequence RGI_Emoji_Modifier_Sequence RGI_Emoji_Flag_Sequence RGI_Emoji_Tag_Sequence RGI_Emoji_ZWJ_Sequence RGI_Emoji"},Pr="Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu",Jr="Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb",Zr=Jr+" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd",en=Zr+" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho",tn=en+" Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi",rn=tn+" Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith",Qa=rn+" Hrkt Katakana_Or_Hiragana Kawi Nag_Mundari Nagm Unknown Zzzz",Ya={9:Jr,10:Zr,11:en,12:tn,13:rn,14:Qa},nn={};function Ja(e){var t=nn[e]={binary:pe(za[e]+" "+Pr),binaryOfStrings:pe(Xa[e]),nonBinary:{General_Category:pe(Pr),Script:pe(Ya[e])}};t.nonBinary.Script_Extensions=t.nonBinary.Script,t.nonBinary.gc=t.nonBinary.General_Category,t.nonBinary.sc=t.nonBinary.Script,t.nonBinary.scx=t.nonBinary.Script_Extensions}for(Ze=0,Ut=[9,10,11,12,13,14];Ze=6?"uy":"")+(e.options.ecmaVersion>=9?"s":"")+(e.options.ecmaVersion>=13?"d":"")+(e.options.ecmaVersion>=15?"v":""),this.unicodeProperties=nn[e.options.ecmaVersion>=14?14:e.options.ecmaVersion],this.source="",this.flags="",this.start=0,this.switchU=!1,this.switchV=!1,this.switchN=!1,this.pos=0,this.lastIntValue=0,this.lastStringValue="",this.lastAssertionIsQuantifiable=!1,this.numCapturingParens=0,this.maxBackReference=0,this.groupNames=[],this.backReferenceNames=[]};function an(e){return 36===e||e>=40&&e<=43||46===e||63===e||e>=91&&e<=94||e>=123&&e<=125}function Za(e){return ce(e,!0)||36===e||95===e}function es(e){return be(e,!0)||36===e||95===e||8204===e||8205===e}function sn(e){return e>=65&&e<=90||e>=97&&e<=122}function ts(e){return e>=0&&e<=1114111}re.prototype.reset=function(e,t,i){var r=-1!==i.indexOf("v"),n=-1!==i.indexOf("u");this.start=0|e,this.source=t+"",this.flags=i,r&&this.parser.options.ecmaVersion>=15?(this.switchU=!0,this.switchV=!0,this.switchN=!0):(this.switchU=n&&this.parser.options.ecmaVersion>=6,this.switchV=!1,this.switchN=n&&this.parser.options.ecmaVersion>=9)},re.prototype.raise=function(e){this.parser.raiseRecoverable(this.start,"Invalid regular expression: /"+this.source+"/: "+e)},re.prototype.at=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return-1;var n=i.charCodeAt(e);if(!t&&!this.switchU||n<=55295||n>=57344||e+1>=r)return n;var s=i.charCodeAt(e+1);return s>=56320&&s<=57343?(n<<10)+s-56613888:n},re.prototype.nextIndex=function(e,t){void 0===t&&(t=!1);var i=this.source,r=i.length;if(e>=r)return r;var n,s=i.charCodeAt(e);return!t&&!this.switchU||s<=55295||s>=57344||e+1>=r||(n=i.charCodeAt(e+1))<56320||n>57343?e+1:e+2},re.prototype.current=function(e){return void 0===e&&(e=!1),this.at(this.pos,e)},re.prototype.lookahead=function(e){return void 0===e&&(e=!1),this.at(this.nextIndex(this.pos,e),e)},re.prototype.advance=function(e){void 0===e&&(e=!1),this.pos=this.nextIndex(this.pos,e)},re.prototype.eat=function(e,t){return void 0===t&&(t=!1),this.current(t)===e&&(this.advance(t),!0)},re.prototype.eatChars=function(e,t){void 0===t&&(t=!1);for(var i=this.pos,r=0,n=e;r-1&&this.raise(e.start,"Duplicate regular expression flag"),"u"===a&&(r=!0),"v"===a&&(n=!0)}this.options.ecmaVersion>=15&&r&&n&&this.raise(e.start,"Invalid regular expression flag")},b.validateRegExpPattern=function(e){this.regexp_pattern(e),!e.switchN&&this.options.ecmaVersion>=9&&e.groupNames.length>0&&(e.switchN=!0,this.regexp_pattern(e))},b.regexp_pattern=function(e){e.pos=0,e.lastIntValue=0,e.lastStringValue="",e.lastAssertionIsQuantifiable=!1,e.numCapturingParens=0,e.maxBackReference=0,e.groupNames.length=0,e.backReferenceNames.length=0,this.regexp_disjunction(e),e.pos!==e.source.length&&(e.eat(41)&&e.raise("Unmatched ')'"),(e.eat(93)||e.eat(125))&&e.raise("Lone quantifier brackets")),e.maxBackReference>e.numCapturingParens&&e.raise("Invalid escape");for(var t=0,i=e.backReferenceNames;t=9&&(i=e.eat(60)),e.eat(61)||e.eat(33))return this.regexp_disjunction(e),e.eat(41)||e.raise("Unterminated group"),e.lastAssertionIsQuantifiable=!i,!0}return e.pos=t,!1},b.regexp_eatQuantifier=function(e,t){return void 0===t&&(t=!1),!!this.regexp_eatQuantifierPrefix(e,t)&&(e.eat(63),!0)},b.regexp_eatQuantifierPrefix=function(e,t){return e.eat(42)||e.eat(43)||e.eat(63)||this.regexp_eatBracedQuantifier(e,t)},b.regexp_eatBracedQuantifier=function(e,t){var i=e.pos;if(e.eat(123)){var r=0,n=-1;if(this.regexp_eatDecimalDigits(e)&&(r=e.lastIntValue,e.eat(44)&&this.regexp_eatDecimalDigits(e)&&(n=e.lastIntValue),e.eat(125)))return-1!==n&&n=9?this.regexp_groupSpecifier(e):63===e.current()&&e.raise("Invalid group"),this.regexp_disjunction(e),e.eat(41))return e.numCapturingParens+=1,!0;e.raise("Unterminated group")}return!1},b.regexp_eatExtendedAtom=function(e){return e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)||this.regexp_eatInvalidBracedQuantifier(e)||this.regexp_eatExtendedPatternCharacter(e)},b.regexp_eatInvalidBracedQuantifier=function(e){return this.regexp_eatBracedQuantifier(e,!0)&&e.raise("Nothing to repeat"),!1},b.regexp_eatSyntaxCharacter=e=>{var t=e.current();return!!an(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatPatternCharacters=e=>{for(var t=e.pos,i=0;-1!==(i=e.current())&&!an(i);)e.advance();return e.pos!==t},b.regexp_eatExtendedPatternCharacter=e=>{var t=e.current();return!(-1===t||36===t||t>=40&&t<=43||46===t||63===t||91===t||94===t||124===t||(e.advance(),0))},b.regexp_groupSpecifier=function(e){if(e.eat(63)){if(this.regexp_eatGroupName(e))return-1!==e.groupNames.indexOf(e.lastStringValue)&&e.raise("Duplicate capture group name"),void e.groupNames.push(e.lastStringValue);e.raise("Invalid group")}},b.regexp_eatGroupName=function(e){if(e.lastStringValue="",e.eat(60)){if(this.regexp_eatRegExpIdentifierName(e)&&e.eat(62))return!0;e.raise("Invalid capture group name")}return!1},b.regexp_eatRegExpIdentifierName=function(e){if(e.lastStringValue="",this.regexp_eatRegExpIdentifierStart(e)){for(e.lastStringValue+=fe(e.lastIntValue);this.regexp_eatRegExpIdentifierPart(e);)e.lastStringValue+=fe(e.lastIntValue);return!0}return!1},b.regexp_eatRegExpIdentifierStart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),Za(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatRegExpIdentifierPart=function(e){var t=e.pos,i=this.options.ecmaVersion>=11,r=e.current(i);return e.advance(i),92===r&&this.regexp_eatRegExpUnicodeEscapeSequence(e,i)&&(r=e.lastIntValue),es(r)?(e.lastIntValue=r,!0):(e.pos=t,!1)},b.regexp_eatAtomEscape=function(e){return!!(this.regexp_eatBackReference(e)||this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)||e.switchN&&this.regexp_eatKGroupName(e))||(e.switchU&&(99===e.current()&&e.raise("Invalid unicode escape"),e.raise("Invalid escape")),!1)},b.regexp_eatBackReference=function(e){var t=e.pos;if(this.regexp_eatDecimalEscape(e)){var i=e.lastIntValue;if(e.switchU)return i>e.maxBackReference&&(e.maxBackReference=i),!0;if(i<=e.numCapturingParens)return!0;e.pos=t}return!1},b.regexp_eatKGroupName=function(e){if(e.eat(107)){if(this.regexp_eatGroupName(e))return e.backReferenceNames.push(e.lastStringValue),!0;e.raise("Invalid named reference")}return!1},b.regexp_eatCharacterEscape=function(e){return this.regexp_eatControlEscape(e)||this.regexp_eatCControlLetter(e)||this.regexp_eatZero(e)||this.regexp_eatHexEscapeSequence(e)||this.regexp_eatRegExpUnicodeEscapeSequence(e,!1)||!e.switchU&&this.regexp_eatLegacyOctalEscapeSequence(e)||this.regexp_eatIdentityEscape(e)},b.regexp_eatCControlLetter=function(e){var t=e.pos;if(e.eat(99)){if(this.regexp_eatControlLetter(e))return!0;e.pos=t}return!1},b.regexp_eatZero=e=>!(48!==e.current()||st(e.lookahead())||(e.lastIntValue=0,e.advance(),0)),b.regexp_eatControlEscape=e=>{var t=e.current();return 116===t?(e.lastIntValue=9,e.advance(),!0):110===t?(e.lastIntValue=10,e.advance(),!0):118===t?(e.lastIntValue=11,e.advance(),!0):102===t?(e.lastIntValue=12,e.advance(),!0):114===t&&(e.lastIntValue=13,e.advance(),!0)},b.regexp_eatControlLetter=e=>{var t=e.current();return!!sn(t)&&(e.lastIntValue=t%32,e.advance(),!0)},b.regexp_eatRegExpUnicodeEscapeSequence=function(e,t){void 0===t&&(t=!1);var i=e.pos,r=t||e.switchU;if(e.eat(117)){if(this.regexp_eatFixedHexDigits(e,4)){var n=e.lastIntValue;if(r&&n>=55296&&n<=56319){var s=e.pos;if(e.eat(92)&&e.eat(117)&&this.regexp_eatFixedHexDigits(e,4)){var a=e.lastIntValue;if(a>=56320&&a<=57343)return e.lastIntValue=1024*(n-55296)+(a-56320)+65536,!0}e.pos=s,e.lastIntValue=n}return!0}if(r&&e.eat(123)&&this.regexp_eatHexDigits(e)&&e.eat(125)&&ts(e.lastIntValue))return!0;r&&e.raise("Invalid unicode escape"),e.pos=i}return!1},b.regexp_eatIdentityEscape=function(e){if(e.switchU)return!!this.regexp_eatSyntaxCharacter(e)||!!e.eat(47)&&(e.lastIntValue=47,!0);var t=e.current();return!(99===t||e.switchN&&107===t||(e.lastIntValue=t,e.advance(),0))},b.regexp_eatDecimalEscape=e=>{e.lastIntValue=0;var t=e.current();if(t>=49&&t<=57){do{e.lastIntValue=10*e.lastIntValue+(t-48),e.advance()}while((t=e.current())>=48&&t<=57);return!0}return!1};var on=0,ue=1,Q=2;function is(e){return 100===e||68===e||115===e||83===e||119===e||87===e}function cn(e){return sn(e)||95===e}function rs(e){return cn(e)||st(e)}function ns(e){return 33===e||e>=35&&e<=38||e>=42&&e<=44||46===e||e>=58&&e<=64||94===e||96===e||126===e}function as(e){return 40===e||41===e||45===e||47===e||e>=91&&e<=93||e>=123&&e<=125}function ss(e){return 33===e||35===e||37===e||38===e||44===e||45===e||e>=58&&e<=62||64===e||96===e||126===e}function st(e){return e>=48&&e<=57}function un(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function ln(e){return e>=65&&e<=70?e-65+10:e>=97&&e<=102?e-97+10:e-48}function hn(e){return e>=48&&e<=55}b.regexp_eatCharacterClassEscape=function(e){var t,i=e.current();if(is(i))return e.lastIntValue=-1,e.advance(),ue;var r=!1;if(e.switchU&&this.options.ecmaVersion>=9&&((r=80===i)||112===i)){if(e.lastIntValue=-1,e.advance(),e.eat(123)&&(t=this.regexp_eatUnicodePropertyValueExpression(e))&&e.eat(125))return r&&t===Q&&e.raise("Invalid property name"),t;e.raise("Invalid property name")}return on},b.regexp_eatUnicodePropertyValueExpression=function(e){var t=e.pos;if(this.regexp_eatUnicodePropertyName(e)&&e.eat(61)){var i=e.lastStringValue;if(this.regexp_eatUnicodePropertyValue(e)){var r=e.lastStringValue;return this.regexp_validateUnicodePropertyNameAndValue(e,i,r),ue}}if(e.pos=t,this.regexp_eatLoneUnicodePropertyNameOrValue(e)){var n=e.lastStringValue;return this.regexp_validateUnicodePropertyNameOrValue(e,n)}return on},b.regexp_validateUnicodePropertyNameAndValue=(e,t,i)=>{Te(e.unicodeProperties.nonBinary,t)||e.raise("Invalid property name"),e.unicodeProperties.nonBinary[t].test(i)||e.raise("Invalid property value")},b.regexp_validateUnicodePropertyNameOrValue=(e,t)=>e.unicodeProperties.binary.test(t)?ue:e.switchV&&e.unicodeProperties.binaryOfStrings.test(t)?Q:void e.raise("Invalid property name"),b.regexp_eatUnicodePropertyName=e=>{var t=0;for(e.lastStringValue="";cn(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatUnicodePropertyValue=e=>{var t=0;for(e.lastStringValue="";rs(t=e.current());)e.lastStringValue+=fe(t),e.advance();return""!==e.lastStringValue},b.regexp_eatLoneUnicodePropertyNameOrValue=function(e){return this.regexp_eatUnicodePropertyValue(e)},b.regexp_eatCharacterClass=function(e){if(e.eat(91)){var t=e.eat(94),i=this.regexp_classContents(e);return e.eat(93)||e.raise("Unterminated character class"),t&&i===Q&&e.raise("Negated character class may contain strings"),!0}return!1},b.regexp_classContents=function(e){return 93===e.current()?ue:e.switchV?this.regexp_classSetExpression(e):(this.regexp_nonEmptyClassRanges(e),ue)},b.regexp_nonEmptyClassRanges=function(e){for(;this.regexp_eatClassAtom(e);){var t=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassAtom(e)){var i=e.lastIntValue;e.switchU&&(-1===t||-1===i)&&e.raise("Invalid character class"),-1!==t&&-1!==i&&t>i&&e.raise("Range out of order in character class")}}},b.regexp_eatClassAtom=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatClassEscape(e))return!0;if(e.switchU){var i=e.current();(99===i||hn(i))&&e.raise("Invalid class escape"),e.raise("Invalid escape")}e.pos=t}var r=e.current();return 93!==r&&(e.lastIntValue=r,e.advance(),!0)},b.regexp_eatClassEscape=function(e){var t=e.pos;if(e.eat(98))return e.lastIntValue=8,!0;if(e.switchU&&e.eat(45))return e.lastIntValue=45,!0;if(!e.switchU&&e.eat(99)){if(this.regexp_eatClassControlLetter(e))return!0;e.pos=t}return this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)},b.regexp_classSetExpression=function(e){var t,i=ue;if(!this.regexp_eatClassSetRange(e))if(t=this.regexp_eatClassSetOperand(e)){t===Q&&(i=Q);for(var r=e.pos;e.eatChars([38,38]);)38!==e.current()&&(t=this.regexp_eatClassSetOperand(e))?t!==Q&&(i=ue):e.raise("Invalid character in character class");if(r!==e.pos)return i;for(;e.eatChars([45,45]);)this.regexp_eatClassSetOperand(e)||e.raise("Invalid character in character class");if(r!==e.pos)return i}else e.raise("Invalid character in character class");for(;;)if(!this.regexp_eatClassSetRange(e)){if(!(t=this.regexp_eatClassSetOperand(e)))return i;t===Q&&(i=Q)}},b.regexp_eatClassSetRange=function(e){var t=e.pos;if(this.regexp_eatClassSetCharacter(e)){var i=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassSetCharacter(e)){var r=e.lastIntValue;return-1!==i&&-1!==r&&i>r&&e.raise("Range out of order in character class"),!0}e.pos=t}return!1},b.regexp_eatClassSetOperand=function(e){return this.regexp_eatClassSetCharacter(e)?ue:this.regexp_eatClassStringDisjunction(e)||this.regexp_eatNestedClass(e)},b.regexp_eatNestedClass=function(e){var t=e.pos;if(e.eat(91)){var i=e.eat(94),r=this.regexp_classContents(e);if(e.eat(93))return i&&r===Q&&e.raise("Negated character class may contain strings"),r;e.pos=t}if(e.eat(92)){var n=this.regexp_eatCharacterClassEscape(e);if(n)return n;e.pos=t}return null},b.regexp_eatClassStringDisjunction=function(e){var t=e.pos;if(e.eatChars([92,113])){if(e.eat(123)){var i=this.regexp_classStringDisjunctionContents(e);if(e.eat(125))return i}else e.raise("Invalid escape");e.pos=t}return null},b.regexp_classStringDisjunctionContents=function(e){for(var t=this.regexp_classString(e);e.eat(124);)this.regexp_classString(e)===Q&&(t=Q);return t},b.regexp_classString=function(e){for(var t=0;this.regexp_eatClassSetCharacter(e);)t++;return 1===t?ue:Q},b.regexp_eatClassSetCharacter=function(e){var t=e.pos;if(e.eat(92))return!(!this.regexp_eatCharacterEscape(e)&&!this.regexp_eatClassSetReservedPunctuator(e)&&(e.eat(98)?(e.lastIntValue=8,0):(e.pos=t,1)));var i=e.current();return!(i<0||i===e.lookahead()&&ns(i)||as(i)||(e.advance(),e.lastIntValue=i,0))},b.regexp_eatClassSetReservedPunctuator=e=>{var t=e.current();return!!ss(t)&&(e.lastIntValue=t,e.advance(),!0)},b.regexp_eatClassControlLetter=e=>{var t=e.current();return!(!st(t)&&95!==t||(e.lastIntValue=t%32,e.advance(),0))},b.regexp_eatHexEscapeSequence=function(e){var t=e.pos;if(e.eat(120)){if(this.regexp_eatFixedHexDigits(e,2))return!0;e.switchU&&e.raise("Invalid escape"),e.pos=t}return!1},b.regexp_eatDecimalDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;st(i=e.current());)e.lastIntValue=10*e.lastIntValue+(i-48),e.advance();return e.pos!==t},b.regexp_eatHexDigits=e=>{var t=e.pos,i=0;for(e.lastIntValue=0;un(i=e.current());)e.lastIntValue=16*e.lastIntValue+ln(i),e.advance();return e.pos!==t},b.regexp_eatLegacyOctalEscapeSequence=function(e){if(this.regexp_eatOctalDigit(e)){var t=e.lastIntValue;if(this.regexp_eatOctalDigit(e)){var i=e.lastIntValue;t<=3&&this.regexp_eatOctalDigit(e)?e.lastIntValue=64*t+8*i+e.lastIntValue:e.lastIntValue=8*t+i}else e.lastIntValue=t;return!0}return!1},b.regexp_eatOctalDigit=e=>{var t=e.current();return hn(t)?(e.lastIntValue=t-48,e.advance(),!0):(e.lastIntValue=0,!1)},b.regexp_eatFixedHexDigits=(e,t)=>{var i=e.pos;e.lastIntValue=0;for(var r=0;rtypeof Symbol&&(C[Symbol.iterator]=function(){return{next:()=>{var e=this.getToken();return{done:e.type===u.eof,value:e}}}}),C.nextToken=function(){var e=this.curContext();return e&&e.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length?this.finishToken(u.eof):e.override?e.override(this):void this.readToken(this.fullCharCodeAtPos())},C.readToken=function(e){return ce(e,this.options.ecmaVersion>=6)||92===e?this.readWord():this.getTokenFromCode(e)},C.fullCharCodeAtPos=function(){var e=this.input.charCodeAt(this.pos);if(e<=55295||e>=56320)return e;var t=this.input.charCodeAt(this.pos+1);return t<=56319||t>=57344?e:(e<<10)+t-56613888},C.skipBlockComment=function(){var e=this.options.onComment&&this.curPosition(),t=this.pos,i=this.input.indexOf("*/",this.pos+=2);if(-1===i&&this.raise(this.pos-2,"Unterminated comment"),this.pos=i+2,this.options.locations)for(var r=void 0,n=t;(r=Nr(this.input,n,this.pos))>-1;)++this.curLine,n=this.lineStart=r;this.options.onComment&&this.options.onComment(!0,this.input.slice(t+2,i),t,this.pos,e,this.curPosition())},C.skipLineComment=function(e){for(var t=this.pos,i=this.options.onComment&&this.curPosition(),r=this.input.charCodeAt(this.pos+=e);this.pos8&&e<14||e>=5760&&Mr.test(String.fromCharCode(e))))break e;++this.pos}}},C.finishToken=function(e,t){this.end=this.pos,this.options.locations&&(this.endLoc=this.curPosition());var i=this.type;this.type=e,this.value=t,this.updateContext(i)},C.readToken_dot=function(){var e=this.input.charCodeAt(this.pos+1);if(e>=48&&e<=57)return this.readNumber(!0);var t=this.input.charCodeAt(this.pos+2);return this.options.ecmaVersion>=6&&46===e&&46===t?(this.pos+=3,this.finishToken(u.ellipsis)):(++this.pos,this.finishToken(u.dot))},C.readToken_slash=function(){var e=this.input.charCodeAt(this.pos+1);return this.exprAllowed?(++this.pos,this.readRegexp()):61===e?this.finishOp(u.assign,2):this.finishOp(u.slash,1)},C.readToken_mult_modulo_exp=function(e){var t=this.input.charCodeAt(this.pos+1),i=1,r=42===e?u.star:u.modulo;return this.options.ecmaVersion>=7&&42===e&&42===t&&(++i,r=u.starstar,t=this.input.charCodeAt(this.pos+2)),61===t?this.finishOp(u.assign,i+1):this.finishOp(r,i)},C.readToken_pipe_amp=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?this.options.ecmaVersion>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(124===e?u.logicalOR:u.logicalAND,2):61===t?this.finishOp(u.assign,2):this.finishOp(124===e?u.bitwiseOR:u.bitwiseAND,1)},C.readToken_caret=function(){return 61===this.input.charCodeAt(this.pos+1)?this.finishOp(u.assign,2):this.finishOp(u.bitwiseXOR,1)},C.readToken_plus_min=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?45!==t||this.inModule||62!==this.input.charCodeAt(this.pos+2)||0!==this.lastTokEnd&&!Y.test(this.input.slice(this.lastTokEnd,this.pos))?this.finishOp(u.incDec,2):(this.skipLineComment(3),this.skipSpace(),this.nextToken()):61===t?this.finishOp(u.assign,2):this.finishOp(u.plusMin,1)},C.readToken_lt_gt=function(e){var t=this.input.charCodeAt(this.pos+1),i=1;return t===e?(i=62===e&&62===this.input.charCodeAt(this.pos+2)?3:2,61===this.input.charCodeAt(this.pos+i)?this.finishOp(u.assign,i+1):this.finishOp(u.bitShift,i)):33!==t||60!==e||this.inModule||45!==this.input.charCodeAt(this.pos+2)||45!==this.input.charCodeAt(this.pos+3)?(61===t&&(i=2),this.finishOp(u.relational,i)):(this.skipLineComment(4),this.skipSpace(),this.nextToken())},C.readToken_eq_excl=function(e){var t=this.input.charCodeAt(this.pos+1);return 61===t?this.finishOp(u.equality,61===this.input.charCodeAt(this.pos+2)?3:2):61===e&&62===t&&this.options.ecmaVersion>=6?(this.pos+=2,this.finishToken(u.arrow)):this.finishOp(61===e?u.eq:u.prefix,1)},C.readToken_question=function(){var e=this.options.ecmaVersion;if(e>=11){var t=this.input.charCodeAt(this.pos+1);if(46===t){var i=this.input.charCodeAt(this.pos+2);if(i<48||i>57)return this.finishOp(u.questionDot,2)}if(63===t)return e>=12&&61===this.input.charCodeAt(this.pos+2)?this.finishOp(u.assign,3):this.finishOp(u.coalesce,2)}return this.finishOp(u.question,1)},C.readToken_numberSign=function(){var e=35;if(this.options.ecmaVersion>=13&&(++this.pos,ce(e=this.fullCharCodeAtPos(),!0)||92===e))return this.finishToken(u.privateId,this.readWord1());this.raise(this.pos,"Unexpected character '"+fe(e)+"'")},C.getTokenFromCode=function(e){switch(e){case 46:return this.readToken_dot();case 40:return++this.pos,this.finishToken(u.parenL);case 41:return++this.pos,this.finishToken(u.parenR);case 59:return++this.pos,this.finishToken(u.semi);case 44:return++this.pos,this.finishToken(u.comma);case 91:return++this.pos,this.finishToken(u.bracketL);case 93:return++this.pos,this.finishToken(u.bracketR);case 123:return++this.pos,this.finishToken(u.braceL);case 125:return++this.pos,this.finishToken(u.braceR);case 58:return++this.pos,this.finishToken(u.colon);case 96:if(this.options.ecmaVersion<6)break;return++this.pos,this.finishToken(u.backQuote);case 48:var t=this.input.charCodeAt(this.pos+1);if(120===t||88===t)return this.readRadixNumber(16);if(this.options.ecmaVersion>=6){if(111===t||79===t)return this.readRadixNumber(8);if(98===t||66===t)return this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(e);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo_exp(e);case 124:case 38:return this.readToken_pipe_amp(e);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(e);case 60:case 62:return this.readToken_lt_gt(e);case 61:case 33:return this.readToken_eq_excl(e);case 63:return this.readToken_question();case 126:return this.finishOp(u.prefix,1);case 35:return this.readToken_numberSign()}this.raise(this.pos,"Unexpected character '"+fe(e)+"'")},C.finishOp=function(e,t){var i=this.input.slice(this.pos,this.pos+t);return this.pos+=t,this.finishToken(e,i)},C.readRegexp=function(){for(var e,t,i=this.pos;;){this.pos>=this.input.length&&this.raise(i,"Unterminated regular expression");var r=this.input.charAt(this.pos);if(Y.test(r)&&this.raise(i,"Unterminated regular expression"),e)e=!1;else{if("["===r)t=!0;else if("]"===r&&t)t=!1;else if("/"===r&&!t)break;e="\\"===r}++this.pos}var n=this.input.slice(i,this.pos);++this.pos;var s=this.pos,a=this.readWord1();this.containsEsc&&this.unexpected(s);var o=this.regexpState||(this.regexpState=new re(this));o.reset(i,n,a),this.validateRegExpFlags(o),this.validateRegExpPattern(o);var c=null;try{c=RegExp(n,a)}catch{}return this.finishToken(u.regexp,{pattern:n,flags:a,value:c})},C.readInt=function(e,t,i){for(var r=this.options.ecmaVersion>=12&&void 0===t,n=i&&48===this.input.charCodeAt(this.pos),s=this.pos,a=0,o=0,c=0,l=t??1/0;c=97?h-97+10:h>=65?h-65+10:h>=48&&h<=57?h-48:1/0)>=e)break;o=h,a=a*e+p}}return r&&95===o&&this.raiseRecoverable(this.pos-1,"Numeric separator is not allowed at the last of digits"),this.pos===s||null!=t&&this.pos-s!==t?null:a},C.readRadixNumber=function(e){var t=this.pos;this.pos+=2;var i=this.readInt(e);return null==i&&this.raise(this.start+2,"Expected number in radix "+e),this.options.ecmaVersion>=11&&110===this.input.charCodeAt(this.pos)?(i=pn(this.input.slice(t,this.pos)),++this.pos):ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,i)},C.readNumber=function(e){var t=this.pos;e||null!==this.readInt(10,void 0,!0)||this.raise(t,"Invalid number");var i=this.pos-t>=2&&48===this.input.charCodeAt(t);i&&this.strict&&this.raise(t,"Invalid number");var r=this.input.charCodeAt(this.pos);if(!i&&!e&&this.options.ecmaVersion>=11&&110===r){var n=pn(this.input.slice(t,this.pos));return++this.pos,ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(u.num,n)}i&&/[89]/.test(this.input.slice(t,this.pos))&&(i=!1),46!==r||i||(++this.pos,this.readInt(10),r=this.input.charCodeAt(this.pos)),69!==r&&101!==r||i||((43===(r=this.input.charCodeAt(++this.pos))||45===r)&&++this.pos,null===this.readInt(10)&&this.raise(t,"Invalid number")),ce(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number");var s=os(this.input.slice(t,this.pos),i);return this.finishToken(u.num,s)},C.readCodePoint=function(){var e;if(123===this.input.charCodeAt(this.pos)){this.options.ecmaVersion<6&&this.unexpected();var t=++this.pos;e=this.readHexChar(this.input.indexOf("}",this.pos)-this.pos),++this.pos,e>1114111&&this.invalidStringToken(t,"Code point out of bounds")}else e=this.readHexChar(4);return e},C.readString=function(e){for(var t="",i=++this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated string constant");var r=this.input.charCodeAt(this.pos);if(r===e)break;92===r?(t+=this.input.slice(i,this.pos),t+=this.readEscapedChar(!1),i=this.pos):8232===r||8233===r?(this.options.ecmaVersion<10&&this.raise(this.start,"Unterminated string constant"),++this.pos,this.options.locations&&(this.curLine++,this.lineStart=this.pos)):(we(r)&&this.raise(this.start,"Unterminated string constant"),++this.pos)}return t+=this.input.slice(i,this.pos++),this.finishToken(u.string,t)};var fn={};C.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(e){if(e!==fn)throw e;this.readInvalidTemplateToken()}this.inTemplateElement=!1},C.invalidStringToken=function(e,t){if(this.inTemplateElement&&this.options.ecmaVersion>=9)throw fn;this.raise(e,t)},C.readTmplToken=function(){for(var e="",t=this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated template");var i=this.input.charCodeAt(this.pos);if(96===i||36===i&&123===this.input.charCodeAt(this.pos+1))return this.pos!==this.start||this.type!==u.template&&this.type!==u.invalidTemplate?(e+=this.input.slice(t,this.pos),this.finishToken(u.template,e)):36===i?(this.pos+=2,this.finishToken(u.dollarBraceL)):(++this.pos,this.finishToken(u.backQuote));if(92===i)e+=this.input.slice(t,this.pos),e+=this.readEscapedChar(!0),t=this.pos;else if(we(i)){switch(e+=this.input.slice(t,this.pos),++this.pos,i){case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:e+="\n";break;default:e+=String.fromCharCode(i)}this.options.locations&&(++this.curLine,this.lineStart=this.pos),t=this.pos}else++this.pos}},C.readInvalidTemplateToken=function(){for(;this.pos=48&&t<=55){var r=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],n=Number.parseInt(r,8);return n>255&&(n=Number.parseInt(r=r.slice(0,-1),8)),this.pos+=r.length-1,t=this.input.charCodeAt(this.pos),("0"!==r||56===t||57===t)&&(this.strict||e)&&this.invalidStringToken(this.pos-1-r.length,e?"Octal literal in template string":"Octal literal in strict mode"),String.fromCharCode(n)}return we(t)?"":String.fromCharCode(t)}},C.readHexChar=function(e){var t=this.pos,i=this.readInt(16,e);return null===i&&this.invalidStringToken(t,"Bad character escape sequence"),i},C.readWord1=function(){this.containsEsc=!1;for(var e="",t=!0,i=this.pos,r=this.options.ecmaVersion>=6;this.pos>16)+(t>>16)+(i>>16)<<16|65535&i}function fs(e,t){return e<>>32-t}function ut(e,t,i,r,n,s){return ye(fs(ye(ye(t,e),ye(r,s)),n),i)}function D(e,t,i,r,n,s,a){return ut(t&i|~t&r,e,t,n,s,a)}function O(e,t,i,r,n,s,a){return ut(t&r|i&~r,e,t,n,s,a)}function V(e,t,i,r,n,s,a){return ut(t^i^r,e,t,n,s,a)}function F(e,t,i,r,n,s,a){return ut(i^(t|~r),e,t,n,s,a)}function ot(e,t){e[t>>5]|=128<>>9<<4)]=t;let i=1732584193,r=-271733879,n=-1732584194,s=271733878;for(let t=0;t>5]>>>r%32&255);return t}function ri(e){let t=[],i=e.length>>2;for(let e=0;e>5]|=(255&e.charCodeAt(i/8))<16&&(i=ot(i,8*e.length));for(let e=0;e<16;e+=1)r[e]=909522486^i[e],n[e]=1549556828^i[e];let s=ot(r.concat(ri(t)),512+8*t.length);return yn(ot(n.concat(s),640))}function gn(e){let t="0123456789abcdef",i="";for(let r=0;r>>4&15)+t.charAt(15&n)}return i}function ni(e){return unescape(encodeURIComponent(e))}function xn(e){return ds(ni(e))}function ys(e){return gn(xn(e))}function _n(e,t){return ms(ni(e),ni(t))}function gs(e,t){return gn(_n(e,t))}function xs(e,t,i){return t?i?_n(t,e):gs(t,e):i?xn(e):ys(e)}var ei=3072;function _s(e){let t=new Headers(e);if(e.has("x-bare-headers")){let i=e.get("x-bare-headers");if(i.length>ei){t.delete("x-bare-headers");let e=0;for(let r=0;r{s.removeEventListener("close",o),s.removeEventListener("message",c)},o=()=>{a()},c=e=>{if(a(),"string"!=typeof e.data)throw TypeError("the first websocket message was not a text frame");let t=JSON.parse(e.data);if("open"!==t.type)throw TypeError("message was not of open type");e.stopImmediatePropagation(),r({protocol:t.protocol,setCookies:t.setCookies}),n(ge.OPEN),s.dispatchEvent(new Event("open"))};return s.addEventListener("close",o),s.addEventListener("message",c),s.addEventListener("open",r=>{r.stopImmediatePropagation(),n(ge.CONNECTING),i().then(i=>ge.prototype.send.call(s,JSON.stringify({type:"connect",remote:e.toString(),protocols:t,headers:i,forwardHeaders:[]})))},{once:!0}),s}async request(e,t,i,r,n,s,a){if(r.protocol.startsWith("blob:")){let e=await ti(r),t=new mn(e.body,e);return t.rawHeaders=Object.fromEntries(e.headers),t.rawResponse=e,t}let o={};if(t instanceof Headers)for(let[e,i]of t)o[e]=i;else for(let e in t)o[e]=t[e];let c={credentials:"omit",method:e,signal:a};"only-if-cached"!==n&&(c.cache=n),void 0!==i&&(c.body=i),void 0!==s&&(c.duplex=s),c.headers=this.createBareHeaders(r,o);let l=await ti(this.http+"?cache="+xs(r.toString()),c),p=await this.readBareResponse(l),h=new mn(hs.includes(p.status)?void 0:l.body,{status:p.status,statusText:p.statusText??void 0,headers:new Headers(p.headers)});return h.rawHeaders=p.headers,h.rawResponse=l,h}async readBareResponse(e){if(!e.ok)throw new ct(e.status,await e.json());let t=bs(e.headers),i={},r=t.get("x-bare-status");null!==r&&(i.status=Number.parseInt(r));let n=t.get("x-bare-status-text");null!==n&&(i.statusText=n);let s=t.get("x-bare-headers");return null!==s&&(i.headers=JSON.parse(s)),i}createBareHeaders(e,t,i=[],r=[],n=[]){let s=new Headers;for(let r of(s.set("x-bare-url",e.toString()),s.set("x-bare-headers",JSON.stringify(t)),i))s.append("x-bare-forward-headers",r);for(let e of r)s.append("x-bare-pass-headers",e);for(let e of n)s.append("x-bare-pass-status",e.toString());return _s(s),s}},ws="!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~";function vs(e){for(let t=0;tthis.loadManifest(e)).catch(e=>{throw delete this.working,e})),this.working):this.client}getClient(){for(let[e,t]of Ss)if(this.manifest.versions.includes(e))return new t(this.server);throw Error("Unable to find compatible client version. Starting from v2.0.0, @tomphttp/bare-client only supports Bare servers v3+. For more information, see https://github.com/tomphttp/bare-client/")}createWebSocket(e,t=[],i){if(!this.client)throw TypeError("You need to wait for the client to finish fetching the manifest before creating any WebSockets. Try caching the manifest data before making this request.");try{e=new URL(e)}catch{throw new DOMException(`Faiiled to construct 'WebSocket': The URL '${e}' is invalid.`)}if(!Cs.includes(e.protocol))throw new DOMException(`Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${e.protocol}' is not allowed.`);for(let e of(Array.isArray(t)||(t=[t]),t=t.map(String)))if(!vs(e))throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${e}' is invalid.`);let r=this.client.connect(e,t,async()=>{let t="function"==typeof i.headers?await i.headers():i.headers||{},r=t instanceof Headers?Object.fromEntries(t):t;return r.Host=e.host,r.Pragma="no-cache",r["Cache-Control"]="no-cache",r.Upgrade="websocket",r.Connection="Upgrade",r},e=>{n=e.protocol,i.setCookiesCallback&&i.setCookiesCallback(e.setCookies)},e=>{s=e},i.webSocketImpl||me),n="",s=ge.CONNECTING,a=()=>{let e=Es.call(r);return e===ge.OPEN?s:e};i.readyStateHook?i.readyStateHook(r,a):Object.defineProperty(r,"readyState",{get:a,configurable:!0,enumerable:!0});let o=()=>{if(a()===ge.CONNECTING)return new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.")};i.sendErrorHook?i.sendErrorHook(r,o):r.send=function(...e){let t=o();if(t)throw t;ge.prototype.send.call(this,...e)},i.urlHook?i.urlHook(r,e):Object.defineProperty(r,"url",{get:()=>e.toString(),configurable:!0,enumerable:!0});let c=()=>n;return i.protocolHook?i.protocolHook(r,c):Object.defineProperty(r,"protocol",{get:c,configurable:!0,enumerable:!0}),r}async fetch(e,t){let i=ks(e)?new us(e,t):e,r=t?.headers||i.headers,n=r instanceof Headers?Object.fromEntries(r):r,s=t?.duplex,a=t?.body||i.body,o=new URL(i.url),c=await this.demand();for(let e=0;;e++){"host"in n?n.host=o.host:n.Host=o.host;let r=await c.request(i.method,n,a,o,i.cache,s,i.signal);r.finalURL=o.toString();let l=t?.redirect||i.redirect;if(!ps.includes(r.status))return r;switch(l){case"follow":{let t=r.headers.get("location");if(ls>e&&null!==t){o=new URL(t,o);continue}throw TypeError("Failed to fetch")}case"error":throw TypeError("Failed to fetch");case"manual":return r}}}};function ks(e){return"string"==typeof e||e instanceof URL}async function wn(e,t){let i=await bn(e,t);return new De(e,i)}var Hs=Qe(vn(),1),Nn=Qe(En(),1),{stringify:Os}=JSON;if(!String.prototype.repeat)throw Error("String.prototype.repeat is undefined, see https://github.com/davidbonnet/astring#installation");if(!String.prototype.endsWith)throw Error("String.prototype.endsWith is undefined, see https://github.com/davidbonnet/astring#installation");var ht={"||":2,"??":3,"&&":4,"|":5,"^":6,"&":7,"==":8,"!=":8,"===":8,"!==":8,"<":9,">":9,"<=":9,">=":9,in:9,instanceof:9,"<<":10,">>":10,">>>":10,"+":11,"-":11,"*":12,"%":12,"/":12,"**":13},ee=17,Vs={ArrayExpression:20,TaggedTemplateExpression:20,ThisExpression:20,Identifier:20,PrivateIdentifier:20,Literal:18,TemplateLiteral:20,Super:20,SequenceExpression:20,MemberExpression:19,ChainExpression:19,CallExpression:19,NewExpression:19,ArrowFunctionExpression:ee,ClassExpression:ee,FunctionExpression:ee,ObjectExpression:ee,UpdateExpression:16,UnaryExpression:15,AwaitExpression:15,BinaryExpression:14,LogicalExpression:13,ConditionalExpression:4,AssignmentExpression:3,YieldExpression:2,RestElement:1};function Ce(e,t){let{generator:i}=e;if(e.write("("),null!=t&&t.length>0){i[t[0].type](t[0],e);let{length:r}=t;for(let n=1;n0){e.write(r);for(let t=1;t0){i.VariableDeclarator(r[0],e);for(let t=1;t0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let{length:o}=a;for(let e=0;e0){for(;n0&&t.write(", ");let e=i[n],r=e.type[6];if("D"===r)t.write(e.local.name,e),n++;else{if("N"!==r)break;t.write("* as "+e.local.name,e),n++}}if(n0)for(let e=0;;){let n=i[e],{name:s}=n.local;if(t.write(s,n),s!==n.exported.name&&t.write(" as "+n.exported.name),!(++e "),"O"===e.body.type[0]?(t.write("("),this.ObjectExpression(e.body,t),t.write(")")):this[e.body.type](e.body,t)},ThisExpression(e,t){t.write("this",e)},Super(e,t){t.write("super",e)},RestElement:An=function(e,t){t.write("..."),this[e.argument.type](e.argument,t)},SpreadElement:An,YieldExpression(e,t){t.write(e.delegate?"yield*":"yield"),e.argument&&(t.write(" "),this[e.argument.type](e.argument,t))},AwaitExpression(e,t){t.write("await ",e),pt(t,e.argument,e)},TemplateLiteral(e,t){let{quasis:i,expressions:r}=e;t.write("`");let{length:n}=r;for(let e=0;e0){let{elements:i}=e,{length:r}=i;for(let e=0;;){let n=i[e];if(null!=n&&this[n.type](n,t),!(++e0){t.write(r),n&&null!=e.comments&&j(t,e.comments,s,r);let a=","+r,{properties:o}=e,{length:c}=o;for(let e=0;;){let i=o[e];if(n&&null!=i.comments&&j(t,i.comments,s,r),t.write(s),this[i.type](i,t),!(++e0){let{properties:i}=e,{length:r}=i;for(let e=0;this[i[e].type](i[e],t),++e1||"U"===n[0]&&("n"===n[1]||"p"===n[1])&&r.prefix&&r.operator[0]===i&&("+"===i||"-"===i))&&t.write(" "),s?(t.write(i.length>1?" (":"("),this[n](r,t),t.write(")")):this[n](r,t)}else this[e.argument.type](e.argument,t),t.write(e.operator)},UpdateExpression(e,t){e.prefix?(t.write(e.operator),this[e.argument.type](e.argument,t)):(this[e.argument.type](e.argument,t),t.write(e.operator))},AssignmentExpression(e,t){this[e.left.type](e.left,t),t.write(" "+e.operator+" "),this[e.right.type](e.right,t)},AssignmentPattern(e,t){this[e.left.type](e.left,t),t.write(" = "),this[e.right.type](e.right,t)},BinaryExpression:Ln=(e,t)=>{let i="in"===e.operator;i&&t.write("("),pt(t,e.left,e,!1),t.write(" "+e.operator+" "),pt(t,e.right,e,!0),i&&t.write(")")},LogicalExpression:Ln,ConditionalExpression(e,t){let{test:i}=e,r=t.expressionsPrecedence[i.type];r===ee||r<=t.expressionsPrecedence.ConditionalExpression?(t.write("("),this[i.type](i,t),t.write(")")):this[i.type](i,t),t.write(" ? "),this[e.consequent.type](e.consequent,t),t.write(" : "),this[e.alternate.type](e.alternate,t)},NewExpression(e,t){t.write("new ");let i=t.expressionsPrecedence[e.callee.type];i===ee||i0&&(this.lineEndSize>0&&(1===r.length?e[i-1]===r:e.endsWith(r))?(this.line+=this.lineEndSize,this.column=0):this.column+=i)}toString(){return this.output}};function Tn(e,t){let i=new li(t);return i.generator[e.type](e,i),i.output}var hi,Mn=class{constructor(e){this.mime=br,this.idb=Je,this.path=Us,this.acorn={parse:dn},this.bare={createBareClient:wn,BareClient:De},this.base64={encode:btoa,decode:atob},this.estree={generate:Tn},this.cookie=Hs,this.setCookieParser=Nn.parse,this.ctx=e}};function pi(e,t,i,r,n="",s=!1,a=""){if(self.__dynamic$config)var o="development"==self.__dynamic$config.mode;else o=!1;if(s){var c=[{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:e+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]},{nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:t+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]}];return this.ctx.config.assets.files.inject&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:this.ctx.config.assets.files.inject+(o?"?"+Math.floor(89999*Math.random()+1e4):"")}]}),r&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(`self.__dynamic$cookies = atob("${btoa(r)}");document.currentScript?.remove();`)}]}),n&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(n+";document.currentScript?.remove();")}]}),a&&c.unshift({nodeName:"script",tagName:"script",namespaceURI:"http://www.w3.org/1999/xhtml",childNodes:[],attrs:[{name:"src",value:"data:application/javascript;base64,"+btoa(a+";document.currentScript?.remove();")}]}),c}var l=[` - - - - - - - -
- - -
-
-
-
-
- - + + + + + + + + + Home + + + + + + + + + + + + +
+ + +
+
+
+
+
+ + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/static/assets/js/scramjet.config.js b/static/assets/js/scramjet.config.js new file mode 100644 index 0000000000..001e65423c --- /dev/null +++ b/static/assets/js/scramjet.config.js @@ -0,0 +1,18 @@ +self.__scramjet$config = { + prefix: "/uv/scramjet/", + codec: { + encode: url => url && encodeURIComponent(url), + decode: url => url && decodeURIComponent(url), + }, + files: { + wasm: "/assets/scramjet/scramjet.wasm", + all: "/assets/scramjet/scramjet.all.js", + sync: "/assets/scramjet/scramjet.sync.js", + }, + flags: { + rewriterLogs: false, + scramitize: false, + cleanErrors: true, + sourcemaps: true, + }, +}; diff --git a/static/assets/js/search.js b/static/assets/js/search.js index 40648e9871..603525b55f 100644 --- a/static/assets/js/search.js +++ b/static/assets/js/search.js @@ -103,11 +103,11 @@ function isScramjet(proxyOverride) { async function encodeUrl(url, proxyOverride) { if (isScramjet(proxyOverride)) { - if (window.__isSjReady) { - await window.__isSjReady; + if (window.scramjetReady) { + await window.scramjetReady; } - if (window.__isSj?.encodeUrl) { - return window.__isSj.encodeUrl(url); + if (window.scramjet?.encodeUrl) { + return window.scramjet.encodeUrl(url); } } @@ -150,3 +150,75 @@ function blank(value, proxyOverride) { function isValidUrl(val = "") { return /^http(s?):\/\//.test(val) || (val.includes(".") && val[0] !== " "); } + +(() => { + const BAREMUX = "/baremux/"; + const EPOXY = "/epoxy/index.mjs"; + const LIBCURL = "/libcurl/index.mjs"; + + function getWispUrl() { + const custom = localStorage.getItem("wisp-url")?.trim(); + if (custom && /^wss?:\/\//i.test(custom)) return custom; + const protocol = location.protocol === "https:" ? "wss" : "ws"; + return `${protocol}://${location.host}/wisp/`; + } + + // libcurl-transport 2.0.5 and bare-mux 2.1.9 disagree on header shape: bare-mux passes request + // headers as an object but libcurl wants [key, value] pairs, and libcurl returns response + // headers as pairs but bare-mux wants an object (repeats kept as arrays so set-cookie survives). + // This subclass converts both directions. setManualTransport takes source text, so it's a string. + const LIBCURL_COMPAT = ` + const { default: BareTransport } = await import("${LIBCURL}"); + const pairsToObject = headers => { + if (!headers || typeof headers !== "object" || typeof headers[Symbol.iterator] !== "function") return headers; + const object = {}; + for (const [name, value] of headers) { + const key = String(name).toLowerCase(); + object[key] = key in object ? [].concat(object[key], value) : value; + } + return object; + }; + class LibcurlCompat extends BareTransport { + async request(remote, method, body, headers, signal) { + const pairs = headers?.[Symbol.iterator] ? headers : Object.entries(headers || {}); + const response = await super.request(remote, method, body, pairs, signal); + response.headers = pairsToObject(response.headers); + return response; + } + } + return [LibcurlCompat, "${LIBCURL} (compat)"]; + `; + + async function init() { + const [{ BareMuxConnection }, { ScramjetController }] = await Promise.all([import(`${BAREMUX}index.mjs`), window.$scramjetLoadController()]); + + const scramjet = new ScramjetController(self.__scramjet$config); + await scramjet.init(); + + const wisp = getWispUrl(); + const connection = new BareMuxConnection(`${BAREMUX}worker.js`); + if (localStorage.getItem("is-sj-transport") === "libcurl") { + await connection.setManualTransport(LIBCURL_COMPAT, [{ wisp }]); + } else { + await connection.setTransport(EPOXY, [{ wisp }]); + } + + window.scramjet = { + encodeUrl: url => scramjet.encodeUrl(url), + decodeUrl: url => scramjet.decodeUrl(url), + }; + } + + async function boot() { + if (typeof window.$scramjetLoadController !== "function" || !self.__scramjet$config) return; + try { + await init(); + } catch (error) { + console.error("Scramjet transport failed to start:", error); + } + } + + const domReady = document.readyState === "loading" ? new Promise(resolve => document.addEventListener("DOMContentLoaded", resolve, { once: true })) : Promise.resolve(); + + window.scramjetReady = domReady.then(boot); +})(); diff --git a/static/assets/js/settings.js b/static/assets/js/settings.js index 19e3d06c1c..60c822fe81 100644 --- a/static/assets/js/settings.js +++ b/static/assets/js/settings.js @@ -28,6 +28,24 @@ document.addEventListener("DOMContentLoaded", () => { if (transportRow) transportRow.style.display = (localStorage.getItem("proxy") || "sj") === "sj" ? "" : "none"; } + const wispInput = document.getElementById("wisp-input"); + const wispSaveBtn = document.getElementById("wisp-save-btn"); + if (wispInput && wispSaveBtn) { + wispInput.value = localStorage.getItem("wisp-url") || ""; + wispSaveBtn.addEventListener("click", () => { + const val = wispInput.value.trim(); + if (val === "") { + localStorage.removeItem("wisp-url"); + } else if (/^wss?:\/\//i.test(val)) { + localStorage.setItem("wisp-url", val); + } else { + alert("Enter a valid Wisp URL starting with ws:// or wss://"); + return; + } + window.location.reload(); + }); + } + const eventKeyInput = document.getElementById("eventKeyInput"); const linkInput = document.getElementById("linkInput"); @@ -133,8 +151,7 @@ document.addEventListener("DOMContentLoaded", () => { } else { localStorage.setItem("pointer", val); } - const existing = document.getElementById("pointer-canvas"); - if (existing) existing.remove(); + window.location.reload(); }); document.getElementById("engine").addEventListener("change", function () { diff --git a/static/assets/js/sj-tp.js b/static/assets/js/sj-tp.js deleted file mode 100644 index 7ed98ffb44..0000000000 --- a/static/assets/js/sj-tp.js +++ /dev/null @@ -1,114 +0,0 @@ -(() => { - const BAREMUX_PATH = "/baremux/"; - const TRANSPORTS = { - epoxy: "/epoxy/index.mjs", - libcurl: "/libcurl/index.mjs", - }; - - if (window.__isSjTpReady) { - return; - } - - window.__isSjTpReady = true; - - const sjConfig = { - prefix: "/uv/scramjet/", - codec: { - encode: url => url && encodeURIComponent(url), - decode: url => url && decodeURIComponent(url), - }, - files: { - wasm: "/assets/scramjet/scramjet.wasm", - all: "/assets/scramjet/scramjet.all.js", - sync: "/assets/scramjet/scramjet.sync.js", - }, - flags: { - rewriterLogs: false, - scramitize: false, - cleanErrors: true, - sourcemaps: true, - }, - }; - - function getWispUrl() { - const protocol = location.protocol === "https:" ? "wss" : "ws"; - return `${protocol}://${location.host}/wisp/`; - } - - // libcurl-transport 2.0.5 doesn't match bare-mux 2.1.9's transport interface: it iterates the - // request headers bare-mux hands it as an object, and returns response headers as [k, v] pairs - // where bare-mux expects an object. Repeats must stay arrays, Scramjet reads set-cookie as one. - const LIBCURL_COMPAT_TRANSPORT = ` - const { default: BareTransport } = await import("${TRANSPORTS.libcurl}"); - const toBareHeaders = headers => { - if (!headers || typeof headers !== "object") return headers; - if (typeof headers[Symbol.iterator] !== "function") return headers; - const out = {}; - for (const [name, value] of headers) { - const key = String(name).toLowerCase(); - out[key] = key in out ? [].concat(out[key], value) : value; - } - return out; - }; - class LibcurlCompatTransport extends BareTransport { - async request(remote, method, body, headers, signal) { - const iterable = headers && typeof headers[Symbol.iterator] === "function" ? headers : Object.entries(headers || {}); - const response = await super.request(remote, method, body, iterable, signal); - response.headers = toBareHeaders(response.headers); - return response; - } - } - return [LibcurlCompatTransport, "${TRANSPORTS.libcurl} (compat)"]; - `; - - async function initSjTransport() { - if (typeof window.$scramjetLoadController !== "function") { - throw new Error("Sj bundle did not load."); - } - - const [{ BareMuxConnection }, { ScramjetController }] = await Promise.all([import(`${BAREMUX_PATH}index.mjs`), Promise.resolve(window.$scramjetLoadController())]); - - const sj = new ScramjetController(sjConfig); - await sj.init(); - - const transport = localStorage.getItem("is-sj-transport") === "libcurl" ? "libcurl" : "epoxy"; - const connection = new BareMuxConnection(`${BAREMUX_PATH}worker.js`); - if (transport === "libcurl") { - await connection.setManualTransport(LIBCURL_COMPAT_TRANSPORT, [{ wisp: getWispUrl() }]); - } else { - await connection.setTransport(TRANSPORTS[transport], [{ wisp: getWispUrl() }]); - } - - window.__isSj = { - connection, - controller: sj, - transports: TRANSPORTS, - transport, - encodeUrl: url => sj.encodeUrl(url), - decodeUrl: url => sj.decodeUrl(url), - pxyUrl: url => sj.encodeUrl(url), - }; - } - - async function boot() { - try { - await initSjTransport(); - } catch (error) { - console.error("Failed to initialize sj transport:", error); - } - } - - if (document.readyState === "loading") { - window.__isSjReady = new Promise(resolve => { - document.addEventListener( - "DOMContentLoaded", - () => { - void boot().finally(resolve); - }, - { once: true }, - ); - }); - } else { - window.__isSjReady = boot(); - } -})(); diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index 9e68147e6f..46ad938610 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -12,14 +12,14 @@ function isScramjetEnabled() { async function encodeProxyUrl(url) { if (isScramjetEnabled()) { - if (window.__isSjReady) await window.__isSjReady; - if (window.__isSj?.encodeUrl) return window.__isSj.encodeUrl(url); + if (window.scramjetReady) await window.scramjetReady; + if (window.scramjet?.encodeUrl) return window.scramjet.encodeUrl(url); } return `/uv/${__uv$config.encodeUrl ? __uv$config.encodeUrl(url) : window.encode.xor(url)}`; } function encodeProxyUrlSync(url) { - if (isScramjetEnabled() && window.__isSj?.encodeUrl) return window.__isSj.encodeUrl(url); + if (isScramjetEnabled() && window.scramjet?.encodeUrl) return window.scramjet.encodeUrl(url); return `/uv/${__uv$config.encodeUrl ? __uv$config.encodeUrl(url) : window.encode.xor(url)}`; } @@ -41,8 +41,8 @@ function updateAddressBar() { if (!input) return; if (currentUrl.includes("/uv/scramjet/")) { - if (window.__isSj?.decodeUrl) { - const decoded = window.__isSj.decodeUrl(currentUrl); + if (window.scramjet?.decodeUrl) { + const decoded = window.scramjet.decodeUrl(currentUrl); localStorage.setItem("decoded", decoded); input.value = decoded; } else { diff --git a/static/games.html b/static/games.html index 088bc7a1b3..922434a302 100644 --- a/static/games.html +++ b/static/games.html @@ -1,59 +1,59 @@ - - - - - - - - - Home - - - - - - - - - - - - -
- - -
-
-
-
-
- - + + + + + + + + + Home + + + + + + + + + + + + +
+ + +
+
+
+
+
+ + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/static/index.html b/static/index.html index 163989eb02..531f61bd4c 100644 --- a/static/index.html +++ b/static/index.html @@ -1,51 +1,51 @@ - - - - - - - - - - Home - - - - - - - - - - -
-

Interstellar

-

-
- - - -
-
- - - - + + + + + + + + + + Home + + + + + + + + + + +
+

Interstellar

+

+
+
+ +
+
+
+ + + + - - - - - - - + + + + + + + \ No newline at end of file diff --git a/static/settings.html b/static/settings.html index 150b615caf..9442bf7d57 100644 --- a/static/settings.html +++ b/static/settings.html @@ -240,6 +240,10 @@

Choose your Proxy

+ + + +
diff --git a/static/tabs.html b/static/tabs.html index c85f2de9d2..91c3593b61 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -1,83 +1,83 @@ - - - - - - - - - - Home - - - - - - - - - -
-
-
- - - - -
- -
-
-
- - - - -
-
-
-
+ + + + + + + + + + Home + + + + + + + + + +
+
+
+ + + + +
+ +
+
+
+ + + + +
+
+
+
- - + + - - - - - - - + + + + + + + From 9933040f28009633423236fe3e24b1ae7fa03282 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Tue, 8 Sep 2026 17:25:57 -0400 Subject: [PATCH 089/115] fix(proxy): downgrade libcurl transport to 1.5.2 --- index.js | 2 +- package-lock.json | 2998 ++++++++++++++++++++++++++++++++++ package.json | 2 +- pnpm-lock.yaml | 10 +- static/assets/js/search.js | 30 +- static/assets/js/settings.js | 4 +- 6 files changed, 3009 insertions(+), 37 deletions(-) create mode 100644 package-lock.json diff --git a/index.js b/index.js index eccd90a935..905acb9c0a 100644 --- a/index.js +++ b/index.js @@ -19,7 +19,7 @@ const require = createRequire(import.meta.url); const __dirname = process.cwd(); const { epoxyPath } = require("@mercuryworkshop/epoxy-transport"); const { baremuxPath } = require("@mercuryworkshop/bare-mux/node"); -const libcurlPath = path.dirname(require.resolve("@mercuryworkshop/libcurl-transport")); +const { libcurlPath } = require("@mercuryworkshop/libcurl-transport"); const DIST_DIR = path.join(__dirname, "dist"); const STATIC_DIR = path.join(__dirname, "static"); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..83ff2dd0ae --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2998 @@ +{ + "name": "interstellar", + "version": "5.2.5", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "interstellar", + "version": "5.2.5", + "license": "GPL-3.0-or-later", + "dependencies": { + "@mercuryworkshop/bare-mux": "^2.1.9", + "@mercuryworkshop/epoxy-transport": "2.1.28", + "@mercuryworkshop/libcurl-transport": "^1.5.2", + "@mercuryworkshop/scramjet": "^1.1.0", + "@mercuryworkshop/wisp-js": "^0.4.1", + "@nebula-services/bare-server-node": "^2.0.4", + "chalk": "^5.4.1", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "dotenv": "^17.2.0", + "express": "^4.21.2", + "express-basic-auth": "^1.2.1", + "express-rate-limit": "^7.5.0", + "mime": "^4.1.0", + "node-fetch": "^3.3.2" + }, + "devDependencies": { + "@biomejs/biome": "2.2.2", + "javascript-obfuscator": "^4.1.1", + "terser": "^5.36.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.2.tgz", + "integrity": "sha512-j1omAiQWCkhuLgwpMKisNKnsM6W8Xtt1l0WZmqY/dFj8QPNkIoTvk4tSsi40FaAAkBE1PU0AFG2RWFBWenAn+w==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.2.2", + "@biomejs/cli-darwin-x64": "2.2.2", + "@biomejs/cli-linux-arm64": "2.2.2", + "@biomejs/cli-linux-arm64-musl": "2.2.2", + "@biomejs/cli-linux-x64": "2.2.2", + "@biomejs/cli-linux-x64-musl": "2.2.2", + "@biomejs/cli-win32-arm64": "2.2.2", + "@biomejs/cli-win32-x64": "2.2.2" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.2.tgz", + "integrity": "sha512-6ePfbCeCPryWu0CXlzsWNZgVz/kBEvHiPyNpmViSt6A2eoDf4kXs3YnwQPzGjy8oBgQulrHcLnJL0nkCh80mlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.2.tgz", + "integrity": "sha512-Tn4JmVO+rXsbRslml7FvKaNrlgUeJot++FkvYIhl1OkslVCofAtS35MPlBMhXgKWF9RNr9cwHanrPTUUXcYGag==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.2.tgz", + "integrity": "sha512-JfrK3gdmWWTh2J5tq/rcWCOsImVyzUnOS2fkjhiYKCQ+v8PqM+du5cfB7G1kXas+7KQeKSWALv18iQqdtIMvzw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.2.tgz", + "integrity": "sha512-/MhYg+Bd6renn6i1ylGFL5snYUn/Ct7zoGVKhxnro3bwekiZYE8Kl39BSb0MeuqM+72sThkQv4TnNubU9njQRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.2.tgz", + "integrity": "sha512-Ogb+77edO5LEP/xbNicACOWVLt8mgC+E1wmpUakr+O4nKwLt9vXe74YNuT3T1dUBxC/SnrVmlzZFC7kQJEfquQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.2.tgz", + "integrity": "sha512-ZCLXcZvjZKSiRY/cFANKg+z6Fhsf9MHOzj+NrDQcM+LbqYRT97LyCLWy2AS+W2vP+i89RyRM+kbGpUzbRTYWig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.2.tgz", + "integrity": "sha512-wBe2wItayw1zvtXysmHJQoQqXlTzHSpQRyPpJKiNIR21HzH/CrZRDFic1C1jDdp+zAPtqhNExa0owKMbNwW9cQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.2.tgz", + "integrity": "sha512-DAuHhHekGfiGb6lCcsT4UyxQmVwQiBCBUMwVra/dcOSs9q8OhfaZgey51MlekT3p8UwRqtXQfFuEJBhJNdLZwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@inversifyjs/common": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.3.3.tgz", + "integrity": "sha512-ZH0wrgaJwIo3s9gMCDM2wZoxqrJ6gB97jWXncROfYdqZJv8f3EkqT57faZqN5OTeHWgtziQ6F6g3L8rCvGceCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inversifyjs/core": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@inversifyjs/core/-/core-1.3.4.tgz", + "integrity": "sha512-gCCmA4BdbHEFwvVZ2elWgHuXZWk6AOu/1frxsS+2fWhjEk2c/IhtypLo5ytSUie1BCiT6i9qnEo4bruBomQsAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.3.3", + "@inversifyjs/reflect-metadata-utils": "0.2.3" + } + }, + "node_modules/@inversifyjs/reflect-metadata-utils": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@inversifyjs/reflect-metadata-utils/-/reflect-metadata-utils-0.2.3.tgz", + "integrity": "sha512-d3D0o9TeSlvaGM2I24wcNw/Aj3rc4OYvHXOKDC09YEph5fMMiKd6fq1VTQd9tOkDNWvVbw+cnt45Wy9P/t5Lvw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "reflect-metadata": "0.2.2" + } + }, + "node_modules/@javascript-obfuscator/escodegen": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.3.1.tgz", + "integrity": "sha512-Z0HEAVwwafOume+6LFXirAVZeuEMKWuPzpFbQhCEU9++BMz0IwEa9bmedJ+rMn/IlXRBID9j3gQ0XYAa6jM10g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@javascript-obfuscator/estraverse": "^5.3.0", + "esprima": "^4.0.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/@javascript-obfuscator/estraverse": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", + "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mercuryworkshop/bare-mux": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/bare-mux/-/bare-mux-2.1.9.tgz", + "integrity": "sha512-fiOqWm3VP0Bl8T+0l+qnb7ab9zO+PpKVbtJvOnMsefUv6kWIaoDtqyr9hd/t4gA8oBwgtyZVqIwO2J9nKY9ylw==" + }, + "node_modules/@mercuryworkshop/epoxy-tls": { + "version": "2.1.18-1", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/epoxy-tls/-/epoxy-tls-2.1.18-1.tgz", + "integrity": "sha512-2N1BYn/+FJxIbRw+sipbl3mQPinRflqQDB9HGAXJEVj4Ok4FIlTlS4fO2cpXKEq5yoD3oaKb8GyNaQfndNui9w==", + "license": "AGPL-3.0-only" + }, + "node_modules/@mercuryworkshop/epoxy-transport": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/epoxy-transport/-/epoxy-transport-2.1.28.tgz", + "integrity": "sha512-lv/Kfdn37y8ZCXQaIT3Ebj4OSztBqeXdbR9rchbHQBKIw/fNSQJLGNBHV5ScXSzqt7NCwv8ZiZx7urRyk7Ua/Q==", + "license": "AGPL-3.0-only", + "dependencies": { + "@mercuryworkshop/epoxy-tls": "2.1.18-1" + } + }, + "node_modules/@mercuryworkshop/libcurl-transport": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/libcurl-transport/-/libcurl-transport-1.5.2.tgz", + "integrity": "sha512-E0tD/3W6HE99ypc7CStpchU6xs+TP5u2vms/9q/46BShblB2pbRCNeXHBlvXqdz97nh2Xh4A68DryDt5CM29Dg==", + "license": "AGPL-3.0-only", + "dependencies": { + "libcurl.js": "^0.7.4" + } + }, + "node_modules/@mercuryworkshop/scramjet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/scramjet/-/scramjet-1.1.0.tgz", + "integrity": "sha512-T/9GZqAQX42eYr/t6VGR2m9J4BtIuncRkANo8hBVTGskrr522yuhaADhSu+65DYlhUyQnLUjDikuNYzlgv0Ejw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mercuryworkshop/bare-mux": "^2.1.9", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "htmlparser2": "10.0.0", + "idb": "^8.0.3", + "parse-domain": "^8.2.2", + "set-cookie-parser": "^2.7.1" + } + }, + "node_modules/@mercuryworkshop/wisp-js": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@mercuryworkshop/wisp-js/-/wisp-js-0.4.1.tgz", + "integrity": "sha512-104LwiXiuhti/e32gmv0Da0u0yuLFDHX8JawCzleTPWJ5t5qTX4EYi4E7/ucbjBPN9wwVPWHE5g5yGqzl/NzQA==", + "license": "AGPL-3.0", + "dependencies": { + "bufferutil": "^4.0.9", + "commander": "^14.0.2", + "ipaddr.js": "^2.3.0", + "ws": "^8.18.3" + }, + "bin": { + "wisp-js-server": "src/bin/server_cli.mjs" + } + }, + "node_modules/@nebula-services/bare-server-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nebula-services/bare-server-node/-/bare-server-node-2.0.4.tgz", + "integrity": "sha512-Jcr+QtkLJVmppdbBarEbRp1TtCsL4pjFIcX6+KPURRqcsOP7hZfYclhjmCserwEC7jT+WBduXpFd3qwqeRBNew==", + "license": "GPL-3.0", + "dependencies": { + "async-exit-hook": "^2.0.1", + "commander": "^10.0.1", + "dotenv": "^16.0.3", + "http-errors": "^2.0.0", + "ipaddr.js": "^2.1.0", + "source-map-support": "^0.5.21", + "ws": "^8.18.0" + }, + "bin": { + "bare-server-node": "bin.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@nebula-services/bare-server-node/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@nebula-services/bare-server-node/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/atomically": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.1.1.tgz", + "integrity": "sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stubborn-fs": "^2.0.0", + "when-exit": "^2.1.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.8", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.8.tgz", + "integrity": "sha512-JNcyFQ64OiijEkPzUBTCe+hyPXUD/3LEldGQ6iF5LR1w00mx9o7xtDWHXBY2iItjdCFGoilOLNQbH943ut7pHA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.16.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", + "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bufferutil": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", + "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chance": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.13.tgz", + "integrity": "sha512-V6lQCljcLznE7tUYUM9EOAnnKXbctE6j/rdQkYOHIWbfGQbrzTsAXNW9CdU5XCo4ArXQCj/rb6HgxPlmGJcaUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/class-validator": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", + "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.20" + } + }, + "node_modules/clone-regexp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", + "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", + "license": "MIT", + "dependencies": { + "is-regexp": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/conf": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/conf/-/conf-15.0.2.tgz", + "integrity": "sha512-JBSrutapCafTrddF9dH3lc7+T2tBycGF4uPkI4Js+g4vLLEhG6RZcFi3aJd5zntdf5tQxAejJt8dihkoQ/eSJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "atomically": "^2.0.3", + "debounce-fn": "^6.0.0", + "dot-prop": "^10.0.0", + "env-paths": "^3.0.0", + "json-schema-typed": "^8.0.1", + "semver": "^7.7.2", + "uint8array-extras": "^1.5.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debounce-fn": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-6.0.0.tgz", + "integrity": "sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-10.2.0.tgz", + "integrity": "sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^5.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-basic-auth": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz", + "integrity": "sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==", + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", + "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", + "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idb": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.3.tgz", + "integrity": "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==", + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inversify": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.1.4.tgz", + "integrity": "sha512-PbxrZH/gTa1fpPEEGAjJQzK8tKMIp5gRg6EFNJlCtzUcycuNdmhv3uk5P8Itm/RIjgHJO16oQRLo9IHzQN51bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.3.3", + "@inversifyjs/core": "1.3.4" + } + }, + "node_modules/ip-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipaddr.js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.5.0.tgz", + "integrity": "sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ip": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", + "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", + "license": "MIT", + "dependencies": { + "ip-regex": "^5.0.0", + "super-regex": "^0.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/javascript-obfuscator": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.2.2.tgz", + "integrity": "sha512-+7oXAUnFCA6vS0omIGHcWpSr67dUBIF7FKGYSXyzxShSLqM6LBgdugWKFl0XrYtGWyJMGfQR5F4LL85iCefkRA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@javascript-obfuscator/escodegen": "2.3.1", + "@javascript-obfuscator/estraverse": "5.4.0", + "acorn": "8.15.0", + "assert": "2.1.0", + "chalk": "4.1.2", + "chance": "1.1.13", + "class-validator": "0.14.3", + "commander": "12.1.0", + "conf": "15.0.2", + "eslint-scope": "8.4.0", + "eslint-visitor-keys": "4.2.1", + "fast-deep-equal": "3.1.3", + "inversify": "6.1.4", + "js-string-escape": "1.0.1", + "md5": "2.3.0", + "mkdirp": "3.0.1", + "multimatch": "5.0.0", + "process": "0.11.10", + "reflect-metadata": "0.2.2", + "source-map-support": "0.5.21", + "string-template": "1.0.0", + "stringz": "2.1.0", + "tslib": "2.8.1" + }, + "bin": { + "javascript-obfuscator": "bin/javascript-obfuscator" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/javascript-obfuscator/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/javascript-obfuscator/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libcurl.js": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/libcurl.js/-/libcurl.js-0.7.4.tgz", + "integrity": "sha512-UpvVirvATP7fD0t4rnsxVRuUpPVIo2QvWj4+5JrMsd1KSEvYkON36+COOPAl88hPlGJddk+DfZRvyF7KG7YcSA==", + "license": "LGPL-3.0-or-later" + }, + "node_modules/libphonenumber-js": { + "version": "1.13.12", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.13.12.tgz", + "integrity": "sha512-uLVeV1c9OTk6qkdqnj+mpMD+ZdnZ0szVyWu58HwMmpwkHA1gCEkyjd3veZQXDnuw9KEwSRjcc9B1pS9XKIN1fA==", + "dev": true, + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parse-domain": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/parse-domain/-/parse-domain-8.4.0.tgz", + "integrity": "sha512-dQK2vh9TfEYtfuA8haMyk1mkYRya1MP1r2bs79bnDb3w4uOgPgXdwUUmTOpSiDsQL71BlZRS7+rIWdBJfp2QwQ==", + "license": "MIT", + "dependencies": { + "is-ip": "^5.0.1" + }, + "bin": { + "parse-domain-update": "dist/bin/update.js" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==", + "dev": true, + "license": "MIT" + }, + "node_modules/stringz": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", + "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2" + } + }, + "node_modules/stubborn-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-2.0.0.tgz", + "integrity": "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "stubborn-utils": "^1.0.1" + } + }, + "node_modules/stubborn-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stubborn-utils/-/stubborn-utils-1.0.2.tgz", + "integrity": "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==", + "dev": true, + "license": "MIT" + }, + "node_modules/super-regex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", + "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==", + "license": "MIT", + "dependencies": { + "clone-regexp": "^3.0.0", + "function-timeout": "^0.1.0", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.51.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "license": "MIT", + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.9.0.tgz", + "integrity": "sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/validator": { + "version": "13.15.35", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", + "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/when-exit": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.5.tgz", + "integrity": "sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json index ca73a0b874..fb2c11e9e4 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "dependencies": { "@mercuryworkshop/bare-mux": "^2.1.9", "@mercuryworkshop/epoxy-transport": "2.1.28", - "@mercuryworkshop/libcurl-transport": "^2.0.5", + "@mercuryworkshop/libcurl-transport": "^1.5.2", "@mercuryworkshop/scramjet": "^1.1.0", "@mercuryworkshop/wisp-js": "^0.4.1", "@nebula-services/bare-server-node": "^2.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fbf61a4bef..4fa566ef71 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,8 +25,8 @@ importers: specifier: 2.1.28 version: 2.1.28 '@mercuryworkshop/libcurl-transport': - specifier: ^2.0.5 - version: 2.0.5 + specifier: ^1.5.2 + version: 1.5.2 '@mercuryworkshop/scramjet': specifier: ^1.1.0 version: 1.1.0 @@ -173,8 +173,8 @@ packages: '@mercuryworkshop/epoxy-transport@2.1.28': resolution: {integrity: sha512-lv/Kfdn37y8ZCXQaIT3Ebj4OSztBqeXdbR9rchbHQBKIw/fNSQJLGNBHV5ScXSzqt7NCwv8ZiZx7urRyk7Ua/Q==} - '@mercuryworkshop/libcurl-transport@2.0.5': - resolution: {integrity: sha512-YkAPEAWTEUZZkEOejmRQJxNHw90+kNQnoiSqa5H2sExHBXXdGSXEtg7/35A53U8MDVaznpAwjVbXRONSsfatzw==} + '@mercuryworkshop/libcurl-transport@1.5.2': + resolution: {integrity: sha512-E0tD/3W6HE99ypc7CStpchU6xs+TP5u2vms/9q/46BShblB2pbRCNeXHBlvXqdz97nh2Xh4A68DryDt5CM29Dg==} '@mercuryworkshop/scramjet@1.1.0': resolution: {integrity: sha512-T/9GZqAQX42eYr/t6VGR2m9J4BtIuncRkANo8hBVTGskrr522yuhaADhSu+65DYlhUyQnLUjDikuNYzlgv0Ejw==} @@ -1106,7 +1106,7 @@ snapshots: dependencies: '@mercuryworkshop/epoxy-tls': 2.1.18-1 - '@mercuryworkshop/libcurl-transport@2.0.5': + '@mercuryworkshop/libcurl-transport@1.5.2': dependencies: libcurl.js: 0.7.4 diff --git a/static/assets/js/search.js b/static/assets/js/search.js index 603525b55f..d58ae8c83f 100644 --- a/static/assets/js/search.js +++ b/static/assets/js/search.js @@ -163,32 +163,6 @@ function isValidUrl(val = "") { return `${protocol}://${location.host}/wisp/`; } - // libcurl-transport 2.0.5 and bare-mux 2.1.9 disagree on header shape: bare-mux passes request - // headers as an object but libcurl wants [key, value] pairs, and libcurl returns response - // headers as pairs but bare-mux wants an object (repeats kept as arrays so set-cookie survives). - // This subclass converts both directions. setManualTransport takes source text, so it's a string. - const LIBCURL_COMPAT = ` - const { default: BareTransport } = await import("${LIBCURL}"); - const pairsToObject = headers => { - if (!headers || typeof headers !== "object" || typeof headers[Symbol.iterator] !== "function") return headers; - const object = {}; - for (const [name, value] of headers) { - const key = String(name).toLowerCase(); - object[key] = key in object ? [].concat(object[key], value) : value; - } - return object; - }; - class LibcurlCompat extends BareTransport { - async request(remote, method, body, headers, signal) { - const pairs = headers?.[Symbol.iterator] ? headers : Object.entries(headers || {}); - const response = await super.request(remote, method, body, pairs, signal); - response.headers = pairsToObject(response.headers); - return response; - } - } - return [LibcurlCompat, "${LIBCURL} (compat)"]; - `; - async function init() { const [{ BareMuxConnection }, { ScramjetController }] = await Promise.all([import(`${BAREMUX}index.mjs`), window.$scramjetLoadController()]); @@ -197,8 +171,8 @@ function isValidUrl(val = "") { const wisp = getWispUrl(); const connection = new BareMuxConnection(`${BAREMUX}worker.js`); - if (localStorage.getItem("is-sj-transport") === "libcurl") { - await connection.setManualTransport(LIBCURL_COMPAT, [{ wisp }]); + if (localStorage.getItem("transport") === "libcurl") { + await connection.setTransport(LIBCURL, [{ websocket: wisp }]); } else { await connection.setTransport(EPOXY, [{ wisp }]); } diff --git a/static/assets/js/settings.js b/static/assets/js/settings.js index 60c822fe81..f9f8936a31 100644 --- a/static/assets/js/settings.js +++ b/static/assets/js/settings.js @@ -20,9 +20,9 @@ document.addEventListener("DOMContentLoaded", () => { const transportElement = document.getElementById("transport-dropdown"); if (transportElement) { - transportElement.value = localStorage.getItem("is-sj-transport") === "libcurl" ? "libcurl" : "epoxy"; + transportElement.value = localStorage.getItem("transport") === "libcurl" ? "libcurl" : "epoxy"; transportElement.addEventListener("change", function () { - localStorage.setItem("is-sj-transport", this.value); + localStorage.setItem("transport", this.value); window.location.reload(); }); if (transportRow) transportRow.style.display = (localStorage.getItem("proxy") || "sj") === "sj" ? "" : "none"; From 9d1f358292c65e98f89d343aa40745fd3ca865cc Mon Sep 17 00:00:00 2001 From: xbubbo Date: Tue, 8 Sep 2026 17:34:06 -0400 Subject: [PATCH 090/115] move scramjet.config.js into assets/scramjet/ --- build.js | 1 + static/apps.html | 2 +- static/assets/{js => scramjet}/scramjet.config.js | 0 static/games.html | 2 +- static/index.html | 2 +- static/tabs.html | 2 +- 6 files changed, 5 insertions(+), 4 deletions(-) rename static/assets/{js => scramjet}/scramjet.config.js (100%) diff --git a/build.js b/build.js index a0f90bb486..cda395fc96 100644 --- a/build.js +++ b/build.js @@ -762,6 +762,7 @@ async function build() { otherJs.map(async jsPath => { const content = await readFile(jsPath, "utf8"); let updated = content; + updated = patchProxyCodecs(updated, path.basename(jsPath), proxyCodecs); updated = replaceAll(updated, OLD_SCRAMJET_SCOPE, NEW_SCRAMJET_SCOPE); updated = replaceAll(updated, OLD_UV_SCOPE, NEW_UV_SCOPE); updated = replaceAll(updated, OLD_UV_PREFIX, NEW_UV_FILE_PREFIX); diff --git a/static/apps.html b/static/apps.html index f576acae68..0094a41c10 100644 --- a/static/apps.html +++ b/static/apps.html @@ -45,7 +45,7 @@ - + diff --git a/static/assets/js/scramjet.config.js b/static/assets/scramjet/scramjet.config.js similarity index 100% rename from static/assets/js/scramjet.config.js rename to static/assets/scramjet/scramjet.config.js diff --git a/static/games.html b/static/games.html index 922434a302..b015a3ea57 100644 --- a/static/games.html +++ b/static/games.html @@ -40,7 +40,7 @@ - + diff --git a/static/index.html b/static/index.html index 531f61bd4c..68a04e45bd 100644 --- a/static/index.html +++ b/static/index.html @@ -33,7 +33,7 @@

Interstell - + - + - - + + \ No newline at end of file diff --git a/static/apps.html b/static/apps.html index 0094a41c10..3c47a38e8b 100644 --- a/static/apps.html +++ b/static/apps.html @@ -43,10 +43,10 @@

- + - + - - + + diff --git a/static/settings.html b/static/settings.html index 9442bf7d57..eb5174c839 100644 --- a/static/settings.html +++ b/static/settings.html @@ -230,8 +230,8 @@

Choose your Proxy

Choose the proxy you want to use.

+ diff --git a/static/apps.html b/static/apps.html index 3c47a38e8b..4b0c6d8814 100644 --- a/static/apps.html +++ b/static/apps.html @@ -1,64 +1,65 @@ - - - - - - - - - Home - - - - - - - - - - - - -
- - -
-
-
-
-
- - + + + + + + + + + Home + + + + + + + + + + + + + +
+ + +
+
+
+
+
+ + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/static/assets/js/search.js b/static/assets/js/search.js index d58ae8c83f..99b0617251 100644 --- a/static/assets/js/search.js +++ b/static/assets/js/search.js @@ -152,9 +152,8 @@ function isValidUrl(val = "") { } (() => { - const BAREMUX = "/baremux/"; - const EPOXY = "/epoxy/index.mjs"; - const LIBCURL = "/libcurl/index.mjs"; + // Full paths only, never concatenated: the build rewrites whole literals. + const vendor = self.__vendor || {}; function getWispUrl() { const custom = localStorage.getItem("wisp-url")?.trim(); @@ -164,17 +163,17 @@ function isValidUrl(val = "") { } async function init() { - const [{ BareMuxConnection }, { ScramjetController }] = await Promise.all([import(`${BAREMUX}index.mjs`), window.$scramjetLoadController()]); + const [{ BareMuxConnection }, { ScramjetController }] = await Promise.all([import(vendor.baremux), window.$scramjetLoadController()]); const scramjet = new ScramjetController(self.__scramjet$config); await scramjet.init(); const wisp = getWispUrl(); - const connection = new BareMuxConnection(`${BAREMUX}worker.js`); + const connection = new BareMuxConnection(vendor.baremuxWorker); if (localStorage.getItem("transport") === "libcurl") { - await connection.setTransport(LIBCURL, [{ websocket: wisp }]); + await connection.setTransport(vendor.libcurl, [{ websocket: wisp }]); } else { - await connection.setTransport(EPOXY, [{ wisp }]); + await connection.setTransport(vendor.epoxy, [{ wisp }]); } window.scramjet = { diff --git a/static/assets/js/vendor.js b/static/assets/js/vendor.js new file mode 100644 index 0000000000..20cf3cad56 --- /dev/null +++ b/static/assets/js/vendor.js @@ -0,0 +1,7 @@ +// Dev defaults. The build regenerates this file with the randomized paths. +self.__vendor = { + baremux: "/baremux/index.mjs", + baremuxWorker: "/baremux/worker.js", + epoxy: "/epoxy/index.mjs", + libcurl: "/libcurl/index.mjs", +}; diff --git a/static/games.html b/static/games.html index 76394e500d..dc6bc963ca 100644 --- a/static/games.html +++ b/static/games.html @@ -1,59 +1,60 @@ - - - - - - - - - Home - - - - - - - - - - - - -
- - -
-
-
-
-
- - + + + + + + + + + Home + + + + + + + + + + + + + +
+ + +
+
+
+
+
+ + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/static/index.html b/static/index.html index 2fee0ca2fd..6cdf487c1f 100644 --- a/static/index.html +++ b/static/index.html @@ -1,51 +1,52 @@ - - - - - - - - - - Home - - - - - - - - - - -
-

Interstellar

-

-
- - - -
-
- - - - + + + + + + + + + + Home + + + + + + + + + + +
+

Interstellar

+

+
+
+ +
+
+
+ + + + + - - - - - - - + + + + + + + \ No newline at end of file diff --git a/static/tabs.html b/static/tabs.html index ea1ed46fd7..9016cbb3b2 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -1,83 +1,84 @@ - - - - - - - - - - Home - - - - - - - - - -
-
-
- - - - -
- -
-
-
- - - - -
-
-
-
+ + + + + + + + + + Home + + + + + + + + + +
+
+
+ + + + +
+ +
+
+
+ + + + +
+
+
+
+ - - + + - - - - - - - + + + + + + + From a6ced5460333e074cab1fe8d8801c6a1a95db14a Mon Sep 17 00:00:00 2001 From: xbubbo Date: Wed, 9 Sep 2026 05:13:08 -0400 Subject: [PATCH 094/115] fix(proxy): wait for the bare-mux transport before proxying --- static/assets/js/search.js | 22 ++++++++++++++++++++-- static/assets/js/tabs.js | 30 +++++++++++++++++++----------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/static/assets/js/search.js b/static/assets/js/search.js index 99b0617251..0413fe867a 100644 --- a/static/assets/js/search.js +++ b/static/assets/js/search.js @@ -116,6 +116,7 @@ async function encodeUrl(url, proxyOverride) { async function navigate(value, path, proxyOverride) { await waitForServiceWorker(); + if (window.waitForProxyBoot) await window.waitForProxyBoot(); let url = value.trim(); const engine = localStorage.getItem("engine"); @@ -162,6 +163,18 @@ function isValidUrl(val = "") { return `${protocol}://${location.host}/wisp/`; } + async function ensureTransport(connection, transportPath, options, signature) { + let current = ""; + try { + current = await connection.getTransport(); + } catch {} + + if (current === transportPath && localStorage.getItem("transport-signature") === signature) return; + + await connection.setTransport(transportPath, options); + localStorage.setItem("transport-signature", signature); + } + async function init() { const [{ BareMuxConnection }, { ScramjetController }] = await Promise.all([import(vendor.baremux), window.$scramjetLoadController()]); @@ -171,9 +184,9 @@ function isValidUrl(val = "") { const wisp = getWispUrl(); const connection = new BareMuxConnection(vendor.baremuxWorker); if (localStorage.getItem("transport") === "libcurl") { - await connection.setTransport(vendor.libcurl, [{ websocket: wisp }]); + await ensureTransport(connection, vendor.libcurl, [{ websocket: wisp }], `${vendor.libcurl}|${wisp}`); } else { - await connection.setTransport(vendor.epoxy, [{ wisp }]); + await ensureTransport(connection, vendor.epoxy, [{ wisp }], `${vendor.epoxy}|${wisp}`); } window.scramjet = { @@ -195,3 +208,8 @@ function isValidUrl(val = "") { window.scramjetReady = domReady.then(boot); })(); + +window.waitForProxyBoot = async function waitForProxyBoot(timeout = 8000) { + if (!window.scramjetReady) return; + await Promise.race([window.scramjetReady.catch(() => {}), new Promise(resolve => setTimeout(resolve, timeout))]); +}; diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index 46ad938610..d8d4a8c02b 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -180,7 +180,7 @@ function goForward() { } window.addEventListener("load", () => { - navigator.serviceWorker.register("../sw.js", { scope: "/uv/" }); + navigator.serviceWorker.register("../sw.js", { scope: "/uv/" }).catch(err => console.error("[SW] registration failed:", err)); const form = document.getElementById("fv"); const input = document.getElementById("input"); @@ -196,6 +196,7 @@ window.addEventListener("load", () => { } async function navigateActiveTab(url) { + if (window.waitForProxyBoot) await window.waitForProxyBoot(); const proxyUrl = await encodeProxyUrl(url); sessionStorage.setItem("GoUrl", proxyUrl); const iframeContainer = document.getElementById("frame-container"); @@ -263,7 +264,7 @@ document.addEventListener("DOMContentLoaded", () => { let destination; if (isSubmit) { // Can't fold a POST body into a URL, so just let POST forms submit in place. - // (A scripted form.submit() fires no submit event — the shim in createNewTab handles it.) + // (A scripted form.submit() fires no submit event, the shim in createNewTab handles it.) if ((source.method || "get").toLowerCase() !== "get") { source.target = "_self"; return; @@ -343,20 +344,27 @@ document.addEventListener("DOMContentLoaded", () => { const goUrl = sessionStorage.getItem("GoUrl"); const storedUrl = sessionStorage.getItem("URL"); + let src; if (tabCounter === 1) { - newIframe.src = goUrl ? (goUrl.includes("/gh-games/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl)) : "/"; + src = goUrl ? (goUrl.includes("/gh-games/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl)) : "/"; + } else if (storedUrl) { + src = resolveStoredUrl(storedUrl); + sessionStorage.removeItem("URL"); + } else if (goUrl) { + src = goUrl.includes("/gh-games/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl); } else { - if (storedUrl) { - newIframe.src = resolveStoredUrl(storedUrl); - sessionStorage.removeItem("URL"); - } else if (goUrl) { - newIframe.src = goUrl.includes("/gh-games/") ? window.location.origin + goUrl : resolveStoredUrl(goUrl); - } else { - newIframe.src = "/"; - } + src = "/"; } iframeContainer.appendChild(newIframe); + + if (window.waitForProxyBoot) { + window.waitForProxyBoot().then(() => { + newIframe.src = src; + }); + } else { + newIframe.src = src; + } tabCounter += 1; } From cacecccd9e9c6185c56a3feadfb22c2850b5abe9 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Thu, 10 Sep 2026 07:42:03 -0400 Subject: [PATCH 095/115] fix codec patching on Windows --- build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.js b/build.js index 46011ce21a..8be18aa938 100644 --- a/build.js +++ b/build.js @@ -450,7 +450,7 @@ function patchProxyCodecs(content, basename, proxyCodecs) { if (basename === "scramjet.config.js") { const { codec, key } = parseCodecSpec(proxyCodecs.scramjet); const sjCodec = getUrlCodecFunctions(codec, key); - content = patchOrFail(content, /codec:\s*\{[\s\S]*?\n\s*\},\n\s*files:/, `codec: {\n encode: ${sjCodec.encode},\n decode: ${sjCodec.decode},\n },\n files:`, "scramjet.config.js codec"); + content = patchOrFail(content, /codec:\s*\{[\s\S]*?\},\s*files:/, `codec: {\n encode: ${sjCodec.encode},\n decode: ${sjCodec.decode},\n },\n files:`, "scramjet.config.js codec"); } return content; From 4871ca908741c757902b6a6ce40bbd0ad281a12a Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 11 Sep 2026 06:44:10 -0400 Subject: [PATCH 096/115] feat(build): obfuscate class and id names --- build.js | 244 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) diff --git a/build.js b/build.js index 8be18aa938..31ddde4481 100644 --- a/build.js +++ b/build.js @@ -816,6 +816,241 @@ async function verifyBuild({ manifest, specs, emitted, references, distJsFiles } return { checkedReferences }; } +// CDN stylesheets define the fa/material names; rc- ids reach gsap.to() and a morphSVG +// property rather than a selector call. +const SELECTOR_KEEP = [/^fa$|^fas$|^far$|^fab$|^fa-/, /^material-symbols/, /^adsbygoogle$/, /^rc-/]; + +// Applied via `["stars",...].forEach(id => el.id = id)`, so renaming them would mean +// guessing at ordinary strings. +const SELECTOR_KEEP_DYNAMIC = new Set(["stars", "stars2", "stars3"]); + +function isKeptSelector(name) { + return SELECTOR_KEEP.some(pattern => pattern.test(name)) || SELECTOR_KEEP_DYNAMIC.has(name); +} + +const CSS_NESTING_AT_RULES = /^@(media|supports|document|layer|container|scope|keyframes)\b/i; +// A preceding word character is allowed: `li.active` and `div#main` are selectors too. +const CSS_CLASS_TOKEN = /(? { + if (index % 2) return part; + return part.replace(CSS_CLASS_TOKEN, (_m, name) => `.${fn("class", name)}`).replace(CSS_ID_TOKEN, (_m, name) => `#${fn("id", name)}`); + }) + .join(""); +} + +function transformCss(css, fn) { + let out = ""; + // Unmappable, or "/* based on codepen.io/... */" yields a class named io. + let parts = []; + const stack = []; + let i = 0; + + const inDeclarations = () => stack[stack.length - 1] === "declarations"; + const preludeText = () => parts.map(part => part.text).join(""); + const emitPrelude = at => { + const text = preludeText(); + if (at === "rule") out += parts.map(part => (part.map ? mapSelectorText(part.text, fn) : part.text)).join(""); + else out += text; + parts = []; + return text; + }; + const push = (text, map) => { + if (inDeclarations()) { + out += text; + return; + } + const last = parts[parts.length - 1]; + if (last?.map && map) last.text += text; + else parts.push({ text, map }); + }; + + while (i < css.length) { + const ch = css[i]; + + if (ch === "/" && css[i + 1] === "*") { + const end = css.indexOf("*/", i + 2); + const stop = end < 0 ? css.length : end + 2; + push(css.slice(i, stop), false); + i = stop; + continue; + } + + if (ch === '"' || ch === "'") { + let j = i + 1; + while (j < css.length && css[j] !== ch) j += css[j] === "\\" ? 2 : 1; + push(css.slice(i, Math.min(j + 1, css.length)), false); + i = j + 1; + continue; + } + + if (ch === "{") { + if (inDeclarations()) { + out += ch; + stack.push("declarations"); + } else { + const trimmed = preludeText().trim(); + const nesting = CSS_NESTING_AT_RULES.test(trimmed); + emitPrelude(nesting || !trimmed.length ? "verbatim" : "rule"); + out += ch; + stack.push(nesting ? "container" : "declarations"); + } + i++; + continue; + } + + if (ch === "}") { + emitPrelude(preludeText().trim() && !inDeclarations() ? "rule" : "verbatim"); + stack.pop(); + out += ch; + i++; + continue; + } + + push(ch, true); + i++; + } + + emitPrelude(preludeText().trim() ? "rule" : "verbatim"); + return out; +} + +function transformMarkupAttrs(text, fn) { + return text + .replace( + /(\sclass\s*=\s*)(["'])([^"']*)\2/gi, + (_m, lead, quote, value) => + `${lead}${quote}${value + .split(/(\s+)/) + .map(token => (token.trim() ? fn("class", token) : token)) + .join("")}${quote}`, + ) + .replace(/(\sid\s*=\s*)(["'])([^"']*)\2/gi, (_m, lead, quote, value) => `${lead}${quote}${value.trim() ? fn("id", value.trim()) : value}${quote}`); +} + +// Quotes stay inside the class, or `.column[data-x="${i}"]` never matches. +const QUOTED = `((?:\\\\.|(?!\\2)[^\\\\])*)\\2`; +const SELECTOR_CALLS = new RegExp(`\\.(querySelectorAll|querySelector|closest|matches)\\s*\\(\\s*(["'\`])${QUOTED}`, "g"); +const ID_CALLS = new RegExp(`\\.getElementById\\s*\\(\\s*()(["'\`])${QUOTED}`, "g"); +const CLASS_NAME_CALLS = new RegExp(`\\.getElementsByClassName\\s*\\(\\s*()(["'\`])${QUOTED}`, "g"); +const CLASS_LIST_CALLS = /\.classList\s*\.\s*(?:add|remove|toggle|contains|replace)\s*\(([^)]*)\)/g; +const CLASS_NAME_ASSIGN = new RegExp(`\\.className\\s*=\\s*()(["'\`])${QUOTED}`, "g"); +const ID_ASSIGN = new RegExp(`\\.id\\s*=\\s*()(["'\`])${QUOTED}`, "g"); + +const mapClassList = (value, fn) => + value + .split(/(\s+)/) + .map(token => (token.trim() ? fn("class", token) : token)) + .join(""); + +function transformJsSelectors(js, fn) { + let out = js; + out = out.replace(SELECTOR_CALLS, (_m, method, quote, selector) => `.${method}(${quote}${mapSelectorText(selector, fn)}${quote}`); + out = out.replace(ID_CALLS, (_m, _pad, quote, name) => `.getElementById(${quote}${fn("id", name)}${quote}`); + out = out.replace(CLASS_NAME_CALLS, (_m, _pad, quote, name) => `.getElementsByClassName(${quote}${fn("class", name)}${quote}`); + out = out.replace(CLASS_LIST_CALLS, (m, args) => + m.replace( + args, + args.replace(/(["'])([^"']+)\1/g, (_s, quote, name) => `${quote}${fn("class", name)}${quote}`), + ), + ); + out = out.replace(CLASS_NAME_ASSIGN, (_m, _pad, quote, value) => `.className = ${quote}${mapClassList(value, fn)}${quote}`); + out = out.replace(ID_ASSIGN, (_m, _pad, quote, name) => `.id = ${quote}${fn("id", name)}${quote}`); + return transformMarkupAttrs(out, fn); +} + +// Deliberately not sharing the rewrite regexes, so a construct they miss is still caught. +// Input must be comment-free, or an apostrophe in prose reads as a string opener. +const JS_STRING_LITERAL = /(["'`])((?:\\.|(?!\1)[^\\])*)\1/g; + +async function stripJsComments(js) { + const result = await minify(js, { compress: false, mangle: false, format: { comments: false } }); + return result.code ?? js; +} + +function findStaleSelectorStrings(js, maps) { + const stale = new Set(); + for (const [, , value] of js.matchAll(JS_STRING_LITERAL)) { + if (!/[.#][a-zA-Z_-]/.test(value)) continue; + for (const [, name] of value.matchAll(CSS_CLASS_TOKEN)) if (maps.class.has(name)) stale.add(`class .${name}`); + for (const [, name] of value.matchAll(CSS_ID_TOKEN)) if (maps.id.has(name)) stale.add(`id #${name}`); + } + return stale; +} + +function findStaleSelectorsInCss(css, maps) { + const stale = new Set(); + const unquoted = css.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(["'])(?:\\.|(?!\1)[^\\])*\1/g, '""'); + for (const [, name] of unquoted.matchAll(CSS_CLASS_TOKEN)) if (maps.class.has(name)) stale.add(`class .${name}`); + for (const [, name] of unquoted.matchAll(CSS_ID_TOKEN)) if (maps.id.has(name)) stale.add(`id #${name}`); + return stale; +} + +async function obfuscateSelectors() { + const cssFiles = await collectFiles(DIST_DIR, name => name.endsWith(".css")); + const htmlFiles = await getHtmlFiles(DIST_DIR); + const jsFiles = await getJsFiles(JS_DIR); + + const read = async file => ({ file, source: await readFile(file, "utf8") }); + const css = await Promise.all(cssFiles.map(read)); + const html = await Promise.all(htmlFiles.map(read)); + const js = await Promise.all(jsFiles.map(read)); + + const seen = { class: new Set(), id: new Set() }; + const kept = new Set(); + const collect = (type, name) => { + if (!name) return name; + if (isKeptSelector(name)) kept.add(name); + else seen[type].add(name); + return name; + }; + + for (const { source } of css) transformCss(source, collect); + for (const { source } of html) transformMarkupAttrs(source, collect); + for (const { source } of js) transformJsSelectors(source, collect); + + const used = new Set(); + const nextIdent = () => { + for (;;) { + const ident = `${randomItem("abcdefghijklmnopqrstuvwxyz".split(""))}${randomBytes(3).toString("hex").slice(0, 4)}`; + if (!used.has(ident)) { + used.add(ident); + return ident; + } + } + }; + + const maps = { class: new Map(), id: new Map() }; + for (const type of ["class", "id"]) for (const name of [...seen[type]].sort()) maps[type].set(name, nextIdent()); + + const apply = (type, name) => maps[type].get(name) ?? name; + + await Promise.all([...css.map(({ file, source }) => writeFile(file, transformCss(source, apply), "utf8")), ...html.map(({ file, source }) => writeFile(file, transformMarkupAttrs(source, apply), "utf8")), ...js.map(({ file, source }) => writeFile(file, transformJsSelectors(source, apply), "utf8"))]); + + const leaked = new Set(); + const recheck = (type, name) => { + if (maps[type].has(name)) leaked.add(`${type} ${name}`); + return name; + }; + for (const file of await collectFiles(DIST_DIR, name => name.endsWith(".css"))) { + const source = await readFile(file, "utf8"); + transformCss(source, recheck); + for (const entry of findStaleSelectorsInCss(source, maps)) leaked.add(`${path.basename(file)}: ${entry}`); + } + for (const file of await getHtmlFiles(DIST_DIR)) transformMarkupAttrs(await readFile(file, "utf8"), recheck); + for (const file of await getJsFiles(JS_DIR)) { + const source = await readFile(file, "utf8"); + transformJsSelectors(source, recheck); + for (const entry of findStaleSelectorStrings(await stripJsComments(source), maps)) leaked.add(`${path.basename(file)}: ${entry}`); + } + + return { maps, kept: [...kept].sort(), leaked: [...leaked].sort() }; +} + async function build() { console.log("Cleaning dist/..."); await rm(DIST_DIR, { recursive: true, force: true }); @@ -825,6 +1060,15 @@ async function build() { console.log(OBFUSCATE ? chalk.yellow("Obfuscation: ON") : chalk.yellow("Obfuscation: OFF (rename + rewrite only)")); + const selectors = await obfuscateSelectors(); + console.log(`\nSelectors: ${selectors.maps.class.size} classes, ${selectors.maps.id.size} ids obfuscated`); + if (selectors.kept.length) console.log(chalk.gray(` kept (externally owned or not statically resolvable): ${selectors.kept.join(", ")}`)); + if (selectors.leaked.length) { + console.error(chalk.red(`\nAborting: ${selectors.leaked.length} selector reference(s) were renamed in one file but not another.`)); + for (const entry of selectors.leaked) console.error(chalk.red(` - ${entry}`)); + process.exit(1); + } + const registry = new PathRegistry(); const uvBase = randomWord(); From 7788f0a17b43681699c2569dbddea6164abd8dcf Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 11 Sep 2026 06:54:30 -0400 Subject: [PATCH 097/115] feat(analytics): proxy Google analytics and gate AdSense --- build.js | 36 ++++++++++++++++++++++++++++++++--- index.js | 41 ++++++++++++++++++++++++++++++++++++++++ static/404.html | 2 -- static/apps.html | 2 -- static/assets/js/main.js | 10 ++++++++++ static/games.html | 2 -- static/index.html | 2 -- static/settings.html | 2 -- 8 files changed, 84 insertions(+), 13 deletions(-) diff --git a/build.js b/build.js index 31ddde4481..32c573813a 100644 --- a/build.js +++ b/build.js @@ -741,9 +741,9 @@ function formatKb(bytes) { return `${(bytes / 1024).toFixed(1)}kb`; } -async function verifyBuild({ manifest, specs, emitted, references, distJsFiles }) { +async function verifyBuild({ manifest, specs, emitted, references, distJsFiles, serverRoutes = [] }) { const failures = []; - const emittedPaths = new Set(emitted.keys()); + const emittedPaths = new Set([...emitted.keys(), ...serverRoutes]); for (const [id, publicPath] of Object.entries(manifest.vendor)) { const full = path.join(DIST_DIR, publicPath); @@ -990,6 +990,21 @@ function findStaleSelectorsInCss(css, maps) { return stale; } +const GTAG_LOADER = /[ \t]*\n`).replace(GTAG_BOOTSTRAP, "").replace(GTAG_MARKER, ""), + }; +} + async function obfuscateSelectors() { const cssFiles = await collectFiles(DIST_DIR, name => name.endsWith(".css")); const htmlFiles = await getHtmlFiles(DIST_DIR); @@ -1211,6 +1226,8 @@ async function build() { await rm(JS_DIR, { recursive: true, force: true }); const htmlFiles = await getHtmlFiles(DIST_DIR); + const analyticsPaths = { loader: registry.file(".js"), transport: `/${registry.dir()}` }; + const analyticsIds = new Set(); console.log(`\nUpdating ${htmlFiles.length} HTML files${OBFUSCATE_HTML ? " + obfuscating" : ""}...\n`); await Promise.all( @@ -1219,6 +1236,11 @@ async function build() { let html = await readFile(htmlPath, "utf8"); for (const [from, to] of scopeRewrites) html = replaceAll(html, from, to); html = applyRewrites(html, rewrites); + + const analytics = replaceAnalytics(html, analyticsPaths.loader); + html = analytics.html; + if (analytics.id) analyticsIds.add(analytics.id); + references.push({ file: name, source: html }); if (OBFUSCATE_HTML) html = await obfuscateHtml(html, name); @@ -1227,6 +1249,14 @@ async function build() { }), ); + if (analyticsIds.size > 1) throw new Error(`HTML pages disagree on the analytics id: ${[...analyticsIds].join(", ")}`); + if (analyticsIds.size === 1) { + manifest.analytics = { id: [...analyticsIds][0], ...analyticsPaths }; + console.log(`\nAnalytics: proxied via ${analyticsPaths.loader}, hits to ${analyticsPaths.transport}/g/collect`); + } else { + console.log(chalk.yellow("\nAnalytics: no gtag block found in any page, nothing proxied")); + } + await mkdir(RUNTIME_DIR, { recursive: true }); await writeFile(path.join(RUNTIME_DIR, "vendor-map.cjs"), `"use strict";\n// Generated by build.js on every build. Do not edit; do not serve.\nmodule.exports = ${JSON.stringify(manifest, null, 2)};\n`, "utf8"); @@ -1237,7 +1267,7 @@ async function build() { distJsFiles.push({ file: path.relative(DIST_DIR, file).split(path.sep).join("/"), source: await readFile(file, "utf8"), module: file.endsWith(".mjs") }); } - const { checkedReferences } = await verifyBuild({ manifest, specs, emitted, references, distJsFiles }); + const { checkedReferences } = await verifyBuild({ manifest, specs, emitted, references, distJsFiles, serverRoutes: manifest.analytics ? [manifest.analytics.loader] : [] }); console.log(chalk.green(` all checks passed (${emitted.size} emitted assets, ${distJsFiles.length} scripts parsed, ${checkedReferences} asset references resolved across ${references.length} files)`)); console.log(chalk.green("\nBuild complete -> dist/")); diff --git a/index.js b/index.js index 21411e8672..7c42a454f7 100644 --- a/index.js +++ b/index.js @@ -131,6 +131,47 @@ app.use("/.runtime", (_req, res) => { res.sendStatus(404); }); +if (vendorMap?.analytics) { + const { id, loader, transport } = vendorMap.analytics; + let cached = null; + + app.get(loader, async (_req, res) => { + try { + if (!cached || Date.now() - cached.at > 3600000) { + const upstream = await fetch(`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(id)}`); + if (!upstream.ok) return res.sendStatus(502); + const body = await upstream.text(); + // Bootstrapping here rather than inline in the page is what keeps the measurement + // id out of the HTML. transport_url sends hits to our own origin. + const boot = `\n;window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date());gtag("config",${JSON.stringify(id)},{transport_url:location.origin+${JSON.stringify(transport)}});`; + cached = { at: Date.now(), body: body + boot }; + } + res.type("text/javascript").set("Cache-Control", "public, max-age=900").send(cached.body); + } catch { + res.sendStatus(502); + } + }); + + app.all(`${transport}/g/collect`, express.raw({ type: "*/*", limit: "64kb" }), async (req, res) => { + try { + const target = new URL("https://www.google-analytics.com/g/collect"); + target.search = new URLSearchParams(req.query).toString(); + const upstream = await fetch(target, { + method: req.method === "GET" ? "GET" : "POST", + headers: { + "User-Agent": req.get("user-agent") ?? "", + "X-Forwarded-For": req.ip, + ...(req.get("content-type") ? { "Content-Type": req.get("content-type") } : {}), + }, + body: req.method === "GET" || !req.body?.length ? undefined : req.body, + }); + res.status(upstream.status).send(Buffer.from(await upstream.arrayBuffer())); + } catch { + res.sendStatus(204); + } + }); +} + app.use(express.static(SERVE_DIR, { ...jsStaticOptions, dotfiles: "ignore" })); if (!vendorMap) { diff --git a/static/404.html b/static/404.html index 503bac4001..ab0f46b3f8 100644 --- a/static/404.html +++ b/static/404.html @@ -13,8 +13,6 @@ - diff --git a/static/apps.html b/static/apps.html index 4b0c6d8814..090e7dbc5c 100644 --- a/static/apps.html +++ b/static/apps.html @@ -15,8 +15,6 @@ - diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 79279de59e..6699339d33 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -93,6 +93,16 @@ document.addEventListener("DOMContentLoaded", () => { document.body.appendChild(script); } + // The AdSense account is tied to gointerstellar.app, so forks and mirrors must not serve + // it. The tabs page never carried the loader either. + if (window.location.hostname === "gointerstellar.app" && !document.getElementById("frame-container")) { + const ads = document.createElement("script"); + ads.async = true; + ads.crossOrigin = "anonymous"; + ads.src = "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6840529569014734"; + document.head.appendChild(ads); + } + const nav = document.querySelector(".nav-bar"); if (nav) { diff --git a/static/games.html b/static/games.html index dc6bc963ca..dc347479e7 100644 --- a/static/games.html +++ b/static/games.html @@ -14,8 +14,6 @@ - diff --git a/static/index.html b/static/index.html index 6cdf487c1f..98a5580aed 100644 --- a/static/index.html +++ b/static/index.html @@ -13,8 +13,6 @@ - diff --git a/static/settings.html b/static/settings.html index eb5174c839..76a307cc6a 100644 --- a/static/settings.html +++ b/static/settings.html @@ -14,8 +14,6 @@ - From 2b8f21b60023ef301376edf5a8ecfc470f3eea38 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 11 Sep 2026 07:16:06 -0400 Subject: [PATCH 098/115] feat(analytics): obfuscate collect endpoint --- build.js | 8 +++++++- index.js | 24 ++++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/build.js b/build.js index 32c573813a..3437e655da 100644 --- a/build.js +++ b/build.js @@ -1226,7 +1226,13 @@ async function build() { await rm(JS_DIR, { recursive: true, force: true }); const htmlFiles = await getHtmlFiles(DIST_DIR); - const analyticsPaths = { loader: registry.file(".js"), transport: `/${registry.dir()}` }; + const analyticsPaths = { + loader: registry.file(".js"), + transport: `/${registry.dir()}`, + sink: registry.file(""), + param: randomItem(FILENAMES).slice(0, 2), + key: Array.from(randomBytes(8)), + }; const analyticsIds = new Set(); console.log(`\nUpdating ${htmlFiles.length} HTML files${OBFUSCATE_HTML ? " + obfuscating" : ""}...\n`); diff --git a/index.js b/index.js index 7c42a454f7..045e685307 100644 --- a/index.js +++ b/index.js @@ -132,9 +132,24 @@ app.use("/.runtime", (_req, res) => { }); if (vendorMap?.analytics) { - const { id, loader, transport } = vendorMap.analytics; + const { id, loader, transport, sink, param, key } = vendorMap.analytics; let cached = null; + const unpack = value => { + const raw = Buffer.from(String(value).replace(/-/g, "+").replace(/_/g, "/"), "base64"); + return Buffer.from(raw.map((byte, index) => byte ^ key[index % key.length])).toString("utf8"); + }; + + // gtag builds its own URL and always ends it with /g/collect?v=2&tid=G-..., so the + // recognizable shape can only be removed after gtag hands the request to the browser. + // These wrappers pass everything that is not a collect hit straight through. + const requestHook = `(function(){var B=location.origin+${JSON.stringify(transport)}+"/g/collect",S=${JSON.stringify(sink)},P=${JSON.stringify(param)},K=${JSON.stringify(key)}; +function pack(s){var o="";for(var i=0;i { try { if (!cached || Date.now() - cached.at > 3600000) { @@ -144,7 +159,8 @@ if (vendorMap?.analytics) { // Bootstrapping here rather than inline in the page is what keeps the measurement // id out of the HTML. transport_url sends hits to our own origin. const boot = `\n;window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date());gtag("config",${JSON.stringify(id)},{transport_url:location.origin+${JSON.stringify(transport)}});`; - cached = { at: Date.now(), body: body + boot }; + // Hook first: gtag captures its transport references as it initialises. + cached = { at: Date.now(), body: requestHook + body + boot }; } res.type("text/javascript").set("Cache-Control", "public, max-age=900").send(cached.body); } catch { @@ -152,10 +168,10 @@ if (vendorMap?.analytics) { } }); - app.all(`${transport}/g/collect`, express.raw({ type: "*/*", limit: "64kb" }), async (req, res) => { + app.all(sink, express.raw({ type: "*/*", limit: "64kb" }), async (req, res) => { try { const target = new URL("https://www.google-analytics.com/g/collect"); - target.search = new URLSearchParams(req.query).toString(); + target.search = unpack(req.query[param] ?? ""); const upstream = await fetch(target, { method: req.method === "GET" ? "GET" : "POST", headers: { From 459f184bcaf2010aed3948db05283a50e95a8a84 Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 11 Sep 2026 07:26:05 -0400 Subject: [PATCH 099/115] refactor(build): simplify build word lists --- build.js | 229 ++++--------------------------------------------------- 1 file changed, 13 insertions(+), 216 deletions(-) diff --git a/build.js b/build.js index 3437e655da..df470d9298 100644 --- a/build.js +++ b/build.js @@ -38,34 +38,10 @@ const VENDOR_DROPPED_CONSOLE = ["console.log", "console.debug", "console.info", const VENDOR_SIZE_TOLERANCE = 1; -const RESERVED_GLOBALS = [ - "Ultraviolet", - "UVClient", - "UVServiceWorker", - "__uv", - "__uvHook", - "__uv$config", - "__uv$cookies", - "__uv$referrer", - "$scramjetLoadWorker", - "$scramjetLoadController", - "$scramjetLoadClient", - "$scramjetRequire", - "$scramjetVersion", - "__scramjet$config", - "COOKIE", - "WASM", - "BareMuxConnection", - "BareClient", - "BareWebSocket", - "WebSocketFields", - "WorkerConnection", - "browserSupportsTransferringStreams", - "maxRedirects", - "validProtocol", - "epoxyInfo", - "onconnect", -]; +const RESERVED_GLOBALS = + "Ultraviolet UVClient UVServiceWorker __uv __uvHook __uv$config __uv$cookies __uv$referrer $scramjetLoadWorker $scramjetLoadController $scramjetLoadClient $scramjetRequire $scramjetVersion __scramjet$config COOKIE WASM BareMuxConnection BareClient BareWebSocket WebSocketFields WorkerConnection browserSupportsTransferringStreams maxRedirects validProtocol epoxyInfo onconnect".split( + " ", + ); function vendorTerserOptions({ module, aggressive }) { return { @@ -82,194 +58,15 @@ const OLD_SCRAMJET_SCOPE = "/uv/scramjet/"; const RETIRED_PUBLIC_PREFIXES = ["/assets/ultraviolet/", "/assets/scramjet/", "/epoxy/", "/libcurl/", "/baremux/"]; -const WORDS = [ - "api", - "lib", - "src", - "net", - "sys", - "io", - "pkg", - "app", - "mod", - "ext", - "math", - "calc", - "units", - "matrix", - "vector", - "scalar", - "ratio", - "delta", - "sigma", - "alpha", - "beta", - "gamma", - "omega", - "phi", - "theta", - "core", - "util", - "data", - "base", - "node", - "tree", - "heap", - "stack", - "queue", - "graph", - "hash", - "map", - "set", - "list", - "ring", - "chain", - "parse", - "fmt", - "log", - "proc", - "exec", - "init", - "boot", - "load", - "sync", - "async", - "fetch", - "emit", - "bind", - "wrap", - "pool", - "fork", - "dictionary", - "mapping", - "resolver", - "adapter", - "encoder", - "decoder", - "scheduler", - "dispatcher", - "observer", - "registry", - "factory", - "builder", - "transform", - "pipeline", - "middleware", - "handler", - "router", - "broker", - "storage", - "cache", - "buffer", - "stream", - "channel", - "socket", - "bridge", - "monitor", - "profiler", - "tracer", - "validator", - "sanitizer", - "1", - "2", - "3", - "v1", - "v2", - "v3", - "that", - "was", - "my", - "part", - "of", - "the", - "deal", - "honest", - "we", - "got", - "so", - "familiar", - "spending", - "each", - "day", - "of", - "the", - "year", - "white", - "ferrari", - "good", - "times", -]; - -const FILENAMES = [ - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "1", - "2", - "3", - "10", - "11", - "100", - "mod", - "lib", - "api", - "run", - "cli", - "app", - "env", - "cfg", - "index", - "main", - "core", - "init", - "loader", - "worker", - "runtime", - "parser", - "formatter", - "handler", - "manager", - "client", - "server", - "config", - "schema", - "mapper", - "adapter", - "resolver", - "encoder", - "decoder", - "sync", - "fetch", - "stream", - "buffer", - "queue", - "cache", - "router", - "dispatcher", - "emitter", - "observer", - "builder", - "factory", - "transform", - "pipeline", - "registry", - "validator", - "scheduler", - "monitor", - "tracer", - "bridge", - "channel", - "storage", - "profiler", -]; +const WORDS = + "api lib src net sys io pkg app mod ext math calc units matrix vector scalar ratio delta sigma alpha beta gamma omega phi theta core util data base node tree heap stack queue graph hash map set list ring chain parse fmt log proc exec init boot load sync async fetch emit bind wrap pool fork dictionary mapping resolver adapter encoder decoder scheduler dispatcher observer registry factory builder transform pipeline middleware handler router broker storage cache buffer stream channel socket bridge monitor profiler tracer validator sanitizer 1 2 3 v1 v2 v3 that was my part of the deal honest we got so familiar spending each day of the year white ferrari good times".split( + " ", + ); + +const FILENAMES = + "x y z a b c d e f g h 1 2 3 10 11 100 mod lib api run cli app env cfg index main core init loader worker runtime parser formatter handler manager client server config schema mapper adapter resolver encoder decoder sync fetch stream buffer queue cache router dispatcher emitter observer builder factory transform pipeline registry validator scheduler monitor tracer bridge channel storage profiler".split( + " ", + ); function randomItem(arr) { return arr[Math.floor(Math.random() * arr.length)]; From 1b7ff7f8a853c44c78423e821fd1824ae451662e Mon Sep 17 00:00:00 2001 From: xbubbo Date: Fri, 11 Sep 2026 23:54:28 -0400 Subject: [PATCH 100/115] feat(build): randomize Scramjet identifiers and the vendor map --- build.js | 106 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 93 insertions(+), 13 deletions(-) diff --git a/build.js b/build.js index df470d9298..799699608c 100644 --- a/build.js +++ b/build.js @@ -31,8 +31,8 @@ const { libcurlPath } = require("@mercuryworkshop/libcurl-transport"); const { uvPath } = require("@titaniumnetwork-dev/ultraviolet"); const { scramjetPath } = require("@mercuryworkshop/scramjet/path"); -// Obfuscates the object that search.js reads back -const TERSER_ONLY = new Set(["vendor.js"]); +// Application files to run through Terser instead of the obfuscator. +const TERSER_ONLY = new Set(); const VENDOR_DROPPED_CONSOLE = ["console.log", "console.debug", "console.info", "console.warn"]; @@ -236,7 +236,58 @@ function patchOrFail(content, pattern, replacement, label, required = true) { return content.replace(pattern, replacement); } -function patchProxyCodecs(content, basename, proxyCodecs) { +// Emitted by the wasm rewriter into every proxied page. wrappropertybase is concatenated +// with a property name, so each value must be a valid identifier alone and as a prefix. +const SCRAMJET_GLOBAL_DEFAULTS = { + wrapfn: "$scramjet$wrap", + wrappropertybase: "$scramjet__", + wrappropertyfn: "$scramjet$prop", + cleanrestfn: "$scramjet$clean", + importfn: "$scramjet$import", + rewritefn: "$scramjet$rewrite", + metafn: "$scramjet$meta", + setrealmfn: "$scramjet$setrealm", + pushsourcemapfn: "$scramjet$pushsourcemap", + trysetfn: "$scramjet$tryset", + templocid: "$scramjet$temploc", + tempunusedid: "$scramjet$tempunused", +}; + +function createScramjetGlobals() { + const token = randomBytes(4).toString("hex"); + const globals = {}; + let index = 0; + for (const name of Object.keys(SCRAMJET_GLOBAL_DEFAULTS)) globals[name] = `_${token}$${(index++).toString(36)}${randomBytes(2).toString("hex")}`; + return globals; +} + +// Names we own on both sides. Upstream Scramjet reads none of them, and none is reachable +// from HTML. +const SCRAMJET_IDENTIFIERS = ["__scramjet$config", "isScramjet", "isScramjetEnabled", "ScramjetServiceWorker", "ScramjetController", "$scramjetLoadWorker", "$scramjetLoadController", "$scramjetLoadClient"]; + +// scramjet.all.js strips this with a hardcoded `e.slice(14)`, so the replacement must keep +// the same length, and stay lowercase because setAttribute lowercases. +const SCRAMJET_ATTR_PREFIX = "scramjet-attr"; +const SCRAMJET_IDB_NAME = "$scramjet"; + +function createScramjetIdentifiers() { + return new Map(SCRAMJET_IDENTIFIERS.map(name => [name, `_${randomBytes(5).toString("hex")}`])); +} + +function createScramjetStrings() { + const attr = randomItem("abcdefghijklmnopqrstuvwxyz".split("")) + randomBytes(6).toString("hex"); + if (attr.length !== SCRAMJET_ATTR_PREFIX.length) throw new Error(`attribute prefix must stay ${SCRAMJET_ATTR_PREFIX.length} chars to keep slice(14) correct, got ${attr.length}`); + return { attr, idb: `_${randomBytes(5).toString("hex")}` }; +} + +// The lookarounds stop isScramjet matching inside isScramjetEnabled. +function applyIdentifierRenames(source, renames) { + let out = source; + for (const [from, to] of renames) out = out.replace(new RegExp(`(? ` ${name}: ${JSON.stringify(value)},`) + .join("\n"); + content = patchOrFail(content, /codec:\s*\{[\s\S]*?\},\s*files:/, `codec: {\n encode: ${sjCodec.encode},\n decode: ${sjCodec.decode},\n },\n globals: {\n${globals}\n },\n files:`, "scramjet.config.js codec"); } return content; @@ -477,6 +531,9 @@ function vendorSpecs() { src: path.join(scramjetPath, "scramjet.all.js"), old: "/assets/scramjet/scramjet.all.js", ext: ".js", + rewriteGlobals: true, + renameIdentifiers: true, + rewriteScramjetStrings: true, globals: ["$scramjetLoadWorker", "$scramjetLoadController", "$scramjetLoadClient", "$scramjetRequire", "$scramjetVersion", "COOKIE", "WASM"], }, { id: "sj.sync", src: path.join(scramjetPath, "scramjet.sync.js"), old: "/assets/scramjet/scramjet.sync.js", ext: ".js" }, @@ -490,6 +547,7 @@ function vendorSpecs() { rewritePaths: true, rewriteScopes: true, patchCodec: true, + renameIdentifiers: true, globals: ["__scramjet$config"], }, { @@ -538,7 +596,7 @@ function formatKb(bytes) { return `${(bytes / 1024).toFixed(1)}kb`; } -async function verifyBuild({ manifest, specs, emitted, references, distJsFiles, serverRoutes = [] }) { +async function verifyBuild({ manifest, specs, emitted, references, distJsFiles, serverRoutes = [], identifierRenames = new Map() }) { const failures = []; const emittedPaths = new Set([...emitted.keys(), ...serverRoutes]); @@ -570,7 +628,7 @@ async function verifyBuild({ manifest, specs, emitted, references, distJsFiles, const source = await readFile(path.join(DIST_DIR, emittedPath), "utf8"); for (const identifier of spec.globals ?? []) { - if (!source.includes(identifier)) failures.push(`global "${identifier}" did not survive processing of ${spec.id} (${emittedPath})`); + if (!source.includes(identifierRenames.get(identifier) ?? identifier)) failures.push(`global "${identifier}" did not survive processing of ${spec.id} (${emittedPath})`); } for (const identifier of spec.mangledAway ?? []) { @@ -613,12 +671,10 @@ async function verifyBuild({ manifest, specs, emitted, references, distJsFiles, return { checkedReferences }; } -// CDN stylesheets define the fa/material names; rc- ids reach gsap.to() and a morphSVG -// property rather than a selector call. +// CDN stylesheets own the fa/material names; rc- ids reach gsap.to(), not a selector call. const SELECTOR_KEEP = [/^fa$|^fas$|^far$|^fab$|^fa-/, /^material-symbols/, /^adsbygoogle$/, /^rc-/]; -// Applied via `["stars",...].forEach(id => el.id = id)`, so renaming them would mean -// guessing at ordinary strings. +// Applied from a bare array literal, so renaming means guessing at ordinary strings. const SELECTOR_KEEP_DYNAMIC = new Set(["stars", "stars2", "stars3"]); function isKeptSelector(name) { @@ -792,7 +848,7 @@ const GTAG_BOOTSTRAP = /[ \t]* diff --git a/static/apps.html b/static/apps.html index 090e7dbc5c..11e5a8fe33 100644 --- a/static/apps.html +++ b/static/apps.html @@ -11,6 +11,7 @@ + diff --git a/static/assets/js/cursor.js b/static/assets/js/cursor.js index 4d1723ddf9..3edb759c12 100644 --- a/static/assets/js/cursor.js +++ b/static/assets/js/cursor.js @@ -669,7 +669,7 @@ function initTheSims() { } const simsInterval = setInterval(() => { - if (localStorage.getItem("pointer") !== "the-sims") { + if (store.get("pointer") !== "the-sims") { clearInterval(simsInterval); return; } @@ -801,7 +801,7 @@ function initSnakeTrail() { } function initCursorEffect() { - const pointer = localStorage.getItem("pointer"); + const pointer = store.get("pointer"); switch (pointer) { case "rainbow-stars": initRainbowStars(); diff --git a/static/assets/js/home.js b/static/assets/js/home.js index 42772b8608..ecb40c7ca3 100644 --- a/static/assets/js/home.js +++ b/static/assets/js/home.js @@ -5,8 +5,8 @@ try { } catch (e) { inFrame = true; } -if (!localStorage.getItem("ab")) localStorage.setItem("ab", true); -if (!inFrame && !navigator.userAgent.includes("Firefox") && localStorage.getItem("ab") === "true") { +if (!store.get("ab")) store.set("ab", true); +if (!inFrame && !navigator.userAgent.includes("Firefox") && store.get("ab") === "true") { const popup = open("about:blank", "_blank"); setTimeout(() => { if (!popup || popup.closed) { @@ -17,8 +17,8 @@ if (!inFrame && !navigator.userAgent.includes("Firefox") && localStorage.getItem const style = iframe.style; const link = doc.createElement("link"); - const name = localStorage.getItem("name") || "My Drive - Google Drive"; - const icon = localStorage.getItem("icon") || "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png"; + const name = store.get("name") || "My Drive - Google Drive"; + const icon = store.get("icon") || "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png"; doc.title = name; link.rel = "icon"; @@ -33,7 +33,7 @@ if (!inFrame && !navigator.userAgent.includes("Firefox") && localStorage.getItem doc.head.appendChild(link); doc.body.appendChild(iframe); - const pLink = localStorage.getItem(encodeURI("pLink")) || getRandomUrl(); + const pLink = store.get("pLink") || getRandomUrl(); location.replace(pLink); const script = doc.createElement("script"); diff --git a/static/assets/js/launcher.js b/static/assets/js/launcher.js index df0a408ac9..32e6816e8c 100644 --- a/static/assets/js/launcher.js +++ b/static/assets/js/launcher.js @@ -7,12 +7,14 @@ function getStorageKey(baseKey) { return baseKey; } +// Kept out of the settings blob: these grow with whatever the user adds and are only read on +// the page that owns them. function getFromStorage(baseKey) { - return localStorage.getItem(getStorageKey(baseKey)); + return store.getRaw(getStorageKey(baseKey)); } function setInStorage(baseKey, value) { - localStorage.setItem(getStorageKey(baseKey), value); + store.setRaw(getStorageKey(baseKey), value); } function createSpanElements(text) { diff --git a/static/assets/js/main.js b/static/assets/js/main.js index 6699339d33..f00ec17445 100644 --- a/static/assets/js/main.js +++ b/static/assets/js/main.js @@ -1,6 +1,6 @@ // Theme is applied immediately, to prevent flashing on page load (() => { - const themeid = localStorage.getItem("theme"); + const themeid = store.get("theme"); const themes = { catppuccinMocha: "/assets/css/themes/catppuccin/mocha.css", catppuccinMacchiato: "/assets/css/themes/catppuccin/macchiato.css", @@ -29,7 +29,7 @@ themeLink.href = themes[themeid]; document.head.appendChild(themeLink); } else { - const customThemeCss = localStorage.getItem(`theme-${themeid}`); + const customThemeCss = store.getRaw(`t${themeid}`); if (customThemeCss) { const customThemeStyle = document.createElement("style"); customThemeStyle.textContent = customThemeCss; @@ -42,15 +42,15 @@ const DEFAULT = "sj"; function initProxy() { - const current = localStorage.getItem(PROXY_KEY); + const current = store.get(PROXY_KEY); if (current === null) { - localStorage.setItem(PROXY_KEY, DEFAULT); + store.set(PROXY_KEY, DEFAULT); return DEFAULT; } if (ALLOWED.includes(current)) { return current; } - localStorage.setItem(PROXY_KEY, DEFAULT); + store.set(PROXY_KEY, DEFAULT); return DEFAULT; } @@ -106,7 +106,7 @@ document.addEventListener("DOMContentLoaded", () => { const nav = document.querySelector(".nav-bar"); if (nav) { - const themeId = localStorage.getItem("theme"); + const themeId = store.get("theme"); const lightThemes = ["Inverted", "light", "gruvboxLight", "solarizedLight"]; const LogoUrl = lightThemes.includes(themeId) ? "/assets/media/favicon/main-inverted.png" : "/assets/media/favicon/main.png"; const html = ` @@ -124,8 +124,8 @@ document.addEventListener("DOMContentLoaded", () => { // Favicon and Name Logic const icon = document.getElementById("tab-favicon"); const title = document.getElementById("t"); - const cloakName = localStorage.getItem("CustomName") || localStorage.getItem("name"); - const cloakIcon = localStorage.getItem("CustomIcon") || localStorage.getItem("icon"); + const cloakName = store.get("CustomName") || store.get("name"); + const cloakIcon = store.get("CustomIcon") || store.get("icon"); if (cloakName) title.textContent = cloakName; if (cloakIcon) { const safeIcon = reconstructSafeUrl(cloakIcon); @@ -133,8 +133,8 @@ document.addEventListener("DOMContentLoaded", () => { } // Event Key Logic - const eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; - const rawPLink = localStorage.getItem("pLink") || "https://classroom.google.com/"; + const eventKey = JSON.parse(store.get("eventKey")) || ["`"]; + const rawPLink = store.get("pLink") || "https://classroom.google.com/"; const safePLink = reconstructSafeUrl(rawPLink) ?? "https://classroom.google.com/"; const panicAnchor = document.createElement("a"); @@ -153,7 +153,7 @@ document.addEventListener("DOMContentLoaded", () => { }); // Background Image Logic - const savedBackgroundImage = localStorage.getItem("backgroundImage"); + const savedBackgroundImage = store.get("backgroundImage"); if (savedBackgroundImage === "none") { document.body.style.backgroundImage = "none"; } else if (savedBackgroundImage) { @@ -161,7 +161,7 @@ document.addEventListener("DOMContentLoaded", () => { } // Background Particles - if (localStorage.getItem("particles") === "true") { + if (store.get("particles") === "true") { // CSS Parallax Pixel Stars (based on codepen.io/sarazond/pen/LYGbwj) ["stars", "stars2", "stars3"].forEach(id => { if (!document.getElementById(id)) { @@ -174,7 +174,7 @@ document.addEventListener("DOMContentLoaded", () => { // Pointer Effects — cursor.js is only loaded when an effect is active const CURSOR_EFFECTS = ["rainbow-stars", "white-orbs", "rainbow-trail", "blue-orbs", "red-circle", "the-sims", "curly-cursor"]; - const activePointer = localStorage.getItem("pointer"); + const activePointer = store.get("pointer"); if (CURSOR_EFFECTS.includes(activePointer)) { const cursorScript = document.createElement("script"); diff --git a/static/assets/js/search.js b/static/assets/js/search.js index 0413fe867a..1c0add541d 100644 --- a/static/assets/js/search.js +++ b/static/assets/js/search.js @@ -97,7 +97,7 @@ if (form && input && !isTabsPage()) { } function isScramjet(proxyOverride) { - const choice = proxyOverride ?? localStorage.getItem("proxy"); + const choice = proxyOverride ?? store.get("proxy"); return choice === "sj"; } @@ -119,7 +119,7 @@ async function navigate(value, path, proxyOverride) { if (window.waitForProxyBoot) await window.waitForProxyBoot(); let url = value.trim(); - const engine = localStorage.getItem("engine"); + const engine = store.get("engine"); const searchUrl = engine ? engine : "https://search.brave.com/search?q="; if (!isValidUrl(url)) { @@ -128,7 +128,7 @@ async function navigate(value, path, proxyOverride) { url = `https://${url}`; } - const proxyChoice = proxyOverride ?? localStorage.getItem("proxy"); + const proxyChoice = proxyOverride ?? store.get("proxy"); const proxyUrl = await encodeUrl(url, proxyChoice); sessionStorage.setItem("GoUrl", proxyUrl); @@ -157,7 +157,7 @@ function isValidUrl(val = "") { const vendor = self.__vendor || {}; function getWispUrl() { - const custom = localStorage.getItem("wisp-url")?.trim(); + const custom = store.get("wisp-url")?.trim(); if (custom && /^wss?:\/\//i.test(custom)) return custom; const protocol = location.protocol === "https:" ? "wss" : "ws"; return `${protocol}://${location.host}/wisp/`; @@ -169,10 +169,10 @@ function isValidUrl(val = "") { current = await connection.getTransport(); } catch {} - if (current === transportPath && localStorage.getItem("transport-signature") === signature) return; + if (current === transportPath && store.get("transport-signature") === signature) return; await connection.setTransport(transportPath, options); - localStorage.setItem("transport-signature", signature); + store.set("transport-signature", signature); } async function init() { @@ -183,7 +183,7 @@ function isValidUrl(val = "") { const wisp = getWispUrl(); const connection = new BareMuxConnection(vendor.baremuxWorker); - if (localStorage.getItem("transport") === "libcurl") { + if (store.get("transport") === "libcurl") { await ensureTransport(connection, vendor.libcurl, [{ websocket: wisp }], `${vendor.libcurl}|${wisp}`); } else { await ensureTransport(connection, vendor.epoxy, [{ wisp }], `${vendor.epoxy}|${wisp}`); diff --git a/static/assets/js/settings.js b/static/assets/js/settings.js index f9f8936a31..6663358fef 100644 --- a/static/assets/js/settings.js +++ b/static/assets/js/settings.js @@ -2,9 +2,9 @@ document.addEventListener("DOMContentLoaded", () => { const adTypeElement = document.getElementById("adType"); if (adTypeElement) { adTypeElement.addEventListener("change", function () { - localStorage.setItem("ads", this.value === "default" ? "on" : this.value); + store.set("ads", this.value === "default" ? "on" : this.value); }); - const storedAd = localStorage.getItem("ads"); + const storedAd = store.get("ads"); adTypeElement.value = storedAd === "popups" || storedAd === "off" ? storedAd : "default"; } @@ -12,32 +12,32 @@ document.addEventListener("DOMContentLoaded", () => { const pChangeElement = document.getElementById("pChange"); if (pChangeElement) { pChangeElement.addEventListener("change", function () { - localStorage.setItem("proxy", this.value); + store.set("proxy", this.value); if (transportRow) transportRow.style.display = this.value === "sj" ? "" : "none"; }); - pChangeElement.value = localStorage.getItem("proxy") || "sj"; + pChangeElement.value = store.get("proxy") || "sj"; } const transportElement = document.getElementById("transport-dropdown"); if (transportElement) { - transportElement.value = localStorage.getItem("transport") === "libcurl" ? "libcurl" : "epoxy"; + transportElement.value = store.get("transport") === "libcurl" ? "libcurl" : "epoxy"; transportElement.addEventListener("change", function () { - localStorage.setItem("transport", this.value); + store.set("transport", this.value); window.location.reload(); }); - if (transportRow) transportRow.style.display = (localStorage.getItem("proxy") || "sj") === "sj" ? "" : "none"; + if (transportRow) transportRow.style.display = (store.get("proxy") || "sj") === "sj" ? "" : "none"; } const wispInput = document.getElementById("wisp-input"); const wispSaveBtn = document.getElementById("wisp-save-btn"); if (wispInput && wispSaveBtn) { - wispInput.value = localStorage.getItem("wisp-url") || ""; + wispInput.value = store.get("wisp-url") || ""; wispSaveBtn.addEventListener("click", () => { const val = wispInput.value.trim(); if (val === "") { - localStorage.removeItem("wisp-url"); + store.remove("wisp-url"); } else if (/^wss?:\/\//i.test(val)) { - localStorage.setItem("wisp-url", val); + store.set("wisp-url", val); } else { alert("Enter a valid Wisp URL starting with ws:// or wss://"); return; @@ -49,9 +49,9 @@ document.addEventListener("DOMContentLoaded", () => { const eventKeyInput = document.getElementById("eventKeyInput"); const linkInput = document.getElementById("linkInput"); - let eventKey = JSON.parse(localStorage.getItem("eventKey")) || ["`"]; - const eventKeyRaw = localStorage.getItem("eventKeyRaw") || "`"; - let pLink = localStorage.getItem("pLink") || "https://classroom.google.com/"; + let eventKey = JSON.parse(store.get("eventKey")) || ["`"]; + const eventKeyRaw = store.get("eventKeyRaw") || "`"; + let pLink = store.get("pLink") || "https://classroom.google.com/"; eventKeyInput.value = eventKeyRaw; linkInput.value = pLink; @@ -69,7 +69,7 @@ document.addEventListener("DOMContentLoaded", () => { while (cloakDropdown.firstChild) cloakDropdown.removeChild(cloakDropdown.firstChild); for (const option of sortedOptions) cloakDropdown.appendChild(option); - cloakDropdown.value = localStorage.getItem("selectedOption") || "Classroom"; + cloakDropdown.value = store.get("selectedOption") || "Classroom"; cloakDropdown.addEventListener("change", () => handleDropdownChange(cloakDropdown)); document.getElementById("cloak-save-btn").addEventListener("click", () => { @@ -81,16 +81,16 @@ document.addEventListener("DOMContentLoaded", () => { redirectToMainDomain(); }); - document.getElementById("custom-cloak-name").value = localStorage.getItem("CustomName") || ""; - document.getElementById("custom-cloak-icon").value = localStorage.getItem("CustomIcon") || ""; + document.getElementById("custom-cloak-name").value = store.get("CustomName") || ""; + document.getElementById("custom-cloak-icon").value = store.get("CustomIcon") || ""; - if (localStorage.getItem("ab") === "true") { + if (store.get("ab") === "true") { document.getElementById("ab-settings-switch").checked = true; } // Themes const themeDropdown = document.getElementById("theme-dropdown"); - themeDropdown.value = localStorage.getItem("theme") || "d"; + themeDropdown.value = store.get("theme") || "d"; themeDropdown.addEventListener("change", function () { themeChange(this); }); @@ -100,8 +100,8 @@ document.addEventListener("DOMContentLoaded", () => { const bgCustomRow = document.getElementById("background-custom-row"); const bgInput = document.getElementById("background-input"); - const savedBg = localStorage.getItem("backgroundImage"); - const savedBgMode = localStorage.getItem("backgroundMode") || "default"; + const savedBg = store.get("backgroundImage"); + const savedBgMode = store.get("backgroundMode") || "default"; bgDropdown.value = savedBgMode; if (savedBgMode === "custom") { bgCustomRow.style.display = ""; @@ -110,15 +110,15 @@ document.addEventListener("DOMContentLoaded", () => { bgDropdown.addEventListener("change", function () { const mode = this.value; - localStorage.setItem("backgroundMode", mode); + store.set("backgroundMode", mode); if (mode === "default") { bgCustomRow.style.display = "none"; - localStorage.removeItem("backgroundImage"); + store.remove("backgroundImage"); document.body.style.backgroundImage = ""; window.location.reload(); } else if (mode === "none") { bgCustomRow.style.display = "none"; - localStorage.setItem("backgroundImage", "none"); + store.set("backgroundImage", "none"); document.body.style.backgroundImage = "none"; } else if (mode === "custom") { bgCustomRow.style.display = ""; @@ -128,28 +128,28 @@ document.addEventListener("DOMContentLoaded", () => { document.getElementById("save-button").addEventListener("click", () => { const url = bgInput.value.trim(); if (url) { - localStorage.setItem("backgroundImage", url); - localStorage.setItem("backgroundMode", "custom"); + store.set("backgroundImage", url); + store.set("backgroundMode", "custom"); document.body.style.backgroundImage = `url('${url}')`; } }); // Background Particles const particlesDropdown = document.getElementById("particles-dropdown"); - particlesDropdown.value = localStorage.getItem("particles") === "true" ? "on" : "off"; + particlesDropdown.value = store.get("particles") === "true" ? "on" : "off"; particlesDropdown.addEventListener("change", function () { - localStorage.setItem("particles", this.value === "on" ? "true" : "false"); + store.set("particles", this.value === "on" ? "true" : "false"); }); // Cursor Effects const pointerDropdown = document.getElementById("pointer-dropdown"); - pointerDropdown.value = localStorage.getItem("pointer") || "default"; + pointerDropdown.value = store.get("pointer") || "default"; pointerDropdown.addEventListener("change", function () { const val = this.value; if (val === "default") { - localStorage.removeItem("pointer"); + store.remove("pointer"); } else { - localStorage.setItem("pointer", val); + store.set("pointer", val); } window.location.reload(); }); @@ -159,7 +159,7 @@ document.addEventListener("DOMContentLoaded", () => { }); document.getElementById("engine-save-btn").addEventListener("click", saveCustomEngine); - const savedEngineName = localStorage.getItem("enginename"); + const savedEngineName = store.get("enginename"); if (savedEngineName) document.getElementById("engine").value = savedEngineName; }); @@ -169,9 +169,9 @@ function saveEventKey() { const eventKey = eventKeyInput.value.split(","); const eventKeyRaw = eventKeyInput.value; const pLink = linkInput.value; - localStorage.setItem("eventKey", JSON.stringify(eventKey)); - localStorage.setItem("eventKeyRaw", eventKeyRaw); - localStorage.setItem("pLink", pLink); + store.set("eventKey", JSON.stringify(eventKey)); + store.set("eventKeyRaw", eventKeyRaw); + store.set("pLink", pLink); // biome-ignore lint: idk window.location = window.location; } @@ -238,13 +238,13 @@ function handleDropdownChange(selectElement) { const selectedValue = selectElement.value; const preset = cloakOptions[selectedValue]; - localStorage.removeItem("CustomName"); - localStorage.removeItem("CustomIcon"); - localStorage.setItem("selectedOption", selectedValue); + store.remove("CustomName"); + store.remove("CustomIcon"); + store.set("selectedOption", selectedValue); if (preset) { - localStorage.setItem("name", preset.name); - localStorage.setItem("icon", preset.icon); + store.set("name", preset.name); + store.set("icon", preset.icon); document.getElementById("t").textContent = preset.name; document.getElementById("tab-favicon").setAttribute("href", preset.icon); } @@ -256,18 +256,18 @@ function saveCustomCloak() { const nameVal = document.getElementById("custom-cloak-name").value.trim(); const iconVal = document.getElementById("custom-cloak-icon").value.trim(); if (nameVal) { - localStorage.setItem("CustomName", nameVal); - localStorage.setItem("name", nameVal); + store.set("CustomName", nameVal); + store.set("name", nameVal); } if (iconVal) { - localStorage.setItem("CustomIcon", iconVal); - localStorage.setItem("icon", iconVal); + store.set("CustomIcon", iconVal); + store.set("icon", iconVal); } } function resetCustomCloak() { - localStorage.removeItem("CustomName"); - localStorage.removeItem("CustomIcon"); + store.remove("CustomName"); + store.remove("CustomIcon"); document.getElementById("custom-cloak-name").value = ""; document.getElementById("custom-cloak-icon").value = ""; } @@ -292,9 +292,9 @@ function redirectToMainDomain() { function themeChange(selectElement) { const value = selectElement.value; if (value === "d") { - localStorage.removeItem("theme"); + store.remove("theme"); } else { - localStorage.setItem("theme", value); + store.set("theme", value); } window.location.reload(); } @@ -322,9 +322,9 @@ function AB() { return; } - const name = localStorage.getItem("name") || "My Drive - Google Drive"; - const icon = localStorage.getItem("icon") || "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png"; - const panicLink = localStorage.getItem("pLink") || getRandomURL(); + const name = store.get("name") || "My Drive - Google Drive"; + const icon = store.get("icon") || "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png"; + const panicLink = store.get("pLink") || getRandomURL(); const doc = popup.document; const iframe = doc.createElement("iframe"); @@ -358,8 +358,8 @@ function AB() { } function toggleAB() { - const ab = localStorage.getItem("ab"); - localStorage.setItem("ab", ab === "true" ? "false" : "true"); + const ab = store.get("ab"); + store.set("ab", ab === "true" ? "false" : "true"); } function changeEngine(dropdown) { @@ -373,15 +373,15 @@ function changeEngine(dropdown) { Ecosia: "https://www.ecosia.org/search?q=", }; const selected = dropdown.value; - localStorage.setItem("engine", engineUrls[selected]); - localStorage.setItem("enginename", selected); + store.set("engine", engineUrls[selected]); + store.set("enginename", selected); } function saveCustomEngine() { const customEngine = document.getElementById("engine-form").value.trim(); if (customEngine) { - localStorage.setItem("engine", customEngine); - localStorage.setItem("enginename", "Custom"); + store.set("engine", customEngine); + store.set("enginename", "Custom"); } else { alert("Please enter a custom search engine value."); } @@ -433,6 +433,7 @@ function importSaveData() { Object.entries(data.localStorage).forEach(([key, value]) => { localStorage.setItem(key, value); }); + store.reload(); if (typeof window.resolveProxyChoice === "function") { window.resolveProxyChoice(); } diff --git a/static/assets/js/storage.js b/static/assets/js/storage.js new file mode 100644 index 0000000000..d8fa4c397f --- /dev/null +++ b/static/assets/js/storage.js @@ -0,0 +1,152 @@ +// The codec must stay synchronous: main.js reads the theme before first paint. +// XOR plus base64url is obfuscation, not encryption. The key ships with the page, so this only +// keeps settings from being readable at a glance or found by a string scan. +(() => { + const KEY = "cfg"; + const SCHEMA = 1; + const XOR_KEY = [0x3f, 0x5c, 0x91, 0x27, 0xe8, 0x4a, 0xb3, 0x6d, 0x1e, 0xc5, 0x72, 0xa9]; + + // Codec 0 is never written, only accepted, so the write codec can change without a migration. + const WRITE_CODEC = "1"; + const CODECS = { + 0: { encode: text => text, decode: text => text }, + 1: { encode: text => base64url(xor(new TextEncoder().encode(text))), decode: text => new TextDecoder().decode(xor(unbase64url(text))) }, + }; + + // Semantic changes only. Adding or removing a field needs no entry. + const MIGRATIONS = {}; + + function xor(bytes) { + const out = new Uint8Array(bytes.length); + for (let i = 0; i < bytes.length; i++) out[i] = bytes[i] ^ XOR_KEY[i % XOR_KEY.length]; + return out; + } + + function base64url(bytes) { + let binary = ""; + for (const byte of bytes) binary += String.fromCharCode(byte); + return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); + } + + function unbase64url(text) { + const binary = atob(text.replace(/-/g, "+").replace(/_/g, "/")); + const out = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i); + return out; + } + + let fields = {}; + // Unreadable data is copied to cfg.x on the next write rather than overwritten, so a value + // written by a newer build survives a rollback. + let preserve = false; + + function decode(raw) { + if (raw == null || raw === "") return {}; + const codec = CODECS[raw[0]]; + if (!codec) { + preserve = true; + return {}; + } + let state; + try { + state = JSON.parse(codec.decode(raw.slice(1))); + } catch { + preserve = true; + return {}; + } + if (!state || typeof state !== "object" || typeof state.d !== "object" || state.d === null) { + preserve = true; + return {}; + } + if (!Number.isInteger(state.v) || state.v > SCHEMA) { + preserve = true; + return {}; + } + let data = state.d; + for (let v = state.v; v < SCHEMA; v++) data = MIGRATIONS[v] ? MIGRATIONS[v](data) : data; + return data; + } + + function read() { + try { + return localStorage.getItem(KEY); + } catch { + return null; + } + } + + function write(data) { + try { + if (preserve) { + const original = read(); + if (original != null) localStorage.setItem(`${KEY}.x`, original); + preserve = false; + } + localStorage.setItem(KEY, WRITE_CODEC + CODECS[WRITE_CODEC].encode(JSON.stringify({ v: SCHEMA, d: data }))); + fields = data; + } catch {} + } + + // Re-read first so this tab's older snapshot cannot clobber another tab's change. + function mutate(apply) { + const data = { ...decode(read()) }; + apply(data); + write(data); + } + + function sideKey(name) { + return `${KEY}.${name}`; + } + + // Clearing preserve matters: the value that could not be read may have just been replaced by + // another tab, and backing up the replacement would be wrong. + function reload() { + preserve = false; + fields = decode(read()); + } + + fields = decode(read()); + + // Only another tab reaches here; the event never fires in the tab that caused it. A null key + // means clear(). Other keys, including the sidecars, must not reset app state. + window.addEventListener("storage", event => { + if (event.key === KEY || event.key === null) reload(); + }); + + window.store = { + get(field) { + return Object.hasOwn(fields, field) ? fields[field] : null; + }, + set(field, value) { + mutate(data => { + data[field] = String(value); + }); + }, + remove(field) { + mutate(data => { + delete data[field]; + }); + }, + getRaw(name) { + try { + return localStorage.getItem(sideKey(name)); + } catch { + return null; + } + }, + setRaw(name, value) { + try { + localStorage.setItem(sideKey(name), value); + } catch {} + }, + removeRaw(name) { + try { + localStorage.removeItem(sideKey(name)); + } catch {} + }, + all() { + return { ...fields }; + }, + reload, + }; +})(); diff --git a/static/assets/js/tabs.js b/static/assets/js/tabs.js index d8d4a8c02b..505e749329 100644 --- a/static/assets/js/tabs.js +++ b/static/assets/js/tabs.js @@ -7,7 +7,7 @@ function prependHttps(url) { } function isScramjetEnabled() { - return localStorage.getItem("proxy") === "sj"; + return store.get("proxy") === "sj"; } async function encodeProxyUrl(url) { @@ -42,20 +42,15 @@ function updateAddressBar() { if (currentUrl.includes("/uv/scramjet/")) { if (window.scramjet?.decodeUrl) { - const decoded = window.scramjet.decodeUrl(currentUrl); - localStorage.setItem("decoded", decoded); - input.value = decoded; + input.value = window.scramjet.decodeUrl(currentUrl); } else { input.value = currentUrl; } } else if (currentUrl.includes("/uv/")) { const path = currentUrl.replace(window.location.origin, "").replace("/uv/", ""); - localStorage.setItem("decoded", path); input.value = __uv$config.decodeUrl ? __uv$config.decodeUrl(path) : window.decode.xor(path); } else { - const path = currentUrl.replace(window.location.origin, ""); - input.value = path; - localStorage.setItem("decoded", path); + input.value = currentUrl.replace(window.location.origin, ""); } } @@ -79,8 +74,8 @@ function popoutTab() { const newWindow = window.open("about:blank", "_blank"); if (!newWindow) return; - const cloakName = localStorage.getItem("name") || "My Drive - Google Drive"; - const cloakIcon = localStorage.getItem("icon") || "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png"; + const cloakName = store.get("name") || "My Drive - Google Drive"; + const cloakIcon = store.get("icon") || "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png"; newWindow.document.title = cloakName; @@ -189,7 +184,7 @@ window.addEventListener("load", () => { form.addEventListener("submit", async event => { event.preventDefault(); const formValue = input.value.trim(); - const engine = localStorage.getItem("engine") || "https://search.brave.com/search?q="; + const engine = store.get("engine") || "https://search.brave.com/search?q="; const url = isUrl(formValue) ? prependHttps(formValue) : `${engine}${formValue}`; await navigateActiveTab(url); }); diff --git a/static/games.html b/static/games.html index dc347479e7..86c23e72e2 100644 --- a/static/games.html +++ b/static/games.html @@ -11,6 +11,7 @@ + diff --git a/static/index.html b/static/index.html index 98a5580aed..2c2f11d28b 100644 --- a/static/index.html +++ b/static/index.html @@ -11,6 +11,7 @@ + diff --git a/static/settings.html b/static/settings.html index 76a307cc6a..bf514a7885 100644 --- a/static/settings.html +++ b/static/settings.html @@ -12,6 +12,7 @@ + diff --git a/static/tabs.html b/static/tabs.html index 9016cbb3b2..61dc718a1d 100644 --- a/static/tabs.html +++ b/static/tabs.html @@ -10,6 +10,7 @@ Home +