diff --git a/control-cli/src/cli.ts b/control-cli/src/cli.ts index 5f643a5..321b3a4 100644 --- a/control-cli/src/cli.ts +++ b/control-cli/src/cli.ts @@ -73,7 +73,8 @@ type DeviceAssignmentsConfig = { }; const getDeviceAssignmentsConfigPath = () => - path.join(getWorkspaceRoot(), "orchestrator", "device-assignments.json"); + process.env.QUIXOS_DEVICE_ASSIGNMENTS_FILE ?? + path.join(getWorkspaceRoot(), "packages", "device-assignments.json"); const loadDeviceAssignmentsConfig = (): DeviceAssignmentsConfig => { const filePath = getDeviceAssignmentsConfigPath(); @@ -935,7 +936,7 @@ const assignCommand = async (args: string[]) => { ); console.log(""); } - console.log("result: staged in orchestrator/device-assignments.json"); + console.log(`result: staged in ${shortPath(getDeviceAssignmentsConfigPath())}`); console.log(`note: cutover required to apply assignment${assignments.length === 1 ? "" : "s"}`); }; diff --git a/flake.nix b/flake.nix index 8c42e1f..0be015c 100644 --- a/flake.nix +++ b/flake.nix @@ -12,15 +12,66 @@ }; outputs = { self, nixpkgs, flake-utils, control-cli }: - flake-utils.lib.eachDefaultSystem (system: + (flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; qx-control = control-cli.packages.${system}.default; + orchestratorProject = (pkgs.callPackage ./orchestrator/yarn-project.nix { }) { + src = ./orchestrator; + overrideAttrs = old: { + postInstall = (old.postInstall or "") + '' + cp --reflink=auto --recursive ${./quixos-control-plane-protocol} \ + "$out/libexec/quixos-control-plane-protocol" + ''; + }; + }; + quixos-orchestrator = pkgs.writeShellApplication { + name = "quixos-orchestrator"; + runtimeInputs = [ + pkgs.git + pkgs.nix + pkgs.nodejs_24 + orchestratorProject.passthru.yarn + ]; + text = '' + exec ${orchestratorProject.passthru.yarn}/bin/yarn start -- "$@" + ''; + }; + projectVisualizerWorkspaceSrc = pkgs.runCommand "quixos-project-visualizer-workspace-src" { } '' + mkdir -p "$out" + cp --reflink=auto --recursive ${./project-visualizer} "$out/project-visualizer" + cp --reflink=auto --recursive ${./quixos-control-plane-protocol} "$out/quixos-control-plane-protocol" + ''; + projectVisualizerProject = (pkgs.callPackage ./project-visualizer/yarn-project.nix { }) { + src = "${projectVisualizerWorkspaceSrc}/project-visualizer"; + overrideAttrs = old: { + buildPhase = '' + runHook preBuild + yarn build + runHook postBuild + ''; + installPhase = '' + runHook preInstall + cp --reflink=auto --recursive dist "$out" + runHook postInstall + ''; + }; + }; + project-visualizer-static = projectVisualizerProject; in { packages.qx-control = qx-control; + packages.quixos-orchestrator = quixos-orchestrator; + packages.project-visualizer-static = project-visualizer-static; + packages.default = quixos-orchestrator; + apps.qx-control = control-cli.apps.${system}.default // { meta.description = "Quixos control-plane CLI"; }; + apps.quixos-orchestrator = { + type = "app"; + program = "${quixos-orchestrator}/bin/quixos-orchestrator"; + meta.description = "Quixos orchestrator"; + }; devShells.default = pkgs.mkShell { packages = [ @@ -43,5 +94,7 @@ fi ''; }; - }); + })) // { + nixosModules.quixosHost = import ./nix/nixos/quixos-host.nix { inherit self; }; + }; } diff --git a/nix/nixos/quixos-host.nix b/nix/nixos/quixos-host.nix new file mode 100644 index 0000000..48407e4 --- /dev/null +++ b/nix/nixos/quixos-host.nix @@ -0,0 +1,217 @@ +{ self }: +{ config, lib, pkgs, ... }: + +let + cfg = config.services.quixosHost; + quixosPackages = self.packages.${pkgs.system}; +in +{ + options.services.quixosHost = { + enable = lib.mkEnableOption "Quixos host"; + + domain = lib.mkOption { + type = lib.types.str; + description = "Public domain served by Caddy."; + }; + + packagesPath = lib.mkOption { + type = lib.types.str; + default = "/persist/srv/quixos/packages"; + description = "Mutable package-tree checkout path."; + }; + + dataRoot = lib.mkOption { + type = lib.types.str; + default = "/persist/var/lib/quixos"; + description = "Persistent Quixos runtime state root."; + }; + + secretsEnvironmentFile = lib.mkOption { + type = lib.types.str; + default = "/persist/secrets/quixos.env"; + description = "Environment file containing Quixos secrets."; + }; + + packageTreeRepo = lib.mkOption { + type = lib.types.str; + default = "https://gitea-external.egads.tutti.syntaxblitz.net/quixos-packages/packages.git"; + description = "Git URL for the mutable package-tree super-repo."; + }; + + packageTreeRef = lib.mkOption { + type = lib.types.str; + default = "master"; + description = "Package-tree ref to clone on first boot."; + }; + + forcePackageTreeRefOnBoot = lib.mkOption { + type = lib.types.bool; + default = false; + description = "Whether each boot should force the package tree back to packageTreeRef."; + }; + + persistDevice = lib.mkOption { + type = lib.types.str; + description = "Persistent block device path mounted at /persist."; + }; + + zfsPool = lib.mkOption { + type = lib.types.str; + default = "quixos-persist"; + description = "ZFS pool name on the persistent block device."; + }; + + hostId = lib.mkOption { + type = lib.types.str; + default = "71756978"; + description = "Eight hex digit hostId required by ZFS."; + }; + + enableSsh = lib.mkOption { + type = lib.types.bool; + default = false; + description = "Enable inbound SSH in the NixOS host config. AWS ingress is managed by OpenTofu."; + }; + }; + + config = lib.mkIf cfg.enable { + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + networking.hostId = cfg.hostId; + boot.supportedFilesystems = [ "zfs" ]; + boot.zfs.extraPools = [ cfg.zfsPool ]; + services.zfs.autoScrub = { + enable = true; + pools = [ cfg.zfsPool ]; + }; + + fileSystems."/nix" = { + device = "${cfg.zfsPool}/nix"; + fsType = "zfs"; + neededForBoot = true; + }; + + fileSystems."/persist" = { + device = "${cfg.zfsPool}/persist"; + fsType = "zfs"; + neededForBoot = true; + }; + + users.groups.quixos = {}; + users.users.quixos = { + isSystemUser = true; + group = "quixos"; + home = cfg.dataRoot; + createHome = true; + }; + users.users.caddy.extraGroups = [ "quixos" ]; + + environment.systemPackages = [ + pkgs.git + pkgs.nix + pkgs.amazon-ssm-agent + quixosPackages.qx-control + ]; + + services.amazon-ssm-agent.enable = true; + + services.openssh = { + enable = cfg.enableSsh; + hostKeys = [ + { + path = "/persist/etc/ssh/ssh_host_ed25519_key"; + type = "ed25519"; + } + { + path = "/persist/etc/ssh/ssh_host_rsa_key"; + type = "rsa"; + bits = 4096; + } + ]; + }; + + systemd.tmpfiles.rules = [ + "d /persist/etc/ssh 0700 root root -" + "d /persist/secrets 0700 root root -" + "d /persist/srv/quixos 0755 quixos quixos -" + "d ${cfg.dataRoot} 0750 quixos quixos -" + "d /persist/var/lib/acme 0750 caddy caddy -" + "L /var/lib/acme - - - - /persist/var/lib/acme" + ]; + + systemd.services.quixos-package-tree = { + description = "Prepare Quixos package tree"; + wantedBy = [ "multi-user.target" ]; + before = [ "quixos-orchestrator.service" ]; + after = [ "network-online.target" "persist.mount" ]; + wants = [ "network-online.target" ]; + serviceConfig = { + Type = "oneshot"; + User = "quixos"; + Group = "quixos"; + RemainAfterExit = true; + }; + script = '' + set -eu + mkdir -p "$(dirname ${lib.escapeShellArg cfg.packagesPath})" + if [ ! -d ${lib.escapeShellArg cfg.packagesPath}/.git ]; then + git clone ${lib.escapeShellArg cfg.packageTreeRepo} ${lib.escapeShellArg cfg.packagesPath} + git -C ${lib.escapeShellArg cfg.packagesPath} checkout --detach ${lib.escapeShellArg cfg.packageTreeRef} + git -C ${lib.escapeShellArg cfg.packagesPath} submodule update --init --recursive + elif ${if cfg.forcePackageTreeRefOnBoot then "true" else "false"}; then + git -C ${lib.escapeShellArg cfg.packagesPath} fetch --tags --prune origin + git -C ${lib.escapeShellArg cfg.packagesPath} checkout --detach ${lib.escapeShellArg cfg.packageTreeRef} + git -C ${lib.escapeShellArg cfg.packagesPath} submodule sync --recursive + git -C ${lib.escapeShellArg cfg.packagesPath} submodule update --init --recursive + fi + ''; + }; + + systemd.services.quixos-orchestrator = { + description = "Quixos orchestrator"; + wantedBy = [ "multi-user.target" ]; + after = [ "network-online.target" "quixos-package-tree.service" ]; + wants = [ "network-online.target" "quixos-package-tree.service" ]; + serviceConfig = { + User = "quixos"; + Group = "quixos"; + RuntimeDirectory = "quixos"; + RuntimeDirectoryMode = "0770"; + WorkingDirectory = "/persist/srv/quixos"; + EnvironmentFile = cfg.secretsEnvironmentFile; + Restart = "always"; + RestartSec = "5s"; + ExecStart = "${quixosPackages.quixos-orchestrator}/bin/quixos-orchestrator --packages-path ${cfg.packagesPath}"; + }; + environment = { + XDG_DATA_HOME = cfg.dataRoot; + QUIXOS_WORKSPACE_ROOT = "/persist/srv/quixos"; + QUIXOS_CONTROL_SOCKET = "/run/quixos/control.sock"; + QUIXOS_DEVICE_ASSIGNMENTS_FILE = "${cfg.packagesPath}/device-assignments.json"; + QUIXOS_REMOTE_DOM_RELAY_SOCKET = "/run/quixos/relay.sock"; + QUIXOS_REMOTE_DOM_RELAY_PUBLIC_WS_URL = "wss://${cfg.domain}/relay/"; + QUIXOS_REMOTE_DOM_RELAY_PUBLIC_HTTP_ORIGIN = "https://${cfg.domain}/relay"; + }; + }; + + services.caddy = { + enable = true; + virtualHosts.${cfg.domain}.extraConfig = '' + handle_path /control/* { + reverse_proxy unix//run/quixos/control.sock + } + + handle_path /relay/* { + reverse_proxy unix//run/quixos/relay.sock { + header_up X-Forwarded-Prefix /relay + } + } + + handle { + root * ${quixosPackages.project-visualizer-static} + file_server + } + ''; + }; + }; +} diff --git a/orchestrator/device-assignments.json b/orchestrator/device-assignments.json deleted file mode 100644 index 5fdf6d0..0000000 --- a/orchestrator/device-assignments.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "assignments": [] -} diff --git a/orchestrator/server.ts b/orchestrator/server.ts index dc2495a..420e1b1 100644 --- a/orchestrator/server.ts +++ b/orchestrator/server.ts @@ -330,6 +330,7 @@ if (!STATE_CONTEXT_HMAC_SECRET) { throw new Error("QUIXOS_STATE_CONTEXT_SECRET must be set"); } const CONTROL_PLANE_SECRET = process.env.QUIXOS_CONTROL_SECRET; +const CONTROL_PLANE_SOCKET = process.env.QUIXOS_CONTROL_SOCKET; const CONTROL_PLANE_HOST = process.env.QUIXOS_CONTROL_HOST ?? CONTROL_PLANE_DEFAULT_HOST; const CONTROL_PLANE_PORT = Number( @@ -1327,10 +1328,9 @@ const STATE_DIRECTORY_ROOT = path.join( "state-contexts", ); const DEVICE_STATE_FILE = path.join(QUIXOS_DATA_ROOT, "orchestrator-devices.json"); -const DEVICE_ASSIGNMENTS_FILE = path.join( - ORCHESTRATOR_DIR, - "device-assignments.json", -); +const DEVICE_ASSIGNMENTS_FILE = + process.env.QUIXOS_DEVICE_ASSIGNMENTS_FILE ?? + path.join(PACKAGES_PATH, "device-assignments.json"); const tryReadGitHead = (repoPath: string) => { try { @@ -1382,6 +1382,7 @@ const sortDeviceAssignmentsForSave = ( [...entries].sort((left, right) => left.deviceId.localeCompare(right.deviceId)); const saveDeviceAssignmentsConfig = () => { + fs.mkdirSync(path.dirname(DEVICE_ASSIGNMENTS_FILE), { recursive: true }); const payload = { assignments: sortDeviceAssignmentsForSave( [...devicesById.values()] @@ -5309,13 +5310,37 @@ if (CONTROL_PLANE_SECRET) { sendJson(response, 404, { error: "Not found" }); }); - controlPlaneServer.listen(CONTROL_PLANE_PORT, CONTROL_PLANE_HOST, () => { - console.log( - `Control plane listening on http://${CONTROL_PLANE_HOST}:${CONTROL_PLANE_PORT}`, - ); + const onControlPlaneListening = () => { + if (CONTROL_PLANE_SOCKET) { + try { + fs.chmodSync(CONTROL_PLANE_SOCKET, 0o660); + } catch { + // Best effort; systemd/Caddy can still proxy if permissions already fit. + } + console.log(`Control plane listening on unix:${CONTROL_PLANE_SOCKET}`); + } else { + console.log( + `Control plane listening on http://${CONTROL_PLANE_HOST}:${CONTROL_PLANE_PORT}`, + ); + } ensureWorkspaceHeadChecksWarm(); triggerRootBoot(); - }); + }; + + if (CONTROL_PLANE_SOCKET) { + try { + fs.rmSync(CONTROL_PLANE_SOCKET, { force: true }); + } catch { + // If removal fails, listen() will surface the useful error. + } + controlPlaneServer.listen(CONTROL_PLANE_SOCKET, onControlPlaneListening); + } else { + controlPlaneServer.listen( + CONTROL_PLANE_PORT, + CONTROL_PLANE_HOST, + onControlPlaneListening, + ); + } controlPlaneServer.on("upgrade", (request, socket, head) => { if (!request.url) { diff --git a/project-visualizer/.yarn/plugins/yarn-plugin-nixify.cjs b/project-visualizer/.yarn/plugins/yarn-plugin-nixify.cjs new file mode 100644 index 0000000..3402204 --- /dev/null +++ b/project-visualizer/.yarn/plugins/yarn-plugin-nixify.cjs @@ -0,0 +1 @@ +module.exports={name:"yarn-plugin-nixify",factory:function(e){var t;return(()=>{"use strict";var n={d:(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};n.r(r),n.d(r,{default:()=>E});const a=e("@yarnpkg/core"),o=e("clipanion");class i extends o.Command{constructor(...e){super(...e),this.locator=o.Option.String({required:!1})}async execute(){const e=await a.Configuration.find(this.context.cwd,this.context.plugins),{project:t}=await a.Project.find(e,this.context.cwd),n=await a.Cache.find(e),r=e.makeFetcher();return(await a.StreamReport.start({configuration:e,stdout:this.context.stdout},(async e=>{if(this.locator){const{locatorHash:o}=a.structUtils.parseLocator(this.locator,!0),i=t.originalPackages.get(o);if(!i)return void e.reportError(0,`Invalid locator: ${this.locator}`);await r.fetch(i,{checksums:t.storedChecksums,project:t,cache:n,fetcher:r,report:e})}else await e.startTimerPromise("Resolution step",(async()=>{await t.resolveEverything({report:e,lockfileOnly:!0})})),await e.startTimerPromise("Fetch step",(async()=>{await t.fetchEverything({cache:n,report:e,fetcher:r})}))}))).exitCode()}}i.paths=[["nixify","fetch"]];const s=e("@yarnpkg/fslib"),c=e("crypto");class l extends o.Command{constructor(...e){super(...e),this.locator=o.Option.String(),this.source=o.Option.String(),this.installLocation=o.Option.String()}async execute(){const e=await a.Configuration.find(this.context.cwd,this.context.plugins),{project:t}=await a.Project.find(e,this.context.cwd);return await t.restoreInstallState({restoreResolutions:!1}),(await a.StreamReport.start({configuration:e,stdout:this.context.stdout},(async n=>{await t.resolveEverything({report:n,lockfileOnly:!0});const r=a.structUtils.parseLocator(this.locator,!0),o=t.storedPackages.get(r.locatorHash);if(!o)return void n.reportError(0,`Invalid locator: ${this.locator}`);const i=s.ppath.join(t.cwd,this.installLocation);await s.xfs.mkdirpPromise(s.ppath.dirname(i)),await a.execUtils.execvp("cp",["-R",this.source,i],{cwd:t.cwd,strict:!0}),await a.execUtils.execvp("chmod",["-R","u+w",i],{cwd:t.cwd,strict:!0});const l=(0,c.createHash)("sha512");l.update(process.versions.node),e.triggerHook((e=>e.globalHashGeneration),t,(e=>{l.update("\0"),l.update(e)}));const d=l.digest("hex"),p=new Map,h=e=>{let n=p.get(e.locatorHash);if(void 0!==n)return n;const r=t.storedPackages.get(e.locatorHash);if(void 0===r)throw new Error("Assertion failed: The package should have been registered");const o=(0,c.createHash)("sha512");o.update(e.locatorHash),p.set(e.locatorHash,"");for(const e of r.dependencies.values()){const n=t.storedResolutions.get(e.descriptorHash);if(void 0===n)throw new Error(`Assertion failed: The resolution (${a.structUtils.prettyDescriptor(t.configuration,e)}) should have been registered`);const r=t.storedPackages.get(n);if(void 0===r)throw new Error("Assertion failed: The package should have been registered");o.update(h(r))}return n=o.digest("hex"),p.set(e.locatorHash,n),n},u=(0,c.createHash)("sha512").update(d).update(h(o)).update(i).digest("hex");t.storedBuildState.set(o.locatorHash,u),await t.persistInstallStateFile()}))).exitCode()}}l.paths=[["nixify","inject-build"]];const d=e("@yarnpkg/plugin-pnp"),p=JSON.stringify,h=(e,t,n=!1)=>t.split("\n").map((t=>t||n?e+t:t)).join("\n"),u=(e,t)=>{let n=e;for(const[e,r]of Object.entries(t))if("string"==typeof r&&(n=n.replace(new RegExp(`@@${e}@@`,"g"),r)),"boolean"==typeof r)for(;;){const t=n.split("\n"),a=t.indexOf(`#@@ IF ${e}`),o=t.indexOf(`#@@ ENDIF ${e}`);if(-1===a||o{if(!n)return;const o=s.npath.toPortablePath(this.binDir);for(const[r,a]of n.manifest.bin){const n=s.ppath.join(o,r),i=s.ppath.join(t.cwd,s.npath.toPortablePath(a));await this.writeWrapper(n,i,{configuration:e,project:t})}if(e.get("installNixBinariesForDependencies")){await t.resolveEverything({report:r,lockfileOnly:!0});const n=await a.scriptUtils.getPackageAccessibleBinaries(t.topLevelWorkspace.anchoredLocator,{project:t});for(const[r,[a,i]]of n.entries()){const n=s.ppath.join(o,r);await this.writeWrapper(n,s.npath.toPortablePath(i),{configuration:e,project:t})}}}))).exitCode()}async writeWrapper(e,t,{configuration:n,project:r}){let a;switch(n.get("nodeLinker")){case"pnp":{const e=(0,d.getPnpPath)(r),n=[];await s.xfs.existsPromise(e.cjs)&&n.push(`--require "${s.npath.fromPortablePath(e.cjs)}"`),await s.xfs.existsPromise(e.esmLoader)&&n.push(`--experimental-loader "${(0,f.pathToFileURL)(s.npath.fromPortablePath(e.esmLoader)).href}"`),a=u("#!/bin/sh\nexport NODE_OPTIONS='@@NODE_OPTIONS@@'\nexec '@@NODE_PATH@@' '@@BINARY_PATH@@' \"$@\"\n",{NODE_PATH:process.execPath,NODE_OPTIONS:n.join(" "),BINARY_PATH:t});break}case"node-modules":a=u("#!/bin/sh\nexec '@@NODE_PATH@@' '@@BINARY_PATH@@' \"$@\"\n",{NODE_PATH:process.execPath,BINARY_PATH:t});break;default:throw Error("Assertion failed: Invalid nodeLinker")}await s.xfs.writeFilePromise(e,a),await s.xfs.chmodPromise(e,493)}}g.paths=[["nixify","install-bin"]];const m=e("os"),y=e("@yarnpkg/plugin-patch"),b=(e,t)=>(0,c.createHash)(e).update(t).digest(),x=(e,t,{storePath:n="/nix/store",recursive:r=!1}={})=>{const[a,o]=t.split("-"),i=Buffer.from(o,"base64").toString("hex"),c=b("sha256",`fixed:out:${r?"r:":""}${a}:${i}:`).toString("hex"),l=(e=>{let t="",n=[...e].reverse().map((e=>e.toString(2).padStart(8,"0"))).join("");for(;n;)t+="0123456789abcdfghijklmnpqrsvwxyz"[parseInt(n.slice(0,5),2)],n=n.slice(5);return t})(((e,t)=>{const n=Buffer.alloc(20);for(let t=0;te.replace(/^\.+/,"").replace(/[^a-zA-Z0-9+._?=-]+/g,"-").slice(0,207)||"unknown",w=(e,t="sha512")=>t+"-"+Buffer.from(e,"hex").toString("base64"),k=e=>Buffer.from(e.split("-")[1],"base64").toString("hex"),I=2**32-1,P=(e,...t)=>{let n=0;const r=t.map((e=>{const t=Buffer.from(e);if(t.byteLength>I)throw Error(`NAR string too long: ${t.byteLength}`);return n+=8+8*Math.ceil(t.byteLength/8),t})),a=Buffer.alloc(n);let o=0;for(const e of r)a.writeUInt32LE(e.byteLength,o),e.copy(a,o+8),o+=8+8*Math.ceil(e.byteLength/8);e.write(a)},$=async(e,t,n)=>{if(t>I)throw Error(`NAR string too long: ${t}`);const r=Buffer.alloc(8);r.writeUInt32LE(t),e.write(r);for await(const t of n)e.write(t);const a=8-t%8;8!==a&&e.write(Buffer.alloc(a))},N=a.YarnVersion?.startsWith("3.")||!1,E={commands:[i,l,g],hooks:{afterAllInstalled:async(e,t)=>{!1!==t.persistProject&&e.configuration.get("enableNixify")&&await(async(e,t)=>{const{configuration:n,cwd:r}=e,{cache:o,report:i}=t,l=await s.xfs.realpathPromise(s.npath.toPortablePath((0,m.tmpdir)()));if(e.cwd.startsWith(l))return void i.reportInfo(0,`Skipping Nixify, because ${e.cwd} appears to be a temporary directory`);const d=n.get("nixExprPath"),f=n.get("yarnPath");let g;if(null===f){let e=(await s.xfs.readFilePromise(process.argv[1])).toString();if(e.startsWith("#!/nix/store/")){const t=e.substring(e.indexOf("\n")+1);e=`#!/usr/bin/env node\n${t}`}const t=a.hashUtils.makeHash(Buffer.from(e));g=["fetchurl {",` url = "https://repo.yarnpkg.com/${a.YarnVersion}/packages/yarnpkg-cli/bin/yarn.js";`,` hash = "${w(t)}";`,"}"].join("\n ")}else f.startsWith(r)?g="./"+s.ppath.relative(s.ppath.dirname(d),f):(g=p(f),i.reportWarning(0,`The Yarn path ${f} is outside the project - it may not be reachable by the Nix build`));const b=n.get("cacheFolder");let I;if(b.startsWith(r))I=p(s.ppath.relative(r,b));else{if(N||!n.get("enableGlobalCache"))throw Error(`The cache folder ${b} is outside the project, this is currently not supported`);I='".yarn/cache"'}const E=new Set;for(const e of n.sources.values())for(const t of e.split(", "))t.startsWith("<")||E.add(t);for(const e of E)s.ppath.resolve(r,e).startsWith(r)||i.reportWarning(0,`The config file ${e} is outside the project - it may not be reachable by the Nix build`);const D="./"+s.ppath.relative(s.ppath.dirname(d),s.ppath.resolve(r,"yarn.lock")),_=new Map,S=new Set(await s.xfs.readdirPromise(o.cwd)),L={unstablePackages:e.conditionalLocators};for(const t of e.storedPackages.values()){const{locatorHash:n}=t,r=e.storedChecksums.get(n),a=N?o.getLocatorPath(t,r||null,L):o.getLocatorPath(t,r||null);if(!a)continue;if(!S.has(s.ppath.basename(a)))continue;const i=r?o.getChecksumFilename(t,r):o.getVersionFilename(t);_.set(i,{pkg:t,checksum:r,cachePath:a})}const O=new Map,A=n.get("individualNixPackaging");let j="",T="";if(A){for(const[e,{pkg:t,checksum:n,cachePath:r}]of _.entries()){const o=a.structUtils.stringifyLocator(t),i=n?n.split("/").pop():await a.hashUtils.checksumFile(r);O.set(o,{cachePath:r,filename:e,hash:w(i)})}j="cacheEntries = {\n";for(const e of[...O.keys()].sort()){const t=O.get(e);j+=`${p(e)} = { ${[`filename = ${p(t.filename)};`,`hash = "${t.hash}";`].join(" ")} };\n`}j+="};"}else{const e=(0,c.createHash)("sha512");P(e,"nix-archive-1","(","type","directory");for(const t of[..._.keys()].sort()){const{cachePath:n}=_.get(t),{size:r}=await s.xfs.statPromise(n);P(e,"entry","(","name",t,"node","(","type","regular","contents"),await $(e,r,s.xfs.createReadStream(n)),P(e,")",")")}P(e,")"),e.end();for await(const t of e)T=w(t)}const C=n.get("isolatedNixBuilds");let R=new Set,F=[],B=[];const H=n.get("nodeLinker"),U=n.get("pnpUnpluggedFolder"),M=(t,n=new Set)=>{const r=a.structUtils.stringifyLocator(t);if(O.has(r)&&n.add(r),a.structUtils.isVirtualLocator(t)){const r=e.storedPackages.get(a.structUtils.devirtualizeLocator(t).locatorHash);if(!r)throw Error("Assertion failed: The locator should have been registered");M(r,n)}if(t.reference.startsWith("patch:")){const r=e.storedPackages.get(y.patchUtils.parseLocator(t).sourceLocator.locatorHash);if(!r)throw Error("Assertion failed: The locator should have been registered");M(r,n)}for(const r of t.dependencies.values()){const t=e.storedResolutions.get(r.descriptorHash);if(!t)throw Error("Assertion failed: The descriptor should have been registered");const a=e.storedPackages.get(t);if(!a)throw Error("Assertion failed: The locator should have been registered");M(a,n)}return n};for(const t of e.storedBuildState.keys()){const n=e.storedPackages.get(t);if(!n)throw Error("Assertion failed: The locator should have been registered");if(!C.includes(n.name))continue;let r;if("pnp"!==H)throw Error(`The nodeLinker ${H} is not supported for isolated Nix builds`);r=s.ppath.relative(e.cwd,s.ppath.join(U,a.structUtils.slugifyLocator(n),a.structUtils.getIdentVendorPath(n)));let o=n;if(a.structUtils.isVirtualLocator(o)){const{locatorHash:t}=a.structUtils.devirtualizeLocator(o),n=e.storedPackages.get(t);if(!n)throw Error("Assertion failed: The locator should have been registered");o=n}const i=a.structUtils.stringifyLocator(o),c=a.structUtils.stringifyLocator(n),l=`isolated.${p(i)}`;if(!R.has(o)){R.add(o);const e=[`pname = ${p(n.name)};`,`version = ${p(n.version)};`,`reference = ${p(o.reference)};`];if(A){const t=[...M(n)].sort().map((e=>`${p(e)}\n`)).join("");t&&e.push(`locators = [\n${t}];`)}const t=`override${V=n.name,V.split(/[^a-zA-Z0-9]+/g).filter((e=>e)).map((e=>{return(t=e).slice(0,1).toUpperCase()+t.slice(1);var t})).join("")}Attrs`;B.push(`${l} = optionalOverride (args.${t} or null) (mkIsolatedBuild { ${e.join(" ")} });`)}0===F.length&&F.push("# Copy in isolated builds."),F.push(`echo 'injecting build for ${n.name}'`,"yarn nixify inject-build \\",` ${p(c)} \\`,` \${${l}} \\`,` ${p(r)}`)}var V;if(F.length>0&&F.push("echo 'running yarn install'"),null==t.mode||0===C.length){const t=e.topLevelWorkspace.manifest.name,o=t?a.structUtils.stringifyIdent(t):"workspace",c=u("# This file is generated by running \"yarn install\" inside your project.\n# Manual changes might be lost - proceed with caution!\n\n{ lib, stdenv, nodejs, git, cacert, fetchurl, writeShellScript, writeShellScriptBin }:\n{ src, overrideAttrs ? null, ... } @ args:\n\nlet\n\n yarnBin = @@YARN_BIN@@;\n\n cacheFolder = @@CACHE_FOLDER@@;\n lockfile = @@LOCKFILE@@;\n\n # Call overrideAttrs on a derivation if a function is provided.\n optionalOverride = fn: drv:\n if fn == null then drv else drv.overrideAttrs fn;\n\n # Simple stub that provides the global yarn command.\n yarn = writeShellScriptBin \"yarn\" ''\n exec '${nodejs}/bin/node' '${yarnBin}' \"$@\"\n '';\n\n # Common attributes between Yarn derivations.\n drvCommon = {\n # Make sure the build uses the right Node.js version everywhere.\n buildInputs = [ nodejs yarn ];\n # All dependencies should already be cached.\n yarn_enable_network = \"0\";\n # Tell node-gyp to use the provided Node.js headers for native code builds.\n npm_config_nodedir = nodejs;\n };\n\n # Comman variables that we set in a Nix build, but not in a Nix shell.\n buildVars = ''\n # Make Yarn produce friendlier logging for automated builds.\n export CI=1\n # Tell node-pre-gyp to never fetch binaries / always build from source.\n export npm_config_build_from_source=true\n # Disable Nixify plugin to save on some unnecessary processing.\n export yarn_enable_nixify=false\n '';\n\n#@@ IF COMBINED_DRV\n cacheDrv = stdenv.mkDerivation {\n name = \"yarn-cache\";\n buildInputs = [ yarn git cacert ];\n buildCommand = ''\n cp --reflink=auto --recursive '${src}' ./src\n cd ./src/\n ${buildVars}\n HOME=\"$TMP\" yarn_enable_global_cache=false yarn_cache_folder=\"$out\" \\\n yarn nixify fetch\n rm $out/.gitignore\n '';\n outputHashMode = \"recursive\";\n outputHash = \"@@COMBINED_HASH@@\";\n };\n#@@ ENDIF COMBINED_DRV\n#@@ IF INDIVIDUAL_DRVS\n # Create derivations for fetching dependencies.\n cacheDrvs = let\n in lib.mapAttrs (locator: { filename, hash }: stdenv.mkDerivation {\n name = lib.strings.sanitizeDerivationName locator;\n buildInputs = [ yarn git cacert ];\n buildCommand = ''\n cd '${src}'\n ${buildVars}\n HOME=\"$TMP\" yarn_enable_global_cache=false yarn_cache_folder=\"$TMP\" \\\n yarn nixify fetch ${locator}\n # Because we change the cache dir, Yarn may generate a different name.\n mv \"$TMP/$(sed 's/-[^-]*\\.[^-]*$//' <<< \"$outputFilename\")\"-* $out\n '';\n outputFilename = filename;\n outputHash = hash;\n }) cacheEntries;\n\n # Create a shell snippet to copy dependencies from a list of derivations.\n mkCacheBuilderForDrvs = drvs:\n writeShellScript \"collect-yarn-cache\" (lib.concatMapStrings (drv: ''\n cp --reflink=auto ${drv} '${drv.outputFilename}'\n '') drvs);\n#@@ ENDIF INDIVIDUAL_DRVS\n\n#@@ IF NEED_ISOLATED_BUILD_SUPPRORT\n#@@ IF INDIVIDUAL_DRVS\n # Create a shell snippet to copy dependencies from a list of locators.\n mkCacheBuilderForLocators = let\n pickCacheDrvs = map (locator: cacheDrvs.${locator});\n in locators:\n mkCacheBuilderForDrvs (pickCacheDrvs locators);\n#@@ ENDIF INDIVIDUAL_DRVS\n\n # Create a derivation that builds a module in isolation.\n mkIsolatedBuild = { pname, version, reference, locators ? [] }: stdenv.mkDerivation (drvCommon // {\n inherit pname version;\n dontUnpack = true;\n\n configurePhase = ''\n ${buildVars}\n unset yarn_enable_nixify # plugin is not present\n '';\n\n buildPhase = ''\n mkdir -p .yarn/cache\n#@@ IF COMBINED_DRV\n cp --reflink=auto --recursive ${cacheDrv}/* .yarn/cache/\n#@@ ENDIF COMBINED_DRV\n#@@ IF INDIVIDUAL_DRVS\n pushd .yarn/cache > /dev/null\n source ${mkCacheBuilderForLocators locators}\n popd > /dev/null\n#@@ ENDIF INDIVIDUAL_DRVS\n\n echo '{ \"dependencies\": { \"${pname}\": \"${reference}\" } }' > package.json\n install -m 0600 ${lockfile} ./yarn.lock\n export yarn_global_folder=\"$TMP\"\n export yarn_enable_global_cache=false\n export yarn_enable_immutable_installs=false\n yarn\n '';\n\n installPhase = ''\n unplugged=( .yarn/unplugged/${pname}-*/node_modules/* )\n if [[ ! -e \"''${unplugged[@]}\" ]]; then\n echo >&2 \"Could not find the unplugged path for ${pname}\"\n exit 1\n fi\n\n mv \"$unplugged\" $out\n '';\n });\n#@@ ENDIF NEED_ISOLATED_BUILD_SUPPRORT\n\n # Main project derivation.\n project = stdenv.mkDerivation (drvCommon // {\n inherit src;\n name = @@PROJECT_NAME@@;\n\n configurePhase = ''\n ${buildVars}\n\n # Copy over the Yarn cache.\n rm -fr '${cacheFolder}'\n mkdir -p '${cacheFolder}'\n#@@ IF COMBINED_DRV\n cp --reflink=auto --recursive ${cacheDrv}/* '${cacheFolder}/'\n#@@ ENDIF COMBINED_DRV\n#@@ IF INDIVIDUAL_DRVS\n pushd '${cacheFolder}' > /dev/null\n source ${mkCacheBuilderForDrvs (lib.attrValues cacheDrvs)}\n popd > /dev/null\n#@@ ENDIF INDIVIDUAL_DRVS\n\n # Yarn may need a writable home directory.\n export yarn_global_folder=\"$TMP\"\n\n # Ensure global cache is disabled. Cache must be part of our output.\n touch .yarnrc.yml\n sed -i -e '/^enableGlobalCache/d' .yarnrc.yml\n echo 'enableGlobalCache: false' >> .yarnrc.yml\n\n # Some node-gyp calls may call out to npm, which could fail due to an\n # read-only home dir.\n export HOME=\"$TMP\"\n\n # running preConfigure after the cache is populated allows for\n # preConfigure to contain substituteInPlace for dependencies as well as the\n # main project. This is necessary for native bindings that maybe have\n # hardcoded values.\n runHook preConfigure\n\n@@ISOLATED_INTEGRATION@@\n\n # Run normal Yarn install to complete dependency installation.\n yarn install --immutable --immutable-cache\n\n runHook postConfigure\n '';\n\n buildPhase = ''\n runHook preBuild\n runHook postBuild\n '';\n\n installPhase = ''\n runHook preInstall\n\n # Move the package contents to the output directory.\n if grep -q '\"workspaces\"' package.json; then\n # We can't use `yarn pack` in a workspace setup, because it only\n # packages the outer workspace.\n mkdir -p \"$out/libexec\"\n mv $PWD \"$out/libexec/$name\"\n else\n # - If the package.json has a `files` field, only files matching those patterns are copied\n # - Otherwise all files are copied.\n yarn pack --out package.tgz\n mkdir -p \"$out/libexec/$name\"\n tar xzf package.tgz --directory \"$out/libexec/$name\" --strip-components=1\n\n cp --reflink=auto .yarnrc* \"$out/libexec/$name\"\n cp --reflink=auto ${lockfile} \"$out/libexec/$name/yarn.lock\"\n cp --reflink=auto --recursive .yarn \"$out/libexec/$name\"\n\n # Copy the Yarn linker output into the package.\n#@@ IF USES_PNP_LINKER\n cp --reflink=auto .pnp.* \"$out/libexec/$name\"\n#@@ ENDIF USES_PNP_LINKER\n#@@ IF USES_NM_LINKER\n cp --reflink=auto --recursive node_modules \"$out/libexec/$name\"\n#@@ ENDIF USES_NM_LINKER\n fi\n\n cd \"$out/libexec/$name\"\n\n # Invoke a plugin internal command to setup binaries.\n mkdir -p \"$out/bin\"\n yarn nixify install-bin $out/bin\n\n#@@ IF USES_NM_LINKER\n # A package with node_modules doesn't need the cache\n yarn cache clean\n#@@ ENDIF USES_NM_LINKER\n\n runHook postInstall\n '';\n\n passthru = {\n inherit nodejs;\n yarn-freestanding = yarn;\n yarn = writeShellScriptBin \"yarn\" ''\n exec '${yarn}/bin/yarn' --cwd '${overriddenProject}/libexec/${overriddenProject.name}' \"$@\"\n '';\n };\n });\n\n overriddenProject = optionalOverride overrideAttrs project;\n\n@@CACHE_ENTRIES@@\n@@ISOLATED@@\nin overriddenProject\n",{PROJECT_NAME:p(o),YARN_BIN:g,LOCKFILE:D,INDIVIDUAL_DRVS:A,COMBINED_DRV:!A,COMBINED_HASH:T,CACHE_FOLDER:I,CACHE_ENTRIES:j,ISOLATED:B.join("\n"),ISOLATED_INTEGRATION:h(" ",F.join("\n")),NEED_ISOLATED_BUILD_SUPPRORT:F.length>0,USES_PNP_LINKER:"pnp"===n.get("nodeLinker"),USES_NM_LINKER:"node-modules"===n.get("nodeLinker")}).replace(/\n\n\n+/g,"\n\n");if(await s.xfs.mkdirpPromise(s.ppath.dirname(d)),await s.xfs.writeFilePromise(d,c),n.get("generateDefaultNix")){const e=s.ppath.join(r,"default.nix"),t=s.ppath.join(r,"flake.nix");s.xfs.existsSync(e)||s.xfs.existsSync(t)||(await s.xfs.writeFilePromise(e,"# This is a minimal `default.nix` by yarn-plugin-nixify. You can customize it\n# as needed, it will not be overwritten by the plugin.\n\n{ pkgs ? import { } }:\n\npkgs.callPackage ./yarn-project.nix { } { src = ./.; }\n"),i.reportInfo(0,"A minimal default.nix was created. You may want to customize it."))}}n.get("enableNixPreload")&&s.xfs.existsSync(s.npath.toPortablePath("/nix/store"))&&await s.xfs.mktempPromise((async t=>{const n=["--add-fixed","sha512"],r=[];if(A)for(const[e,{cachePath:n,hash:a}]of O.entries()){const o=v(e),i=x(o,a);if(!s.xfs.existsSync(i)){const e=s.ppath.join(t,k(a).slice(0,7));await s.xfs.mkdirPromise(e);const i=s.ppath.join(e,o);await s.xfs.copyFilePromise(n,i),r.push(i)}}else{n.unshift("--recursive");const e=x("yarn-cache",T,{recursive:!0});if(!s.xfs.existsSync(e)){const e=s.ppath.join(t,"yarn-cache");await s.xfs.mkdirPromise(e);for(const[t,{cachePath:n}]of _.entries()){const r=s.ppath.join(e,t);await s.xfs.copyFilePromise(n,r)}r.push(e)}}try{const t=r.length;for(;0!==r.length;){const t=r.splice(0,100);await a.execUtils.execvp("nix-store",[...n,...t],{cwd:e.cwd,strict:!0})}0!==t&&i.reportInfo(0,A?`Preloaded ${t} packages into the Nix store`:"Preloaded cache into the Nix store")}catch(e){if("ENOENT"!==e.code)throw e}}))})(e,t)}},configuration:{enableNixify:{description:"If false, disables the Nixify plugin hook that generates Nix expressions",type:a.SettingsType.BOOLEAN,default:!0},nixExprPath:{description:"Path of the file where the project Nix expression will be written to",type:a.SettingsType.ABSOLUTE_PATH,default:"./yarn-project.nix"},generateDefaultNix:{description:"If true, a default.nix will be generated if it does not exist",type:a.SettingsType.BOOLEAN,default:!0},enableNixPreload:{description:"If true, cached packages will be preloaded into the Nix store",type:a.SettingsType.BOOLEAN,default:!0},individualNixPackaging:{description:"If true, generate one Nix derivation per package. If false, use a single derivation for the entire cache folder.",type:a.SettingsType.BOOLEAN,default:!1},isolatedNixBuilds:{description:"Dependencies with a build step that can be built in an isolated derivation",type:a.SettingsType.STRING,default:[],isArray:!0},installNixBinariesForDependencies:{description:"If true, the Nix output 'bin' directory will also contain executables for binaries defined by dependencies",type:a.SettingsType.BOOLEAN,default:!1}}};t=r})(),t}}; \ No newline at end of file diff --git a/project-visualizer/.yarnrc.yml b/project-visualizer/.yarnrc.yml new file mode 100644 index 0000000..b3f3b8a --- /dev/null +++ b/project-visualizer/.yarnrc.yml @@ -0,0 +1,15 @@ +approvedGitRepositories: + - "**" + +enableScripts: true + +generateDefaultNix: false + +individualNixPackaging: true + +nodeLinker: node-modules + +plugins: + - checksum: e183406dae0b56ce2dcf0880f6b4f8dd4bd1a50ebc8e06f37f05c375dae351476019a3c324443c1b9fa5ed0b3ad2053fae39810d66c16d84c4fc0365f531e650 + path: .yarn/plugins/yarn-plugin-nixify.cjs + spec: "https://raw.githubusercontent.com/stephank/yarn-plugin-nixify/main/dist/yarn-plugin-nixify.js" diff --git a/project-visualizer/yarn-project.nix b/project-visualizer/yarn-project.nix new file mode 100644 index 0000000..f355f25 --- /dev/null +++ b/project-visualizer/yarn-project.nix @@ -0,0 +1,289 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +{ lib, stdenv, nodejs, git, cacert, fetchurl, writeShellScript, writeShellScriptBin }: +{ src, overrideAttrs ? null, ... } @ args: + +let + + yarnBin = fetchurl { + url = "https://repo.yarnpkg.com/4.14.1/packages/yarnpkg-cli/bin/yarn.js"; + hash = "sha512-ZN9EgFWy03uiadfbU1pGm42pP47xFAwl/XqDwAqPuqyyFMoOAlU7kqLFTO94u2fQtIF/qwIAHfDiT6wPrMw7Qg=="; + }; + + cacheFolder = ".yarn/cache"; + lockfile = ./yarn.lock; + + # Call overrideAttrs on a derivation if a function is provided. + optionalOverride = fn: drv: + if fn == null then drv else drv.overrideAttrs fn; + + # Simple stub that provides the global yarn command. + yarn = writeShellScriptBin "yarn" '' + exec '${nodejs}/bin/node' '${yarnBin}' "$@" + ''; + + # Common attributes between Yarn derivations. + drvCommon = { + # Make sure the build uses the right Node.js version everywhere. + buildInputs = [ nodejs yarn ]; + # All dependencies should already be cached. + yarn_enable_network = "0"; + # Tell node-gyp to use the provided Node.js headers for native code builds. + npm_config_nodedir = nodejs; + }; + + # Comman variables that we set in a Nix build, but not in a Nix shell. + buildVars = '' + # Make Yarn produce friendlier logging for automated builds. + export CI=1 + # Tell node-pre-gyp to never fetch binaries / always build from source. + export npm_config_build_from_source=true + # Disable Nixify plugin to save on some unnecessary processing. + export yarn_enable_nixify=false + ''; + + # Create derivations for fetching dependencies. + cacheDrvs = let + in lib.mapAttrs (locator: { filename, hash }: stdenv.mkDerivation { + name = lib.strings.sanitizeDerivationName locator; + buildInputs = [ yarn git cacert ]; + buildCommand = '' + cd '${src}' + ${buildVars} + HOME="$TMP" yarn_enable_global_cache=false yarn_cache_folder="$TMP" \ + yarn nixify fetch ${locator} + # Because we change the cache dir, Yarn may generate a different name. + mv "$TMP/$(sed 's/-[^-]*\.[^-]*$//' <<< "$outputFilename")"-* $out + ''; + outputFilename = filename; + outputHash = hash; + }) cacheEntries; + + # Create a shell snippet to copy dependencies from a list of derivations. + mkCacheBuilderForDrvs = drvs: + writeShellScript "collect-yarn-cache" (lib.concatMapStrings (drv: '' + cp --reflink=auto ${drv} '${drv.outputFilename}' + '') drvs); + + # Main project derivation. + project = stdenv.mkDerivation (drvCommon // { + inherit src; + name = "quixos-project-visualizer"; + + configurePhase = '' + ${buildVars} + + # Copy over the Yarn cache. + rm -fr '${cacheFolder}' + mkdir -p '${cacheFolder}' + pushd '${cacheFolder}' > /dev/null + source ${mkCacheBuilderForDrvs (lib.attrValues cacheDrvs)} + popd > /dev/null + + # Yarn may need a writable home directory. + export yarn_global_folder="$TMP" + + # Ensure global cache is disabled. Cache must be part of our output. + touch .yarnrc.yml + sed -i -e '/^enableGlobalCache/d' .yarnrc.yml + echo 'enableGlobalCache: false' >> .yarnrc.yml + + # Some node-gyp calls may call out to npm, which could fail due to an + # read-only home dir. + export HOME="$TMP" + + # running preConfigure after the cache is populated allows for + # preConfigure to contain substituteInPlace for dependencies as well as the + # main project. This is necessary for native bindings that maybe have + # hardcoded values. + runHook preConfigure + + # Run normal Yarn install to complete dependency installation. + yarn install --immutable --immutable-cache + + runHook postConfigure + ''; + + buildPhase = '' + runHook preBuild + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + # Move the package contents to the output directory. + if grep -q '"workspaces"' package.json; then + # We can't use `yarn pack` in a workspace setup, because it only + # packages the outer workspace. + mkdir -p "$out/libexec" + mv $PWD "$out/libexec/$name" + else + # - If the package.json has a `files` field, only files matching those patterns are copied + # - Otherwise all files are copied. + yarn pack --out package.tgz + mkdir -p "$out/libexec/$name" + tar xzf package.tgz --directory "$out/libexec/$name" --strip-components=1 + + cp --reflink=auto .yarnrc* "$out/libexec/$name" + cp --reflink=auto ${lockfile} "$out/libexec/$name/yarn.lock" + cp --reflink=auto --recursive .yarn "$out/libexec/$name" + + # Copy the Yarn linker output into the package. + cp --reflink=auto --recursive node_modules "$out/libexec/$name" + fi + + cd "$out/libexec/$name" + + # Invoke a plugin internal command to setup binaries. + mkdir -p "$out/bin" + yarn nixify install-bin $out/bin + + # A package with node_modules doesn't need the cache + yarn cache clean + + runHook postInstall + ''; + + passthru = { + inherit nodejs; + yarn-freestanding = yarn; + yarn = writeShellScriptBin "yarn" '' + exec '${yarn}/bin/yarn' --cwd '${overriddenProject}/libexec/${overriddenProject.name}' "$@" + ''; + }; + }); + + overriddenProject = optionalOverride overrideAttrs project; + +cacheEntries = { +"@babel/code-frame@npm:7.29.0" = { filename = "@babel-code-frame-npm-7.29.0-6c4947d913-d34cc504e7.zip"; hash = "sha512-00zFBOd2XftXamY9lwZ6+2FFJYBrXK0aXMGnGDuRb+yP9X+iM1heOSb9Wp5rMarm35Gqga6Xdft6KPZY0zRvDQ=="; }; +"@babel/compat-data@npm:7.29.3" = { filename = "@babel-compat-data-npm-7.29.3-6a1cb34af5-81bddd53ce.zip"; hash = "sha512-gb3dU84bE5VXb7t8tzljGpdva0Ic0mDmzycVqWkbmg7BLKXE4buICI5g3IeHX25O9/qGdPHclq4b18NXQWYFpw=="; }; +"@babel/core@npm:7.29.0" = { filename = "@babel-core-npm-7.29.0-a74bfc561b-5127d2e8e8.zip"; hash = "sha512-USfS6OhCrkCeEby7XC3/mHSr9UFegCaSWvcwjpA/T0M5c0FGehMEkNGjmIT0YbwrZ/MGO84L5ENA24lof9hSqg=="; }; +"@babel/generator@npm:7.29.1" = { filename = "@babel-generator-npm-7.29.1-b1bf16fe79-349086e687.zip"; hash = "sha512-NJCG5odiWO8/soIwMP7g9sDrnD6+NfxXLhaZf4wDDXZfY23cYpntrmPnYOpmWPjumi7fptayTJqAyReRa5c1UQ=="; }; +"@babel/helper-compilation-targets@npm:7.28.6" = { filename = "@babel-helper-compilation-targets-npm-7.28.6-8880f389c9-3fcdf3b1b8.zip"; hash = "sha512-P83zsbhXoVeOmdIFCIWdvT8i88h7ig89xUBie0vlObrn9uYeSdkxVC/ltVdUU0cnK72s1/WKXHcCWhi3RVk6UA=="; }; +"@babel/helper-globals@npm:7.28.0" = { filename = "@babel-helper-globals-npm-7.28.0-8d79c12faf-5a0cd0c0e8.zip"; hash = "sha512-WgzQwOjHZLXyfyCV5CQ+ivb6FF2uorQbU8DBQU/m/xOeNkD04iB64rPSFToavTRvkBwmwpDufLOIHdki1O6SMg=="; }; +"@babel/helper-module-imports@npm:7.28.6" = { filename = "@babel-helper-module-imports-npm-7.28.6-5b95b9145c-b49d8d8f20.zip"; hash = "sha512-tJ2NjyBNnb/VrHDFTlM+Ummvs86pZqnZdnIrE+mSLMdzplNAX1PImsskfVrr2uRoHWMaOuPfd+wEa1jadu2irA=="; }; +"@babel/helper-module-transforms@npm:7.28.6" = { filename = "@babel-helper-module-transforms-npm-7.28.6-5923cf5a95-6f03e14fc3.zip"; hash = "sha512-bwPhT8MLKHzguDlHS18nHnKDfQyv5rFy11kYTZmPvuOQOgNegeB8LFlkSeUE9FNGPVi6pltvQKN97VvsdGILKw=="; }; +"@babel/helper-plugin-utils@npm:7.28.6" = { filename = "@babel-helper-plugin-utils-npm-7.28.6-766c984cfe-3f5f8acc15.zip"; hash = "sha512-P1+KzBUv27aahLhiQUX/T5ufbndsuYn5+Wj4YG63GFxcPPzzughTTjfh4OHBGKxnCAYQMz9WuqT3N2yZtfEUPQ=="; }; +"@babel/helper-string-parser@npm:7.27.1" = { filename = "@babel-helper-string-parser-npm-7.27.1-d1471e0598-8bda3448e0.zip"; hash = "sha512-i9o0SOB7VYNyfBA1YLz5xMJLPBBRpMUW1AUO9p3ze7mkc0pYX+EnJbjCdj3gomWqHpCbSFpOMnC3z9Pk2+S2Ag=="; }; +"@babel/helper-validator-identifier@npm:7.28.5" = { filename = "@babel-helper-validator-identifier-npm-7.28.5-1953d49d2b-42aaebed91.zip"; hash = "sha512-Qqrr7ZH3OaQfPYC3J1LR+V/XxyOU6OS9fN2IgX4HdNgKQyRRvLoXwsZCwlfEg78dQJ3UVIiDQp6pSTo7xKsIRw=="; }; +"@babel/helper-validator-option@npm:7.27.1" = { filename = "@babel-helper-validator-option-npm-7.27.1-7c563f0423-6fec5f006e.zip"; hash = "sha512-b+xfAG66QAAaIPJrHvXbvaN3t7aMitUYwFuqmvPzlueAvf3tJMTu+V0Uu3uP1WGSpu041dQ5uX0Q78XxoZHRSA=="; }; +"@babel/helpers@npm:7.29.2" = { filename = "@babel-helpers-npm-7.29.2-ec38f935cc-dab0e65b93.zip"; hash = "sha512-2rDmW5MYslAqYsWLwJE1cjGFle7ASCwx8K1Ba3JjbmaYodfFfNJ5HUUo64xUi8qI0zjcTSpVoQjcH2cC+bxVEg=="; }; +"@babel/parser@npm:7.29.3" = { filename = "@babel-parser-npm-7.29.3-1f668babfe-f06920c819.zip"; hash = "sha512-8GkgyBlVDA22ieTFtia/Vbo86/gOvpzPpDThNANs895QlR/nWfdKuy2uOBmJI5hgveRtRgAyhXitH3EUw3EabQ=="; }; +"@babel/plugin-transform-react-jsx-self@npm:7.27.1" = { filename = "@babel-plugin-transform-react-jsx-self-npm-7.27.1-bd0fa344f1-00a4f917b7.zip"; hash = "sha512-AKT5F7cKYI+ayi+zmqvgSmCqMxZafgEF/USzqFMWMOuFv1Vy6fJC9R5q0vo4wufngJAhdshjVWxYtbpvbhZAMQ=="; }; +"@babel/plugin-transform-react-jsx-source@npm:7.27.1" = { filename = "@babel-plugin-transform-react-jsx-source-npm-7.27.1-36a9716d8f-5e67b56c39.zip"; hash = "sha512-Xme1bDnE0D5Z4DuoBpKyTFqSFHIHm2OvcRsdJQ/DfBczoXBptjU391Dz6TfsRKQrHuakbNI7Gg31FjsX90H38g=="; }; +"@babel/template@npm:7.28.6" = { filename = "@babel-template-npm-7.28.6-bff3bc3923-66d87225ed.zip"; hash = "sha512-ZthyJe0Lx3+IgYGuLZeEUCGDjGGZRId/fEOYxnSLz2EfIW39a+dNOQFq9QK8qHbmzmhz2zxJ5Kw1TFbTTVfp9Q=="; }; +"@babel/traverse@npm:7.29.0" = { filename = "@babel-traverse-npm-7.29.0-85d5d916b6-f63ef6e58d.zip"; hash = "sha512-9j725Y0CqfvzwOLl8ch32j4LxX+RoZ0iI9U+NWp2hZy69RFxySEccYFtlKDmnvonMv0n/8Dhu8hLY25gkyMz6w=="; }; +"@babel/types@npm:7.29.0" = { filename = "@babel-types-npm-7.29.0-6c2fa77581-23cc3466e8.zip"; hash = "sha512-I8w0Zug7y/q4ub0O2q/bXU79uIuCs75nKLut5bovCZb4T2OxxfeowNZ+/e0oMAiYpfkwsXG7QLMRvKICnE6bTw=="; }; +"@esbuild/linux-x64@npm:0.21.5" = { filename = "@esbuild-linux-x64-npm-0.21.5-88079726c4-10c0.zip"; hash = "sha512-nlZj/KzpyEVumTSp7W50KNtAgAJO7zv+r4LUdhIL2IE4LJWL4nhUY9a0RGez0/hw1szgmpyze87xmv65eBTWdA=="; }; +"@isaacs/fs-minipass@npm:4.0.1" = { filename = "@isaacs-fs-minipass-npm-4.0.1-677026e841-c25b6dc159.zip"; hash = "sha512-wlttwVmHkNW1XAlHqbfREc+pJZTbUpbDuQfi9TPAM2ZvaSo5OerawXscfEDTYtCwY13IdMv+PnDbfCsHzJel0g=="; }; +"@jridgewell/gen-mapping@npm:0.3.13" = { filename = "@jridgewell-gen-mapping-npm-0.3.13-9bd96ac800-9a7d65fb13.zip"; hash = "sha512-mn1l+xO9muwfurdM2ghJaDm34s6zH1q5IrMj6U18SBzg/E/X4S4mEJFe2K9RF4vcYeFo6SqMi4MDsDCwNImxOw=="; }; +"@jridgewell/remapping@npm:2.3.5" = { filename = "@jridgewell-remapping-npm-2.3.5-df8dacc063-3de494219f.zip"; hash = "sha512-PeSUIZ/+ssXDhxHQ17sSgJft+RiTCQotvI7gtV0JK7c0ex/Q9HhIbF6rAQ6FXHOSexZm8hB1FtRy0kpzAX0RlA=="; }; +"@jridgewell/resolve-uri@npm:3.1.2" = { filename = "@jridgewell-resolve-uri-npm-3.1.2-5bc4245992-d502e6fb51.zip"; hash = "sha512-1QLm+1FrNQMjMUBtTpYsIf53zfHL20nGFCvL2eMFBwlLGJcneKbifLrXViCc/jSxoncp5voIouuSszlD9oDPHg=="; }; +"@jridgewell/sourcemap-codec@npm:1.5.5" = { filename = "@jridgewell-sourcemap-codec-npm-1.5.5-5189d9fc79-f9e538f302.zip"; hash = "sha512-+eU48wK2PA68Bu7LHdmRjdQontNhR6DdzjXW6k1+u9okPNp7IhO2peHYCHopjVz2MPsr05Mpzey4IBcCP2CBoA=="; }; +"@jridgewell/trace-mapping@npm:0.3.31" = { filename = "@jridgewell-trace-mapping-npm-0.3.31-1ae81d75ac-4b30ec8cd5.zip"; hash = "sha512-SzDsjNVsX9mmYfCIIwrwHgwaOIjRH/trR2OXAPcSJb4h0ffhaASNbU+USSB7l4ojXAfI8VwHcFaF0W3AYoDp2Q=="; }; +"@quixos/control-plane-protocol@file:../quixos-control-plane-protocol#../quixos-control-plane-protocol::hash=f0f687&locator=quixos-project-visualizer%40workspace%3A." = { filename = "@quixos-control-plane-protocol-file-f50f93332c-88fc86dd74.zip"; hash = "sha512-iPyG3XTXwkQlS+4WI9dhZ1VOhA5gtJfCDuOaj/yiyP2cSxr/4acbqNPG+CBlbyEUeyci8ALUtbAlN4ocNIkQ6w=="; }; +"@remote-dom/core@npm:1.11.1" = { filename = "@remote-dom-core-npm-1.11.1-8bd9a831b0-c6432934e8.zip"; hash = "sha512-xkMpNOgxLTICQyn+LGB1s6ERd8mVCfw3yVTyjK9T4NkCTMFS+42401+NiiRmCDe5VMdMlQuEGJ5wR/Q3pWz9Jw=="; }; +"@remote-dom/polyfill@npm:1.5.1" = { filename = "@remote-dom-polyfill-npm-1.5.1-02b868404f-753836a286.zip"; hash = "sha512-dTg2ooYhTprI1iRlAdTXgk/mAK5LScP+asVGeTS1oVrrD4Dnc/fHIZ+CmsV1i+B3Ro7ebaml3hQmDzYn/81uHw=="; }; +"@rolldown/pluginutils@npm:1.0.0-beta.27" = { filename = "@rolldown-pluginutils-npm-1.0.0-beta.27-108701b3b0-9658f235b3.zip"; hash = "sha512-lljyNbNFIB1Pa/sfMtqXVMoWT4ktHLaBVP5fU8HfQr1nXs1AmDbf9GiEp4R9bAC9w4r4cPfIHgW7pcJkXrSrnA=="; }; +"@rollup/rollup-linux-x64-gnu@npm:4.60.4" = { filename = "@rollup-rollup-linux-x64-gnu-npm-4.60.4-d05f6a1949-10c0.zip"; hash = "sha512-UXlav22muxAMAh6XlNM+MuN7oGw4Ny6UJm0Pq6AYVa5erRDXHH9auNMB04M12O8kuaYekhDJET9547MxFjFBFg=="; }; +"@types/babel__core@npm:7.20.5" = { filename = "@types-babel__core-npm-7.20.5-4d95f75eab-bdee3bb699.zip"; hash = "sha512-ve47tplR6DOkuBG47pNWtpph7Vt6I+GggeySSXaRF/qDqq8CO7BlYqA461hFFV/2Y+LVx13ZXB1czJHbASho/w=="; }; +"@types/babel__generator@npm:7.27.0" = { filename = "@types-babel__generator-npm-7.27.0-a5af33547a-9f9e959a87.zip"; hash = "sha512-n56VmoeS3yCKnQSAkv2n4YWL3clcYxSFeoIRqZ4g5oML3rVy41h66L5UKeN/Kpb88iKp9TrSMvVTd2TJ4TorvQ=="; }; +"@types/babel__template@npm:7.4.4" = { filename = "@types-babel__template-npm-7.4.4-f34eba762c-cc84f6c6ab.zip"; hash = "sha512-zIT2xqseqxQn6Q3St2zO5lzpQLd4qaZ74sjDnhmU5vW7yO+jCfbOqNxnVJlFJM1NKJZVjfdtkueh9G7P/ucRKw=="; }; +"@types/babel__traverse@npm:7.28.0" = { filename = "@types-babel__traverse-npm-7.28.0-44a48c1b20-b52d7d4e8f.zip"; hash = "sha512-tS19To/GqQGP5zYcQGLBwZD1d4zyRmgXy57RnWn7u1T5qF/+3rdI7YBi0s99TMCI7nOYSPR8V3QN4cSMvw0JlA=="; }; +"@types/estree@npm:1.0.8" = { filename = "@types-estree-npm-1.0.8-2195bac6d6-39d34d1afa.zip"; hash = "sha512-OdNNGvqjOKuXY/N61gZuPzSURPkFK5Z2p8wCUu+UhaQcbYHJxODSbpB3mTNU7fJe/IU/MiTdS0Rxde9ivcyGpQ=="; }; +"@types/node@npm:25.9.1" = { filename = "@types-node-npm-25.9.1-fa3ebe64ec-9a04682842.zip"; hash = "sha512-mgRoKEK+u88hoXed/quapzPXvXu8Cg7bZBqzqaPUPqxUMiWs9mnDNPRY8ZVkQ+vAcrw8coQMVDuLNWyrXILUVg=="; }; +"@types/prop-types@npm:15.7.15" = { filename = "@types-prop-types-npm-15.7.15-cefe16a1fa-b59aad1ad1.zip"; hash = "sha512-tZqtGtGb8XM89ST9TmGBlsbHaQ9I7nCjJ+tFCkKquOigY/vlnKClcBrr4tktWCKSwPuEXqV0dPahX2mUsOJgsg=="; }; +"@types/qrcode@npm:1.5.6" = { filename = "@types-qrcode-npm-1.5.6-1e3cf640f4-84844ca63e.zip"; hash = "sha512-hIRMpj5fMrxH1E3aD4pvfNzHzkTnsk8Q8Z1QeW8x0SwFj3Aqj301LJ6CoCOpq8Nvoa0B3fCiCd2O1FYup2SB/A=="; }; +"@types/react-dom@npm:18.3.7" = { filename = "@types-react-dom-npm-18.3.7-c71f2ee61f-8bd309e2c3.zip"; hash = "sha512-i9MJ4sPRYEoopzaiT5bLrfbAXVKIz++Ig7dPQFTJYbazpemX/VaG5JK+kDyPM4DbpewBfv85BrElZSnNLTlgPg=="; }; +"@types/react@npm:18.3.29" = { filename = "@types-react-npm-18.3.29-576594e3cd-b582f5c3a0.zip"; hash = "sha512-tYL1w6A0IpsuKH9eOa6/OYjWznnn/YHIJX3FW+4OMh3fcI1gFKRMXOro3r6h4VqTMmsgek/sagFwIAoD0QWt+w=="; }; +"@vitejs/plugin-react@npm:4.7.0" = { filename = "@vitejs-plugin-react-npm-4.7.0-650e714693-692f239609.zip"; hash = "sha512-aS8jlglyh5SF1kdxNmPsKZxHgiLJZWfWAoWs98fcXBeOcav+nS7v3e8e6wFRTay8LtaKrYRijev5xxFhNHNCUw=="; }; +"abbrev@npm:5.0.0" = { filename = "abbrev-npm-5.0.0-31d7ffe3c8-8e88f5c798.zip"; hash = "sha512-joj1x5jqRWLSjFo+mtaeOHmJC8XWldjy3/uGCb5MiQqsyPgO9FU/3SxqYtcMLOi8V7OAdOODvrdIe9r6ntQupQ=="; }; +"ansi-regex@npm:5.0.1" = { filename = "ansi-regex-npm-5.0.1-c963a48615-9a64bb8627.zip"; hash = "sha512-mmS7hie0NLqTJ7YMAndC5dF6xpJ3lg0EGJhZYnHZktTVK6cmemPKECMuKfYQf8ioNfbOjXGbiMX4ST+CVIE3Nw=="; }; +"ansi-styles@npm:4.3.0" = { filename = "ansi-styles-npm-4.3.0-245c7d42c7-895a23929d.zip"; hash = "sha512-iVojkp2kFvK9Pefpy06r00CUkyirhd3W5ISmN9j2gg1IX1OTNEb1KRw7dgy8SIvrjohXPdD5x9r4PczI/oGwQQ=="; }; +"baseline-browser-mapping@npm:2.10.32" = { filename = "baseline-browser-mapping-npm-2.10.32-a4230b4be5-408c93245b.zip"; hash = "sha512-QIyTJFvfHpKrD4kev5KD7GDbq/qsgb3Jog03FWWipJaw+4Ao99Yow/ZvkO4UJnCoFXXPHL1SKfe0sNNQ25EQhQ=="; }; +"browserslist@npm:4.28.2" = { filename = "browserslist-npm-4.28.2-8923c4854e-c0228b6330.zip"; hash = "sha512-wCKLYzD3hbf6WdLTYBJOxtkyL5btnz7h+HPjPsyVA6bw/8O3EZGijE/26TC3U7MAQ9ocM4RKlUjzAY1JHwnOYA=="; }; +"camelcase@npm:5.3.1" = { filename = "camelcase-npm-5.3.1-5db8af62c5-92ff9b443b.zip"; hash = "sha512-kv+bRDv+irsV8rFRPKGC0WEmNZrU+VXryD3E3cxO8/3SwHi8Ij8mc9wiNIjnXJmxbMTQVmJDdLeZ5qFVXPYbIw=="; }; +"caniuse-lite@npm:1.0.30001793" = { filename = "caniuse-lite-npm-1.0.30001793-d05254d2b9-bee8f8b55d.zip"; hash = "sha512-vuj4tV0czbIHa3NVwG/QGRaVLq3Xa4KOTV+5rGLRfsfbDit8MmuSNHi5NSatH/dPGJz0DAbeDkpe28Z3AJuX/g=="; }; +"chownr@npm:3.0.0" = { filename = "chownr-npm-3.0.0-5275e85d25-43925b8770.zip"; hash = "sha512-Q5Jbh3APfjiTKWyOnFbMWPkmQRzOOm5YmBNtqvCPCLmo63bTfTJn5wfQ3MF67S4uvfWEjAw86Vz5EKkZk1wbEA=="; }; +"cliui@npm:6.0.0" = { filename = "cliui-npm-6.0.0-488b2414c6-35229b1bb4.zip"; hash = "sha512-NSKbG7SGR+iCEEysN0yaGONLvwus4OLPAwADJrbKMFDWtZVF2R4Xv+NwX0oOKYh4eqXN5jMb9cu/AWRzLO9kkg=="; }; +"color-convert@npm:2.0.1" = { filename = "color-convert-npm-2.0.1-79730e935b-37e1150172.zip"; hash = "sha512-N+EVAXLy4xH+Gy32LGKTo0Luc4Dae5z9umfqU5kJr7102icDMgjQHW1c/GXueGiiLhjX52SOAEQlRBwPihWn1w=="; }; +"color-name@npm:1.1.4" = { filename = "color-name-npm-1.1.4-025792b0ea-a1a3f91415.zip"; hash = "sha512-oaP5FBVpYJAvRvf1a8Yu/8bJToSyyuFXpSaxwfdLZ3pH7GAr9ophq/orQtFbfFZRxtvnKkOvcgvFiN/4hbEPlQ=="; }; +"convert-source-map@npm:2.0.0" = { filename = "convert-source-map-npm-2.0.0-7ab664dc4e-8f2f7a27a1.zip"; hash = "sha512-jy96J6GgEcxsyIzE2i19DPpe4DaVCLquPZjCYLs6xSBpFGTlu+SufN8JhgwdaezG9wxjxufH9+PxjsCEhNx9mw=="; }; +"csstype@npm:3.2.3" = { filename = "csstype-npm-3.2.3-741053244e-cd29c51e70.zip"; hash = "sha512-zSnFHnD6gi8c7NhkGhRFvtcGNpdGnTVjO1FuYP6MG94EsI9sW2AiE2u2abZMY9QXOvVIZFEPu07iMoGAGEGjzg=="; }; +"debug@npm:4.4.3" = { filename = "debug-npm-4.4.3-0105c6123a-d79136ec6c.zip"; hash = "sha512-15E27GyD7L79D2pVk9pqnJHsTX3cS1TIg9bnHsmsy19noaXpbQCjKBlrW1yG02XpjYo6cIVqrxa057GYXmf1pg=="; }; +"decamelize@npm:1.2.0" = { filename = "decamelize-npm-1.2.0-c5a2fdc622-85c39fe8fb.zip"; hash = "sha512-hcOf6PvwSC1KHiJO8BGdtcGJf4UDvO+Lgmrf96GxFBSXL2/vLX3sLuC0vjhjz2SsFDkTeunmryOj2Ny+JqW0sg=="; }; +"dijkstrajs@npm:1.0.3" = { filename = "dijkstrajs-npm-1.0.3-d5b1d1b11a-2183d61ac1.zip"; hash = "sha512-IYPWGsHyUGLzw3c/PqjZ9FuhZKAOd+B/r4zFdQ2pZiItHizmKZyHWoD5aRkMcaCXMEIZLFYk1SI+TtGW/1hMmQ=="; }; +"electron-to-chromium@npm:1.5.361" = { filename = "electron-to-chromium-npm-1.5.361-59eee8ca64-5e6e9c0c12.zip"; hash = "sha512-Xm6cDBKrgjZu3fV1yLkRTVr3EKutO1khQcVs+gFpRx82M9zHk0IMMD+taN/yHI+3JLQ83n5mvpR5g/o9bVpzWQ=="; }; +"emoji-regex@npm:8.0.0" = { filename = "emoji-regex-npm-8.0.0-213764015c-b6053ad399.zip"; hash = "sha512-tgU605lRxM8zj5CS17+6RIzf1G/moqA0cAsUmsn/vBN+Nhy9PEQil/hr7S5fdXbBtUzApr+O9RBsxi9JavNQEA=="; }; +"env-paths@npm:2.2.1" = { filename = "env-paths-npm-2.2.1-7c7577428c-285325677b.zip"; hash = "sha512-KFMlZ3vwDjCEXjMO7DKJT1EFUp25dJbuP1mEeOUPAIxTUqQaMOXnLsneilQrWlcLhWmc1jvSvGRtvLnzEdg7xA=="; }; +"esbuild@npm:0.21.5" = { filename = "esbuild-npm-0.21.5-d85dfbc965-fa08508adf.zip"; hash = "sha512-+ghQit9oPD85nooBSmOCprZVQiE0MeJiBsByDlNrMcCbUHmHR8KhBaS7uh2XZ7jTYVp0wve/Hd9tg2zRHrZy3g=="; }; +"escalade@npm:3.2.0" = { filename = "escalade-npm-3.2.0-19b50dd48f-ced4dd3a78.zip"; hash = "sha512-ztTdOnjhWJftO+dOY1EQu/OwiHewpBvlDcsyXuDgtfZfwtUOmEUZTXxGM/Mn4uHGzOAKcbYXxWc98DdCAdZ/ZQ=="; }; +"exponential-backoff@npm:3.1.3" = { filename = "exponential-backoff-npm-3.1.3-28be78d98e-77e3ae682b.zip"; hash = "sha512-d+OuaCt7H0ly9WPG280rDVSsZ55i1dMvPlCF/rogSDzyi9UFVD9SDih6VtTVWijXh0KZlB+vY353mhqlmU0SZw=="; }; +"fdir@npm:6.5.0" = { filename = "fdir-npm-6.5.0-8814a0dec7-e345083c43.zip"; hash = "sha512-40UIPEMGs67Wy47FUeJsNrq1xRHpnqRXahZ1DdyNMkDmOCbMYk9a4XrU3ILmiiUyE7YNVWwRv60GS3YHhH7Qfw=="; }; +"find-up@npm:4.1.0" = { filename = "find-up-npm-4.1.0-c3ccf8d855-0406ee89eb.zip"; hash = "sha512-BAbuievu+i1Qf+sH7DZr69imFnrnSqTjT7TEq9Bs94KjziauQZTXBwb3IYKEFzPwBVHCCf5XXLAL2SEEBW54wQ=="; }; +"fsevents@npm:2.3.3" = { filename = "fsevents-npm-2.3.3-ce9fb0ffae-a1f0c44595.zip"; hash = "sha512-ofDERZUSPtcX/rvEeKqVLket/CjiCSvma4qxY1FHJUymz+HfeSqJl/InFtTLr8czCYmf97+sKsOtjPLk7MPsYA=="; }; +"gensync@npm:1.0.0-beta.2" = { filename = "gensync-npm-1.0.0-beta.2-224666d72f-782aba6cba.zip"; hash = "sha512-eCq6bLplsbta87CV2WJJ0g7b6N8y2/Rpb9Sb4lg/r2dhc79ICThliIKOTddqM1T8vrV3urHIM8zZ/EV38mED+A=="; }; +"get-caller-file@npm:2.0.5" = { filename = "get-caller-file-npm-2.0.5-80e8a86305-c6c7b60271.zip"; hash = "sha512-xse2AnGTH6dSrrkvK0fjVerBrzomc/R8lYno+KQa3HTUVVHBvFe15mqAYJ8Q/7crb1deQ3DWHMP386r/AXV83g=="; }; +"graceful-fs@npm:4.2.11" = { filename = "graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip"; hash = "sha512-OG0BGlU+ArxZSsLKC9bZ5MItf6jPv8RIptFIxZ6ogbCS252+NUeuS4jlXxsB98Si7MU7MQwEJ5PmOqRM9sJX8g=="; }; +"htm@npm:3.1.1" = { filename = "htm-npm-3.1.1-e3b831f850-0de4c8fff2.zip"; hash = "sha512-DeTI//K452wWIjWugNv5PKXu8Vdb1QWWoGzpvr8abaXvxGdBfFMDSp/6Krns/4GcvsBB3JCHiUsrkArU3ibH5w=="; }; +"is-fullwidth-code-point@npm:3.0.0" = { filename = "is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-bb11d825e0.zip"; hash = "sha512-uxHYJeBJ844EwGNzqNcngu7gIFvanZCMxVDMs8WbmddQ/5U3mC4BczwclKWONUAGYfVwQhWP9ejz6Qz5Ntrw/A=="; }; +"isexe@npm:4.0.0" = { filename = "isexe-npm-4.0.0-588229ad74-5884815115.zip"; hash = "sha512-WISBURW86sRSh3ZZqcdyY4JTFZL0PcKeXUi3xBAGYa7VQBjLkL02yy6uulIQklcHaRZ6y7lcGNOa/cy8ygbFzg=="; }; +"js-tokens@npm:4.0.0" = { filename = "js-tokens-npm-4.0.0-0ac852e9e2-e248708d37.zip"; hash = "sha512-4khwjTd6oFjqzyA3sH3thHeQ5t6JK7rT2sCrui51nLnxIbAAmaZRlWFrrctuyo0U2XXLPonrHP2mRHVkAsiu7Q=="; }; +"jsesc@npm:3.1.0" = { filename = "jsesc-npm-3.1.0-2f4f998cd7-531779df5e.zip"; hash = "sha512-Uxd5317JT0fkYtomtMvwXriKg9nwiqwroEIGUI/FmFJ6FT0IvUYrroL8eLPqoakI4aSnn4hukjhkHEze+vEYsQ=="; }; +"json5@npm:2.2.3" = { filename = "json5-npm-2.2.3-9962c55073-5a04eed948.zip"; hash = "sha512-WgTu2UgQ+lXF6hOLL3pcErl8N1C8Y9EeUR3Oy/73WAA4YVIqBwwicnZO4PTj4yOGLzhpRa61uFuH7kPwhLpYbA=="; }; +"locate-path@npm:5.0.0" = { filename = "locate-path-npm-5.0.0-46580c43e4-33a1c5247e.zip"; hash = "sha512-M6HFJH6H4CL5cT5iE6dEVXo+nsMsXQte+xCqOjgXdhW/kCIaVZJnSFcDnBoP0gY7gvKFcC03t5LZc+nnKs5sWQ=="; }; +"loose-envify@npm:1.4.0" = { filename = "loose-envify-npm-1.4.0-6307b72ccf-655d110220.zip"; hash = "sha512-ZV0RAiCYPBpLnAxnmi6AFtS2f26ce1Q1/1l57Nsg0IE/TewKCGdPy91IRqPwftu1CjaBH9N5MLlKqg2drOsBfg=="; }; +"lru-cache@npm:5.1.1" = { filename = "lru-cache-npm-5.1.1-f475882a51-89b2ef2ef4.zip"; hash = "sha512-ibLvLvRfVDAR44c3uKhiKi+JmM3fDlQ3F0748fcKi50UqRirPiMss7o0O3q93/pmfwtZB1srgOa01jw95hJ0gg=="; }; +"minipass@npm:7.1.3" = { filename = "minipass-npm-7.1.3-b73a16498d-539da88dac.zip"; hash = "sha512-U52ojayhZTMhHqWp7pjcYv9XQvUx9UZA3TRCnmIZVekcwoCpGndgJiZLf59nNZR2KfkglE6cFVg2novyLrM/uw=="; }; +"minizlib@npm:3.1.0" = { filename = "minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip"; hash = "sha512-Wq11qwCQuCZgacmqvlgsAhrlPrM8bGkQVKE6Rds7T5Gn+xvXkVHmtOnpqGcntSJSfAoG7H1FIGt0XVTNMJe87A=="; }; +"ms@npm:2.1.3" = { filename = "ms-npm-2.1.3-81ff3cfac1-d924b57e73.zip"; hash = "sha512-2SS1fnMSs7Y60h/Fs9wK9eeNYaH8fPtUV+2vJjJr9ivlMHzIf/toYu8cKzOwIzzbXU8BxMlYzA1mCUi2Wih6SA=="; }; +"nanoid@npm:3.3.12" = { filename = "nanoid-npm-3.3.12-41f8e0bb94-ba142b7b39.zip"; hash = "sha512-uhQreznhHoDBbddLA2XUB4gMh8HPfhSAlWmBrpQO42Bg+ltvCSzR4xUYTdGSRMZXvQF9AzJ708YiR9aRxejt+w=="; }; +"node-gyp@npm:13.0.0" = { filename = "node-gyp-npm-13.0.0-f910600f25-e7525c427d.zip"; hash = "sha512-51JcQn2y0WqjaLiUcYfegwg9Ko3aI+PglqccIq5jesW7jtfPbIcfG5EYzScp2/7k/zpCReK3kiaQAiexWDG0kg=="; }; +"node-releases@npm:2.0.46" = { filename = "node-releases-npm-2.0.46-b0f9c0af01-04632591f9.zip"; hash = "sha512-BGMlkfl/FYSK37ErIfoBOmwZgJr89dtl/ojJWjYnHD9CPiERD9MZrVqcUCn/5l64Hz5IV+avGWIryIjZKgStIg=="; }; +"nopt@npm:10.0.1" = { filename = "nopt-npm-10.0.1-c09d426c63-980d89257f.zip"; hash = "sha512-mA2JJX+Vh/Ph93h33b+QXWqjtzjsM+SaT6GgWaDdgusoBjmCsVBlSnrp3jhvLq1g5WFy2303z1beVF9zkqKiag=="; }; +"p-limit@npm:2.3.0" = { filename = "p-limit-npm-2.3.0-94a0310039-8da01ac53e.zip"; hash = "sha512-jaAaxT7+amJwgPr8EnyHPaQMGNh7P11UktRlu4XscgfhU5SN9rnLrrEwvnAVL4dCKbgkLuK+hMB5QIJRCvl/Eg=="; }; +"p-locate@npm:4.1.0" = { filename = "p-locate-npm-4.1.0-eec6872537-1b476ad69a.zip"; hash = "sha512-G0dq1prX9gWXRPNDsm1RzgkVCJNcHbuAxOCi85f/zgyjofn1zTx84Z15KaCXGdXGX+cNjuKJw/JnzTbyiBgT6Q=="; }; +"p-try@npm:2.2.0" = { filename = "p-try-npm-2.2.0-e0390dbaf8-c36c199077.zip"; hash = "sha512-w2wZkHc0yQSxaZTmU1sCw2wiJNQz4BovGrd3I39NhuYon9X9RkhQSR6UA3nUYG7YUMA+D5q2ALDr3bURMS4Xfw=="; }; +"path-exists@npm:4.0.0" = { filename = "path-exists-npm-4.0.0-e9e4f63eb0-8c0bd3f523.zip"; hash = "sha512-jAvT9SOBiBl9x43O0VIHpHFsUcxONiTET8l6z2lVj167mir/9Ib+G07hSODBM+lsXhGpqlxIowBuNGfaBw5eGw=="; }; +"picocolors@npm:1.1.1" = { filename = "picocolors-npm-1.1.1-4fede47cf1-e2e3e8170a.zip"; hash = "sha512-4uPoFwq518dCGWmtqn4bMUNPeJr7mz8RX2uW2RlFBBrDzrAunsb+ZRD/A2vMC/keaaF3LtwLcH4SsZwPLWvPWA=="; }; +"picomatch@npm:4.0.4" = { filename = "picomatch-npm-4.0.4-e82d450244-e2c6023372.zip"; hash = "sha512-4sYCM3LMe1dkcZpf+52g+OeBIS+nykvQVi25Kd+OEXRg8A3/PLdQnaz8Brht6SSyR/UE0M4YBqN/rEYzCBRmsA=="; }; +"pngjs@npm:5.0.0" = { filename = "pngjs-npm-5.0.0-e8ba79f838-c074d8a94f.zip"; hash = "sha512-wHTYqU+3Xi3vqAIehTVr94SWiK99jOmZW3OU1XzRp3eycs+3xLzgi40Q5x5wjncXyB/VU6QT8hhAxUjsnUiTxg=="; }; +"postcss@npm:8.5.15" = { filename = "postcss-npm-8.5.15-8e6eef9b78-7f2e63ae22.zip"; hash = "sha512-fy5jriL75Dqs4b9lK9mdpOkHN8ZBlNSeUd3JzQ+eUf8oYafXNDebSU3v+gOogKXGXuxwvCnunrqnE23ePu6PMQ=="; }; +"proc-log@npm:7.0.0" = { filename = "proc-log-npm-7.0.0-d836af0493-b89c2d8626.zip"; hash = "sha512-uJwthiYE81/seVR3sMfjdv6rO6DU9NKRxOlZVnRCaXz0UaxVfQYjwcw4r0WngSi5g0EPOXoQxdOmf3bDPeR1Sw=="; }; +"qrcode@npm:1.5.4" = { filename = "qrcode-npm-1.5.4-7eaef32d9f-ae1d57c9cf.zip"; hash = "sha512-rh1Xyc/2CZY5pZC0MscbFeO9OQXOQ1Pm0AyV3ua7dpqPdz9qdXXswbjtR2v3nFE4pKZcs4DGgt47km1yBdNNEA=="; }; +"react-dom@npm:18.3.1" = { filename = "react-dom-npm-18.3.1-a805663f38-a752496c19.zip"; hash = "sha512-p1JJbBlB+Vjy6KxWI5FyKW/N3OE2XORSItBKGUfgzFVH3z6ER/hVqB1tOfAI18Muq0PbNxIHfwnj9nxIdJc+hQ=="; }; +"react-refresh@npm:0.17.0" = { filename = "react-refresh-npm-0.17.0-85b5aa925e-002cba9403.zip"; hash = "sha512-ACy6lAOEyZMACMC84mysl6nVaCvGIxEsImi6DBVRJ9nBeKmlzCIS1WAIjWDf1QPt2AhmmiX5s3fzFqMjYdCyPA=="; }; +"react@npm:18.3.1" = { filename = "react-npm-18.3.1-af38f3c1ae-283e8c5efc.zip"; hash = "sha512-KD6MXvzzeALJ0c52fzAt1Wndl6cNm7jHvnmnibmQJFHg0WM0sF1zKZsg8EjLw8fSiLu94QtwH6GU4gicI32+ow=="; }; +"require-directory@npm:2.1.1" = { filename = "require-directory-npm-2.1.1-8608aee50b-83aa76a7bc.zip"; hash = "sha512-g6p2p7wVMfaNksdaLKL1TxsBRjy1Zs8/vHh9Dei+MMnbwhHR1GvjSX2sV4X+KW8t0R1TGUWsKXMGQzV5eJZumQ=="; }; +"require-main-filename@npm:2.0.0" = { filename = "require-main-filename-npm-2.0.0-03eef65c84-db91467d9e.zip"; hash = "sha512-25FGfZ6tMRtBEcvXOk5n+ngg2u0piaMvcCN4WiZZAIxtEZdS2cSsARrgflN+uGUjrf+ZgExf2znNOgF/m0Abtg=="; }; +"rollup@npm:4.60.4" = { filename = "rollup-npm-4.60.4-e335ee554f-2734511579.zip"; hash = "sha512-JzRRFXnaIgQI7vuHe1EoF2fXkGUs7iXaj81JNslH49sUiCte2x0NXVv2DypxpYrn1ff0bBHj/fMxglOJU4hiQw=="; }; +"scheduler@npm:0.23.2" = { filename = "scheduler-npm-0.23.2-6d1dd9c2b7-26383305e2.zip"; hash = "sha512-JjgzBeJJZR1MWOZwXV+EJfFTIRrvlfFRYcFR97jeiF8kdRs3fkoLPdQszgmq0/h6Ydq3Y2hZwNibfa8aHipceA=="; }; +"semver@npm:6.3.1" = { filename = "semver-npm-6.3.1-bcba31fdbe-e3d79b6090.zip"; hash = "sha512-49ebYJBxyqeLy2zirYHHlmpGp0MdnVi4gAz6nLamNpmziZoOS8zjYWeihFeCEtmuaUK2kpukqlAVwHmmd1HULQ=="; }; +"semver@npm:7.8.4" = { filename = "semver-npm-7.8.4-9c59dc7144-81b7c296fd.zip"; hash = "sha512-gbfClv15J7gPZ/pRa3X6EBfKrIFneVMg3ijnbMvG9/AXY8MOzRDWoNj9CJcIqwVIpa67lLCHDpnCorRgCkY4mw=="; }; +"set-blocking@npm:2.0.0" = { filename = "set-blocking-npm-2.0.0-49e2cffa24-9f8c1b2d80.zip"; hash = "sha512-n4wbLYAIANC1id4Ud8dTSS3lwVSNSt5S9X8dH14Er1SBVU11zl5cQ9QAS4Cj63FDmNaQcCfcBTQXe3U5EZ9EVA=="; }; +"source-map-js@npm:1.2.1" = { filename = "source-map-js-npm-1.2.1-b9a47d7e1a-7bda1fc4c1.zip"; hash = "sha512-e9ofxMGX48b/F94biywg5gr4G2OlLLMuxaXWeiCn1CZR4ss06+k4M8WioIQ3fhdFWFT+4+IeeSXGSlG2pSsPrw=="; }; +"string-width@npm:4.2.3" = { filename = "string-width-npm-4.2.3-2c27177bae-1e525e92e5.zip"; hash = "sha512-HlJekuXq4K/XRUCG7tnIGO6EN0u4Ayj8QSF65y/18GXvHJ1/ctpB3kDHX6i7Pe5j2SNz/UkshCYKVSxjY5Kkew=="; }; +"strip-ansi@npm:6.0.1" = { filename = "strip-ansi-npm-6.0.1-caddc7cb40-1ae5f212a1.zip"; hash = "sha512-GuXyEqEm/lsWdwf3FpQkkOOTMIWl/2wAirl6svJyyAJdOqIYt71qslcpyiDMgc3bJSEC+HUeE0gqUZnoc2gJUg=="; }; +"tar@npm:7.5.16" = { filename = "tar-npm-7.5.16-628307afc6-4f37f3c4bd.zip"; hash = "sha512-TzfzxL0sonVf1zal3x1XPBqGjsGx6JM0aur6laxRD54v0UaUIL2GbMeQR5nlvUrGK11PA/4ndH1uHjc7RFBcXA=="; }; +"tinyglobby@npm:0.2.17" = { filename = "tinyglobby-npm-0.2.17-f2c3ddb917-7f7bb0f197.zip"; hash = "sha512-f3uw8ZfIi8SyDCMeDeykJAyjvzE6iPWn/uk6hyuElmpNUCIJR8BFWtB6YLOzYJYcW3/ZeSIq63Fqn5m0EgAuTA=="; }; +"typescript@npm:5.9.3" = { filename = "typescript-npm-5.9.3-48715be868-6bd7552ce3.zip"; hash = "sha512-a9dVLOOfl+cR21qgSPb5mVtT8cUvfYZnwavcFwDGinajCPV5zTCc5rU2Rt606aG+fIE6k7qvCijM1TajAnDhxQ=="; }; +"typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" = { filename = "typescript-patch-6fda4d02cf-ad09fdf7a7.zip"; hash = "sha512-rQn996dWgU3OZbxgwWV7QNREUTRoWO6iMOEPLpWiidkYO24y5cEelazAzMIUtPNiidytS/GIawrbhNcR0zakMA=="; }; +"undici-types@npm:7.24.6" = { filename = "undici-types-npm-7.24.6-8759b28e34-d9cd8befb6.zip"; hash = "sha512-2c2L77ZDrJBGFcKAoJW6QkBTH2u0pedaIqdINjDKjT8QFtKras5s7aH2Ozotsv4Df6/hIdaRegGHVzqlSP94yg=="; }; +"undici@npm:6.27.0" = { filename = "undici-npm-6.27.0-00a86409ac-f88c3dae39.zip"; hash = "sha512-+Iw9rjlX2/nZPLSBRArO0xe9PElBtZFP6l77pRbVETiYjNtcdgBvC7EzfkHVbDRDNRBV1JLnOvJChSHDe6Knbw=="; }; +"update-browserslist-db@npm:1.2.3" = { filename = "update-browserslist-db-npm-1.2.3-de1d320326-13a00355ea.zip"; hash = "sha512-E6ADVeqCI4j2ivV0EM4yVZQdX7m3xJNCxHCaB8nyMLvvf3SZrgyn4N5TLnmoLMDE7b0SXxoyOhhFv5FO/d+L7A=="; }; +"vite@npm:5.4.21" = { filename = "vite-npm-5.4.21-12a8265f9b-468336a140.zip"; hash = "sha512-RoM2oUCfcotGQWDL8CZy5yJx+2iNDmBed2t0qJ0n4QKVCe7zo6bHVZKNgBHkdNvyNIJNBU0Hlgvl8jzRdrxy3g=="; }; +"which-module@npm:2.0.1" = { filename = "which-module-npm-2.0.1-90f889f6f6-087038e799.zip"; hash = "sha512-CHA455kmSer/psek8xWNW1OxTPW2wfDgQ9zPrLG6F50S8XVF1bhevZSkLOKApv5l0MvKtw9PxtqtHfroXg5qPg=="; }; +"which@npm:7.0.0" = { filename = "which-npm-7.0.0-638dd00e77-ca0b54f198.zip"; hash = "sha512-ygtU8Zj3i7xLfALjS9qNM1yzUuCttMvKHDexqVevOoeagsTCfKZSW8lC9UjYtk+BbvZSg2Cvnz3lX/ubl5tiDQ=="; }; +"wrap-ansi@npm:6.2.0" = { filename = "wrap-ansi-npm-6.2.0-439a7246d8-baad244e6e.zip"; hash = "sha512-uq0kTm4zM16iToblGGj+aCNibjo8iNmmZ0ZCr/8dNNmhVMkX50r42EX9JdFwxOqc9ppHEzw/NlbhJSs9Ri2fbA=="; }; +"y18n@npm:4.0.3" = { filename = "y18n-npm-4.0.3-ced95acdbc-308a2efd7c.zip"; hash = "sha512-MIou/XzClqssDzuShP1IJ74Bz+tkezuhgjDjpBbrG8iHrAUN6fjE/Z54VrLoJG4F0ZC1PJbFrY2MtW3/tvgQJA=="; }; +"yallist@npm:3.1.1" = { filename = "yallist-npm-3.1.1-a568a556b4-c66a5c46bc.zip"; hash = "sha512-xmpcRryJrxYlR29/Dy7DZTwaF5HS+UB8+0wrqBKh4cmUFBbXG6lxmHZTDjNAqZkl9pcUKYk3G3LZO57mKK/YwQ=="; }; +"yallist@npm:5.0.0" = { filename = "yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip"; hash = "sha512-pJnIHObUodJg1OoPbUmrTaCWgeMsPwRy3uFmZ+1p0B2uY6O4F0WiS9eEduxPz4VhFMtIlqznOOAdo0ssQiNUFg=="; }; +"yargs-parser@npm:18.1.3" = { filename = "yargs-parser-npm-18.1.3-0ba9c4f088-25df918833.zip"; hash = "sha512-Jd+RiDNZKoP1Ln5Pkbp9e/qiuJHr9/6QGSPC7nl1NPI6F2kT/2/367wcwXJaBEzGplOf7Yv9ThO1sWN2h1+UmQ=="; }; +"yargs@npm:15.4.1" = { filename = "yargs-npm-15.4.1-ca1c444de1-f1ca680c97.zip"; hash = "sha512-8cpoDJdDM6WCJzKCXMp+lTBsWh53UOt7lzzm3E+XprCog3IDyLGU9GGWm/4fsRdtHUIwNmNShfYBCzkvpJirLQ=="; }; +"zod@npm:4.4.3" = { filename = "zod-npm-4.4.3-36e81f791e-7ea31b558e.zip"; hash = "sha512-fqMbVY6I+fr0TzHdGF4uHL9R/tMIF4f7lswlNHSbUMCs/G2n8JIqc1PtCS3TWMfVDCjqlslNBK9kGRvTMVLsow=="; }; +}; + +in overriddenProject diff --git a/project-visualizer/yarn.lock b/project-visualizer/yarn.lock index 846e977..f61b2eb 100644 --- a/project-visualizer/yarn.lock +++ b/project-visualizer/yarn.lock @@ -1,989 +1,1698 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! +__metadata: + version: 9 + cacheKey: 10c0 -"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" - integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== +"@babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" dependencies: - "@babel/helper-validator-identifier" "^7.28.5" - js-tokens "^4.0.0" - picocolors "^1.1.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10c0/d34cc504e7765dfb576a663d97067afb614525806b5cad1a5cc1a7183b916fec8ff57fa233585e3926fd5a9e6b31aae6df91aa81ae9775fb7a28f658d3346f0d + languageName: node + linkType: hard -"@babel/compat-data@^7.28.6": - version "7.29.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.3.tgz#e3f5347f0589596c91d227ccb6a541d37fb1307b" - integrity sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg== +"@babel/compat-data@npm:^7.28.6": + version: 7.29.3 + resolution: "@babel/compat-data@npm:7.29.3" + checksum: 10c0/81bddd53ce1b1395576fbb7cb739631a976f6b421cd260e6cf2715a9691b9a0ec12ca5c4e1bb88088e60dc87875f6e4ef7fa8674f1dc96ae1bd7c357416605a7 + languageName: node + linkType: hard -"@babel/core@^7.28.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" - integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== +"@babel/core@npm:^7.28.0": + version: 7.29.0 + resolution: "@babel/core@npm:7.29.0" dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helpers" "^7.28.6" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.29.0" - "@babel/types" "^7.29.0" - "@jridgewell/remapping" "^2.3.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helpers": "npm:^7.28.6" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + "@jridgewell/remapping": "npm:^2.3.5" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/5127d2e8e842ae409e11bcbb5c2dff9874abf5415e8026925af7308e903f4f43397341467a130490d1a39884f461bc2b67f3063bce0be44340db89687fd852aa + languageName: node + linkType: hard -"@babel/generator@^7.29.0": - version "7.29.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" - integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== +"@babel/generator@npm:^7.29.0": + version: 7.29.1 + resolution: "@babel/generator@npm:7.29.1" dependencies: - "@babel/parser" "^7.29.0" - "@babel/types" "^7.29.0" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10c0/349086e6876258ef3fb2823030fee0f6c0eb9c3ebe35fc572e16997f8c030d765f636ddc6299edae63e760ea6658f8ee9a2edfa6d6b24c9a80c917916b973551 + languageName: node + linkType: hard -"@babel/helper-compilation-targets@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" - integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== +"@babel/helper-compilation-targets@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-compilation-targets@npm:7.28.6" dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-validator-option": "npm:^7.27.1" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/3fcdf3b1b857a1578e99d20508859dbd3f22f3c87b8a0f3dc540627b4be539bae7f6e61e49d931542fe5b557545347272bbdacd7f58a5c77025a18b745593a50 + languageName: node + linkType: hard -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: 10c0/5a0cd0c0e8c764b5f27f2095e4243e8af6fa145daea2b41b53c0c1414fe6ff139e3640f4e2207ae2b3d2153a1abd346f901c26c290ee7cb3881dd922d4ee9232 + languageName: node + linkType: hard -"@babel/helper-module-imports@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" - integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== +"@babel/helper-module-imports@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-imports@npm:7.28.6" dependencies: - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10c0/b49d8d8f204d9dbfd5ac70c54e533e5269afb3cea966a9d976722b13e9922cc773a653405f53c89acb247d5aebdae4681d631a3ae3df77ec046b58da76eda2ac + languageName: node + linkType: hard -"@babel/helper-module-transforms@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" - integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== +"@babel/helper-module-transforms@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-transforms@npm:7.28.6" dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.6" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@babel/traverse": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/6f03e14fc30b287ce0b839474b5f271e72837d0cafe6b172d759184d998fbee3903a035e81e07c2c596449e504f453463d58baa65b6f40a37ded5bec74620b2b + languageName: node + linkType: hard -"@babel/helper-plugin-utils@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" - integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== +"@babel/helper-plugin-utils@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/helper-plugin-utils@npm:7.28.6" + checksum: 10c0/3f5f8acc152fdbb69a84b8624145ff4f9b9f6e776cb989f9f968f8606eb7185c5c3cfcf3ba08534e37e1e0e1c118ac67080610333f56baa4f7376c99b5f1143d + languageName: node + linkType: hard -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 + languageName: node + linkType: hard -"@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== +"@babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 + languageName: node + linkType: hard -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10c0/6fec5f006eba40001a20f26b1ef5dbbda377b7b68c8ad518c05baa9af3f396e780bdfded24c4eef95d14bb7b8fd56192a6ed38d5d439b97d10efc5f1a191d148 + languageName: node + linkType: hard -"@babel/helpers@^7.28.6": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49" - integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== +"@babel/helpers@npm:^7.28.6": + version: 7.29.2 + resolution: "@babel/helpers@npm:7.29.2" dependencies: - "@babel/template" "^7.28.6" - "@babel/types" "^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.29.0" + checksum: 10c0/dab0e65b9318b2502a62c58bc0913572318595eec0482c31f0ad416b72636e6698a1d7c57cd2791d4528eb8c548bca88d338dc4d2a55a108dc1f6702f9bc5512 + languageName: node + linkType: hard -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": - version "7.29.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.3.tgz#116f70a77958307fceac27747573032f8a62f88e" - integrity sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA== +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": + version: 7.29.3 + resolution: "@babel/parser@npm:7.29.3" dependencies: - "@babel/types" "^7.29.0" + "@babel/types": "npm:^7.29.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/f06920c819550c0db689e4c5b626bf55ba3cebf80ebe9ccfa434e134036cf3de50951fe759f74abb2dae381989239860bde46d4600328578ad1f7114c3711a6d + languageName: node + linkType: hard -"@babel/plugin-transform-react-jsx-self@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" - integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== +"@babel/plugin-transform-react-jsx-self@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/00a4f917b70a608f9aca2fb39aabe04a60aa33165a7e0105fd44b3a8531630eb85bf5572e9f242f51e6ad2fa38c2e7e780902176c863556c58b5ba6f6e164031 + languageName: node + linkType: hard -"@babel/plugin-transform-react-jsx-source@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" - integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== +"@babel/plugin-transform-react-jsx-source@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5e67b56c39c4d03e59e03ba80692b24c5a921472079b63af711b1d250fc37c1733a17069b63537f750f3e937ec44a42b1ee6a46cd23b1a0df5163b17f741f7f2 + languageName: node + linkType: hard -"@babel/template@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" - integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== +"@babel/template@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/parser" "^7.28.6" - "@babel/types" "^7.28.6" + "@babel/code-frame": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10c0/66d87225ed0bc77f888181ae2d97845021838c619944877f7c4398c6748bcf611f216dfd6be74d39016af502bca876e6ce6873db3c49e4ac354c56d34d57e9f5 + languageName: node + linkType: hard -"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" - integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== +"@babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/types" "^7.29.0" - debug "^4.3.1" + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.29.0" + debug: "npm:^4.3.1" + checksum: 10c0/f63ef6e58d02a9fbf3c0e2e5f1c877da3e0bc57f91a19d2223d53e356a76859cbaf51171c9211c71816d94a0e69efa2732fd27ffc0e1bbc84b636e60932333eb + languageName: node + linkType: hard -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.28.2", "@babel/types@^7.28.6", "@babel/types@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" - integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/types@npm:7.29.0" dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" + checksum: 10c0/23cc3466e83bcbfab8b9bd0edaafdb5d4efdb88b82b3be6728bbade5ba2f0996f84f63b1c5f7a8c0d67efded28300898a5f930b171bb40b311bca2029c4e9b4f + languageName: node + linkType: hard -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" - integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard -"@jridgewell/remapping@^2.3.5": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" - integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b + languageName: node + linkType: hard -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" - integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/3de494219ffeb2c5c38711d0d7bb128097edf91893090a2dbc8ee0b55d092bb7347b1fd0f478486c5eab010e855c73927b1666f2107516d472d24a73017d1194 + languageName: node + linkType: hard -"@quixos/control-plane-protocol@file:../quixos-control-plane-protocol": - version "1.0.0" +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard -"@remote-dom/core@^1.10.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@remote-dom/core/-/core-1.11.1.tgz#a4810c3351f4106cbd2c1dcd402672981a1c6bbe" - integrity sha512-0v29Q7F/iunb2cJm3E7r780X6jcPEFEgetSGisgRssJuoP9217yC1MKLVFNdXRmJYKX+oaugQKqaD2m8XA9dTQ== +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: - "@remote-dom/polyfill" "^1.5.1" - htm "^3.1.1" + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 + languageName: node + linkType: hard -"@remote-dom/polyfill@^1.5.1": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@remote-dom/polyfill/-/polyfill-1.5.1.tgz#1a805cc8eb03f790dad43f9ad5d2e8d22df14846" - integrity sha512-eaWdIVKZpNfbqspKkRQLVxiFv/7vIw8u0FVA5oy52YANFbO/WVT0GU+PQmRt/QUSijaB36HBAqx7stjo8HGpVQ== +"@quixos/control-plane-protocol@file:../quixos-control-plane-protocol::locator=quixos-project-visualizer%40workspace%3A.": + version: 1.0.0 + resolution: "@quixos/control-plane-protocol@file:../quixos-control-plane-protocol#../quixos-control-plane-protocol::hash=f0f687&locator=quixos-project-visualizer%40workspace%3A." + checksum: 10c0/88fc86dd74d7c244254bee1623d76167554e840e60b497c20ee39a8ffca2c8fd9c4b1affe1a71ba8d3c6f820656f21147b2722f002d4b5b025378a1c348910eb + languageName: node + linkType: hard -"@rolldown/pluginutils@1.0.0-beta.27": - version "1.0.0-beta.27" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz#47d2bf4cef6d470b22f5831b420f8964e0bf755f" - integrity sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA== - -"@rollup/rollup-android-arm-eabi@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz#3a04f01e9f01392bbef5920b94aa3b88794be7ab" - integrity sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ== - -"@rollup/rollup-android-arm64@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz#e371b653ceabc900790ae73f5548a0fd7cd63a70" - integrity sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw== - -"@rollup/rollup-darwin-arm64@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz#2a5aa70432e39816d666d79287a7324cfc3b4e72" - integrity sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA== - -"@rollup/rollup-darwin-x64@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz#c3b5b49629379cd9cdc5d841bf00ed44ebf393dd" - integrity sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg== - -"@rollup/rollup-freebsd-arm64@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz#f929d8e0462fae6602fc960beeabd7287d859283" - integrity sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g== - -"@rollup/rollup-freebsd-x64@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz#c01cb58031226f95d0900b1ec847f4fb32c6e809" - integrity sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw== - -"@rollup/rollup-linux-arm-gnueabihf@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz#f29d890c4858c8e0d3be01677eef4f6a359eed9d" - integrity sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA== - -"@rollup/rollup-linux-arm-musleabihf@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz#1ebfc8eb9f66136ed2faae5f44995add5ca3c964" - integrity sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w== - -"@rollup/rollup-linux-arm64-gnu@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz#c1fa823c2c4ce46ba7f61de1a4c3fdadd4fb4e7b" - integrity sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg== - -"@rollup/rollup-linux-arm64-musl@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz#a7f18854d0471b78bda8ea38f0891a4e059b571d" - integrity sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A== - -"@rollup/rollup-linux-loong64-gnu@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz#83658a9a4576bcce8cef85b2c78b9b649d2200c4" - integrity sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ== - -"@rollup/rollup-linux-loong64-musl@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz#fd2af677ae3417bb58d57ae37dd0d84686e40244" - integrity sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw== - -"@rollup/rollup-linux-ppc64-gnu@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz#6481647181c4cf8f1ddbd99f62c84cfc56c1a94a" - integrity sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg== - -"@rollup/rollup-linux-ppc64-musl@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz#18610a1a1550e28a5042ca916f898419540f17f4" - integrity sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A== - -"@rollup/rollup-linux-riscv64-gnu@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz#597bb80465a2621dbe0de0a41c66394a8a7e9a6e" - integrity sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA== - -"@rollup/rollup-linux-riscv64-musl@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz#a2a919a9f927ef7f24a60af77e3cb55f1ad59e4d" - integrity sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw== - -"@rollup/rollup-linux-s390x-gnu@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz#3166f6ceae7df9bbfddf9f36be1937231e13e3c6" - integrity sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ== - -"@rollup/rollup-linux-x64-gnu@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz#23c9bf79771d804fb87415eb0767569f273261e5" - integrity sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ== - -"@rollup/rollup-linux-x64-musl@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz#97941c6b94d67fe25cde0f027c10a19f2d1fdd39" - integrity sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg== - -"@rollup/rollup-openbsd-x64@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz#7aeb7d92e2cd1d399f56daf75c39040b777b6c77" - integrity sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA== - -"@rollup/rollup-openharmony-arm64@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz#925de61ae83bf99aa636e8acea87432e8c0ffaab" - integrity sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg== - -"@rollup/rollup-win32-arm64-msvc@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz#888ab83842721491044c46a7407e1f38f3235bb4" - integrity sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw== - -"@rollup/rollup-win32-ia32-msvc@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz#fa30ac24e3f0232139d2a47500560a28695764d4" - integrity sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA== - -"@rollup/rollup-win32-x64-gnu@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz#223e2bc93f86e0707568e1fadb5b537e50c976c7" - integrity sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw== - -"@rollup/rollup-win32-x64-msvc@4.60.4": - version "4.60.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz#da4f1676d87e2bdf744291b504b0ab79550c3e61" - integrity sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw== - -"@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== +"@remote-dom/core@npm:^1.10.1": + version: 1.11.1 + resolution: "@remote-dom/core@npm:1.11.1" dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" + "@remote-dom/polyfill": "npm:^1.5.1" + htm: "npm:^3.1.1" + peerDependencies: + "@preact/signals-core": ^1.3.0 + peerDependenciesMeta: + "@preact/signals-core": + optional: true + preact: + optional: true + checksum: 10c0/c6432934e8312d32024329fe2c6075b3a11177c99509fc37c954f28caf53e0d9024cc152fb8db8d35f8d8a24660837b954c74c950b84189e7047f437a56cfd27 + languageName: node + linkType: hard -"@types/babel__generator@*": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" - integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== +"@remote-dom/polyfill@npm:^1.5.1": + version: 1.5.1 + resolution: "@remote-dom/polyfill@npm:1.5.1" + checksum: 10c0/753836a286214e9ac8d6246501d4d7824fe600ae4b49c3fe6ac5467934b5a15aeb0f80e773f7c7219f829ac5758be077468ede6da9a5de14260f3627ffcd6e1f + languageName: node + linkType: hard + +"@rolldown/pluginutils@npm:1.0.0-beta.27": + version: 1.0.0-beta.27 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.27" + checksum: 10c0/9658f235b345201d4f6bfb1f32da9754ca164f892d1cb68154fe5f53c1df42bd675ecd409836dff46884a7847d6c00bdc38af870f7c81e05bba5c2645eb4ab9c + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.60.4" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-android-arm64@npm:4.60.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-darwin-arm64@npm:4.60.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-darwin-x64@npm:4.60.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.60.4" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-freebsd-x64@npm:4.60.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.60.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.60.4" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.60.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.60.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-gnu@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.60.4" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-musl@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-loong64-musl@npm:4.60.4" + conditions: os=linux & cpu=loong64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-gnu@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.60.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-musl@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.60.4" + conditions: os=linux & cpu=ppc64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.60.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.60.4" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.60.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.60.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.60.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-openbsd-x64@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-openbsd-x64@npm:4.60.4" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-openharmony-arm64@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.60.4" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.60.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.60.4" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-gnu@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.60.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.60.4": + version: 4.60.4 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.60.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.20.5": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" dependencies: - "@babel/types" "^7.0.0" + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== +"@types/babel__generator@npm:*": + version: 7.27.0 + resolution: "@types/babel__generator@npm:7.27.0" dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/9f9e959a8792df208a9d048092fda7e1858bddc95c6314857a8211a99e20e6830bdeb572e3587ae8be5429e37f2a96fcf222a9f53ad232f5537764c9e13a2bbd + languageName: node + linkType: hard -"@types/babel__traverse@*": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" - integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" dependencies: - "@babel/types" "^7.28.2" + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard -"@types/estree@1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/node@*": - version "25.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.1.tgz#3bda556db500ae4319c08e7fc9ab94f19013ba0b" - integrity sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg== +"@types/babel__traverse@npm:*": + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - undici-types ">=7.24.0 <7.24.7" + "@babel/types": "npm:^7.28.2" + checksum: 10c0/b52d7d4e8fc6a9018fe7361c4062c1c190f5778cf2466817cb9ed19d69fbbb54f9a85ffedeb748ed8062d2cf7d4cc088ee739848f47c57740de1c48cbf0d0994 + languageName: node + linkType: hard -"@types/prop-types@*": - version "15.7.15" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" - integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== +"@types/estree@npm:1.0.8": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 + languageName: node + linkType: hard -"@types/qrcode@^1": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.5.6.tgz#07c33cb9ec0ad88be4636e636e28e54d99b65f42" - integrity sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw== +"@types/node@npm:*": + version: 25.9.1 + resolution: "@types/node@npm:25.9.1" dependencies: - "@types/node" "*" + undici-types: "npm:>=7.24.0 <7.24.7" + checksum: 10c0/9a04682842bebbcf21a1779dfeab9aa733d7bd7bbc0a0edb641ab3a9a3d43eac543225acf669c334f458f1956443ebc072bc3c72840c543b8b356cab5c82d456 + languageName: node + linkType: hard -"@types/react-dom@^18.3.1": - version "18.3.7" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.7.tgz#b89ddf2cd83b4feafcc4e2ea41afdfb95a0d194f" - integrity sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ== +"@types/prop-types@npm:*": + version: 15.7.15 + resolution: "@types/prop-types@npm:15.7.15" + checksum: 10c0/b59aad1ad19bf1733cf524fd4e618196c6c7690f48ee70a327eb450a42aab8e8a063fbe59ca0a5701aebe2d92d582292c0fb845ea57474f6a15f6994b0e260b2 + languageName: node + linkType: hard -"@types/react@^18.3.12": - version "18.3.29" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.29.tgz#7f3b6e1515499d4fd199cc8fd4710114be36c1a2" - integrity sha512-ch0qJdr2JY0r04NXSprbK6TXOgnaJ1Tz23fm5W+z0/CBah6BSBc3n96h7K9GOtwh0HrilNWHIBzE1Ko4Dcw/Wg== +"@types/qrcode@npm:^1": + version: 1.5.6 + resolution: "@types/qrcode@npm:1.5.6" dependencies: - "@types/prop-types" "*" - csstype "^3.2.2" + "@types/node": "npm:*" + checksum: 10c0/84844ca63e5f32bc47d44dda0f8a6f7cdcc7ce44e7b24f10f19d50796f31d12c058f702a8f7d352c9e82a023a9abc36fa1ad01ddf0a209dd8ed4562ea76481fc + languageName: node + linkType: hard -"@vitejs/plugin-react@^4.4.1": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz#647af4e7bb75ad3add578e762ad984b90f4a24b9" - integrity sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA== +"@types/react-dom@npm:^18.3.1": + version: 18.3.7 + resolution: "@types/react-dom@npm:18.3.7" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 10c0/8bd309e2c3d1604a28a736a24f96cbadf6c05d5288cfef8883b74f4054c961b6b3a5e997fd5686e492be903c8f3380dba5ec017eff3906b1256529cd2d39603e + languageName: node + linkType: hard + +"@types/react@npm:^18.3.12": + version: 18.3.29 + resolution: "@types/react@npm:18.3.29" dependencies: - "@babel/core" "^7.28.0" - "@babel/plugin-transform-react-jsx-self" "^7.27.1" - "@babel/plugin-transform-react-jsx-source" "^7.27.1" - "@rolldown/pluginutils" "1.0.0-beta.27" - "@types/babel__core" "^7.20.5" - react-refresh "^0.17.0" + "@types/prop-types": "npm:*" + csstype: "npm:^3.2.2" + checksum: 10c0/b582f5c3a034229b2e287f5e39aebf3988d6ce79e7fd81c8257dc55bee0e321ddf708d6014a44c5ceae8debea1e15a93326b207a4fec6a0170200a03d105adfb + languageName: node + linkType: hard -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== +"@vitejs/plugin-react@npm:^4.4.1": + version: 4.7.0 + resolution: "@vitejs/plugin-react@npm:4.7.0" dependencies: - color-convert "^2.0.1" + "@babel/core": "npm:^7.28.0" + "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" + "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" + "@rolldown/pluginutils": "npm:1.0.0-beta.27" + "@types/babel__core": "npm:^7.20.5" + react-refresh: "npm:^0.17.0" + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + checksum: 10c0/692f23960972879485d647713663ec299c478222c96567d60285acf7c7dc5c178e71abfe9d2eefddef1eeb01514dacbc2ed68aad84628debf9c7116134734253 + languageName: node + linkType: hard -baseline-browser-mapping@^2.10.12: - version "2.10.32" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz#b6b553a4285fdd606327a617de36a5351e3aaa64" - integrity sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg== +"abbrev@npm:^5.0.0": + version: 5.0.0 + resolution: "abbrev@npm:5.0.0" + checksum: 10c0/8e88f5c798ea4562d28c5a3e9ad69e3879890bc5d695d8f2dffb8609be4c890aacc8f80ef4553fdd2c6a62d70c2ce8bc57b38074e383beb7487bdafa9ed42ea5 + languageName: node + linkType: hard -browserslist@^4.24.0: - version "4.28.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2" - integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" dependencies: - baseline-browser-mapping "^2.10.12" - caniuse-lite "^1.0.30001782" - electron-to-chromium "^1.5.328" - node-releases "^2.0.36" - update-browserslist-db "^1.2.3" + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +"baseline-browser-mapping@npm:^2.10.12": + version: 2.10.32 + resolution: "baseline-browser-mapping@npm:2.10.32" + bin: + baseline-browser-mapping: dist/cli.cjs + checksum: 10c0/408c93245bdf1e92ab0f891ebf9283ec60dbabfaac81bdc9a20d371565a2a496b0fb8028f7d628c3f66f90ee142670a81575cf1cbd5229f7b4b0d350db911085 + languageName: node + linkType: hard -caniuse-lite@^1.0.30001782: - version "1.0.30001793" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz#238887ddf5fcfc8c36d872394d0a78a517312a72" - integrity sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== +"browserslist@npm:^4.24.0": + version: 4.28.2 + resolution: "browserslist@npm:4.28.2" dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" + baseline-browser-mapping: "npm:^2.10.12" + caniuse-lite: "npm:^1.0.30001782" + electron-to-chromium: "npm:^1.5.328" + node-releases: "npm:^2.0.36" + update-browserslist-db: "npm:^1.2.3" + bin: + browserslist: cli.js + checksum: 10c0/c0228b6330f785b7fa59d2d360124ec6d9322f96ed9f3ee1f873e33ecc9503a6f0ffc3b71191a28c4ff6e930b753b30043da1c33844a9548f3018d491f09ce60 + languageName: node + linkType: hard -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== +"camelcase@npm:^5.0.0": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001782": + version: 1.0.30001793 + resolution: "caniuse-lite@npm:1.0.30001793" + checksum: 10c0/bee8f8b55d1ccdb2076b7355c06fd01916952eadd76b828e4d5fb9ac62d17ec7db0e2b7c326b923478b93526ad1ff74f189cf40c06de0e4a5edbc677009b97fe + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"cliui@npm:^6.0.0": + version: 6.0.0 + resolution: "cliui@npm:6.0.0" dependencies: - color-name "~1.1.4" + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^6.2.0" + checksum: 10c0/35229b1bb48647e882104cac374c9a18e34bbf0bace0e2cf03000326b6ca3050d6b59545d91e17bfe3705f4a0e2988787aa5cde6331bf5cbbf0164732cef6492 + languageName: node + linkType: hard -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -csstype@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" - integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== - -debug@^4.1.0, debug@^4.3.1: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" dependencies: - ms "^2.1.3" + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard -dijkstrajs@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" - integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA== +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard -electron-to-chromium@^1.5.328: - version "1.5.361" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.361.tgz#b993bc7b34ea83f348aa1787a608ecf12e39b909" - integrity sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA== +"csstype@npm:^3.2.2": + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce + languageName: node + linkType: hard -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +"debug@npm:^4.1.0, debug@npm:^4.3.1": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +"decamelize@npm:^1.2.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 + languageName: node + linkType: hard -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +"dijkstrajs@npm:^1.0.1": + version: 1.0.3 + resolution: "dijkstrajs@npm:1.0.3" + checksum: 10c0/2183d61ac1f25062f3c3773f3ea8d9f45ba164a00e77e07faf8cc5750da966222d1e2ce6299c875a80f969190c71a0973042192c5624d5223e4ed196ff584c99 + languageName: node + linkType: hard -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +"electron-to-chromium@npm:^1.5.328": + version: 1.5.361 + resolution: "electron-to-chromium@npm:1.5.361" + checksum: 10c0/5e6e9c0c12ab82366eddf575c8b9114d5af710abad3b592141c56cfa0169471f3633dcc793420c303fad68dff21c8fb724b43cde7e66be947983fa3d6d5a7359 + languageName: node + linkType: hard -htm@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" - integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ== +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" dependencies: - p-locate "^4.1.0" + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de + languageName: node + linkType: hard -loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f + languageName: node + linkType: hard + +"find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" dependencies: - js-tokens "^3.0.0 || ^4.0.0" + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + languageName: node + linkType: hard -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" dependencies: - yallist "^3.0.2" + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.3.12: - version "3.3.12" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.12.tgz#ab3d912e217a6d0a514f00a72a16543a28982c05" - integrity sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ== - -node-releases@^2.0.36: - version "2.0.46" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.46.tgz#d188a129a83f5e03a101aacb58f260f2ee8faaa1" - integrity sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: - p-try "^2.0.0" + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.1": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"htm@npm:^3.1.1": + version: 3.1.1 + resolution: "htm@npm:3.1.1" + checksum: 10c0/0de4c8fff2b8e76c162235ae80dbf93ca5eef1575bd50596a06ce9bebf1a6da5efc467417c53034a9ffa2ab9ecff819cbec041dc9087894b2b900ad4de26c7e7 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 + languageName: node + linkType: hard + +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" dependencies: - p-limit "^2.2.0" + p-locate: "npm:^4.1.0" + checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + languageName: node + linkType: hard -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -pngjs@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" - integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== - -postcss@^8.4.43: - version "8.5.15" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.15.tgz#d1eaf677a324e9ec02196da2d3fecf4a0b9a735c" - integrity sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A== +"loose-envify@npm:^1.1.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" dependencies: - nanoid "^3.3.12" - picocolors "^1.1.1" - source-map-js "^1.2.1" + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard -qrcode@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.4.tgz#5cb81d86eb57c675febb08cf007fff963405da88" - integrity sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg== +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" dependencies: - dijkstrajs "^1.0.1" - pngjs "^5.0.0" - yargs "^15.3.1" + yallist: "npm:^3.0.2" + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + languageName: node + linkType: hard -react-dom@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== +"minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb + languageName: node + linkType: hard + +"minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" + minipass: "npm:^7.1.2" + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec + languageName: node + linkType: hard -react-refresh@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" - integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== +"ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard -react@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== +"nanoid@npm:^3.3.12": + version: 3.3.12 + resolution: "nanoid@npm:3.3.12" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/ba142b7b39e11e80c16dd74b0365d407880c87c1cf7e1480956981ae940ee36060fa5b6f092cd1e315184dd19244c657bd017d03327bd3c62247d691c5e8edfb + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 13.0.0 + resolution: "node-gyp@npm:13.0.0" dependencies: - loose-envify "^1.1.0" + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + nopt: "npm:^10.0.0" + proc-log: "npm:^7.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.5.4" + tinyglobby: "npm:^0.2.12" + undici: "npm:^6.25.0" + which: "npm:^7.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/e7525c427db2d16aa368b8947187de83083d2a8dda23e3e096a71c22ae637ac5bb8ed7cf6c871f1b9118cd2729dbfee4ff3a4245e2b79226900227b15831b492 + languageName: node + linkType: hard -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +"node-releases@npm:^2.0.36": + version: 2.0.46 + resolution: "node-releases@npm:2.0.46" + checksum: 10c0/04632591f97f15848adfb12b21fa013a6c19809afcf5db65fe88c95a36271c3f423e21110fd319ad5a9c5029ffe65eb81f3e4857e6af19622bc888d92a04ad22 + languageName: node + linkType: hard -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -rollup@^4.20.0: - version "4.60.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.60.4.tgz#ca3814f5900da3ac3981d2e0c61944b7e6e0cb09" - integrity sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g== +"nopt@npm:^10.0.0": + version: 10.0.1 + resolution: "nopt@npm:10.0.1" dependencies: - "@types/estree" "1.0.8" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.60.4" - "@rollup/rollup-android-arm64" "4.60.4" - "@rollup/rollup-darwin-arm64" "4.60.4" - "@rollup/rollup-darwin-x64" "4.60.4" - "@rollup/rollup-freebsd-arm64" "4.60.4" - "@rollup/rollup-freebsd-x64" "4.60.4" - "@rollup/rollup-linux-arm-gnueabihf" "4.60.4" - "@rollup/rollup-linux-arm-musleabihf" "4.60.4" - "@rollup/rollup-linux-arm64-gnu" "4.60.4" - "@rollup/rollup-linux-arm64-musl" "4.60.4" - "@rollup/rollup-linux-loong64-gnu" "4.60.4" - "@rollup/rollup-linux-loong64-musl" "4.60.4" - "@rollup/rollup-linux-ppc64-gnu" "4.60.4" - "@rollup/rollup-linux-ppc64-musl" "4.60.4" - "@rollup/rollup-linux-riscv64-gnu" "4.60.4" - "@rollup/rollup-linux-riscv64-musl" "4.60.4" - "@rollup/rollup-linux-s390x-gnu" "4.60.4" - "@rollup/rollup-linux-x64-gnu" "4.60.4" - "@rollup/rollup-linux-x64-musl" "4.60.4" - "@rollup/rollup-openbsd-x64" "4.60.4" - "@rollup/rollup-openharmony-arm64" "4.60.4" - "@rollup/rollup-win32-arm64-msvc" "4.60.4" - "@rollup/rollup-win32-ia32-msvc" "4.60.4" - "@rollup/rollup-win32-x64-gnu" "4.60.4" - "@rollup/rollup-win32-x64-msvc" "4.60.4" - fsevents "~2.3.2" + abbrev: "npm:^5.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/980d89257f9587f3e1f77877ddbf905d6aa3b738ec33e49a4fa1a059a0dd82eb28063982b150654a7ae9de386f2ead60e56172db7d37cf56de545f7392a2a26a + languageName: node + linkType: hard -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" dependencies: - loose-envify "^1.1.0" + p-try: "npm:^2.0.0" + checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + languageName: node + linkType: hard -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + p-limit: "npm:^2.2.0" + checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 + languageName: node + linkType: hard -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^4.0.4": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 + languageName: node + linkType: hard + +"pngjs@npm:^5.0.0": + version: 5.0.0 + resolution: "pngjs@npm:5.0.0" + checksum: 10c0/c074d8a94fb75e2defa8021e85356bf7849688af7d8ce9995b7394d57cd1a777b272cfb7c4bce08b8d10e71e708e7717c81fd553a413f21840c548ec9d4893c6 + languageName: node + linkType: hard + +"postcss@npm:^8.4.43": + version: 8.5.15 + resolution: "postcss@npm:8.5.15" dependencies: - ansi-regex "^5.0.1" + nanoid: "npm:^3.3.12" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/7f2e63ae22fbe43aace1bf652bd99da4e90737c64194d49e51ddc9cd0f9e51ff2861a7d734379b494deffa03a880a5c65eec70bc29ee9ebaa7136dde3eee8f31 + languageName: node + linkType: hard -typescript@^5.8.2: - version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" - integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== +"proc-log@npm:^7.0.0": + version: 7.0.0 + resolution: "proc-log@npm:7.0.0" + checksum: 10c0/b89c2d862604f35fec795477b0c7e376feab3ba0d4f4d291c4e959567442697cf451ac557d0623c1cc38af45a78128b983410f397a10c5d3a67f76c33de4754b + languageName: node + linkType: hard -"undici-types@>=7.24.0 <7.24.7": - version "7.24.6" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" - integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg== - -update-browserslist-db@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" - integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== +"qrcode@npm:^1.5.4": + version: 1.5.4 + resolution: "qrcode@npm:1.5.4" dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" + dijkstrajs: "npm:^1.0.1" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: 10c0/ae1d57c9cff6099639a590b432c71b15e3bd3905ce4353e6d00c95dee6bb769a8f773f6a7575ecc1b8ed476bf79c5138a4a65cb380c682de3b926d7205d34d10 + languageName: node + linkType: hard -vite@^5.4.14: - version "5.4.21" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" - integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== +"quixos-project-visualizer@workspace:.": + version: 0.0.0-use.local + resolution: "quixos-project-visualizer@workspace:." dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" + "@quixos/control-plane-protocol": "file:../quixos-control-plane-protocol" + "@remote-dom/core": "npm:^1.10.1" + "@types/qrcode": "npm:^1" + "@types/react": "npm:^18.3.12" + "@types/react-dom": "npm:^18.3.1" + "@vitejs/plugin-react": "npm:^4.4.1" + qrcode: "npm:^1.5.4" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" + typescript: "npm:^5.8.2" + vite: "npm:^5.4.14" + zod: "npm:^4.3.6" + languageName: unknown + linkType: soft -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== +"react-dom@npm:^18.3.1": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + loose-envify: "npm:^1.1.0" + scheduler: "npm:^0.23.2" + peerDependencies: + react: ^18.3.1 + checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85 + languageName: node + linkType: hard -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +"react-refresh@npm:^0.17.0": + version: 0.17.0 + resolution: "react-refresh@npm:0.17.0" + checksum: 10c0/002cba940384c9930008c0bce26cac97a9d5682bc623112c2268ba0c155127d9c178a9a5cc2212d560088d60dfd503edd808669a25f9b377f316a32361d0b23c + languageName: node + linkType: hard -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== +"react@npm:^18.3.1": + version: 18.3.1 + resolution: "react@npm:18.3.1" dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" + loose-envify: "npm:^1.1.0" + checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 + languageName: node + linkType: hard -yargs@^15.3.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-main-filename@npm:^2.0.0": + version: 2.0.0 + resolution: "require-main-filename@npm:2.0.0" + checksum: 10c0/db91467d9ead311b4111cbd73a4e67fa7820daed2989a32f7023785a2659008c6d119752d9c4ac011ae07e537eb86523adff99804c5fdb39cd3a017f9b401bb6 + languageName: node + linkType: hard + +"rollup@npm:^4.20.0": + version: 4.60.4 + resolution: "rollup@npm:4.60.4" dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" + "@rollup/rollup-android-arm-eabi": "npm:4.60.4" + "@rollup/rollup-android-arm64": "npm:4.60.4" + "@rollup/rollup-darwin-arm64": "npm:4.60.4" + "@rollup/rollup-darwin-x64": "npm:4.60.4" + "@rollup/rollup-freebsd-arm64": "npm:4.60.4" + "@rollup/rollup-freebsd-x64": "npm:4.60.4" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.60.4" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.60.4" + "@rollup/rollup-linux-arm64-gnu": "npm:4.60.4" + "@rollup/rollup-linux-arm64-musl": "npm:4.60.4" + "@rollup/rollup-linux-loong64-gnu": "npm:4.60.4" + "@rollup/rollup-linux-loong64-musl": "npm:4.60.4" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.60.4" + "@rollup/rollup-linux-ppc64-musl": "npm:4.60.4" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.60.4" + "@rollup/rollup-linux-riscv64-musl": "npm:4.60.4" + "@rollup/rollup-linux-s390x-gnu": "npm:4.60.4" + "@rollup/rollup-linux-x64-gnu": "npm:4.60.4" + "@rollup/rollup-linux-x64-musl": "npm:4.60.4" + "@rollup/rollup-openbsd-x64": "npm:4.60.4" + "@rollup/rollup-openharmony-arm64": "npm:4.60.4" + "@rollup/rollup-win32-arm64-msvc": "npm:4.60.4" + "@rollup/rollup-win32-ia32-msvc": "npm:4.60.4" + "@rollup/rollup-win32-x64-gnu": "npm:4.60.4" + "@rollup/rollup-win32-x64-msvc": "npm:4.60.4" + "@types/estree": "npm:1.0.8" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loong64-gnu": + optional: true + "@rollup/rollup-linux-loong64-musl": + optional: true + "@rollup/rollup-linux-ppc64-gnu": + optional: true + "@rollup/rollup-linux-ppc64-musl": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-openbsd-x64": + optional: true + "@rollup/rollup-openharmony-arm64": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/2734511579da220408eefb877b51281767d790652cee25da8fcd4936c947e3db14882b5edb1d0d5d5bf60f2a71a58ae7d5f7f46c11e3fdf33182538953886243 + languageName: node + linkType: hard -zod@^4.3.6: - version "4.4.3" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356" - integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 + languageName: node + linkType: hard + +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.5": + version: 7.8.4 + resolution: "semver@npm:7.8.4" + bin: + semver: bin/semver.js + checksum: 10c0/81b7c296fd7927b80f67fa516b75fa1017caac8167795320de28e76ccbc6f7f01763c30ecd10d6a0d8fd089708ab0548a5aebb94b0870e99c2a2b4600a46389b + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"string-width@npm:^4.1.0, string-width@npm:^4.2.0": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"tar@npm:^7.5.4": + version: 7.5.16 + resolution: "tar@npm:7.5.16" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10c0/4f37f3c4bd2ca2755fd736a5df1d573c1a868ec1b1e893346aeafa95ac510f9e2fd1469420bd866cc7904799e5bd4ac62b5d4f03fe27747d6e1e373b44505c5c + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12": + version: 0.2.17 + resolution: "tinyglobby@npm:0.2.17" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.4" + checksum: 10c0/7f7bb0f197c88bc4b20c231e0deca4240ca3bf313a88f5a7fee93a872b84966a4d50220947c0455ad07a60b3b360961c5b7fd979222aeb716a9f99b412002e4c + languageName: node + linkType: hard + +"typescript@npm:^5.8.2": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.8.2#optional!builtin": + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 + languageName: node + linkType: hard + +"undici-types@npm:>=7.24.0 <7.24.7": + version: 7.24.6 + resolution: "undici-types@npm:7.24.6" + checksum: 10c0/d9cd8befb643ac904615c280a095ba4240531f6bb4a5e75a22a7483630ca8d3f1016d2ab6ace6ceda1f63b3a2db2fe037fafe121d6917a0187573aa548ff78ca + languageName: node + linkType: hard + +"undici@npm:^6.25.0": + version: 6.27.0 + resolution: "undici@npm:6.27.0" + checksum: 10c0/f88c3dae3957dbf9d93cb481440aced317bd3c4941b5914fea5efba516d51138988cdb5c76006f0bb1337e41d56c3443351055d492e73af2428521c37ba2a76f + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.2.3": + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/13a00355ea822388f68af57410ce3255941d5fb9b7c49342c4709a07c9f230bbef7f7499ae0ca7e0de532e79a82cc0c4edbd125f1a323a1845bf914efddf8bec + languageName: node + linkType: hard + +"vite@npm:^5.4.14": + version: 5.4.21 + resolution: "vite@npm:5.4.21" + dependencies: + esbuild: "npm:^0.21.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/468336a1409f728b464160cbf02672e72271fb688d0e605e776b74a89d27e1029509eef3a3a6c755928d8011e474dbf234824d054d07960be5f23cd176bc72de + languageName: node + linkType: hard + +"which-module@npm:^2.0.0": + version: 2.0.1 + resolution: "which-module@npm:2.0.1" + checksum: 10c0/087038e7992649eaffa6c7a4f3158d5b53b14cf5b6c1f0e043dccfacb1ba179d12f17545d5b85ebd94a42ce280a6fe65d0cbcab70f4fc6daad1dfae85e0e6a3e + languageName: node + linkType: hard + +"which@npm:^7.0.0": + version: 7.0.0 + resolution: "which@npm:7.0.0" + dependencies: + isexe: "npm:^4.0.0" + bin: + node-which: bin/which.js + checksum: 10c0/ca0b54f198f78bbc4b7c02e34bda8d335cb352e0adb4cbca1c37b1a957af3a879a82c4c27ca6525bc942f548d8b64f816ef6528360af9f3de55ffb9b979b620d + languageName: node + linkType: hard + +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + +"y18n@npm:^4.0.0": + version: 4.0.3 + resolution: "y18n@npm:4.0.3" + checksum: 10c0/308a2efd7cc296ab2c0f3b9284fd4827be01cfeb647b3ba18230e3a416eb1bc887ac050de9f8c4fd9e7856b2e8246e05d190b53c96c5ad8d8cb56dffb6f81024 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yargs-parser@npm:^18.1.2": + version: 18.1.3 + resolution: "yargs-parser@npm:18.1.3" + dependencies: + camelcase: "npm:^5.0.0" + decamelize: "npm:^1.2.0" + checksum: 10c0/25df918833592a83f52e7e4f91ba7d7bfaa2b891ebf7fe901923c2ee797534f23a176913ff6ff7ebbc1cc1725a044cc6a6539fed8bfd4e13b5b16376875f9499 + languageName: node + linkType: hard + +"yargs@npm:^15.3.1": + version: 15.4.1 + resolution: "yargs@npm:15.4.1" + dependencies: + cliui: "npm:^6.0.0" + decamelize: "npm:^1.2.0" + find-up: "npm:^4.1.0" + get-caller-file: "npm:^2.0.1" + require-directory: "npm:^2.1.1" + require-main-filename: "npm:^2.0.0" + set-blocking: "npm:^2.0.0" + string-width: "npm:^4.2.0" + which-module: "npm:^2.0.0" + y18n: "npm:^4.0.0" + yargs-parser: "npm:^18.1.2" + checksum: 10c0/f1ca680c974333a5822732825cca7e95306c5a1e7750eb7b973ce6dc4f97a6b0a8837203c8b194f461969bfe1fb1176d1d423036635285f6010b392fa498ab2d + languageName: node + linkType: hard + +"zod@npm:^4.3.6": + version: 4.4.3 + resolution: "zod@npm:4.4.3" + checksum: 10c0/7ea31b558e88f9faf44f31dd185e2e1cbf51fed3081787fb96cc2534749b50c0acfc6da7f0922a7353ed092dd358c7d50c28ea96c94d04af64191bd33152eca3 + languageName: node + linkType: hard diff --git a/tofu/.gitignore b/tofu/.gitignore new file mode 100644 index 0000000..66a3cdc --- /dev/null +++ b/tofu/.gitignore @@ -0,0 +1,10 @@ +.terraform/ +*.tfstate +*.tfstate.* +*.tfvars +*.tfplan +crash.log +override.tf +override.tf.json +*_override.tf +*_override.tf.json diff --git a/tofu/.terraform.lock.hcl b/tofu/.terraform.lock.hcl new file mode 100644 index 0000000..5e02a59 --- /dev/null +++ b/tofu/.terraform.lock.hcl @@ -0,0 +1,43 @@ +# This file is maintained automatically by "tofu init". +# Manual edits may be lost in future updates. + +provider "registry.opentofu.org/hashicorp/aws" { + version = "5.100.0" + constraints = "~> 5.0" + hashes = [ + "h1:zef23ac/YWw9O2FepFWRs+my9iWWUkniL4dT4LnCKjU=", + "zh:1a41f3ee26720fee7a9a0a361890632a1701b5dc1cf5355dc651ddbe115682ff", + "zh:30457f36690c19307921885cc5e72b9dbeba369445815903acd5c39ac0e41e7a", + "zh:42c22674d5f23f6309eaf3ac3a4f1f8b66b566c1efe1dcb0dd2fb30c17ce1f78", + "zh:4cc271c795ff8ce6479ec2d11a8ba65a0a9ed6331def6693f4b9dccb6e662838", + "zh:60932aa376bb8c87cd1971240063d9d38ba6a55502c867fdbb9f5361dc93d003", + "zh:864e42784bde77b18393ebfcc0104cea9123da5f4392e8a059789e296952eefa", + "zh:9750423138bb01ecaa5cec1a6691664f7783d301fb1628d3b64a231b6b564e0e", + "zh:e5d30c4dec271ef9d6fe09f48237ec6cfea1036848f835b4e47f274b48bda5a7", + "zh:e62bd314ae97b43d782e0841b13e68a3f8ec85cc762004f973ce5ce7b6cdbfd0", + "zh:ea851a3c072528a4445ac6236ba2ce58ffc99ec466019b0bd0e4adde63a248e4", + ] +} + +provider "registry.opentofu.org/hashicorp/random" { + version = "3.9.0" + constraints = "~> 3.6" + hashes = [ + "h1:8EQU5KSxezcjo/phRSe69rDOI0lk4pSaggj7FsskYp8=", + "zh:03f1114cc20b8913523735ab76e0f0a2b16ce13c92923a53304bf85f07fc0dbc", + "zh:105b678ee72322a3067f105d7e05e940f6143238f377f6e87ff4ec909246ac2a", + "zh:55f3bbf13ea18cbace61a706566a80f25f33fe2b1780b6f3d7b582af2a05b6d2", + "zh:63adf996db48f082f7a6351eb485e219cd88795fc71e6ec60a837263ab0d2cb1", + "zh:7e99550738a4e3cc68b8a467714b0d69371025fe95e3326d5323d026d55653e9", + "zh:8342b54af3a18a37e075eeae61be57f4de2ba71b35d95c5075d402dd2c1f289d", + "zh:83ee18e32ac9dd5fc91298554b7c4cfa4c3a1db50f4c797945637cc93c0844ae", + "zh:993ecc0adbf6bd535a59fbc9b735d8c33950e6f6eb5e621d750da9b71d65d80a", + "zh:ad722bc59d4edbf1415e827fc007c0efe6e0e9462d5568bae20b34be1058a261", + "zh:ae9448e1f87b2f9a6c5197a0e9862162ec6b137cb3a3835e11522995d8939e7c", + "zh:bc9cdd3aac784f759125c6627f6f6416e8726a1c184eb9cf3e55b9edbc94c627", + "zh:c8e35b89572ba1c40a9b20022e033a3395fb8d42e7604d50c900f193ba10382e", + "zh:e2deaa8a9975ef81d9f62baed12c41286918b0a10908e0e031f13f69a3b730a1", + "zh:ee39707557210a0ab1098aa357d2cdfe502e5a312d0dbdffb09d08facc4d3fc5", + "zh:f81afe4eb63e8aa9e0ea71be6c990f0dc69cb360e7191c0742a991f4a5081b64", + ] +} diff --git a/tofu/README.md b/tofu/README.md new file mode 100644 index 0000000..5d95cee --- /dev/null +++ b/tofu/README.md @@ -0,0 +1,53 @@ +# Quixos AWS Deployment + +This stack provisions one public NixOS EC2 host for Quixos: + +- `t4g.medium` by default +- public IPv4 through an Elastic IP +- Route 53 `A` record +- Caddy on `80`/`443` +- SSM Session Manager access by default +- optional SSH +- persistent EBS as a ZFS pool mounted at `/nix` and `/persist` +- Quixos code loaded from the flake in Gitea +- mutable package tree cloned into `/persist/srv/quixos/packages` + +The root system is intended to stay rebuildable from NixOS config. Persistent state is explicit under `/persist`; the package tree is deployment state. The persistent EBS volume is initialized as a `quixos-persist` ZFS pool on first boot and carries `/nix` plus `/persist`. + +Most AWS resource names include a generated deployment suffix, exposed as the `deployment_id` output. The Route 53 record uses the configured subdomain directly. + +## Deploy + +Create a vars file: + +```hcl +aws_region = "us-west-2" +route53_zone_id = "Z..." +subdomain = "quixos.example.com" +``` + +Then: + +```bash +cd tofu +tofu init +./deploy.sh --packages-ref master +``` + +`deploy.sh` resolves the package-tree ref. If `.quixos-package-tree.json` contains `quixos.rev`, that rev is deployed. Use `--quixos-ref master` to override it. + +## Notes + +The NixOS AMI lookup defaults to public owner `427812963091` and arm64 names matching `nixos/*-aarch64-linux`. If that does not match your region/account, set `nixos_ami_id`. + +To inspect candidates manually: + +```bash +aws ec2 describe-images \ + --owners 427812963091 \ + --filters Name=architecture,Values=arm64 Name=virtualization-type,Values=hvm \ + --query 'Images[].{Name:Name,ImageId:ImageId,CreationDate:CreationDate}' \ + --output text | sort | tail +``` + +The visualizer static derivation uses `project-visualizer/yarn-project.nix`, generated by `yarn-plugin-nixify`. diff --git a/tofu/TODO.md b/tofu/TODO.md new file mode 100644 index 0000000..ac72687 --- /dev/null +++ b/tofu/TODO.md @@ -0,0 +1,10 @@ +# Quixos AWS Deployment TODO + +- Build a Quixos-ready NixOS AMI instead of doing first-boot ZFS/NixOS bootstrapping. + - Include ZFS kernel support in the booted generation. + - Include SSM agent and baseline EC2 metadata handling. + - Keep deployment-specific values in OpenTofu/user-data, not baked into the AMI. +- Decide whether the persistent volume should be initialized by AMI boot logic, user-data, or a dedicated systemd unit. +- Revisit the two-phase `amazon-init` bootstrap once the AMI exists; it should become much smaller or disappear. +- Add a documented instance-debug checklist for SSM sessions. +- Decide whether `/boot` should be persistent for this deployment model or left on replaceable root storage. diff --git a/tofu/deploy.sh b/tofu/deploy.sh new file mode 100755 index 0000000..02b77d2 --- /dev/null +++ b/tofu/deploy.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +packages_ref="master" +quixos_ref="" +quixos_ref_is_rev=false +package_tree_repo_url="https://gitea-external.egads.tutti.syntaxblitz.net/quixos-packages/packages.git" + +usage() { + cat >&2 <<'EOF' +Usage: tofu/deploy.sh [options] + +Options: + --packages-ref Package-tree ref to deploy (default: master) + --packages-repo Package-tree repo URL + --quixos-ref Override Quixos ref from package-tree metadata + --quixos-rev Override Quixos ref and mark it as an exact rev + -h, --help Show this help +EOF +} + +while [ "$#" -gt 0 ]; do + case "$1" in + --packages-ref) + packages_ref="$2" + shift 2 + ;; + --packages-repo) + package_tree_repo_url="$2" + shift 2 + ;; + --quixos-ref) + quixos_ref="$2" + quixos_ref_is_rev=false + shift 2 + ;; + --quixos-rev) + quixos_ref="$2" + quixos_ref_is_rev=true + shift 2 + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "Unknown argument: $1" >&2 + usage + exit 1 + ;; + esac +done + +tmpdir="$(mktemp -d)" +trap 'rm -rf "$tmpdir"' EXIT + +git -C "$tmpdir" init -q packages +git -C "$tmpdir/packages" remote add origin "$package_tree_repo_url" +if ! git -C "$tmpdir/packages" fetch --depth=1 origin "$packages_ref"; then + git -C "$tmpdir/packages" fetch origin "$packages_ref" +fi +git -C "$tmpdir/packages" checkout --detach -q FETCH_HEAD + +resolved_packages_ref="$(git -C "$tmpdir/packages" rev-parse HEAD)" + +if [ -z "$quixos_ref" ] && [ -f "$tmpdir/packages/.quixos-package-tree.json" ]; then + quixos_ref="$( + node -e ' + const fs = require("fs"); + const meta = JSON.parse(fs.readFileSync(process.argv[1], "utf8")); + process.stdout.write(meta?.quixos?.rev || ""); + ' "$tmpdir/packages/.quixos-package-tree.json" + )" + if [ -n "$quixos_ref" ]; then + quixos_ref_is_rev=true + fi +fi + +if [ -z "$quixos_ref" ]; then + quixos_ref="master" + quixos_ref_is_rev=false +fi + +cd "$script_dir" + +tofu apply \ + -var "package_tree_repo_url=$package_tree_repo_url" \ + -var "package_tree_ref=$resolved_packages_ref" \ + -var "quixos_ref=$quixos_ref" \ + -var "quixos_ref_is_rev=$quixos_ref_is_rev" diff --git a/tofu/main.tf b/tofu/main.tf new file mode 100644 index 0000000..80ca727 --- /dev/null +++ b/tofu/main.tf @@ -0,0 +1,209 @@ +data "aws_vpc" "default" { + count = var.vpc_id == null ? 1 : 0 + default = true +} + +data "aws_subnets" "default" { + count = var.subnet_id == null ? 1 : 0 + + filter { + name = "vpc-id" + values = [local.vpc_id] + } +} + +data "aws_subnet" "selected" { + id = local.subnet_id +} + +data "aws_ami" "nixos" { + count = var.nixos_ami_id == null ? 1 : 0 + most_recent = true + owners = var.nixos_ami_owners + + filter { + name = "name" + values = [var.nixos_ami_name_pattern] + } + + filter { + name = "architecture" + values = ["arm64"] + } + + filter { + name = "virtualization-type" + values = ["hvm"] + } +} + +resource "random_id" "deployment" { + byte_length = 4 +} + +locals { + vpc_id = var.vpc_id == null ? data.aws_vpc.default[0].id : var.vpc_id + subnet_id = var.subnet_id == null ? data.aws_subnets.default[0].ids[0] : var.subnet_id + nixos_ami_id = var.nixos_ami_id == null ? data.aws_ami.nixos[0].id : var.nixos_ami_id + domain = trimsuffix(var.subdomain, ".") + resource_name = "${var.name}-${random_id.deployment.hex}" + persist_device_id = replace(aws_ebs_volume.persist.id, "-", "") + persist_device = "/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${local.persist_device_id}" + quixos_flake_uri = "git+${var.quixos_repo_url}?${var.quixos_ref_is_rev ? "rev" : "ref"}=${urlencode(var.quixos_ref)}" + ssh_keys = compact([var.ssh_public_key]) + tags = { + Name = local.resource_name + Deployment = random_id.deployment.hex + Project = var.name + } +} + +resource "random_password" "control_secret" { + length = 48 + special = false +} + +resource "random_password" "state_context_secret" { + length = 48 + special = false +} + +resource "aws_iam_role" "instance" { + name = "${local.resource_name}-instance" + + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Action = "sts:AssumeRole" + Effect = "Allow" + Principal = { + Service = "ec2.amazonaws.com" + } + } + ] + }) +} + +resource "aws_iam_role_policy_attachment" "ssm" { + role = aws_iam_role.instance.name + policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" +} + +resource "aws_iam_instance_profile" "instance" { + name = "${local.resource_name}-instance" + role = aws_iam_role.instance.name +} + +resource "aws_security_group" "instance" { + name = "${local.resource_name}-instance" + description = "Quixos instance ingress" + vpc_id = local.vpc_id + + ingress { + description = "HTTP" + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + description = "HTTPS" + from_port = 443 + to_port = 443 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + dynamic "ingress" { + for_each = var.enable_ssh ? [1] : [] + content { + description = "SSH" + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = length(var.ssh_allowed_cidrs) == 0 ? ["0.0.0.0/0"] : var.ssh_allowed_cidrs + } + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } +} + +resource "aws_key_pair" "admin" { + count = var.ssh_public_key == null ? 0 : 1 + key_name = "${local.resource_name}-admin" + public_key = var.ssh_public_key +} + +resource "aws_instance" "host" { + ami = local.nixos_ami_id + instance_type = var.instance_type + subnet_id = local.subnet_id + vpc_security_group_ids = [aws_security_group.instance.id] + iam_instance_profile = aws_iam_instance_profile.instance.name + associate_public_ip_address = true + key_name = var.ssh_public_key == null ? null : aws_key_pair.admin[0].key_name + user_data_replace_on_change = true + + user_data = templatefile("${path.module}/user-data.sh.tftpl", { + admin_user = var.admin_user + domain = local.domain + enable_ssh = var.enable_ssh + force_package_tree_ref_on_boot = var.force_package_tree_ref_on_boot + package_tree_ref = var.package_tree_ref + package_tree_repo_url = var.package_tree_repo_url + persist_device = local.persist_device + quixos_flake_uri = local.quixos_flake_uri + ssh_authorized_keys = jsonencode(local.ssh_keys) + control_secret = random_password.control_secret.result + state_context_secret = random_password.state_context_secret.result + }) + + root_block_device { + volume_size = var.root_volume_size_gb + volume_type = "gp3" + } + + tags = local.tags +} + +resource "aws_ebs_volume" "persist" { + availability_zone = data.aws_subnet.selected.availability_zone + size = var.persist_volume_size_gb + type = "gp3" + + tags = merge(local.tags, { + Name = "${local.resource_name}-persist" + }) +} + +resource "aws_volume_attachment" "persist" { + device_name = "/dev/sdf" + volume_id = aws_ebs_volume.persist.id + instance_id = aws_instance.host.id +} + +resource "aws_eip" "host" { + domain = "vpc" + + tags = local.tags +} + +resource "aws_eip_association" "host" { + instance_id = aws_instance.host.id + allocation_id = aws_eip.host.id +} + +resource "aws_route53_record" "host" { + zone_id = var.route53_zone_id + name = local.domain + type = "A" + ttl = 60 + records = [aws_eip.host.public_ip] +} diff --git a/tofu/outputs.tf b/tofu/outputs.tf new file mode 100644 index 0000000..17082ed --- /dev/null +++ b/tofu/outputs.tf @@ -0,0 +1,33 @@ +output "public_ip" { + value = aws_eip.host.public_ip +} + +output "deployment_id" { + value = random_id.deployment.hex +} + +output "resource_name" { + value = local.resource_name +} + +output "domain" { + value = local.domain +} + +output "url" { + value = "https://${local.domain}" +} + +output "control_secret" { + value = random_password.control_secret.result + sensitive = true +} + +output "state_context_secret" { + value = random_password.state_context_secret.result + sensitive = true +} + +output "ssm_start_session" { + value = "aws ssm start-session --target ${aws_instance.host.id}" +} diff --git a/tofu/user-data.sh.tftpl b/tofu/user-data.sh.tftpl new file mode 100644 index 0000000..eebd8dc --- /dev/null +++ b/tofu/user-data.sh.tftpl @@ -0,0 +1,160 @@ +#!/usr/bin/env bash +set -euo pipefail + +persist_device='${persist_device}' +bootstrap_state_dir=/var/lib/quixos-bootstrap +zfs_generation_marker="$bootstrap_state_dir/zfs-generation-booted" + +mkdir -p "$bootstrap_state_dir" + +if [ ! -e "$zfs_generation_marker" ]; then + mkdir -p /etc/nixos + cat > /etc/nixos/flake.nix <<'EOF' +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + }; + + outputs = { nixpkgs, ... }: { + nixosConfigurations.quixos-bootstrap-zfs = nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + modules = [ + ({ modulesPath, ... }: { + imports = [ "$${modulesPath}/virtualisation/amazon-image.nix" ]; + + networking.hostName = "quixos"; + networking.hostId = "71756978"; + + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + boot.supportedFilesystems = [ "zfs" ]; + services.amazon-ssm-agent.enable = true; + + users.users."${admin_user}" = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + openssh.authorizedKeys.keys = ${ssh_authorized_keys}; + }; + security.sudo.wheelNeedsPassword = false; + + system.stateVersion = "25.05"; + }) + ]; + }; + }; +} +EOF + + nixos-rebuild boot --flake /etc/nixos#quixos-bootstrap-zfs + touch "$zfs_generation_marker" + systemctl reboot + exit 0 +fi + +for _ in $(seq 1 600); do + if [ -e "$persist_device" ]; then + break + fi + sleep 1 +done + +if [ ! -e "$persist_device" ]; then + echo "Persistent device did not appear: $persist_device" >&2 + exit 1 +fi + +cat > /tmp/quixos-zfs-bootstrap.sh <<'EOS' +#!/usr/bin/env bash +set -euo pipefail + +persist_device="$1" +pool="quixos-persist" + +if ! zpool list -H "$pool" >/dev/null 2>&1; then + if ! zpool import "$pool" >/dev/null 2>&1; then + zpool create \ + -f \ + -o ashift=12 \ + -O acltype=posixacl \ + -O atime=off \ + -O compression=zstd \ + -O mountpoint=none \ + -O xattr=sa \ + "$pool" "$persist_device" + + zfs create -o mountpoint=legacy "$pool/nix" + zfs create -o mountpoint=legacy "$pool/persist" + fi +fi + +mkdir -p /mnt/quixos-nix /persist + +if ! mountpoint -q /nix; then + mount -t zfs "$pool/nix" /mnt/quixos-nix + if [ ! -e /mnt/quixos-nix/store ]; then + rsync -aHAX --numeric-ids /nix/ /mnt/quixos-nix/ + fi + umount /mnt/quixos-nix + mount -t zfs "$pool/nix" /nix +fi + +if ! mountpoint -q /persist; then + mount -t zfs "$pool/persist" /persist +fi +EOS + +nix --extra-experimental-features 'nix-command flakes' \ + shell nixpkgs#zfs nixpkgs#rsync \ + -c bash /tmp/quixos-zfs-bootstrap.sh "$persist_device" + +mkdir -p /persist/secrets /persist/srv/quixos /persist/var/lib/quixos +chmod 700 /persist/secrets + +cat > /persist/secrets/quixos.env < /etc/nixos/flake.nix <<'EOF' +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + quixos.url = "${quixos_flake_uri}"; + }; + + outputs = { nixpkgs, quixos, ... }: { + nixosConfigurations.quixos-host = nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + modules = [ + quixos.nixosModules.quixosHost + ({ ... }: { + networking.hostName = "quixos"; + + users.users."${admin_user}" = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + openssh.authorizedKeys.keys = ${ssh_authorized_keys}; + }; + security.sudo.wheelNeedsPassword = false; + + services.quixosHost = { + enable = true; + domain = "${domain}"; + persistDevice = "${persist_device}"; + zfsPool = "quixos-persist"; + packageTreeRepo = "${package_tree_repo_url}"; + packageTreeRef = "${package_tree_ref}"; + forcePackageTreeRefOnBoot = ${force_package_tree_ref_on_boot}; + enableSsh = ${enable_ssh}; + }; + + system.stateVersion = "25.05"; + }) + ]; + }; + }; +} +EOF + +nixos-rebuild switch --flake /etc/nixos#quixos-host diff --git a/tofu/variables.tf b/tofu/variables.tf new file mode 100644 index 0000000..3b79ba9 --- /dev/null +++ b/tofu/variables.tf @@ -0,0 +1,131 @@ +variable "aws_region" { + type = string + description = "AWS region." + default = "us-west-2" +} + +variable "name" { + type = string + default = "quixos" + description = "Name prefix for AWS resources." +} + +variable "route53_zone_id" { + type = string + description = "Existing public Route 53 hosted zone ID." + default = "Z04472102ZT8IPD1I5PKX" +} + +variable "subdomain" { + type = string + description = "Subdomain to create inside route53_zone_id, such as quixos.example.com." + default = "test-deployment.quixos.org" +} + +variable "vpc_id" { + type = string + default = null + description = "VPC ID. Defaults to the account default VPC." +} + +variable "subnet_id" { + type = string + default = null + description = "Subnet ID. Defaults to the first subnet in the selected/default VPC." +} + +variable "nixos_ami_id" { + type = string + default = null + description = "NixOS aarch64 AMI ID. If null, OpenTofu searches for a recent NixOS AMI." +} + +variable "nixos_ami_owners" { + type = list(string) + default = ["427812963091"] + description = "AWS account IDs to search for NixOS AMIs when nixos_ami_id is null." +} + +variable "nixos_ami_name_pattern" { + type = string + default = "nixos/*-aarch64-linux" + description = "AMI name filter used when nixos_ami_id is null." +} + +variable "instance_type" { + type = string + default = "t4g.medium" + description = "EC2 instance type." +} + +variable "root_volume_size_gb" { + type = number + default = 30 + description = "Root EBS volume size." +} + +variable "persist_volume_size_gb" { + type = number + default = 50 + description = "Persistent EBS volume size mounted at /persist." +} + +variable "quixos_repo_url" { + type = string + default = "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git" + description = "Quixos source repository URL." +} + +variable "quixos_ref" { + type = string + default = "master" + description = "Quixos branch, tag, or commit to deploy." +} + +variable "quixos_ref_is_rev" { + type = bool + default = false + description = "Treat quixos_ref as an exact commit rev instead of a branch/tag ref." +} + +variable "package_tree_repo_url" { + type = string + default = "https://gitea-external.egads.tutti.syntaxblitz.net/quixos-packages/packages.git" + description = "Package-tree super-repo URL." +} + +variable "package_tree_ref" { + type = string + default = "master" + description = "Package-tree branch, tag, or commit to clone on first boot." +} + +variable "force_package_tree_ref_on_boot" { + type = bool + default = false + description = "Force an existing package tree back to package_tree_ref on every boot." +} + +variable "enable_ssh" { + type = bool + default = false + description = "Open SSH ingress and enable sshd. SSM Session Manager is enabled either way." +} + +variable "ssh_public_key" { + type = string + default = null + description = "Optional SSH public key for the admin user." +} + +variable "ssh_allowed_cidrs" { + type = list(string) + default = [] + description = "CIDRs allowed to SSH when enable_ssh is true." +} + +variable "admin_user" { + type = string + default = "quixos-admin" + description = "Admin user created on the NixOS host." +} diff --git a/tofu/versions.tf b/tofu/versions.tf new file mode 100644 index 0000000..67d6e07 --- /dev/null +++ b/tofu/versions.tf @@ -0,0 +1,18 @@ +terraform { + required_version = ">= 1.8.0" + + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.0" + } + random = { + source = "hashicorp/random" + version = "~> 3.6" + } + } +} + +provider "aws" { + region = var.aws_region +}