From 1faa03334c67a1e7c0201bc3e85fb9106ebba566 Mon Sep 17 00:00:00 2001 From: Brandon Li Date: Tue, 27 Oct 2026 02:54:42 -0400 Subject: [PATCH] Remove the previous container-image platform The old platform (src/ API, cli/, deploy/, web-interface/, Hugo docs site, fake backend scripts) was never deployed and is superseded by the HPC-style design in ARCHITECTURE.md. It remains in Git history before this commit. Rewrite the README around the new design, update ARCHITECTURE.md references, and fix a stale executors.md anchor in scheduler.md. Co-Authored-By: Claude Opus 5.5 --- .dockerignore | 5 - .gitignore | 1 - ARCHITECTURE.md | 11 +- README.md | 106 +- cli/cmd/api_client.go | 83 - cli/cmd/auth.go | 13 - cli/cmd/auth_login.go | 148 - cli/cmd/config.go | 15 - cli/cmd/help.go | 16 - cli/cmd/job.go | 9 - cli/cmd/job_cancel.go | 19 - cli/cmd/job_cancel_test.go | 25 - cli/cmd/job_list.go | 49 - cli/cmd/job_list_test.go | 31 - cli/cmd/job_logs.go | 21 - cli/cmd/job_status.go | 25 - cli/cmd/job_status_test.go | 32 - cli/cmd/job_submit.go | 63 - cli/cmd/job_submit_test.go | 43 - cli/cmd/root.go | 84 - cli/cmd/team.go | 84 - cli/cmd/testutil_test.go | 24 - cli/docs/setup.md | 68 - cli/go.mod | 10 - cli/go.sum | 12 - cli/main.go | 5 - deploy/k3s/Dockerfile.api | 7 - deploy/k3s/README.md | 34 - deploy/k3s/complete-results.json | 104 - .../evidence/department-2026-10-09/README.md | 94 - .../admission-results.json | 26 - .../department-2026-10-09/auth-audit.json | 22 - .../browser-results.json | 19 - .../cleanup-validation.json | 56 - .../container-mode-completed.png | Bin 291629 -> 0 bytes .../container-mode-form.png | Bin 284086 -> 0 bytes .../container-mode-result.json | 22 - .../final-datasets-desktop.png | Bin 159843 -> 0 bytes .../final-job-composer-mobile.png | Bin 51890 -> 0 bytes .../final-job-composer.png | Bin 181717 -> 0 bytes .../final-jobs-desktop.png | Bin 114492 -> 0 bytes .../final-jobs-mobile.png | Bin 55278 -> 0 bytes .../department-2026-10-09/final-overview.png | Bin 96399 -> 0 bytes .../large-dataset-job.log | 1 - .../large-dataset-results.json | 12 - .../mist-1c4a852d366b9d2349e1cf7c.log | 1 - .../mist-28ba381f47c609714d91aafb.log | 56 - .../mist-8644eccafaf0b42c3d4add05.log | 18 - .../mist-aeba50ca436d70aa879381ce.log | 56 - .../mist-b46534ddeb9f18852b75f645.log | 1 - .../mist-e5c04ea2cc126a786d6fe783.log | 58 - .../nvidia-allocation.json | 7 - .../department-2026-10-09/nvidia-results.json | 36 - .../department-2026-10-09/portal-firewall.log | 5 - .../release-validation.json | 101 - .../department-2026-10-09/remote-cli-job.log | 1 - .../remote-cli-results.json | 9 - .../remote-cli-status.txt | 3 - .../department-2026-10-09/results.json | 87 - .../runtime-results.json | 41 - .../department-2026-10-09/split-nvidia.log | 18 - .../split-storage-results.json | 37 - .../split-tenstorrent.log | 58 - .../tenstorrent-allocation.json | 6 - .../tenstorrent-results.json | 32 - .../department-2026-10-09/web-audit.json | 22 - .../k3s/evidence/storage-2026-10-21/README.md | 57 - .../storage-2026-10-21/browser-results.json | 9 - .../storage-2026-10-21/datasets-browser.png | Bin 92495 -> 0 bytes .../storage-2026-10-21/deployed-api.json | 6 - .../storage-2026-10-21/host-storage.json | 11 - .../storage-2026-10-21/jobs-browser.png | Bin 86090 -> 0 bytes .../evidence/storage-2026-10-21/nvidia.log | 10 - .../evidence/storage-2026-10-21/results.json | 98 - .../storage-2026-10-21/tenstorrent.log | 58 - .../storage-2026-10-21/validation.json | 40 - .../storage-2026-10-21/workload-volumes.json | 130 - deploy/k3s/examples/Dockerfile.training | 8 - deploy/k3s/examples/dataset.csv | 8 - deploy/k3s/examples/train.py | 74 - deploy/k3s/examples/train_shared.py | 212 - deploy/k3s/foundation-results.json | 133 - deploy/k3s/gpu-smoke-job.yaml | 28 - deploy/k3s/mist-api-forward.service | 11 - deploy/k3s/mist-api-results.json | 191 - deploy/k3s/mist-api.yaml | 243 - deploy/k3s/mist-tenstorrent-claims.yaml | 72 - deploy/k3s/mist-web.service | 13 - deploy/k3s/nvidia-gpu-operator-values.yaml | 10 - deploy/k3s/setup-runbook.md | 9 - deploy/k3s/storage/README.md | 144 - deploy/k3s/storage/mist-team-storage.service | 16 - deploy/k3s/storage/setup-quietbox.sh | 41 - deploy/k3s/storage/setup-storage-link.sh | 35 - deploy/k3s/storage/shared.yaml | 62 - deploy/k3s/storage/team_folders.py | 151 - deploy/k3s/storage/test_folders.py | 95 - deploy/k3s/submit_tenstorrent_smoke.py | 59 - deploy/k3s/team-rbac.yaml | 39 - deploy/k3s/team-workload-policy.yaml | 38 - .../k3s/tenstorrent-allocation-results.json | 153 - deploy/k3s/tenstorrent-operator-values.yaml | 29 - deploy/k3s/tenstorrent-workload-policy.yaml | 40 - deploy/k3s/training-nvidia-job.yaml | 50 - deploy/k3s/training-smoke-results.json | 61 - deploy/k3s/training-tenstorrent-job.yaml | 106 - deploy/k3s/training_smoke.py | 209 - deploy/k3s/verify_department.mjs | 562 -- deploy/k3s/verify_department_admission.py | 24 - deploy/k3s/verify_department_browser.mjs | 419 -- deploy/k3s/verify_department_remote_cli.py | 47 - deploy/k3s/verify_department_runtime.py | 81 - deploy/k3s/verify_large_dataset.py | 83 - deploy/k3s/verify_storage_folders.py | 176 - deploy/k3s/verify_storage_folders_browser.mjs | 59 - deploy/k3s/verify_tenstorrent_allocation.py | 225 - deploy/private/README.md | 171 - deploy/private/backup-auth.sh | 15 - deploy/private/build-and-deploy.sh | 31 - deploy/private/install-web.sh | 17 - deploy/private/mist-portal-firewall.service | 15 - deploy/private/nginx-mist-startup.conf | 9 - deploy/private/nginx.conf | 36 - deploy/private/portal-firewall.sh | 31 - deploy/private/prepare-internal-secret.py | 29 - deploy/private/verify-portal-firewall.sh | 52 - docs/README.md | 40 - docs/agents/architecture/scheduler.md | 2 +- docs/agents/simple-storage-execution.md | 60 - docs/content/_index.md | 51 - docs/content/architecture.md | 78 - docs/content/archive/_index.md | 28 - docs/content/archive/complete-foundation.md | 227 - .../archive/foundation-execution-plan.md | 390 -- .../content/archive/k3s-deployment-history.md | 408 -- docs/content/archive/k3s-setup-history.md | 283 - docs/content/archive/kubernetes-pilot.md | 139 - docs/content/archive/local-job-foundation.md | 334 -- .../archive/shared-storage-deployment-plan.md | 251 - docs/content/complete-foundation.md | 12 - docs/content/department-rollout-execution.md | 179 - docs/content/department-rollout.md | 390 -- docs/content/design-system.md | 78 - docs/content/development.md | 81 - docs/content/foundation-execution-plan.md | 12 - docs/content/frontend-architecture.md | 130 - docs/content/k3s-setup.md | 229 - docs/content/kubernetes-pilot.md | 12 - docs/content/local-job-foundation.md | 12 - docs/content/repository-cleanup.md | 84 - .../content/shared-storage-deployment-plan.md | 12 - docs/content/storage.md | 105 - docs/content/tailscale-ssh.md | 148 - docs/content/testing.md | 87 - docs/frontend-architecture.md | 125 - docs/go.mod | 5 - docs/go.sum | 2 - docs/hugo.yaml | 92 - go.work | 6 - go.work.sum | 30 - pre_compute_platform.md | 12 - scripts/configure-fake-backend.mjs | 547 -- scripts/dev.sh | 236 - scripts/fake-backend-scenarios.mjs | 643 --- scripts/fake-backend.mjs | 898 ---- src/app.go | 122 - src/app_test.go | 66 - src/auth.go | 879 --- src/auth_test.go | 389 -- src/go.mod | 63 - src/go.sum | 204 - src/hardware.go | 266 - src/hardware_test.go | 109 - src/http.go | 35 - src/images.go | 59 - src/images_test.go | 43 - src/job_states.go | 49 - src/job_types.go | 84 - src/jobs.md | 54 - src/jobs_http.go | 109 - src/kubernetes.go | 815 --- src/kubernetes_test.go | 159 - src/main.go | 39 - src/member_auth.go | 69 - src/outputs.go | 24 - src/shared_storage.go | 593 --- src/shared_storage_test.go | 198 - src/storage_status.go | 38 - src/team_queue.go | 539 -- src/team_runtime.go | 241 - src/team_storage.go | 422 -- src/teams.go | 546 -- src/teams_test.go | 587 --- web-interface/.cta.json | 15 - web-interface/.gitignore | 13 - web-interface/.prettierignore | 7 - web-interface/.vscode/settings.json | 11 - web-interface/README.md | 65 - web-interface/eslint.config.js | 20 - web-interface/index.html | 12 - web-interface/package-lock.json | 4695 ----------------- web-interface/package.json | 61 - web-interface/pnpm-lock.yaml | 4599 ---------------- web-interface/prettier.config.js | 10 - web-interface/public/favicon.ico | Bin 152126 -> 0 bytes web-interface/public/favicon.svg | 150 - web-interface/public/fonts/OFL.txt | 93 - .../public/fonts/manrope-latin.woff2 | Bin 24836 -> 0 bytes web-interface/public/logo192.png | Bin 13841 -> 0 bytes web-interface/public/logo512.png | Bin 41025 -> 0 bytes web-interface/public/manifest.json | 25 - web-interface/public/robots.txt | 3 - web-interface/public/sample-avatar.png | Bin 364067 -> 0 bytes web-interface/src/api.ts | 331 -- web-interface/src/auth.tsx | 130 - web-interface/src/components/AccountPage.tsx | 428 -- .../BackendConnectionError.test.tsx | 76 - .../src/components/BackendConnectionError.tsx | 241 - web-interface/src/components/Buttons.tsx | 43 - web-interface/src/components/Card.tsx | 84 - .../src/components/Controls.test.tsx | 88 - .../src/components/DatasetsPage.test.tsx | 58 - web-interface/src/components/DatasetsPage.tsx | 436 -- .../src/components/HardwarePanel.tsx | 125 - .../src/components/JobsPage.test.tsx | 286 - web-interface/src/components/JobsPage.tsx | 336 -- web-interface/src/components/MachinesPage.tsx | 21 - web-interface/src/components/Modal.tsx | 57 - web-interface/src/components/Navbar.tsx | 108 - web-interface/src/components/Picker.tsx | 215 - web-interface/src/components/Tabs.tsx | 49 - .../src/components/TeamStorageBrowser.tsx | 110 - web-interface/src/components/TeamsPage.tsx | 583 -- web-interface/src/components/jobs/JobCard.tsx | 132 - .../src/components/jobs/JobFiles.tsx | 38 - web-interface/src/components/jobs/JobLogs.tsx | 31 - .../src/components/jobs/JobSubmissionForm.tsx | 600 --- web-interface/src/format.ts | 9 - web-interface/src/hooks/usePolling.ts | 50 - web-interface/src/main.tsx | 22 - web-interface/src/routeTree.gen.ts | 189 - web-interface/src/router.tsx | 20 - web-interface/src/routes/__root.tsx | 47 - web-interface/src/routes/dashboard.tsx | 122 - web-interface/src/routes/datasets.tsx | 4 - web-interface/src/routes/index.tsx | 5 - web-interface/src/routes/jobs.tsx | 5 - web-interface/src/routes/machines.tsx | 6 - web-interface/src/routes/profile.tsx | 4 - web-interface/src/routes/teams.tsx | 4 - web-interface/src/styles.css | 1673 ------ web-interface/src/teams.tsx | 113 - web-interface/tsconfig.json | 36 - web-interface/vite.config.ts | 150 - 254 files changed, 30 insertions(+), 36966 deletions(-) delete mode 100644 .dockerignore delete mode 100644 cli/cmd/api_client.go delete mode 100644 cli/cmd/auth.go delete mode 100644 cli/cmd/auth_login.go delete mode 100644 cli/cmd/config.go delete mode 100644 cli/cmd/help.go delete mode 100644 cli/cmd/job.go delete mode 100644 cli/cmd/job_cancel.go delete mode 100644 cli/cmd/job_cancel_test.go delete mode 100644 cli/cmd/job_list.go delete mode 100644 cli/cmd/job_list_test.go delete mode 100644 cli/cmd/job_logs.go delete mode 100644 cli/cmd/job_status.go delete mode 100644 cli/cmd/job_status_test.go delete mode 100644 cli/cmd/job_submit.go delete mode 100644 cli/cmd/job_submit_test.go delete mode 100644 cli/cmd/root.go delete mode 100644 cli/cmd/team.go delete mode 100644 cli/cmd/testutil_test.go delete mode 100644 cli/docs/setup.md delete mode 100644 cli/go.mod delete mode 100644 cli/go.sum delete mode 100644 cli/main.go delete mode 100644 deploy/k3s/Dockerfile.api delete mode 100644 deploy/k3s/README.md delete mode 100644 deploy/k3s/complete-results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/README.md delete mode 100644 deploy/k3s/evidence/department-2026-10-09/admission-results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/auth-audit.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/browser-results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/cleanup-validation.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/container-mode-completed.png delete mode 100644 deploy/k3s/evidence/department-2026-10-09/container-mode-form.png delete mode 100644 deploy/k3s/evidence/department-2026-10-09/container-mode-result.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/final-datasets-desktop.png delete mode 100644 deploy/k3s/evidence/department-2026-10-09/final-job-composer-mobile.png delete mode 100644 deploy/k3s/evidence/department-2026-10-09/final-job-composer.png delete mode 100644 deploy/k3s/evidence/department-2026-10-09/final-jobs-desktop.png delete mode 100644 deploy/k3s/evidence/department-2026-10-09/final-jobs-mobile.png delete mode 100644 deploy/k3s/evidence/department-2026-10-09/final-overview.png delete mode 100644 deploy/k3s/evidence/department-2026-10-09/large-dataset-job.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/large-dataset-results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/mist-1c4a852d366b9d2349e1cf7c.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/mist-28ba381f47c609714d91aafb.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/mist-8644eccafaf0b42c3d4add05.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/mist-aeba50ca436d70aa879381ce.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/mist-b46534ddeb9f18852b75f645.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/mist-e5c04ea2cc126a786d6fe783.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/nvidia-allocation.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/nvidia-results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/portal-firewall.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/release-validation.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/remote-cli-job.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/remote-cli-results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/remote-cli-status.txt delete mode 100644 deploy/k3s/evidence/department-2026-10-09/results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/runtime-results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/split-nvidia.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/split-storage-results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/split-tenstorrent.log delete mode 100644 deploy/k3s/evidence/department-2026-10-09/tenstorrent-allocation.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/tenstorrent-results.json delete mode 100644 deploy/k3s/evidence/department-2026-10-09/web-audit.json delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/README.md delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/browser-results.json delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/datasets-browser.png delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/deployed-api.json delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/host-storage.json delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/jobs-browser.png delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/nvidia.log delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/results.json delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/tenstorrent.log delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/validation.json delete mode 100644 deploy/k3s/evidence/storage-2026-10-21/workload-volumes.json delete mode 100644 deploy/k3s/examples/Dockerfile.training delete mode 100644 deploy/k3s/examples/dataset.csv delete mode 100644 deploy/k3s/examples/train.py delete mode 100644 deploy/k3s/examples/train_shared.py delete mode 100644 deploy/k3s/foundation-results.json delete mode 100644 deploy/k3s/gpu-smoke-job.yaml delete mode 100644 deploy/k3s/mist-api-forward.service delete mode 100644 deploy/k3s/mist-api-results.json delete mode 100644 deploy/k3s/mist-api.yaml delete mode 100644 deploy/k3s/mist-tenstorrent-claims.yaml delete mode 100644 deploy/k3s/mist-web.service delete mode 100644 deploy/k3s/nvidia-gpu-operator-values.yaml delete mode 100644 deploy/k3s/setup-runbook.md delete mode 100644 deploy/k3s/storage/README.md delete mode 100644 deploy/k3s/storage/mist-team-storage.service delete mode 100755 deploy/k3s/storage/setup-quietbox.sh delete mode 100644 deploy/k3s/storage/setup-storage-link.sh delete mode 100644 deploy/k3s/storage/shared.yaml delete mode 100644 deploy/k3s/storage/team_folders.py delete mode 100644 deploy/k3s/storage/test_folders.py delete mode 100644 deploy/k3s/submit_tenstorrent_smoke.py delete mode 100644 deploy/k3s/team-rbac.yaml delete mode 100644 deploy/k3s/team-workload-policy.yaml delete mode 100644 deploy/k3s/tenstorrent-allocation-results.json delete mode 100644 deploy/k3s/tenstorrent-operator-values.yaml delete mode 100644 deploy/k3s/tenstorrent-workload-policy.yaml delete mode 100644 deploy/k3s/training-nvidia-job.yaml delete mode 100644 deploy/k3s/training-smoke-results.json delete mode 100644 deploy/k3s/training-tenstorrent-job.yaml delete mode 100644 deploy/k3s/training_smoke.py delete mode 100644 deploy/k3s/verify_department.mjs delete mode 100644 deploy/k3s/verify_department_admission.py delete mode 100644 deploy/k3s/verify_department_browser.mjs delete mode 100644 deploy/k3s/verify_department_remote_cli.py delete mode 100644 deploy/k3s/verify_department_runtime.py delete mode 100644 deploy/k3s/verify_large_dataset.py delete mode 100644 deploy/k3s/verify_storage_folders.py delete mode 100644 deploy/k3s/verify_storage_folders_browser.mjs delete mode 100644 deploy/k3s/verify_tenstorrent_allocation.py delete mode 100644 deploy/private/README.md delete mode 100755 deploy/private/backup-auth.sh delete mode 100755 deploy/private/build-and-deploy.sh delete mode 100755 deploy/private/install-web.sh delete mode 100644 deploy/private/mist-portal-firewall.service delete mode 100644 deploy/private/nginx-mist-startup.conf delete mode 100644 deploy/private/nginx.conf delete mode 100644 deploy/private/portal-firewall.sh delete mode 100644 deploy/private/prepare-internal-secret.py delete mode 100644 deploy/private/verify-portal-firewall.sh delete mode 100644 docs/README.md delete mode 100644 docs/agents/simple-storage-execution.md delete mode 100644 docs/content/_index.md delete mode 100644 docs/content/architecture.md delete mode 100644 docs/content/archive/_index.md delete mode 100644 docs/content/archive/complete-foundation.md delete mode 100644 docs/content/archive/foundation-execution-plan.md delete mode 100644 docs/content/archive/k3s-deployment-history.md delete mode 100644 docs/content/archive/k3s-setup-history.md delete mode 100644 docs/content/archive/kubernetes-pilot.md delete mode 100644 docs/content/archive/local-job-foundation.md delete mode 100644 docs/content/archive/shared-storage-deployment-plan.md delete mode 100644 docs/content/complete-foundation.md delete mode 100644 docs/content/department-rollout-execution.md delete mode 100644 docs/content/department-rollout.md delete mode 100644 docs/content/design-system.md delete mode 100644 docs/content/development.md delete mode 100644 docs/content/foundation-execution-plan.md delete mode 100644 docs/content/frontend-architecture.md delete mode 100644 docs/content/k3s-setup.md delete mode 100644 docs/content/kubernetes-pilot.md delete mode 100644 docs/content/local-job-foundation.md delete mode 100644 docs/content/repository-cleanup.md delete mode 100644 docs/content/shared-storage-deployment-plan.md delete mode 100644 docs/content/storage.md delete mode 100644 docs/content/tailscale-ssh.md delete mode 100644 docs/content/testing.md delete mode 100644 docs/frontend-architecture.md delete mode 100644 docs/go.mod delete mode 100644 docs/go.sum delete mode 100644 docs/hugo.yaml delete mode 100644 go.work delete mode 100644 go.work.sum delete mode 100644 pre_compute_platform.md delete mode 100644 scripts/configure-fake-backend.mjs delete mode 100755 scripts/dev.sh delete mode 100644 scripts/fake-backend-scenarios.mjs delete mode 100644 scripts/fake-backend.mjs delete mode 100644 src/app.go delete mode 100644 src/app_test.go delete mode 100644 src/auth.go delete mode 100644 src/auth_test.go delete mode 100644 src/go.mod delete mode 100644 src/go.sum delete mode 100644 src/hardware.go delete mode 100644 src/hardware_test.go delete mode 100644 src/http.go delete mode 100644 src/images.go delete mode 100644 src/images_test.go delete mode 100644 src/job_states.go delete mode 100644 src/job_types.go delete mode 100644 src/jobs.md delete mode 100644 src/jobs_http.go delete mode 100644 src/kubernetes.go delete mode 100644 src/kubernetes_test.go delete mode 100644 src/main.go delete mode 100644 src/member_auth.go delete mode 100644 src/outputs.go delete mode 100644 src/shared_storage.go delete mode 100644 src/shared_storage_test.go delete mode 100644 src/storage_status.go delete mode 100644 src/team_queue.go delete mode 100644 src/team_runtime.go delete mode 100644 src/team_storage.go delete mode 100644 src/teams.go delete mode 100644 src/teams_test.go delete mode 100644 web-interface/.cta.json delete mode 100644 web-interface/.gitignore delete mode 100644 web-interface/.prettierignore delete mode 100644 web-interface/.vscode/settings.json delete mode 100644 web-interface/README.md delete mode 100644 web-interface/eslint.config.js delete mode 100644 web-interface/index.html delete mode 100644 web-interface/package-lock.json delete mode 100644 web-interface/package.json delete mode 100644 web-interface/pnpm-lock.yaml delete mode 100644 web-interface/prettier.config.js delete mode 100644 web-interface/public/favicon.ico delete mode 100644 web-interface/public/favicon.svg delete mode 100644 web-interface/public/fonts/OFL.txt delete mode 100644 web-interface/public/fonts/manrope-latin.woff2 delete mode 100644 web-interface/public/logo192.png delete mode 100644 web-interface/public/logo512.png delete mode 100644 web-interface/public/manifest.json delete mode 100644 web-interface/public/robots.txt delete mode 100755 web-interface/public/sample-avatar.png delete mode 100644 web-interface/src/api.ts delete mode 100644 web-interface/src/auth.tsx delete mode 100644 web-interface/src/components/AccountPage.tsx delete mode 100644 web-interface/src/components/BackendConnectionError.test.tsx delete mode 100644 web-interface/src/components/BackendConnectionError.tsx delete mode 100644 web-interface/src/components/Buttons.tsx delete mode 100644 web-interface/src/components/Card.tsx delete mode 100644 web-interface/src/components/Controls.test.tsx delete mode 100644 web-interface/src/components/DatasetsPage.test.tsx delete mode 100644 web-interface/src/components/DatasetsPage.tsx delete mode 100644 web-interface/src/components/HardwarePanel.tsx delete mode 100644 web-interface/src/components/JobsPage.test.tsx delete mode 100644 web-interface/src/components/JobsPage.tsx delete mode 100644 web-interface/src/components/MachinesPage.tsx delete mode 100644 web-interface/src/components/Modal.tsx delete mode 100644 web-interface/src/components/Navbar.tsx delete mode 100644 web-interface/src/components/Picker.tsx delete mode 100644 web-interface/src/components/Tabs.tsx delete mode 100644 web-interface/src/components/TeamStorageBrowser.tsx delete mode 100644 web-interface/src/components/TeamsPage.tsx delete mode 100644 web-interface/src/components/jobs/JobCard.tsx delete mode 100644 web-interface/src/components/jobs/JobFiles.tsx delete mode 100644 web-interface/src/components/jobs/JobLogs.tsx delete mode 100644 web-interface/src/components/jobs/JobSubmissionForm.tsx delete mode 100644 web-interface/src/format.ts delete mode 100644 web-interface/src/hooks/usePolling.ts delete mode 100644 web-interface/src/main.tsx delete mode 100644 web-interface/src/routeTree.gen.ts delete mode 100644 web-interface/src/router.tsx delete mode 100644 web-interface/src/routes/__root.tsx delete mode 100644 web-interface/src/routes/dashboard.tsx delete mode 100644 web-interface/src/routes/datasets.tsx delete mode 100644 web-interface/src/routes/index.tsx delete mode 100644 web-interface/src/routes/jobs.tsx delete mode 100644 web-interface/src/routes/machines.tsx delete mode 100644 web-interface/src/routes/profile.tsx delete mode 100644 web-interface/src/routes/teams.tsx delete mode 100644 web-interface/src/styles.css delete mode 100644 web-interface/src/teams.tsx delete mode 100644 web-interface/tsconfig.json delete mode 100644 web-interface/vite.config.ts diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index c81d217..0000000 --- a/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -.git -web-interface/node_modules -web-interface/dist -logs -**/__pycache__ diff --git a/.gitignore b/.gitignore index 6bd8076..1f994cc 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ node_modules/ data/ /logs/ .direnv/ -.fake-backend-config.json *.local # Python caches diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 32a1f7e..1904798 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -13,8 +13,10 @@ honour. The reasons behind major choices are in the [decision log](docs/agents/architecture/decisions.md). > **Status:** target design, revised 27 October 2026 after architecture review. This design replaces the -> platform described in `docs/content/` (container-image jobs, dataset and -> result pools, team namespaces). It starts fresh: no users or data are migrated. +> previous container-image platform (dataset and result pools, team +> namespaces), which was never deployed and has been removed from the tree; it +> remains in Git history before this change. It starts fresh: no users or data +> are migrated. ## Goals @@ -380,8 +382,9 @@ deploy/ k3s manifests, systemd units, host setup web-interface/ portal ``` -The existing `src/` and `cli/` modules belong to the platform being replaced. -They are removed once the new path serves jobs. +The previous platform's `src/`, `cli/`, `deploy/` and `web-interface/` were +removed on 27 October 2026; the portal is rebuilt in `web-interface/` against +the new API. ## Milestones diff --git a/README.md b/README.md index c658ef7..62a5b02 100644 --- a/README.md +++ b/README.md @@ -1,105 +1,43 @@ # Mist -UTMIST's research compute platform. Submit Python scripts or tagged container -images, choose CPU, NVIDIA GPUs or Tenstorrent boards, upload datasets, and -collect persistent results through the same website or CLI. +UTMIST's research compute platform. Mist works like the batch systems on +national HPC clusters: each researcher gets a folder inside their team folders, +logs in over SSH, moves files with `scp`/`rsync`, and runs batch or interactive +jobs that a scheduler places on NVIDIA GPU, CPU and Tenstorrent hardware. -**Private website:** [http://100.73.139.66:8088](http://100.73.139.66:8088), accessible through authorized -Tailscale connectivity. A Mist account and team membership are also required. +## Status -## Architecture redesign — October 26 +Under redesign (October 2026). The previous container-image platform was never +deployed and has been removed from the tree; see Git history before 27 October +2026 if you need it. The new implementation starts from the design docs. -Mist is moving to an HPC-style design: per-team folders, restricted SSH login, -and jobs that run as the researcher's own Linux user under Mist's own scheduler. -Jobs no longer need images or mounts. Start with [ARCHITECTURE.md](ARCHITECTURE.md); -component contracts and the decision log are in -[docs/agents/architecture/](docs/agents/architecture/decisions.md). The -sections below and `docs/content/` describe the platform being replaced. +## Design -## Storage update — October 21 - -New submissions use ordinary team dataset/result folders on QuietBox, accessed -through the direct Ethernet link. Storage allowances are advisory; team access -is enforced. See [current storage operations](deploy/k3s/storage/README.md) for -layout, setup, API semantics, verification and rollback. The earlier operating -snapshots describe the retired image-backed layout. - -## Current installation +- [ARCHITECTURE.md](ARCHITECTURE.md): system overview, components, owners, + milestones and code layout. +- [docs/agents/architecture/](docs/agents/architecture/decisions.md): per-component + contracts and the decision log. +- [docs/agents/plans/](docs/agents/plans/jobs-and-scheduling.md): implementation + plans per owner. +## Cluster | Machine | Role | LAN address | Tailscale address | | ---------------- | --------------------------------------------------------- | ------------ | ----------------- | -| `utmist-z1opa08` | k3s server, API/auth, website, CPU and two RTX A4000 GPUs | `10.0.0.175` | `100.73.139.66` | -| `utmist-tt` | k3s worker, four n300 boards/eight chips, shared storage | `10.0.0.112` | `100.95.175.37` | - - -The cluster and NFS use the existing LAN. Tailscale provides private portal and -administrator SSH access. Kubernetes/containerd run workload containers. - -## Documentation - -Start with the [documentation index](docs/README.md). +| `utmist-z1opa08` | Two RTX A4000 GPUs, CPU | `10.0.0.175` | `100.73.139.66` | +| `utmist-tt` | Four n300 Tenstorrent boards (eight chips), shared storage | `10.0.0.112` | `100.95.175.37` | -- [Using the portal, teams and jobs](docs/content/department-rollout.md) -- [k3s setup, accelerator allocation and diagnostics](docs/content/k3s-setup.md) -- [Tailscale and SSH setup](docs/content/tailscale-ssh.md) -- [Architecture and code organization](docs/content/architecture.md) -- [Storage and upload limits](docs/content/storage.md) -- [Deployment and operations](deploy/private/README.md) -- [Developer setup](docs/content/development.md), [CLI](cli/docs/setup.md), [testing](docs/content/testing.md) +## Development -Main contains the department release merged through -[PR #110](https://github.com/UTMIST/Mist/pull/110). The earlier main and operating -snapshots are preserved in the [historical archive](docs/content/archive/_index.md). - -## Development and checks - -Use Go **1.25.1** and Node.js **22.16.0 or newer**. The Go workspace contains the -API (`src`) and CLI (`cli`). From the repository root: +A Nix dev shell (`flake.nix`, `shell.nix`) provides Go, Node.js, Python, k3s and +kubectl. Check documentation links with: ```bash -go test ./src/... ./cli/... -npm --prefix web-interface ci -npm --prefix web-interface test -npm --prefix web-interface run lint -npm --prefix web-interface run build +python3 scripts/check-docs.py ``` -For a local UI against the authenticated deployed API, follow -[developer setup](docs/content/development.md). For the existing installation, deploy with -`bash deploy/private/build-and-deploy.sh`; read its [prerequisites](deploy/private/README.md) -before running it. Fresh-host provisioning is covered separately by the k3s guide. - -The current API uses Kubernetes only. The unfinished Redis/Docker supervisor, -fake frontend account/chart and dummy CLI configuration have been retired. -Docker remains build tooling for images; it does not schedule Mist jobs. - -Custom accelerator images need compatible training libraries. Credits, Jupyter, -chaining, browser image archives/builds, private pull-credential management and -distributed multi-machine training are outside this release. Automatic backups, -HTTPS and monitoring/cleanup products were explicitly excluded. This is a private -HTTP installation with one control plane, one auth instance and one storage host. - ### Documentation Humans are responsible for editing the human facing docs. This is because the human facing docs will be read by humans, and it is rude to give them untested instructions to follow. Documentation should include explanations of design decisions for later platform maintainers. - -## Frontend Testing - -how to use fake backend for testing frontend. - -(temporary, functionality, to be removed in future commit.) - -```bash -# Terminal 1 -npm --prefix web-interface run dev -- --host 127.0.0.1 --port 3001 --strictPort - -# Terminal 2 -npm --prefix web-interface run fake-backend -``` - - - -  \ No newline at end of file diff --git a/cli/cmd/api_client.go b/cli/cmd/api_client.go deleted file mode 100644 index 555490f..0000000 --- a/cli/cmd/api_client.go +++ /dev/null @@ -1,83 +0,0 @@ -package cmd - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - "time" -) - -func (ctx *AppContext) api(method, path string, body, out interface{}) error { - if ctx == nil { - return fmt.Errorf("missing application context") - } - base := ctx.baseURL() - var data []byte - var err error - if body != nil { - data, err = json.Marshal(body) - if err != nil { - return err - } - } - req, err := http.NewRequest(method, strings.TrimRight(base, "/")+path, bytes.NewReader(data)) - if err != nil { - return err - } - req.Header.Set("Content-Type", "application/json") - if team := ctx.teamID(); team != "" { - req.Header.Set("X-Mist-Team", team) - } - if ctx.Config != nil && ctx.Config.SessionCookie != "" { - req.Header.Set("Cookie", ctx.Config.SessionCookie) - } - client := ctx.HTTPClient - if client == nil { - client = &http.Client{Timeout: 30 * time.Second} - } - response, err := client.Do(req) - if err != nil { - return err - } - defer response.Body.Close() - if response.StatusCode < 200 || response.StatusCode >= 300 { - data, _ := io.ReadAll(io.LimitReader(response.Body, 8192)) - var errorBody struct { - Error string `json:"error"` - } - if json.Unmarshal(data, &errorBody) == nil && errorBody.Error != "" { - return fmt.Errorf("API %d: %s", response.StatusCode, errorBody.Error) - } - return fmt.Errorf("API %d: %s", response.StatusCode, strings.TrimSpace(string(data))) - } - if out != nil { - return json.NewDecoder(response.Body).Decode(out) - } - return nil -} - -func (ctx *AppContext) baseURL() string { - if ctx.APIBaseURL != "" { - return strings.TrimRight(ctx.APIBaseURL, "/") - } - if ctx.Config != nil && ctx.Config.APIBaseURL != "" { - return strings.TrimRight(ctx.Config.APIBaseURL, "/") - } - return "http://127.0.0.1:3000" -} - -func (ctx *AppContext) teamID() string { - if ctx.TeamID == "legacy" { - return "" - } - if ctx.TeamID != "" { - return ctx.TeamID - } - if ctx.Config != nil { - return ctx.Config.TeamID - } - return "" -} diff --git a/cli/cmd/auth.go b/cli/cmd/auth.go deleted file mode 100644 index 9da9f38..0000000 --- a/cli/cmd/auth.go +++ /dev/null @@ -1,13 +0,0 @@ -package cmd - -type AuthCmd struct { - Login LoginCmd `cmd:"" help:"Log in to your account"` - Logout LogoutCmd `cmd:"" help:"Sign out and revoke your session"` - // Status AuthStatusCmd `cmd:"" help:"Check your authentication status" default:1` -} - -func (a *AuthCmd) Run() error { - // Possible fallback if no subcommand is provided - // fmt.Println("(auth root) – try 'mist auth login|logout|status' or mist help") - return nil -} diff --git a/cli/cmd/auth_login.go b/cli/cmd/auth_login.go deleted file mode 100644 index 8fff8d0..0000000 --- a/cli/cmd/auth_login.go +++ /dev/null @@ -1,148 +0,0 @@ -package cmd - -import ( - "bytes" - "encoding/json" - "fmt" - "golang.org/x/term" - "io" - "net/http" - "net/url" - "os" - "path/filepath" - "strings" -) - -type LoginCmd struct { - Email string `help:"Mist member email" required:""` - PasswordStdin bool `help:"Read password from standard input (for automation)"` -} - -func (l *LoginCmd) Run(ctx *AppContext) error { - var password string - if l.PasswordStdin { - data, err := io.ReadAll(io.LimitReader(os.Stdin, 130)) - if err != nil { - return err - } - password = strings.TrimSpace(string(data)) - } else { - fmt.Print("Password: ") - data, err := term.ReadPassword(int(os.Stdin.Fd())) - fmt.Println() - if err != nil { - return fmt.Errorf("password input: %w (use --password-stdin for automation)", err) - } - password = string(data) - } - base := ctx.baseURL() - u, err := url.Parse(base) - if err != nil { - return err - } - u.Path = "/auth/sign-in/email" - u.RawQuery = "" - body, _ := json.Marshal(map[string]string{"email": l.Email, "password": password}) - req, err := http.NewRequest(http.MethodPost, u.String(), bytes.NewReader(body)) - if err != nil { - return err - } - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Origin", u.Scheme+"://"+u.Host) - response, err := ctx.HTTPClient.Do(req) - if err != nil { - return err - } - defer response.Body.Close() - if response.StatusCode != 200 { - return fmt.Errorf("login failed (HTTP %d)", response.StatusCode) - } - cookies := []string{} - for _, cookie := range response.Cookies() { - if strings.Contains(cookie.Name, "session_token") && cookie.Value != "" { - cookies = append(cookies, cookie.Name+"="+cookie.Value) - } - } - if len(cookies) == 0 { - return fmt.Errorf("login returned no session cookie") - } - if ctx.Config == nil { - ctx.Config = &Config{} - } - ctx.Config.SessionCookie = strings.Join(cookies, "; ") - ctx.Config.AccessToken = "" - ctx.Config.APIBaseURL = base - if err := ctx.saveConfig(); err != nil { - return err - } - fmt.Println("Signed in. Session saved in protected CLI configuration.") - return nil -} -func (ctx *AppContext) saveConfig() error { - path := ctx.ConfigPath - if path == "" { - path = defaultConfigPath() - } - if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil { - return err - } - data, err := json.MarshalIndent(ctx.Config, "", " ") - if err != nil { - return err - } - file, err := os.CreateTemp(filepath.Dir(path), ".mist-config-") - if err != nil { - return err - } - defer os.Remove(file.Name()) - if err = file.Chmod(0600); err != nil { - file.Close() - return err - } - if _, err = file.Write(data); err != nil { - file.Close() - return err - } - if err = file.Close(); err != nil { - return err - } - return os.Rename(file.Name(), path) -} - -type LogoutCmd struct{} - -func (l *LogoutCmd) Run(ctx *AppContext) error { - if ctx.Config == nil || ctx.Config.SessionCookie == "" { - fmt.Println("Not signed in.") - return nil - } - base, err := url.Parse(ctx.baseURL()) - if err != nil { - return err - } - origin := base.Scheme + "://" + base.Host - base.Path = "/auth/sign-out" - base.RawQuery = "" - req, err := http.NewRequest(http.MethodPost, base.String(), strings.NewReader("{}")) - if err != nil { - return err - } - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Origin", origin) - req.Header.Set("Cookie", ctx.Config.SessionCookie) - response, err := ctx.HTTPClient.Do(req) - if err != nil { - return err - } - response.Body.Close() - if response.StatusCode != 200 { - return fmt.Errorf("sign out failed (HTTP %d)", response.StatusCode) - } - ctx.Config.SessionCookie = "" - ctx.Config.AccessToken = "" - if err := ctx.saveConfig(); err != nil { - return err - } - fmt.Println("Signed out.") - return nil -} diff --git a/cli/cmd/config.go b/cli/cmd/config.go deleted file mode 100644 index 3ece81d..0000000 --- a/cli/cmd/config.go +++ /dev/null @@ -1,15 +0,0 @@ -package cmd - -import ( - "os" - "path/filepath" -) - -func defaultConfigPath() string { - dir, err := os.UserConfigDir() - if err != nil { - home, _ := os.UserHomeDir() - return filepath.Join(home, ".config", "mist", "config.json") - } - return filepath.Join(dir, "mist", "config.json") -} diff --git a/cli/cmd/help.go b/cli/cmd/help.go deleted file mode 100644 index cf571e2..0000000 --- a/cli/cmd/help.go +++ /dev/null @@ -1,16 +0,0 @@ -package cmd - -import "fmt" - -type HelpCmd struct{} - -func (h *HelpCmd) Run() error { - fmt.Println("MIST CLI Help") - fmt.Println("Usage: mist [command] [options]") - fmt.Println("Commands:") - fmt.Println(" auth Authentication commands") - fmt.Println(" job Job management commands") - fmt.Println(" config Configuration commands") - fmt.Println(" help Show help information") - return nil -} diff --git a/cli/cmd/job.go b/cli/cmd/job.go deleted file mode 100644 index e5d7faf..0000000 --- a/cli/cmd/job.go +++ /dev/null @@ -1,9 +0,0 @@ -package cmd - -type JobCmd struct { - Submit JobSubmitCmd `cmd:"" help:"Submit a new job"` - Cancel JobCancelCmd `cmd:"" help:"Cancel an existing job"` - Status JobStatusCmd `cmd:"" help:"Check the status of a job"` - Logs JobLogsCmd `cmd:"" help:"Read workload logs"` - List ListCmd `cmd:"" help:"List jobs"` -} diff --git a/cli/cmd/job_cancel.go b/cli/cmd/job_cancel.go deleted file mode 100644 index 0cd7072..0000000 --- a/cli/cmd/job_cancel.go +++ /dev/null @@ -1,19 +0,0 @@ -package cmd - -import ( - "fmt" - "net/url" -) - -type JobCancelCmd struct { - ID string `arg:"" help:"Job ID to cancel"` -} - -func (j *JobCancelCmd) Run(ctx *AppContext) error { - var job Job - if err := ctx.api("POST", "/jobs/"+url.PathEscape(j.ID)+"/cancel", nil, &job); err != nil { - return err - } - fmt.Printf("Job %s: %s\n", job.ID, job.Status) - return nil -} diff --git a/cli/cmd/job_cancel_test.go b/cli/cmd/job_cancel_test.go deleted file mode 100644 index 79da1e2..0000000 --- a/cli/cmd/job_cancel_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package cmd - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -func TestJobCancelCallsAPIWithoutConfirmation(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" || r.URL.Path != "/jobs/cancel-id/cancel" { - t.Errorf("wrong request: %s %s", r.Method, r.URL.Path) - } - _, _ = w.Write([]byte(`{"id":"cancel-id","job_state":"Cancelled"}`)) - })) - defer server.Close() - out := CaptureOutput(func() { - if err := (&JobCancelCmd{ID: "cancel-id"}).Run(&AppContext{APIBaseURL: server.URL}); err != nil { - t.Error(err) - } - }) - if !contains(out, "Cancelled") || contains(out, "Are you sure") { - t.Fatal(out) - } -} diff --git a/cli/cmd/job_list.go b/cli/cmd/job_list.go deleted file mode 100644 index 0dfec2d..0000000 --- a/cli/cmd/job_list.go +++ /dev/null @@ -1,49 +0,0 @@ -package cmd - -import ( - "fmt" - "os" - "text/tabwriter" - "time" -) - -type ListCmd struct { - All bool `help:"Include completed, failed, and cancelled jobs" short:"a"` -} -type Job struct { - ID string `json:"id"` - Name string `json:"name"` - Status string `json:"job_state"` - GPUType string `json:"accelerator"` - CreatedAt time.Time `json:"created"` - Node string `json:"node"` - DeviceCount int `json:"device_count"` - ExitCode *int `json:"exit_code"` - Message string `json:"message"` -} - -func printJobs(jobs []Job) { - w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) - fmt.Fprintln(w, "Job ID\tName\tStatus\tCompute\tDevices\tNode\tCreated") - for _, job := range jobs { - fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d\t%s\t%s\n", job.ID, job.Name, job.Status, job.GPUType, job.DeviceCount, job.Node, job.CreatedAt.Format(time.RFC3339)) - } - _ = w.Flush() -} - -func (l *ListCmd) Run(ctx *AppContext) error { - var response struct { - Jobs []Job `json:"jobs"` - } - if err := ctx.api("GET", "/jobs", nil, &response); err != nil { - return err - } - jobs := []Job{} - for _, job := range response.Jobs { - if l.All || job.Status == "Scheduled" || job.Status == "InProgress" { - jobs = append(jobs, job) - } - } - printJobs(jobs) - return nil -} diff --git a/cli/cmd/job_list_test.go b/cli/cmd/job_list_test.go deleted file mode 100644 index 070ce98..0000000 --- a/cli/cmd/job_list_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package cmd - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -func TestJobListFiltersCompleted(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - _, _ = w.Write([]byte(`{"jobs":[{"id":"running-id","name":"work","job_state":"InProgress","accelerator":"nvidia"},{"id":"done-id","name":"old","job_state":"Success","accelerator":"cpu"}]}`)) - })) - defer server.Close() - ctx := &AppContext{APIBaseURL: server.URL} - out := CaptureOutput(func() { - if err := (&ListCmd{}).Run(ctx); err != nil { - t.Error(err) - } - }) - if !contains(out, "running-id") || contains(out, "done-id") { - t.Fatal(out) - } - out = CaptureOutput(func() { - if err := (&ListCmd{All: true}).Run(ctx); err != nil { - t.Error(err) - } - }) - if !contains(out, "done-id") { - t.Fatal(out) - } -} diff --git a/cli/cmd/job_logs.go b/cli/cmd/job_logs.go deleted file mode 100644 index b183510..0000000 --- a/cli/cmd/job_logs.go +++ /dev/null @@ -1,21 +0,0 @@ -package cmd - -import ( - "fmt" - "net/url" -) - -type JobLogsCmd struct { - ID string `arg:"" help:"Job ID"` -} - -func (j *JobLogsCmd) Run(ctx *AppContext) error { - var response struct { - Logs string `json:"logs"` - } - if err := ctx.api("GET", "/jobs/"+url.PathEscape(j.ID)+"/logs", nil, &response); err != nil { - return err - } - fmt.Print(response.Logs) - return nil -} diff --git a/cli/cmd/job_status.go b/cli/cmd/job_status.go deleted file mode 100644 index 9d15a01..0000000 --- a/cli/cmd/job_status.go +++ /dev/null @@ -1,25 +0,0 @@ -package cmd - -import ( - "fmt" - "net/url" -) - -type JobStatusCmd struct { - ID string `arg:"" help:"Job ID"` -} - -func (j *JobStatusCmd) Run(ctx *AppContext) error { - var job Job - if err := ctx.api("GET", "/jobs/"+url.PathEscape(j.ID), nil, &job); err != nil { - return err - } - printJobs([]Job{job}) - if job.ExitCode != nil { - fmt.Println("Exit code:", *job.ExitCode) - } - if job.Message != "" { - fmt.Println(job.Message) - } - return nil -} diff --git a/cli/cmd/job_status_test.go b/cli/cmd/job_status_test.go deleted file mode 100644 index 09e1f1d..0000000 --- a/cli/cmd/job_status_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package cmd - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -func TestJobStatusPropagatesFailureAndExitCode(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - _, _ = w.Write([]byte(`{"id":"failed-id","name":"failed","job_state":"Failure","exit_code":17}`)) - })) - defer server.Close() - out := CaptureOutput(func() { - if err := (&JobStatusCmd{ID: "failed-id"}).Run(&AppContext{APIBaseURL: server.URL}); err != nil { - t.Error(err) - } - }) - if !contains(out, "Failure") || !contains(out, "Exit code: 17") { - t.Fatal(out) - } -} -func TestJobStatusDoesNotInventSuccessForMissingJob(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(404) - _, _ = w.Write([]byte(`{"error":"job not found"}`)) - })) - defer server.Close() - if err := (&JobStatusCmd{ID: "missing"}).Run(&AppContext{APIBaseURL: server.URL}); err == nil || !contains(err.Error(), "job not found") { - t.Fatal(err) - } -} diff --git a/cli/cmd/job_submit.go b/cli/cmd/job_submit.go deleted file mode 100644 index a54945a..0000000 --- a/cli/cmd/job_submit.go +++ /dev/null @@ -1,63 +0,0 @@ -package cmd - -import ( - "fmt" - "os" - "path/filepath" - "strings" -) - -type JobSubmitCmd struct { - Scope string `help:"Save outputs in common or your member folder (default: own folder)"` - TTRuntime string `help:"Tenstorrent runtime: host or container"` - Script string `arg:"" help:"Path to a Python or shell script"` - Compute string `help:"CPU, NVIDIA, or TT" default:"CPU"` - Devices int `help:"NVIDIA GPU count or Tenstorrent board count" default:"1"` - Dataset string `help:"Owned ready dataset ID to mount at /inputs (optional)"` - Image string `help:"Tagged image from an allowed registry (optional; defaults by compute type)"` - CPU string `help:"Requested CPU quantity, e.g. 2 or 500m"` - Memory string `help:"Requested memory, e.g. 4Gi"` - Timeout int64 `help:"Maximum execution time in seconds" default:"600"` - Name string `help:"Display name for the job"` -} - -func (j *JobSubmitCmd) Run(ctx *AppContext) error { - compute := strings.ToUpper(j.Compute) - if compute == "" { - compute = "CPU" - } - accelerator := "cpu" - devices := j.Devices - if devices == 0 { - devices = 1 - } - switch compute { - case "CPU": - devices = 0 - case "NVIDIA", "CUDA": - accelerator = "nvidia" - case "TT", "TENSTORRENT": - accelerator = "tenstorrent" - default: - return fmt.Errorf("compute must be CPU, NVIDIA, or TT") - } - data, err := os.ReadFile(j.Script) - if err != nil { - return err - } - name := j.Name - if name == "" { - name = filepath.Base(j.Script) - } - request := map[string]interface{}{"type": "command", "name": name, "accelerator": accelerator, - "storage_scope": j.Scope, "tt_runtime": j.TTRuntime, "device_count": devices, "script": string(data), "script_name": filepath.Base(j.Script), - "dataset_id": j.Dataset, "image": j.Image, "cpu": j.CPU, "memory": j.Memory, "timeout_seconds": j.Timeout} - var response struct { - JobID string `json:"job_id"` - } - if err := ctx.api("POST", "/jobs", request, &response); err != nil { - return err - } - fmt.Println("Job submitted:", response.JobID) - return nil -} diff --git a/cli/cmd/job_submit_test.go b/cli/cmd/job_submit_test.go deleted file mode 100644 index 0432adf..0000000 --- a/cli/cmd/job_submit_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package cmd - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "os" - "path/filepath" - "testing" -) - -func TestJobSubmitUsesRealAPI(t *testing.T) { - script := filepath.Join(t.TempDir(), "train.py") - _ = os.WriteFile(script, []byte("print('train')"), 0600) - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" || r.URL.Path != "/jobs" { - t.Errorf("wrong request: %s %s", r.Method, r.URL.Path) - } - if r.Header.Get("X-Mist-Team") != "team-selected" { - t.Errorf("missing selected workspace header") - } - var body map[string]interface{} - _ = json.NewDecoder(r.Body).Decode(&body) - if body["accelerator"] != "tenstorrent" || body["device_count"] != float64(2) || body["script"] != "print('train')" { - t.Errorf("wrong submission: %+v", body) - } - w.WriteHeader(201) - _, _ = w.Write([]byte(`{"job_id":"real-id"}`)) - })) - defer server.Close() - var err error - output := CaptureOutput(func() { - err = (&JobSubmitCmd{Script: script, Compute: "TT", Devices: 2}).Run(&AppContext{APIBaseURL: server.URL, Config: &Config{TeamID: "team-selected"}}) - }) - if err != nil || !contains(output, "real-id") || contains(output, "Are you sure") { - t.Fatalf("%v: %s", err, output) - } -} -func TestJobSubmitRejectsMissingFile(t *testing.T) { - if err := (&JobSubmitCmd{Script: "/does-not-exist.py", Compute: "CPU"}).Run(&AppContext{}); err == nil { - t.Fatal("missing file accepted") - } -} diff --git a/cli/cmd/root.go b/cli/cmd/root.go deleted file mode 100644 index 23a532d..0000000 --- a/cli/cmd/root.go +++ /dev/null @@ -1,84 +0,0 @@ -package cmd - -import ( - "encoding/json" - "net/http" - "os" - "time" - - "github.com/alecthomas/kong" -) - -type Config struct { - AccessToken string `json:"access_token,omitempty"` - SessionCookie string `json:"session_cookie,omitempty"` - APIBaseURL string `json:"api_base_url,omitempty"` - TeamID string `json:"team_id,omitempty"` -} - -type AppContext struct { - Config *Config - HTTPClient *http.Client - APIBaseURL string - ConfigPath string - TeamID string -} - -type Globals struct { - Workspace string `name:"team" env:"MIST_TEAM" help:"Team workspace ID, or legacy (overrides saved workspace)"` - ConfigPath string `name:"config" help:"Path to config file" default:"${config_path}"` - APIURL string `name:"api-url" env:"MIST_API_URL" help:"Mist API URL (default http://127.0.0.1:3000)"` -} - -type CLI struct { - Globals - - Team TeamCmd `cmd:"" help:"List and select team workspaces"` - Auth AuthCmd `cmd:"" help:"Authentication commands"` - Job JobCmd `cmd:"" help:"Job management commands"` - Help HelpCmd `cmd:"" help:"Show help information"` -} - -func loadConfig(path string) (*Config, error) { - b, err := os.ReadFile(path) - if err != nil { - return nil, err - } - - var cfg Config - if err := json.Unmarshal(b, &cfg); err != nil { - return nil, err - } - - return &cfg, nil -} - -func Main() { - var cli CLI - // Read command-line arguments - - appCtx := &AppContext{ - HTTPClient: &http.Client{Timeout: 10 * time.Second}, - } - - kctx := kong.Parse(&cli, - kong.Name("mist"), - kong.Description("MIST CLI - Manage your MIST jobs and configurations"), - kong.UsageOnError(), - kong.Vars{"config_path": defaultConfigPath()}, - kong.Bind(appCtx), - ) - - if cfg, err := loadConfig(cli.ConfigPath); err == nil { - appCtx.Config = cfg - } else if !os.IsNotExist(err) { - // config file is present but broken - kctx.FatalIfErrorf(err) - } - - appCtx.APIBaseURL = cli.APIURL - appCtx.TeamID = cli.Globals.Workspace - appCtx.ConfigPath = cli.ConfigPath - err := kctx.Run() - kctx.FatalIfErrorf(err) -} diff --git a/cli/cmd/team.go b/cli/cmd/team.go deleted file mode 100644 index 936d12f..0000000 --- a/cli/cmd/team.go +++ /dev/null @@ -1,84 +0,0 @@ -package cmd - -import "fmt" - -type TeamCmd struct { - List TeamListCmd `cmd:"" help:"List your available team workspaces"` - Use TeamUseCmd `cmd:"" help:"Save a team workspace selection; use legacy for historical account jobs"` -} -type TeamListCmd struct{} -type TeamUseCmd struct { - ID string `arg:"" help:"Team ID, or legacy"` -} -type teamSummary struct { - ID string `json:"id"` - Name string `json:"name"` - Disabled bool `json:"disabled"` - Members []struct { - ID string `json:"id"` - } `json:"members"` -} - -func (j *TeamListCmd) Run(ctx *AppContext) error { - var response struct { - Teams []teamSummary `json:"teams"` - } - if err := ctx.api("GET", "/teams", nil, &response); err != nil { - return err - } - fmt.Printf("%-24s %-28s %s\n", "TEAM ID", "NAME", "STATE") - for _, t := range response.Teams { - state := "Active" - if t.Disabled { - state = "Disabled" - } - if ctx.teamID() == t.ID { - state += " · Selected" - } - fmt.Printf("%-24s %-28s %s\n", t.ID, t.Name, state) - } - return nil -} -func (j *TeamUseCmd) Run(ctx *AppContext) error { - if j.ID != "legacy" { - var response struct { - Teams []teamSummary `json:"teams"` - } - if err := ctx.api("GET", "/teams", nil, &response); err != nil { - return err - } - var session struct { - User *struct { - ID string `json:"id"` - } `json:"user"` - } - if err := ctx.api("GET", "/session", nil, &session); err != nil { - return err - } - found := false - for _, t := range response.Teams { - if t.ID == j.ID && !t.Disabled && session.User != nil { - for _, m := range t.Members { - if m.ID == session.User.ID { - found = true - } - } - } - } - if !found { - return fmt.Errorf("select an active team you belong to; run team list") - } - } - if ctx.Config == nil { - ctx.Config = &Config{} - } - ctx.Config.TeamID = j.ID - if j.ID == "legacy" { - ctx.Config.TeamID = "" - } - if err := ctx.saveConfig(); err != nil { - return err - } - fmt.Println("Workspace selected:", j.ID) - return nil -} diff --git a/cli/cmd/testutil_test.go b/cli/cmd/testutil_test.go deleted file mode 100644 index 6f60274..0000000 --- a/cli/cmd/testutil_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package cmd - -import ( - "bytes" - "io" - "os" -) - -func CaptureOutput(f func()) string { - old := os.Stdout - r, w, _ := os.Pipe() - os.Stdout = w - f() - w.Close() - os.Stdout = old - var buf bytes.Buffer - io.Copy(&buf, r) - r.Close() - return buf.String() -} - -func contains(s, substr string) bool { - return bytes.Contains([]byte(s), []byte(substr)) -} diff --git a/cli/docs/setup.md b/cli/docs/setup.md deleted file mode 100644 index 789a050..0000000 --- a/cli/docs/setup.md +++ /dev/null @@ -1,68 +0,0 @@ -# Mist CLI - -Requires Go 1.25.1. Build from the repository root: - -```bash -go -C cli build -o ../bin/mist-cli . -bin/mist-cli --help -``` - -The default API URL is `http://127.0.0.1:3000`. Override it using -`MIST_API_URL`, `--api-url`, or the configuration's `api_base_url` field. -The production endpoint is `http://100.73.139.66:8088/api`. Use it from a -Tailnet device or either SSH host, then authenticate: - -```bash -export MIST_API_URL=http://100.73.139.66:8088/api -bin/mist-cli auth login --email your-member-email@example.org -``` - -The password prompt does not echo. Automation can use `--password-stdin`. -The CLI saves a real session cookie in a mode-0600 config; `--config` selects -an alternate file. Logout with `bin/mist-cli auth logout` revokes the session. - -Select your team before submitting new work: - -```bash -bin/mist-cli team list -read -r -p "Paste your team ID from the list: " TEAM_ID -bin/mist-cli team use "$TEAM_ID" -bin/mist-cli job submit /path/to/train.py --compute NVIDIA --devices 1 \ - --cpu 2 --memory 2Gi --timeout 1800 --name my-training -bin/mist-cli job submit /path/to/tt_train.py --compute TT --devices 1 -bin/mist-cli job submit /path/to/task.sh --compute CPU -bin/mist-cli job list # Waiting and running jobs -bin/mist-cli job list --all # Includes completed, failed, and cancelled jobs -read -r -p "Paste the job ID returned by submission: " JOB_ID -bin/mist-cli job status "$JOB_ID" -bin/mist-cli job logs "$JOB_ID" -``` - -Submission sends the actual file contents to the API. `.py` and `.sh` files -are supported, up to 32 KiB. `--image` selects an image allowed by the API; -otherwise the API chooses a runtime for the compute type. Upload datasets through the website, then pass `--dataset dataset-ID` to attach -one read-only at `/inputs`. Dependencies belong in an image allowed by the team registry policy. -Result files are downloadable from the website's job Files panel. - -NVIDIA counts are whole GPUs (one or two); TT counts are whole n300 boards -(one to four, two chips each). Scripts must use the corresponding runtime. -The default TT profile uses QuietBox's existing TT-Metal installation; a -compatible custom image can select the container runtime. For a small -built-in accelerator training check, use the Jobs page or the API's -`training-smoke` submission type. - -Status, logs, cancellation, and errors come from the real API. Cancellation -does not ask for confirmation. The deployed API authenticates each session and derives job/dataset ownership -from the member account. Legacy fake-token authentication is removed. - -```bash -go -C cli test ./... -``` - -The prompts above take actual IDs returned by `team list` and submission. -To cancel that job while waiting/running, use `bin/mist-cli job cancel "$JOB_ID"`. -`--team` or `MIST_TEAM` overrides the saved selection. Use `team use legacy` to -read historical jobs; new work requires a team. `--scope common` requires common -write permission. Custom tagged public images are allowed by team registry policy; -TT custom images use `--tt-runtime container`. See the -[department guide](../../docs/content/department-rollout.md) for limits and storage. diff --git a/cli/go.mod b/cli/go.mod deleted file mode 100644 index 3d70d07..0000000 --- a/cli/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module mist/cli - -go 1.24.0 - -require ( - github.com/alecthomas/kong v1.12.1 - golang.org/x/term v0.35.0 -) - -require golang.org/x/sys v0.36.0 // indirect diff --git a/cli/go.sum b/cli/go.sum deleted file mode 100644 index 31447c8..0000000 --- a/cli/go.sum +++ /dev/null @@ -1,12 +0,0 @@ -github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= -github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= -github.com/alecthomas/kong v1.12.1 h1:iq6aMJDcFYP9uFrLdsiZQ2ZMmcshduyGv4Pek0MQPW0= -github.com/alecthomas/kong v1.12.1/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU= -github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= -github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= diff --git a/cli/main.go b/cli/main.go deleted file mode 100644 index 038f096..0000000 --- a/cli/main.go +++ /dev/null @@ -1,5 +0,0 @@ -package main - -import "mist/cli/cmd" - -func main() { cmd.Main() } diff --git a/deploy/k3s/Dockerfile.api b/deploy/k3s/Dockerfile.api deleted file mode 100644 index 0cad2bf..0000000 --- a/deploy/k3s/Dockerfile.api +++ /dev/null @@ -1,7 +0,0 @@ -# Build the static binary from the repository root: -# CGO_ENABLED=0 go -C src build -o ../bin/mist-api . -# docker build -f deploy/k3s/Dockerfile.api -t mist-api:departments-20261009 . -FROM alpine:3.16.3 -COPY bin/mist-api /usr/local/bin/mist-api -USER 65532:65532 -ENTRYPOINT ["/usr/local/bin/mist-api"] diff --git a/deploy/k3s/README.md b/deploy/k3s/README.md deleted file mode 100644 index 55ceeb1..0000000 --- a/deploy/k3s/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Kubernetes deployment assets - -Current installation: two k3s nodes, authenticated team jobs, scoped NFS storage -and private Tailscale portal. Start with the [k3s setup/handoff](../../docs/content/k3s-setup.md) -and [deployment operations](../private/README.md). - -## Manifest and tooling map - -| Assets | Purpose | -|---|---| -| `mist-api.yaml` | Single API, built-in auth, and controller deployment | -| `team-rbac.yaml`, `team-workload-policy.yaml` | Team provisioning authority and workload admission | -| `nvidia-gpu-operator-values.yaml` | Pinned host-driver/CDI configuration | -| `tenstorrent-operator-values.yaml`, `mist-tenstorrent-claims.yaml` | TT operator configuration and retained legacy claims | -| `tenstorrent-workload-policy.yaml` | Admission protection for legacy `mist` diagnostics | -| `storage/` | NFS manifests, bounded pool provisioning, migration/growth | -| `training_smoke.py`, `examples/` | Accelerator checks and packaged-image examples | -| `gpu-smoke-job.yaml`, `training-*-job.yaml`, `submit_tenstorrent_smoke.py` | Administrator diagnostics in legacy namespace | -| `verify_department*`, `verify_split_storage.py`, `verify_large_dataset.py` | Current authenticated live verifiers | -| `verify_tenstorrent_allocation.py` | Infrastructure-level TT allocation diagnostic | -| `evidence/department-2026-10-09/` | Current release evidence | -| Earlier `*-results.json` | Historical dated test evidence | - -Direct manifest diagnostics require cluster administrator access and bypass -portal team admission. Researchers should use the authenticated portal or CLI. -Archived pre-team API/browser verifiers have been retired from executable source. - -The application image build uses [Dockerfile.api](Dockerfile.api). API/auth images -are imported into main's k3s containerd, not scheduled by a Docker supervisor. -Use `bash deploy/private/build-and-deploy.sh` for the existing installation. - -[Old deployment history](../../docs/content/archive/k3s-deployment-history.md) and -[original node setup](../../docs/content/archive/k3s-setup-history.md) preserve earlier -observations; their unauthenticated/node-local instructions are superseded. diff --git a/deploy/k3s/complete-results.json b/deploy/k3s/complete-results.json deleted file mode 100644 index 641710a..0000000 --- a/deploy/k3s/complete-results.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "site": "http://100.73.139.66:8088", - "started": "2026-10-09T03:36:21.090Z", - "jobs": [ - { - "id": "mist-22600b7fdeaa5e5f921b25e9", - "backend": "cpu", - "state": "Success", - "node": "utmist-z1opa08", - "files": [ - { - "path": "dataset-check.json", - "size": 37 - } - ] - }, - { - "id": "mist-78b599aa6e10655067ab8d86", - "backend": "nvidia", - "state": "Success", - "node": "utmist-z1opa08", - "files": [ - { - "path": "allocation.json", - "size": 85 - }, - { - "path": "nvidia-0.pt", - "size": 5409 - }, - { - "path": "nvidia-1.pt", - "size": 5409 - }, - { - "path": "results.json", - "size": 1081 - } - ] - }, - { - "id": "mist-5a2e0e2e99adcded65b1fc5d", - "backend": "tenstorrent", - "state": "Success", - "node": "utmist-tt", - "files": [ - { - "path": "allocation.json", - "size": 72 - }, - { - "path": "results.json", - "size": 977 - }, - { - "path": "tenstorrent-0.pt", - "size": 5843 - }, - { - "path": "tenstorrent-1.pt", - "size": 5843 - } - ] - } - ], - "checks": { - "browser_login": true, - "browser_upload_select_train_download": true, - "member_password_change": true, - "member_creation_isolation_deactivation": true, - "anonymous_signup_csrf_denied": true - }, - "dataset": { - "id": "dataset-197f830f9dfd0a7b1d4cf7b3", - "sha256": "98f61f87e9d30c36f0a8933028bbfcda06d56c393f12a4b5363cc1584decc01e", - "size": 248398 - }, - "browser_errors": [], - "finished": "2026-10-09T03:37:08.265Z", - "quietbox_submission": { - "submitted_from": "utmist-tt", - "job_id": "mist-32bf668f4232ca4b3b3f9472", - "node": "utmist-z1opa08", - "state": "Success", - "downloaded_metrics": { - "initial": 0.08051128685474396, - "final": 2.4448332247573035e-09, - "cuda": true - } - }, - "operations": { - "api_auth_restart_preserves_jobs_datasets_downloads": true, - "legacy_outputs_downloadable": 10, - "checked_zip_upload_and_unused_delete": true, - "auth_backup_integrity": "ok", - "checked_at": "2026-10-09T03:43:07Z" - }, - "images": { - "mist-api:complete-20261009": "sha256:de7b759498b0fdc157d846b36b5bebb560c6e7a1cc7f3c5d34904a6494273611", - "mist-auth:members-20261009": "sha256:bec799095b8ca79faabe75457143e366b67d3ca0fe6cc3dc7de5c5c9c4517c64" - }, - "scope": "Five-part foundation, privately hosted; HTTPS Serve prerequisite remains explicit", - "evidence_directory": "/home/utmist/mist-complete-results-2026-10-09" -} diff --git a/deploy/k3s/evidence/department-2026-10-09/README.md b/deploy/k3s/evidence/department-2026-10-09/README.md deleted file mode 100644 index a9596b2..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# Department verification — October 9, 2026 - -Evidence from the actual two-node private pilot before repository cleanup. -The original Go/Docker/logger counts below belong to that earlier release; -[current cleanup verification](../../../../docs/content/repository-cleanup.md) records -the maintained suites after their obsolete implementations were removed. -Reports contain synthetic -verification data and job/device IDs; no passwords, cookies or auth secrets. -Scripts are in `deploy/k3s/verify_department*`. They require existing authorized -local credentials and recorded machine addresses; inspect them before rerunning. -They create bounded test fixtures and preserve files/history afterward. - -| Check | Evidence | -|---|---| -| Fourteen API/storage/queue/training/isolation/legacy checks | [results.json](results.json) | -| Eleven browser checks, including pagination and mobile | [browser-results.json](browser-results.json) | -| Streamed 2 GiB + 4 MiB dataset, SHA256 and mounted Job input | [large upload](large-dataset-results.json), [job log](large-dataset-job.log) | -| Two concurrent TT jobs, distinct boards; failure/deadline | [runtime-results.json](runtime-results.json) | -| SSH on TT → CLI → NVIDIA on main | [remote-cli-results.json](remote-cli-results.json), [status](remote-cli-status.txt), [log](remote-cli-job.log) | -| Six server admission denials | [admission-results.json](admission-results.json) | -| Installed host chains, synthetic untrusted source | [portal-firewall.log](portal-firewall.log) | -| NVIDIA training metrics / actual allocation | [metrics](nvidia-results.json), [allocation](nvidia-allocation.json), [log](mist-8644eccafaf0b42c3d4add05.log) | -| TT training metrics / actual allocation | [metrics](tenstorrent-results.json), [allocation](tenstorrent-allocation.json), [log](mist-e5c04ea2cc126a786d6fe783.log) | -| Job writes fill only the bounded test filesystem | [capacity log](mist-1c4a852d366b9d2349e1cf7c.log) | -| Actual container cannot reach private services/credentials | [isolation log](mist-b46534ddeb9f18852b75f645.log) | -| Full release suites and final browser rerun | [release-validation.json](release-validation.json) | -| Dependency audit, zero reported vulnerabilities | [web audit](web-audit.json), [auth audit](auth-audit.json) | - -Screenshots: [jobs desktop](final-jobs-desktop.png), -[jobs mobile](final-jobs-mobile.png), [job composer](final-job-composer.png), -[mobile composer](final-job-composer-mobile.png), [datasets](final-datasets-desktop.png), -[overview](final-overview.png). - -Saved training weights were downloaded and checked during verification. They -remain in the protected local evidence directory and team job outputs; binary -weights and protected account/session state are not checked in. - -## Local checks - -```bash -go -C src test ./... -run 'Test(Department|Kubernetes|Shared|Dataset|Auth|Member|Image|Hardware|Result)' -count=1 -go -C cli test ./... -npm --prefix web-interface test -npx --prefix web-interface tsc --noEmit -p web-interface/tsconfig.json -``` - -Full frontend ESLint, shell/Python syntax checks and the production frontend -build passed. Use the pinned Go/Node versions in the deployment script. The final -release run passed all 33 backend and 10 Docker module tests, with no skips, using -a dedicated Redis container and the existing CPU Docker fixtures. CLI and logger -suites, TypeScript and all 10 React tests passed. The final browser rerun passed -all 11 checks with no browser errors. See [release validation](release-validation.json). - -The host firewall test used an isolated synthetic source on the actual installed -chains, not an external researcher's laptop. Regression training demonstrates -the tested runtimes/devices; arbitrary models, hostile-code VM isolation, HA, -per-member hard storage quotas and excluded rollout features are not claimed. - -## Separate storage pools follow-up - -[Small-file storage report](split-storage-results.json): seven live checks passed, -using a 260,729-byte dataset. Both NVIDIA GPUs and one TT board/two chips trained -from the uploaded data and saved/downloaded outputs through the new model PVC. -Existing accelerator outputs match their pre-migration evidence byte for byte. -Both pool shrink requests and combined budget overcommit were rejected without -changing persisted policy. The own small dataset was removed after both jobs. -Logs: [NVIDIA](split-nvidia.log), [Tenstorrent](split-tenstorrent.log). - -Six isolated migration tests passed using only tiny temporary files: content, -mode/ownership/link preservation, idempotence, retry after publication, conflicts, -partial stages, safe manifests and API access through member-folder parents. -Live NFS checks identified zero statfs filesystem IDs; readiness uses distinct -mount device identities. Dataset/model exports have separate stable files. - -The eleven browser checks and nine React tests passed after migration. Large -uploads and quota exhaustion were not repeated, at the user’s request. These -checks do not demonstrate uploads at 200/500 GiB or every disk-full scenario. -The initial unused 1.5 TiB bulk reservation was released using filesystem discard, -preserving data. After reclaiming deleted test blocks, the sparse backing file -used about 6 GiB physically and QuietBox had about 1.9 TiB free on its host disk. - -## Packaged image through the regular-member UI - -[Container mode report](container-mode-result.json), [filled form](container-mode-form.png), -[completed job](container-mode-completed.png). The visible desktop browser selected -NVIDIA → Container → one GPU and submitted the custom image with blank command -and argument fields. Actual job manifest inspection confirmed the image startup -was preserved and no Python script was injected. Real CUDA backpropagation, -convergence, saved weights/metrics and checkpoint reload passed. The image was -preloaded locally, so this does not claim a registry push/pull test. - -The walkthrough found and fixed an image-field editing bug: clearing an override -now leaves the field blank while the member types a replacement. A regression -test covers clearing, intermediate typing and preserving image startup defaults. diff --git a/deploy/k3s/evidence/department-2026-10-09/admission-results.json b/deploy/k3s/evidence/department-2026-10-09/admission-results.json deleted file mode 100644 index f39b83b..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/admission-results.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "host_network": { - "denied": true, - "reason": "The pods \"admission-probe\" is invalid: : ValidatingAdmissionPolicy 'mist-team-boundary' with binding 'mist-team-boundary' denied request: Team workloads cannot join host namespaces." - }, - "host_pid": { - "denied": true, - "reason": "The pods \"admission-probe\" is invalid: : ValidatingAdmissionPolicy 'mist-team-boundary' with binding 'mist-team-boundary' denied request: Team workloads cannot join host namespaces." - }, - "service_account_token": { - "denied": true, - "reason": "The pods \"admission-probe\" is invalid: : ValidatingAdmissionPolicy 'mist-team-boundary' with binding 'mist-team-boundary' denied request: Team workloads must disable Kubernetes credentials." - }, - "privileged_container": { - "denied": true, - "reason": "The pods \"admission-probe\" is invalid: : ValidatingAdmissionPolicy 'mist-team-boundary' with binding 'mist-team-boundary' denied request: Team containers must drop capabilities and forbid privilege escalation." - }, - "root_host_path": { - "denied": true, - "reason": "The pods \"admission-probe\" is invalid: : ValidatingAdmissionPolicy 'mist-team-boundary' with binding 'mist-team-boundary' denied request: Team volumes allow PVCs, scripts, scratch space and read-only TT runtime mounts." - }, - "capability_add": { - "denied": true, - "reason": "The pods \"admission-probe\" is invalid: : ValidatingAdmissionPolicy 'mist-team-boundary' with binding 'mist-team-boundary' denied request: Team containers must drop capabilities and forbid privilege escalation." - } -} diff --git a/deploy/k3s/evidence/department-2026-10-09/auth-audit.json b/deploy/k3s/evidence/department-2026-10-09/auth-audit.json deleted file mode 100644 index c9ea51a..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/auth-audit.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "auditReportVersion": 2, - "vulnerabilities": {}, - "metadata": { - "vulnerabilities": { - "info": 0, - "low": 0, - "moderate": 0, - "high": 0, - "critical": 0, - "total": 0 - }, - "dependencies": { - "prod": 26, - "dev": 0, - "optional": 0, - "peer": 0, - "peerOptional": 0, - "total": 25 - } - } -} diff --git a/deploy/k3s/evidence/department-2026-10-09/browser-results.json b/deploy/k3s/evidence/department-2026-10-09/browser-results.json deleted file mode 100644 index b74736b..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/browser-results.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "checks": { - "admin_browser_login": true, - "browser_account_creation": true, - "browser_team_creation_membership_common_write_and_policy": true, - "browser_upload_common_folder_browse_and_download": true, - "job_defaults_follow_loaded_team_policy": true, - "regular_browser_selfservice_image_submit_expand_logs_result_download": true, - "regular_browser_admin_controls_denied": true, - "browser_password_reset_revokes_sessions_new_login_works": true, - "responsive_job_dialog_and_device_slider": true, - "history_pagination_next_previous_real_legacy_jobs": true, - "desktop_mobile_layout_no_overflow_or_browser_errors": true - }, - "browser_errors": [], - "started": "2026-10-09T07:54:23.922Z", - "job_id": "mist-6b49a490b1bf833a1e194415", - "finished": "2026-10-09T07:54:45.282Z" -} \ No newline at end of file diff --git a/deploy/k3s/evidence/department-2026-10-09/cleanup-validation.json b/deploy/k3s/evidence/department-2026-10-09/cleanup-validation.json deleted file mode 100644 index 59eeb18..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/cleanup-validation.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "recorded_at": "2026-10-09T08:41:50.836023+00:00", - "base_main_commit": "3431ffdb713fac72881fc7f61f2750a82fe3f916", - "source_branch": "chore/main-cleanup-20261009", - "go": { - "race_detector": true, - "api_tests_passed": 29, - "cli_tests_passed": 6, - "skipped_tests": 0, - "vet": "passed", - "api_cli_static_builds": "passed", - "retired_executor_fail_fast": "passed", - "deadcode_tool": "golang.org/x/tools/cmd/deadcode v0.38.0, with tests", - "unreachable_functions_after_cleanup": 0 - }, - "frontend": { - "react_tests_passed": 10, - "typescript": "passed", - "lint": "passed", - "production_build": "passed", - "npm_audit_vulnerabilities": 0 - }, - "migration": { - "tests_passed": 6, - "skipped_tests": 0, - "environment": "disposable root container; read-only source, isolated tiny temporary files; no live storage" - }, - "candidate_api_smoke": { - "checks": { - "compiled_api_startup_real_kubernetes_health": true, - "real_auth_gateway_session": true, - "anonymous_jobs_denied": true, - "sigterm_graceful_shutdown": true - }, - "temporary_listener": "localhost only, removed after test", - "team_controller_enabled": false, - "cluster_or_account_mutations": false, - "production_redeployed": false - }, - "infrastructure_audit": { - "nodes_ready": 2, - "api_auth_available": true, - "operators_ready": true, - "ssh_quietbox_connection": "passed", - "tailscale_ssh_handler_enabled": false, - "live_host_service_enablement_checked": true - }, - "production_redeployed": false, - "large_storage_tests_run": false, - "fresh_training_or_browser_runs_claimed": false, - "notes": [ - "Prior live training/browser/isolation evidence is for the pre-cleanup department release", - "Main still requires independent pull-request review", - "Legacy source removal preserves existing Kubernetes jobs/PVCs and host files" - ] -} diff --git a/deploy/k3s/evidence/department-2026-10-09/container-mode-completed.png b/deploy/k3s/evidence/department-2026-10-09/container-mode-completed.png deleted file mode 100644 index efe6177fe0f08bd2bc4e5bbea716a1500fc3910c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291629 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°skeT|hF=q*xihuX!MGe9o%ifx~pFWxd9d~g4 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
D0{ArW{^msg)*RxZ$!Qff5 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 p1=~A-zo3nHcax8Bn%vvnX7y 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≪X`F(a)IrS-@Cv&^6&CtG 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

xJN3JtYVTHfT@7<@?^MA^OLb!0{bK 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≺%gxXV8j89O=eJ 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 z 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

o33<177plPgUWebqNvZIVKPm_1wP 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%0Duv*8(K@i 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 diff --git a/deploy/k3s/evidence/department-2026-10-09/final-job-composer-mobile.png b/deploy/k3s/evidence/department-2026-10-09/final-job-composer-mobile.png deleted file mode 100644 index 529ccd68ffe822227657e2324b81d94d7627f1d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51890 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 diff --git a/deploy/k3s/evidence/department-2026-10-09/final-job-composer.png b/deploy/k3s/evidence/department-2026-10-09/final-job-composer.png deleted file mode 100644 index 3765cacc0cebcd42757e6e85140e4817ca69cc05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181717 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�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 }N621ivQ#gqCAJ*#RfV%*i$ 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 diff --git a/deploy/k3s/evidence/storage-2026-10-21/nvidia.log b/deploy/k3s/evidence/storage-2026-10-21/nvidia.log deleted file mode 100644 index e447011..0000000 --- a/deploy/k3s/evidence/storage-2026-10-21/nvidia.log +++ /dev/null @@ -1,10 +0,0 @@ -CUDA devices=1; torch=2.5.1+cu124 -Training on cuda:0: NVIDIA RTX A4000 -DATASET_LOADED file=/inputs/regression.json -cuda:0 step=0 mse=0.32162201 -cuda:0 step=20 mse=0.00133983 -cuda:0 step=40 mse=0.00006271 -cuda:0 step=60 mse=0.00000431 -cuda:0 step=80 mse=0.00000035 -{"backend": "nvidia", "device_id": 0, "initial_mse": 0.32162201404571533, "final_mse": 3.100358014762605e-08, "validation_mse": 9.109567145060282e-08, "max_weight_change": 0.37507763504981995, "checkpoint": "/outputs/nvidia-0.pt"} -TRAINING_PASSED backend=nvidia devices=1 diff --git a/deploy/k3s/evidence/storage-2026-10-21/results.json b/deploy/k3s/evidence/storage-2026-10-21/results.json deleted file mode 100644 index 0a2e84e..0000000 --- a/deploy/k3s/evidence/storage-2026-10-21/results.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "checks": [ - "regular_member_login_and_shared_folder_readiness", - "membership_and_common_write_permissions_enforced", - "unsafe_archive_rejected", - "small_upload_checksum_download_and_cross_team_isolation", - "active_dataset_deletion_blocked", - "nvidia_real_training_and_output_downloads", - "tenstorrent_real_training_and_output_downloads", - "host_sampled_dataset_and_model_usage" - ], - "jobs": [ - { - "id": "mist-b5e74aec693e5111ae262449", - "backend": "nvidia", - "metrics": [ - { - "backend": "nvidia", - "device_id": 0, - "initial_mse": 0.32162201404571533, - "final_mse": 3.100358014762605e-08, - "validation_mse": 9.109567145060282e-08, - "max_weight_change": 0.37507763504981995, - "checkpoint": "/outputs/nvidia-0.pt", - "checkpoint_reload_mse": 9.109567145060282e-08, - "device_name": "NVIDIA RTX A4000", - "started_at": "2026-10-22T00:28:43.814031+00:00", - "finished_at": "2026-10-22T00:28:44.148257+00:00", - "device_nodes": [ - "/dev/nvidia1" - ] - } - ], - "node": "utmist-z1opa08", - "status": "Success" - }, - { - "id": "mist-57208c18e561c8cef36e6697", - "backend": "tenstorrent", - "metrics": [ - { - "backend": "tenstorrent", - "device_id": 0, - "initial_mse": 0.32162201404571533, - "final_mse": 5.1175324188079685e-05, - "validation_mse": 0.00011455668573034927, - "max_weight_change": 0.369140625, - "checkpoint": "/outputs/tenstorrent-0.pt", - "checkpoint_reload_mse": 0.00011455668573034927, - "started_at": "2026-10-22T00:28:49.539632+00:00", - "finished_at": "2026-10-22T00:28:59.859064+00:00", - "device_nodes": [ - "/dev/tenstorrent/1" - ] - }, - { - "backend": "tenstorrent", - "device_id": 1, - "initial_mse": 0.32162201404571533, - "final_mse": 5.1175324188079685e-05, - "validation_mse": 0.00011455668573034927, - "max_weight_change": 0.369140625, - "checkpoint": "/outputs/tenstorrent-1.pt", - "checkpoint_reload_mse": 0.00011455668573034927, - "started_at": "2026-10-22T00:29:11.964071+00:00", - "finished_at": "2026-10-22T00:29:15.617335+00:00", - "device_nodes": [ - "/dev/tenstorrent/1" - ] - } - ], - "node": "utmist-tt", - "status": "Success" - } - ], - "bulk_testing": false, - "dataset_bytes": 255854, - "storage": { - "available_bytes": 2010710540288, - "capacity_bytes": 3936291389440, - "dataset_allocation_gib": 1, - "dataset_used_bytes": 256360, - "enabled": true, - "max_dataset_bytes": 1125899906842624, - "model_allocation_gib": 1, - "model_used_bytes": 6065, - "storage_limits_enforced": false, - "storage_low": false, - "storage_mode": "shared-folders", - "upload_limit_bytes": 2009636798464, - "usage_observed_at": "2026-10-22T00:28:54Z", - "usage_stale": false - }, - "teams": [ - "team-a91af070ba2a6bdc", - "team-71d2f7b638c597e1" - ] -} diff --git a/deploy/k3s/evidence/storage-2026-10-21/tenstorrent.log b/deploy/k3s/evidence/storage-2026-10-21/tenstorrent.log deleted file mode 100644 index 989051e..0000000 --- a/deploy/k3s/evidence/storage-2026-10-21/tenstorrent.log +++ /dev/null @@ -1,58 +0,0 @@ -2026-10-22 00:28:44.905 | DEBUG | ttnn::78 - Initial ttnn.CONFIG: -Config{cache_path=/root/.cache/ttnn,model_cache_path=/root/.cache/ttnn/models,tmp_dir=/tmp/ttnn,enable_model_cache=false,enable_fast_runtime_mode=true,validate_program_args=false,throw_exception_on_fallback=false,enable_logging=false,enable_graph_report=false,enable_graph_python_stack_traces=false,enable_detailed_buffer_report=false,enable_detailed_tensor_report=false,enable_comparison_mode=false,comparison_mode_should_raise_exception=false,comparison_mode_pcc=0.9999,root_report_path=generated/ttnn/reports,report_name=std::nullopt,std::nullopt} -2026-10-22 00:28:45.104 | info | Device | Opening user mode device driver (tt_cluster.cpp:228) -2026-10-22 00:28:45.104 | info | UMD | Cluster constructor started. (cluster.cpp:389) -2026-10-22 00:28:45.104 | info | UMD | Creating TopologyDiscovery for architecture: wormhole_b0 (topology_discovery.cpp:96) -2026-10-22 00:28:45.104 | info | UMD | Starting topology discovery. (topology_discovery.cpp:115) -2026-10-22 00:28:45.106 | info | UMD | Established firmware bundle version: 19.4.2 (topology_discovery.cpp:575) -2026-10-22 00:28:45.114 | info | UMD | Completed topology discovery. (topology_discovery.cpp:119) -2026-10-22 00:28:45.151 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 1 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 137514765571904) (cpuset_lib.cpp:440) -2026-10-22 00:28:45.151 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 1 ch: 0). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-22 00:28:45.151 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 1 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 137514765571904) (cpuset_lib.cpp:440) -2026-10-22 00:28:45.151 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 1 ch: 1). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-22 00:28:45.154 | info | UMD | Opening local chip ids/PCIe ids: {0}/[1] and remote chip ids {1} (cluster.cpp:173) -2026-10-22 00:28:45.154 | info | UMD | IOMMU: disabled (cluster.cpp:147) -2026-10-22 00:28:45.154 | info | UMD | KMD version: 2.5.0 (cluster.cpp:150) -2026-10-22 00:28:45.154 | info | UMD | Cluster constructor completed. (cluster.cpp:648) -2026-10-22 00:28:45.155 | info | UMD | Starting devices in cluster (cluster.cpp:1188) -2026-10-22 00:28:45.158 | info | UMD | Starting devices in cluster completed. (cluster.cpp:1196) -Tenstorrent devices=2; torch used for data/metrics=2.11.0+cpu -Opening Tenstorrent device 0 -2026-10-22 00:28:45.209 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-22 00:28:45.209 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-22 00:28:45.210 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-22 00:28:45.210 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -DATASET_LOADED file=/inputs/regression.json -tt:0 step=0 mse=0.18711002 -tt:0 step=20 mse=0.00110440 -tt:0 step=40 mse=0.00008407 -tt:0 step=60 mse=0.00005286 -tt:0 step=80 mse=0.00005125 -{"backend": "tenstorrent", "device_id": 0, "initial_mse": 0.32162201404571533, "final_mse": 5.1175324188079685e-05, "validation_mse": 0.00011455668573034927, "max_weight_change": 0.369140625, "checkpoint": "/outputs/tenstorrent-0.pt"} -Opening Tenstorrent device 1 -2026-10-22 00:28:59.905 | info | Metal | Fabric config changed from FabricConfig::DISABLED to FabricConfig::FABRIC_1D, reinitializing control plane (metal_env.cpp:337) -2026-10-22 00:28:59.905 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-22 00:28:59.905 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-22 00:28:59.906 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-22 00:28:59.906 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -2026-10-22 00:28:59.907 | info | Metal | Enabling FabricConfig::FABRIC_1D only for dispatch. If your workload requires fabric, please set the fabric config accordingly. (device_manager.cpp:291) -2026-10-22 00:28:59.907 | info | Metal | Dispatch on FabricConfig::FABRIC_1D with 1 Command Queues - (device_manager.cpp:299) -2026-10-22 00:28:59.909 | info | Metal | Initializing Fabric (fabric_firmware_initializer.cpp:296) -2026-10-22 00:29:01.929 | info | Metal | Fabric initialized on 2 devices (fabric_firmware_initializer.cpp:444) -2026-10-22 00:29:01.929 | info | Metal | Fabric Initialized with config FabricConfig::FABRIC_1D (fabric_firmware_initializer.cpp:313) -DATASET_LOADED file=/inputs/regression.json -tt:1 step=0 mse=0.18711002 -tt:1 step=20 mse=0.00110440 -tt:1 step=40 mse=0.00008407 -tt:1 step=60 mse=0.00005286 -tt:1 step=80 mse=0.00005125 -{"backend": "tenstorrent", "device_id": 1, "initial_mse": 0.32162201404571533, "final_mse": 5.1175324188079685e-05, "validation_mse": 0.00011455668573034927, "max_weight_change": 0.369140625, "checkpoint": "/outputs/tenstorrent-1.pt"} -TRAINING_PASSED backend=tenstorrent devices=2 -2026-10-22 00:29:16.207 | info | BuildKernels | JIT cache stats: 0/58 hits (0.0%) [0 cached, 10 build-once dedup, 0 merged artifacts, 0 merged genfiles] (build_cache_telemetry.cpp:207) -2026-10-22 00:29:16.207 | info | BuildKernels | JIT telemetry: 2 registered TelemetryTokens (build_cache_telemetry.cpp:230) -2026-10-22 00:29:16.212 | info | Device | Closing user mode device drivers (tt_cluster.cpp:513) -2026-10-22 00:29:16.212 | info | UMD | Closing devices in cluster (cluster.cpp:1201) -2026-10-22 00:29:16.220 | info | UMD | Closing devices in cluster completed. (cluster.cpp:1210) -2026-10-22 00:29:16.220 | info | UMD | Cluster destructor started. (cluster.cpp:916) -2026-10-22 00:29:16.220 | info | UMD | Cluster destructor completed. (cluster.cpp:919) diff --git a/deploy/k3s/evidence/storage-2026-10-21/validation.json b/deploy/k3s/evidence/storage-2026-10-21/validation.json deleted file mode 100644 index 3f25652..0000000 --- a/deploy/k3s/evidence/storage-2026-10-21/validation.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "base_main": "ba2bb86", - "branch": "feat/simple-storage-ethernet-20261021", - "go_api_tests": 43, - "go_cli_tests": 6, - "go_race": "passed", - "go_vet": "passed", - "react_tests": 16, - "typescript": "passed", - "frontend_lint": "passed", - "frontend_build": "passed", - "python_folder_tests": 6, - "npm_audit_vulnerabilities": 0, - "fake_backend_contract": "passed", - "ethernet": { - "main": "192.168.240.1/30", - "main_interface": "enp6s0", - "quietbox": "192.168.240.2/30", - "quietbox_interface": "enp200s0", - "link_mbps": 1000, - "main_route": "192.168.240.2 dev enp6s0 src 192.168.240.1 uid 1000 \n cache", - "small_probe_bytes": 16777216, - "small_probe_write_MBps": 43.0, - "small_probe_read_MBps": 101.0, - "performance_note": "Single small direct-I/O NFS sample; not a sustained workload benchmark." - }, - "auth_prerequisites": [ - "Require real unexpired database sessions; remove identity-cookie fallbacks", - "Preserve Better Auth scrypt passwords, NOT NULL schema and deactivated accounts", - "Existing administrator login verified against isolated database copy and live portal" - ], - "old_storage": "Retained unchanged for rollback; no migration", - "large_storage_testing": false, - "new_storage_mode": "ordinary directories with advisory team allowances", - "remaining_boundaries": [ - "Single storage host and shared physical capacity", - "No equal-space guarantee or per-team hard quota", - "No automatic backup, local dataset cache, or resumable upload" - ] -} diff --git a/deploy/k3s/evidence/storage-2026-10-21/workload-volumes.json b/deploy/k3s/evidence/storage-2026-10-21/workload-volumes.json deleted file mode 100644 index a66be72..0000000 --- a/deploy/k3s/evidence/storage-2026-10-21/workload-volumes.json +++ /dev/null @@ -1,130 +0,0 @@ -[ - { - "id": "mist-b5e74aec693e5111ae262449", - "namespace": "mist-team-a91af070ba2a6bdc", - "node": "utmist-z1opa08", - "automount_service_account_token": false, - "volumes": [ - { - "claim": "team-results", - "read_only": false, - "nfs": { - "path": "/srv/mist-data/teams/team-a91af070ba2a6bdc/results", - "server": "192.168.240.2" - }, - "mount_options": [ - "nfsvers=4.1", - "hard", - "timeo=100", - "retrans=2" - ] - }, - { - "claim": "team-datasets", - "read_only": true, - "nfs": { - "path": "/srv/mist-data/teams/team-a91af070ba2a6bdc/datasets", - "server": "192.168.240.2" - }, - "mount_options": [ - "nfsvers=4.1", - "hard", - "timeo=100", - "retrans=2" - ] - } - ], - "mounts": [ - { - "mountPath": "/checkpoints/mist-b5e74aec693e5111ae262449", - "name": "checkpoints", - "subPath": "members/21008782734082c80dbd4eb4/jobs/mist-b5e74aec693e5111ae262449/outputs" - }, - { - "mountPath": "/outputs", - "name": "checkpoints", - "subPath": "members/21008782734082c80dbd4eb4/jobs/mist-b5e74aec693e5111ae262449/outputs" - }, - { - "mountPath": "/inputs", - "name": "input", - "readOnly": true, - "subPath": "members/21008782734082c80dbd4eb4/datasets/dataset-3c4ddd41a5c75880df01796f/content" - }, - { - "mountPath": "/mist-script", - "name": "script", - "readOnly": true - } - ] - }, - { - "id": "mist-57208c18e561c8cef36e6697", - "namespace": "mist-team-a91af070ba2a6bdc", - "node": "utmist-tt", - "automount_service_account_token": false, - "volumes": [ - { - "claim": "team-results", - "read_only": false, - "nfs": { - "path": "/srv/mist-data/teams/team-a91af070ba2a6bdc/results", - "server": "192.168.240.2" - }, - "mount_options": [ - "nfsvers=4.1", - "hard", - "timeo=100", - "retrans=2" - ] - }, - { - "claim": "team-datasets", - "read_only": true, - "nfs": { - "path": "/srv/mist-data/teams/team-a91af070ba2a6bdc/datasets", - "server": "192.168.240.2" - }, - "mount_options": [ - "nfsvers=4.1", - "hard", - "timeo=100", - "retrans=2" - ] - } - ], - "mounts": [ - { - "mountPath": "/checkpoints/mist-57208c18e561c8cef36e6697", - "name": "checkpoints", - "subPath": "members/21008782734082c80dbd4eb4/jobs/mist-57208c18e561c8cef36e6697/outputs" - }, - { - "mountPath": "/outputs", - "name": "checkpoints", - "subPath": "members/21008782734082c80dbd4eb4/jobs/mist-57208c18e561c8cef36e6697/outputs" - }, - { - "mountPath": "/home/utmist-tt/TT/tt-metal", - "name": "metal", - "readOnly": true - }, - { - "mountPath": "/home/utmist-tt/.local/share/uv/python", - "name": "python", - "readOnly": true - }, - { - "mountPath": "/inputs", - "name": "input", - "readOnly": true, - "subPath": "members/21008782734082c80dbd4eb4/datasets/dataset-3c4ddd41a5c75880df01796f/content" - }, - { - "mountPath": "/mist-script", - "name": "script", - "readOnly": true - } - ] - } -] diff --git a/deploy/k3s/examples/Dockerfile.training b/deploy/k3s/examples/Dockerfile.training deleted file mode 100644 index 7c80e76..0000000 --- a/deploy/k3s/examples/Dockerfile.training +++ /dev/null @@ -1,8 +0,0 @@ -# CPU: docker build -f deploy/k3s/examples/Dockerfile.training -t mist-training:cpu-v1 deploy/k3s/examples -# NVIDIA: add --build-arg BASE_IMAGE=pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime -ARG BASE_IMAGE=python:3.10-slim -FROM ${BASE_IMAGE} -WORKDIR /app -COPY train.py dataset.csv /app/ -ENTRYPOINT ["python", "-u", "train.py"] -CMD ["--backend", "cpu"] diff --git a/deploy/k3s/examples/dataset.csv b/deploy/k3s/examples/dataset.csv deleted file mode 100644 index e6fa537..0000000 --- a/deploy/k3s/examples/dataset.csv +++ /dev/null @@ -1,8 +0,0 @@ -x,y --2,-5 --1,-2 --0.5,-0.5 -0,1 -0.5,2.5 -1,4 -2,7 diff --git a/deploy/k3s/examples/train.py b/deploy/k3s/examples/train.py deleted file mode 100644 index 59f54cc..0000000 --- a/deploy/k3s/examples/train.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Packaged regression example: CPU stdlib, or PyTorch CUDA on each GPU. - -The tiny dataset is baked into the image until Mist's dataset service exists. -The default entrypoint and /app WORKDIR deliberately test image semantics. -""" -import argparse -import csv -import json -import os -from pathlib import Path - - -def cpu(rows, output): - weight, bias = 0.0, 0.0 - initial = sum(y * y for x, y in rows) / len(rows) - for _ in range(200): - errors = [(weight * x + bias - y, x) for x, y in rows] - weight -= 0.05 * 2 * sum(error * x for error, x in errors) / len(rows) - bias -= 0.05 * 2 * sum(error for error, x in errors) / len(rows) - loss = sum((weight * x + bias - y) ** 2 for x, y in rows) / len(rows) - checkpoint = output / 'model.json' - checkpoint.write_text(json.dumps({'weight': weight, 'bias': bias}) + '\n') - restored = json.loads(checkpoint.read_text()) - assert restored['weight'] == weight and restored['bias'] == bias - return [{'initial_loss': initial, 'final_loss': loss, 'checkpoint': checkpoint.name}] - - -def nvidia(rows, output, expected): - import torch - assert torch.cuda.is_available(), 'CUDA is unavailable; refusing CPU fallback' - assert torch.cuda.device_count() == expected, 'Allocated GPU count differs' - results = [] - for index in range(expected): - device = torch.device(f'cuda:{index}') - inputs = torch.tensor([[x] for x, y in rows], device=device) - targets = torch.tensor([[y] for x, y in rows], device=device) - model = torch.nn.Linear(1, 1, device=device) - optimizer = torch.optim.SGD(model.parameters(), lr=0.05) - initial = torch.nn.functional.mse_loss(model(inputs), targets).item() - for _ in range(200): - optimizer.zero_grad() - loss = torch.nn.functional.mse_loss(model(inputs), targets) - loss.backward() - optimizer.step() - final = torch.nn.functional.mse_loss(model(inputs), targets).item() - checkpoint = output / f'nvidia-{index}.pt' - torch.save(model.state_dict(), checkpoint) - restored = torch.nn.Linear(1, 1, device=device) - restored.load_state_dict(torch.load(checkpoint, weights_only=True, map_location=device)) - assert torch.allclose(model(inputs), restored(inputs)) - results.append({'device': torch.cuda.get_device_name(index), 'initial_loss': initial, 'final_loss': final, 'checkpoint': checkpoint.name}) - return results - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('--backend', choices=['cpu', 'nvidia'], default='cpu') - parser.add_argument('--devices', type=int, default=1) - args = parser.parse_args() - assert Path.cwd() == Path('/app'), 'Image WORKDIR was overridden' - with Path('dataset.csv').open() as dataset: - rows = [(float(row['x']), float(row['y'])) for row in csv.DictReader(dataset)] - output = Path(os.environ.get('MIST_OUTPUT_DIR', '/outputs')) - output.mkdir(parents=True, exist_ok=True) - results = cpu(rows, output) if args.backend == 'cpu' else nvidia(rows, output, args.devices) - assert all(result['final_loss'] < 0.001 for result in results), 'Training did not converge' - evidence = {'backend': args.backend, 'cwd': str(Path.cwd()), 'results': results, 'greeting': os.environ.get('GREETING', '')} - (output / 'results.json').write_text(json.dumps(evidence, indent=2) + '\n') - print(json.dumps(evidence), flush=True) - print(f'PACKAGED_TRAINING_PASSED backend={args.backend}', flush=True) - - -if __name__ == '__main__': - main() diff --git a/deploy/k3s/examples/train_shared.py b/deploy/k3s/examples/train_shared.py deleted file mode 100644 index 9ae65c8..0000000 --- a/deploy/k3s/examples/train_shared.py +++ /dev/null @@ -1,212 +0,0 @@ -"""Small accelerator training check; TT gradients are computed explicitly in TT-NN. - -CPU Torch creates the data, records metrics, and serializes checkpoints. All -forward passes, gradients, and weight updates run on the selected accelerator. -This is a linear-regression smoke test, not a model compatibility benchmark. -""" - -import argparse -import json -import math -import os -import subprocess -import sys -import time -from datetime import datetime, timezone -from pathlib import Path - -import torch - - -def dataset(): - # Uploaded dataset; deliberately no generated-data fallback. - path = Path(os.environ.get("MIST_INPUT_DIR", "/inputs")) / "regression.json" - data = json.loads(path.read_text()) - tensors = [torch.tensor(data[key], dtype=torch.float32) for key in - ("x", "y", "validation_x", "validation_y")] - assert [tuple(t.shape) for t in tensors] == [(128,32),(128,32),(64,32),(64,32)] - print(f"DATASET_LOADED file={path}", flush=True) - return tensors - - -def await_start(output, start_file, metadata): - if not start_file: - return - (output / "ready.json").write_text(json.dumps({**metadata, - "ready_at": datetime.now(timezone.utc).isoformat()}) + "\n") - print(f"BARRIER_READY {json.dumps(metadata)}", flush=True) - deadline = time.monotonic() + 300 - while not start_file.exists(): - assert time.monotonic() < deadline, "Training start barrier timed out" - time.sleep(0.2) - - -def check_and_save(backend, device_id, weights, initial, final, validation, output): - change = weights.abs().max().item() - assert all(math.isfinite(v) for v in (initial, final, validation, change)) - assert final < initial * 0.02, f"Loss did not converge: {initial} -> {final}" - assert validation < 5e-4, f"Held-out MSE too high: {validation}" - assert change > 0.05, "Weights were not updated" - path = output / f"{backend}-{device_id}.pt" - torch.save({"weights": weights.cpu(), "initial_mse": initial, - "final_mse": final, "validation_mse": validation}, path) - loaded = torch.load(path, map_location="cpu", weights_only=True) - torch.testing.assert_close(loaded["weights"], weights.cpu(), rtol=0, atol=0) - result = {"backend": backend, "device_id": device_id, - "initial_mse": initial, "final_mse": final, - "validation_mse": validation, "max_weight_change": change, - "checkpoint": str(path)} - print(json.dumps(result), flush=True) - return result, loaded["weights"] - - -def nvidia(output, steps, expected_devices, start_file, board_pci): - assert torch.cuda.is_available(), "CUDA unavailable; CPU fallback is forbidden" - count = torch.cuda.device_count() - assert count == expected_devices, f"Expected {expected_devices} allocated GPUs; saw {count}" - print(f"CUDA devices={count}; torch={torch.__version__}", flush=True) - nodes = sorted(str(path) for path in Path("/dev").glob("nvidia[0-9]*")) - assert len(nodes) == count, f"Unexpected NVIDIA device nodes: {nodes}" - (output / "allocation.json").write_text(json.dumps({"device_nodes": nodes, - "gpu_count": count}, indent=2) + "\n") - results = [] - for index in range(count): - device = torch.device(f"cuda:{index}") - print(f"Training on {device}: {torch.cuda.get_device_name(index)}", flush=True) - x, y, validation_x, validation_y = (t.to(device) for t in dataset()) - model = torch.nn.Linear(32, 32, bias=False).to(device) - torch.nn.init.zeros_(model.weight) - optimizer = torch.optim.SGD(model.parameters(), lr=0.2) - if index == 0: - await_start(output, start_file, {"device_nodes": nodes, "gpu_count": count}) - started = datetime.now(timezone.utc).isoformat() - initial = (model(x) - y).square().mean().item() - for step in range(steps): - optimizer.zero_grad(set_to_none=True) - residual = model(x) - y - loss = residual.square().sum() / (2 * x.shape[0]) - loss.backward() - assert model.weight.grad.is_cuda - optimizer.step() - if step % 20 == 0: - print(f"cuda:{index} step={step} mse={residual.square().mean().item():.8f}", flush=True) - with torch.no_grad(): - final = (model(x) - y).square().mean().item() - validation = (model(validation_x) - validation_y).square().mean().item() - result, weights = check_and_save("nvidia", index, model.weight.T.detach(), - initial, final, validation, output) - restored_error = (validation_x @ weights.to(device) - validation_y).square().mean().item() - assert abs(restored_error - validation) < 1e-7 - result["checkpoint_reload_mse"] = restored_error - result["device_name"] = torch.cuda.get_device_name(index) - result["started_at"] = started - result["finished_at"] = datetime.now(timezone.utc).isoformat() - result["device_nodes"] = nodes - results.append(result) - return results - - -def tenstorrent(output, steps, expected_devices, start_file, board_pci): - nodes = sorted(str(path) for path in Path("/dev/tenstorrent").iterdir()) - - def pci_address(node): - path = Path("/sys/class/tenstorrent") / ("tenstorrent!" + Path(node).name) - assert path.exists(), f"Missing PCI identity for {node}" - return path.resolve().parents[1].name - - if board_pci: - nodes = [node for node in nodes if pci_address(node) == board_pci] - assert len(nodes) == 1, f"PCI selector does not match one allocated board: {board_pci}" - assert len(nodes) * 2 == expected_devices, f"Unexpected n300 device nodes: {nodes}" - if len(nodes) > 1: - # Arbitrary n300 subsets need not form a connected fabric mesh. - # This test trains independently, so use one runtime per board. - results = [] - for ordinal, node in enumerate(nodes): - bdf = pci_address(node) - board_output = output / ("board-" + Path(node).name) - command = [sys.executable, __file__, "tenstorrent", "--steps", str(steps), - "--expected-devices", "2", "--output", str(board_output), "--board-pci", bdf] - if start_file: - command += ["--start-file", str(start_file)] - print(f"Training reserved board {node}, PCI {bdf}", flush=True) - subprocess.run(command, env={**os.environ, "TT_VISIBLE_DEVICES": bdf}, check=True) - for result in json.loads((board_output / "results.json").read_text()): - result["board_local_device_id"] = result["device_id"] - result["device_id"] = ordinal * 2 + result["device_id"] - result["board_pci"] = bdf - results.append(result) - assert len(results) == expected_devices - (output / "allocation.json").write_text(json.dumps({"device_nodes": nodes, - "chip_count": expected_devices}, indent=2) + "\n") - return results - - import ttnn - - count = ttnn.get_num_devices() - assert count == expected_devices, f"Expected {expected_devices} allocated chips; saw {count}" - (output / "allocation.json").write_text(json.dumps({"device_nodes": nodes, - "chip_count": count}, indent=2) + "\n") - print(f"Tenstorrent devices={count}; torch used for data/metrics={torch.__version__}", flush=True) - results = [] - for index in range(count): - print(f"Opening Tenstorrent device {index}", flush=True) - device = ttnn.open_device(device_id=index) - try: - if index == 0 and start_file: - await_start(output, start_file, {"device_nodes": nodes, "chip_count": count}) - started = datetime.now(timezone.utc).isoformat() - x, y, validation_x, validation_y = dataset() - options = dict(dtype=ttnn.bfloat16, layout=ttnn.TILE_LAYOUT, - device=device, memory_config=ttnn.DRAM_MEMORY_CONFIG) - dx, dy, dvx = (ttnn.from_torch(t, **options) for t in (x, y, validation_x)) - dxt = ttnn.from_torch(x.T.contiguous(), **options) - weights = ttnn.from_torch(torch.zeros(32, 32), **options) - - def mse(inputs, target, matrix): - prediction = ttnn.to_torch(ttnn.matmul(inputs, matrix)).float() - return (prediction - target).square().mean().item() - - initial = mse(dx, y, weights) - for step in range(steps): - prediction = ttnn.matmul(dx, weights) - residual = ttnn.subtract(prediction, dy) - # Gradient of ||XW-Y||^2/(2N) is X.T@(XW-Y)/N. - gradient = ttnn.matmul(dxt, residual) - weights = ttnn.subtract(weights, ttnn.multiply(gradient, 0.2 / x.shape[0])) - if step % 20 == 0: - print(f"tt:{index} step={step} mse={mse(dx, y, weights):.8f}", flush=True) - final = mse(dx, y, weights) - validation = mse(dvx, validation_y, weights) - host_weights = ttnn.to_torch(weights).float() - result, loaded = check_and_save("tenstorrent", index, host_weights, - initial, final, validation, output) - restored = ttnn.from_torch(loaded, **options) - restored_error = mse(dvx, validation_y, restored) - assert abs(restored_error - validation) < 1e-7 - result["checkpoint_reload_mse"] = restored_error - result["started_at"] = started - result["finished_at"] = datetime.now(timezone.utc).isoformat() - result["device_nodes"] = nodes - results.append(result) - finally: - ttnn.close_device(device) - return results - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("backend", choices=("nvidia", "tenstorrent")) - parser.add_argument("--steps", type=int, default=100) - parser.add_argument("--output", type=Path, default=Path("/checkpoints")) - parser.add_argument("--expected-devices", type=int, - help="Expected allocated chip/GPU count; defaults to the original whole-node test") - parser.add_argument("--start-file", type=Path, - help="Optional shared-file barrier for the concurrent allocation test") - parser.add_argument("--board-pci", help=argparse.SUPPRESS) - args = parser.parse_args() - args.output.mkdir(parents=True, exist_ok=True) - expected = args.expected_devices or (2 if args.backend == "nvidia" else 8) - results = globals()[args.backend](args.output, args.steps, expected, args.start_file, args.board_pci) - (args.output / "results.json").write_text(json.dumps(results, indent=2) + "\n") - print(f"TRAINING_PASSED backend={args.backend} devices={len(results)}", flush=True) diff --git a/deploy/k3s/foundation-results.json b/deploy/k3s/foundation-results.json deleted file mode 100644 index c13ecca..0000000 --- a/deploy/k3s/foundation-results.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "recorded_at": "2026-10-09T02:57:05.690026+00:00", - "branch": "feat/local-job-foundation", - "baseline_commit": "2f9b178", - "scope": "Parts 1\u20133 plus node-local persistent outputs. Shared datasets/downloads (4), deployment/login (5) remain.", - "api_image": "mist-api:foundation-20261008", - "api_image_id": "sha256:57ed3a9eebe54610f7353f29bbd24d93259f0d664e171381a5023a2d7d5e4770", - "checks": { - "frontend_interactions": 5, - "kubernetes_backend_tests": 12, - "src_test_suite": "passed with isolated Redis and existing Docker test image", - "cli_test_suite": "passed", - "typescript": "passed", - "production_build": "passed", - "changed_frontend_lint": "passed", - "browser_cpu_packaged_image": "passed", - "browser_two_nvidia_gpus": "passed", - "browser_tt_two_boards_four_chips": "passed", - "browser_exit_17_and_cancel": "passed", - "nvidia_occupied_queue_cancel_reuse": "passed", - "tt_occupied_queue_cancel_reuse": "passed", - "persistent_outputs_new_containers_both_nodes": "passed", - "literal_arguments_working_directory_output_alias": "passed", - "image_pull_reason_and_deadline_in_browser": "passed", - "history_survives_api_restarts": "passed", - "rbac_inventory_read_only": "passed" - }, - "browser_jobs": { - "packaged-cpu": { - "id": "mist-261e82c2848fc79b234afc4a", - "state": "Success", - "node": "utmist-z1opa08", - "device_count": 0 - }, - "tt-two-boards": { - "id": "mist-f9a86752969598c182c3d79f", - "state": "Success", - "node": "utmist-tt", - "device_count": 2 - }, - "packaged-two-gpus": { - "id": "mist-d3756747c2e68bf76ea2e876", - "state": "Success", - "node": "utmist-z1opa08", - "device_count": 2 - }, - "failure": { - "id": "mist-aa022009f288d22836d04b85", - "state": "Failure", - "node": "utmist-z1opa08", - "device_count": 0 - }, - "cancel": { - "id": "mist-99d4a51c2f49d394a8796ba3", - "state": "Cancelled", - "node": "utmist-z1opa08", - "device_count": 0 - } - }, - "allocation_jobs": { - "literal-arguments": "mist-2aee9108f5ef651e0b06eccc", - "nvidia-holder": "mist-cce552238d50aaf3fc8ab895", - "nvidia-queued": "mist-e0d28d07f23bd40653c65de0", - "tenstorrent-holder": "mist-5737ba8da7abaccd3a45698d", - "tenstorrent-queued": "mist-aa8e4101f47855166dfa4b36" - }, - "image_pull_failure_job": "mist-2e6965771e3330e013df1fc3", - "idle_hardware": { - "observed_at": "2026-10-09T02:57:05.530844763Z", - "machines": [ - { - "name": "utmist-z1opa08", - "address": "10.0.0.175", - "ready": true, - "schedulable": true, - "cpu_allocatable": "56", - "memory_allocatable": "164912728Ki" - }, - { - "name": "utmist-tt", - "address": "10.0.0.112", - "ready": true, - "schedulable": true, - "cpu_allocatable": "32", - "memory_allocatable": "511127964Ki" - } - ], - "pools": [ - { - "accelerator": "nvidia", - "node": "utmist-z1opa08", - "unit": "GPU", - "total": 2, - "allocated": 0, - "available": 2, - "ready": true - }, - { - "accelerator": "tenstorrent", - "node": "utmist-tt", - "unit": "board", - "total": 4, - "allocated": 0, - "available": 4, - "ready": true, - "chips_per_device": 2 - } - ] - }, - "job_history_count": 40, - "job_history_read_seconds": 0.193, - "evidence_directory": "/home/utmist/mist-foundation-results-2026-10-08", - "evidence_files": [ - "browser.json", - "foundation-acceptance.json", - "image-pull-failure.json", - "rbac.json", - "jobs-browser.png", - "machines-browser.png", - "nvidia-training-browser.png", - "image-pull-browser.png", - "cpu-persisted-files.txt", - "nvidia-persisted-files.txt", - "tenstorrent-persisted-files.txt" - ], - "limits": [ - "Trusted local single-owner pilot; no authenticated tenant isolation", - "Node-local output storage; no dataset uploads or browser downloads", - "TT uses tested image and host runtime; arbitrary models/autograd/distributed training not validated", - "Private registry secret wiring documented; private registry login not exercised", - "Jobs/output files retained; no automatic cleanup, storage quota or backup" - ] -} diff --git a/deploy/k3s/gpu-smoke-job.yaml b/deploy/k3s/gpu-smoke-job.yaml deleted file mode 100644 index 0aa711a..0000000 --- a/deploy/k3s/gpu-smoke-job.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: gpu-smoke - namespace: mist - labels: - app.kubernetes.io/name: mist-gpu-smoke -spec: - backoffLimit: 0 - activeDeadlineSeconds: 600 - template: - metadata: - labels: - app.kubernetes.io/name: mist-gpu-smoke - spec: - restartPolicy: Never - containers: - - name: vectoradd - image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0 - resources: - requests: - cpu: 250m - memory: 256Mi - nvidia.com/gpu: 1 - limits: - cpu: '1' - memory: 512Mi - nvidia.com/gpu: 1 diff --git a/deploy/k3s/mist-api-forward.service b/deploy/k3s/mist-api-forward.service deleted file mode 100644 index 648fa61..0000000 --- a/deploy/k3s/mist-api-forward.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=Mist Kubernetes API on localhost -After=network-online.target - -[Service] -ExecStart=/usr/local/bin/k3s kubectl --kubeconfig /home/utmist/.kube/config --namespace mist-system port-forward service/mist-api 3000:3000 --address 127.0.0.1 -Restart=always -RestartSec=2 - -[Install] -WantedBy=default.target diff --git a/deploy/k3s/mist-api-results.json b/deploy/k3s/mist-api-results.json deleted file mode 100644 index aab9beb..0000000 --- a/deploy/k3s/mist-api-results.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "verified_at": "2026-10-03T20:42:24.107077+00:00", - "status": "passed", - "implementation": { - "executor": "kubernetes (default)", - "workload_namespace": "mist", - "api_namespace": "mist-system", - "owner": "utmist (configured single owner, not authenticated)", - "api_url": "http://127.0.0.1:3000", - "jobs_url": "http://127.0.0.1:3001/jobs", - "api_image": "mist-api:k3s-pilot-20261003", - "api_image_config_digest": "sha256:d33a5da4e1761641292340b2f607d4ec8ce95afb5f76c2797044b30747a81743", - "api_image_index_digest": "sha256:54f36ea00c210f7d3c28a909404ae3b0eab4600a97e72deaee6db2b0b9642b6d" - }, - "cluster": { - "k3s_version": "v1.36.4+k3s1", - "nodes": { - "utmist-z1opa08": { - "internal_ip": "10.0.0.175", - "nvidia_rtx_a4000_gpus": 2 - }, - "utmist-tt": { - "internal_ip": "10.0.0.112", - "n300_boards": 4, - "chips_per_board": 2 - } - }, - "tt_operator": "0.3.0", - "fabric_manager": "0.2.30", - "tt_dra_driver": "0.0.59" - }, - "api_acceptance": { - "run": "api-1003-202246", - "submitted_jobs": 17, - "expected_terminal_states": { - "Success": 13, - "Failure": 2, - "Cancelled": 2 - }, - "invalid_submissions_rejected_without_creating_jobs": true, - "unmanaged_jobs_hidden_and_cancellation_denied": true, - "cpu_execution_and_persisted_output": true, - "actual_failure_exit_code": 17, - "deadline_failure_reported": true, - "cancelled_logs_retained": true, - "cancellation_released_whole_tt_reservation": true, - "gpu_queues_and_automatic_reuse": true, - "tt_queues_and_automatic_reuse": true, - "nvidia_gpu_counts_tested": [ - 1, - 2 - ], - "tt_board_counts_tested": [ - 1, - 2, - 3, - 4 - ], - "training": "Independent 32x32 regression per chip/GPU; NVIDIA autograd, TT explicit TT-NN gradients", - "concurrency": { - "nvidia": { - "concurrent_jobs": 2, - "first_device_training_overlap_seconds": 1.168433 - }, - "tenstorrent": { - "concurrent_jobs": 4, - "first_device_training_overlap_seconds": 9.202772 - } - }, - "archived_checkpoints_from_initial_17_jobs": { - "cpu": { - "persisted_output": true - }, - "nvidia": { - "training_results": 5, - "checkpoints": 5, - "max_validation_mse": 9.320668823420419e-07, - "convergence_and_checkpoint_reload_passed": true - }, - "tenstorrent": { - "training_results": 24, - "checkpoints": 24, - "max_validation_mse": 0.00017509252938907593, - "convergence_and_checkpoint_reload_passed": true - } - }, - "additional_three_board_job": { - "id": "mist-05fcb5a03c359c8a24890d84", - "state": "Success", - "chips_tested": 6, - "exit_code": 0 - } - }, - "clients": { - "cli_submit_status_logs_cancel": "passed", - "browser_cpu_submit_status_logs_cancel": "passed", - "browser_two_tt_boards_four_chip_training": "passed", - "browser_temporary_api_outage_recovery": "passed" - }, - "restart": { - "retained_jobs": 23, - "states_exit_codes_and_logs_preserved": true, - "local_port_forward_recovered": true - }, - "access_checks": [ - { - "verb": "create", - "resource": "jobs", - "namespace": "mist", - "allowed": true, - "expected": true - }, - { - "verb": "get", - "resource": "pods/log", - "namespace": "mist", - "allowed": true, - "expected": true - }, - { - "verb": "get", - "resource": "resourceclaims.resource.k8s.io", - "namespace": "mist", - "allowed": true, - "expected": true - }, - { - "verb": "get", - "resource": "secrets", - "namespace": "mist", - "allowed": false, - "expected": false - }, - { - "verb": "get", - "resource": "nodes", - "namespace": "mist", - "allowed": false, - "expected": false - }, - { - "verb": "create", - "resource": "pods/exec", - "namespace": "mist", - "allowed": false, - "expected": false - }, - { - "verb": "create", - "resource": "jobs", - "namespace": "gpu-operator", - "allowed": false, - "expected": false - } - ], - "tests": { - "backend_full_suite": "go -C src test -timeout 90s ./... passed with an isolated local Redis", - "backend_kubernetes_suite": "go -C src test -run TestKubernetes ./... passed", - "cli": "go -C cli test ./... passed", - "web_component_tests": "3 tests passed", - "web_production_build": "npm run build passed", - "typescript": "npx tsc --noEmit passed", - "default_executor_and_default_private_kubeconfig_loading": "passed" - }, - "evidence_directory": "/home/utmist/mist-api-results-2026-10-03", - "evidence_files": [ - "api-acceptance.json", - "checkpoint-verification.json", - "concurrency-verification.json", - "cpu-checkpoints.tar.gz", - "nvidia-checkpoints.tar.gz", - "tenstorrent-checkpoints.tar.gz", - "cli.json", - "browser.json", - "jobs-browser.png", - "rbac.json", - "restart.json", - "default-executor.json", - "three-boards.json", - "browser-recovery.json" - ], - "limits": [ - "Local single-owner pilot; no per-request authentication, credits or team quotas.", - "Node-local checkpoint PVCs shared by jobs of the same compute profile.", - "History depends on retained Kubernetes Jobs; normal logs depend on retained Pods and kubelet log retention.", - "Host-mounted TT-Metal/Python runtime; hugepage mounts are host-shared.", - "Independent chip tests do not validate large models, TT autograd, distributed training or arbitrary mesh topology.", - "Vendor ResourceSlice memory capacity is incorrect; claims do not use it for placement.", - "Legacy Docker/Redis supervisor remains incomplete; other web pages and authentication commands retain prototype behavior." - ] -} diff --git a/deploy/k3s/mist-api.yaml b/deploy/k3s/mist-api.yaml deleted file mode 100644 index 19f8a2b..0000000 --- a/deploy/k3s/mist-api.yaml +++ /dev/null @@ -1,243 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: mist-system ---- -apiVersion: v1 -kind: Namespace -metadata: - name: mist ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: mist-api - namespace: mist-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: mist-api - namespace: mist -rules: - - apiGroups: [batch] - resources: [jobs] - verbs: [get, list, create, update, delete] - - apiGroups: [""] - resources: [pods, events] - verbs: [get, list] - - apiGroups: [""] - resources: [pods/log] - verbs: [get] - - apiGroups: [""] - resources: [configmaps] - verbs: [get, create, update, delete] - - apiGroups: [resource.k8s.io] - resources: [resourceclaims, resourceclaimtemplates] - verbs: [get] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: mist-api - namespace: mist -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: mist-api -subjects: - - kind: ServiceAccount - name: mist-api - namespace: mist-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: mist-hardware-reader -rules: - - apiGroups: [""] - resources: [nodes, pods] - verbs: [list] - - apiGroups: [resource.k8s.io] - resources: [resourceclaims, resourceslices] - verbs: [list] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: mist-hardware-reader -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: mist-hardware-reader -subjects: - - kind: ServiceAccount - name: mist-api - namespace: mist-system ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: mist-cpu-checkpoints - namespace: mist -spec: - accessModes: [ReadWriteOnce] - storageClassName: local-path - resources: - requests: - storage: 256Mi ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: training-nvidia-checkpoints - namespace: mist -spec: - accessModes: [ReadWriteOnce] - storageClassName: local-path - resources: - requests: - storage: 256Mi ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: training-tenstorrent-checkpoints - namespace: mist -spec: - accessModes: [ReadWriteOnce] - storageClassName: local-path - resources: - requests: - storage: 256Mi ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: mist-api - namespace: mist-system -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - app: mist-api - template: - metadata: - labels: - app: mist-api - spec: - serviceAccountName: mist-api - nodeSelector: - kubernetes.io/hostname: utmist-z1opa08 - securityContext: - runAsNonRoot: true - runAsUser: 65532 - seccompProfile: - type: RuntimeDefault - containers: - - name: api - image: mist-api:folders-20261021 - imagePullPolicy: Never - ports: - - name: http - containerPort: 3000 - env: - - name: MIST_TEAMS_ENABLED - value: "true" - - name: MIST_INTERNAL_TOKEN - valueFrom: - secretKeyRef: - name: mist-internal-auth - key: MIST_INTERNAL_TOKEN - - name: MIST_EXECUTOR - value: kubernetes - - name: MIST_HTTP_ADDR - value: 0.0.0.0:3000 - - name: MIST_NAMESPACE - value: mist - - name: MIST_PILOT_OWNER - value: utmist - # Local examples must be built/imported on the CPU/NVIDIA node. - # Registry-backed images are approved here using exact references. - - name: MIST_ALLOWED_IMAGES - value: "python:3.10-slim,pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime,ghcr.io/tenstorrent/tt-metal/tt-metalium/ubuntu-22.04-dev-amd64:6b765c0bc2b40ea02566d169d7b0ee902377ba04,busybox:1.36,alpine:3.16.3,nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0,mist-training:cpu-v1,mist-training:nvidia-v1" - - name: MIST_AUTH_DATABASE - value: /data/auth.sqlite - - name: BETTER_AUTH_SECRET - valueFrom: - secretKeyRef: - name: mist-auth-bootstrap - key: BETTER_AUTH_SECRET - - name: MIST_ADMIN_EMAIL - valueFrom: - secretKeyRef: - name: mist-auth-bootstrap - key: MIST_ADMIN_EMAIL - - name: MIST_ADMIN_PASSWORD - valueFrom: - secretKeyRef: - name: mist-auth-bootstrap - key: MIST_ADMIN_PASSWORD - - name: MIST_TRUSTED_PROXY_IPS - value: "10.42.0.1,10.0.0.175,127.0.0.1" - - name: MIST_LEGACY_OWNER_EMAIL - value: utmist.infra@gmail.com - - name: MIST_ALLOWED_ORIGINS - value: http://100.73.139.66:8088,http://utmist.tail459b5e.ts.net:8088,http://127.0.0.1:8088,http://127.0.0.1:3001,http://localhost:3001,https://utmist.tail459b5e.ts.net - - name: MIST_STORAGE_ROOT - value: /storage - - name: MIST_NFS_SERVER - value: 192.168.240.2 - - name: MIST_NFS_ROOT - value: /srv/mist-data - - name: MIST_SHARED_PVC - value: mist-folder-jobs - volumeMounts: - - name: storage - mountPath: /storage - - name: auth-data - mountPath: /data - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - capabilities: - drop: [ALL] - resources: - requests: - cpu: 100m - memory: 128Mi - limits: - cpu: "2" - memory: 512Mi - readinessProbe: - httpGet: - path: /healthz - port: http - initialDelaySeconds: 2 - livenessProbe: - httpGet: - path: /healthz - port: http - initialDelaySeconds: 15 - periodSeconds: 15 - volumes: - - name: storage - persistentVolumeClaim: - claimName: mist-folder-api - - name: auth-data - persistentVolumeClaim: - claimName: mist-auth-data ---- -apiVersion: v1 -kind: Service -metadata: - name: mist-api - namespace: mist-system -spec: - selector: - app: mist-api - ports: - - port: 3000 - targetPort: http diff --git a/deploy/k3s/mist-tenstorrent-claims.yaml b/deploy/k3s/mist-tenstorrent-claims.yaml deleted file mode 100644 index 6436108..0000000 --- a/deploy/k3s/mist-tenstorrent-claims.yaml +++ /dev/null @@ -1,72 +0,0 @@ -# One per-pod claim; n300 count is boards, not individual chips. -apiVersion: resource.k8s.io/v1 -kind: ResourceClaimTemplate -metadata: - name: mist-tenstorrent-1-boards - namespace: mist -spec: - spec: - devices: - requests: - - name: boards - exactly: - deviceClassName: tenstorrent.com - count: 1 - selectors: - - cel: - expression: device.attributes["tenstorrent.com"].boardName == "n300" - && device.attributes["tenstorrent.com"].chipCount == 2 ---- -apiVersion: resource.k8s.io/v1 -kind: ResourceClaimTemplate -metadata: - name: mist-tenstorrent-2-boards - namespace: mist -spec: - spec: - devices: - requests: - - name: boards - exactly: - deviceClassName: tenstorrent.com - count: 2 - selectors: - - cel: - expression: device.attributes["tenstorrent.com"].boardName == "n300" - && device.attributes["tenstorrent.com"].chipCount == 2 ---- -apiVersion: resource.k8s.io/v1 -kind: ResourceClaimTemplate -metadata: - name: mist-tenstorrent-3-boards - namespace: mist -spec: - spec: - devices: - requests: - - name: boards - exactly: - deviceClassName: tenstorrent.com - count: 3 - selectors: - - cel: - expression: device.attributes["tenstorrent.com"].boardName == "n300" - && device.attributes["tenstorrent.com"].chipCount == 2 ---- -apiVersion: resource.k8s.io/v1 -kind: ResourceClaimTemplate -metadata: - name: mist-tenstorrent-4-boards - namespace: mist -spec: - spec: - devices: - requests: - - name: boards - exactly: - deviceClassName: tenstorrent.com - count: 4 - selectors: - - cel: - expression: device.attributes["tenstorrent.com"].boardName == "n300" - && device.attributes["tenstorrent.com"].chipCount == 2 diff --git a/deploy/k3s/mist-web.service b/deploy/k3s/mist-web.service deleted file mode 100644 index 9a136d7..0000000 --- a/deploy/k3s/mist-web.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Mist web interface on localhost -After=mist-api-forward.service - -[Service] -WorkingDirectory=/home/utmist/Mist/web-interface -ExecStart=/home/utmist/.local/share/mist-runtimes/node-22.16.0/bin/node /home/utmist/Mist/web-interface/node_modules/vite/bin/vite.js --host 127.0.0.1 --port 3001 --strictPort -Environment=MIST_API_PROXY=http://127.0.0.1:3000 -Restart=always -RestartSec=2 - -[Install] -WantedBy=default.target diff --git a/deploy/k3s/nvidia-gpu-operator-values.yaml b/deploy/k3s/nvidia-gpu-operator-values.yaml deleted file mode 100644 index 5d897e5..0000000 --- a/deploy/k3s/nvidia-gpu-operator-values.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# This node already has a working NVIDIA host driver. Let the operator install -# the container toolkit and device plugin without replacing that driver. -driver: - enabled: false - -# CDI handles allocated workload GPUs. Enable the NRI plugin for GPU management -# containers without changing k3s's containerd runtime configuration. This is -# intended for the pilot; NVIDIA documents the NRI plugin as not yet GA. -cdi: - nriPluginEnabled: true diff --git a/deploy/k3s/setup-runbook.md b/deploy/k3s/setup-runbook.md deleted file mode 100644 index 643eb3a..0000000 --- a/deploy/k3s/setup-runbook.md +++ /dev/null @@ -1,9 +0,0 @@ -# Current k3s setup runbook - -The maintained two-node runbook is [k3s setup and accelerator handoff](../../docs/content/k3s-setup.md). -It covers current versions, LAN/Tailscale roles, fresh server/worker boundaries, -NVIDIA/TT operators, diagnostics and troubleshooting. - -- [Tailscale and administrator SSH](../../docs/content/tailscale-ssh.md) -- [Application deployment and service operations](../private/README.md) -- [Original single-node installation and worker-join history](../../docs/content/archive/k3s-setup-history.md) diff --git a/deploy/k3s/storage/README.md b/deploy/k3s/storage/README.md deleted file mode 100644 index 9a15f42..0000000 --- a/deploy/k3s/storage/README.md +++ /dev/null @@ -1,144 +0,0 @@ -# Shared folders over direct Ethernet - -Storage implementation for the two-machine installation, October 21, 2026. -The authoritative data for new submissions is an ordinary directory on QuietBox's -existing disk. There are no new disk images, loop devices or per-team mounts. - -```text -NVIDIA enp6s0 192.168.240.1/30 - | - direct 1-Gbps Ethernet - | -QuietBox enp200s0 192.168.240.2/30 - /srv/mist-data/ - .mist-storage-layout.json - metadata/provision-requests/ API-owned desired teams - metadata/provision-status/ readiness and sampled usage - teams// - datasets/ - metadata/datasets/ published dataset records - .uploads/ upload staging - common/datasets//content/ - members//datasets//content/ - results/ - common/jobs//outputs/ - members//jobs//outputs/ -``` - -## Access and limits - -- Accounts and sessions remain in the main-node local SQLite PVC, separate from - shared files. Go handles authentication and team authorization. -- All members can read their team's folders. A member writes their own folder; - common writes require permission. Other teams require an explicit grant. -- Kubernetes mounts only the selected dataset and the job's output directory. - Datasets are read-only at `/inputs`; results are writable at `/outputs`. -- `storage_gib` and `model_storage_gib` remain API fields, with defaults of - 200 and 500 GiB. They are **advisory allowances**. They neither reserve physical - space nor prevent job writes. They may be raised/lowered without migration. -- Every team shares the underlying disk. No equal-space guarantee or automatic - backup, replication, dataset cache or result deletion is provided. -- Uploads use current disk free space minus 1 GiB, plus an optional - `MIST_MAX_DATASET_GIB` ceiling. Jobs can still exhaust the shared disk. - ZIP processing needs both archive and extraction space. Transfers stream; - interrupted uploads restart. Existing CPU/device/runtime policies remain hard - admission limits. - -## Provisioning and usage - -`team_folders.py` is a local root-owned service without a network listener or -cluster credentials. It accepts bounded API-owned manifests, creates directories, -rejects symlinks/unexpected mounts and publishes `shared-folders-v1` readiness. -Usage counts logical regular-file bytes, excludes symlinks, and deduplicates hard -links within each pool. The host samples every 30 seconds; active writes may make -these approximate. The API does not walk the NFS directory tree for every poll. - -`GET /storage` reports: - -- `capacity_bytes`, `available_bytes`: actual shared filesystem space. -- `dataset_used_bytes`, `model_used_bytes`: sampled team file usage. -- `model_capacity_bytes`, `model_available_bytes`: compatibility aliases for the - same shared disk, not a separate model filesystem or reservation. -- `dataset_allocation_gib`, `model_allocation_gib`: advisory values. -- `storage_limits_enforced: false`, `storage_mode: shared-folders`. -- `usage_observed_at`, `usage_stale`, `storage_low`: freshness and disk warning. - -The old `GET /teams` field `storage_budget_gib` remains informational shared -capacity for compatibility. Allocations are not summed into a reservation budget. - -## Host setup - -Run commands as root in the **owning host's** mount/network namespace. Scripts -are installation-specific; verify interface names/addresses on another system. - -On NVIDIA: - -```bash -bash deploy/k3s/storage/setup-storage-link.sh main -``` - -On QuietBox, from a checkout/copy of these files: - -```bash -bash deploy/k3s/storage/setup-storage-link.sh quietbox -bash deploy/k3s/storage/setup-quietbox.sh -install -d -m 0755 /usr/local/lib/mist -install -m 0755 deploy/k3s/storage/team_folders.py /usr/local/lib/mist/team_folders.py -install -m 0644 deploy/k3s/storage/mist-team-storage.service /etc/systemd/system/ -systemctl daemon-reload -systemctl enable --now mist-team-storage -``` - -The NetworkManager profile `mist-storage-direct` persists addresses without a -gateway. Existing LAN/default routes, Tailscale and k3s node addresses stay in use. -NFS permits only `192.168.240.1` and `192.168.240.2`; the firewall allows main's -TCP 2049 on `enp200s0`. Root squash maps root requests to the storage API identity. - -New bindings use NFS **4.1**. During inspection, Linux reused an existing 4.2 -connection to QuietBox's old LAN address even when mounting its Ethernet alias. -A separate 4.1 connection makes the new Ethernet transport verifiable without -tearing down existing old mounts. Verify both the mount and TCP connection, not -only the requested mount address. - -The initial cutover uses new `mist-folder-api`/`mist-folder-jobs` bindings and -per-team `team-datasets`/`team-results` claims, leaving old bindings intact. -Apply `shared.yaml` and the API deployment, then wait for new team readiness. -`ensureVolume` refuses an existing binding pointing to a different NFS export. - -## Prelaunch reset and rollback - -The user chose fresh storage without data migration. Old files under -`/srv/mist-storage` and its backing images remain untouched as rollback material. -Old retained Jobs may still appear in history; their old files are not copied to -the new root. New datasets and results use `/srv/mist-data`. - -Before cutover, record the API/auth deployment specifications, web release target -and team policies. Create a consistent SQLite backup using its database backup -API. Pause the old API/auth before the Go-auth API takes the shared auth PVC. - -Rollback restores the previous API/auth deployment and provisioning unit, and -repoints Nginx's web release symlink. Old volumes were not replaced or deleted. -An operational rollback after accepting new writes must account for those writes; -this is a prelaunch cutover, not automatic bidirectional migration. - -## Verify - -```bash -python3 -m unittest discover -s deploy/k3s/storage -p test_folders.py -v -python3 deploy/k3s/verify_storage_folders.py --out /tmp/mist-storage-check -``` - -The live verifier creates two workspaces and a regular account, checks small -uploads/downloads, archive rejection and team isolation, then trains on one -NVIDIA GPU and one n300 board. It retains a protected account file in its output -directory for optional browser review; never commit that file. Completed test -jobs/results remain inspectable. It does not migrate or delete old research data. - -Optional browser review uses Playwright from `MIST_PLAYWRIGHT_MODULE` (the local -installation defaults to `/tmp/mist-browser-check/node_modules/playwright/index.mjs`): - -```bash -MIST_STORAGE_EVIDENCE_DIR=/tmp/mist-storage-check node deploy/k3s/verify_storage_folders_browser.mjs -``` - -Recorded live results: [October 21 evidence](../evidence/storage-2026-10-21/README.md). diff --git a/deploy/k3s/storage/mist-team-storage.service b/deploy/k3s/storage/mist-team-storage.service deleted file mode 100644 index 2ffc705..0000000 --- a/deploy/k3s/storage/mist-team-storage.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=Mist shared team folders and usage reporting -After=local-fs.target nfs-server.service -RequiresMountsFor=/srv/mist-data -Requires=nfs-server.service - -[Service] -Type=simple -Environment=MIST_STORAGE_ROOT=/srv/mist-data -ExecStart=/usr/bin/python3 /usr/local/lib/mist/team_folders.py -Restart=on-failure -RestartSec=5 -UMask=0077 - -[Install] -WantedBy=multi-user.target diff --git a/deploy/k3s/storage/setup-quietbox.sh b/deploy/k3s/storage/setup-quietbox.sh deleted file mode 100755 index 799941f..0000000 --- a/deploy/k3s/storage/setup-quietbox.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash -# Initialize ordinary storage folders on QuietBox. Never formats/mounts a disk. -set -euo pipefail -[ "$(id -u)" -eq 0 ] || { echo 'Run as root on QuietBox' >&2; exit 1; } -root=/srv/mist-data -[ ! -L "$root" ] || { echo 'Refusing a symlink storage root' >&2; exit 1; } -if [ -d "$root" ] && [ -n "$(ls -A "$root")" ] && [ ! -f "$root/.mist-storage-layout.json" ]; then - echo 'Refusing to adopt a nonempty unknown directory' >&2 - exit 1 -fi -install -d -o 65532 -g 65532 -m 0750 "$root" -if [ -e "$root/.mist-storage-layout.json" ]; then - python3 - "$root" <<'PY' -import json, sys -from pathlib import Path -marker = Path(sys.argv[1]) / '.mist-storage-layout.json' -assert not marker.is_symlink() -assert json.loads(marker.read_text())['layout'] == 'shared-folders-v1' -PY -else - printf '{"layout":"shared-folders-v1"}\n' > "$root/.mist-storage-layout.json" - chmod 0644 "$root/.mist-storage-layout.json" -fi -install -d -o 65532 -g 65532 -m 0700 "$root/metadata" "$root/metadata/provision-requests" "$root/metadata/provision-status" -install -d -o 65532 -g 65532 -m 0755 "$root/teams" -install -d /etc/exports.d /etc/nfs.conf.d -cat > /etc/exports.d/mist-folders.exports <<'EXPORT' -/srv/mist-data 192.168.240.1(rw,sync,no_subtree_check,root_squash,anonuid=65532,anongid=65532,fsid=8410) 192.168.240.2(rw,sync,no_subtree_check,root_squash,anonuid=65532,anongid=65532,fsid=8410) -EXPORT -cat > /etc/nfs.conf.d/mist.conf <<'CONF' -[nfsd] -vers3=n -vers4=y -CONF -systemctl enable --now nfs-server -exportfs -ra -if ufw status | grep -q 'Status: active'; then - ufw allow in on enp200s0 from 192.168.240.1 to any port 2049 proto tcp comment mist-direct-nfs -fi -findmnt -T "$root" -df -h "$root" diff --git a/deploy/k3s/storage/setup-storage-link.sh b/deploy/k3s/storage/setup-storage-link.sh deleted file mode 100644 index 33ced6c..0000000 --- a/deploy/k3s/storage/setup-storage-link.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash -# Run on each owning host as root. No gateway or cluster-interface changes. -set -euo pipefail -case "${1:-}" in - main) iface=enp6s0; address=192.168.240.1/30 ;; - quietbox) iface=enp200s0; address=192.168.240.2/30 ;; - *) echo 'Usage: setup-storage-link.sh main|quietbox' >&2; exit 2 ;; -esac -[ "$(id -u)" -eq 0 ] || { echo 'Run as root on the owning host' >&2; exit 1; } -[ "$(cat "/sys/class/net/$iface/carrier")" = 1 ] || { echo "$iface has no cable link" >&2; exit 1; } -[ -z "$(ip -4 route show default dev "$iface")" ] || { echo 'Refusing to replace a default-route connection' >&2; exit 1; } -profile=mist-storage-direct -current=$(nmcli -g GENERAL.CONNECTION device show "$iface") -install -d -m 0700 /var/lib/mist -if [ -n "$current" ] && [ "$current" != '--' ] && [ "$current" != "$profile" ]; then - uuid=$(nmcli -g connection.uuid connection show "$current") - auto=$(nmcli -g connection.autoconnect connection show "$uuid") - record=/var/lib/mist/storage-link-previous.txt - if [ ! -f "$record" ]; then - printf '%s\n%s\n%s\n' "$iface" "$uuid" "$auto" > "$record" - chmod 0600 "$record" - fi - nmcli connection modify "$uuid" connection.autoconnect no -fi -if nmcli connection show "$profile" >/dev/null 2>&1; then - [ "$(nmcli -g connection.interface-name connection show "$profile")" = "$iface" ] || exit 1 -else - nmcli connection add type ethernet ifname "$iface" con-name "$profile" -fi -nmcli connection modify "$profile" \ - connection.autoconnect yes connection.autoconnect-priority 100 \ - ipv4.method manual ipv4.addresses "$address" ipv4.gateway '' \ - ipv4.dns '' ipv4.never-default yes ipv6.method disabled -nmcli --wait 15 connection up "$profile" -ip -4 address show dev "$iface" diff --git a/deploy/k3s/storage/shared.yaml b/deploy/k3s/storage/shared.yaml deleted file mode 100644 index 5298e0d..0000000 --- a/deploy/k3s/storage/shared.yaml +++ /dev/null @@ -1,62 +0,0 @@ -apiVersion: v1 -kind: PersistentVolume -metadata: - name: mist-folder-api -spec: - capacity: - storage: 1Gi - accessModes: [ReadWriteMany] - persistentVolumeReclaimPolicy: Retain - storageClassName: "" - claimRef: - name: mist-folder-api - namespace: mist-system - mountOptions: [nfsvers=4.1, hard, timeo=100, retrans=2] - nfs: - server: 192.168.240.2 - path: /srv/mist-data ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: mist-folder-api - namespace: mist-system -spec: - storageClassName: "" - volumeName: mist-folder-api - accessModes: [ReadWriteMany] - resources: - requests: - # Static NFS binding declaration, not a quota. API reports real disk space. - storage: 1Gi ---- -apiVersion: v1 -kind: PersistentVolume -metadata: - name: mist-folder-jobs -spec: - capacity: - storage: 1Gi - accessModes: [ReadWriteMany] - persistentVolumeReclaimPolicy: Retain - storageClassName: "" - claimRef: - name: mist-folder-jobs - namespace: mist - mountOptions: [nfsvers=4.1, hard, timeo=100, retrans=2] - nfs: - server: 192.168.240.2 - path: /srv/mist-data ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: mist-folder-jobs - namespace: mist -spec: - storageClassName: "" - volumeName: mist-folder-jobs - accessModes: [ReadWriteMany] - resources: - requests: - storage: 1Gi diff --git a/deploy/k3s/storage/team_folders.py b/deploy/k3s/storage/team_folders.py deleted file mode 100644 index 50c6efc..0000000 --- a/deploy/k3s/storage/team_folders.py +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env python3 -"""Prepare ordinary team directories and publish usage; never format or migrate. - -Only bounded API-owned requests outside workload mounts are accepted. Allowances -are advisory. The filesystem's real free space is shared by all teams. -""" -import json -import os -from pathlib import Path -import re -import stat -import tempfile -import time - -LAYOUT = 'shared-folders-v1' -TEAM_ID = re.compile(r'^team-[a-f0-9]{16}$') - - -class FolderStore: - def __init__(self, root, uid=65532, gid=65532): - self.root = Path(root) - self.uid, self.gid = uid, gid - marker = self.root / '.mist-storage-layout.json' - if self.root.is_symlink() or marker.is_symlink(): - raise ValueError('storage root and layout marker must not be symlinks') - if json.loads(marker.read_text()).get('layout') != LAYOUT: - raise ValueError('shared-folder storage has not been initialized') - self.device = self.root.stat().st_dev - self.requests = self.directory('metadata/provision-requests', 0o700) - self.status = self.directory('metadata/provision-status', 0o700) - self.directory('teams', 0o755) - - def directory(self, relative, mode): - path = self.root - parts = Path(relative).parts - if not parts or any(part in ('.', '..', '/') for part in parts): - raise ValueError('invalid storage directory') - for part in parts: - path = path / part - if not path.exists() and not path.is_symlink(): - path.mkdir(mode=0o750) - os.chown(path, self.uid, self.gid) - entry = path.lstat() - if not stat.S_ISDIR(entry.st_mode) or entry.st_dev != self.device: - raise ValueError('storage directories must be ordinary directories on the shared disk') - os.chmod(path, mode) - os.chown(path, self.uid, self.gid) - return path - - def request(self, path): - entry = path.lstat() - if (not TEAM_ID.fullmatch(path.stem) or not stat.S_ISREG(entry.st_mode) - or entry.st_uid != self.uid or entry.st_size > 1024): - raise ValueError('request must be a bounded API-owned regular file') - body = json.loads(path.read_text()) - if set(body) != {'id', 'storage_gib', 'model_storage_gib'} or body['id'] != path.stem: - raise ValueError('invalid team request schema') - for key in ('storage_gib', 'model_storage_gib'): - if type(body[key]) is not int or not 1 <= body[key] <= 2**20: - raise ValueError('invalid advisory allowance') - return body - - @staticmethod - def usage(path): - """Logical regular-file bytes. Never follow workload-created symlinks.""" - total = 0 - device = path.stat().st_dev - seen = set() - def failed(error): - if not isinstance(error, FileNotFoundError): - raise error - for _, _, files, descriptor in os.fwalk(path, follow_symlinks=False, onerror=failed): - if os.fstat(descriptor).st_dev != device: - raise ValueError('unexpected nested filesystem in team storage') - for name in files: - try: - info = os.stat(name, dir_fd=descriptor, follow_symlinks=False) - except FileNotFoundError: - continue # A live job may rename/delete files during sampling. - if stat.S_ISREG(info.st_mode): - identity = (info.st_dev, info.st_ino) - if identity not in seen: - total += info.st_size - seen.add(identity) - return total - - def provision(self, body, previous=None): - team = body['id'] - if not TEAM_ID.fullmatch(team): - raise ValueError('invalid team ID') - datasets = self.directory(f'teams/{team}/datasets', 0o750) - results = self.directory(f'teams/{team}/results', 0o750) - for name in ('metadata', 'metadata/datasets', '.uploads'): - self.directory(f'teams/{team}/datasets/{name}', 0o700) - for pool in ('datasets', 'results'): - for scope in ('common', 'members'): - self.directory(f'teams/{team}/{pool}/{scope}', 0o755) - usage = previous or {} - if time.time() - usage.get('usage_observed_unix', 0) >= 30: - usage = {'dataset_used_bytes': self.usage(datasets), - 'model_used_bytes': self.usage(results), - 'usage_observed_unix': int(time.time())} - return {**body, 'state': 'Ready', 'layout': LAYOUT, - **{key: usage[key] for key in - ('dataset_used_bytes', 'model_used_bytes', 'usage_observed_unix')}} - - def publish(self, team, value): - path = self.status / f'{team}.json' - serialized = json.dumps(value, sort_keys=True) - if path.exists() and not path.is_symlink() and path.read_text() == serialized: - return - fd, temporary = tempfile.mkstemp(prefix='.mist-', dir=self.status) - try: - with os.fdopen(fd, 'w') as stream: - stream.write(serialized) - stream.flush() - os.fsync(stream.fileno()) - os.chown(temporary, self.uid, self.gid) - os.replace(temporary, path) - finally: - if os.path.exists(temporary): - os.unlink(temporary) - - def reconcile(self, cache): - for path in sorted(self.requests.glob('team-*.json')): - try: - body = self.request(path) - except Exception as error: - print(f'Request rejected: {path.name}: {error}', flush=True) - continue - try: - value = self.provision(body, cache.get(body['id'])) - cache[body['id']] = value - except Exception as error: - value = {'state': 'Error', 'layout': LAYOUT, 'error': str(error)} - print(f"Provisioning failed: {body['id']}: {error}", flush=True) - self.publish(body['id'], value) - - -def main(): - if os.geteuid() != 0: - raise SystemExit('Run as root on the storage host') - store = FolderStore(os.environ.get('MIST_STORAGE_ROOT', '/srv/mist-data')) - cache = {} - while True: - store.reconcile(cache) - time.sleep(2) - - -if __name__ == '__main__': - main() diff --git a/deploy/k3s/storage/test_folders.py b/deploy/k3s/storage/test_folders.py deleted file mode 100644 index 714afd9..0000000 --- a/deploy/k3s/storage/test_folders.py +++ /dev/null @@ -1,95 +0,0 @@ -import json -import os -from pathlib import Path -import tempfile -import unittest - -from team_folders import FolderStore, LAYOUT - - -class FolderTests(unittest.TestCase): - def setUp(self): - self.temporary = tempfile.TemporaryDirectory() - self.addCleanup(self.temporary.cleanup) - self.root = Path(self.temporary.name) - (self.root / '.mist-storage-layout.json').write_text(json.dumps({'layout': LAYOUT})) - self.store = FolderStore(self.root, os.getuid(), os.getgid()) - self.team = 'team-aaaaaaaaaaaaaaaa' - self.body = {'id': self.team, 'storage_gib': 200, 'model_storage_gib': 500} - - def request(self, body): - path = self.store.requests / f'{self.team}.json' - path.write_text(json.dumps(body)) - return path - - def test_plain_folders_preserve_files_and_allow_lower_allowances(self): - ready = self.store.provision(self.body) - data = self.root / 'teams' / self.team / 'datasets' - models = data.parent / 'results' - (data / 'common' / 'tiny.csv').write_bytes(b'1,2\n') - (models / 'common' / 'model.bin').write_bytes(b'weights') - lower = {**self.body, 'storage_gib': 1, 'model_storage_gib': 1} - updated = self.store.provision(lower) - self.assertEqual(ready['layout'], LAYOUT) - self.assertEqual(updated['dataset_used_bytes'], 4) - self.assertEqual(updated['model_used_bytes'], 7) - self.assertEqual(updated['storage_gib'], 1) - self.assertEqual(data.stat().st_dev, models.stat().st_dev) - self.assertFalse(list(self.root.rglob('*.img'))) - - def test_usage_does_not_follow_links_or_double_count_hardlinks(self): - self.store.provision(self.body) - data = self.root / 'teams' / self.team / 'datasets' - (data / 'common' / 'data').write_bytes(b'123') - os.link(data / 'common' / 'data', data / 'common' / 'alias') - (data / 'common' / 'outside').symlink_to('/etc') - (data / 'common' / 'file-link').symlink_to('/etc/passwd') - self.assertEqual(FolderStore.usage(data), 3) - - def test_unsafe_paths_fail_and_do_not_change_target(self): - outside = self.root / 'outside' - outside.mkdir(mode=0o700) - (self.root / 'teams' / self.team).symlink_to(outside) - with self.assertRaises(ValueError): - self.store.provision(self.body) - self.assertEqual(list(outside.iterdir()), []) - - def test_requests_reject_symlinks_invalid_schema_ids_and_allowances(self): - path = self.request(self.body) - self.assertEqual(self.store.request(path), self.body) - for body in [dict(self.body, storage_gib=True), dict(self.body, model_storage_gib=0), - dict(self.body, id='../outside'), dict(self.body, extra='unexpected')]: - self.request(body) - with self.assertRaises(ValueError): - self.store.request(path) - path.unlink() - target = self.root / 'request.json' - target.write_text(json.dumps(self.body)) - path.symlink_to(target) - with self.assertRaises(ValueError): - self.store.request(path) - - def test_reconciliation_publishes_errors_and_recovers(self): - self.request(self.body) - cache = {} - self.store.reconcile(cache) - path = self.store.status / f'{self.team}.json' - self.assertEqual(json.loads(path.read_text())['state'], 'Ready') - results = self.root / 'teams' / self.team / 'results' - results.rename(results.with_name('retained')) - results.symlink_to('/tmp') - self.store.reconcile(cache) - self.assertEqual(json.loads(path.read_text())['state'], 'Error') - results.unlink() - results.with_name('retained').rename(results) - self.store.reconcile(cache) - self.assertEqual(json.loads(path.read_text())['state'], 'Ready') - - def test_uninitialized_root_is_refused(self): - (self.root / '.mist-storage-layout.json').write_text('{"layout":"old-image-layout"}') - with self.assertRaises(ValueError): - FolderStore(self.root, os.getuid(), os.getgid()) - - -if __name__ == '__main__': - unittest.main() diff --git a/deploy/k3s/submit_tenstorrent_smoke.py b/deploy/k3s/submit_tenstorrent_smoke.py deleted file mode 100644 index bec956a..0000000 --- a/deploy/k3s/submit_tenstorrent_smoke.py +++ /dev/null @@ -1,59 +0,0 @@ -"""Submit a uniquely named training check reserving one to four n300 boards. - -Uses the admin KUBECONFIG, k3s kubectl, and Python PyYAML. This submits the -small TT-NN regression test; application/model integration is separate. -""" - -import argparse -import copy -from pathlib import Path -import re -import subprocess - -import yaml - - -def manifests(name, boards, steps): - docs = list(yaml.safe_load_all(Path(__file__).with_name("training-tenstorrent-job.yaml").read_text())) - pvc, claim, job = copy.deepcopy(docs) - claim["metadata"]["name"] = f"training-tenstorrent-{boards}-boards" - claim["spec"]["spec"]["devices"]["requests"][0]["exactly"]["count"] = boards - job["metadata"]["name"] = name - pod = job["spec"]["template"]["spec"] - pod["resourceClaims"][0]["resourceClaimTemplateName"] = claim["metadata"]["name"] - train = pod["containers"][0] - train["command"] = train["command"][:4] + ["--expected-devices", str(boards * 2), - "--steps", str(steps), "--output", f"/checkpoints/{name}"] - for resources in (train["resources"]["requests"], train["resources"]["limits"]): - resources["hugepages-1Gi"] = f"{boards * 2}Gi" - train["resources"]["requests"]["cpu"] = str(boards * 2) - train["resources"]["requests"]["memory"] = f"{boards * 4}Gi" - train["resources"]["limits"]["cpu"] = str(boards * 8) - train["resources"]["limits"]["memory"] = f"{boards * 8}Gi" - return pvc, claim, job - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("name", help="Unique Kubernetes Job name; also used for the checkpoint directory") - parser.add_argument("--boards", type=int, choices=range(1, 5), default=1) - parser.add_argument("--steps", type=int, default=100) - parser.add_argument("--dry-run", action="store_true", help="Print the manifests without changing the cluster") - args = parser.parse_args() - if len(args.name) > 63 or not re.fullmatch(r"[a-z0-9](?:[-a-z0-9]*[a-z0-9])?", args.name): - parser.error("name must be a DNS label with at most 63 characters") - if args.steps < 100: - parser.error("at least 100 steps are required for the convergence check") - pvc, claim, job = manifests(args.name, args.boards, args.steps) - if args.dry_run: - print(yaml.safe_dump_all([pvc, claim, job]), end="") - else: - subprocess.run(["k3s", "kubectl", "apply", "-f", "-"], - input=yaml.safe_dump_all([pvc, claim]), text=True, check=True) - configmap = subprocess.run(["k3s", "kubectl", "-n", "mist", "create", "configmap", - "training-smoke-script", "--from-file=" + str(Path(__file__).with_name("training_smoke.py")), - "--dry-run=client", "-o", "yaml"], text=True, capture_output=True, check=True).stdout - subprocess.run(["k3s", "kubectl", "apply", "-f", "-"], input=configmap, text=True, check=True) - subprocess.run(["k3s", "kubectl", "create", "-f", "-"], - input=yaml.safe_dump(job), text=True, check=True) - print(f"Requested {args.boards} board(s), {args.boards * 2} chips; checkpoints: /checkpoints/{args.name}") diff --git a/deploy/k3s/team-rbac.yaml b/deploy/k3s/team-rbac.yaml deleted file mode 100644 index 0a44d35..0000000 --- a/deploy/k3s/team-rbac.yaml +++ /dev/null @@ -1,39 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: mist-team-controller -rules: - - apiGroups: [""] - resources: [namespaces, configmaps, persistentvolumes, persistentvolumeclaims, resourcequotas] - verbs: [get, list, create, update, patch] - - apiGroups: [""] - resources: [configmaps] - verbs: [delete] - - apiGroups: [batch] - resources: [jobs] - verbs: [get, list, create, update, patch, delete] - - apiGroups: [""] - resources: [pods, events] - verbs: [get, list] - - apiGroups: [""] - resources: [pods/log] - verbs: [get] - - apiGroups: [resource.k8s.io] - resources: [resourceclaims, resourceclaimtemplates] - verbs: [get, list, create] - - apiGroups: [networking.k8s.io] - resources: [networkpolicies] - verbs: [get, list, create, update] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: mist-team-controller -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: mist-team-controller -subjects: - - kind: ServiceAccount - name: mist-api - namespace: mist-system diff --git a/deploy/k3s/team-workload-policy.yaml b/deploy/k3s/team-workload-policy.yaml deleted file mode 100644 index f12757e..0000000 --- a/deploy/k3s/team-workload-policy.yaml +++ /dev/null @@ -1,38 +0,0 @@ -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingAdmissionPolicy -metadata: - name: mist-team-boundary -spec: - failurePolicy: Fail - matchConstraints: - resourceRules: - - apiGroups: [""] - apiVersions: [v1] - operations: [CREATE, UPDATE] - resources: [pods, pods/ephemeralcontainers] - variables: - - name: containers - expression: 'object.spec.containers + (has(object.spec.initContainers) ? object.spec.initContainers : []) + (has(object.spec.ephemeralContainers) ? object.spec.ephemeralContainers : [])' - validations: - - expression: '(!has(object.spec.hostNetwork) || !object.spec.hostNetwork) && (!has(object.spec.hostPID) || !object.spec.hostPID) && (!has(object.spec.hostIPC) || !object.spec.hostIPC)' - message: Team workloads cannot join host namespaces. - - expression: 'has(object.spec.automountServiceAccountToken) && !object.spec.automountServiceAccountToken' - message: Team workloads must disable Kubernetes credentials. - - expression: 'has(object.spec.securityContext) && has(object.spec.securityContext.seccompProfile) && object.spec.securityContext.seccompProfile.type == "RuntimeDefault"' - message: Team workloads must use the default seccomp profile. - - expression: 'variables.containers.all(c, has(c.securityContext) && has(c.securityContext.allowPrivilegeEscalation) && !c.securityContext.allowPrivilegeEscalation && (!has(c.securityContext.privileged) || !c.securityContext.privileged) && has(c.securityContext.capabilities) && has(c.securityContext.capabilities.drop) && "ALL" in c.securityContext.capabilities.drop && (!has(c.securityContext.capabilities.add) || size(c.securityContext.capabilities.add) == 0))' - message: Team containers must drop capabilities and forbid privilege escalation. - - expression: '!has(object.spec.volumes) || object.spec.volumes.all(v, has(v.persistentVolumeClaim) || has(v.configMap) || has(v.emptyDir) || (has(v.hostPath) && v.hostPath.path in ["/home/utmist-tt/TT/tt-metal", "/home/utmist-tt/.local/share/uv/python"] && variables.containers.all(c, !has(c.volumeMounts) || c.volumeMounts.all(m, m.name != v.name || (has(m.readOnly) && m.readOnly)))))' - message: Team volumes allow PVCs, scripts, scratch space and read-only TT runtime mounts. ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingAdmissionPolicyBinding -metadata: - name: mist-team-boundary -spec: - policyName: mist-team-boundary - validationActions: [Deny] - matchResources: - namespaceSelector: - matchLabels: - mist.io/workloads: "true" diff --git a/deploy/k3s/tenstorrent-allocation-results.json b/deploy/k3s/tenstorrent-allocation-results.json deleted file mode 100644 index c62a4a7..0000000 --- a/deploy/k3s/tenstorrent-allocation-results.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "verified_at": "2026-10-03T19:23:13.903202+00:00", - "node": "utmist-tt", - "k3s_version": "v1.36.4+k3s1", - "hardware": { - "boards": 4, - "type": "n300", - "chips_per_board": 2, - "total_chips": 8 - }, - "operator": { - "chart_version": "0.3.0", - "fabric_manager_version": "0.2.30", - "dra_driver_version": "0.0.59", - "namespace": "tt-operator-system", - "host_driver_managed": false, - "image_ids": { - "ghcr.io/tenstorrent/tt-fabric-manager:0.2.30": "ghcr.io/tenstorrent/tt-fabric-manager@sha256:82c9063a5182051f0980459eaacb3e2d878a197874dfe05c6a5eb9288f4cca33", - "ghcr.io/tenstorrent/tt-dra-driver:0.0.59": "ghcr.io/tenstorrent/tt-dra-driver@sha256:ac0089e9b6939170300aa325c62605b48cf12313ca6cec8c9d8a04f416d12dfb" - } - }, - "allocation": { - "device_class": "tenstorrent.com", - "unit": "one n300 board including both chips", - "claims": "one ResourceClaimTemplate-generated claim per pod", - "hugepages_1Gi_per_board": "2Gi", - "privileged_training": false - }, - "concurrency_test": { - "run": "tt-alloc-1003-190834", - "simultaneous_jobs": 4, - "boards_per_job": 1, - "chips_tested_per_job": 2, - "steps_per_chip": 500, - "overlap_seconds": 3.924301, - "reserved_devices": { - "tt-alloc-1003-190834-0-wzcrc": "tt-3", - "tt-alloc-1003-190834-1-b8fdc": "tt-1", - "tt-alloc-1003-190834-2-5qqtz": "tt-2", - "tt-alloc-1003-190834-3-f552p": "tt-0" - }, - "device_access_probes": { - "tt-alloc-1003-190834-0-wzcrc": { - "allowed": [ - "0" - ], - "denied": [ - "1", - "2", - "3" - ] - }, - "tt-alloc-1003-190834-1-b8fdc": { - "allowed": [ - "2" - ], - "denied": [ - "0", - "1", - "3" - ] - }, - "tt-alloc-1003-190834-2-5qqtz": { - "allowed": [ - "3" - ], - "denied": [ - "0", - "1", - "2" - ] - }, - "tt-alloc-1003-190834-3-f552p": { - "allowed": [ - "1" - ], - "denied": [ - "0", - "2", - "3" - ] - } - }, - "fifth_job_pending": true, - "queue_messages": [ - "0/2 nodes are available: 1 cannot allocate all claims, 1 node(s) didn't match Pod's node affinity/selector. still not schedulable, preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling." - ], - "fifth_job_completed_after_release": true, - "all_jobs_exit_code": 0, - "final_training_mse": 6.243230745894834e-05, - "held_out_mse": 0.00017509252938907593, - "checkpoint_reload_passed": true - }, - "additional_checks": { - "allocator_restart_recovered": true, - "training_after_restart_chips": 2, - "nvidia_cuda_regression": "Test PASSED", - "multi_board_training": [ - { - "boards": 2, - "chips": 4, - "passed": true, - "checkpoint_reload_passed": true - }, - { - "boards": 4, - "chips": 8, - "passed": true, - "checkpoint_reload_passed": true - } - ], - "admission": { - "allowed": { - "accepted": true, - "message": "pod/allocation-policy-check created (server dry run)\n" - }, - "privileged": { - "accepted": false, - "message": "The Pod \"allocation-policy-check\" is invalid: spec.containers[0].securityContext: Invalid value: {\"Capabilities\":{\"Add\":null,\"Drop\":[\"ALL\"]},\"Privileged\":true,\"SELinuxOptions\":null,\"WindowsOptions\":null,\"RunAsUser\":null,\"RunAsGroup\":null,\"RunAsNonRoot\":null,\"ReadOnlyRootFilesystem\":null,\"AllowPrivilegeEscalation\":false,\"ProcMount\":null,\"SeccompProfile\":null,\"AppArmorProfile\":null}: cannot set `allowPrivilegeEscalation` to false and `privileged` to true\n" - }, - "docker-socket": { - "accepted": false, - "message": "The pods \"allocation-policy-check\" is invalid: : ValidatingAdmissionPolicy 'mist-accelerator-isolation' with binding 'mist-accelerator-isolation' denied request: Use DRA/CDI for devices and PVCs for storage; arbitrary host mounts are forbidden in Mist.\n" - }, - "writable-metal": { - "accepted": false, - "message": "The pods \"allocation-policy-check\" is invalid: : ValidatingAdmissionPolicy 'mist-accelerator-isolation' with binding 'mist-accelerator-isolation' denied request: The host TT-Metal and Python environment mounts must be read-only.\n" - }, - "added-capability": { - "accepted": false, - "message": "The pods \"allocation-policy-check\" is invalid: : ValidatingAdmissionPolicy 'mist-accelerator-isolation' with binding 'mist-accelerator-isolation' denied request: Mist workloads cannot enable privileged access, privilege escalation, or additional Linux capabilities.\n" - } - } - }, - "runtime": { - "tt_metal_host_commit": "80ec10ab611570a6818fdebc1398c8c9141fb9df", - "multi_board_smoke": "Separate runtime per reserved board, selected by PCI BDF in TT_VISIBLE_DEVICES; each chip trains independently." - }, - "limitations": [ - "Training is a synthetic TTNN linear-regression test with explicit analytic gradients, not arbitrary-model autograd or distributed training.", - "DRA board-count requests do not guarantee a connected fabric topology for multi-board models.", - "Mist API integration still needs to create Kubernetes Jobs and device claims.", - "Host runtime directories and hugepage filesystems remain shared; this is not a full untrusted-tenant security boundary.", - "Vendor ResourceSlice memory capacity is incorrect (281453674972256 bytes per n300); claims intentionally do not use memory-capacity placement." - ], - "artifacts": { - "directory": "/home/utmist/k3s-allocation-results-2026-10-03", - "concurrent_checkpoints": "/home/utmist/k3s-allocation-results-2026-10-03/concurrent-checkpoints.tar.gz", - "recovery_and_multi_board_checkpoints": "/home/utmist/k3s-allocation-results-2026-10-03/additional-checkpoints.tar.gz", - "checkpoint_pvc": "mist/training-tenstorrent-checkpoints", - "concurrent_pvc_directory": "/checkpoints/tt-alloc-1003-190834" - } -} diff --git a/deploy/k3s/tenstorrent-operator-values.yaml b/deploy/k3s/tenstorrent-operator-values.yaml deleted file mode 100644 index 63f75aa..0000000 --- a/deploy/k3s/tenstorrent-operator-values.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# Pinned with tt-operator chart 0.3.0. Host TT driver/firmware are managed -# separately. Reuse the cluster's existing NVIDIA-provided NFD installation. -node-feature-discovery: - enabled: false -tt-k8s-driver-manager: - enabled: false -tt-telemetry: - enabled: false -jobset: - enabled: false -kubepmix: - enabled: false -tt-fabric-manager: - enabled: true - fullnameOverride: tt-fabric-manager - imagePullSecrets: [] - controller: - nodeSelector: - kubernetes.io/hostname: utmist-z1opa08 - agent: - nodeSelector: - kubernetes.io/hostname: utmist-tt -tt-dra-driver: - enabled: true - imagePullSecrets: [] - kubeletPlugin: - nodeSelector: - kubernetes.io/hostname: utmist-tt - fabricManagerAgentAddress: tt-fabric-manager-agent.tt-operator-system.svc.cluster.local:50053 diff --git a/deploy/k3s/tenstorrent-workload-policy.yaml b/deploy/k3s/tenstorrent-workload-policy.yaml deleted file mode 100644 index eb14ca1..0000000 --- a/deploy/k3s/tenstorrent-workload-policy.yaml +++ /dev/null @@ -1,40 +0,0 @@ -# Applies only to the managed workload namespace. Operator DaemonSets live -# elsewhere and retain the privileges their vendor components require. -# Direct single-node probes remain allowed: device cgroups deny unclaimed -# character devices. Whole-device-directory and Docker-socket mounts are denied. -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingAdmissionPolicy -metadata: - name: mist-accelerator-isolation -spec: - failurePolicy: Fail - matchConstraints: - resourceRules: - - apiGroups: [""] - apiVersions: [v1] - operations: [CREATE, UPDATE] - resources: [pods, pods/ephemeralcontainers] - variables: - - name: containers - expression: 'object.spec.containers + (has(object.spec.initContainers) ? object.spec.initContainers : []) + (has(object.spec.ephemeralContainers) ? object.spec.ephemeralContainers : [])' - validations: - - expression: 'variables.containers.all(c, !has(c.securityContext) || ((!has(c.securityContext.privileged) || !c.securityContext.privileged) && (!has(c.securityContext.allowPrivilegeEscalation) || !c.securityContext.allowPrivilegeEscalation) && (!has(c.securityContext.capabilities) || !has(c.securityContext.capabilities.add) || size(c.securityContext.capabilities.add) == 0)))' - message: Mist workloads cannot enable privileged access, privilege escalation, or additional Linux capabilities. - - expression: '(!has(object.spec.hostPID) || !object.spec.hostPID) && (!has(object.spec.hostIPC) || !object.spec.hostIPC)' - message: Mist workloads cannot join the host PID or IPC namespace. - - expression: '!has(object.spec.volumes) || object.spec.volumes.all(v, !has(v.hostPath) || v.hostPath.path in ["/home/utmist-tt/TT/tt-metal", "/home/utmist-tt/.local/share/uv/python", "/dev/tenstorrent/0", "/dev/tenstorrent/1", "/dev/tenstorrent/2", "/dev/tenstorrent/3"])' - message: Use DRA/CDI for devices and PVCs for storage; arbitrary host mounts are forbidden in Mist. - - expression: '!has(object.spec.volumes) || object.spec.volumes.all(v, !has(v.hostPath) || !(v.hostPath.path in ["/home/utmist-tt/TT/tt-metal", "/home/utmist-tt/.local/share/uv/python"]) || variables.containers.all(c, !has(c.volumeMounts) || c.volumeMounts.all(m, m.name != v.name || (has(m.readOnly) && m.readOnly))))' - message: The host TT-Metal and Python environment mounts must be read-only. ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingAdmissionPolicyBinding -metadata: - name: mist-accelerator-isolation -spec: - policyName: mist-accelerator-isolation - validationActions: [Deny] - matchResources: - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: mist diff --git a/deploy/k3s/training-nvidia-job.yaml b/deploy/k3s/training-nvidia-job.yaml deleted file mode 100644 index d6d3393..0000000 --- a/deploy/k3s/training-nvidia-job.yaml +++ /dev/null @@ -1,50 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: training-nvidia-checkpoints - namespace: mist -spec: - accessModes: [ReadWriteOnce] - storageClassName: local-path - resources: - requests: - storage: 256Mi ---- -apiVersion: batch/v1 -kind: Job -metadata: - name: training-nvidia - namespace: mist -spec: - backoffLimit: 0 - activeDeadlineSeconds: 1800 - template: - spec: - nodeSelector: - kubernetes.io/hostname: utmist-z1opa08 - restartPolicy: Never - containers: - - name: train - image: pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime - command: [python, -u, /scripts/training_smoke.py, nvidia] - resources: - requests: - cpu: "2" - memory: 2Gi - limits: - cpu: "4" - memory: 4Gi - nvidia.com/gpu: "2" - volumeMounts: - - name: script - mountPath: /scripts - readOnly: true - - name: checkpoints - mountPath: /checkpoints - volumes: - - name: script - configMap: - name: training-smoke-script - - name: checkpoints - persistentVolumeClaim: - claimName: training-nvidia-checkpoints diff --git a/deploy/k3s/training-smoke-results.json b/deploy/k3s/training-smoke-results.json deleted file mode 100644 index 6474e8f..0000000 --- a/deploy/k3s/training-smoke-results.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "date": "2026-10-03", - "test": "32x32 linear regression, 100 full-batch gradient steps", - "dataset": { - "seed": 42, - "training_samples": 128, - "validation_samples": 64 - }, - "acceptance": { - "maximum_final_to_initial_mse_ratio": 0.02, - "maximum_validation_mse": 0.0005, - "minimum_max_weight_change": 0.05, - "checkpoint_reload_mse_tolerance": 1e-07 - }, - "scope": "Independent device tests; no distributed training or performance benchmark. TT uses direct host devices, explicit TT-NN gradients, and a host-mounted Python/TT-Metal build; DRA scheduling and TT autograd are not tested.", - "tenstorrent_host_metal_commit": "80ec10ab611570a6818fdebc1398c8c9141fb9df", - "backends": { - "nvidia": { - "status": "passed", - "devices_tested": 2, - "node": "utmist-z1opa08", - "image_id": "docker.io/pytorch/pytorch@sha256:c8268a92a69bd500f8be0e665b2630ee006dadaf7bfbc24249141b15ff622755", - "container_started_at": "2026-10-03T18:26:07Z", - "container_finished_at": "2026-10-03T18:26:12Z", - "training_mse_initial": 0.3193739950656891, - "training_mse_final_range": [ - 2.018663423086764e-07, - 2.018663423086764e-07 - ], - "validation_mse_range": [ - 9.320668823420419e-07, - 9.320668823420419e-07 - ], - "checkpoint_files": 2, - "pvc": "training-nvidia-checkpoints", - "logs": "/home/utmist/k3s-training-results-2026-10-03/nvidia.log", - "checkpoint_archive": "/home/utmist/k3s-training-results-2026-10-03/nvidia-checkpoints.tar.gz" - }, - "tenstorrent": { - "status": "passed", - "devices_tested": 8, - "node": "utmist-tt", - "image_id": "ghcr.io/tenstorrent/tt-metal/tt-metalium/ubuntu-22.04-dev-amd64@sha256:14621babd1f9d1c97cc3ee9528e180a31f30cec2d6114ca281daf1a9477c7a74", - "container_started_at": "2026-10-03T18:23:05Z", - "container_finished_at": "2026-10-03T18:23:24Z", - "training_mse_initial": 0.3193739652633667, - "training_mse_final_range": [ - 6.238709465833381e-05, - 6.238709465833381e-05 - ], - "validation_mse_range": [ - 0.00017507212760392576, - 0.00017507212760392576 - ], - "checkpoint_files": 8, - "pvc": "training-tenstorrent-checkpoints", - "logs": "/home/utmist/k3s-training-results-2026-10-03/tenstorrent.log", - "checkpoint_archive": "/home/utmist/k3s-training-results-2026-10-03/tenstorrent-checkpoints.tar.gz" - } - } -} diff --git a/deploy/k3s/training-tenstorrent-job.yaml b/deploy/k3s/training-tenstorrent-job.yaml deleted file mode 100644 index 75b4f0b..0000000 --- a/deploy/k3s/training-tenstorrent-job.yaml +++ /dev/null @@ -1,106 +0,0 @@ -# One n300 board (two chips), reserved through Tenstorrent DRA/CDI. -# Host driver, TT-Metal checkout, and Python environment remain host-managed. -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: training-tenstorrent-checkpoints - namespace: mist -spec: - accessModes: [ReadWriteOnce] - storageClassName: local-path - resources: - requests: - storage: 256Mi ---- -apiVersion: resource.k8s.io/v1 -kind: ResourceClaimTemplate -metadata: - name: training-tenstorrent-board - namespace: mist -spec: - spec: - devices: - requests: - - name: board - exactly: - deviceClassName: tenstorrent.com - count: 1 - selectors: - - cel: - expression: 'device.attributes["tenstorrent.com"].boardName == "n300" && device.attributes["tenstorrent.com"].chipCount == 2' ---- -apiVersion: batch/v1 -kind: Job -metadata: - name: training-tenstorrent-dra - namespace: mist -spec: - backoffLimit: 0 - activeDeadlineSeconds: 1800 - template: - spec: - nodeSelector: - kubernetes.io/hostname: utmist-tt - restartPolicy: Never - automountServiceAccountToken: false - resourceClaims: - - name: board - resourceClaimTemplateName: training-tenstorrent-board - containers: - - name: train - image: ghcr.io/tenstorrent/tt-metal/tt-metalium/ubuntu-22.04-dev-amd64:6b765c0bc2b40ea02566d169d7b0ee902377ba04 - imagePullPolicy: IfNotPresent - workingDir: /tmp - command: [/home/utmist-tt/TT/tt-metal/python_env/bin/python, -u, /scripts/training_smoke.py, tenstorrent, --expected-devices, "2", --output, /checkpoints/dra-single] - securityContext: - privileged: false - allowPrivilegeEscalation: false - capabilities: - drop: [ALL] - env: - - name: TT_METAL_HOME - value: /home/utmist-tt/TT/tt-metal - - name: PYTHONPATH - value: /home/utmist-tt/TT/tt-metal - - name: LD_LIBRARY_PATH - value: /home/utmist-tt/TT/tt-metal/build/lib - - name: TT_METAL_CACHE - value: /tmp/tt-metal-cache - resources: - claims: - - name: board - requests: - cpu: "2" - memory: 4Gi - hugepages-1Gi: 2Gi - limits: - cpu: "8" - memory: 8Gi - hugepages-1Gi: 2Gi - volumeMounts: - - name: script - mountPath: /scripts - readOnly: true - - name: checkpoints - mountPath: /checkpoints - - name: metal - mountPath: /home/utmist-tt/TT/tt-metal - readOnly: true - - name: python - mountPath: /home/utmist-tt/.local/share/uv/python - readOnly: true - volumes: - - name: script - configMap: - name: training-smoke-script - - name: checkpoints - persistentVolumeClaim: - claimName: training-tenstorrent-checkpoints - - name: metal - hostPath: - path: /home/utmist-tt/TT/tt-metal - type: Directory - - name: python - hostPath: - path: /home/utmist-tt/.local/share/uv/python - type: Directory diff --git a/deploy/k3s/training_smoke.py b/deploy/k3s/training_smoke.py deleted file mode 100644 index a21a610..0000000 --- a/deploy/k3s/training_smoke.py +++ /dev/null @@ -1,209 +0,0 @@ -"""Small accelerator training check; TT gradients are computed explicitly in TT-NN. - -CPU Torch creates the data, records metrics, and serializes checkpoints. All -forward passes, gradients, and weight updates run on the selected accelerator. -This is a linear-regression smoke test, not a model compatibility benchmark. -""" - -import argparse -import json -import math -import os -import subprocess -import sys -import time -from datetime import datetime, timezone -from pathlib import Path - -import torch - - -def dataset(): - generator = torch.Generator().manual_seed(42) - truth = torch.randn(32, 32, generator=generator) * 0.1 - x = torch.randn(128, 32, generator=generator) - validation_x = torch.randn(64, 32, generator=generator) - return x, x @ truth, validation_x, validation_x @ truth - - -def await_start(output, start_file, metadata): - if not start_file: - return - (output / "ready.json").write_text(json.dumps({**metadata, - "ready_at": datetime.now(timezone.utc).isoformat()}) + "\n") - print(f"BARRIER_READY {json.dumps(metadata)}", flush=True) - deadline = time.monotonic() + 300 - while not start_file.exists(): - assert time.monotonic() < deadline, "Training start barrier timed out" - time.sleep(0.2) - - -def check_and_save(backend, device_id, weights, initial, final, validation, output): - change = weights.abs().max().item() - assert all(math.isfinite(v) for v in (initial, final, validation, change)) - assert final < initial * 0.02, f"Loss did not converge: {initial} -> {final}" - assert validation < 5e-4, f"Held-out MSE too high: {validation}" - assert change > 0.05, "Weights were not updated" - path = output / f"{backend}-{device_id}.pt" - torch.save({"weights": weights.cpu(), "initial_mse": initial, - "final_mse": final, "validation_mse": validation}, path) - loaded = torch.load(path, map_location="cpu", weights_only=True) - torch.testing.assert_close(loaded["weights"], weights.cpu(), rtol=0, atol=0) - result = {"backend": backend, "device_id": device_id, - "initial_mse": initial, "final_mse": final, - "validation_mse": validation, "max_weight_change": change, - "checkpoint": str(path)} - print(json.dumps(result), flush=True) - return result, loaded["weights"] - - -def nvidia(output, steps, expected_devices, start_file, board_pci): - assert torch.cuda.is_available(), "CUDA unavailable; CPU fallback is forbidden" - count = torch.cuda.device_count() - assert count == expected_devices, f"Expected {expected_devices} allocated GPUs; saw {count}" - print(f"CUDA devices={count}; torch={torch.__version__}", flush=True) - nodes = sorted(str(path) for path in Path("/dev").glob("nvidia[0-9]*")) - assert len(nodes) == count, f"Unexpected NVIDIA device nodes: {nodes}" - (output / "allocation.json").write_text(json.dumps({"device_nodes": nodes, - "gpu_count": count}, indent=2) + "\n") - results = [] - for index in range(count): - device = torch.device(f"cuda:{index}") - print(f"Training on {device}: {torch.cuda.get_device_name(index)}", flush=True) - x, y, validation_x, validation_y = (t.to(device) for t in dataset()) - model = torch.nn.Linear(32, 32, bias=False).to(device) - torch.nn.init.zeros_(model.weight) - optimizer = torch.optim.SGD(model.parameters(), lr=0.2) - if index == 0: - await_start(output, start_file, {"device_nodes": nodes, "gpu_count": count}) - started = datetime.now(timezone.utc).isoformat() - initial = (model(x) - y).square().mean().item() - for step in range(steps): - optimizer.zero_grad(set_to_none=True) - residual = model(x) - y - loss = residual.square().sum() / (2 * x.shape[0]) - loss.backward() - assert model.weight.grad.is_cuda - optimizer.step() - if step % 20 == 0: - print(f"cuda:{index} step={step} mse={residual.square().mean().item():.8f}", flush=True) - with torch.no_grad(): - final = (model(x) - y).square().mean().item() - validation = (model(validation_x) - validation_y).square().mean().item() - result, weights = check_and_save("nvidia", index, model.weight.T.detach(), - initial, final, validation, output) - restored_error = (validation_x @ weights.to(device) - validation_y).square().mean().item() - assert abs(restored_error - validation) < 1e-7 - result["checkpoint_reload_mse"] = restored_error - result["device_name"] = torch.cuda.get_device_name(index) - result["started_at"] = started - result["finished_at"] = datetime.now(timezone.utc).isoformat() - result["device_nodes"] = nodes - results.append(result) - return results - - -def tenstorrent(output, steps, expected_devices, start_file, board_pci): - nodes = sorted(str(path) for path in Path("/dev/tenstorrent").iterdir()) - - def pci_address(node): - path = Path("/sys/class/tenstorrent") / ("tenstorrent!" + Path(node).name) - assert path.exists(), f"Missing PCI identity for {node}" - return path.resolve().parents[1].name - - if board_pci: - nodes = [node for node in nodes if pci_address(node) == board_pci] - assert len(nodes) == 1, f"PCI selector does not match one allocated board: {board_pci}" - assert len(nodes) * 2 == expected_devices, f"Unexpected n300 device nodes: {nodes}" - if len(nodes) > 1: - # Arbitrary n300 subsets need not form a connected fabric mesh. - # This test trains independently, so use one runtime per board. - results = [] - for ordinal, node in enumerate(nodes): - bdf = pci_address(node) - board_output = output / ("board-" + Path(node).name) - command = [sys.executable, __file__, "tenstorrent", "--steps", str(steps), - "--expected-devices", "2", "--output", str(board_output), "--board-pci", bdf] - if start_file: - command += ["--start-file", str(start_file)] - print(f"Training reserved board {node}, PCI {bdf}", flush=True) - subprocess.run(command, env={**os.environ, "TT_VISIBLE_DEVICES": bdf}, check=True) - for result in json.loads((board_output / "results.json").read_text()): - result["board_local_device_id"] = result["device_id"] - result["device_id"] = ordinal * 2 + result["device_id"] - result["board_pci"] = bdf - results.append(result) - assert len(results) == expected_devices - (output / "allocation.json").write_text(json.dumps({"device_nodes": nodes, - "chip_count": expected_devices}, indent=2) + "\n") - return results - - import ttnn - - count = ttnn.get_num_devices() - assert count == expected_devices, f"Expected {expected_devices} allocated chips; saw {count}" - (output / "allocation.json").write_text(json.dumps({"device_nodes": nodes, - "chip_count": count}, indent=2) + "\n") - print(f"Tenstorrent devices={count}; torch used for data/metrics={torch.__version__}", flush=True) - results = [] - for index in range(count): - print(f"Opening Tenstorrent device {index}", flush=True) - device = ttnn.open_device(device_id=index) - try: - if index == 0 and start_file: - await_start(output, start_file, {"device_nodes": nodes, "chip_count": count}) - started = datetime.now(timezone.utc).isoformat() - x, y, validation_x, validation_y = dataset() - options = dict(dtype=ttnn.bfloat16, layout=ttnn.TILE_LAYOUT, - device=device, memory_config=ttnn.DRAM_MEMORY_CONFIG) - dx, dy, dvx = (ttnn.from_torch(t, **options) for t in (x, y, validation_x)) - dxt = ttnn.from_torch(x.T.contiguous(), **options) - weights = ttnn.from_torch(torch.zeros(32, 32), **options) - - def mse(inputs, target, matrix): - prediction = ttnn.to_torch(ttnn.matmul(inputs, matrix)).float() - return (prediction - target).square().mean().item() - - initial = mse(dx, y, weights) - for step in range(steps): - prediction = ttnn.matmul(dx, weights) - residual = ttnn.subtract(prediction, dy) - # Gradient of ||XW-Y||^2/(2N) is X.T@(XW-Y)/N. - gradient = ttnn.matmul(dxt, residual) - weights = ttnn.subtract(weights, ttnn.multiply(gradient, 0.2 / x.shape[0])) - if step % 20 == 0: - print(f"tt:{index} step={step} mse={mse(dx, y, weights):.8f}", flush=True) - final = mse(dx, y, weights) - validation = mse(dvx, validation_y, weights) - host_weights = ttnn.to_torch(weights).float() - result, loaded = check_and_save("tenstorrent", index, host_weights, - initial, final, validation, output) - restored = ttnn.from_torch(loaded, **options) - restored_error = mse(dvx, validation_y, restored) - assert abs(restored_error - validation) < 1e-7 - result["checkpoint_reload_mse"] = restored_error - result["started_at"] = started - result["finished_at"] = datetime.now(timezone.utc).isoformat() - result["device_nodes"] = nodes - results.append(result) - finally: - ttnn.close_device(device) - return results - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("backend", choices=("nvidia", "tenstorrent")) - parser.add_argument("--steps", type=int, default=100) - parser.add_argument("--output", type=Path, default=Path("/checkpoints")) - parser.add_argument("--expected-devices", type=int, - help="Expected allocated chip/GPU count; defaults to the original whole-node test") - parser.add_argument("--start-file", type=Path, - help="Optional shared-file barrier for the concurrent allocation test") - parser.add_argument("--board-pci", help=argparse.SUPPRESS) - args = parser.parse_args() - args.output.mkdir(parents=True, exist_ok=True) - expected = args.expected_devices or (2 if args.backend == "nvidia" else 8) - results = globals()[args.backend](args.output, args.steps, expected, args.start_file, args.board_pci) - (args.output / "results.json").write_text(json.dumps(results, indent=2) + "\n") - print(f"TRAINING_PASSED backend={args.backend} devices={len(results)}", flush=True) diff --git a/deploy/k3s/verify_department.mjs b/deploy/k3s/verify_department.mjs deleted file mode 100644 index 06ba8e7..0000000 --- a/deploy/k3s/verify_department.mjs +++ /dev/null @@ -1,562 +0,0 @@ -// Run from the repo root. Playwright is supplied externally; credentials and -// cookies stay in a protected local state file, never in the public report. -import { - readFileSync, - writeFileSync, - mkdirSync, - existsSync, - chmodSync, -} from "node:fs"; -import { randomBytes } from "node:crypto"; -import { execFileSync } from "node:child_process"; -const { chromium } = await import( - process.env.MIST_PLAYWRIGHT_MODULE ?? - "/tmp/mist-browser-check/node_modules/playwright/index.mjs" -); -const base = process.env.MIST_SITE_URL ?? "http://100.73.139.66:8088"; -const out = - process.env.MIST_EVIDENCE_DIR ?? - "/home/utmist/mist-department-results-2026-10-09"; -mkdirSync(out, { recursive: true, mode: 0o700 }); -const statePath = out + "/private-state.json"; -const credentials = JSON.parse( - readFileSync("/home/utmist/.config/mist/admin-bootstrap.json"), -); -const browser = await chromium.launch({ headless: true }); -const admin = await browser.newContext({ - baseURL: base, - viewport: { width: 1440, height: 1000 }, -}); -const errors = []; -const state = existsSync(statePath) ? JSON.parse(readFileSync(statePath)) : {}; -const report = { - started: new Date().toISOString(), - site: base, - checks: {}, - jobs: [], - teams: [], -}; -function save() { - writeFileSync(statePath, JSON.stringify(state, null, 2), { mode: 0o600 }); - chmodSync(statePath, 0o600); -} -function check(ok, message) { - if (!ok) throw new Error(message); -} -function passed(name) { - report.checks[name] = true; - writeFileSync(out + "/results.json", JSON.stringify(report, null, 2)); - console.log("PASS " + name); -} -async function call( - ctx, - path, - method = "GET", - data, - team = "", - expected = 200, -) { - let r; - for (let attempt = 0; attempt < (method === "GET" ? 4 : 1); attempt++) { - try { - r = await ctx.request.fetch(base + path, { - method, - data, - timeout: 15000, - headers: { Origin: base, ...(team ? { "X-Mist-Team": team } : {}) }, - }); - if (method === "GET" && [502, 503].includes(r.status()) && attempt < 3) { - await new Promise((resolve) => setTimeout(resolve, 1500)); - continue; - } - break; - } catch { - if (method === "GET" && attempt < 3) { - await new Promise((resolve) => setTimeout(resolve, 1500)); - continue; - } - throw new Error( - `${method} ${path}: transport interrupted; no credentials logged`, - ); - } - } - - check( - r.status() === expected, - `${method} ${path} expected ${expected}, got ${r.status()}: ${(await r.text()).slice(0, 1500)}`, - ); - return path.includes("/files/download") - ? r.body() - : r.headers()["content-type"]?.includes("json") - ? r.json() - : r.body(); -} -async function pick(target, label, optionsOrValue, maybeValue) { - const value = maybeValue === undefined ? optionsOrValue : maybeValue - await target.getByLabel(label, {exact:true}).click() - await target.locator('[role=option][data-value='+JSON.stringify(String(value))+']').click() -} -async function login(ctx, email, password) { - await call(ctx, "/auth/sign-in/email", "POST", { email, password }); -} -async function waitReady(team, ctx = admin) { - for (let i = 0; i < 60; i++) { - const r = await ctx.request.get(base + "/api/storage", { - headers: { "X-Mist-Team": team }, - }); - if (r.ok()) return r.json(); - await new Promise((r) => setTimeout(r, 1000)); - } - throw new Error("Team storage never ready " + team); -} -async function submit(ctx, team, name, data = {}) { - const result = await call( - ctx, - "/api/jobs", - "POST", - { - name, - type: "command", - accelerator: "cpu", - command: ["python", "-c", "print('JOB_PASSED',flush=True)"], - timeout_seconds: 180, - ...data, - }, - team, - 201, - ); - report.jobs.push({ id: result.job_id, name, team }); - return result.job_id; -} -async function waitJob(ctx, team, id, want = "Success", seconds = 600) { - for (let i = 0; i < seconds; i += 2) { - const j = await call(ctx, "/api/jobs/" + id, "GET", undefined, team); - if (j.job_state === want) return j; - if (["Success", "Failure", "Cancelled"].includes(j.job_state)) { - const logs = await call( - ctx, - "/api/jobs/" + id + "/logs", - "GET", - undefined, - team, - ); - throw new Error( - `${id} ${j.job_state}: ${JSON.stringify(logs).slice(-3000)}`, - ); - } - await new Promise((r) => setTimeout(r, 2000)); - } - throw new Error("Job timed out " + id); -} -async function terminalJob(ctx, team, id) { - const j = await waitJob(ctx, team, id); - const logs = await call( - ctx, - "/api/jobs/" + id + "/logs", - "GET", - undefined, - team, - ); - writeFileSync(out + "/" + id + ".log", logs.logs); - return { j, logs: logs.logs }; -} -async function upload(ctx, team, name, text, scope) { - return call( - ctx, - `/api/datasets?filename=${encodeURIComponent(name)}${scope ? "&scope=" + scope : ""}`, - "POST", - Buffer.from(text), - team, - 201, - ); -} -const kube = (...args) => - execFileSync("k3s", ["kubectl", ...args], { - env: { ...process.env, KUBECONFIG: "/home/utmist/.kube/config" }, - encoding: "utf8", - }); -try { - await login(admin, credentials.email, credentials.password); - const account = (await call(admin, "/api/session")).user; - state.adminID = account.id; - const legacyBefore = await call(admin, "/api/jobs"); - report.legacy_job_count_before = legacyBefore.count; - if (!state.a) { - state.a = await call( - admin, - "/api/teams", - "POST", - { name: "Research pilot", storage_gib: 1 }, - "", - 201, - ); - save(); - } - if (!state.b) { - state.b = await call( - admin, - "/api/teams", - "POST", - { name: "Verification isolation", storage_gib: 1 }, - "", - 201, - ); - save(); - } - const A = state.a.id, - B = state.b.id; - report.teams = [A, B]; - // Only unfinished fixtures created by this verifier are cancelled on rerun. - for (const team of [A, B]) { - const jobs = JSON.parse( - kube("get", "jobs", "-n", "mist-" + team, "-o", "json"), - ).items; - for (const job of jobs) { - if ( - job.metadata.annotations?.["mist.io/cancelled-at"] || - job.status?.conditions?.some( - (c) => ["Complete", "Failed"].includes(c.type) && c.status === "True", - ) - ) - continue; - kube( - "patch", - "job", - job.metadata.name, - "-n", - job.metadata.namespace, - "--type=merge", - "-p", - JSON.stringify({ - spec: { suspend: true }, - metadata: { - annotations: { - "mist.io/cancelled-at": new Date().toISOString(), - "mist.io/stop-reason": "Previous verification fixture cancelled", - }, - }, - }), - ); - } - } - - await call( - admin, - `/api/teams/${A}`, - "PATCH", - { disabled: false, policy: { ...state.a.policy, concurrent: 1 } }, - "", - ); - await call(admin, `/api/teams/${B}`, "PATCH", { disabled: false }, ""); - await call(admin, `/api/teams/${A}/members`, "POST", { - user_id: account.id, - common_writer: true, - }); - for (const [key, name] of [ - ["alice", "Researcher A"], - ["mate", "Teammate A"], - ["bob", "Researcher B"], - ]) { - if (!state[key]) { - const password = randomBytes(20).toString("base64url"), - email = `${key}-${Date.now()}@mist.invalid`; - const result = await call(admin, "/auth/admin/create-user", "POST", { - name, - email, - password, - role: "user", - }); - state[key] = { id: result.user.id, name, email, password }; - save(); - } - await call(admin, `/api/teams/${key === "bob" ? B : A}/members`, "POST", { - user_id: state[key].id, - common_writer: false, - }); - } - const alice = await browser.newContext({ baseURL: base }), - mate = await browser.newContext({ baseURL: base }), - bob = await browser.newContext({ baseURL: base }); - await Promise.all([ - login(alice, state.alice.email, state.alice.password), - login(mate, state.mate.email, state.mate.password), - login(bob, state.bob.email, state.bob.password), - ]); - await Promise.all([waitReady(A), waitReady(B, bob)]); - passed("team_filesystems_ready"); - const capacity = await call(admin, "/api/storage", "GET", undefined, A); - check( - capacity.capacity_bytes < 1.1 * 1024 ** 3, - "Team sees parent disk capacity", - ); - report.storage = capacity; - const ds = await upload(alice, A, "member.txt", "TEAM_A_MEMBER_DATA"); - const common = await upload( - admin, - A, - "common.txt", - "TEAM_A_COMMON_DATA", - "common", - ); - check( - (await call(mate, "/api/datasets", "GET", undefined, A)).datasets.some( - (d) => d.id === ds.id, - ), - "Teammate cannot read member data", - ); - await call(mate, `/api/datasets/${ds.id}`, "DELETE", undefined, A, 403); - await call( - alice, - "/api/datasets?filename=no.txt&scope=common", - "POST", - Buffer.from("bad"), - A, - 403, - ); - await call(bob, `/api/datasets/${ds.id}`, "GET", undefined, B, 404); - await call(bob, "/api/datasets", "GET", undefined, A, 403); - await call(bob, "/api/teams", "POST", { name: "unauthorized" }, "", 403); - passed("team_read_write_and_cross_team_denial"); - await call(admin, `/api/teams/${A}/grants`, "POST", { - target_team: B, - scope: state.alice.id, - }); - const grant = (await call(admin, "/api/teams")).teams - .find((t) => t.id === A) - .grants.find((g) => g.scope === state.alice.id && g.target_team === B); - const shared = await call( - bob, - `/api/datasets/${ds.id}/files/download?path=member.txt`, - "GET", - undefined, - B, - ); - check(shared.toString() === "TEAM_A_MEMBER_DATA", "Shared download mismatch"); - await call(bob, `/api/datasets/${common.id}`, "GET", undefined, B, 404); - await call(bob, `/api/datasets/${ds.id}`, "DELETE", undefined, B, 403); - const sharedID = await submit(bob, B, "Read-only shared input", { - dataset_id: ds.id, - script: - "from pathlib import Path\nassert Path('/inputs/member.txt').read_text()=='TEAM_A_MEMBER_DATA'\ntry:\n Path('/inputs/bad').write_text('bad')\n raise AssertionError('writable shared input')\nexcept OSError: pass\nPath('/outputs/shared.json').write_text('ok')\nprint('SHARED_INPUT_PASSED',flush=True)", - command: undefined, - }); - await terminalJob(bob, B, sharedID); - const revokedID = await submit(bob, B, "Revoke shared input", { - dataset_id: ds.id, - command: ["python", "-c", "import time; time.sleep(180)"], - }); - await waitJob(bob, B, revokedID, "InProgress", 90); - await call(admin, `/api/teams/${A}/grants/${grant.id}`, "DELETE"); - await waitJob(bob, B, revokedID, "Cancelled", 60); - await call(bob, `/api/datasets/${ds.id}/files`, "GET", undefined, B, 404); - passed("scoped_readonly_sharing_and_running_job_revocation"); - // Durable FIFO queue survives an API/controller rollout, and teams each get a turn. - const running = await submit(alice, A, "Queue holds capacity", { - command: [ - "python", - "-c", - 'import time; print("RUNNING",flush=True); time.sleep(180)', - ], - }); - await waitJob(alice, A, running, "InProgress", 90); - const queued = await submit(alice, A, "Queue survives restart"); - const other = await submit(bob, B, "Other team gets a turn"); - await terminalJob(bob, B, other); - check( - (await call(alice, "/api/jobs/" + queued, "GET", undefined, A)) - .job_state === "Scheduled", - "Team concurrency bypassed", - ); - kube("rollout", "restart", "deployment/mist-api", "-n", "mist-system"); - kube( - "rollout", - "status", - "deployment/mist-api", - "-n", - "mist-system", - "--timeout=120s", - ); - check( - (await call(alice, "/api/jobs/" + queued, "GET", undefined, A)) - .job_state === "Scheduled", - "Queue lost on restart", - ); - await call(alice, `/api/jobs/${running}/cancel`, "POST", undefined, A); - await terminalJob(alice, A, queued); - passed("durable_fifo_team_concurrency_fair_turns_and_cancel"); - for (const body of [ - { cpu: "9" }, - { memory: "64Gi" }, - { device_count: 3, accelerator: "nvidia" }, - { timeout_seconds: 86401 }, - { image: "evil.invalid/app:v1" }, - { storage_scope: state.mate.id }, - ]) { - await call( - alice, - "/api/jobs", - "POST", - { command: ["true"], ...body }, - A, - body.storage_scope ? 403 : 400, - ); - } - await call(alice, "/api/jobs", "POST", { command: ["true"] }, "", 403); - passed("policy_limits_and_legacy_bypass_denied"); - // Network probes run inside an ordinary job, under the actual k3s policy. - const isolation = await submit(alice, A, "Workload network isolation", { - script: `import socket,os\nfrom pathlib import Path\nassert not Path('/var/run/secrets/kubernetes.io/serviceaccount/token').exists()\nfor host,port in [('10.43.1.116',3000),('10.0.0.112',2049),('10.0.0.175',6443),('100.95.175.37',22)]:\n s=socket.socket();s.settimeout(2)\n try:\n s.connect((host,port))\n raise AssertionError('private network reachable '+host)\n except (TimeoutError,ConnectionRefusedError,OSError): pass\n finally: s.close()\nassert socket.gethostbyname('github.com')\nPath('/outputs/isolation.txt').write_text('private network and credentials denied')\nprint('ISOLATION_PASSED',flush=True)`, - command: undefined, - }); - check( - (await terminalJob(alice, A, isolation)).logs.includes("ISOLATION_PASSED"), - "Missing isolation marker", - ); - passed("live_container_private_network_and_credentials_denied"); - // The full-volume writer cleans its own test file; it never touches real data. - const quota = await submit(bob, B, "Filesystem capacity enforcement", { - script: `import errno,json\nfrom pathlib import Path\np=Path('/outputs/quota-probe.bin');size=0\ntry:\n with p.open('wb',buffering=0) as f:\n for i in range(2048):\n f.write(b'x'*1048576);size+=1048576\n raise AssertionError('2GiB fit in a 1GiB team filesystem')\nexcept OSError as e:\n assert e.errno in (errno.ENOSPC,errno.EDQUOT),e\n print('STORAGE_QUOTA_PASSED bytes='+str(size),flush=True)\nfinally:\n p.unlink(missing_ok=True)\nPath('/outputs/quota.json').write_text(json.dumps({'bytes_before_limit':size}))`, - command: undefined, - }); - check( - (await terminalJob(bob, B, quota)).logs.includes("STORAGE_QUOTA_PASSED"), - "Quota not enforced", - ); - passed("training_writes_obey_filesystem_capacity"); - const matrix = (n, m, p) => - Array.from({ length: n }, (_, i) => - Array.from({ length: m }, (_, j) => Math.sin((i + 1) * (j + 2) + p)), - ); - const multiply = (x, w) => - x.map((row) => - w[0].map((_, k) => row.reduce((sum, v, j) => sum + v * w[j][k], 0)), - ); - const x = matrix(128, 32, 0.1), - vx = matrix(64, 32, 1.2), - truth = matrix(32, 32, 2.3).map((row) => row.map((v) => v * 0.1)); - const regression = await upload( - admin, - A, - "regression.json", - JSON.stringify({ - x, - y: multiply(x, truth), - validation_x: vx, - validation_y: multiply(vx, truth), - }), - "common", - ); - state.dataset = regression; - save(); - const training = readFileSync("deploy/k3s/examples/train_shared.py", "utf8"); - for (const backend of ["nvidia", "tenstorrent"]) { - const script = training.replace( - "args = parser.parse_args()", - `args = parser.parse_args(['${backend}','--expected-devices','2','--output','/outputs'])`, - ); - const id = await submit(admin, A, "Department training " + backend, { - accelerator: backend, - device_count: backend === "nvidia" ? 2 : 1, - script, - command: undefined, - dataset_id: regression.id, - storage_scope: "common", - timeout_seconds: 600, - }); - const { j, logs } = await terminalJob(admin, A, id); - check( - logs.includes("TRAINING_PASSED") && - logs.includes("DATASET_LOADED file=/inputs/regression.json"), - "Training did not use uploaded data", - ); - const files = ( - await call(admin, `/api/jobs/${id}/files`, "GET", undefined, A) - ).files; - check(files.length > 0, "No persisted model outputs"); - for (const f of files) { - const data = await call( - admin, - `/api/jobs/${id}/files/download?path=${encodeURIComponent(f.path)}`, - "GET", - undefined, - A, - ); - check(data.length === f.size, "Downloaded model size mismatch"); - writeFileSync(out + `/${backend}-${f.path.replaceAll("/", "_")}`, data); - } - report.jobs.find((e) => e.id === id).node = j.node; - passed(backend + "_real_training_uploaded_data_and_downloaded_weights"); - } - const page = await admin.newPage(); - page.on("pageerror", (e) => errors.push(e.message)); - await page.goto("/teams"); - await page.getByRole("heading", { name: "Teams", exact: true }).waitFor(); - await pick(page, "Workspace", { exact: true }, A); - await page.screenshot({ path: out + "/teams-admin.png", fullPage: true }); - await page.goto("/jobs"); - await page - .getByRole("heading", { name: "Job history", exact: true }) - .waitFor(); - await page - .getByRole("button", { name: /Show details for Department training/ }) - .first() - .click(); - await page - .getByRole("button", { name: "Files", exact: true }) - .first() - .click(); - await page.getByRole("heading", { name: "Saved files" }).waitFor(); - await page.screenshot({ path: out + "/jobs-expanded.png", fullPage: true }); - passed("browser_rows_expand_and_saved_files_open"); - await page - .getByRole("button", { name: /Hide details for Department training/ }) - .first() - .click(); - await page.screenshot({ path: out + "/jobs-rows.png", fullPage: true }); - await page.goto("/datasets"); - await page.getByRole("heading", { name: /Team folders/ }).waitFor(); - await page.screenshot({ path: out + "/team-folders.png", fullPage: true }); - passed("browser_admin_workspace_and_shared_folders"); - const before = state.a.policy.storage_gib; - await call( - admin, - `/api/teams/${A}`, - "PATCH", - { policy: { ...state.a.policy, storage_gib: before + 1 } }, - "", - ); - state.a.policy.storage_gib = before + 1; - save(); - const grown = await waitReady(A); - check( - grown.capacity_bytes > capacity.capacity_bytes, - "Storage growth did not resize filesystem", - ); - passed("online_team_storage_growth"); - await call( - admin, - `/api/teams/${A}`, - "PATCH", - { policy: { ...state.a.policy, storage_gib: 1 } }, - "", - 400, - ); - await call(admin, `/api/teams/${B}`, "PATCH", { disabled: true }); - for (const member of [state.alice, state.mate]) - await call(admin, `/api/teams/${A}/members/${member.id}`, "DELETE"); - const legacyAfter = await call(admin, "/api/jobs"); - check(legacyAfter.count === legacyBefore.count, "Legacy job history changed"); - passed("legacy_history_preserved"); - check(errors.length === 0, errors.join("; ")); - report.browser_errors = errors; - report.finished = new Date().toISOString(); - writeFileSync(out + "/results.json", JSON.stringify(report, null, 2)); - console.log(JSON.stringify(report, null, 2)); -} catch (e) { - report.error = e.message; - writeFileSync(out + "/results.json", JSON.stringify(report, null, 2)); - throw e; -} finally { - await browser.close(); -} - diff --git a/deploy/k3s/verify_department_admission.py b/deploy/k3s/verify_department_admission.py deleted file mode 100644 index 49c1f89..0000000 --- a/deploy/k3s/verify_department_admission.py +++ /dev/null @@ -1,24 +0,0 @@ -# Verification for this recorded two-machine pilot; never prints credentials. -import copy,json,os,pathlib,subprocess -out=pathlib.Path('/home/utmist/mist-department-results-2026-10-09') -env={**os.environ,'KUBECONFIG':'/home/utmist/.kube/config'} -ns='mist-team-db3933031a6c2437' -def k(*args, data=None):return subprocess.run(['k3s','kubectl',*args],input=data,text=True,capture_output=True,env=env) -jobs=json.loads(k('get','jobs','-n',ns,'-o','json').stdout)['items'] -source=next(j for j in jobs if j['metadata']['name']=='mist-7d426bc89696c01e19474c00') -base={'apiVersion':'v1','kind':'Pod','metadata':{'name':'admission-probe','namespace':ns},'spec':source['spec']['template']['spec']} -probes={ -'host_network':lambda p:p['spec'].update(hostNetwork=True), -'host_pid':lambda p:p['spec'].update(hostPID=True), -'service_account_token':lambda p:p['spec'].update(automountServiceAccountToken=True), -'privileged_container':lambda p:p['spec']['containers'][0]['securityContext'].update(privileged=True,allowPrivilegeEscalation=True), -'root_host_path':lambda p:p['spec']['volumes'].append({'name':'forbidden','hostPath':{'path':'/'}}), -'capability_add':lambda p:p['spec']['containers'][0]['securityContext']['capabilities'].update(add=['SYS_ADMIN'])} -report={} -for name,edit in probes.items(): - p=copy.deepcopy(base);edit(p) - r=k('create','--dry-run=server','-f','-',data=json.dumps(p)) - assert r.returncode and 'mist-team-boundary' in r.stderr,(name,r.stderr) - report[name]={'denied':True,'reason':r.stderr.strip()} - print('PASS ADMISSION_DENIED_'+name) -(out/'admission-results.json').write_text(json.dumps(report,indent=2)+'\n') diff --git a/deploy/k3s/verify_department_browser.mjs b/deploy/k3s/verify_department_browser.mjs deleted file mode 100644 index bc3c5ec..0000000 --- a/deploy/k3s/verify_department_browser.mjs +++ /dev/null @@ -1,419 +0,0 @@ -// Real admin/researcher browser flow. Keep passwords only in protected state. -import { - readFileSync, - writeFileSync, - mkdirSync, - existsSync, - chmodSync, -} from "node:fs"; -import { randomBytes } from "node:crypto"; -const { chromium } = await import( - process.env.MIST_PLAYWRIGHT_MODULE ?? - "/tmp/mist-browser-check/node_modules/playwright/index.mjs" -); -const base = process.env.MIST_SITE_URL ?? "http://100.73.139.66:8088"; -const out = - process.env.MIST_EVIDENCE_DIR ?? - "/home/utmist/mist-department-results-2026-10-09"; -mkdirSync(out, { recursive: true, mode: 0o700 }); -const creds = JSON.parse( - readFileSync("/home/utmist/.config/mist/admin-bootstrap.json"), -); -const file = out + "/browser-private-state.json"; -const state = existsSync(file) ? JSON.parse(readFileSync(file)) : {}; -const report = { - checks: {}, - browser_errors: [], - started: new Date().toISOString(), -}; -function save() { - writeFileSync(file, JSON.stringify(state, null, 2), { mode: 0o600 }); - chmodSync(file, 0o600); -} -function check(ok, message) { - if (!ok) throw new Error(message); -} -function pass(name) { - report.checks[name] = true; - writeFileSync(out + "/browser-results.json", JSON.stringify(report, null, 2)); - console.log("PASS " + name); -} -const browser = await chromium.launch({ headless: true }); -const ctx = await browser.newContext({ - baseURL: base, - viewport: { width: 1600, height: 1100 }, -}); -const page = await ctx.newPage(); -page.on("pageerror", (e) => report.browser_errors.push(e.message)); -async function pick(target, label, optionsOrValue, maybeValue) { - const value = maybeValue === undefined ? optionsOrValue : maybeValue; - await target.getByLabel(label, { exact: true }).click(); - await target - .locator("[role=option][data-value=" + JSON.stringify(String(value)) + "]") - .click(); -} -async function login(target, email, password) { - await target.goto("/jobs"); - await target.getByLabel("Email", { exact: true }).fill(email); - await target.getByLabel("Password", { exact: true }).fill(password); - await target.getByRole("button", { name: "Sign in", exact: true }).click(); - await target.getByRole("heading", { name: "Jobs", exact: true }).waitFor(); -} -async function api(context, path, method = "GET", data, team, expected = 200) { - let r; - try { - r = await context.request.fetch(base + path, { - method, - data, - headers: { Origin: base, ...(team ? { "X-Mist-Team": team } : {}) }, - }); - } catch { - throw new Error( - method + " " + path + " transport failure; no credentials logged", - ); - } - check( - r.status() === expected, - `${path}: expected ${expected}, got ${r.status()}`, - ); - return r.headers()["content-type"]?.includes("json") ? r.json() : r.body(); -} -try { - await login(page, creds.email, creds.password); - pass("admin_browser_login"); - const account = (await api(ctx, "/api/session")).user; - if (state.team && process.env.MIST_VERIFY_NEW_TEAM === "1") { - await api(ctx, `/api/teams/${state.team.id}`, "PATCH", { - disabled: true, - name: "Previous browser verification", - }); - delete state.team; - save(); - } - if (state.member && process.env.MIST_VERIFY_NEW_MEMBER === "1") { - delete state.member; - save(); - } - if (!state.member) { - const m = { - name: "Browser verification researcher", - email: `browser-${Date.now()}@mist.invalid`, - password: randomBytes(20).toString("base64url"), - }; - await page.goto("/profile"); - await page.getByRole("tab", { name: "Members", exact: true }).click(); - await page.getByRole("button", { name: "New member", exact: true }).click(); - await page.getByLabel("Name", { exact: true }).fill(m.name); - await page.getByLabel("Email", { exact: true }).fill(m.email); - await page.getByLabel("Initial password").fill(m.password); - const response = page.waitForResponse((r) => - r.url().endsWith("/auth/admin/create-user"), - ); - await page.getByRole("button", { name: "Add member", exact: true }).click(); - const created = await response; - check(created.ok(), "UI account creation failed"); - m.id = (await created.json()).user.id; - state.member = m; - save(); - } - pass("browser_account_creation"); - if (!state.team) { - await page.goto("/teams"); - await page.getByRole("button", { name: "New team", exact: true }).click(); - await page.getByLabel("New team name").fill("Browser verification"); - await page.getByLabel("Dataset storage (GiB)", { exact: true }).fill("1"); - await page.getByLabel("Model storage (GiB)", { exact: true }).fill("1"); - const response = page.waitForResponse( - (r) => r.url().endsWith("/api/teams") && r.request().method() === "POST", - ); - await page - .getByRole("button", { name: "Create team", exact: true }) - .click(); - const created = await response; - check(created.ok(), "UI team creation failed"); - state.team = await created.json(); - save(); - } - const team = state.team.id; - await api(ctx, `/api/teams/${team}`, "PATCH", { disabled: false }); - await api(ctx, `/api/teams/${team}/members`, "POST", { - user_id: account.id, - common_writer: true, - }); - await page.goto("/teams"); - await pick(page, "Workspace", { exact: true }, team); - await page - .getByRole("button", { name: "Manage Browser verification", exact: true }) - .click(); - const section = page.getByRole("dialog", { - name: "Team settings", - exact: true, - }); - await pick(section, "Existing Mist account", state.member.id); - await section.getByLabel("Can write common folder").check(); - await section - .getByRole("button", { name: "Add/update teammate", exact: true }) - .click(); - await section.locator("li").filter({ hasText: state.member.email }).waitFor(); - await page.getByRole("tab", { name: "Limits", exact: true }).click(); - await section.getByLabel("Total CPU cores").fill("4"); - await section.getByLabel("Total memory (for example 16Gi)").fill("8Gi"); - await section - .getByLabel("Maximum job runtime (seconds)", { exact: true }) - .fill("120"); - await section - .getByRole("button", { name: "Save limits", exact: true }) - .click(); - await section - .getByRole("status") - .filter({ hasText: "Team limits saved." }) - .waitFor(); - pass("browser_team_creation_membership_common_write_and_policy"); - await page - .getByRole("button", { name: "Close Team settings", exact: true }) - .click(); - await page.goto("/datasets"); - await page.getByRole("button", { name: "Add dataset", exact: true }).click(); - await page - .getByLabel("Dataset name (optional)") - .fill("Browser-uploaded dataset"); - await pick(page, "Upload folder", "common"); - await page.getByLabel("File or ZIP archive").setInputFiles({ - name: "ui.txt", - mimeType: "text/plain", - buffer: Buffer.from("BROWSER_UPLOADED_DATA"), - }); - await page - .getByRole("button", { name: "Upload dataset", exact: true }) - .click({ timeout: 120000 }); - await page - .getByRole("status") - .filter({ hasText: "is ready to use" }) - .waitFor({ timeout: 60000 }); - const ds = ( - await api(ctx, "/api/datasets", "GET", undefined, team) - ).datasets.find((d) => d.name === "Browser-uploaded dataset"); - check(ds, "Browser dataset missing"); - state.dataset = ds; - save(); - await page.locator(".mist-folder-details > summary").click(); - await pick(page, "Browse common or teammate files", team + ":common"); - await page - .getByRole("link", { name: "Download", exact: true }) - .first() - .waitFor(); - const downloaded = page.waitForEvent("download"); - await page - .getByRole("link", { name: "Download", exact: true }) - .first() - .click(); - check( - (await (await downloaded).failure()) === null, - "Browser dataset download failed", - ); - await page.screenshot({ - path: out + "/final-datasets-desktop.png", - fullPage: true, - }); - pass("browser_upload_common_folder_browse_and_download"); - const memberCtx = await browser.newContext({ - baseURL: base, - viewport: { width: 1440, height: 1000 }, - }), - member = await memberCtx.newPage(); - member.on("pageerror", (e) => report.browser_errors.push(e.message)); - await login(member, state.member.email, state.member.password); - await pick(member, "Workspace", { exact: true }, team); - await member.getByRole("button", { name: "New job", exact: true }).click(); - const jobName = "Browser container experiment " + Date.now(); - await member.waitForFunction( - () => document.querySelector("#job-timeout")?.value === "120", - ); - pass("job_defaults_follow_loaded_team_policy"); - await member.getByLabel("Name", { exact: true }).fill(jobName); - await member.getByLabel("Container image").fill("python:3.11-slim"); - await pick(member, "Dataset (optional)", ds.id); - await member - .getByLabel("Python script", { exact: true }) - .fill( - "from pathlib import Path\nassert Path('/inputs/ui.txt').read_text()=='BROWSER_UPLOADED_DATA'\nPath('/outputs/browser-result.txt').write_text('BROWSER_JOB_PASSED')\nprint('BROWSER_JOB_PASSED',flush=True)\n", - ); - await member.getByText("Resources and environment", { exact: true }).click(); - await member.getByLabel("Deadline (seconds)").fill("120"); - const submission = member.waitForResponse( - (r) => r.url().endsWith("/api/jobs") && r.request().method() === "POST", - ); - await member.getByRole("button", { name: "Submit job", exact: true }).click(); - const submitted = await submission; - check(submitted.ok(), "Browser job submission failed: " + submitted.status() + " " + (submitted.ok() ? "" : await submitted.text())); - const id = (await submitted.json()).job_id; - report.job_id = id; - for (let i = 0; i < 100; i++) { - const j = await api(memberCtx, `/api/jobs/${id}`, "GET", undefined, team); - if (j.job_state === "Success") break; - check( - !["Failure", "Cancelled"].includes(j.job_state), - "Browser container experiment failed", - ); - await new Promise((r) => setTimeout(r, 2000)); - } - check( - (await api(memberCtx, `/api/jobs/${id}`, "GET", undefined, team)) - .job_state === "Success", - "Browser job did not finish", - ); - await member - .getByRole("button", { name: "Show details for " + jobName, exact: true }) - .click(); - await member.getByRole("button", { name: "Logs", exact: true }).click(); - await member.getByText("BROWSER_JOB_PASSED", { exact: false }).waitFor(); - await member.getByRole("button", { name: "Files", exact: true }).click(); - const output = member.waitForEvent("download"); - await member - .getByRole("link", { name: "browser-result.txt", exact: true }) - .click(); - await (await output).saveAs(out + "/browser-result.txt"); - pass("regular_browser_selfservice_image_submit_expand_logs_result_download"); - // A regular account has no administrator controls and cannot reset accounts. - await member.goto("/teams"); - check( - (await member - .getByRole("button", { name: "Create team", exact: true }) - .count()) === 0, - "Regular user sees team administration", - ); - await api( - memberCtx, - "/auth/admin/set-user-password", - "POST", - { userId: account.id, newPassword: randomBytes(20).toString("base64url") }, - undefined, - 403, - ); - pass("regular_browser_admin_controls_denied"); - // Admin resets a test account's password in the same portal. - await page.goto("/profile"); - await page.getByRole("tab", { name: "Members", exact: true }).click(); - await page - .getByRole("button", { name: "Reset password", exact: true }) - .click(); - await pick(page, "Account to reset", state.member.id); - const next = randomBytes(20).toString("base64url"); - await page.getByLabel("New temporary password").fill(next); - await page - .getByRole("button", { - name: "Reset password and sign out sessions", - exact: true, - }) - .click(); - await page - .getByRole("status") - .filter({ hasText: "Password reset and existing sessions signed out." }) - .waitFor(); - await api(memberCtx, "/api/jobs", "GET", undefined, team, 401); - state.member.password = next; - save(); - await memberCtx.close(); - const reloginCtx = await browser.newContext({ baseURL: base }), - relogin = await reloginCtx.newPage(); - await login(relogin, state.member.email, next); - await reloginCtx.close(); - pass("browser_password_reset_revokes_sessions_new_login_works"); - await page - .getByRole("button", { name: "Close Reset password", exact: true }) - .click(); - await page.goto("/jobs"); - await pick(page, "Workspace", { exact: true }, team); - await page - .getByRole("button", { name: "Show details for " + jobName, exact: true }) - .click(); - await page.screenshot({ - path: out + "/final-jobs-desktop.png", - fullPage: true, - }); - await page - .getByRole("button", { name: "Hide details for " + jobName, exact: true }) - .click(); - await page.setViewportSize({ width: 390, height: 844 }); - await page.screenshot({ - path: out + "/final-jobs-mobile.png", - fullPage: true, - }); - check( - await page.evaluate( - () => document.documentElement.scrollWidth <= window.innerWidth, - ), - "Mobile viewport overflows horizontally", - ); - await page.setViewportSize({ width: 1600, height: 1100 }); - await page.getByRole("button", { name: "New job", exact: true }).click(); - await page.getByRole("radio", { name: /Tenstorrent/ }).check(); - await page.waitForFunction(() => - document - .querySelector('input[name="compute"]:checked') - ?.closest("label") - ?.classList.contains("is-selected"), - ); - await page - .getByRole("radio", { name: "Training check", exact: true }) - .check(); - await page.screenshot({ - path: out + "/final-job-composer.png", - fullPage: true, - }); - await page.setViewportSize({ width: 390, height: 844 }); - check( - await page - .getByRole("dialog") - .evaluate((el) => el.scrollWidth <= el.clientWidth), - "Mobile job composer overflows horizontally", - ); - await page.screenshot({ - path: out + "/final-job-composer-mobile.png", - fullPage: false, - }); - await page - .getByRole("button", { name: "Close New job", exact: true }) - .click(); - await page.setViewportSize({ width: 1600, height: 1100 }); - pass("responsive_job_dialog_and_device_slider"); - await pick(page, "Workspace", { exact: true }, ""); - await page.waitForFunction( - () => !document.querySelector('[aria-label="Next page"]')?.disabled, - ); - check( - (await page.getByRole("button", { name: /Show details for/ }).count()) <= - 10, - "History exceeds page size", - ); - check( - await page - .getByRole("button", { name: "Next page", exact: true }) - .isEnabled(), - "Preserved history has no next page", - ); - await page.getByRole("button", { name: "Next page", exact: true }).click(); - await page.getByRole("status").filter({ hasText: "Page 2 of" }).waitFor(); - await page - .getByRole("button", { name: "Previous page", exact: true }) - .click(); - await page.getByRole("status").filter({ hasText: "Page 1 of" }).waitFor(); - pass("history_pagination_next_previous_real_legacy_jobs"); - await pick(page, "Workspace", { exact: true }, team); - await page.goto("/dashboard"); - await page.screenshot({ path: out + "/final-overview.png", fullPage: true }); - pass("desktop_mobile_layout_no_overflow_or_browser_errors"); - await api(ctx, `/api/teams/${team}`, "PATCH", { disabled: true }); - const pilot = JSON.parse(readFileSync(out + "/private-state.json")).a.id; - await pick(page, "Workspace", { exact: true }, pilot); - check(report.browser_errors.length === 0, report.browser_errors.join("; ")); - report.finished = new Date().toISOString(); - writeFileSync(out + "/browser-results.json", JSON.stringify(report, null, 2)); - console.log(JSON.stringify(report, null, 2)); -} catch (e) { - report.error = e.message; - writeFileSync(out + "/browser-results.json", JSON.stringify(report, null, 2)); - throw e; -} finally { - await browser.close(); -} diff --git a/deploy/k3s/verify_department_remote_cli.py b/deploy/k3s/verify_department_remote_cli.py deleted file mode 100644 index 38ec76a..0000000 --- a/deploy/k3s/verify_department_remote_cli.py +++ /dev/null @@ -1,47 +0,0 @@ -# Verification for this recorded two-machine pilot; never prints credentials. -import json, pathlib, subprocess, time, shlex -root=pathlib.Path('/home/utmist/mist-department-results-2026-10-09') -credentials=json.loads(pathlib.Path('/home/utmist/.config/mist/admin-bootstrap.json').read_text()) -ssh=['ssh','-i','/home/utmist/.ssh/id_ed25519_quietbox_codex','-o','IdentitiesOnly=yes','-o','BatchMode=yes','utmist-tt@100.95.175.37'] -base='~/mist-department-verification/mist-cli --api-url http://100.73.139.66:8088/api --config ~/mist-department-verification/verification-config.json ' -def run(cmd, data=None): - p=subprocess.run(ssh+[cmd], input=data, text=True,capture_output=True,timeout=40) - if p.returncode: raise RuntimeError('Remote command failed: '+p.stderr[:2000]) - return p.stdout -probe="""from pathlib import Path -import torch -assert torch.cuda.is_available(), 'CUDA unavailable' -assert torch.cuda.device_count()==1, torch.cuda.device_count() -x=torch.randn(128,128,device='cuda',requires_grad=True) -loss=(x@x).square().mean() -loss.backward() -assert torch.isfinite(x.grad).all() -Path('/outputs/remote-cli-proof.txt').write_text('REMOTE_CLI_NVIDIA_PASSED devices=1') -print('REMOTE_CLI_NVIDIA_PASSED devices=1',flush=True) -""" -run("cat > ~/mist-department-verification/nvidia.py",probe) -report={'origin_node':'utmist-tt','destination_node':'utmist-z1opa08','team_id':'team-db3933031a6c2437'} -try: - run(base+'auth login --email '+shlex.quote(credentials['email'])+' --password-stdin',credentials['password']+'\n') - report['login']=True - run(base+'team use team-db3933031a6c2437') - report['team_selection']=True - submitted=run(base+'job submit ~/mist-department-verification/nvidia.py --compute NVIDIA --devices 1 --timeout 120 --name remote-cli-nvidia') - job=submitted.strip().split()[-1]; report['job_id']=job - for _ in range(90): - status=run(base+'job status '+job) - if 'Success' in status: break - if 'Failure' in status or 'Cancelled' in status: raise RuntimeError(status) - time.sleep(2) - else: raise RuntimeError('Remote submitted job did not finish') - logs=run(base+'job logs '+job) - assert 'utmist-z1opa08' in status and 'REMOTE_CLI_NVIDIA_PASSED' in logs - report['job_succeeded']=True - (root/'remote-cli-status.txt').write_text(status) - (root/'remote-cli-job.log').write_text(logs) - print(status,logs) -finally: - run(base+'auth logout') - run("python3 -c \"from pathlib import Path; Path.home().joinpath('mist-department-verification/verification-config.json').unlink(missing_ok=True)\"") -(root/'remote-cli-results.json').write_text(json.dumps(report,indent=2)+'\n') -print('PASS SSH_TENSTORRENT_CLI_SUBMISSION_NVIDIA_ON_MAIN') diff --git a/deploy/k3s/verify_department_runtime.py b/deploy/k3s/verify_department_runtime.py deleted file mode 100644 index 57e35ce..0000000 --- a/deploy/k3s/verify_department_runtime.py +++ /dev/null @@ -1,81 +0,0 @@ -"""Live execution checks for the recorded pilot; credentials remain local.""" -import http.cookiejar -import json -import pathlib -import time -import urllib.error -import urllib.request - -ROOT = pathlib.Path('/home/utmist/mist-department-results-2026-10-09') -BASE = 'http://100.73.139.66:8088' -TEAM = 'team-db3933031a6c2437' -credentials = json.loads(pathlib.Path('/home/utmist/.config/mist/admin-bootstrap.json').read_text()) -client = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar())) -report = {'checks': {}, 'jobs': []} - - -def api(path, body=None): - request = urllib.request.Request(BASE + path, data=json.dumps(body).encode() if body is not None else None, - headers={'Origin': BASE, 'Content-Type': 'application/json', 'X-Mist-Team': TEAM}) - with client.open(request, timeout=30) as response: - return json.load(response) - - -def submit(name, **data): - job = api('/api/jobs', {'name': name, 'type': 'command', 'accelerator': 'cpu', 'timeout_seconds': 120, - 'command': ['python', '-c', "print('PASSED',flush=True)"], **data})['job_id'] - report['jobs'].append({'id': job, 'name': name}) - return job - - -def terminal(job, expected): - for _ in range(120): - result = api('/api/jobs/' + job) - if result['job_state'] in ['Success', 'Failure', 'Cancelled']: - assert result['job_state'] == expected, result - log = api('/api/jobs/' + job + '/logs')['logs'] - (ROOT / (job + '.log')).write_text(log) - return result, log - time.sleep(2) - raise RuntimeError('Job timed out ' + job) - - -try: - api('/auth/sign-in/email', {'email': credentials['email'], 'password': credentials['password']}) - first = submit('Concurrent TT board A', type='training-smoke', accelerator='tenstorrent', device_count=1, command=None) - second = submit('Concurrent TT board B', type='training-smoke', accelerator='tenstorrent', device_count=1, command=None) - allocations = {} - concurrent = False - for _ in range(120): - jobs = [api('/api/jobs/' + job) for job in [first, second]] - if all(j['job_state'] == 'InProgress' for j in jobs): - concurrent = True - for job in jobs: - if job.get('devices'): - allocations[job['id']] = job['devices'] - if all(j['job_state'] in ['Success', 'Failure', 'Cancelled'] for j in jobs): - break - time.sleep(1) - assert concurrent, 'TT jobs did not overlap' - for job in [first, second]: - result, log = terminal(job, 'Success') - assert result['node'] == 'utmist-tt' and 'TRAINING_PASSED backend=tenstorrent devices=2' in log, log - assert len(allocations) == 2, allocations - left = {(d['pool'], d['device']) for d in allocations[first]} - right = {(d['pool'], d['device']) for d in allocations[second]} - assert len(left) == len(right) == 1 and left.isdisjoint(right), allocations - report['allocations'] = allocations - report['checks']['concurrent_tt_jobs_distinct_boards_real_training'] = True - print('PASS CONCURRENT_TT_JOBS_DISTINCT_BOARDS_TRAINING') - failure = submit('Intentional failure', command=['python', '-c', "print('EXPECTED_EXIT_7',flush=True); raise SystemExit(7)"]) - result, log = terminal(failure, 'Failure') - assert result.get('exit_code') == 7 and 'EXPECTED_EXIT_7' in log - report['checks']['nonzero_exit_visible_no_retry'] = True - deadline = submit('Execution deadline', timeout_seconds=10, command=['python', '-c', "import time; print('DEADLINE_STARTED',flush=True); time.sleep(120)"]) - result, log = terminal(deadline, 'Failure') - assert 'Deadline' in result.get('message', '') or 'deadline' in result.get('message', '').lower(), result - report['checks']['execution_deadline_failure_visible'] = True - print('PASS EXIT_CODE_AND_DEADLINE_FAILURES') -finally: - api('/auth/sign-out', {}) -(ROOT / 'runtime-results.json').write_text(json.dumps(report, indent=2) + '\n') diff --git a/deploy/k3s/verify_large_dataset.py b/deploy/k3s/verify_large_dataset.py deleted file mode 100644 index ed8fcee..0000000 --- a/deploy/k3s/verify_large_dataset.py +++ /dev/null @@ -1,83 +0,0 @@ -"""Verify a streamed dataset exceeds 2 GiB and can be mounted by a real Job.""" -import hashlib -import http.cookiejar -import json -import pathlib -import tempfile -import time -import urllib.request - -OUT = pathlib.Path('/home/utmist/mist-department-results-2026-10-09') -BASE = 'http://100.73.139.66:8088' -credentials = json.loads(pathlib.Path('/home/utmist/.config/mist/admin-bootstrap.json').read_text()) -client = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar())) -report = {'checks': {}} -team = '' - -def call(path, body=None): - request = urllib.request.Request(BASE + path, data=json.dumps(body).encode() if body is not None else None, - headers={'Origin': BASE, 'Content-Type': 'application/json', **({'X-Mist-Team': team} if team else {})}) - with client.open(request, timeout=30) as response: - return json.load(response) - -try: - call('/auth/sign-in/email', {'email': credentials['email'], 'password': credentials['password']}) - admin = call('/api/session')['user'] - teams = call('/api/teams')['teams'] - existing = next((t for t in teams if t['name'] == 'Large dataset verification'), None) - if existing is None: - existing = call('/api/teams', {'name': 'Large dataset verification', 'storage_gib': 4}) - team = existing['id'] - request = urllib.request.Request(BASE + '/api/teams/' + team, method='PATCH', data=b'{"disabled":false}', headers={'Origin': BASE, 'Content-Type': 'application/json'}) - client.open(request, timeout=30).close() - call('/api/teams/' + team + '/members', {'user_id': admin['id'], 'common_writer': True}) - for _ in range(60): - try: - storage = call('/api/storage') - if storage['upload_limit_bytes'] > 2**31: break - except Exception: pass - time.sleep(1) - else: raise RuntimeError('Large team filesystem not ready') - # Sparse local source avoids allocating a second local multi-GiB copy; - # all bytes are nevertheless streamed over the actual portal/NFS path. - size = 2**31 + 4 * 1024**2 - with tempfile.TemporaryFile() as source: - source.write(b'LARGE_DATASET_START') - source.truncate(size) - source.seek(size - len(b'LARGE_DATASET_END!')); source.write(b'LARGE_DATASET_END!') - source.seek(0) - digest = hashlib.sha256() - while chunk := source.read(1024 * 1024): digest.update(chunk) - checksum = digest.hexdigest() - source.seek(0) - request = urllib.request.Request(BASE + '/api/datasets?filename=large.bin&name=Large%20dataset%20probe', data=source, - headers={'Origin': BASE, 'Content-Type': 'application/octet-stream', 'Content-Length': str(size), 'X-Mist-Team': team}) - started = time.monotonic() - with client.open(request, timeout=14400) as response: - dataset = json.load(response) - assert dataset['size'] == size and dataset['sha256'] == checksum, dataset - report.update(team_id=team, dataset_id=dataset['id'], bytes=size, upload_seconds=round(time.monotonic()-started, 1)) - report['checks']['actual_upload_over_2_gib_checksum_verified'] = True - print('PASS STREAMED_UPLOAD_OVER_2_GIB_CHECKSUM', flush=True) - script = f"from pathlib import Path\np=Path('/inputs/large.bin')\nassert p.stat().st_size=={size}\nwith p.open('rb') as f:\n assert f.read(19)==b'LARGE_DATASET_START'\n f.seek(-len(b'LARGE_DATASET_END!'),2)\n assert f.read()==b'LARGE_DATASET_END!'\nprint('LARGE_DATASET_JOB_PASSED',flush=True)\n" - job = call('/api/jobs', {'name':'Large dataset input verification', 'type':'command', 'accelerator':'cpu', 'dataset_id': dataset['id'], 'script':script, 'script_name':'verify.py', 'timeout_seconds':120})['job_id'] - report['job_id'] = job - for _ in range(90): - result = call('/api/jobs/' + job) - if result['job_state'] in ['Success','Failure','Cancelled']: break - time.sleep(2) - assert result['job_state'] == 'Success', result - logs = call('/api/jobs/' + job + '/logs')['logs'] - assert 'LARGE_DATASET_JOB_PASSED' in logs - (OUT/'large-dataset-job.log').write_text(logs) - report['checks']['large_file_mounted_readonly_real_job'] = True - # Remove only this verifier's large dataset after its sole Job has finished. - request = urllib.request.Request(BASE + '/api/datasets/' + dataset['id'], method='DELETE', headers={'X-Mist-Team':team}) - client.open(request, timeout=30).close() - report['checks']['own_probe_removed_after_job_no_user_files_deleted'] = True - request = urllib.request.Request(BASE + '/api/teams/' + team, method='PATCH', data=b'{"disabled":true}', headers={'Origin': BASE, 'Content-Type': 'application/json'}) - client.open(request, timeout=30).close() - print('PASS LARGE_FILE_MOUNT_AND_OWN_PROBE_CLEANUP', flush=True) -finally: - call('/auth/sign-out', {}) - (OUT/'large-dataset-results.json').write_text(json.dumps(report, indent=2)+'\n') diff --git a/deploy/k3s/verify_storage_folders.py b/deploy/k3s/verify_storage_folders.py deleted file mode 100644 index 5e8c431..0000000 --- a/deploy/k3s/verify_storage_folders.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python3 -"""Small live checks: regular-member uploads, isolation, and NVIDIA/TT training. - -Creates two small verification workspaces and one regular account. No large files, -quota exhaustion, migration or old-data deletion. Credentials stay outside Git. -""" -import argparse -import hashlib -import http.cookiejar -import io -import json -import os -from pathlib import Path -import random -import secrets -import time -import urllib.error -import urllib.parse -import urllib.request -import zipfile - - -class Client: - def __init__(self, base): - self.base = base.rstrip('/') - self.opener = urllib.request.build_opener( - urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar())) - - def call(self, path, body=None, team=None, method=None, expected=200, raw=False): - payload = body if isinstance(body, bytes) else json.dumps(body).encode() if body is not None else None - headers = {'Origin': self.base, 'Content-Type': 'application/octet-stream' if isinstance(body, bytes) else 'application/json'} - if team: - headers['X-Mist-Team'] = team - request = urllib.request.Request(self.base + path, data=payload, headers=headers, method=method) - try: - response = self.opener.open(request, timeout=30) - except urllib.error.HTTPError as error: - if error.code != expected: - raise RuntimeError(f'{path}: unexpected HTTP {error.code}') from None - response = error - with response: - assert response.code == expected, (path, response.code) - return response.read() if raw else json.load(response) - - -def main(): - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument('--base', default='http://100.73.139.66:8088') - parser.add_argument('--credentials', type=Path, default=Path('/home/utmist/.config/mist/admin-bootstrap.json')) - parser.add_argument('--out', required=True, type=Path) - args = parser.parse_args() - args.out.mkdir(parents=True, exist_ok=True, mode=0o700) - os.chmod(args.out, 0o700) - report = {'checks': [], 'jobs': [], 'bulk_testing': False} - admin, member = Client(args.base), Client(args.base) - jobs = [] - stamp = secrets.token_hex(4) - - def passed(name): - report['checks'].append(name) - print('PASS ' + name, flush=True) - - try: - creds = json.loads(args.credentials.read_text()) - identity = admin.call('/auth/sign-in/email', {'email': creds['email'], 'password': creds['password']})['user'] - teams = [admin.call('/api/teams', {'name': 'Storage verification ' + stamp + suffix, - 'storage_gib': 1, 'model_storage_gib': 1}, expected=201) for suffix in (' A', ' B')] - for team in teams: - admin.call('/api/teams/' + team['id'] + '/members', {'user_id': identity['id'], 'common_writer': True}) - email, password = 'storage-check-' + stamp + '@mist.local', secrets.token_urlsafe(24) - user = admin.call('/auth/admin/create-user', {'name': 'Storage check ' + stamp, 'email': email, - 'password': password, 'role': 'user'})['user'] - admin.call('/api/teams/' + teams[0]['id'] + '/members', {'user_id': user['id'], 'common_writer': False}) - member.call('/auth/sign-in/email', {'email': email, 'password': password}) - team = teams[0]['id'] - state = args.out / 'member-private.json' - state.write_text(json.dumps({'email': email, 'password': password, 'team_id': team})) - state.chmod(0o600) - for _ in range(60): - try: - storage = member.call('/api/storage', team=team) - break - except RuntimeError: - time.sleep(1) - else: - raise AssertionError('team folders did not become ready') - assert storage['storage_mode'] == 'shared-folders' and storage['storage_limits_enforced'] is False - assert storage['upload_limit_bytes'] > 0 - passed('regular_member_login_and_shared_folder_readiness') - member.call('/api/jobs', team=teams[1]['id'], expected=403) - member.call('/api/datasets?filename=forbidden.txt&scope=common', b'no', team=team, expected=403) - passed('membership_and_common_write_permissions_enforced') - - archive = io.BytesIO() - with zipfile.ZipFile(archive, 'w') as z: - z.writestr('../escape.txt', 'no') - member.call('/api/datasets?filename=unsafe.zip&format=zip', archive.getvalue(), team=team, expected=400) - passed('unsafe_archive_rejected') - - rng = random.Random(42) - weights = [[rng.gauss(0, .1) for _ in range(32)] for _ in range(32)] - x = [[rng.gauss(0, 1) for _ in range(32)] for _ in range(128)] - vx = [[rng.gauss(0, 1) for _ in range(32)] for _ in range(64)] - def targets(rows): - return [[sum(row[k] * weights[k][j] for k in range(32)) for j in range(32)] for row in rows] - payload = json.dumps({'x': x, 'y': targets(x), 'validation_x': vx, 'validation_y': targets(vx)}).encode() - assert len(payload) < 400000 - dataset = member.call('/api/datasets?filename=regression.json&name=Ethernet%20storage%20check', payload, team=team, expected=201) - report['dataset_bytes'] = len(payload) - assert dataset['sha256'] == hashlib.sha256(payload).hexdigest() - download = '/api/datasets/' + dataset['id'] + '/files/download?path=regression.json' - assert member.call(download, team=team, raw=True) == payload - admin.call('/api/datasets/' + dataset['id'], team=teams[1]['id'], expected=404) - admin.call('/api/storage/files?' + urllib.parse.urlencode({'source_team': team, 'scope': user['id']}), team=teams[1]['id'], expected=404) - passed('small_upload_checksum_download_and_cross_team_isolation') - - source = (Path(__file__).parent / 'examples/train_shared.py').read_text() - for backend, expected in [('nvidia', 1), ('tenstorrent', 2)]: - script = source.replace('args = parser.parse_args()', - f"args = parser.parse_args(['{backend}','--expected-devices','{expected}','--output','/outputs'])") - job = member.call('/api/jobs', {'name': 'Ethernet folder training ' + backend, 'type': 'command', - 'accelerator': backend, 'device_count': 1, 'dataset_id': dataset['id'], 'script': script, - 'script_name': 'train.py', 'timeout_seconds': 600}, team=team, expected=201)['job_id'] - jobs.append(job) - report['jobs'].append({'id': job, 'backend': backend}) - member.call('/api/datasets/' + dataset['id'], team=team, method='DELETE', expected=409) - passed('active_dataset_deletion_blocked') - - deadline = time.monotonic() + 660 - for job in report['jobs']: - while time.monotonic() < deadline: - status = member.call('/api/jobs/' + job['id'], team=team) - if status['job_state'] in ('Success', 'Failure', 'Cancelled'): - break - time.sleep(2) - log = member.call('/api/jobs/' + job['id'] + '/logs', team=team)['logs'] - (args.out / (job['backend'] + '.log')).write_text(log) - assert status['job_state'] == 'Success', (job['backend'], status.get('message')) - assert 'DATASET_LOADED file=/inputs/regression.json' in log and 'TRAINING_PASSED' in log - files = member.call('/api/jobs/' + job['id'] + '/files', team=team)['files'] - assert any(f['path'].endswith('.pt') for f in files) - for file in files: - content = member.call('/api/jobs/' + job['id'] + '/files/download?' + urllib.parse.urlencode({'path': file['path']}), team=team, raw=True) - assert len(content) == file['size'] - if file['path'] == 'results.json': - job['metrics'] = json.loads(content) - job['node'], job['status'] = status['node'], status['job_state'] - passed(job['backend'] + '_real_training_and_output_downloads') - for _ in range(45): - storage = member.call('/api/storage', team=team) - if storage['dataset_used_bytes'] >= len(payload) and storage['model_used_bytes'] > 0: - break - time.sleep(1) - assert storage['dataset_used_bytes'] >= len(payload) and storage['model_used_bytes'] > 0 - assert storage['usage_stale'] is False - report['storage'] = storage - passed('host_sampled_dataset_and_model_usage') - report['teams'] = [t['id'] for t in teams] - except Exception: - for job in jobs: - try: - member.call('/api/jobs/' + job + '/cancel', team=team, method='POST') - except Exception: - pass - raise - finally: - for client in (member, admin): - try: - client.call('/auth/sign-out', {}, method='POST') - except Exception: - pass - (args.out / 'results.json').write_text(json.dumps(report, indent=2) + '\n') - - -if __name__ == '__main__': - main() diff --git a/deploy/k3s/verify_storage_folders_browser.mjs b/deploy/k3s/verify_storage_folders_browser.mjs deleted file mode 100644 index 5efbd03..0000000 --- a/deploy/k3s/verify_storage_folders_browser.mjs +++ /dev/null @@ -1,59 +0,0 @@ -// Review the real portal using the regular account from verify_storage_folders.py. -// State and screenshots are written only to the protected external evidence dir. -import { readFileSync, writeFileSync } from 'node:fs' -import { createHash } from 'node:crypto' - -const { chromium } = await import( - process.env.MIST_PLAYWRIGHT_MODULE ?? - '/tmp/mist-browser-check/node_modules/playwright/index.mjs' -) -const base = process.env.MIST_SITE_URL ?? 'http://100.73.139.66:8088' -const out = process.env.MIST_STORAGE_EVIDENCE_DIR -if (!out) throw new Error('Set MIST_STORAGE_EVIDENCE_DIR to the live verifier output directory') -const state = JSON.parse(readFileSync(`${out}/member-private.json`, 'utf8')) -const browser = await chromium.launch({ headless: true }) -const context = await browser.newContext({ viewport: { width: 1440, height: 1000 } }) -const page = await context.newPage() -const report = { checks: [], browser_errors: [] } -page.on('pageerror', (error) => report.browser_errors.push(error.message)) -try { - await page.goto(`${base}/datasets`) - await page.getByLabel('Email', { exact: true }).fill(state.email) - await page.getByLabel('Password', { exact: true }).fill(state.password) - await page.getByRole('button', { name: 'Sign in', exact: true }).click() - await page.getByRole('heading', { name: 'Datasets', exact: true }).waitFor() - await page.getByLabel('Workspace', { exact: true }).click() - await page.locator(`[role=option][data-value="${state.team_id}"]`).click() - await page.getByText(/Shared disk:/).waitFor() - await page.getByText('Advisory allowance — shared disk space is not reserved.').first().waitFor() - report.checks.push('regular_member_login_and_advisory_storage_display') - - await page.getByRole('button', { name: 'Add dataset', exact: true }).click() - await page.getByLabel('Dataset name (optional)').fill('Browser Ethernet check') - const payload = Buffer.from('x,y\n1,2\n') - await page.getByLabel('File or ZIP archive', { exact: true }).setInputFiles({ - name: 'browser.csv', mimeType: 'text/csv', buffer: payload, - }) - const response = page.waitForResponse((r) => r.url().includes('/api/datasets?') && r.request().method() === 'POST') - await page.getByRole('button', { name: 'Upload dataset', exact: true }).click() - const uploaded = await response - if (uploaded.status() !== 201) throw new Error(`Upload HTTP ${uploaded.status()}`) - const dataset = await uploaded.json() - if (dataset.sha256 !== createHash('sha256').update(payload).digest('hex')) throw new Error('Browser upload checksum mismatch') - await page.getByText('Browser Ethernet check is ready to use.', { exact: true }).waitFor() - report.checks.push('real_browser_upload_with_verified_checksum') - await page.screenshot({ path: `${out}/datasets-browser.png`, fullPage: true }) - - await page.goto(`${base}/jobs`) - await page.getByText('Ethernet folder training nvidia', { exact: true }).waitFor() - await page.getByText('Ethernet folder training tenstorrent', { exact: true }).waitFor() - report.checks.push('both_real_training_jobs_visible_in_member_history') - await page.screenshot({ path: `${out}/jobs-browser.png`, fullPage: true }) - if (report.browser_errors.length) throw new Error('Browser reported JavaScript errors') - report.checks.push('no_browser_javascript_errors') - console.log('PASS ' + report.checks.join(', ')) -} finally { - await context.request.post(`${base}/auth/sign-out`, { data: {}, headers: { Origin: base } }).catch(() => {}) - await browser.close() - writeFileSync(`${out}/browser-results.json`, JSON.stringify(report, null, 2)) -} diff --git a/deploy/k3s/verify_tenstorrent_allocation.py b/deploy/k3s/verify_tenstorrent_allocation.py deleted file mode 100644 index 4762791..0000000 --- a/deploy/k3s/verify_tenstorrent_allocation.py +++ /dev/null @@ -1,225 +0,0 @@ -"""Live acceptance test: four isolated n300 jobs, a fifth queued, then reuse. - -Run from the repo root with an admin KUBECONFIG and Python PyYAML installed. -Test jobs and checkpoint subdirectories are unique per run and retained. -The device probes mount character nodes solely to check cgroup enforcement; -normal training jobs receive their devices exclusively through DRA/CDI. -""" - -import argparse -import copy -from datetime import datetime, timezone -import json -from pathlib import Path -import subprocess -import time - -import yaml - - -def kubectl(*args, data=None): - result = subprocess.run(["k3s", "kubectl", *args], input=data, text=True, - capture_output=True, timeout=45) - if result.returncode: - raise RuntimeError(result.stderr or result.stdout) - return result.stdout - - -def get(kind, *args): - return json.loads(kubectl("-n", "mist", "get", kind, *args, "-o", "json")) - - -def poll(check, description, timeout=240): - deadline = time.monotonic() + timeout - while time.monotonic() < deadline: - result = check() - if result: - return result - time.sleep(2) - raise AssertionError(f"Timed out: {description}") - - -def pod_for(job): - pods = get("pods", "-l", f"job-name={job}")["items"] - if not pods: - return None - assert len(pods) == 1, f"Expected one pod for {job}" - pod = pods[0] - assert pod["status"]["phase"] != "Failed", kubectl("-n", "mist", "logs", pod["metadata"]["name"]) - return pod - - -def collect_results(run, jobs, pods, artifacts): - """Read retained PVC data after training pods exit, then remove the reader.""" - reader_name = run + "-results" - reader = {"apiVersion": "v1", "kind": "Pod", "metadata": { - "name": reader_name, "namespace": "mist"}, "spec": { - "restartPolicy": "Never", "automountServiceAccountToken": False, - "activeDeadlineSeconds": 180, - "nodeSelector": {"kubernetes.io/hostname": "utmist-tt"}, - "containers": [{"name": "reader", "image": pods[0]["spec"]["containers"][0]["image"], - "imagePullPolicy": "IfNotPresent", "command": ["sleep", "180"], - "securityContext": {"allowPrivilegeEscalation": False, "capabilities": {"drop": ["ALL"]}}, - "resources": {"requests": {"cpu": "10m", "memory": "32Mi"}, - "limits": {"cpu": "1", "memory": "256Mi"}}, - "volumeMounts": [{"name": "checkpoints", "mountPath": "/checkpoints", "readOnly": True}]}], - "volumes": [{"name": "checkpoints", "persistentVolumeClaim": { - "claimName": "training-tenstorrent-checkpoints", "readOnly": True}}]}} - kubectl("create", "-f", "-", data=json.dumps(reader)) - try: - poll(lambda: get("pod", reader_name)["status"]["phase"] == "Running", "PVC reader running", timeout=90) - script = '''import json, pathlib, sys -root=pathlib.Path("/checkpoints")/sys.argv[1] -data=[] -for i in range(5): - folder=root/str(i) - results=json.loads((folder/"results.json").read_text()) - for result in results: - assert (folder/("tenstorrent-"+str(result["device_id"])+".pt")).stat().st_size>1000 - data.append({"allocation":json.loads((folder/"allocation.json").read_text()), "results":results}) -print(json.dumps(data)) -''' - summaries = json.loads(kubectl("-n", "mist", "exec", reader_name, "--", "python3", "-c", script, run)) - for index, summary in enumerate(summaries): - summary["job"] = jobs[index]["metadata"]["name"] - assert len(summary["results"]) == 2 and summary["allocation"]["chip_count"] == 2 - assert len(summary["allocation"]["device_nodes"]) == 1 - for result in summary["results"]: - assert result["final_mse"] < result["initial_mse"] * 0.02 - assert result["validation_mse"] < 0.0005 - assert result["max_weight_change"] > 0.05 - assert abs(result["checkpoint_reload_mse"] - result["validation_mse"]) < 1e-7 - starts = [datetime.fromisoformat(s["results"][0]["started_at"]) for s in summaries[:4]] - ends = [datetime.fromisoformat(s["results"][0]["finished_at"]) for s in summaries[:4]] - overlap = (min(ends) - max(starts)).total_seconds() - assert overlap > 0, "First-chip training must overlap across all four jobs" - released = min(datetime.fromisoformat(p["status"]["containerStatuses"][0]["state"]["terminated"]["finishedAt"].replace("Z", "+00:00")) - for p in pods[:4]) - assert datetime.fromisoformat(summaries[4]["results"][0]["started_at"]) > released - data = {"four_job_training_overlap_seconds": overlap, "jobs": summaries} - (artifacts / "training-results.json").write_text(json.dumps(data, indent=2) + "\n") - with (artifacts / "concurrent-checkpoints.tar.gz").open("wb") as output: - subprocess.run(["k3s", "kubectl", "-n", "mist", "exec", reader_name, "--", "tar", - "-C", "/checkpoints", "-czf", "-", run], stdout=output, check=True, timeout=45) - return data - finally: - kubectl("-n", "mist", "delete", "pod", reader_name, "--wait=false", "--ignore-not-found") - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("--artifacts", type=Path, required=True) - args = parser.parse_args() - args.artifacts.mkdir(parents=True, exist_ok=True) - run = "tt-alloc-" + datetime.now(timezone.utc).strftime("%m%d-%H%M%S") - checkpoint_root = f"/checkpoints/{run}" - docs = list(yaml.safe_load_all(Path("deploy/k3s/training-tenstorrent-job.yaml").read_text())) - base = next(doc for doc in docs if doc["kind"] == "Job") - kubectl("apply", "-f", "-", data=yaml.safe_dump_all(doc for doc in docs if doc["kind"] != "Job")) - configmap = kubectl("-n", "mist", "create", "configmap", "training-smoke-script", - "--from-file=deploy/k3s/training_smoke.py", "--dry-run=client", "-o", "yaml") - kubectl("apply", "-f", "-", data=configmap) - names = [f"{run}-{i}" for i in range(5)] - - def job(index): - manifest = copy.deepcopy(base) - manifest["metadata"]["name"] = names[index] - manifest["metadata"]["labels"] = {"mist.io/allocation-test": run} - spec = manifest["spec"]["template"]["spec"] - spec["automountServiceAccountToken"] = False - container = spec["containers"][0] - container["command"] = container["command"][:4] + [ - "--expected-devices", "2", "--steps", "500", "--output", f"{checkpoint_root}/{index}", - "--start-file", f"{checkpoint_root}/start"] - for number in range(4): - spec["volumes"].append({"name": f"probe-{number}", "hostPath": { - "path": f"/dev/tenstorrent/{number}", "type": "CharDevice"}}) - container["volumeMounts"].append({"name": f"probe-{number}", - "mountPath": f"/isolation/{number}"}) - return manifest - - kubectl("apply", "-f", "-", data=yaml.safe_dump_all(job(i) for i in range(4))) - print(f"RUN={run}: waiting for four initialized training jobs", flush=True) - - def ready(): - pods = [pod_for(name) for name in names[:4]] - if not all(pod and pod["status"]["phase"] == "Running" for pod in pods): - return None - logs = [kubectl("-n", "mist", "logs", pod["metadata"]["name"]) for pod in pods] - return pods if all("BARRIER_READY" in log for log in logs) else None - - pods = poll(ready, "four jobs ready") - claims = get("resourceclaims") - allocations = {} - for pod in pods: - claim_name = pod["status"]["resourceClaimStatuses"][0]["resourceClaimName"] - claim = next(c for c in claims["items"] if c["metadata"]["name"] == claim_name) - result = claim["status"]["allocation"]["devices"]["results"] - assert len(result) == 1 - allocations[pod["metadata"]["name"]] = result[0]["device"] - assert len(set(allocations.values())) == 4, allocations - (args.artifacts / "claims-while-full.json").write_text(json.dumps(claims, indent=2) + "\n") - (args.artifacts / "pods-while-full.json").write_text(json.dumps(pods, indent=2) + "\n") - - probe = '''import json,os,pathlib -visible=list(pathlib.Path("/dev/tenstorrent").iterdir()) -assert len(visible)==1, visible -allowed=[]; denied=[] -for i in range(4): - try: - fd=os.open("/isolation/"+str(i),os.O_RDWR); os.close(fd); allowed.append(str(i)) - except PermissionError: - denied.append(str(i)) -assert allowed==[visible[0].name], (allowed,visible) -assert len(denied)==3, denied -print(json.dumps({"allowed":allowed,"denied":denied})) -''' - isolation = {} - for pod in pods: - name = pod["metadata"]["name"] - isolation[name] = json.loads(kubectl("-n", "mist", "exec", name, "--", "python3", "-c", probe)) - print(f"Four distinct reservations, device access isolated: {allocations}", flush=True) - - kubectl("apply", "-f", "-", data=yaml.safe_dump(job(4))) - - def queued(): - pod = pod_for(names[4]) - if not pod: - return None - events = get("events", "--field-selector", f"involvedObject.name={pod['metadata']['name']}")["items"] - failed = [event for event in events if event["reason"] == "FailedScheduling"] - if not failed: - return None - assert pod["status"]["phase"] == "Pending", pod - assert not pod["spec"].get("nodeName"), pod - assert any("resourceclaim" in e["message"].lower() or - "cannot allocate" in e["message"].lower() for e in failed), failed - return {"pod": pod, "events": failed} - - queue_evidence = poll(queued, "fifth job blocked by device allocation", timeout=60) - (args.artifacts / "fifth-job-queued.json").write_text(json.dumps(queue_evidence, indent=2) + "\n") - print("Fifth job is pending because all boards are reserved; releasing training barrier", flush=True) - kubectl("-n", "mist", "exec", pods[0]["metadata"]["name"], "--", "touch", f"{checkpoint_root}/start") - - def complete(): - jobs = [get("jobs", name) for name in names] - assert not any(j["status"].get("failed") for j in jobs), "A training job failed" - return jobs if all(j["status"].get("succeeded") == 1 for j in jobs) else None - - jobs = poll(complete, "all five jobs successfully trained", timeout=300) - final_pods = [pod_for(name) for name in names] - for index, pod in enumerate(final_pods): - log = kubectl("-n", "mist", "logs", pod["metadata"]["name"]) - assert "TRAINING_PASSED backend=tenstorrent devices=2" in log - assert pod["status"]["containerStatuses"][0]["state"]["terminated"]["exitCode"] == 0 - (args.artifacts / f"job-{index}.log").write_text(log) - summary = {"run": run, "allocations": allocations, "isolation": isolation, - "fifth_job_queued": True, "all_five_jobs_complete": True, - "checkpoint_root": checkpoint_root, "jobs": jobs, "pods": final_pods} - summary["training"] = collect_results(run, jobs, final_pods, args.artifacts) - (args.artifacts / "acceptance.json").write_text(json.dumps(summary, indent=2) + "\n") - print(f"ALLOCATION_PASSED run={run}; all five jobs completed; checkpoints at {checkpoint_root}", flush=True) - - -if __name__ == "__main__": - main() diff --git a/deploy/private/README.md b/deploy/private/README.md deleted file mode 100644 index 8ba6b6f..0000000 --- a/deploy/private/README.md +++ /dev/null @@ -1,171 +0,0 @@ -# Private deployment operations - -Current user/admin and architecture guide: [department rollout](../../docs/content/department-rollout.md). -Execution/evidence: [rollout checklist](../../docs/content/department-rollout-execution.md). -Setup: [k3s](../../docs/content/k3s-setup.md), [Tailscale/SSH](../../docs/content/tailscale-ssh.md), -[storage](../../docs/content/storage.md), and [developer setup](../../docs/content/development.md). - -## Services and persistent state - -| Component | Location | Persistent state | -|---|---|---| -| Nginx production portal | Main, localhost and `100.73.139.66:8088` | `/srv/mist-web/releases`, atomic `current` symlink | -| Go API, auth, and admission controller | `mist-system`, main, one Recreate replica | Team/queue ConfigMaps; Kubernetes Jobs; Local `mist-auth-data` SQLite WAL PVC | -| k3s server / agent | Main / QuietBox | Existing cluster and device operators | -| NFSv4 storage | QuietBox | Ordinary `/srv/mist-data/teams` dataset/result folders over direct Ethernet | -| Team provisioning agent | QuietBox `mist-team-storage.service` | Validated requests, ordinary directories and sampled usage | -| Portal host firewall | Both `mist-portal-firewall.service` | Owned INPUT/FORWARD chains and host config | - -API image tag is `mist-api:folders-20261021`, imported into main's k3s containerd. -New jobs run in `mist-team-` namespaces. Historical `mist` workloads/PVCs remain. -Never scale the current API above one replica: admission requires one controller. - -## Build and redeploy on main - -Run from a checkout of the reviewed current main on the NVIDIA host. Required: -Go 1.26.0, Node 22.16+, working Docker access, the private kubeconfig, existing -auth Secrets, GPU/TT operators and mounted QuietBox storage. The script is for -this existing installation; it is not a fresh-cluster/bootstrap installer. -Checking out/merging Git does not restart or deploy services automatically. -The API is Kubernetes-only; Redis and the retired Docker supervisor are unnecessary. - - -```bash -bash deploy/private/build-and-deploy.sh -``` - -The script builds API/CLI and the API container image, imports it, applies -RBAC/admission/network manifests, waits for API rollout, installs web -packages, type-checks/builds the SPA and atomically installs its production -release. It requires the existing Docker and Kubernetes access. Host imports -and web installation use authorized Docker bind/chroot/nsenter access; the -process must enter the actual host mount/network namespace for host changes. - -Bootstrap credentials remain outside Git in mode-0600 local files and Kubernetes -Secrets. `prepare-internal-secret.py` reuses the internal credential on redeploy. -Never recreate the auth database, change its signing secret or print Secret YAML -as part of an ordinary deploy. The script fails if bootstrap credentials are -missing. Fresh-host installation needs deliberate address/node configuration, -storage preparation and protected Secret creation; this is a deployment of the -existing two-machine installation. - -Frontend-only release: - -```bash -npm --prefix web-interface run build -# As root in the actual main host namespace: -bash deploy/private/install-web.sh /home/utmist/Mist -``` - -Use the pinned Node/Go runtime locations from the build script. A frontend -rollback can repoint `/srv/mist-web/current` atomically to a previous complete -release. Keep its API contract compatible. For a backend regression, rebuild a -known department version with the same manifests/Secrets/state. The earlier -account-only API does not enforce team policies and is not a safe ordinary -rollback for research users. The pre-cleanup department release `3431ffd` contains -the verified team architecture; rebuild a compatible department version rather -than restoring the archived pre-platform main for normal users. - -## QuietBox host setup and storage cutover - -Follow [shared-folder storage operations](../k3s/storage/README.md). This supersedes -image-backed setup, online filesystem growth and model-pool migration instructions. -New storage uses `/srv/mist-data` over `192.168.240.2` and new NFS volume bindings. -Existing image files and bindings are retained for rollback; fresh storage was -requested without data migration. No physical disk is formatted. - -Team dataset/model values are advisory. Track actual shared-disk free space and -sampled team file usage. Uploads preserve 1 GiB of disk headroom; running jobs can -still exhaust storage. New Kubernetes PV/PVC sizes are binding declarations, -not capacity reservations or write limits. - -The October 21 rollout also preserves existing Better Auth password hashes and -deactivated accounts in Go auth, and requires real unexpired sessions. Session -cookies based only on user IDs are rejected. Auth data remains on its existing -local PVC; a consistent pre-cutover database snapshot is retained privately. - -## Portal network rules - -Install `portal-firewall.sh` under `/usr/local/lib/mist` and the accompanying -systemd unit on both hosts. `/etc/mist-portal-firewall.conf` contains -`MIST_PORTAL_PORT=8088` on main and `MIST_PORTAL_PORT=0` on QuietBox. Enable/restart -`mist-portal-firewall` after installation. The unit follows Tailscale/k3s service -restarts; manually reapply after UFW/netfilter resets. - -The script restricts ordinary sources on `tailscale0` to main TCP 8088 and denies -forwarded cluster traffic. The explicit administrator/infrastructure IPv4 and -IPv6 allowlist is in the script. Update it before relying on a new administrator -device. LAN rules and cloud Tailscale ACL/sharing settings are unchanged. -`verify-portal-firewall.sh` checks the actual installed chains using an isolated -synthetic untrusted source and removes its temporary namespace/rules afterward. -It requires root in the main host network namespace. - -## Services to restart and inspect - -Use a root-capable administrator session for service mutations. Logs are available -through `journalctl -u ` on the owning host and `kubectl logs` for pods. -Ordinary application redeployment should use the build script; restart k3s/NFS -only when resolving their own infrastructure problem because workloads depend on them. - -| Component | Owner | Status command | -|---|---|---| -| Portal | Main | `systemctl status nginx --no-pager` | -| API, auth, and controller | Cluster | `k3s kubectl -n mist-system rollout status deployment/mist-api` | -| Control plane | Main | `systemctl status k3s --no-pager` | -| Worker | QuietBox | `systemctl status k3s-agent --no-pager` | -| Shared storage | QuietBox | `systemctl status nfs-server mist-team-storage --no-pager` | -| Private network | Both | `systemctl status tailscaled --no-pager` | -| Portal restrictions | Both | `systemctl status mist-portal-firewall --no-pager` | - -The `mist-api-forward` and `mist-web` user services are local development helpers, -not requirements for the production portal. The default-namespace test Nginx and -k3s's Traefik also do not serve the current portal; it uses host Nginx on 8088. - -## Check after startup - -Main: - -```bash -systemctl is-active k3s tailscaled nginx mist-portal-firewall -KUBECONFIG=/home/utmist/.kube/config k3s kubectl get nodes -KUBECONFIG=/home/utmist/.kube/config k3s kubectl get pods -n mist-system -curl -fsS http://127.0.0.1:8088/api/session -``` - -QuietBox: - -```bash -systemctl is-active k3s-agent tailscaled nfs-server mist-team-storage mist-portal-firewall -findmnt -T /srv/mist-data -df -h /srv/mist-data -``` - -With root access, inspect `exportfs -v` and the provisioning service journal if a -team is not ready. Anonymous `/api/jobs` must return 401; the website must allow -real login and show two NVIDIA GPUs/four TT boards. Both nodes must be Ready. - -## Troubleshooting - -- **401:** Sign in again. SSH/Tailscale identity is separate from Mist identity. -- **403:** Confirm active team membership, scope writing authority and current - policy. Administrators also need team membership to use files/jobs. -- **503:** Check auth and API pods, DNS, shared directory readiness and provisioning - status. Access and missing team mounts fail closed. -- **Queued:** Check per-team concurrency/resources, node health and device - availability. Aged large requests drain their target node; no preemption. -- **507 / ENOSPC:** Team filesystem is full. Check actual QuietBox disk space; advisory allowances do not add capacity. - Delete only unneeded datasets that have no active job references. No automatic result cleanup was added. -- **Image rejected:** Use an explicit tag/digest from an allowed registry. No - per-image approval is needed. Private pull-credential management is excluded. -- **Image pull/runtime failure:** Verify the image is publicly accessible and - includes its dependencies. Custom TT images need compatible TT libraries; - select container runtime. The tested default TT profile remains available. -- **Revocation pending:** An admin mutation returns 503 if job suspension could - not be completed; correct cluster connectivity and retry. -- **Login rate limited:** Retry after the indicated delay. Session checks are - authoritative and do not share the restrictive password-login rate limit. - -Existing `backup-auth.sh` is a manual foundation utility; no automatic backup, -recovery, HTTPS/Serve, monitoring or cleanup service was added. HTTP remains -private over Tailscale. There is one control plane, one auth database instance -and one NFS storage host; no high-availability failover is claimed. diff --git a/deploy/private/backup-auth.sh b/deploy/private/backup-auth.sh deleted file mode 100755 index bf49162..0000000 --- a/deploy/private/backup-auth.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# Run on main node. SQLite online backup produces a consistent database snapshot. -# Output is protected and contains member credentials/session data. -set -euo pipefail -export KUBECONFIG=${KUBECONFIG:-/home/utmist/.kube/config} -backup_dir=${1:-/home/utmist/.local/share/mist-backups} -mkdir -p "$backup_dir" -chmod 0700 "$backup_dir" -umask 077 -file="$backup_dir/auth-$(date -u +%Y%m%dT%H%M%S).sqlite" -trap 'rm -f "$file.partial"' EXIT -k3s kubectl exec -n mist-system deployment/mist-api -- cat /data/auth.sqlite > "$file.partial" -test -s "$file.partial" -mv "$file.partial" "$file" -echo "Auth backup saved: $file" diff --git a/deploy/private/build-and-deploy.sh b/deploy/private/build-and-deploy.sh deleted file mode 100755 index 880c4ba..0000000 --- a/deploy/private/build-and-deploy.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# API/auth images are built/imported on the main node; no registry push is needed. -# Requires Kubernetes credentials and root privileges for image import/web install. -set -euo pipefail -cd "$(dirname "$0")/../.." -export PATH=/home/utmist/.local/share/mist-runtimes/go-1.25.1/bin:/home/utmist/.local/share/mist-runtimes/node-22.16.0/bin:$PATH -export KUBECONFIG=${KUBECONFIG:-/home/utmist/.kube/config} -# Never silently deploy an unauthenticated service if its bootstrap secret is missing. -k3s kubectl get secret mist-auth-bootstrap -n mist-system >/dev/null -python3 deploy/private/prepare-internal-secret.py -CGO_ENABLED=0 go -C src build -o ../bin/mist-api . -CGO_ENABLED=0 go -C cli build -o ../bin/mist-cli . -docker build -f deploy/k3s/Dockerfile.api -t mist-api:folders-20261021 . -archive=$(mktemp /tmp/mist-deploy.XXXXXX.tar) -trap 'python3 -c "import os,sys; os.unlink(sys.argv[1])" "$archive"' EXIT -docker save -o "$archive" mist-api:folders-20261021 -# Existing approved Docker access permits host import, without changing sudo policy. -docker run --rm --mount type=bind,src=/,dst=/host alpine:3.16.3 chroot /host /usr/local/bin/k3s ctr images import "$archive" -k3s kubectl apply -f deploy/k3s/storage/shared.yaml -f deploy/k3s/team-rbac.yaml -f deploy/k3s/team-workload-policy.yaml -f deploy/k3s/mist-api.yaml -k3s kubectl rollout restart deployment/mist-api -n mist-system -k3s kubectl rollout status deployment/mist-api -n mist-system --timeout=120s -npm --prefix web-interface ci -npx --prefix web-interface tsc --noEmit -p web-interface/tsconfig.json -npm --prefix web-interface run build -docker run --rm --privileged --pid host --network host --mount type=bind,src=/,dst=/host alpine:3.16.3 chroot /host /usr/bin/nsenter -t 1 -m -n -p -r -w /bin/bash "$PWD/deploy/private/install-web.sh" "$PWD" -for attempt in $(seq 1 15); do - if curl --fail --silent http://127.0.0.1:8088/api/session; then exit 0; fi - sleep 2 -done -echo 'Private website session check failed' >&2 -exit 1 diff --git a/deploy/private/install-web.sh b/deploy/private/install-web.sh deleted file mode 100755 index 9d26d22..0000000 --- a/deploy/private/install-web.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# Run as root in the main node's host mount namespace, after npm run build. -set -euo pipefail -repo=${1:-/home/utmist/Mist} -release=/srv/mist-web/releases/$(date -u +%Y%m%dT%H%M%S) -install -d -m 0755 "$release" -cp -r "$repo/web-interface/dist/." "$release/" -chmod -R a+rX "$release" -ln -s "$release" /srv/mist-web/current.new -mv -Tf /srv/mist-web/current.new /srv/mist-web/current -install -m 0644 "$repo/deploy/private/nginx.conf" /etc/nginx/conf.d/mist.conf -install -d -m 0755 /etc/systemd/system/nginx.service.d -install -m 0644 "$repo/deploy/private/nginx-mist-startup.conf" /etc/systemd/system/nginx.service.d/mist.conf -systemctl daemon-reload -nginx -t -systemctl enable nginx -systemctl reload nginx diff --git a/deploy/private/mist-portal-firewall.service b/deploy/private/mist-portal-firewall.service deleted file mode 100644 index 2c6fa97..0000000 --- a/deploy/private/mist-portal-firewall.service +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description=Mist portal access boundary for shared Tailscale researchers -After=network-pre.target tailscaled.service ufw.service k3s.service k3s-agent.service -Wants=tailscaled.service -PartOf=tailscaled.service k3s.service k3s-agent.service -Before=nginx.service - -[Service] -Type=oneshot -EnvironmentFile=/etc/mist-portal-firewall.conf -ExecStart=/usr/local/lib/mist/portal-firewall.sh -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target diff --git a/deploy/private/nginx-mist-startup.conf b/deploy/private/nginx-mist-startup.conf deleted file mode 100644 index 53a50e0..0000000 --- a/deploy/private/nginx-mist-startup.conf +++ /dev/null @@ -1,9 +0,0 @@ -# Install as /etc/systemd/system/nginx.service.d/mist.conf. -[Unit] -StartLimitIntervalSec=0 -Wants=network-online.target tailscaled.service k3s.service -After=network-online.target tailscaled.service k3s.service -[Service] -# Tailscale may need a few seconds to restore its address before bind(). -Restart=on-failure -RestartSec=5 diff --git a/deploy/private/nginx.conf b/deploy/private/nginx.conf deleted file mode 100644 index fae10b9..0000000 --- a/deploy/private/nginx.conf +++ /dev/null @@ -1,36 +0,0 @@ -server { - listen 127.0.0.1:8088; - listen 100.73.139.66:8088; - server_name utmist.tail459b5e.ts.net 100.73.139.66 localhost; - root /srv/mist-web/current; - index index.html; - client_max_body_size 0; - client_body_timeout 86400s; - add_header X-Content-Type-Options nosniff always; - add_header Referrer-Policy same-origin always; - add_header X-Frame-Options DENY always; - location /api/ { - proxy_pass http://10.43.1.116:3000/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_request_buffering off; - proxy_read_timeout 86400s; - proxy_send_timeout 86400s; - } - location /auth/ { - proxy_pass http://10.43.1.116:3000; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - client_max_body_size 64k; - } - location /assets/ { - try_files $uri =404; - expires 1y; - add_header Cache-Control "public, immutable"; - } - location / { - add_header Cache-Control "no-cache"; - try_files $uri $uri/ /index.html; - } -} diff --git a/deploy/private/portal-firewall.sh b/deploy/private/portal-firewall.sh deleted file mode 100644 index 366a776..0000000 --- a/deploy/private/portal-firewall.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# Root, actual host network namespace. Replace only Mist's chains atomically; -# preserve all other firewall tables/chains and existing LAN access. -set -euo pipefail -portal_port=${MIST_PORTAL_PORT:-8088} -for family in iptables ip6tables; do - restore="${family}-restore" - "$family" -w -N MIST-TAIL-INPUT 2>/dev/null || true - "$family" -w -N MIST-TAIL-FORWARD 2>/dev/null || true - { - printf '*filter\n-F MIST-TAIL-INPUT\n-F MIST-TAIL-FORWARD\n' - if [ "$family" = iptables ]; then - for trusted in 100.73.139.66 100.95.175.37 100.99.194.52; do - printf -- '-A MIST-TAIL-INPUT -s %s/32 -j RETURN\n' "$trusted" - printf -- '-A MIST-TAIL-FORWARD -s %s/32 -j RETURN\n' "$trusted" - done - if [ "$portal_port" != 0 ]; then - printf -- '-A MIST-TAIL-INPUT -p tcp --dport %s -j RETURN\n' "$portal_port" - fi - else - for trusted in fd7a:115c:a1e0::d401:8bda fd7a:115c:a1e0::f72a:af26 fd7a:115c:a1e0::2901:c2d7; do - printf -- '-A MIST-TAIL-INPUT -s %s/128 -j RETURN\n' "$trusted" - printf -- '-A MIST-TAIL-FORWARD -s %s/128 -j RETURN\n' "$trusted" - done - fi - # No IPv6 portal listener is enabled; do not permit an alternate bypass. - printf -- '-A MIST-TAIL-INPUT -j DROP\n-A MIST-TAIL-FORWARD -j DROP\nCOMMIT\n' - } | "$restore" --wait 10 --noflush - "$family" -w -C INPUT -i tailscale0 -j MIST-TAIL-INPUT 2>/dev/null || "$family" -w -I INPUT 1 -i tailscale0 -j MIST-TAIL-INPUT - "$family" -w -C FORWARD -i tailscale0 -j MIST-TAIL-FORWARD 2>/dev/null || "$family" -w -I FORWARD 1 -i tailscale0 -j MIST-TAIL-FORWARD -done diff --git a/deploy/private/prepare-internal-secret.py b/deploy/private/prepare-internal-secret.py deleted file mode 100644 index 4c5c528..0000000 --- a/deploy/private/prepare-internal-secret.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/python3 -"""Reuse the internal auth token on ordinary deployments. Never print its value.""" -import base64 -import json -import os -from pathlib import Path -import secrets -import subprocess - -env = {**os.environ, 'KUBECONFIG': os.environ.get('KUBECONFIG', '/home/utmist/.kube/config')} -command = ['k3s', 'kubectl'] -token_file = Path('/home/utmist/.config/mist/internal-token') -existing = subprocess.run(command + ['get', 'secret', 'mist-internal-auth', '-n', 'mist-system', '-o', 'json'], env=env, capture_output=True, text=True) -if existing.returncode == 0: - token = base64.b64decode(json.loads(existing.stdout)['data']['MIST_INTERNAL_TOKEN']).decode() -else: - if 'NotFound' not in existing.stderr: - raise SystemExit('Cannot inspect internal Secret; refusing to replace credentials') - token = token_file.read_text() if token_file.exists() else secrets.token_urlsafe(48) -if len(token) < 32: - raise SystemExit('Internal token is invalid') -token_file.parent.mkdir(parents=True, exist_ok=True) -token_file.write_text(token) -token_file.chmod(0o600) -body = {'apiVersion': 'v1', 'kind': 'Secret', 'metadata': {'name': 'mist-internal-auth', 'namespace': 'mist-system'}, 'stringData': {'MIST_INTERNAL_TOKEN': token}} -result = subprocess.run(command + ['apply', '-f', '-'], input=json.dumps(body), env=env, capture_output=True, text=True) -if result.returncode: - raise SystemExit('Cannot apply internal Secret') -print('Internal auth Secret ready; credentials preserved') diff --git a/deploy/private/verify-portal-firewall.sh b/deploy/private/verify-portal-firewall.sh deleted file mode 100644 index 3bf6417..0000000 --- a/deploy/private/verify-portal-firewall.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# Root in the host namespace. Exercise the installed enforcement chains with -# an isolated, simulated untrusted Tailnet source; no real peer is impersonated. -set -euo pipefail -namespace=mist-firewall-check -source_ip=100.127.254.253 -if ip netns list | awk '{print $1}' | grep -qx "$namespace"; then - echo 'Verification namespace already exists; refusing to replace it' >&2; exit 1 -fi -if ip route show "$source_ip/32" | grep -q .; then - echo 'Verification source already routed; refusing to replace it' >&2; exit 1 -fi -iptables -S MIST-TAIL-INPUT >/dev/null -cleanup() { - iptables -w -D INPUT -i mist-fw-host -j MIST-TAIL-INPUT 2>/dev/null || true - iptables -w -D INPUT -i mist-fw-host -j ACCEPT 2>/dev/null || true - iptables -w -D FORWARD -i mist-fw-host -j MIST-TAIL-FORWARD 2>/dev/null || true - ip route del "$source_ip/32" dev mist-fw-host 2>/dev/null || true - ip netns del "$namespace" 2>/dev/null || true - ip link del mist-fw-host 2>/dev/null || true -} -trap cleanup EXIT -ip netns add "$namespace" -ip link add mist-fw-host type veth peer name mist-fw-guest -ip link set mist-fw-guest netns "$namespace" -ip addr add 198.18.0.1/30 dev mist-fw-host -ip link set mist-fw-host up -ip route add "$source_ip/32" dev mist-fw-host -ip netns exec "$namespace" ip addr add 198.18.0.2/30 dev mist-fw-guest -ip netns exec "$namespace" ip addr add "$source_ip/32" dev lo -ip netns exec "$namespace" ip link set lo up -ip netns exec "$namespace" ip link set mist-fw-guest up -ip netns exec "$namespace" ip route add default via 198.18.0.1 -# Emulate the real tailscale0 dispatch with a test-only interface. Accept after -# RETURN avoids Tailscale's deliberate rejection of 100/10 on non-tail devices. -iptables -w -I INPUT 1 -i mist-fw-host -j ACCEPT -iptables -w -I INPUT 1 -i mist-fw-host -j MIST-TAIL-INPUT -iptables -w -I FORWARD 1 -i mist-fw-host -j MIST-TAIL-FORWARD -code=$(ip netns exec "$namespace" curl --interface "$source_ip" --max-time 4 -sS -o /dev/null -w '%{http_code}' http://100.73.139.66:8088/api/session) -[ "$code" = 200 ] -echo 'PASS untrusted source reaches portal' -for target in 100.73.139.66:22 100.73.139.66:6443 100.73.139.66:30491 10.43.1.116:3000; do - if ! ip netns exec "$namespace" python3 -c 'import socket,sys; host,port=sys.argv[1].split(":"); s=socket.socket(); s.settimeout(2); s.bind((sys.argv[2],0)) -try: - s.connect((host,int(port))) -except OSError: - sys.exit(0) -sys.exit(1)' "$target" "$source_ip"; then - echo "FAIL untrusted source reached $target" >&2; exit 1 - fi - echo "PASS untrusted source denied $target" -done diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 2cad2d2..0000000 --- a/docs/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# Mist Documentation - -This directory contains the documentation site for Mist, powered by **Hugo** and the **Hextra** documentation theme. - -## Viewing Documentation Locally - -To preview the documentation locally with live-reload: - -```bash -cd docs -hugo server -``` - -The site will be available at `http://localhost:1313/docs/`. - -To build the static site (outputting to `web-interface/public/docs` for the web portal): - -```bash -cd docs -hugo -``` - -## Documentation Guides - -Documentation source files are located in `content/`: - -| Guide | Description | -|---|---| -| [Department operating guide](content/department-rollout.md) | Sign in, manage teams, upload data, submit/download jobs | -| [Architecture](content/architecture.md) | Service topologies, boundaries, and codebase layout | -| [k3s setup](content/k3s-setup.md) | Cluster setup, worker nodes, and hardware acceleration | -| [Tailscale and SSH](content/tailscale-ssh.md) | Remote secure networking and administrator SSH | -| [Storage](content/storage.md) | Dataset and model shared storage pools | -| [Developer setup](content/development.md) | Local frontend and backend development | -| [Testing](content/testing.md) | Automated tests and evidence runs | -| [Design system](content/design-system.md) | Portal design principles and components | -| [Frontend architecture](content/frontend-architecture.md) | UI layout and backend offloading plan | -| [Execution record](content/department-rollout-execution.md) | Department rollout status and validation | -| [Cleanup record](content/repository-cleanup.md) | Repository maintenance history | -| [Historical archive](content/archive/_index.md) | Archived previous-generation guides and plans | diff --git a/docs/agents/architecture/scheduler.md b/docs/agents/architecture/scheduler.md index f1c55cd..5a65b74 100644 --- a/docs/agents/architecture/scheduler.md +++ b/docs/agents/architecture/scheduler.md @@ -269,7 +269,7 @@ under sustained higher-priority demand; the simulator must report that separatel ## Reconciliation The scheduler and the executor agree through events plus regular full -comparisons (see [executors.md](executors.md#reconciliation)): +comparisons (see [executors.md](executors.md#cleanup-and-reconciliation)): | Durable state | Authoritative observation | Action | |---|---|---| diff --git a/docs/agents/simple-storage-execution.md b/docs/agents/simple-storage-execution.md deleted file mode 100644 index 7eaa2ca..0000000 --- a/docs/agents/simple-storage-execution.md +++ /dev/null @@ -1,60 +0,0 @@ -# Shared folders and Ethernet storage — October 21, 2026 - -## Scope - -Implement on `feat/simple-storage-ethernet-20261021` from main `ba2bb86`. -The user authorized implementation and verification on both machines, with fresh -storage, no data migration and no large storage tests. Preserve main's Go auth. - -## Target - -- Dedicated direct Ethernet: NVIDIA `enp6s0` at `192.168.240.1/30`, QuietBox - `enp200s0` at `192.168.240.2/30`. No gateway; retain existing LAN/cluster paths. -- QuietBox ordinary directory `/srv/mist-data`, exported over NFS on the direct - link; no filesystem images or formatting. Keep old storage as rollback material. -- Team layout: `teams//datasets/{common,members,...}` and - `teams//results/{common,members}`. Only trusted API metadata lies at the root. -- Existing dataset/model allowance fields remain API-compatible but become - advisory. Actual disk free space bounds uploads. CPU/GPU/runtime limits remain - enforced. Team grants and scoped workload mounts remain authoritative. -- A small root-owned local provisioning agent creates directories, refuses unsafe - paths/mounts, and publishes logical byte usage. The API validates readiness and - serves the usage record without recursively scanning NFS on every request. -- Preserve `/inputs`, `/outputs`, dataset IDs and wire fields for new jobs. - -## Execution - -1. Establish baseline tests and inspect running Jobs, mounts and network profiles. -2. Persist Ethernet addresses; verify both directions and measure a small transfer. -3. Replace image provisioning with folder provisioning; adapt backend, UI and tests. -4. Install fresh NFS root/provisioner, prepare current team policies there and - switch storage volumes during a controlled API pause. Do not delete old disks. -5. Verify small uploads/downloads, cross-team isolation, and actual NVIDIA/TT jobs. -6. Record sanitized evidence, document operations, commit and push a reviewable PR. - -## Verification boundaries - -No hundreds-of-GB allocations/uploads, host-disk formatting, unrelated auth -redesign or reconfiguration of cluster node addresses. Keep secrets outside Git. -Main's independent-review rule still applies to merging the eventual PR. - -## Completed - -- Both persistent Ethernet profiles configured and bidirectional connectivity - verified. A 16 MiB direct-I/O NFS sample measured 43 MB/s write, 101 MB/s read. -- Fresh ordinary-folder storage deployed; no old-data migration or deletion. - New NFS 4.1 volume bindings avoid reusing the old 4.2 LAN transport. -- Folder provisioner, backend usage/readiness, advisory UI and developer fake - backend updated. Existing grants, scopes and accelerator admission retained. -- Latest main's Go auth required targeted compatibility/session fixes before - deployment: valid database sessions, existing scrypt hashes/schema, and inactive - accounts. Existing credentials were checked privately on a database snapshot. -- Real regular-member upload/download/isolation checks, NVIDIA/TT training, - checkpoint reload/download and browser review passed with small files. -- [Sanitized evidence](../../deploy/k3s/evidence/storage-2026-10-21/README.md) and - [operations](../../deploy/k3s/storage/README.md) contain the current contracts. - -Human-authored October 9 storage operating snapshots under `docs/content` still -describe the previous image-backed release. README/operations now point to the -current guide; maintainers should reconcile those snapshots when updating human -documentation. This task follows the repository's README/agent-doc editing scope. diff --git a/docs/content/_index.md b/docs/content/_index.md deleted file mode 100644 index c11a6df..0000000 --- a/docs/content/_index.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -type: docs -cascade: - type: docs -title: "Documentation Overview" -weight: 1 ---- - -# UTMIST Compute Platform Documentation - -Current main-branch documentation, verified against the two running machines on -**October 9, 2026**. Addresses and versions describe this installation; adjust -host-specific settings when provisioning another environment. - -## Find the right guide - -| Task | Guide | -|---|---| -| Sign in, manage teams, upload data, submit/download jobs | [Department operating guide](department-rollout.md) | -| Understand services and source layout | [Architecture](architecture.md) | -| Install/inspect k3s, join a worker, verify accelerator allocation | [k3s setup](k3s-setup.md) | -| Connect privately and administer either host | [Tailscale and SSH](tailscale-ssh.md) | -| Understand dataset/model pools and physical capacity | [Storage](storage.md) | -| Build, deploy, restart or troubleshoot services | [Deployment operations](../../deploy/private/README.md) | -| Develop locally with the existing authenticated API | [Developer setup](development.md) | -| Authenticate and submit from a terminal | [CLI](../../cli/docs/setup.md) | -| Run automated checks and read recorded live evidence | [Testing](testing.md) | -| Maintain UI components and interactions | [Design system](design-system.md) | -| Understand frontend architecture and backend offloading | [Frontend architecture](frontend-architecture.md) | -| Read completed scope, exclusions and release verification | [Execution record](department-rollout-execution.md) | -| See what repository cleanup removed and verified | [Cleanup record](repository-cleanup.md) | - -## Access and execution - -```text -Browser / CLI → Tailscale portal :8088 → Nginx → Go API → k3s - | | - Better Auth + team policy - | - CPU/NVIDIA or Tenstorrent Job - | - scoped dataset/model NFS mounts on QuietBox -``` - -Mist login is separate from Tailscale membership and Linux SSH login. Researchers -use the portal; administrator SSH is restricted by the installed host rules. -The worker reaches the control plane and storage through LAN addresses. - -[Earlier plans and single-owner guides](archive/_index.md) are historical only. -Current guidance does not require Redis, an SSH session to launch a job, a public -cloud load balancer, or permission to approve every tagged image. diff --git a/docs/content/architecture.md b/docs/content/architecture.md deleted file mode 100644 index 8a3a755..0000000 --- a/docs/content/architecture.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "Architecture & Services" -weight: 20 ---- - -# Architecture - -Current private department installation, verified October 9, 2026. -[User/admin policy](department-rollout.md) and [k3s details](k3s-setup.md) cover -its operating contracts. - -```mermaid -flowchart LR - Client[Browser or authenticated CLI] --> Portal[Nginx private Tailscale portal :8088] - Portal --> API[Go API, built-in auth and single admission controller] - API --> Auth[Local SQLite PVC] - API --> State[Team policy ConfigMaps and suspended Jobs] - State --> K8s[k3s scheduler and device operators] - K8s --> Main[CPU and NVIDIA node] - K8s --> TT[QuietBox Tenstorrent worker] - Main --> Store[Scoped NFS dataset and model pools on QuietBox] - TT --> Store -``` - -## Job flow - -1. Nginx serves the built SPA and forwards `/api` and `/auth` to Go. -2. Go verifies the account via its built-in authentication service. Go checks current team membership, image - registry rules, storage scope and resource/runtime/queue policy. -3. The API persists a suspended Job in the team's namespace and prepares its - scoped output directory. A single controller admits queued jobs fairly. -4. Kubernetes places the admitted pod on the appropriate node. NVIDIA's plugin - reserves whole GPUs; Tenstorrent DRA reserves whole n300 boards. -5. containerd starts the image. `/inputs` is read-only; `/outputs` is the job's - own directory in the model pool. Logs/status come from actual pods and Jobs. -6. Jobs and output files remain after exit. Cancellation or revocation stops - pods and frees reservations while retaining history and outputs. - -Nginx currently proxies to one API service; the API must remain one replica -because it owns a single admission controller. Kubernetes placement uses -resource requests and device availability. It does not automatically turn one -submitted model into distributed training across both accelerator types. - -## Source organization - -| Location | Responsibility | -|---|---| -| `src/main.go`, `app.go` | Process lifecycle, HTTP routes and controller ownership | -| `src/jobs_http.go`, `http.go`, `job_types.go` | Job endpoints, shared responses and wire types | -| `src/kubernetes.go`, `job_states.go`, `outputs.go` | Container specification, execution/state and retained local-output initialization | -| `src/auth.go`, `member_auth.go` | In-process SQLite authentication, session management, identity and authoritative authorization | -| `src/teams.go`, `team_queue.go`, `team_runtime.go`, `team_storage.go` | Membership/policy, fair admission, isolation and scoped storage | -| `src/shared_storage.go`, `hardware.go`, `images.go` | Uploads/results, inventory and image/runtime profiles | -| `cli/` | Authenticated terminal client; no execution logic | -| `web-interface/` | React portal, typed API client, account/team state and UI components | -| `deploy/k3s/` | Manifests, accelerator diagnostics, live verifiers and evidence | -| `deploy/k3s/storage/` | QuietBox provisioning/migration/growth and service unit | -| `deploy/private/` | Image/web deployment, Nginx and host access rules | -| `docs/` | Current guides; historical records are under `docs/archive/` | - -API and CLI are separate Go modules joined by `go.work`. There is no Redis -scheduler or Docker supervisor in the current code. Historical account jobs and -local PVCs remain readable through explicit legacy-workspace compatibility. -Removing the old executor does not delete these Kubernetes resources. - -## State and boundaries - -- Better Auth uses a main-node local SQLite WAL PVC, not NFS. -- Team policies and queue state live in Kubernetes; no separate queue database. -- Every team has separate bounded dataset and model/result NFS filesystems. - Member/common folders share their corresponding team's pool. -- Workloads receive scoped mounts, no Kubernetes token, constrained host paths - and a network policy. Accelerator drivers still share the host kernel. -- Portal/SSH use Tailscale. Cluster API, Flannel and NFS use the LAN. - -There is one control plane, one auth instance and one storage host. Availability -and arbitrary-model/distributed-training support are limited as described in the -[operating guide](department-rollout.md). diff --git a/docs/content/archive/_index.md b/docs/content/archive/_index.md deleted file mode 100644 index 7c8bcdf..0000000 --- a/docs/content/archive/_index.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: "Historical Records" -weight: 200 -sidebar: - open: false ---- - -# Historical records - -These files preserve earlier design decisions and verification phases. They are -not setup or operating instructions for the current main branch. Some commands -refer to removed prototypes; their original source remains in Git history. - -| Record | Phase | -|---|---| -| [Foundation execution plan](foundation-execution-plan.md) | Initial work plan and progress | -| [Shared storage/deployment plan](shared-storage-deployment-plan.md) | Original parts 4 and 5 | -| [Kubernetes pilot](kubernetes-pilot.md) | October 3 executor snapshot | -| [Local job foundation](local-job-foundation.md) | October 8 single-owner platform | -| [Complete foundation](complete-foundation.md) | Account-only platform before teams | -| [k3s setup history](k3s-setup-history.md) | Original NVIDIA installation and QuietBox join | -| [k3s deployment history](k3s-deployment-history.md) | Earlier accelerator/API acceptance | - -The old main is preserved on -[`archive/main-before-k3s-20261009`](https://github.com/UTMIST/Mist/tree/archive/main-before-k3s-20261009). -The pre-cleanup department release is commit -[`3431ffd`](https://github.com/UTMIST/Mist/tree/3431ffdb713fac72881fc7f61f2750a82fe3f916). -Use the [current documentation](../_index.md) for this installation. diff --git a/docs/content/archive/complete-foundation.md b/docs/content/archive/complete-foundation.md deleted file mode 100644 index fb0aa37..0000000 --- a/docs/content/archive/complete-foundation.md +++ /dev/null @@ -1,227 +0,0 @@ -> **Historical record — superseded.** This text describes an earlier phase. -> Commands and claims below are retained as history, not current setup instructions. -> Start with the [current documentation index](../_index.md) and -> [department operating guide](../department-rollout.md). - -> Current department storage and portal settings: [department rollout](../department-rollout.md). -> This document records the earlier foundation; its 100 GiB pilot was later expanded sparsely. - -# Mist foundation: historical operating snapshot - -> **Historical account-only snapshot.** The [department rollout](../department-rollout.md) -> supersedes these instructions: team membership, scoped folders, enforced quotas, -> self-service images and the new portal are implemented. Use that guide and -> [current deployment operations](../../../deploy/private/README.md) for current behavior. -> The remaining sections record the preceding foundation, including its limitations. - -Implemented on `feat/local-job-foundation`, October 8–9, 2026. This continues the -[original foundation](local-job-foundation.md) with shared datasets, output -retrieval, separate member accounts and persistent private hosting. - -## Use the website - -Open **http://100.73.139.66:8088** from a device on the existing Tailscale network. -The alternative MagicDNS address is http://utmist.tail459b5e.ts.net:8088. - -1. Sign in with a Mist account, independent of the machine's Linux/SSH login. -2. Open **Datasets**, upload one file or a ZIP, and wait for **Ready**. -3. Open **Jobs**, choose CPU, NVIDIA GPUs or Tenstorrent boards, an approved - image, and optionally the uploaded dataset. Submit a script or container. -4. Follow the actual status, placement and logs. Save files under `/outputs`. -5. Click **Files** on the job to download results. Results remain after exit. - -The initial administrator's credentials are stored locally in -`/home/utmist/.config/mist/admin-bootstrap.json` (mode 0600), outside Git. View -that file locally, sign in, then change the password on **Account**. The file -contains a bootstrap password, not a password that automatically tracks changes. -Do not distribute its auth secret. Administrators add members on **Account**; -members can change passwords there. Deactivation revokes sessions. Public signup -is disabled. There is no email delivery/password-reset email service configured; -an administrator can reset a member password through Better Auth's authenticated -`/auth/admin/set-user-password` endpoint. Admin roles are managed by that service, -never by editing one's profile. - -**HTTPS status:** Tailscale Serve is disabled on this tailnet. Its CLI reports -that an account administrator must enable Serve in the Tailscale console. The -current HTTP endpoint is bound to localhost and the Tailscale IP only. Remote -traffic uses Tailscale's encrypted network, but browsers do not treat HTTP as a -secure origin. No public Funnel/domain was enabled. After enabling Serve, run -`tailscale serve --bg --https=443 http://127.0.0.1:8088`, change -`MIST_SITE_ORIGIN` in the auth deployment to `https://utmist.tail459b5e.ts.net`, -and restart auth so cookies use Secure. The HTTPS origin is already in the -trusted-origin lists. Check Serve status and browser login before distributing -that URL. Do not claim HTTPS is available before that verification. - -## Running architecture - -```text -Team browser / CLI / either SSH host - │ private Tailscale network - ▼ -Main node Nginx :8088 ── static production React build - │ /api/* and /auth/* - ▼ -Go Mist API, Kubernetes Deployment (mist-system) - ├── Better Auth service ── local SQLite PVC on main node - ├── dataset metadata/uploads/results ── shared NFS PVC - └── Kubernetes Jobs (mist namespace) - ├── Main node: CPU or 1–2 NVIDIA GPUs - └── QuietBox: 1–4 TT boards, two chips per board - │ - selected /inputs (read-only), own /outputs (writable) - │ - QuietBox /srv/mist-storage (NFSv4 over current LAN) -``` - -Nginx proxies directly to the existing API ClusterIP `10.43.1.116:3000`; -production does not rely on Vite, SSH sessions or the development port-forward. -The local preview at `127.0.0.1:3001` remains available and now uses real login. -Kubernetes schedules jobs using the requested resources and node profiles. -TT allocations use DRA boards. NVIDIA allocations use whole GPUs. Neither device -sharing within a GPU/board nor distributed mixed-backend training is implemented. - -## Storage layout and limits - -QuietBox exports `/srv/mist-storage` to only LAN IPs `10.0.0.175` and -`10.0.0.112`, using NFSv4 and root squash (anonymous UID/GID 65532). UFW admits -TCP 2049 from those two addresses. Its router Ethernet connection stays intact. -The main machine continues using its existing Wi-Fi connection. - -A dedicated **100 GiB sparse ext4 image** on QuietBox's existing NVMe backs the -store. No physical disk was formatted. Actual usable capacity is slightly smaller -because of filesystem overhead. `/etc/fstab` mounts it at boot; `nfs-server` -is enabled. Keep the NVMe's free space above this pilot budget. - -```text -/srv/mist-storage/ - metadata/datasets/.json owner, checksum, size, ready state - .uploads// staging, removed on failure/completion - datasets//content/ selected input files, read-only job mount - jobs//outputs/ job's own persistent results - legacy/{cpu,nvidia,tenstorrent}// copied original results -``` - -The upload limit is 2 GiB per file/archive and 2 GiB expanded. ZIPs reject unsafe -paths, symlinks, special files, duplicate files and more than 10,000 entries. -Uploads stream to staging, are checksummed and published atomically. A failed -upload never becomes Ready. Metadata, unrelated jobs and other datasets are not -mounted into a workload. No archive is executed by the upload service. - -`/inputs` and `MIST_INPUT_DIR` identify an attached dataset. `/outputs` and -`MIST_OUTPUT_DIR` identify persistent outputs; `/checkpoints/` remains an -alias. Jobs without a selected dataset have no `/inputs` mount. Image entrypoints -and working directories remain unchanged unless explicitly overridden. - -The budget applies to all shared files together, not separately to each PVC. -Two static RWX PV/PVCs expose the same backing store to different namespaces. -A PVC request alone is not a hard quota; the image's filesystem enforces capacity. -Upload admission leaves 1 GiB spare, but running jobs can still fill storage: -write errors must be handled by job code. Per-member/job disk quotas are future -work. Do not store SQLite on NFS. - -Original local checkpoint PVCs remain intact. Their completed outputs were -copied to `legacy/` and remain downloadable through retained job IDs. New jobs -use shared storage. QuietBox is now a storage dependency: if it is offline, mounts, -uploads, downloads and jobs that need those files may wait. NFS is not a backup. - -### Cleanup and retention - -Nothing deletes datasets or results automatically. Delete unneeded datasets -through the website; active-job references prevent deletion. For job results, -first verify the owning job has finished and no pod can write to it, then archive -and remove only that job's directory from `jobs//outputs` on QuietBox. -Keep the parent directory for retained Kubernetes Job history. Do not delete -storage metadata, the mounted image file, or entire legacy PVC directories. -Monitor `df -h /srv/mist-storage` on QuietBox. Remove only test output archives -that have already been saved elsewhere. Legacy copies use additional space; -original PVCs are intentionally not removed by this migration. - -## Authentication and ownership - -Better Auth 1.7.7 handles passwords, sessions, database migrations, role checks, -rate limiting and revocation. Go verifies each session with the auth service; -unavailable auth returns 503, anonymous access 401. Browser mutations require -trusted origins. Cookies are HttpOnly and SameSite=Lax; Secure requires the HTTPS -configuration described above. Session duration is seven days. - -New members receive stable owner labels derived from their auth user ID. Existing -`utmist` jobs are mapped to the initial administrator's configured email. Other -members cannot list, inspect, cancel, read logs from or download that owner's -jobs, and cannot use/delete its datasets. Hardware totals are visible to members -because those devices are shared. Administrators' membership permissions do not -automatically give access to another member's job files. - -This is a private, trusted team pilot. Approved containers, TT's read-only host -runtime mounts and NFS Unix permissions do not constitute a hardened hostile -multi-tenant sandbox. Public hosting, hostile code isolation, member quotas, -credits, priority/fair queues, Jupyter and job chaining require later work. - -## CLI - -```bash -export MIST_API_URL=http://100.73.139.66:8088/api -bin/mist-cli auth login --email your-member-email@example.org -bin/mist-cli job list --all -bin/mist-cli job submit train.py --compute NVIDIA --devices 1 -bin/mist-cli auth logout -``` - -Login prompts without echoing the password; `--password-stdin` supports controlled -automation. Cookies are saved atomically in a mode-0600 CLI config. Logout revokes -the session. Fake legacy tokens are no longer used. An alternate config can be -selected with `--config`; never paste a session cookie into a public document. - -## API additions - -All data routes require an authenticated cookie when `MIST_AUTH_URL` is configured. - -| Route | Function | -|---|---| -| `GET /session` | Auth enabled flag and current member; no session token | -| `/auth/*` | Same-origin proxy to maintained Better Auth endpoints | -| `GET /storage` | Actual capacity/free bytes and upload limit | -| `GET /datasets` | Current owner's ready datasets | -| `POST /datasets?filename=data.csv&name=Example` | Raw streaming file upload | -| `POST /datasets?filename=data.zip&format=zip` | Checked ZIP upload/extraction | -| `GET /datasets/` | Own ready dataset metadata | -| `DELETE /datasets/` | Delete own dataset if no active job references it | -| `POST /jobs` with `dataset_id` | Mount own ready dataset read-only | -| `GET /jobs//files` | Own job's regular result files | -| `GET /jobs//files/download?path=model.pt` | Stream attachment/download | - -The website prefixes Go routes with `/api`; auth stays at `/auth`. Listing limits -outputs to 5,000 files/10,000 entries/20 directory levels. Download paths use Go's -`os.Root` to prevent traversal and escaping symlinks. Save plain regular files -inside `/outputs` if you want them to be listed/downloaded. - -## Deployment, restart and rollback - -See [deployment scripts](../../../deploy/private/README.md). k3s server/agent, NFS and -Nginx are system services. Kubernetes restores API/auth deployments. The frontend -is a static release, with `/srv/mist-web/current` pointing at the active build. -Deployment configuration, RBAC, claim templates and image policies are checked -in; bootstrap credentials and cluster tokens are not. - -Rollback frontend by repointing `current` to an earlier retained release and -reloading Nginx. Rollback an API image with `kubectl set image` after importing -that image. Keep auth, shared storage and login enabled during rollback; the old -unauthenticated foundation API is not a suitable private member-service rollback. -Database migrations require a pre-upgrade backup and version-specific review. - -## Verification - -Repeatable checks: - -- `deploy/k3s/verify_complete_browser.mjs`: actual login, dataset upload, CPU, - two NVIDIA GPUs and a TT board consuming the same uploaded dataset, downloads, - member creation/password change/isolation/deactivation, denied anonymous signup - and cross-origin writes. Uses protected local credentials; logs no secrets. -- `deploy/k3s/verify_quietbox_submission.py`: authenticated submission from - QuietBox, NVIDIA training assigned to the main machine, downloaded loss metrics. -- `src/shared_storage_test.go`: upload limits/atomic publication, ZIP attacks, - read-only dataset binding, escaping download symlinks, ownership and auth outage. -- Existing job/device/queue/cancellation/image tests remain in the repository. - -Detailed evidence is under `/home/utmist/mist-complete-results-2026-10-09`; -final verified results are recorded in `deploy/k3s/complete-results.json`. An accelerator smoke test proves this small -training workload; it does not prove arbitrary model/runtime compatibility. diff --git a/docs/content/archive/foundation-execution-plan.md b/docs/content/archive/foundation-execution-plan.md deleted file mode 100644 index 48eef71..0000000 --- a/docs/content/archive/foundation-execution-plan.md +++ /dev/null @@ -1,390 +0,0 @@ -> **Historical record — superseded.** This text describes an earlier phase. -> Commands and claims below are retained as history, not current setup instructions. -> Start with the [current documentation index](../_index.md) and -> [department operating guide](../department-rollout.md). - -# Mist foundation execution plan - -Recorded: October 8, 2026. This file preserves the agreed scope and should be -updated with implementation progress, test evidence, and remaining work. - -## Goal and decisions - -Make the local website usable for running container jobs on the existing -NVIDIA and Tenstorrent machines. Start with the working Kubernetes pilot, -rather than rebuilding execution. The user has requested implementation on -a new branch, organized code, and proper documentation. - -Today's scope is tasks 1–3 plus persistent output folders and verification. -Shared dataset storage, uploads, and result downloads are the next foundation -task. Website deployment and login follow the foundation. - -Decisions already made: - -- Develop and test locally. Team members can use the CLI over SSH or open the - local website through an SSH tunnel. A public website is unnecessary now. -- Mist API creates Kubernetes Jobs; k3s schedules them; containerd runs the - images. Normal job execution does not use SSH. -- Images are built and pushed to a registry, then selected by reference. A - browser image archive uploader or image build service is outside today's scope. -- CPU and NVIDIA support approved custom images. Tenstorrent initially uses - its existing tested image and host runtime profile. -- NVIDIA allocations are whole GPUs. Tenstorrent allocations are whole n300 - boards, with two accelerator chips per board. -- Start with persistent node-local results folders. Add shared storage later. -- For shared storage, the preferred initial host is Tenstorrent because it has - more free disk space. NFS over the existing network is the simplest proposal. -- Wi-Fi is adequate for initial testing. A future second Ethernet cable can - provide a dedicated storage link. Preserve Tenstorrent's existing router link: - its k3s configuration and network access currently depend on it. -- Preserve existing work and Git history. Implement on a new branch. Retiring - or merging the existing main branch is a later repository decision. -- No permission prompts are needed for the agreed implementation and tests. - Do not introduce unrelated public exposure, account changes, or disk formatting. - -## Architecture - -```text -Local website / CLI - | - v - Mist API - | - v - k3s cluster - / \ - v v -NVIDIA PC Tenstorrent -containerd containerd - | | - v v -Job container + allocated accelerator + persistent results folder -``` - -The full whiteboard plan also includes membership/authentication, credits, -priority policy, a storage box, Jupyter, job chaining, and optional agents. -Kubernetes supplies placement and device allocation. Mist supplies admission, -user policy, UI, dataset handling, and artifact access. Selecting an accelerator -does not convert CPU code into CUDA or Tenstorrent code, or distribute one model -across machines automatically. - -## Current baseline - -Repo: `/home/utmist/Mist`. Before this implementation, the branch is -`fix/local-runtime-setup` and contains substantial uncommitted k3s pilot work. -Preserve these changes when creating the new branch. - -An independent main preview exists at `/home/utmist/Mist-main-preview`. -Use main's reusable UI/components/types where helpful. Its Jobs data and several -actions are prototypes, and its legacy Docker/Redis executor is incomplete. - -| Machine | Kubernetes node | Tailnet IP | Cluster LAN IP | Resources | -| --- | --- | --- | --- | --- | -| Main/NVIDIA | `utmist-z1opa08` | `100.73.139.66` | `10.0.0.175` | 2 NVIDIA RTX A4000 GPUs | -| QuietBox | `utmist-tt` | `100.95.175.37` | `10.0.0.112` | 4 n300 boards / 8 Wormhole chips | - -Both nodes report Ready with k3s `v1.36.4+k3s1`. Workload namespace is `mist`; -API namespace is `mist-system`. - -- API already runs inside k3s. Local access is `http://127.0.0.1:3000`. -- Working Jobs page: `http://127.0.0.1:3001/jobs`. -- Vite proxies `/api` to the API; this proxy does not ship in the static build. -- User services: `mist-api-forward.service`, `mist-web.service`. -- Main preview is separate: UI port 3011, API port 3010. -- Existing Jobs page supports scripts, accelerator counts, training checks, - real states, logs, and cancellation. -- API is a trusted local, single-owner pilot. Owner is configuration, not an - authenticated identity. Authentication and tenant isolation remain work. -- Existing checkpoints are in three node-local `local-path` PVCs. Their declared - request is 256 MiB each; this is not a meaningful dataset storage budget. -- Shared storage and dataset upload/download services have not been configured. - -Storage readings taken during planning: - -| Machine | Filesystem capacity | Used | Available | -| --- | --- | --- | --- | -| NVIDIA | 439 GiB | 87 GiB | 330 GiB | -| Tenstorrent NVMe | 3.6 TiB | 1.6 TiB | 1.9 TiB | - -NVIDIA also has an unmounted ~447 GiB `/dev/sdb`. Its contents are unknown; -do not treat it as empty or format it as part of this plan. - -NVIDIA currently reaches QuietBox over Wi-Fi via the router. QuietBox's active -router Ethernet link negotiates 1 Gbps. Both machines have unused 10 Gbps -Ethernet hardware; a future direct link requires compatible ports/cable and -verification. Being on the same tailnet or k3s cluster does not share disks. - -## Implementation order - -### A. Establish the branch and API contracts - -- [x] Create a new foundation branch from the current working checkout. -- [x] Preserve existing pilot changes and inspect main for useful components. -- [x] Separate inventory and submission validation from HTTP/UI presentation. -- [x] Document new response/request shapes before connecting UI controls. -- [x] Keep changes reviewable and avoid unrelated rewrites. - -### B. Task 2: hardware discovery and availability - -Proposed endpoint: `GET /hardware`. Publish the final contract with the code. - -- [x] Report node readiness, accelerator type, allocation unit, total, - allocated, and currently available counts. -- [x] Count NVIDIA allocations from scheduled, nonterminal Kubernetes pods, - including workloads outside Mist. Do not subtract every submitted job. -- [x] Count Tenstorrent devices from ResourceSlices and actual DRA claim - allocations. Account for reservations while a workload starts. -- [x] Label TT counts as boards and show two chips per n300 board. -- [x] Treat machine/inventory failures explicitly; do not present unknown - resources as confidently available. -- [x] Give the API only the additional read permissions required for inventory. -- [x] Keep k3s responsible for actual allocation. UI availability is a snapshot; - a submitted job may wait even if devices looked free moments earlier. - -TT's current vendor ResourceSlice memory capacity is incorrect. Do not use that -value to display accelerator memory or determine placement. The current system -has neither GPU fractions nor arbitrary TT chip sharing. - -### C. Task 3: container image execution - -- [x] Expose approved image choices and explicit image references, command, - arguments, and CPU/memory/deadline controls through typed API/UI code. -- [x] Keep image approval on the server. An approved image can still fail to - pull or be incompatible; report the actual error. -- [x] Preserve the image's working directory. The current executor overrides - every workload with `/tmp`, which can break `python train.py` in an image - whose code lives in `/app`. -- [x] Define command/argument behavior, including whether the image's default - ENTRYPOINT/CMD may run. Kubernetes command/args are arrays; do not silently - treat every string as a shell program. -- [x] Retain script and training-check modes with their tested runtime profiles. -- [x] Support approved custom CPU/NVIDIA images. Keep the tested TT image/profile - restriction visible instead of promising arbitrary TT image compatibility. -- [x] Configure/document image pull credentials where needed; do not ask users - to paste registry credentials into a job form. -- [x] Verify an actual custom image with packaged code, rather than testing - only scripts injected into existing base images. A local fixture image may - be imported into containerd for the initial test. -- [x] Document resource limits and deadlines. Current Job deadline includes - waiting time as well as execution; make any change to this behavior explicit. - -### D. Persistent output folders - -- [x] Provide a predictable, writable per-job directory backed by the existing - checkpoint PVC on the selected machine. -- [x] Create the directory reliably and verify permissions for the supported - image profiles. -- [x] Preserve/document `MIST_CHECKPOINT_DIR` and `checkpoint_directory` so - workloads know where to save their results. -- [x] Verify a real output file remains after the container exits. -- [x] Describe how to retrieve files during local testing and where they live. -- [x] Keep job identifiers/storage references independent of physical disk - paths so shared storage can be added later. - -Files written only into the container's writable layer are not persistent -results. The existing shared checkpoint roots are also not a complete tenant -isolation boundary; do not represent this pilot as ready for untrusted users. - -### E. Task 1: finish website job controls - -- [x] Connect the website to the new hardware and image contracts. -- [x] Keep real job submission, polling, logs, assigned node, failure reasons, - exit codes, and cancellation. -- [x] Show requested resources and the persistent output location. -- [x] Make waiting-for-resources, machine unavailable, and image pull failures - understandable. -- [x] Preserve connection recovery and protect against duplicate submissions. -- [x] Use existing UI conventions and accessible labels. Keep frontend concerns - separate from the executor and typed API client. - -The prototype Dashboard/Machines/auth pages are not proof of working metrics or -authentication. Surface real hardware information in the relevant workflow. - -### F. Verify and hand off - -- [x] Run focused backend tests for execution semantics, inventory accounting, - validation, and cancellation where changed. -- [x] Run frontend type checking, production build, and meaningful interaction - checks for new behavior. -- [x] Run a real custom CPU image job through the website. -- [x] Run fresh NVIDIA and TT training checks through the website. -- [x] Verify occupied/free counts during execution and after completion. -- [x] Verify waiting/reuse and cancellation release for both allocation paths. -- [x] Verify failed commands and image pulls produce useful states/errors. -- [x] Verify saved outputs persist after pod completion. -- [x] Update the deployed API image if necessary; editing Go source does not - update the binary currently running in k3s. -- [x] Record actual results and date them. Older October 3 acceptance evidence - does not substitute for tests of today's changes. -- [x] Document startup, API contracts, image preparation, output access, tests, - and remaining work for the team. - -Avoid unrelated operator upgrades or repeat full infrastructure acceptance tests -without a concrete regression risk. Small synthetic training checks demonstrate -device execution and learning, but each team's actual model needs compatibility -validation; distributed training and TT autograd are not established by these checks. - -## Today's definition of done - -```text -Local website - | -Choose approved image + command + hardware + device count - | -Mist API creates a k3s Job - | -Selected machine runs the container - | -Real states/logs + correct device accounting + persistent output file -``` - -Implementation should be verifiable from the browser, with failures and -cancellation behaving correctly and documentation sufficient for another -developer to resume the work. - -## Next foundation task: shared datasets and downloads - -This is task 4, after today's execution scope: - -1. Create a storage folder on QuietBox with a bounded disk budget. -2. Configure private NFS access for both machines and Kubernetes workloads. -3. Add streaming dataset uploads, progress/error handling, a stable dataset ID, - and a ready state before jobs may use an upload. -4. Attach only the selected dataset read-only and the job's outputs writable. -5. Add result listing/downloads with ownership checks and retention rules. -6. Test one uploaded dataset with jobs on both machines. - -Proposed physical layout, not yet created: - -```text -Tenstorrent: /srv/mist-storage/ -├── datasets/ -│ └── dataset-id/ -└── jobs/ - └── job-id/ - └── outputs/ -``` - -Container paths may become `/inputs` and `/outputs`; preserve compatibility -with the existing checkpoint contract or document the migration explicitly. -NVIDIA reads TT-hosted files over the current LAN, which includes Wi-Fi. -Caching large datasets on NVIDIA and a dedicated Ethernet link can follow. -Central storage on one machine needs backup/retention planning and is unavailable -when that host fails. Archives need safe extraction and upload limits. - -## Later: deployment and product features - -Task 5 follows the foundation: - -- Serve a production frontend and route `/api` to the existing Mist API. -- Provide a team-accessible Tailnet address/hostname and persistent services. -- Implement login, job/file ownership, and appropriate member limits before - supporting multiple users. -- Add public domain/HTTPS only if public access is requested. - -Credits, fairness/priority policies, Jupyter, chaining, agents, detailed monitoring, -portable TT runtime images, and distributed model training are separate workstreams. - -## Resume notes and useful files - -### Code - -- `src/kubernetes.go`: executor, validation, resource requests, job status/logs/cancel. -- `src/kubernetes_test.go`: existing Kubernetes executor tests. -- `src/api.go`: API mode selection and request types. -- `web-interface/src/api.ts`: typed API client. -- `web-interface/src/components/JobsPage.tsx`: working job UI. -- `web-interface/src/components/JobsPage.test.tsx`: existing UI checks. -- `deploy/k3s/mist-api.yaml`: API Deployment, RBAC, Service, and checkpoint PVCs. -- `deploy/k3s/mist-tenstorrent-claims.yaml`: 1–4 board claim templates. -- `deploy/k3s/tenstorrent-workload-policy.yaml`: accelerator workload admission policy. -- `deploy/k3s/training_smoke.py`: actual NVIDIA/TT regression training check. -- `deploy/k3s/verify_mist_api.py`: earlier API allocation/queue/training acceptance tool. - -### Existing documentation and evidence - -- `docs/kubernetes-pilot.md`, `deploy/k3s/README.md`, `src/jobs.md`. -- `deploy/k3s/mist-api-results.json`: October 3 acceptance summary. -- `/home/utmist/mist-api-results-2026-10-03`: detailed prior acceptance artifacts. - -### Local tools and access - -- Go: `/home/utmist/.local/share/mist-runtimes/go-1.25.1/bin/go`. -- Node: `/home/utmist/.local/share/mist-runtimes/node-22.16.0/bin/node`. - Prepend that runtime's directory to PATH when running npm/npx. -- Kubeconfig: `/home/utmist/.kube/config`. -- QuietBox SSH: user `utmist-tt`, host `100.95.175.37`, existing identity file - `/home/utmist/.ssh/id_ed25519_quietbox_codex`; use IdentitiesOnly and BatchMode. -- Browser checks can use the temporary Playwright installation at - `/tmp/mist-browser-check/node_modules/playwright` and existing cached Chromium. -- User is in the Docker group. Sudo requires a password; prior authorized root - cluster operations used a Docker host bind/chroot. Do not print secret values. -- Do not include credentials, join tokens, registry secrets, or private keys in - documentation, Git, or tool output. - -Model recommendation for the user's remaining quota: GPT-6.1 Sol, Medium -reasoning, Standard speed. This was advice, not a settings change. Saved settings -were Max/Fast at the time of planning. Exact quota consumption cannot be predicted. - -## Progress log - -- Planning: agreed scope recorded; existing API health and both Ready nodes checked. -- Branch: `feat/local-job-foundation`. Commit `2f9b178` preserves the prior working - pilot and this plan. Commit identity uses the connected GitHub account's public - noreply address for this commit only; global Git settings were not changed. -- Backend additions: `hardware.go`, `images.go`, `outputs.go`, and `job_states.go`. - Inventory reads node/pod/claim/slice state; image defaults are preserved; - outputs have per-job mounts and an initialization step; history reads are batched. -- Frontend: typed inventory/catalog clients, a shared polling hook, separate - submission/card/log components, and live Machines information. -- Focused backend tests pass. Frontend interaction tests (5), type checking, and - production build pass. A test initially submitted before the catalog loaded; - it was corrected to wait for the form's actual readiness. Final lint also - passed after removing unnecessary test casts and shadowed callback names. -- Example images `mist-training:cpu-v1` and `mist-training:nvidia-v1` were built - and imported on the NVIDIA node. API image `mist-api:foundation-20261008` - is deployed; the final binary image ID is recorded in `foundation-results.json`. -- Fresh browser checks passed: packaged CPU training with image ENTRYPOINT/CMD - and `/app` WORKDIR, both NVIDIA GPUs, TT two-board/four-chip training, exit 17, - cancellation, real states/logs, and the live Machines page. -- Fresh allocation checks passed for NVIDIA and TT: whole-machine occupied/free - counts, queued follower, cancellation with retained logs, automatic device - reuse, and return to 2 GPUs / 4 boards available. -- Persistent output checks used new read-only containers after training exited. - CPU model/results, both NVIDIA checkpoints, and four TT chip checkpoints and - metrics were readable on the proper nodes. SHA256/file evidence was saved. -- A deliberately missing approved image exposed its real pull reason in the API - and browser, then failed with DeadlineExceeded. Temporary image approval was - removed, and prior job/cancellation history survived API restarts. -- Final focused backend tests: 12 passed. Frontend interaction tests: 5 passed; - type checking, production build, and lint of changed frontend files passed. - CLI tests passed. The full src suite passed in 33.325 seconds with isolated - Redis and the existing Docker test image. Its initial 15-second legacy CPU - test timed out during large-image disk activity; the suite passed after the - imports finished. No legacy executor behavior was changed. -- The first browser verifier expected a completed TT claim to retain allocations. - Kubernetes had correctly released them. The verifier now checks completed - request/log evidence and checks actual DRA devices during live reservations. -- Fresh RBAC checks passed: required inventory lists allowed; Secrets, node - writes, pod exec, and Jobs in other namespaces denied. Private registry - Secret wiring is implemented/documented; no private registry login was tested. -- Detailed evidence: `/home/utmist/mist-foundation-results-2026-10-08`. - Compact checked-in summary: `deploy/k3s/foundation-results.json`. - Final idle snapshot: both nodes Ready, 0 allocated / 2 available NVIDIA GPUs, - 0 allocated / 4 available TT boards. All 40 retained Mist Jobs were terminal. - Job history read measured 0.193 seconds, compared with the 3.586-second baseline. -- Today's agreed implementation and verification are complete: parts 1–3 plus - persistent local outputs. The percentage updates referred to today's scope. - The complete platform still needs part 4 (shared datasets/downloads) and - part 5 (deployment/login). The team handoff is `docs/local-job-foundation.md`. -- Screen question checked: automatic suspend on AC has timeout 0 (disabled), - so the display may turn off while work continues. Power settings were not changed. - -## References - -- [Kubernetes Jobs](https://kubernetes.io/docs/concepts/workloads/controllers/job/) -- [Container images](https://kubernetes.io/docs/concepts/containers/images/) -- [K3s private registries](https://docs.k3s.io/installation/private-registry) -- [Kubernetes persistent volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) -- [Local path provisioner](https://github.com/rancher/local-path-provisioner) -- [Tenstorrent platform support](https://docs.tenstorrent.com/tt-operator/latest/platform-support.html) diff --git a/docs/content/archive/k3s-deployment-history.md b/docs/content/archive/k3s-deployment-history.md deleted file mode 100644 index 9f6cd55..0000000 --- a/docs/content/archive/k3s-deployment-history.md +++ /dev/null @@ -1,408 +0,0 @@ -> **Historical record — superseded.** This text describes an earlier phase. -> Commands and claims below are retained as history, not current setup instructions. -> Start with the [current documentation index](../_index.md) and -> [department operating guide](../department-rollout.md). - -# Accelerator jobs on k3s - - -**October 9 update:** Team workspaces, scoped storage, enforced limits, durable queueing and private -production hosting are implemented. Earlier local pilot descriptions below record the -original phase. Use [the current operating guide](../department-rollout.md) for today's behavior. - -For the original NVIDIA-node setup and recovery procedure, read the -[setup runbook](k3s-setup-history.md). Its final section records the QuietBox worker -join on 2026-10-03. - -The NVIDIA server runs Ubuntu 22.04, k3s 1.36, and two RTX A4000 GPUs. The host -driver is pre-installed. NVIDIA GPU Operator v26.7.1 is configured with -[`nvidia-gpu-operator-values.yaml`](../../../deploy/k3s/nvidia-gpu-operator-values.yaml). Pin the -chart version when installing or upgrading: - -```bash -sudo env KUBECONFIG=/etc/rancher/k3s/k3s.yaml helm upgrade --install gpu-operator \ - oci://nvcr.io/nvidia/cloud-native-charts/gpu-operator \ - --version v26.7.1 --namespace gpu-operator --create-namespace \ - --values deploy/k3s/nvidia-gpu-operator-values.yaml --wait -``` - -Run from the repository root. Check that the operator pods are healthy and the -node advertises two GPUs before submitting a workload: - -```bash -sudo k3s kubectl -n gpu-operator get pods -sudo k3s kubectl describe node utmist-z1opa08 -``` - -The `Allocatable` section must include `nvidia.com/gpu: 2`. Then run the -single-GPU CUDA smoke test: - -```bash -sudo k3s kubectl create namespace mist -sudo k3s kubectl apply -f deploy/k3s/gpu-smoke-job.yaml -sudo k3s kubectl -n mist wait --for=condition=complete job/gpu-smoke --timeout=180s -sudo k3s kubectl -n mist logs job/gpu-smoke -``` - -The expected log contains `Test PASSED`. To rerun the Job, delete only the -finished smoke Job and apply the manifest again: - -```bash -sudo k3s kubectl -n mist delete job gpu-smoke -sudo k3s kubectl apply -f deploy/k3s/gpu-smoke-job.yaml -``` - -No Service or NodePort is needed for a batch Job. This test verifies that k3s -can allocate an NVIDIA GPU and execute CUDA. Mist now submits these resources -through its Kubernetes executor; see the [API setup](#mist-api-cli-and-jobs-page). - -The cluster also has `utmist-tt` as an agent at `10.0.0.112`. Tenstorrent -DRA allocation is installed there: four n300 boards, each containing two -Wormhole chips. The NVIDIA smoke Job remains specific to `utmist-z1opa08`. - -## Tenstorrent allocation - -TT-Operator **0.3.0** installs Fabric Manager **0.2.30** and the DRA driver -**0.0.59**, configured by -[`tenstorrent-operator-values.yaml`](../../../deploy/k3s/tenstorrent-operator-values.yaml). -The existing host KMD/firmware and the existing NFD installation are retained; -driver management, duplicate NFD, telemetry, JobSet, and PMIx are disabled. -The manually verified `tenstorrent.com/has-tt=true` node label enables discovery. - -To reproduce the installation from the repo root: - -```bash -export KUBECONFIG=/home/utmist/.kube/config -k3s kubectl label node utmist-tt tenstorrent.com/has-tt=true --overwrite -helm upgrade --install tt-operator oci://ghcr.io/tenstorrent/helm/tt-operator \ - --version 0.3.0 --namespace tt-operator-system --create-namespace \ - --values deploy/k3s/tenstorrent-operator-values.yaml -k3s kubectl apply -f deploy/k3s/tenstorrent-workload-policy.yaml -k3s kubectl -n tt-operator-system get pods -k3s kubectl get deviceclasses,resourceslices -k3s kubectl get resourceslices -o yaml -``` - -All three operator pods must be Ready. The `tenstorrent.com` DeviceClass -and a ResourceSlice on `utmist-tt` must exist, with **four** `n300` devices -whose `chipCount` is **2**. ResourceSlices are the inventory; claims show -reservations. TT does not appear as an `nvidia.com/gpu` node resource. - -The supported reservation unit is a whole **n300 board**, including its -remote chip. Jobs can reserve one to four boards; separate jobs can use -the remaining boards. A request waits if insufficient boards or other -requested resources are free. Each pod gets its own ResourceClaim through -a ResourceClaimTemplate, and only its allocated device nodes are injected -through CDI. Boards are released when the pod finishes, even while its -completed Job and checkpoints are retained. - -[`training-tenstorrent-job.yaml`](../../../deploy/k3s/training-tenstorrent-job.yaml) now requests -one board, runs without privileged access, and reserves 2 GiB of 1 GiB -hugepages. The host still has 16 GiB of such hugepages. It mounts the existing -TT-Metal checkout and Python environment read-only, so it is specific to -this QuietBox rather than a portable training image. - -For uniquely named training checks and separate checkpoint directories, -use [`submit_tenstorrent_smoke.py`](../../../deploy/k3s/submit_tenstorrent_smoke.py). It needs -Python PyYAML, available on the server. For example: - -```bash -export KUBECONFIG=/home/utmist/.kube/config -python3 deploy/k3s/submit_tenstorrent_smoke.py my-tt-test-a --boards 1 -python3 deploy/k3s/submit_tenstorrent_smoke.py my-tt-test-b --boards 1 -k3s kubectl -n mist get jobs,pods,resourceclaims -k3s kubectl -n mist logs -f job/my-tt-test-a -``` - -Use `--boards 2` for four chips, or `--boards 4` for all eight. The script -submits the small regression test described below. A different model needs -compatible Tenstorrent training code. Claim count, expected chip count, -hugepage reservation, and checkpoint directory must all match the job. -These tests train on each allocated chip independently; they do not perform -distributed training of one model. For multiple boards, the check launches -one runtime per board using its PCI address in `TT_VISIBLE_DEVICES`. This -avoids assuming that an arbitrary selected subset forms a connected mesh. -The scheduler reserves boards but does not promise their fabric topology; -a model spanning boards needs an appropriate topology and training runtime. - -The admission policy applies to pods in `mist`, including init and ephemeral -containers. It rejects privileged access, added capabilities, host PID/IPC, -arbitrary host mounts, and writable mounts of the host runtime. This blocks -the previous privileged whole-machine test from being submitted again. -Individual character-device mounts remain allowed for the verification -probes, with access to unclaimed devices denied by device cgroups. The policy -is a guard for managed workloads, not a complete security boundary for -untrusted tenants or cluster administrators; hugepage mounts are host-shared. - -### Allocation acceptance test - -On 2026-10-03, four jobs reserved distinct boards and trained concurrently -on all eight chips. Their first-chip training intervals overlapped for -**3.924 seconds**. Each job could open its own device and received permission -errors opening the other three, even when the other character nodes were -mounted for the probe. A fifth job remained Pending with `cannot allocate -all claims`, then started automatically after a board was released. All five -jobs passed training, held-out-data, and checkpoint reload checks. Automatic -claim cleanup left all four boards free afterward. - -To repeat that live test (it requires all four boards to be free): - -```bash -export KUBECONFIG=/home/utmist/.kube/config -python3 deploy/k3s/verify_tenstorrent_allocation.py \ - --artifacts /home/utmist/k3s-allocation-results-new-run -``` - -The test holds initialized jobs at a shared-file barrier to inspect their -reservations, checks actual device access, observes the fifth job queuing, -and then releases the barrier. It verifies overlapping training timestamps, -loss thresholds, checkpoint files, and board reuse. Test jobs are retained; -the temporary PVC reader is deleted. The barrier times out after five -minutes if interrupted. The checkpoint PVC is retained. - -Operator restart recovery and an NVIDIA CUDA regression check also passed. -See [`tenstorrent-allocation-results.json`](../../../deploy/k3s/tenstorrent-allocation-results.json) -for pinned image IDs and results. Logs, claim/queue snapshots, admission -checks, and checkpoint archives are in -`/home/utmist/k3s-allocation-results-2026-10-03` on the NVIDIA server. -The vendor currently advertises an incorrect board-memory capacity in the -ResourceSlice; these claims select board type/count and do not use that -capacity for placement. Verify/correct it before adding memory-based selectors. - -## Training smoke jobs - -[`training_smoke.py`](../../../deploy/k3s/training_smoke.py) learns a 32-input/32-output linear -mapping from 128 synthetic samples and evaluates 64 held-out samples. Each -device must complete 100 gradient updates, reduce training MSE by at least -98%, achieve held-out MSE below `0.0005`, change its weights, and reload its -checkpoint successfully. NVIDIA uses PyTorch CUDA autograd. Tenstorrent uses -TT-NN for forward passes, explicit analytic gradients, and weight updates; -CPU Torch creates the data, reads metrics, and saves checkpoints. This does -not validate automatic differentiation or arbitrary models on Tenstorrent. - -The NVIDIA Job reserves both GPUs and tests each independently. The current -Tenstorrent manifest reserves one n300 board and tests its two chips -independently. The original eight-chip privileged Job, named -`training-tenstorrent`, is retained only as historical evidence; the new -Job is `training-tenstorrent-dra` and uses DRA/CDI reservations. - -Run from the repository root: - -```bash -sudo k3s kubectl -n mist create configmap training-smoke-script \ - --from-file=deploy/k3s/training_smoke.py --dry-run=client -o yaml \ - | sudo k3s kubectl apply -f - -sudo k3s kubectl apply -f deploy/k3s/training-nvidia-job.yaml -sudo k3s kubectl apply -f deploy/k3s/training-tenstorrent-job.yaml -sudo k3s kubectl -n mist logs -f job/training-nvidia -sudo k3s kubectl -n mist logs -f job/training-tenstorrent-dra -sudo k3s kubectl -n mist get jobs,pvc -``` - -Each successful log ends with `TRAINING_PASSED`. Checkpoints and -`results.json` are stored in the corresponding `training-*-checkpoints` PVC, -with the one-board TT check under its `dra-single` directory, -which uses storage local to the selected node. Preserve the PVCs when -removing a completed Job. Delete only the completed Job before applying its -manifest to rerun it; retained checkpoint filenames will be overwritten. -The TT manifest depends on QuietBox's existing host paths, hugepages, and -TT-Metal checkout and is not a portable training image. - -The original whole-node Jobs passed on 2026-10-03, with exit code zero. All ten devices changed -weights, met the held-out-data threshold, and reloaded their saved -checkpoints. The archives were also checked after the Pods completed. - -| Backend | Devices tested independently | Initial training MSE | Final training MSE | Held-out MSE | -| --- | --- | --- | --- | --- | -| NVIDIA RTX A4000, PyTorch FP32 | 2 GPUs | 0.319374 | 0.000000201866 | 0.000000932067 | -| Wormhole, TT-NN BF16 | 8 chips | 0.319374 | 0.0000623871 | 0.000175072 | - -Precision and implementations differ; these figures establish convergence -and are not a performance comparison. Exact image IDs, the TT-Metal host -commit, Job timestamps, artifact locations, and acceptance thresholds are in -[`training-smoke-results.json`](../../../deploy/k3s/training-smoke-results.json). Local logs and -checkpoint archives are retained under -`/home/utmist/k3s-training-results-2026-10-03` on the NVIDIA server. The -completed Kubernetes Jobs and their checkpoint PVCs are retained too. - - -## Mist API, CLI and Jobs page - -The API now uses Kubernetes by default and runs in `mist-system`. Its service -account manages Jobs and script ConfigMaps in `mist`, reads Pod logs/events -and TT claims, and has no cluster administrator credentials. The configured -pilot owner is `utmist`. No authentication or public ingress is configured. -The foundation also lists node/pod/claim/slice state for live hardware inventory. -See [the foundation guide](local-job-foundation.md) for contracts, -website instructions, persistent outputs, and the developer handoff. - -### Build and install on the current server - -Requires Go 1.25.1, Docker, k3s, and the private administrative kubeconfig. -Use the already installed GPU/TT operators described above. The API image is -built locally and imported into k3s containerd; `imagePullPolicy: Never` -means that it must be present on the selected server before deployment. - -```bash -export KUBECONFIG=/home/utmist/.kube/config -CGO_ENABLED=0 go -C src build -o ../bin/mist-api . -docker build -f deploy/k3s/Dockerfile.api -t mist-api:foundation-20261008 . -docker build -f deploy/k3s/examples/Dockerfile.training \ - -t mist-training:cpu-v1 deploy/k3s/examples -docker build -f deploy/k3s/examples/Dockerfile.training \ - --build-arg BASE_IMAGE=pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime \ - -t mist-training:nvidia-v1 deploy/k3s/examples -docker save -o /tmp/mist-foundation-images.tar \ - mist-api:foundation-20261008 mist-training:cpu-v1 mist-training:nvidia-v1 -sudo k3s ctr -n k8s.io images import --platform linux/amd64 /tmp/mist-foundation-images.tar -k3s kubectl apply -f deploy/k3s/mist-api.yaml -k3s kubectl apply -f deploy/k3s/mist-tenstorrent-claims.yaml -k3s kubectl apply -f deploy/k3s/tenstorrent-workload-policy.yaml -k3s kubectl -n mist create configmap training-smoke-script \ - --from-file=deploy/k3s/training_smoke.py --dry-run=client -o yaml \ - | k3s kubectl apply -f - -k3s kubectl -n mist-system rollout status deployment/mist-api --timeout=120s -``` - -The API manifest creates namespaces, RBAC and all three checkpoint PVCs -without submitting a training Job. If rebuilding the same local image tag, -import the new image and run `rollout restart deployment/mist-api` in -`mist-system`. Preserve Jobs and PVCs when restarting the API. - -For a manual local endpoint: - -```bash -k3s kubectl -n mist-system port-forward service/mist-api 3000:3000 --address 127.0.0.1 -``` - -Then in another terminal: - -```bash -curl http://127.0.0.1:3000/healthz -go -C cli build -o ../bin/mist . -bin/mist job list --all -cd web-interface -npm install --package-lock=false -npm run dev -- --host 127.0.0.1 --port 3001 --strictPort -``` - -Open http://127.0.0.1:3001/jobs. Choose CPU, NVIDIA GPUs or Tenstorrent boards; -submit a Python script, select an approved **Container image** with its own -entrypoint/arguments, or choose **Small training check** for an accelerator. -The page displays actual placement, queue messages, exit status and logs. -Hardware availability is live; the Machines route uses the same inventory. -Cancel stops a waiting/running workload and retains cancellation history. -CLI commands are in [the CLI guide](../../../cli/docs/setup.md). - -The installed user units keep both local services running during the user's -systemd session. Their paths target this server and need adjustment on another -host; they do not enable user lingering or guarantee operation before login. - -```bash -mkdir -p ~/.config/systemd/user -cp deploy/k3s/mist-api-forward.service deploy/k3s/mist-web.service ~/.config/systemd/user/ -systemctl --user daemon-reload -systemctl --user enable --now mist-api-forward mist-web -systemctl --user status mist-api-forward mist-web -``` - -Do not run manual listeners on the same ports while these units are active. -Stop them with `systemctl --user stop mist-web mist-api-forward` if needed. - -### Submission examples - -```bash -curl -sS http://127.0.0.1:3000/jobs -H 'Content-Type: application/json' \ - -d '{"name":"hello","accelerator":"cpu","command":["python","-c","print(42)"]}' -curl -sS http://127.0.0.1:3000/jobs -H 'Content-Type: application/json' \ - -d '{"name":"one-board","type":"training-smoke","accelerator":"tenstorrent","device_count":1}' -curl -sS http://127.0.0.1:3000/jobs -H 'Content-Type: application/json' \ - -d '{"name":"one-gpu","type":"training-smoke","accelerator":"nvidia","device_count":1}' -``` - -CPU jobs request no accelerator. NVIDIA requests accept one or two GPUs; -TT requests accept one to four boards, each containing two chips. Defaults -are 250m CPU/256Mi RAM for CPU jobs, 2 CPU/2Gi for NVIDIA, and 2 CPU/4Gi plus -2Gi hugepages per TT board. CPU and memory limits equal requests. The API -accepts CPU up to 8, memory 64Mi to 32Gi (TT minimum 2Gi), and deadlines from -10 seconds to 24 hours, default 600 seconds. Deadlines include queue time. -Images must be approved by the API's allowlist; submissions cannot specify -privileged access or host mounts. Environment variables `MIST_JOB_ID`, -`MIST_OUTPUT_DIR=/outputs`, and `MIST_CHECKPOINT_DIR=/checkpoints/` -provide the job identity and two aliases for its persistent directory. - -Storage remains node-local with a shared backing PVC per compute profile. -New workloads mount only their job-specific subdirectory. Retained Jobs -provide history across API restarts, without TTL. Normal logs remain in pod -logs; cancellation preserves their last 32KiB in the Job metadata. Keep the -Pods/PVCs or archive them before cleanup. This is a local single-owner pilot, -not an authenticated multi-user deployment. - -### Custom images and private registries - -The deployment's `MIST_ALLOWED_IMAGES` approves exact image references; -`GET /images` exposes them to the website. For real workloads, build/push an -image containing code/dependencies, approve its immutable tag/digest, and let -the selected node pull it. Local example tags must be imported on the NVIDIA -server. An approved image is not guaranteed to be pullable or CUDA compatible. -The TT profile still requires its tested image and read-only host runtime. - -CPU/NVIDIA container jobs preserve image ENTRYPOINT/CMD and WORKDIR when no -override is supplied. Arguments are array entries, not a parsed shell command. -Scripts and training checks retain their tested runtime profiles. Write results -to `/outputs`; files elsewhere in the container are not persistent outputs. - -For private images, an administrator creates a `kubernetes.io/dockerconfigjson` -Secret in workload namespace `mist`, then adds `MIST_IMAGE_PULL_SECRETS` to -the API Deployment environment with the Secret name(s), comma-separated. -Jobs receive those names as `imagePullSecrets`. Mist does not read Secret -contents or accept registry passwords in the submission form. Keep Secret -manifests/credentials outside Git. K3s node registry configuration is another -option: [private registries](https://docs.k3s.io/installation/private-registry). - -### Foundation acceptance - -With both accelerators free and the example images imported, run the browser -story, then the allocation/output checks using the same artifact directory: - -```bash -export KUBECONFIG=/home/utmist/.kube/config -export MIST_PLAYWRIGHT_MODULE=/tmp/mist-browser-check/node_modules/playwright/index.mjs -node deploy/k3s/verify_foundation_browser.mjs /home/utmist/mist-foundation-results-new-run -python3 deploy/k3s/verify_foundation.py --artifacts /home/utmist/mist-foundation-results-new-run -``` - -Playwright and Chromium are test tooling, separate from the web application. -Set `MIST_PLAYWRIGHT_MODULE` to its installed `index.mjs`, or install Playwright -where Node can resolve it. `MIST_WEB_URL` changes the browser endpoint; -`--url` changes the API endpoint for the Python tool. -Checks cover packaged CPU/NVIDIA images, both GPUs, TT training, real UI -states/logs/cancellation, occupied/free counts, queues, reuse, and saved files -read by fresh containers on both nodes. Temporary read-only output probes are -removed; test Jobs and result directories remain. The final markers are -`FOUNDATION_BROWSER_PASSED` and `FOUNDATION_ALLOCATION_OUTPUTS_PASSED`. -October 8 evidence is under `/home/utmist/mist-foundation-results-2026-10-08`. -See [the checked-in summary](../../../deploy/k3s/foundation-results.json) for actual job IDs, -deployed image ID, and completed checks. - -### API acceptance test - -This test needs both GPUs and all four TT boards available. It submits 17 -uniquely named jobs, holds initialized devices at barriers to prove separate -reservations, verifies queued jobs, training/checkpoint reload, CPU failures, -deadlines, retained cancellation logs, and cancellation freeing all TT boards. - -```bash -export KUBECONFIG=/home/utmist/.kube/config -python3 deploy/k3s/verify_mist_api.py \ - --artifacts /home/utmist/mist-api-results-new-run -``` - -Successful output ends with `MIST_API_PASSED`. Jobs and checkpoint directories -are retained. A barrier times out after five minutes if interrupted. The -verification script uses the operator's administrative context to inspect -claims/devices and release test barriers; the Mist API itself cannot exec. -Results from 2026-10-03 are in [mist-api-results.json](../../../deploy/k3s/mist-api-results.json), -with raw evidence and checkpoint archives under -`/home/utmist/mist-api-results-2026-10-03`. These checks establish small model -training and allocation, not large/distributed-model support or performance. diff --git a/docs/content/archive/k3s-setup-history.md b/docs/content/archive/k3s-setup-history.md deleted file mode 100644 index d32e55d..0000000 --- a/docs/content/archive/k3s-setup-history.md +++ /dev/null @@ -1,283 +0,0 @@ -> **Historical record — superseded.** This text describes an earlier phase. -> Commands and claims below are retained as history, not current setup instructions. -> Start with the [current documentation index](../_index.md) and -> [department operating guide](../department-rollout.md). - -# Single-node k3s and NVIDIA GPU pilot: setup and handoff - -This runbook records the configuration observed on **2026-09-28**, a repeatable -setup and validation procedure, and the failure encountered during setup. Run -commands from the Mist repository root unless noted. The -[Kubernetes execution pilot](kubernetes-pilot.md) describes the -implemented Kubernetes executor and remaining product work. - -## What the pieces do - -The machine already had two NVIDIA GPUs and a working host driver. A **single -k3s server** was installed on it. A server includes a local kubelet and -container runtime and can run Jobs without a separate `k3s-agent` service. -The NVIDIA GPU Operator added the Kubernetes integration: - -1. Its **device plugin** registers `nvidia.com/gpu` with the kubelet, allowing - the scheduler to reserve a GPU for a Pod that requests one. -2. Its **container toolkit** prepares CDI device information that containerd - uses to expose the assigned GPU and host driver libraries to a workload. - The enabled NRI plugin handles GPU management containers and avoids - rewriting k3s's containerd runtime configuration. -3. A CUDA sample Job requests `nvidia.com/gpu: 1` and exercises the device. - -The operator was configured **not** to replace the existing host driver. Those -values are in -[`nvidia-gpu-operator-values.yaml`](../../../deploy/k3s/nvidia-gpu-operator-values.yaml). NVIDIA -states that its NRI plugin is not yet generally available; this is a pilot -configuration. See the [GPU Operator installation guide](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/getting-started.html) -and [CDI/NRI guide](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/cdi.html). - -## Observed state on 2026-09-28 - -| Item | Observed value | -| --- | --- | -| Node | `utmist-z1opa08`, one control-plane and worker node | -| OS | Ubuntu 22.04.5 LTS | -| k3s | `v1.36.4+k3s1`; `k3s.service` enabled and active | -| Container runtime | k3s containerd `2.3.4-k3s1.36` | -| GPUs | Two NVIDIA RTX A4000 cards | -| Host driver | NVIDIA `590.48.01`, already present before GPU Operator deployment | -| GPU Operator | Helm release `gpu-operator`, chart `v26.7.1`, namespace `gpu-operator` | -| Test namespace | `mist` | -| Node resource | Capacity and allocatable: `nvidia.com/gpu: 2` | - -The node registered at 19:23 EDT. GPU Operator resources appeared around 19:39 -EDT; Helm release revision 2 was deployed at 19:45 EDT. The `gpu-smoke` Job -completed at about 19:44 EDT. After the service fix, a new `gpu-confirm` Job -completed at 19:54 EDT. Both sample logs contained `Test PASSED`. Each Job -requested **one** GPU. The node advertised two, but these tests did not -independently identify or exercise each physical card. - -These times and versions come from systemd, Kubernetes object timestamps, -`helm list`, `nvidia-smi`, and the completed Job logs. The exact historical -k3s installation command was not retained, so the commands below are a -reproduction recipe rather than a transcript. - -## Reproduce or verify this pilot - -Check versions against the target host before rebuilding or upgrading. Have a -working NVIDIA driver and `helm` available. Never commit the kubeconfig, -cluster token, or private keys to this repository. - -### 1. Confirm the GPUs work on the host - -```bash -nvidia-smi -L -nvidia-smi --query-gpu=name,driver_version --format=csv,noheader -``` - -On this node the first command lists two RTX A4000 cards. Resolve host driver -or hardware failures before diagnosing Kubernetes GPU allocation. - -### 2. Run one k3s server - -For a fresh **single-node** install, pin the version used in this pilot: - -```bash -curl -sfL https://get.k3s.io | sudo env INSTALL_K3S_VERSION='v1.36.4+k3s1' sh -s - server -sudo systemctl is-active k3s -sudo k3s kubectl get nodes -o wide -``` - -Expect `active` and a `Ready` node. The installer writes an administrative -kubeconfig at `/etc/rancher/k3s/k3s.yaml`; `sudo k3s kubectl` uses it without -copying credentials. Any copied kubeconfig must be kept private. The -[k3s quick-start guide](https://docs.k3s.io/quick-start) explains that a -single server can host workloads and that agents join additional machines. - -This same host must **not** run a separate `k3s-agent` service: - -```bash -systemctl is-active k3s-agent -systemctl is-enabled k3s-agent -``` - -Expected outputs here are `inactive` and `disabled`. These commands can -return nonzero for those expected states. - -### 3. Install the GPU Operator - -The tracked Helm values disable Operator driver installation and enable its -NRI plugin for GPU management containers. Keep the chart version pinned when -reproducing this setup: - -```bash -sudo env KUBECONFIG=/etc/rancher/k3s/k3s.yaml helm upgrade --install gpu-operator \ - oci://nvcr.io/nvidia/cloud-native-charts/gpu-operator \ - --version v26.7.1 --namespace gpu-operator --create-namespace \ - --values deploy/k3s/nvidia-gpu-operator-values.yaml --wait - -sudo k3s kubectl -n gpu-operator get pods -sudo k3s kubectl describe node utmist-z1opa08 -``` - -The device plugin and container toolkit Pods should be Running. In the node's -`Capacity` and `Allocatable` sections, expect `nvidia.com/gpu: 2` for this -hardware. A completed validator Pod is normal. The operator may need a little -time to register devices after k3s starts; check again after its Pods are -healthy. - -### 4. Execute CUDA through k3s - -The tracked [`gpu-smoke-job.yaml`](../../../deploy/k3s/gpu-smoke-job.yaml) requests and limits one -`nvidia.com/gpu` device. Create the namespace if it does not already exist: - -```bash -sudo k3s kubectl create namespace mist -sudo k3s kubectl apply -f deploy/k3s/gpu-smoke-job.yaml -sudo k3s kubectl -n mist wait --for=condition=complete job/gpu-smoke --timeout=180s -sudo k3s kubectl -n mist describe job gpu-smoke -sudo k3s kubectl -n mist logs job/gpu-smoke -``` - -Expect `1 Succeeded`, `nvidia.com/gpu: 1` in the Job's requests and limits, -and `Test PASSED` in the logs. This establishes that k3s scheduled a GPU Pod, -the runtime exposed a device inside the container, and CUDA executed. Merely -seeing the host GPUs or the Kubernetes resource count is a weaker check. - -A completed Job does not rerun on `kubectl apply`. To repeat this test, delete -**only the completed smoke Job**, then apply the manifest again: - -```bash -sudo k3s kubectl -n mist delete job gpu-smoke -sudo k3s kubectl apply -f deploy/k3s/gpu-smoke-job.yaml -sudo k3s kubectl -n mist wait --for=condition=complete job/gpu-smoke --timeout=180s -sudo k3s kubectl -n mist logs job/gpu-smoke -``` - -Save logs first if they are needed for an incident review. This batch Job -does not need a Service or NodePort. - -## Failure encountered: duplicate agent on port 6444 - -Both `k3s.service` and `k3s-agent.service` had been enabled on the **same -host**. The agent listened on `127.0.0.1:6444`, which the server's API process -also needed. The server repeatedly exited with: - -```text -failed to listen on 127.0.0.1:6444: bind: address already in use -``` - -During the conflict, `kubectl` could not connect to `127.0.0.1:6443`. -`nvidia-smi` still saw the GPUs, but new Kubernetes workloads could not use -them because the control plane was unavailable. Agent logs also referenced -`https://myserver:6443`, an example server name rather than this node's -working endpoint. The fix on 2026-09-28 was: - -```bash -sudo systemctl stop k3s-agent.service -sudo systemctl disable k3s-agent.service -sudo systemctl is-active k3s -sudo k3s kubectl get nodes -``` - -The server recovered without replacing the host driver or reinstalling the -operator. If it does not recover, inspect logs before restarting it, -especially when other workloads are running: - -```bash -systemctl status k3s k3s-agent --no-pager -journalctl -u k3s -u k3s-agent -n 100 --no-pager -ss -ltn '( sport = :6443 or sport = :6444 )' -``` - -## Troubleshooting and limits - -- **API connection refused:** Check `k3s.service` and its journal first. On - this node, confirm the duplicate agent has not been enabled again. -- **Node Ready but no `nvidia.com/gpu`:** Check `nvidia-smi -L`, the device - plugin and toolkit Pods, and - `sudo k3s kubectl -n gpu-operator logs daemonset/nvidia-device-plugin-daemonset --tail=100`. - Compare live Helm values with the tracked file if the release has changed. -- **GPU Job Pending:** Use `sudo k3s kubectl -n mist describe pod ` - to inspect scheduler events and requested resources. Two GPUs are the - observed capacity, not a promise that both are free at every moment. -- **Pod starts but CUDA fails:** Inspect its logs, host `nvidia-smi`, toolkit - Pod logs, and device plugin logs. An advertised resource alone does not - prove CUDA works. - -The smoke test proves **one requested GPU worked through k3s on the test -date**. It does not prove independent operation of both cards, GPU sharing, -performance, reboot durability, multi-node behavior, or Mist API integration. -The subsequent 2026-10-03 allocation/training and Mist API checks are recorded -in [the current deployment guide](k3s-deployment-history.md#mist-api-cli-and-jobs-page). - -## QuietBox worker joined on 2026-10-03 - -`utmist-tt` joined the existing `utmist-z1opa08` cluster as an agent. Both -machines are on the `10.0.0.0/24` LAN as well as the same Tailscale network; -the cluster uses their LAN addresses and the default Flannel VXLAN backend. -The server was not changed to advertise its Tailscale address. - -| Node | Role | Kubernetes InternalIP | k3s version | -| --- | --- | --- | --- | -| `utmist-z1opa08` | server and NVIDIA worker | `10.0.0.175` | `v1.36.4+k3s1` | -| `utmist-tt` | Tenstorrent host and k3s agent | `10.0.0.112` | `v1.36.4+k3s1` | - -QuietBox previously ran an independent `v1.36.5+k3s1` server with only a test -Nginx workload, standard system pods, and no PVCs or user Jobs. Its server -state was backed up to the root-only -`/root/k3s-server-prejoin-2026-10-03.tar.gz` on QuietBox before uninstalling -that server. The agent is enabled at boot; no `k3s.service` remains there. - -The agent's `/etc/rancher/k3s/config.yaml` points to -`https://10.0.0.175:6443`, sets `node-ip: 10.0.0.112`, uses `enp201s0` for -Flannel, and reads its persistent, root-only bootstrap token from -`/etc/rancher/k3s/agent-token`. Do not commit or print that token. The -installation token expires after one hour; the persistent token was installed -and verified by restarting `k3s-agent`. - -QuietBox has UFW active with default deny for incoming and routed traffic. -The join added inbound UDP `8472` and TCP `10250` from `10.0.0.175` on -`enp201s0`, plus routed traffic between `10.42.1.0/24` on `cni0` and -`10.42.0.0/24` on `flannel.1` in both directions. The NVIDIA server's UFW is -inactive. A temporary BusyBox pod placed on QuietBox resolved -`kubernetes.default.svc.cluster.local` and fetched the Nginx Service whose -pod ran on the NVIDIA node; its log ended with `CROSS_NODE_OK`. The test pod -was then removed. - -QuietBox exposes four `/dev/tenstorrent` devices and has the `tenstorrent` -kernel module loaded. TT-Operator 0.3.0 now runs Fabric Manager 0.2.30 and -DRA driver 0.0.59 with host driver management disabled. It advertises four -n300 board reservations, each covering two chips, through the -`tenstorrent.com` DeviceClass and ResourceSlices. Host KMD and firmware are -retained. See [installation, allocation, and live tests](k3s-deployment-history.md#tenstorrent-allocation). - -Four nonprivileged training jobs passed concurrently, with device cgroups -denying access to the other jobs' boards. A fifth job queued and then -trained after automatic board release. The `mist` admission policy blocks -the former privileged whole-machine setup from bypassing reservations. -Distributed training and untrusted-tenant security remain separate work. - -To verify the current cluster from the server: - -```bash -sudo k3s kubectl get nodes -o wide -sudo k3s kubectl get pods -A -o wide -sudo k3s kubectl describe node utmist-tt -``` - -The administrative kubeconfig copy at `/home/utmist/.kube/config` is owned by -`utmist` and mode `0600` as of this join. - - -## Mist application integration on 2026-10-03 - -The deployed API now creates real CPU, NVIDIA and Tenstorrent Jobs. CLI and -browser checks exercised submission, actual status/logs, cancellation, and -TT board-count selection. Live acceptance checks covered distinct concurrent -reservations, queuing and reuse, whole-device requests, exit-17 failure, -deadline failure, persisted checkpoints, and cancellation freeing all boards. -The API uses a dedicated namespaced service account, not the administrative -kubeconfig used by local operators. See [API installation and live evidence](k3s-deployment-history.md#mist-api-cli-and-jobs-page). - -The user's `mist-api-forward` and `mist-web` systemd units expose only -`127.0.0.1:3000` and `127.0.0.1:3001`. These user services require a user -systemd session. Current authentication, credits, team quotas, shared storage -and large/distributed model support remain outside the validated pilot. diff --git a/docs/content/archive/kubernetes-pilot.md b/docs/content/archive/kubernetes-pilot.md deleted file mode 100644 index 8e5230a..0000000 --- a/docs/content/archive/kubernetes-pilot.md +++ /dev/null @@ -1,139 +0,0 @@ -> **Historical record — superseded.** This text describes an earlier phase. -> Commands and claims below are retained as history, not current setup instructions. -> Start with the [current documentation index](../_index.md) and -> [department operating guide](../department-rollout.md). - -# Kubernetes execution pilot - - -**October 9 update:** Shared datasets/results, member login and private production -hosting are implemented. Earlier local pilot descriptions below record the -original phase. Use [the current operating guide](complete-foundation.md) for today's behavior. - -## Implemented on 2026-10-03 - -Mist uses Kubernetes `batch/v1` Jobs by default. The API submits actual -commands or uploaded scripts, reports real exit codes and scheduler messages, -retrieves pod logs, and cancels workloads. The CLI and Jobs page use these -endpoints. The optional `MIST_EXECUTOR=docker` path retains the older, -incomplete Docker/Redis supervisor for compatibility. - -Kubernetes owns placement, device accounting, and Job lifecycle. Mist validates -submission parameters and configured owner labels. Authentication, team -policy, credits, quotas, priority, and audit accounting are still application -work; the current API is a local single-owner pilot. - -```mermaid -flowchart LR - User[Jobs page / CLI] --> API[Mist API] - API --> Validate[Image, resources, script and deadline validation] - Validate --> Jobs[Kubernetes Jobs] - Jobs --> NVIDIA[CPU / NVIDIA server] - Jobs --> Claims[Tenstorrent DRA claims] - Claims --> TT[QuietBox boards via CDI] - Jobs --> State[Job and Pod status / logs] - State --> API - NVIDIA --> Artifacts[Node-local checkpoint PVCs] - TT --> Artifacts -``` - -See [installation, commands and acceptance tests](k3s-deployment-history.md#mist-api-cli-and-jobs-page) -and [job lifecycle and API endpoints](../../../src/jobs.md). - -## Hardware and scheduling - -| Node | Workload resources | Allocation | -| --- | --- | --- | -| `utmist-z1opa08` | CPU and two NVIDIA RTX A4000 GPUs | `nvidia.com/gpu`, one or two whole GPUs | -| `utmist-tt` | Four n300 Wormhole boards, eight chips | DRA/CDI, one to four whole two-chip boards | - -CPU and NVIDIA jobs select the server because their pilot storage is local -to it. Tenstorrent jobs select QuietBox and reference one of four precreated -ResourceClaimTemplates. Each pod receives its own claim, not a shared claim -between jobs. Resources are released after completion or cancellation; -completed Jobs and checkpoints are retained. Requests wait when their -required CPU, RAM, hugepages, or devices are occupied. Scheduling does not -split a model or combine NVIDIA and Tenstorrent automatically. - -TT-Operator 0.3.0 runs Fabric Manager 0.2.30 and DRA driver 0.0.59 while -preserving host KMD 2.5.0 and firmware 19.4.2. Read-only host TT-Metal and -Python mounts make the runtime specific to this QuietBox. The vendor -ResourceSlice's memory capacity is incorrect; claims select board name, -chip count and board count, without using that capacity. - -The TT test trains each allocated chip independently using TT-NN forward -passes, analytic gradients and weight updates. For multiple boards, separate -runtimes select each board by PCI address through `TT_VISIBLE_DEVICES`. -Arbitrary board subsets need not form a usable connected mesh. Autograd, -distributed training of one model, and large production models are untested. - -## Verified behavior - -Live API acceptance checks passed for 17 jobs: - -- CPU success with actual output, exit-17 failure, deadline failure, and - cancellation with retained logs. -- Two simultaneous one-GPU NVIDIA jobs with distinct device nodes; a third - queued and automatically reused a GPU. A two-GPU job also trained. -- Four simultaneous one-board TT jobs with distinct claims and devices; - a fifth queued and trained after release. -- Two-board and four-board TT jobs trained on four and eight chips. -- Cancelling a four-board reservation released capacity for a waiting job. -- All successful accelerator runs met loss thresholds and reloaded their - checkpoints. Archives confirmed five NVIDIA and 24 TT checkpoint files - from those API checks after the pods completed. - -Separate infrastructure checks also verified that each TT job could open -its allocated board while device cgroups denied the other three, and that -allocation recovered after restarting the DRA driver. CLI and actual browser -checks exercise submission, status, logs and cancellation; backend/CLI/web -tests and a frontend production build cover the application changes. -See [recorded results](../../../deploy/k3s/mist-api-results.json) for evidence paths. - -## Access and retention - -The API runs in `mist-system` with a dedicated service account and a Role -restricted to workloads in `mist`. The October 8 foundation adds a read-only -inventory ClusterRole for listing nodes, pods, ResourceClaims and ResourceSlices. -Secrets, node writes, pod exec, and creating jobs in other namespaces remain -outside its permissions. The October 3 checks predate this inventory role. Workload pods -receive no Kubernetes API token. The `mist` admission policy disallows -privileged execution and broad host device mounts. - -The service account can create workload Jobs, so RBAC alone does not make -it a complete security boundary. Admission policy, shared host hugepages, -shared checkpoint PVCs, and arbitrary script execution require further -hardening before accepting untrusted tenants. The local API has no -per-request authentication; `MIST_PILOT_OWNER` is configuration. - -API and web access bind to loopback, with no public ingress. A port-forward -exposes the deployed API. Retained Jobs carry submission/owner metadata and -cancelled logs across API restarts. There is no Job TTL. Normal logs depend -on retained pods and kubelet retention, and checkpoint PVCs are node-local. -Deleting those resources can remove history or artifacts. - -## Next milestones - -The October 8 local foundation implements approved custom CPU/NVIDIA container -execution, live Jobs/Machines inventory, and persistent per-job `/outputs` -mounts. See [the current guide and developer handoff](local-job-foundation.md) -and [execution plan](foundation-execution-plan.md) for fresh checks and the -agreed next foundation task: shared datasets and result downloads, followed -by team deployment/login. The milestones below cover the wider platform. - -1. Implement authentication and per-user/team authorization before remote - access; define quotas, concurrency limits, credits and priority policy. -2. Package the TT runtime into a reproducible training image and validate - real pilot-team models, topology and distributed training requirements. -3. Provide dataset upload and artifact access, shared/object storage, durable - metadata/log archival, cleanup policy, and datastore/PVC backups. -4. Add network restrictions, workload admission hardening, and operational - monitoring before opening the cluster to untrusted users. - -## References - -- [Kubernetes Job API](https://kubernetes.io/docs/concepts/workloads/controllers/job/) -- [Dynamic Resource Allocation](https://kubernetes.io/docs/concepts/resource-management/dynamic-resource-allocation/) -- [K3s storage](https://docs.k3s.io/storage) -- [Tenstorrent operator platform support](https://docs.tenstorrent.com/tt-operator/latest/platform-support.html) -- [Tenstorrent DRA driver](https://github.com/tenstorrent/tt-dra-driver) diff --git a/docs/content/archive/local-job-foundation.md b/docs/content/archive/local-job-foundation.md deleted file mode 100644 index 12e48d7..0000000 --- a/docs/content/archive/local-job-foundation.md +++ /dev/null @@ -1,334 +0,0 @@ -> **Historical record — superseded.** This text describes an earlier phase. -> Commands and claims below are retained as history, not current setup instructions. -> Start with the [current documentation index](../_index.md) and -> [department operating guide](../department-rollout.md). - -# Local job foundation - - -**October 9 update:** Shared datasets/results, member login and private production -hosting are implemented. Earlier local pilot descriptions below record the -original phase. Use [the current operating guide](complete-foundation.md) for today's behavior. - -Implementation branch: `feat/local-job-foundation`. Recorded October 8, 2026 -(America/New_York). The preserved starting point is commit `2f9b178`. -The [execution plan](foundation-execution-plan.md) records scope and progress. - -## What runs now - -```text -Website :3001 / CLI - | - v -Mist API :3000 -- validates image, resources, and workload - | - v -k3s Job + pod -- Kubernetes schedules; containerd runs the image - / \ - v v -NVIDIA PC QuietBox -CPU / 2 GPUs 4 n300 boards / 8 chips - | | - v v -Per-job output folder on the selected node's persistent volume -``` - -Open **http://127.0.0.1:3001/jobs**. The **Machines** page shows the same real -inventory. Jobs support Python scripts, approved container images, and small -accelerator training checks. Dashboard/login and other prototype pages remain -separate work. Job execution uses Kubernetes, without SSH or a Docker daemon -inside the job. SSH is useful for administration and reaching the local website. - -The current API serves one configured owner, `utmist`. This is a trusted local -pilot. Membership, login, credits, quotas, public deployment, shared datasets, -and browser result downloads are subsequent tasks. - -## Use the website - -1. Check hardware availability at the top of **Jobs**. -2. Select **Compute**: CPU, NVIDIA, or Tenstorrent. -3. For accelerators, request whole GPUs or whole boards. A board has two chips. -4. Select **Workload** and an approved **Container image**. -5. For **Container image** workloads, optionally provide an executable and - arguments, one argument per line. Leaving them blank uses the image defaults. -6. **Resources and environment** contains CPU/RAM, deadline, working directory, - and `NAME=value` environment variables. Save files under `/outputs`. -7. Submit. The job card shows its ID, state, assigned machine, resources, - output path, and exit code. **Logs** reads actual container output. - **Cancel** stops a running or waiting job and preserves recent logs. - -An image must contain its own code and dependencies, or provide a runtime for -script mode. Requesting a GPU does not convert CPU code into accelerator code. -The form accepts an image reference; it does not upload/build Docker archives. - -### Included examples - -The current deployment approves and locally caches these two example images: - -| Image | Website settings | What it checks | -| --- | --- | --- | -| `mist-training:cpu-v1` | CPU; Container image; blank command/arguments | Packaged regression code and dataset, default entrypoint and `/app` working directory, saved/reloaded model | -| `mist-training:nvidia-v1` | NVIDIA; Container image; arguments below | CUDA training and checkpoint reload on each allocated GPU, without CPU fallback | - -For two GPUs, select **GPUs = 2** and enter these arguments, one per line: - -```text ---backend -nvidia ---devices -2 -``` - -For Tenstorrent, choose **Small training check** and one to four boards. This -uses the already tested TT image and installed host runtime. It trains a small -regression model on the chips of every reserved board. TT-NN gradients are -computed explicitly; this does not establish arbitrary PyTorch model or TT -autograd compatibility. Cross-machine/distributed training is separate work. - -## API contracts - -The [job lifecycle reference](../../../src/jobs.md) describes state and retention. -The browser uses `/api`; Vite proxies it to the API. The API itself has these -unprefixed routes: - -| Route | Response | -| --- | --- | -| `GET /hardware` | `{observed_at, machines: [...], pools: [...]}` | -| `GET /images` | `{images: [{reference, accelerators}], profiles: [...]}` | -| `POST /jobs` | HTTP 201, `{job_id, job}` | -| `GET /jobs` | `{count, jobs: [...]}` | -| `GET /jobs/` | Actual job state, resources, placement and output paths | -| `GET /jobs//logs` | `{logs}` | -| `POST /jobs//cancel` | Retained job with state `Cancelled` | -| `GET /healthz` | Jobs API connectivity and executor | - -### Submission - -```json -{ - "name": "my-training-job", - "type": "command", - "accelerator": "nvidia", - "device_count": 1, - "image": "mist-training:nvidia-v1", - "args": ["--backend", "nvidia", "--devices", "1"], - "cpu": "2", - "memory": "2Gi", - "timeout_seconds": 600, - "env": {"GREETING": "my first job"} -} -``` - -| Field | Behavior | -| --- | --- | -| `name` | Optional display name, at most 128 bytes | -| `type` | `command` (default) or `training-smoke` | -| `accelerator` | `cpu` (default), `nvidia`, `tenstorrent` | -| `device_count` | CPU: 0; NVIDIA: 1–2; TT: 1–4 boards. Accelerator default is 1 | -| `image` | Exact server-approved reference. Required when using only image defaults | -| `command` / `args` | Optional arrays, at most 64 combined entries, each at most 8192 bytes. No implicit shell parsing | -| `working_directory` | Optional absolute container path. Custom CPU/NVIDIA containers preserve image WORKDIR when omitted | -| `script` / `script_name` | Optional Python/shell script, at most 32 KiB; filename only, `.py` or `.sh`. Cannot accompany `command` | -| `env` | Up to 32 entries, values at most 4096 bytes. Managed Mist/TT variables cannot be overridden | -| `cpu` | Kubernetes quantity, greater than zero and at most 8; request equals limit | -| `memory` | 64Mi–32Gi; TT minimum 2Gi; request equals limit | -| `timeout_seconds` | 10–86400; default 600; includes queue/startup time | - -`command` replaces the image ENTRYPOINT; `args` replaces CMD. With neither, -the image's entrypoint and arguments run. Scripts and training checks use -their runtime profile and default `/tmp` working directory. TT uses `/tmp` -and its host Python/TT-NN runtime unless explicitly configured otherwise. -To use shell syntax, request it explicitly, for example -`"command": ["sh", "-c"], "args": ["python train.py && echo done"]`. - -CPU defaults: 250m/256Mi. NVIDIA defaults: 2 CPU/2Gi. TT defaults: 2 CPU/4Gi -RAM plus 2Gi of 1Gi hugepages per board. Jobs have no retries. Images are -pulled with `IfNotPresent`; approval does not guarantee availability or -hardware compatibility. Invalid requests return HTTP 400 without creating -Jobs. Kubernetes failures include a message and actual exit code when available. - -### Hardware inventory - -Each machine reports `name`, internal `address`, `ready`, `schedulable`, -`cpu_allocatable`, and `memory_allocatable`. CPU/RAM are Kubernetes allocatable -capacity, not current utilization or remaining CPU/RAM. - -Each pool reports `accelerator`, `node`, `unit`, `total`, `allocated`, -`available`, `ready`, and optional `message` / `chips_per_device`. - -- NVIDIA: count scheduled nonterminal Pod reservations across all namespaces, - including bound Pending and Terminating pods and effective init/sidecar - requests. Unplaced queued pods do not consume a device. -- Tenstorrent: use current complete ResourceSlice generations and deduplicated - ResourceClaim allocations across all namespaces. Claims reserve boards - even before a pod starts. Administrative access claims do not consume devices. -- Unavailable/cordoned/tainted nodes or missing ready device drivers are not - advertised as ready. Incomplete TT inventory has `available: null`. -- Failed discovery returns HTTP 503. The UI marks availability unknown; - it does not invent zero allocations or free hardware. -- The known incorrect TT vendor memory capacity is ignored. - -The snapshot is assembled from separate Kubernetes reads and can change before -submission. Kubernetes remains the allocation authority. Active TT `devices` -details can disappear from a completed job once its claim is released; the -request count and saved `allocation.json` remain useful records. - -## Output persistence - -An init container creates a job-specific directory before the workload starts. -The workload mounts only this directory at two aliases: - -```text -Persistent volume / / - ├── model/checkpoint files - └── results.json - -Inside the workload: - /outputs MIST_OUTPUT_DIR - /checkpoints/ MIST_CHECKPOINT_DIR - MIST_JOB_ID -``` - -Both mount paths refer to the same files. `output_directory` is `/outputs` for -new jobs; old retained jobs keep their original `checkpoint_directory` contract. -The per-job directory is writable by the supported root/nonroot images. Its -permissions and shared backing PVC are not an authenticated tenant boundary. -Writes elsewhere in the container are not saved results. - -| Compute | PVC in `mist` | Physical node | -| --- | --- | --- | -| CPU | `mist-cpu-checkpoints` | `utmist-z1opa08` | -| NVIDIA | `training-nvidia-checkpoints` | `utmist-z1opa08` | -| Tenstorrent | `training-tenstorrent-checkpoints` | `utmist-tt` | - -Find the host directory using the administrative kubeconfig: - -```bash -k3s kubectl -n mist get pvc -k3s kubectl get pv -``` - -Read the selected PV's `spec.hostPath.path` and node affinity. On that node, -the files are under `//`. A read-only helper Pod -can also mount the corresponding PVC on its node. The verification tool below -does this after training has exited, records SHA256 hashes/results, and deletes -its temporary helper Pods. There is no browser file download endpoint yet. - -The local-path PVCs request 256Mi each; local-path does not enforce that as a -disk quota. Jobs/results are retained without TTL or automatic cleanup. -Normal logs are up to 64KiB and depend on pod/kubelet retention. Cancellation -stores up to 32KiB in Job annotations. API restarts preserve Kubernetes history. -Node/disk loss can lose outputs; shared storage and backups follow separately. - -## Development and deployment - -See the [deployment guide](k3s-deployment-history.md#mist-api-cli-and-jobs-page) -for image build/import and startup. Existing services on this machine are: - -```bash -systemctl --user status mist-api-forward mist-web -systemctl --user restart mist-api-forward mist-web -``` - -From a laptop with SSH access to the NVIDIA server, tunnel the local website: - -```bash -ssh -L 3001:127.0.0.1:3001 utmist@100.73.139.66 -``` - -Open `http://127.0.0.1:3001/jobs` on that laptop while the SSH connection is -open. A different laptop port, such as `-L 3002:127.0.0.1:3001`, avoids a local -port conflict. This does not require public ingress. - -The API runs in `mist-system` with namespaced workload permissions and a -read-only inventory ClusterRole: list nodes, pods, ResourceClaims and -ResourceSlices. It cannot read Secrets, exec into pods, update nodes, or create -workloads in other namespaces. The browser contains no Kubernetes credentials. - -Custom registry images require an administrator to update `MIST_ALLOWED_IMAGES` -with exact references, rebuild/reconfigure the API deployment as needed, and -verify image/code compatibility. Prefer immutable tags or digests. For a private -registry, create its image-pull Secret in workload namespace `mist`; set the -API's `MIST_IMAGE_PULL_SECRETS` to its name (or comma-separated names). -The API references the Secrets without reading their contents. Keep credentials -out of the job form, environment variables, and Git. K3s registry configuration -is a separate option for mirrors/private endpoints. - -### Code map - -| Area | Files | -| --- | --- | -| Request model and routing | `src/api.go`, `src/kubernetes.go` | -| Validation, Job construction, cancellation | `src/kubernetes.go` | -| Live inventory | `src/hardware.go` | -| Approved image/profile catalog | `src/images.go` | -| Output directory initialization | `src/outputs.go` | -| Batched job history reads | `src/job_states.go` | -| API types and client | `web-interface/src/api.ts` | -| Polling/recovery | `web-interface/src/hooks/usePolling.ts` | -| Jobs orchestration and form/cards/logs | `web-interface/src/components/JobsPage.tsx`, `components/jobs/*` | -| Shared inventory and Machines page | `components/HardwarePanel.tsx`, `components/MachinesPage.tsx` | -| Cluster deployment/RBAC | `deploy/k3s/mist-api.yaml` | -| Packaged examples | `deploy/k3s/examples/*` | - -### Verification - -```bash -go -C src test -run 'Test(Kubernetes|Hardware|GPURequest|CustomImage|TenstorrentCustom)' ./... -go -C cli test ./... -cd web-interface -npm test -npx tsc --noEmit -npm run build -``` - -The full legacy backend suite additionally requires its Docker images and -Redis. It is separate from the Kubernetes path. - -Fresh live checks require both accelerators initially free, the approved -example images imported, Playwright/Chromium installed, and admin kubectl access: - -```bash -export KUBECONFIG=/home/utmist/.kube/config -export MIST_PLAYWRIGHT_MODULE=/tmp/mist-browser-check/node_modules/playwright/index.mjs -node deploy/k3s/verify_foundation_browser.mjs /home/utmist/mist-foundation-results-new-run -python3 deploy/k3s/verify_foundation.py --artifacts /home/utmist/mist-foundation-results-new-run -``` - -Use one artifact directory for both commands and run them sequentially. -The browser check covers packaged CPU training, both NVIDIA GPUs, two TT -boards/four chips, real card states/logs, failure, and cancellation. The API -check covers occupied/free counts, queuing and reuse after cancellation for -both device types, command/argument semantics, and persistent files read from -new containers on both nodes. These tools submit real jobs and retain results. -Their final markers are `FOUNDATION_BROWSER_PASSED` and -`FOUNDATION_ALLOCATION_OUTPUTS_PASSED`. - -Today's detailed evidence is saved under -`/home/utmist/mist-foundation-results-2026-10-08`. The checked-in -[verification summary](../../../deploy/k3s/foundation-results.json) records actual -job IDs, the deployed image ID, and completed checks. Browser and allocation/ -persistence checks passed on October 8 EDT (October 9 UTC). A separate live -check verified image-pull error reporting, deadline failure, and retained -history across API restarts. The normal image approval list was restored. - -Automated checks passed: 12 focused backend tests, the full src suite with its -local dependencies, CLI tests, 5 frontend interaction tests, type checking, -production build, and lint of changed frontend files. These are small model -execution checks, not a claim about every team model or distributed training. -See the execution plan's progress log and the developer handoff below. - -## Developer handoff: next work - -1. **Shared datasets and downloads (task 4):** storage on QuietBox, private - NFS/shared mount on both nodes, upload limits/progress, stable dataset IDs, - read-only inputs, job output listing/downloads, retention and backup rules. - Preserve the `/outputs` contract and migrate the checkpoint alias explicitly. -2. **Team deployment/login (task 5):** production web hosting with `/api` - routing, authenticated membership, job/file ownership, then team limits. -3. **Model/platform work:** portable TT image, real team models, scheduling - fairness/credits/priority, monitoring, Jupyter and chaining as separate work. - -Current Wi-Fi/LAN can support initial shared-storage tests. A second Ethernet -cable can improve throughput later. Do not remove QuietBox's existing router -link or format the NVIDIA machine's unmounted disk as part of this work. diff --git a/docs/content/archive/shared-storage-deployment-plan.md b/docs/content/archive/shared-storage-deployment-plan.md deleted file mode 100644 index 385621c..0000000 --- a/docs/content/archive/shared-storage-deployment-plan.md +++ /dev/null @@ -1,251 +0,0 @@ -> **Historical record — superseded.** This text describes an earlier phase. -> Commands and claims below are retained as history, not current setup instructions. -> Start with the [current documentation index](../_index.md) and -> [department operating guide](../department-rollout.md). - -# Complete foundation: parts 4 and 5 - -Authorized October 8, 2026 after completion of parts 1–3. Continue on -`feat/local-job-foundation` from `8f1b7f1`. The user requests finishing the -remaining foundation instead of handing it to other developers. No permission -prompts are needed for this work. Preserve existing jobs, checkpoints, network -links and unrelated disk contents. - -## Remaining scope - -### Part 4: shared datasets and result downloads - -- [x] Create `/srv/mist-storage` on QuietBox's existing NVMe filesystem. -- [x] Provide NFSv4 shared storage to the two current Kubernetes nodes, over - their existing LAN. Keep QuietBox's router Ethernet cable connected. -- [x] Install the NFS host client/server packages and persistent configuration. -- [x] Add shared persistent volumes and mount storage in the API. -- [x] Upload datasets through the API and website with size limits/progress, - stable dataset IDs, checksums, ready/error handling, and atomic publication. -- [x] Select a dataset for a job; attach only that dataset read-only at `/inputs`. -- [x] Store new job outputs on shared storage; preserve the `/outputs` and - checkpoint aliases. Keep old local checkpoints retrievable. -- [x] List and download saved job files with ownership checks, streaming, and - protection against traversal and escaping symlinks. Do not execute archives. -- [x] Verify an uploaded dataset is consumed by jobs on both physical machines, - with actual accelerator computation and persistent downloadable results. - -Use a bounded pilot budget (initially 100GiB for new datasets/outputs), an -upload limit (initially 2GiB per dataset), and explicit cleanup/retention docs. -NFS is central storage, not a backup. Preserve the existing checkpoint PVCs. -Metadata must not be writable by workload containers through output mounts. - -### Part 5: login and private deployment - -- [x] Use maintained Better Auth for separate Mist member accounts. Keep the - existing Go executor and add a small auth service with persistent SQLite on - a node-local volume, not SQLite on NFS. -- [x] Seed the first administrator from protected local credentials, outside - Git/tool output. Disable public signup; administrators add members. -- [x] Authenticate API access, derive job/dataset ownership from the session, - and verify isolation with two actual member sessions. -- [x] Add login/logout, current account, password change and member management - UI. Remove prototype profile/account behavior from the active workflow. -- [x] Serve the production frontend with same-origin API/auth proxying and - persistent services; avoid relying on Vite for the deployed website. -- [x] Make the site accessible through the existing private Tailscale network. - Use HTTPS through Tailscale Serve if already available; otherwise keep a - private Tailnet endpoint and record the HTTPS prerequisite accurately. -- [x] Add startup, restoration, membership, image approval, storage quota, - backup and cleanup documentation and repeatable deployment scripts. -- [x] Verify browser login → upload → select dataset/image/device → run → logs - → download, from both machines, plus denial of anonymous/other-owner access. -- [x] Commit tested changes and record exact deployed image/evidence paths. - -## Decisions - -- Keep image-reference submission and current NVIDIA/TT allocation units. - Arbitrary TT models, distributed training, credits, Jupyter, chaining and - image build/archive upload services are outside the five-part foundation. -- Deploy privately; no public domain, Funnel, paid service or external account - provisioning is implied. Use existing host and cluster access. -- A shared tailnet infrastructure account does not identify individual team - members; Mist accounts provide independent ownership. -- Existing owner `utmist` and retained jobs remain visible to the initial - administrator through an explicit migration mapping. -- HTTP cookies alone are not authorization. Go verifies sessions against the - auth service, and state-changing routes require trusted browser origins. -- Test first, then replace the deployed API/frontend with the verified build. - -## Resume information - -- Go/Node runtimes: `~/.local/share/mist-runtimes/go-1.25.1/bin/go` and - `~/.local/share/mist-runtimes/node-22.16.0/bin/node`. -- Kubeconfig: `/home/utmist/.kube/config`; k3s nodes `utmist-z1opa08`, `utmist-tt`. -- QuietBox SSH: `utmist-tt@100.95.175.37`, identity - `/home/utmist/.ssh/id_ed25519_quietbox_codex`, IdentitiesOnly/BatchMode. -- Authorized host operations can use Docker bind/chroot. Package installation - needs host networking because host systemd-resolved listens on loopback. -- Current API deployed in `mist-system`; workloads in `mist`. -- Main tailnet hostname: `utmist.tail459b5e.ts.net`; IP `100.73.139.66`. -- Baseline evidence: `deploy/k3s/foundation-results.json`, - `/home/utmist/mist-foundation-results-2026-10-08`. - -## Progress - -- Plan recorded; repository clean at start. QuietBox SSH and authorized Docker - host access work. QuietBox still has approximately 1.9TiB available. -- Tailscale is connected; no Serve configuration exists. Existing Nginx is - active. Preserve its current default service while adding the Mist endpoint. - -## Completed verification (October 9 UTC) - -- Actual production browser flow passed: login, dataset upload, CPU and both NVIDIA - GPUs, one TT board/two chips, logs, saved file download, account/member actions, - ownership isolation and deactivation. No browser runtime errors. -- QuietBox submitted an authenticated NVIDIA training job, which ran on the main - node and returned downloadable loss metrics. -- Focused Go tests (including race checks), CLI tests/login/logout, frontend - interaction tests, TypeScript and production build passed. -- Old checkpoint PVCs preserved; legacy outputs copied to shared storage. -- NFS/client firewall configuration and production restart/backup checks are - documented in `docs/complete-foundation.md` and `deploy/private/README.md`. -- Private HTTP website is live. Tailscale Serve is disabled; HTTPS requires the - tailnet administrator to enable Serve, accurately recorded as a prerequisite. - -Final review: frontend dependencies now use the checked-in npm lockfile; the -obsolete Bun lockfile was removed. CLI login/logout use real sessions, and -`job submit --dataset` attaches an owned dataset. SQLite backup integrity was -`ok`; restart checks preserved historical/new jobs, datasets and downloadable -results. The production website does not depend on a terminal session. - -## Department rollout scope decision — October 9, 2026 - -The user plans to introduce Mist to several research teams next week and has -explicitly excluded these additions from that rollout: - -- Automatic backups and additional recovery testing. -- HTTPS/Tailscale Serve enablement. -- Monitoring and storage cleanup features. - -The remaining proposed priorities are team membership/permissions and workload -isolation, team resource quotas, fair queuing, representative research workload -and capacity tests, and a documented self-service container-image workflow. -These are proposed follow-up work, not completed foundation features. - -The current access model remains private HTTP over the existing Tailscale -network. Existing manual operating procedures are documented in the foundation -guide. Credits, special job priorities, Jupyter, chaining, and browser image -upload/build services remain outside the immediate rollout scope. - -### Team self-service clarification - -The user clarified that administrators assign each team's conditions and limits; -teams normally do not request administrator permission for individual actions. -The intended rollout model is: - -- Administrators configure membership, permissions and team resource policies. -- Team members upload datasets, submit compatible container images/references, - run jobs and retrieve results independently within their assigned policies. -- The platform validates those policies and admits/queues requests automatically; - ordinary submissions do not require a human approval step. -- Replace the proposed per-image administrator approval process with a documented - self-service image policy. Define allowed image sources and runtime compatibility - as platform/team rules rather than approving each new image manually. - -Current foundation behavior remains distinct: individual owned jobs are already -self-service, but image eligibility uses a global exact-reference allowlist and -Tenstorrent uses the fixed tested runtime profile. Team policies and self-service -custom image eligibility are follow-up implementation work. - -### Team membership and storage requirements - -The user requires multiple teammates per team, explicitly enrolled as members. -Each team needs one team storage area containing a common folder and a folder -for each member. The user clarified that member folders are visible within the -team; they are not private from teammates: - -- Authorized team members can browse/read the team's common folder and the - individual member folders within that team. -- Member folders organize each teammate's files; they do not create a separate - privacy boundary within the team. Write/delete permissions need an explicit - policy and are not implied by permission to view files. -- Members of another team cannot discover, list, read, download, modify or use - the team's files through jobs unless explicitly granted access. -- Explicit cross-team grants must specify their recipients, storage scope and - permitted actions; grants must be revocable and checked on subsequent access. -- All dataset/file access and job input/output attachment must verify the - authenticated member, team membership or explicit grant, and selected scope. -- Workloads mount only their authorized selected input and output locations. - File and network access from running containers must enforce the same boundary; - a UI filter or a differently named folder is insufficient isolation. -- Administrators assign memberships and team conditions. Normal uploads and - submissions within those conditions remain self-service. - -These are new team features. The completed foundation currently provides -per-account ownership checks, rather than this team-sharing/membership model. - -Example intended organization: - -```text -storage/ - team-a/ # visible to Team A members - common/ - alice/ - bob/ - team-b/ # visible to Team B members - common/ - carol/ - dan/ -``` - -Folder names illustrate the organization; enforced authorization determines -access. Cross-team sharing exposes only the explicitly granted scope. - -### Portal login and administrator workspace - -The same portal and login page serve administrators and regular members. -Authenticated roles determine which controls appear and which API actions are -authorized; there is no separate administrator account required for ordinary -research work. - -- Regular members use their team workspace to upload files, submit jobs, view - logs and retrieve results within the team's policies. -- Administrators have the same research workflow plus administration controls - for teams, memberships, resource limits, image policies and access grants. -- An administrator can also be a team member. Ordinary uploads and jobs use the - selected team's membership, storage permissions and resource policies. -- Administrative actions must be explicitly authorized on the server; hiding - controls in the UI alone is insufficient. Administrative authority is distinct - from membership and does not implicitly make the account a member of every - team or bypass limits on its own research jobs. - -The foundation already supports login, basic member administration and ordinary -administrator jobs. The team workspace and additional team administration -controls described here remain follow-up work. - -### Rollout review: implementation details still to define - -The main workflow is covered by the proposed rollout scope. These details belong -within that work; they are not completed features or authorization to implement -every proposed default: - -- File permissions: distinguish team-wide read access from write/delete access. - Proposed default is members managing their own folders, with explicitly - assigned write permissions for the common folder and cross-team grants. -- Membership and grant revocation: deny subsequent access immediately and define - how to handle queued/running jobs that already hold access. Revoking a browser - permission does not remove a file mount from an existing running job. -- Storage quota enforcement: count datasets and generated results, including - writes from running containers. Upload-only checks do not enforce a team cap. -- Failure handling: expose useful reasons for image pull failure, full storage, - unavailable devices and offline nodes; define cancellation, runtime limits and - retry behavior so jobs release resources and do not silently duplicate work. -- Rollout capacity and migration: verify representative dataset/model sizes and - GPU/TT runtime compatibility, and preserve existing account-owned files/jobs - when introducing team ownership. Current pilot limits are 2GiB per upload and - 100GiB total new shared storage. -- Private container registries: decide whether launch supports private images; - if supported, credentials must be team-scoped and unavailable to other teams - and their workloads. Public image references do not need registry credentials. - -Account administration should also define an administrator-assisted password -reset path; self-service email recovery and external email provisioning are not -implied. Automatic backups, HTTPS, monitoring and cleanup remain excluded as -requested. Multi-machine distributed training is outside the existing foundation -and should not be represented as tested by the two separate accelerator smokes. diff --git a/docs/content/complete-foundation.md b/docs/content/complete-foundation.md deleted file mode 100644 index f8009cf..0000000 --- a/docs/content/complete-foundation.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Complete Foundation (Historical)" -weight: 301 ---- - -# Historical guide - -This phase has been superseded by the department platform on main. - -- [Current documentation](_index.md) -- [Current operating guide](department-rollout.md) -- [Archived original record](archive/complete-foundation.md) diff --git a/docs/content/department-rollout-execution.md b/docs/content/department-rollout-execution.md deleted file mode 100644 index acfec62..0000000 --- a/docs/content/department-rollout-execution.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: "Rollout Execution Record" -weight: 100 ---- - -# Department rollout execution - -Authorized October 9, 2026: implement all seven agreed remaining parts on -`feat/local-job-foundation`, preserve existing accounts/jobs/files and verify the -deployed flow on both machines. No permission prompts or cloud deployment. - -## Architecture and defaults - -- Keep Better Auth as the identity/password authority. Team membership and - policies are persisted in Kubernetes ConfigMaps with optimistic concurrency. - Administrators use the same account for admin and ordinary team work. -- Each team has a namespace and separate bounded dataset/model NFS filesystems and PVCs. Inputs mount - read-only; outputs mount only a job's own directory. Team storage is organized - as common and member datasets/results. Teammates can read all team folders. -- Members manage their own uploads/results. Common-folder writers are explicitly - assigned. Only administrators set cross-team grants (read/use, scoped to a - common or member folder). Cross-team write grants are outside the initial - implementation; no write authority is inferred from read authority. -- Dedicated ext4 filesystem images enforce team capacity on uploads and workload - writes. A small QuietBox host service handles trusted provisioning requests, - mounts, online expansion and NFS exports. It never formats physical disks or - deletes team data. Provisioning requests live outside workload mounts. -- Combined team allocation budget is 1,500 GiB within the 1,600 GiB sparse - store. New team defaults are 200 GiB datasets + 500 GiB models/results. Reject allocation - above the budget. Storage expansion is supported; shrinking is rejected. -- Default team workload policy denies inbound connections and private-network - outbound access, including direct NFS/API access. Permit DNS and public HTTPS. - Extend workload admission restrictions to the managed team namespaces. -- A single API/controller replica persists submissions as suspended Kubernetes - Jobs. Round-robin admission across teams reserves resources for admitted jobs; - enforce per-team CPU/memory/GPU/board/concurrency/runtime and queue limits. - Queue state survives restarts. Retry is explicit; do not duplicate training. -- Custom image references are self-service within team registry rules. Preserve - tested default profiles and validate explicit TT container-vs-host runtime - selection. Private registry credentials are not part of initial rollout. -- Revocation denies new requests immediately and suspends affected queued/running - jobs, removing their pods/mounts. Completed output data is retained. -- Legacy per-account work remains available through a clearly selected legacy - workspace; team work requires explicit membership, including administrators. -- Keep the site private through Tailscale machine sharing. Restrict ordinary - shared-user network access to the portal while preserving infrastructure and - known administrator SSH access. No cloud account, Serve or Funnel setup. - -## Execution checklist - -- [x] Team APIs, membership/admin controls and team workspace selector. -- [x] Team common/member storage, file browsing/download and cross-team grants. -- [x] Filesystem capacity enforcement, namespace and container/network isolation. -- [x] Resource policies and durable fair job admission/controller. -- [x] Self-service image policy, compatible runtime selection and guidance. -- [x] Account reset UI, clear job errors/cancellation, legacy preservation. -- [x] Deploy, verify full browser/API flows, accelerator training, real quota - exhaustion, denial inside containers, revocation and queue restart tests. -- [x] Document operating limits, deployment/restart and evidence; commit results. - -Automatic backups, HTTPS, monitoring/cleanup products, credits, Jupyter, chaining, -browser image archives/builds and distributed multi-machine training are excluded. -Capacity checks and queued-job reconciliation implement the agreed limits and job -behavior; they do not add a separate monitoring service. - -## Verified results - -Recorded October 9 on the private production portal. Reports and selected logs -are checked in under -[department evidence](../../deploy/k3s/evidence/department-2026-10-09/README.md). - -- 14 API/cluster/storage checks: membership, write denial, scoped read-only grants, - running-job revocation, FIFO/fair turns, API restart, cancellation, limits, - real container network/credential denial, real job-write ENOSPC, accelerator - training, account deactivation, browser expansion, filesystem growth and - preservation of all 47 legacy jobs. -- 11 browser checks: admin/member flow, account/team operations, upload/download, - custom public image submission, logs/results, admin denial, password reset, - deadline defaults, actual pagination and desktop/mobile layout without JS errors. -- Simultaneous TT training used distinct boards (`tt-0`, `tt-1`), one board/two - chips per job. NVIDIA training used both GPUs; an SSH CLI submission from TT - also ran successfully on main's NVIDIA GPU. -- Admission rejected host network/PID, Kubernetes tokens, privileged containers, - arbitrary host paths and added capabilities. Host firewall allowed the portal - and denied synthetic untrusted-source SSH/Kubernetes/NodePort/backend sockets. -- Failure exit code and execution deadline were observed without automatic retries. -- Focused Go suites, CLI suite, nine React tests, TypeScript and changed-file ESLint - passed. Web/auth npm audits reported zero vulnerabilities at verification time. - -At that initial phase, the full historical Go integration suite had not run -against its legacy Redis/Docker fixtures. The final release run below completed -those suites successfully. The deployed Kubernetes execution -path does not use Redis. Accelerator tests are regression training, not proof of -arbitrary-model portability. External researcher laptop/cloud ACL verification, -HA, hard per-member storage quotas and deliberately excluded features are not -claimed. - -Research pilot remains active with the administrator and sample files/results. -Verification-only accounts are deactivated and verification-only teams disabled; -files/history are retained. Documentation describes current setup, operational -limits and redeployment. Changes were implemented on `feat/local-job-foundation`. See the publication -record below for the subsequent archive and pull request. - -## Latest UI and dataset refinement - -- Focused native dialogs for job submission, dataset upload, team creation and - settings, member creation and password reset; desktop and mobile layouts checked. -- Shared searchable Picker, with keyboard selection, empty results, focus return - and menus that open above near the bottom of the viewport. Shared Tabs support - arrow keys and Home/End. Device/allocation sliders retain exact number entry. -- Compact team cards, paginated searchable member/history rows, status filters, - collapsible hardware/file details and a storage usage bar. Compute cards and - the warm neutral/olive theme are retained. Script editing comes before optional - data/output settings; technical dataset metadata stays behind a disclosure. -- Uploads stream with a configurable 64 GiB ceiling bounded by actual team free - capacity. Real **2 GiB + 4 MiB** upload, SHA256, Job input read and removal of - only the verifier's probe passed. Four-hour requests and explicit cancellation - are supported; resumable upload is outside this implementation. -- Latest checks: all 11 browser checks, nine React tests, TypeScript, targeted - ESLint, focused Go/CLI suites, Python parsing and shell syntax passed. - -That refinement was completed on `feat/local-job-foundation`. Publication is -recorded below. - -## Follow-up: separate large dataset/model pools (requested October 9) - -Confirmed defaults: **200 GiB datasets + 500 GiB models/results per team**, -admin configurable. This changes the earlier 64 GiB ceiling and shared quota. -The recorded baseline above passed before this follow-up. Follow-up checks use -small files; large transfers/exhaustion are excluded at the user’s request. - -- [x] Expand the known image sparsely; release unused bulk physical preallocation. -- [x] Separate bounded dataset/model filesystems and migrate existing outputs. -- [x] Extend policy/admin controls and expose actual free space for both pools. -- [x] Enforce upload capacity against datasets and job writes against models. -- [x] Verify migration, bounds/denials, small uploads and accelerator jobs. - Large upload/exhaustion tests are excluded at the user’s request. -- [x] Update current documentation and commit the completed follow-up. - -Follow-up evidence: seven small-file live checks, six migration tests, eleven -browser checks, nine React tests, focused Go suites, CLI tests, TypeScript, ESLint -and syntax checks. Verified NFS mount identity, separate exports, member-parent -permissions and preserved checkpoints. QuietBox’s unused bulk reservation and -blocks belonging to the deleted large probe were reclaimed; existing research -files outside Mist remain untouched. See current [rollout](department-rollout.md) -for sparse storage capacity and the two-pool API compatibility rules. - -## Release verification and publication (October 9) - -- Full Go backend: **33 tests passed, zero skips**, including legacy integration - tests against a dedicated Redis container with no published ports. Preview - Redis data was preserved. -- Nested Docker module: **10 tests passed, zero skips**, including concurrent - container/volume and limit fixtures. Test containers and volumes were removed. -- Full CLI/logger suites, **10 React tests**, TypeScript, full frontend ESLint - and production build passed. All **11 live browser checks** passed again with - no browser errors. Both cluster nodes and API/auth deployments are Ready. -- Visible regular-member **Container** submission trained a real CUDA network - using a custom image's own CMD. The walkthrough found and fixed clearing the - image field, with a regression test. Image was preloaded, not registry-pushed. -- Large upload and exhaustion tests were not repeated at the user's request; - no 200/500 GiB stress, every-edge-case or arbitrary-model claim is made. - -Current documentation covers user/admin operations, image submission, storage, -deployment, limits, design and verification. The historical `main` tip -`1050b022e36399f4b3b1dba1a3b3d670fcfca539` is preserved on the remote branch -[`archive/main-before-k3s-20261009`](https://github.com/UTMIST/Mist/tree/archive/main-before-k3s-20261009). -The department implementation is prepared for main in -[PR #110](https://github.com/UTMIST/Mist/pull/110), using a squash merge. -The initial merge attempt required an independent review. PR #110 was then -merged on October 9 at 08:06:48 UTC as commit -`3431ffdb713fac72881fc7f61f2750a82fe3f916`; main now contains the verified release. -The account used by this agent has maintain/push access, and the repository still -requires an independent reviewer for subsequent pull requests. The live -private portal already runs the verified implementation. Git publication does -not reset accounts, jobs or files, or switch the live services again. - -See [the final release record](../../deploy/k3s/evidence/department-2026-10-09/release-validation.json) -and [testing instructions](testing.md). diff --git a/docs/content/department-rollout.md b/docs/content/department-rollout.md deleted file mode 100644 index 7d13333..0000000 --- a/docs/content/department-rollout.md +++ /dev/null @@ -1,390 +0,0 @@ ---- -title: "Department Operating Guide" -weight: 10 ---- - -# Mist department rollout - -Merged into **main** through [PR #110](https://github.com/UTMIST/Mist/pull/110) on -October 9, 2026. This is the current operating guide. Original accounts, jobs, -datasets and checkpoint PVCs are preserved; earlier instructions are in the -[historical archive](archive/_index.md). - -## Use the portal - -Open **http://100.73.139.66:8088** after connecting to the existing Tailscale network -or accepting a share of the main machine. A Mist account is also required; a -Tailscale share does not grant a Mist role or team membership. - -1. Sign in. Choose your team in the sidebar **Workspace** selector. -2. Open **Datasets → Add dataset**, choose **My folder** or an authorized common - folder, and upload a file or ZIP. New team storage is prepared asynchronously; the portal shows a waiting - state and enables upload when ready. Wait for the dataset ready message. -3. Open **Jobs → New job**. Select hardware and an image tag/digest, attach a dataset if - needed, and submit your Python script or container entrypoint/arguments. -4. Jobs appear as compact history rows, paginated with 10/25/50 rows per page. - Search across jobs/people/IDs or filter status. Click a row to expand resource details, - **Logs**, **Files**, and cancellation when authorized. -5. Save results under `/outputs`. They remain after exit and can be downloaded - from the job or browsed through **Datasets → Team folders**. - -**Research pilot** is an initial workspace containing the administrator and -verified sample training results. **Legacy files and jobs** shows preserved -account-owned resources. New uploads/submissions require a team; this prevents -using the legacy workspace to bypass quotas. - -The administrator signs in through the same screen and can also perform normal -research work. Initial credentials remain in the protected bootstrap file at -`/home/utmist/.config/mist/admin-bootstrap.json`. That file does not track later -password changes. Never share or commit its auth secret. - -## Administration - -On **Account → Members**, use **New member** to create accounts. Search the -compact list to open their password reset -dialog. **My account** contains your own password settings. A reset revokes existing sessions. There is no email delivery -service; hand the temporary password to its owner privately. Members can change -their own password. Public signup remains disabled. - -On **Teams**: - -- Use **New team** to create a team and choose its initial storage allocation. The portal enrolls - the creating administrator as a common-folder writer. -- Open **Manage → Teammates** to add existing accounts. Members may belong to several teams. Update - **Can write common folder** independently of membership. -- Open **Manage → Limits** to set team CPU, RAM, NVIDIA GPUs, TT boards, concurrency, queued-job capacity, - maximum runtime, storage and allowed registry hosts. -- Open **Manage → Sharing** to share a **common** or **member** folder with a specific other team. Grants are - read/download/use permissions. They never permit writing or deleting the - source team's data. -- Remove membership, revoke a grant or disable a team. Subsequent requests lose - access immediately. Affected queued/running jobs are suspended and their pods - are removed; saved data remains. The controller checks team memberships and - current admin roles every reconciliation. - -Administrators can manage team settings but must explicitly belong to a team to -use its workspace. Admin status does not silently grant access to all files. -Removing a member keeps their stored data available to the remaining team. - -## Permissions - -| Operation | Ordinary teammate | Common writer | Administrator enrolled in team | -|---|---|---|---| -| Read common/member folders and team jobs | Yes | Yes | Yes | -| Upload/delete own datasets; save own job results | Yes | Yes | Yes | -| Upload/delete common datasets; save common results | No | Yes | Yes | -| Cancel a teammate's job | No | No | Yes | -| Manage membership, limits or cross-team grants | No | No | Yes | -| Read another team's storage without a grant/membership | No | No | No | - -Dataset deletion is blocked while a queued, running or terminating job references -it, including a job in a recipient team. Finished outputs have no automatic -retention/cleanup policy. Inputs are read-only for all jobs. - -## Running architecture - -```text -Researcher browser / authenticated CLI on either machine - | - private Tailscale portal :8088 - | - Nginx on NVIDIA machine - /api/* /auth/* - | - Go API + single controller - | | - Better Auth Kubernetes - local SQLite PVC team policy ConfigMaps - suspended Jobs - | - fair admission + scheduler - / \ - CPU / NVIDIA node QuietBox TT node - 1–2 whole GPUs 1–4 n300 boards - \ / - scoped NFS mounts over LAN - read-only /inputs; own /outputs - | - QuietBox bounded team filesystems -``` - -Production runs without Vite or an SSH session. Nginx, k3s/k3s-agent, Tailscale, -NFS and the team volume service start through systemd. API/auth run in -`mist-system`; workloads run in `mist-team-`. Auth remains a single SQLite -instance on the main machine's local volume. - -## Storage and enforced capacity - -QuietBox's known ext4 backing image now has **1,600 GiB logical capacity**. -It is sparse: unused capacity does not reserve that amount of physical disk space. -The initial bulk reservation was released with filesystem discard (`fstrim`), -without shrinking the filesystem or deleting existing data. At the October 9 -check, QuietBox had about **1.9 TiB free** on its host disk; the backing file used -about 6 GiB after reclaiming the deleted test dataset’s blocks. Actual shared -data was about 1.4 GiB; filesystem metadata also uses space. - -The combined allocation budget is **1,500 GiB**, additionally bounded by the -base filesystem capacity less 20 GiB. New teams default to **200 GiB datasets + -500 GiB models/results**. API field `storage_gib` means datasets; the new -`model_storage_gib` means models/results. Legacy create requests specifying only -`storage_gib` apply that size to both pools for compatibility. Two teams at these defaults fit; more teams need smaller -admin allocations or additional capacity. Disabled teams retain files and their -allocations. Existing pilot teams retain their previous sizes in each pool; -they are not silently expanded to the new defaults. - -Each team has two independently bounded ext4 filesystems. Common and member -folders share the applicable team pool; member folders do not have separate hard -quotas. Filesystem overhead reduces usable capacity below the nominal allocation. -No physical disk was formatted. - -```text -/srv/mist-storage/ - metadata/provision-requests/ API-owned requests, outside job mounts - metadata/provision-status/ readiness records for both pools - .team-volumes/team-.img dataset filesystem image - .team-volumes/team--models.img model filesystem image - teams/team-/ dataset filesystem - metadata/datasets/ API-owned published metadata - .uploads/ API-owned upload staging - common/datasets//content/ - members//datasets//content/ - .models/ separate model filesystem - common/jobs//outputs/ - members//jobs//outputs/ - datasets/, jobs/, legacy/ preserved foundation files -``` - -`mist-team-storage.service` validates trusted requests, creates images, mounts them, -records fstab entries and exports each filesystem separately over NFS. Existing -unknown filesystems are never formatted. Online growth is supported; shrinking -and deletion are refused. The API verifies both capacities and distinct mount -device identities, including when NFS reports a zero filesystem ID. A missing -model mount cannot borrow the dataset allocation. - -Existing team job outputs are copied into the model pool, preserving hashes, -permissions, ownership and symlinks without following them. Originals are removed -only after the complete published copy is verified. Conflicts fail closed; -interrupted copies can be retried. Perform migration with submissions paused and -no active team jobs. Dataset paths, job IDs and virtual folder URLs stay stable. -Inputs use read-only `team-storage`; outputs use `team-models` and only the -specific job directory. Actual ext4 capacity enforces writes; PV/PVC numbers are -allocation declarations. Existing bound static NFS claims are preserved during -growth rather than attempting unsupported PVC resizing. - -Upload admission uses actual remaining **dataset** capacity, with a 64 MiB -metadata reserve. There is no fixed 64 GiB upload cap. Administrators can set an -optional smaller `MIST_MAX_DATASET_GIB` ceiling (1–1,048,576); that ceiling does not -create disk space. The portal shows used/free space separately for datasets and -models/results. ZIP extraction needs space for the archive and expanded files; -it rejects traversal, symlinks and special files, with at most 10,000 entries. - -Nginx streams uploads without body buffering; the authenticated API enforces -storage bounds. Browser/API transfer windows are 24 hours. Uploads support -progress and cancellation; interrupted transfers restart. Resumable upload is -not implemented. Earlier baseline verification transferred and removed a -2 GiB + 4 MiB probe. Follow-up verification uses small files, as requested; -no 200/500 GiB upload or exhaustion test is performed. - -Jobs can exhaust their model filesystem and must handle `ENOSPC`/`EDQUOT`. -Dataset capacity remains separate, as do other teams' filesystems. The host still -needs free space for both sparse image growth and software outside Mist. Logical -quotas are not physical space reservations or a backup. - -NFS permits only the two node LAN addresses and uses root squash. The machines' -existing router/Wi-Fi/Ethernet connections remain intact. QuietBox must be online -for shared storage; NFS is not a backup. - -## Admission and resource rules - -| Limit | Default per team | Supported setting | -|---|---|---| -| CPU / memory | 8 cores / 32 GiB | Up to 32 cores / 128 GiB across jobs | -| NVIDIA GPUs | 2 | 0–2 whole GPUs | -| TT boards | 4 | 0–4 boards, two chips each | -| Simultaneous / queued jobs | 2 / 50 | 1–16 / 1–200 | -| Dataset storage | 200 GiB | At least 1 GiB; combined dataset/model allocations at most 1,500 GiB | -| Model/result storage | 500 GiB | At least 1 GiB; independently bounded from datasets | -| Maximum runtime | 24 hours | 10 seconds–24 hours | - -Each job remains limited to 8 cores and 32 GiB. The default execution deadline -is 600 seconds; the browser defaults to the lower team maximum when needed. The deadline begins after admission and includes pod/image startup. -Queued jobs have a separate 24-hour wait limit. - -Submissions are persisted as suspended Jobs. The single controller admits at -most one FIFO head per team per pass, rotating the last-served team through a -persisted cursor. Admitted jobs reserve their requested resources even while -their pods are starting. After 30 seconds, an eligible waiting head reserves its -node against later admissions so a large request can receive draining capacity. -Running work is not preempted for fairness. k3s then binds pods to the appropriate -node and NVIDIA/DRA provides the actual claimed devices. - -Queue state survives API restart; there is no Redis dependency in this execution -path. Cancellation and revocation preserve a bounded log snapshot. A failed job -does not automatically rerun training (`backoffLimit=0`); resubmission is explicit. -Do not scale the API/controller above one replica: multiple controllers require -a leader lease or equivalent admission coordination. The deployment uses Recreate. - -## Container image workflow - -Teams build and push their image to a registry allowed in their policy, then enter -its tag or digest in the portal. Default registry hosts are Docker Hub, GHCR and -NVIDIA's public registry. No individual image approval is required. - -```text -Developer builds image → pushes tagged image to allowed registry - | - enters reference in Mist - | - node pulls image with containerd - | - entrypoint/command runs as a Kubernetes Job -``` - -Include dependencies and compatible accelerator libraries in the image. Use a -digest when reproducibility matters. Docker archive upload/build in the browser -and team-managed private registry credentials are excluded from this release. -Normal public image tags, default entrypoints, explicit commands/arguments, -environment variables, scripts and working directories are supported. - -### Container mode in the portal - -1. Select your team, then **Jobs → New job**. -2. Choose **NVIDIA** and the GPU count, then **Container**. -3. Enter a tagged image containing your code and dependencies. -4. Leave **Command executable** and **Arguments** blank to use the image's - `ENTRYPOINT`/`CMD`. Enter them only to override the image startup. -5. Submit, expand the history row, and open **Logs** or **Files**. Save files - under `/outputs` to retain/download them after the job finishes. - -A regular-member UI demonstration submitted a custom image containing -`/app/train.py` and `CMD ["python", "/app/train.py"]`. No script or command override -was injected. Its two-layer PyTorch network trained for 200 steps on one RTX A4000 -using `cuda:0`, reduced loss from 14.088 to 0.004936, saved weights/metrics and -verified checkpoint reload. [Container mode evidence](../../deploy/k3s/evidence/department-2026-10-09/container-mode-result.json). -The demonstration image was preloaded on the main node; it was not pushed to a -public registry. Normal team workflows build/push to an allowed registry. - -The default NVIDIA image contains CUDA-compatible PyTorch. Tenstorrent can use -the tested installed runtime with the default pinned image, or **Runtime included -in my image** for a compatible custom container. Custom containers receive DRA -devices and huge pages; they do not receive the host Python/TT-Metal mounts. -Successful regression training is not a guarantee that every model/library -supports TT. Intra-device sharing and distributed mixed-backend training remain -outside this release. - -## Network boundary - -Workload namespaces have a deny-by-default ingress/egress policy. They may resolve -DNS and reach public IPv4 HTTPS, but cannot directly connect to the private API, -Kubernetes, NFS, Tailscale SSH or another team's containers. Their storage mounts -are made by the trusted kubelet. Pods do not receive service-account tokens, host -network/PID/IPC access, privileged access or extra capabilities. The only permitted -host paths are the read-only tested TT runtime paths. GPU drivers still share the -host kernel; this is not VM isolation for hostile external code. - -Host rules restrict ordinary shared Tailscale sources to main's TCP 8088. Both -machines deny their direct backend/SSH/NodePort access and forwarded cluster -traffic for those sources. Infrastructure addresses `100.73.139.66`, -`100.95.175.37` and the known administrator `100.99.194.52` (and their matching -Tailscale IPv6 addresses) retain administrative access. LAN access is unchanged. -Adding an administrator device requires updating that explicit host allowlist. - -`mist-portal-firewall.service` installs these rules after Tailscale/k3s and is -reapplied with their service restarts. Tailscale's cloud sharing/ACL policy was -not edited. Tests exercised the actual installed chains with an isolated simulated -untrusted source; a browser on an external shared researcher's laptop is outside -the test environment. Manual netfilter/UFW resets should be followed by restarting -this service. The portal remains private HTTP; no Serve, Funnel or public hosting. - -## CLI on either machine - -```bash -export MIST_API_URL=http://100.73.139.66:8088/api -bin/mist-cli auth login --email your-mist-email -bin/mist-cli team list -bin/mist-cli team use TEAM_ID_FROM_LIST -bin/mist-cli job submit train.py --compute NVIDIA --devices 1 -bin/mist-cli job list --all -bin/mist-cli auth logout -``` - -On QuietBox the updated binary is installed at `~/.local/bin/mist-cli`; use that -path in place of `bin/mist-cli`. Use an actual team ID returned by `team list`. Login prompts without echoing the -password. The selected team and cookie are stored in mode-0600 config. `--team` -or `MIST_TEAM` overrides the saved workspace for a command; `team use legacy` -selects historical account jobs. `job submit --scope common` requires common write -permission; `--tt-runtime container` chooses an image-provided TT runtime. Other -machines can submit to any allowed hardware through the same portal API; SSH is -not how k3s launches their jobs. - -## Developer API contract - -Browser calls use the portal's `/api` prefix; Nginx strips it for Go. Auth calls -use `/auth`. Both use the Better Auth session cookie. Send `X-Mist-Team` with an -actual team ID for team work; `team_id` is also supported on download links. -Identity, current role, membership and write scope are checked on the server. -Missing team selection can read historical account data but cannot submit/upload. - -| Method and path (after `/api`) | Operation | -|---|---| -| `GET /session`, `/teams` | Current account and permitted team list | -| `POST /teams` | Admin creates `{name, storage_gib, model_storage_gib}`; enroll separately | -| `PATCH /teams/{id}` | Admin updates name, disabled flag or a complete policy | -| `POST /teams/{id}/members` | Admin enrolls/updates `{user_id, common_writer}` | -| `DELETE /teams/{id}/members/{user_id}` | Admin removes membership | -| `POST /teams/{id}/grants` | Admin adds `{target_team, scope}` read/use grant | -| `DELETE /teams/{id}/grants/{grant_id}` | Admin revokes a grant | -| `GET /hardware`, `/images` | Actual capacity and compatible image/runtime profiles | -| `POST /jobs`, `GET /jobs`, `GET /jobs/{id}` | Submit and inspect team jobs | -| `POST /jobs/{id}/cancel`, `GET /jobs/{id}/logs` | Authorized cancellation and logs | -| `GET /jobs/{id}/files` | Saved output listing; `/files/download?path=...` downloads | -| `GET /storage`, `/storage/folders` | Actual filesystem space and permitted folders | -| `GET /storage/files?source_team=...&scope=...` | Browse a scoped folder; add `path` and `download=true` to download | -| `GET /datasets`, `GET /datasets/{id}` | Available own/shared datasets and metadata | -| `POST /datasets?filename=...&scope=...` | Raw file body; optional `name` and `format=zip` | -| `DELETE /datasets/{id}` | Delete a writable dataset with no active job references | - -`scope` is `common` or a member's auth user ID, never a filesystem path. Job -submission uses `storage_scope` for its output location. A simple container body: - -```json -{ - "name": "Baseline experiment", - "type": "command", - "accelerator": "cpu", - "image": "python:3.11-slim", - "command": ["python"], - "args": ["/app/train.py"], - "timeout_seconds": 600 -} -``` - -The image must contain `/app/train.py`; inputs mount at `/inputs`, outputs at -`/outputs`. Submit scripts with `script` and `script_name` instead. NVIDIA/TT -requests also specify `device_count`; TT counts **boards**, not chips. The request -and response types are in `web-interface/src/api.ts`, and authority lives in Go, -not browser validation. The server returns 201 for newly created teams, datasets and jobs, and JSON -errors for rejected requests. - -## Deploy and hand off - -The main-node build command is `bash deploy/private/build-and-deploy.sh`. -It preserves bootstrap/internal auth credentials, builds the API/CLI and imports API/auth images, -applies policy/RBAC manifests, waits for rollouts, type-checks and builds the SPA, -and installs an atomic Nginx release. See [private operations](../../deploy/private/README.md) -for host services and recovery of deployment changes. API/auth image tags are -`mist-api:departments-20261009` and `mist-auth:departments-20261009`. - -Build the CLI with `go -C cli build -o ../bin/mist-cli .`. New developer tasks -should retain the identity → team policy → queued Job → scoped storage boundary. -Never accept owner/roles from a submission or mount an entire store into a job. - -Tests: [department verifier](../../deploy/k3s/verify_department.mjs), -[browser verifier](../../deploy/k3s/verify_department_browser.mjs), [large-dataset verifier](../../deploy/k3s/verify_large_dataset.py), Go team tests, -CLI tests and React job/control tests. Checked-in evidence is linked from the execution -plan. Protected verification state contains credentials and is never checked in. - -Automatic backups/recovery, HTTPS, monitoring/cleanup products, credits, Jupyter, -job chaining, browser image archives/builds and public/cloud hosting remain -explicitly excluded. There is one control plane and no new high-availability -failover mechanism. diff --git a/docs/content/design-system.md b/docs/content/design-system.md deleted file mode 100644 index 2885488..0000000 --- a/docs/content/design-system.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "Portal Design System" -weight: 80 ---- - -# Portal design - -October 9, 2026. The visual direction takes inspiration from Cursor's restrained -website: generous spacing, warm neutral surfaces, precise type, quiet borders -and restrained olive accents. Mist keeps its own research workflow and identity. - -## Shared decisions - -- Warm off-white page canvas, white content surfaces, muted sidebar, dark ink. -- Self-hosted Manrope Latin variable font; no runtime external font request. - The SIL Open Font License is included under `web-interface/public/fonts`. -- A fixed desktop sidebar with navigation, workspace and account controls. - At narrow widths it becomes a compact top navigation. -- Interactive components use shared icon headings, clear boundaries, primary/secondary - button hierarchy, hover/focus/pressed feedback and explicit loading/empty states. -- Compute is selected with native keyboard-accessible radio cards; workload modes - use segmented radio controls. Job settings are grouped into numbered sections. Discrete device sliders - are paired with exact numeric inputs, so precision is never lost. -- Dataset uploads support click-to-select and drag/drop; common/member folders - are selectable tiles, with explicit read-only sharing indicators. -- Jobs uses clickable status metrics, collapsible hardware availability, a focused - submission dialog, - and compact job-history rows. Each accessible row button expands details; - History has 10/25/50 rows per page, search, status filters and Previous/Next - controls. There is no infinite scrolling. Logs/Files are secondary actions. Expanded content retains actual runtime data. -- Overview introduces the next experiment and links directly into jobs/datasets. - Team/account administration uses compact team cards and searchable, paginated - member rows. Team settings use Teammates/Limits/Sharing tabs; account settings - separate personal work from member administration. Creation/reset actions open - focused dialogs rather than filling the page with permanently open forms. -- Layouts stack on smaller screens, tables scroll within their containers, - long names wrap/truncate appropriately, and focus states remain visible. - Motion respects reduced-motion preferences. Status always includes text. - -## Interaction principles - -- Each feature has one primary action. Details and advanced settings appear on - demand; explanatory copy is brief and placed next to the relevant decision. -- Shared Picker replaces legacy selects with a search field, clear selected state, - keyboard navigation and no-match feedback. Long account/image labels wrap in - options; the current selection truncates without widening the form. -- Native Modal provides a focus trap, Escape/backdrop close and focus return. - File transfer disables closing until finished or explicitly cancelled. Dialogs - scroll within the screen and retain a visible primary action for job submission. -- Shared Tabs has one tab stop, arrow-key navigation, Home/End and labelled panels. - Buttons, radio cards, disclosure controls and file drop targets preserve native - semantics; icons supplement text rather than hiding the action's meaning. -- Dataset library rows show name, location, file count, size and state. IDs and - checksums are optional details. The upload ceiling reflects actual free space; - the storage bar explains why a larger allocation may be needed. -- Use sliders for counts/allocations with meaningful bounds. Keep exact inputs for - resource quantities and runtime, which may need precise values and units. - -## Source map - -| Concern | Source | -|---|---| -| Colors, type, spacing, responsive layout | `web-interface/src/styles.css` | -| Navigation, workspace/account controls | `components/Navbar.tsx`, `teams.tsx` | -| Overview | `routes/dashboard.tsx` | -| Job workbench/history | `components/JobsPage.tsx`, `components/jobs/JobCard.tsx` | -| Submission and clear validation | `components/jobs/JobSubmissionForm.tsx` | -| Searchable inputs, dialogs and tabs | `components/Picker.tsx`, `components/Modal.tsx`, `components/Tabs.tsx` | -| Shared surfaces/actions | `components/Card.tsx`, `components/Buttons.tsx` | -| Team storage/admin | `components/TeamStorageBrowser.tsx`, `components/TeamsPage.tsx` | - -Component paths above are relative to `web-interface/src`. Prefer these shared -styles/components over inventing a new visual treatment for each feature. - -Real browser verification covered administrator/member actions, row expansion, -file upload/download, container submission and password reset at desktop and -390 px mobile widths. Nine React tests also cover job/history behavior and keyboard control flows. -Screenshots and reports are linked in the rollout checklist. diff --git a/docs/content/development.md b/docs/content/development.md deleted file mode 100644 index 83c0345..0000000 --- a/docs/content/development.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: "Developer Setup" -weight: 60 ---- - -# Developer setup - -Use Go **1.25.1** and Node.js **22.16.0 or newer**. Run repository commands from -`/home/utmist/Mist` on main, or your own checkout on a development machine. - -On the existing main machine, the pinned runtimes are available at: - -```bash -export PATH=/home/utmist/.local/share/mist-runtimes/go-1.25.1/bin:/home/utmist/.local/share/mist-runtimes/node-22.16.0/bin:$PATH -go version -node --version -``` - -## Frontend against the existing authenticated API - -Main's `mist-api-forward` user service already forwards the API to -`127.0.0.1:3000`; `mist-web` runs a local Vite preview on `127.0.0.1:3001`. -These are development conveniences. The deployed Nginx portal runs independently. - -```bash -systemctl --user status mist-api-forward mist-web -``` - -If those ports are free, use two terminals on main: - -```bash -export KUBECONFIG=/home/utmist/.kube/config -k3s kubectl -n mist-system port-forward service/mist-api 3000:3000 --address 127.0.0.1 -``` - -```bash -npm --prefix web-interface ci -npm --prefix web-interface run dev -- --host 127.0.0.1 --port 3001 --strictPort -``` - -Open http://127.0.0.1:3001 and sign in with your Mist account. This points to real -accounts, team storage and hardware; submitting jobs or changing policies affects -the installation. Do not start duplicate listeners while the user services run. - -For a UI on another development machine, set `MIST_API_PROXY` to an API endpoint -reachable from it. Configure its exact browser origin in the API/auth trusted -origins before relying on session requests; Tailscale connectivity alone does -not add a trusted browser origin. - -## Backend and CLI - -The root `go.work` joins `src` and `cli`; it replaces the unused root module. - -```bash -go test ./src/... ./cli/... -count=1 -go vet ./src/... ./cli/... -go -C src build -o ../bin/mist-api . -go -C cli build -o ../bin/mist-cli . -``` - -`NewKubernetesApp` exposes the real API. Unit tests use fake Kubernetes clients -and temporary small files, so they need neither Redis nor Docker. Live verifiers -use the existing authenticated installation and protected credentials. - -For backend changes, use an isolated test cluster/namespace with its own auth -and storage, or the documented maintenance deployment of this installation. -Standalone auth-disabled mode remains an explicit trusted development option; -it does not reproduce department authentication/team isolation. Never deploy it -for research users. `MIST_EXECUTOR=docker` is no longer supported and fails at -startup instead of selecting the retired supervisor. - -## Deploying the existing installation - -```bash -bash deploy/private/build-and-deploy.sh -``` - -This requires existing administrative kubeconfig, Docker/root access, auth -Secrets, operators and mounted storage. It is not a fresh-machine installer. -Read [operations](../../deploy/private/README.md) and [testing](testing.md) first. -Current user/admin behavior is in [the operating guide](department-rollout.md). diff --git a/docs/content/foundation-execution-plan.md b/docs/content/foundation-execution-plan.md deleted file mode 100644 index 53c606b..0000000 --- a/docs/content/foundation-execution-plan.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Foundation Execution Plan (Historical)" -weight: 302 ---- - -# Historical guide - -This phase has been superseded by the department platform on main. - -- [Current documentation](_index.md) -- [Current operating guide](department-rollout.md) -- [Archived original record](archive/foundation-execution-plan.md) diff --git a/docs/content/frontend-architecture.md b/docs/content/frontend-architecture.md deleted file mode 100644 index b1a81bf..0000000 --- a/docs/content/frontend-architecture.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: "Frontend Architecture" -weight: 90 ---- - -# Frontend Architecture & Backend Offloading - -Documentation of the current Mist frontend ([`web-interface`](../../web-interface)), its structural organization, and a roadmap of client-side processing to offload to the backend. - -## Architecture overview - -```mermaid -flowchart TD - User([User Browser]) --> Shell[Root Shell: __root.tsx] - Shell --> AG[AccountGate: auth.tsx] - AG --> TG[TeamGate: teams.tsx] - TG --> Nav[Navbar.tsx] - TG --> RouterOutlet[TanStack Router Outlet] - - RouterOutlet --> DPage[Dashboard: dashboard.tsx] - RouterOutlet --> JPage[Jobs Page: jobs.tsx] - RouterOutlet --> SPage[Datasets Page: datasets.tsx] - RouterOutlet --> MPage[Machines Page: machines.tsx] - RouterOutlet --> TPage[Teams Page: teams.tsx] - RouterOutlet --> PPage[Profile: profile.tsx] - - JPage --> JSF[JobSubmissionForm.tsx] - JPage --> JC[JobCard.tsx] - JC --> JL[JobLogs.tsx] - JC --> JF[JobFiles.tsx] - - SPage --> TSB[TeamStorageBrowser.tsx] -``` - -### Technology stack - -- **Vite 7.3**: Build tool and development proxy (`/api` and `/auth` forwards). -- **React 19.3**: Functional component architecture with custom hooks. -- **TanStack Router**: File-based routing located in `src/routes/` with code-splitting. -- **Tailwind CSS 4**: Modern styling via `@tailwindcss/vite` and customized Mist theme classes. -- **Better Auth Client**: Authentication state and admin member management. -- **Vitest 5 & Testing Library**: Unit and component tests. - -### Source layout - -| Location | Purpose | -|---|---| -| `src/main.tsx`, `router.tsx` | Router initialization and DOM hydration | -| `src/routes/__root.tsx` | Shell wrapper containing `AccountGate`, `TeamGate`, and `Navbar` | -| `src/routes/` | File-based routes (`dashboard.tsx`, `jobs.tsx`, `datasets.tsx`, `machines.tsx`, `teams.tsx`, `profile.tsx`) | -| `src/auth.tsx` | Better Auth client configuration, `AccountContext`, and `AccountGate` | -| `src/teams.tsx` | `TeamContext`, active team selection, workspace selector | -| `src/api.ts` | Typed HTTP client for jobs, datasets, hardware, and teams | -| `src/hooks/usePolling.ts` | In-flight request deduplication and abortable periodic polling | -| `src/components/jobs/` | `JobSubmissionForm`, `JobCard`, `JobLogs`, `JobFiles` | -| `src/components/` | `HardwarePanel`, `TeamStorageBrowser`, `Modal`, `Picker`, `Tabs`, `Card`, `Buttons` | - ---- - -## Backend offloading plan - -To keep the frontend as lightweight and simple as possible, the following responsibilities currently performed on the client should be handled by the backend: - -1. **Pagination and filtering**: - - `JobsPage`: Replace client-side slicing and array filtering with query parameters on `GET /jobs?status=...&q=...&page=...&limit=...`. - - `DatasetsPage`: Add `GET /datasets?q=...`. - - `AccountPage`: Replace Better Auth `listUsers({ limit: 1000 })` with a paginated endpoint `GET /members?page=...&q=...`. -2. **Metrics aggregation**: - - Provide `GET /metrics/summary` or summary counters in list endpoints to avoid transferring full item arrays just to compute badge totals. -3. **Image catalog and validation**: - - Move registry string parsing and image approval checks from `JobSubmissionForm` to server-side submission validation. -4. **Quota and limit calculation**: - - Replace client-side calculation of `maxDevices` and `maxTimeout` with authoritative constraints provided by the team policy API. -5. **Form parsing**: - - Accept raw multiline environment variable text and shell commands on `POST /jobs`, delegating parsing and validation to the server. -6. **Error status handling**: - - Replace English error string matching (e.g. `isPreparing`) with typed machine-readable status fields (`{ status: "provisioning" }`). -7. **Permission flags**: - - Return explicit capability booleans (`can_cancel`, `can_delete`, `can_manage`) on entities rather than parsing role strings on the client. -8. **Atomic operations**: - - Consolidate multi-call client sequences (e.g. team creation + creator enrollment, password reset + session revocation) into atomic backend operations. -9. **Event-driven updates**: - - Replace high-frequency polling with Server-Sent Events (SSE) or WebSockets for live job status and log streaming. - ---- - -## Testing with the fake backend - -A self-contained testing backend is provided in `scripts/fake-backend.mjs`. It simulates all Mist API endpoints and Better Auth handlers in memory. - -### Running locally - -```bash -# Terminal 1: Start fake backend (default port 3000) -npm --prefix web-interface run fake-backend -``` - -```bash -# Terminal 2: Start frontend dev server (port 3001) -npm --prefix web-interface run dev -- --host 127.0.0.1 --port 3001 --strictPort -``` - -Open http://127.0.0.1:3001 in your browser. Pre-seeded users include `ada@utmist.gitlab.io` (admin), `alan@utmist.gitlab.io`, and `grace@utmist.gitlab.io`. - -### Configuring hypothetical scenarios and fake information - -A companion configure tool is provided at `scripts/configure-fake-backend.mjs` to set up hypothetical cluster topologies, error conditions, and user setups: - -```bash -# Interactive menu (choose scenarios, add fake nodes, switch active user) -npm --prefix web-interface run configure-fake-backend - -# Switch to a preset scenario directly -node scripts/configure-fake-backend.mjs --scenario high-load -node scripts/configure-fake-backend.mjs --scenario unhealthy -node scripts/configure-fake-backend.mjs --scenario empty-slate -node scripts/configure-fake-backend.mjs --scenario large-cluster -node scripts/configure-fake-backend.mjs --scenario default - -# Inspect current cluster topology & status -node scripts/configure-fake-backend.mjs --status - -# Add custom fake machines, users, or teams -node scripts/configure-fake-backend.mjs --add-machine name=dgx-custom,ip=10.99.1.5,cpu=64,ram=256Gi,gpu=8 -node scripts/configure-fake-backend.mjs --add-user name="Marie Curie",email=curie@rad.edu,role=admin -node scripts/configure-fake-backend.mjs --set-user curie@rad.edu -``` - -If the fake backend is running, `configure-fake-backend.mjs` updates the live server immediately without requiring a restart, while also saving to `.fake-backend-config.json` for persistence. - diff --git a/docs/content/k3s-setup.md b/docs/content/k3s-setup.md deleted file mode 100644 index fb80ea3..0000000 --- a/docs/content/k3s-setup.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -title: "k3s Cluster & Accelerators" -weight: 30 ---- - -# k3s setup and accelerator handoff - -Verified on **October 9, 2026**. This guide describes the existing two-node -installation, fresh-install boundaries and diagnostic commands. Routine -application deployment is in [operations](../../deploy/private/README.md). - -## Installed cluster - -| Item | Main/NVIDIA | QuietBox original | -|---|---|---| -| Kubernetes node | `utmist-z1opa08` | `utmist-tt` | -| Linux user | `utmist` | `utmist-tt` | -| Role/service | server + worker, `k3s` | worker only, `k3s-agent` | -| k3s | `v1.36.4+k3s1` | `v1.36.4+k3s1` | -| OS/kernel | Ubuntu 22.04.5 LTS / 6.8.0-138-generic | Same | -| containerd | `2.3.4-k3s1.36` | Same | -| LAN/InternalIP | `10.0.0.175` | `10.0.0.112` | -| LAN interface | `wlxe0d362c98a69` (Wi-Fi) | `enp201s0` (Ethernet to router) | -| Tailscale IP | `100.73.139.66` | `100.95.175.37` | -| Accelerator | 2 × NVIDIA RTX A4000 | 4 × n300 boards, 2 Wormhole chips per board | -| Operator | GPU Operator `v26.7.1` | TT-Operator `0.3.0`, Fabric Manager `0.2.30`, DRA `0.0.59` | - -Main's host NVIDIA driver is **590.48.01**. QuietBox's `tenstorrent` kernel -module is loaded and `/dev/tenstorrent/0` through `3` exist. Operators retain -these host drivers. Both nodes were Ready and all operator deployments/daemonsets -were Ready at the audit. Service enablement was checked; a new reboot was not tested. - -```text -Researcher → Tailscale → main Nginx :8088 → Mist API/auth - | - k3s server :6443 at 10.0.0.175 - / \ - CPU/NVIDIA TT agent - 10.0.0.112 - \ / - NFS on QuietBox :2049 -``` - -The server already includes kubelet/containerd and can run workloads. Do not -start a separate agent on main: the earlier duplicate agent conflicted on port -6444. QuietBox has no independent `k3s` server service; its old test cluster was -retired before joining this server. - -## Verify from main - -Use the existing private admin kubeconfig. These commands do not print secrets: - -```bash -export KUBECONFIG=/home/utmist/.kube/config -k3s kubectl get nodes -o wide -k3s kubectl get deployments,daemonsets -A -k3s kubectl get pods -n mist-system -o wide -k3s kubectl get deviceclasses,resourceslices -helm list -A -``` - -The admin kubeconfig is private infrastructure access, not a researcher client -configuration. Keep it and node tokens out of Git and job containers. - -On main, expect `systemctl is-active k3s` to report active. On QuietBox, expect -`systemctl is-active k3s-agent` to report active. Both services are enabled at boot. - -## Fresh server installation - -This is for a new, prepared host. Do not reinstall the working control plane to -redeploy Mist or assume this reconstructs its existing accounts/storage. -Pin the observed version when reproducing it: - -```bash -curl -sfL https://get.k3s.io | sudo env INSTALL_K3S_VERSION='v1.36.4+k3s1' sh -s - server -sudo systemctl is-active k3s -sudo k3s kubectl get nodes -o wide -``` - -The installer creates `/etc/rancher/k3s/k3s.yaml`. Choose stable, reachable node -addresses and unique hostnames. Pin `node-ip`/`flannel-iface` in configuration -when multiple interfaces could select the wrong route. This installation uses -LAN addresses, not Tailscale addresses, for its Kubernetes nodes. - -## Join a fresh worker - -First verify the worker can reach **10.0.0.175:6443**. A machine on another LAN -cannot join this setup solely by being in the same tailnet; cluster advertising, -Flannel, NFS routes and firewalls would need a planned network change. - -For a clean worker, an administrator securely installs an appropriate persistent -join token in `/etc/rancher/k3s/agent-token`, owned by root with mode **0600**. -The persistent join token is obtained through authorized access to the server's -`/var/lib/rancher/k3s/server/node-token` or configured agent-token source; -do not paste it into Git, terminal transcripts or this guide. A temporary -bootstrap token is not a substitute for the persistent token used after restart. - -QuietBox's current `/etc/rancher/k3s/config.yaml` contains: - -```yaml -server: https://10.0.0.175:6443 -token-file: /etc/rancher/k3s/agent-token -node-ip: 10.0.0.112 -flannel-iface: enp201s0 -``` - -Use the new worker's own LAN IP/interface when provisioning another host. Then: - -```bash -curl -sfL https://get.k3s.io | sudo env INSTALL_K3S_VERSION='v1.36.4+k3s1' sh -s - agent -sudo systemctl is-active k3s-agent -sudo systemctl is-enabled k3s-agent -``` - -If the host already has another cluster, inspect its Jobs/PVCs and retain its -state before retiring it; the fresh-worker recipe does not migrate cluster data. -QuietBox's original test-server snapshot is root-only at -`/root/k3s-server-prejoin-2026-10-03.tar.gz`. It is historical, not a backup of the -current department platform. - -## Cluster and storage traffic - -| Destination/port | Purpose | Current network | -|---|---|---| -| Main TCP 6443 | Kubernetes API/agent registration | LAN, infrastructure access | -| Node UDP 8472 | Default Flannel VXLAN | LAN between nodes | -| Node TCP 10250 | kubelet access | LAN between nodes | -| QuietBox TCP 2049 | NFSv4 dataset/model mounts | LAN, main and QuietBox sources | -| Main TCP 8088 | Private portal | Tailscale and localhost listeners | -| Host TCP 22 | Ubuntu SSH | Authorized administrator access | - -Pods use `10.42.0.0/16`; Services use `10.43.0.0/16`. QuietBox's UFW allows -8472/UDP and 10250/TCP from main on `enp201s0`, NFS from both LAN host IPs and -forwarding between the node pod subnets. Main's installed host firewall -restricts ordinary Tailscale users to the portal. Keep VXLAN/kubelet/NFS access -scoped to trusted infrastructure sources. Wi-Fi works for the current route; -large transfers depend on LAN throughput. No direct host-to-host cable is required. - -## NVIDIA integration - -The operator's device plugin advertises `nvidia.com/gpu: 2`. CDI injects assigned -GPUs into workload containers. The tracked values retain the host driver and -enable the operator's NRI/CDI configuration. - -From the repository root on main, installation/upgrade for a prepared cluster: - -```bash -export KUBECONFIG=/home/utmist/.kube/config -helm upgrade --install gpu-operator oci://nvcr.io/nvidia/cloud-native-charts/gpu-operator \ - --version v26.7.1 --namespace gpu-operator --create-namespace \ - --values deploy/k3s/nvidia-gpu-operator-values.yaml --wait -k3s kubectl -n gpu-operator get pods -k3s kubectl get node utmist-z1opa08 -o jsonpath='{.status.allocatable.nvidia\.com/gpu}{"\n"}' -``` - -Expect 2 GPUs advertised; that is total schedulable capacity, not currently free -capacity. Each request reserves 1 or 2 whole GPUs. GPU partitioning/time slicing -is not configured. Inspect host `nvidia-smi -L` locally if devices disappear. - -## Tenstorrent integration - -The operator uses existing NFD and host KMD/firmware. It advertises four `n300` -DRA devices, each a two-chip board. TT capacity is in ResourceSlices, not the -NVIDIA extended resource field. - -```bash -export KUBECONFIG=/home/utmist/.kube/config -k3s kubectl label node utmist-tt tenstorrent.com/has-tt=true --overwrite -helm upgrade --install tt-operator oci://ghcr.io/tenstorrent/helm/tt-operator \ - --version 0.3.0 --namespace tt-operator-system --create-namespace \ - --values deploy/k3s/tenstorrent-operator-values.yaml -k3s kubectl -n tt-operator-system get pods -k3s kubectl get deviceclasses,resourceslices -``` - -Mist creates board-count ResourceClaimTemplates in managed team namespaces. -DRA allocates claims and CDI exposes only those boards. A one-board request can -use its two chips; other jobs can reserve remaining boards. Multi-board allocation -does not guarantee fabric topology or distributed model training. - -The default TT profile mounts the tested host checkout/environment read-only; -a compatible custom image can use `tt_runtime: container`. TT smoke checks use -TT-NN forward/analytic-gradient/update operations, not a proof of arbitrary -PyTorch autograd/model compatibility. - -## Test a workload - -Use **Jobs → New job → NVIDIA/Tenstorrent → Training check** after signing in and -selecting your team. This exercises authentication, quotas, queue, allocator, -training and persistent output. Use the [CLI](../../cli/docs/setup.md) from either -host to submit a real script through the same API. - -The direct manifest below is an administrator infrastructure diagnostic in the -legacy `mist` namespace. It bypasses the portal's team admission and does not -establish team-policy enforcement. Run it only when the GPU is available: - -```bash -export KUBECONFIG=/home/utmist/.kube/config -k3s kubectl apply -f deploy/k3s/gpu-smoke-job.yaml -k3s kubectl -n mist wait --for=condition=complete job/gpu-smoke --timeout=180s -k3s kubectl -n mist logs job/gpu-smoke -``` - -Expected CUDA marker: `Test PASSED`. Applying a completed Job does not rerun it; -retain needed evidence before deleting only that completed diagnostic Job. - -## Troubleshooting - -- **Node missing/NotReady:** inspect `systemctl status k3s` on main or - `systemctl status k3s-agent` on QuietBox, then the matching journal and LAN route. -- **Main API down:** confirm the duplicate main agent stays inactive; inspect - port 6444 conflicts before restarting infrastructure. -- **Missing NVIDIA resource:** check host driver and GPU operator/plugin pods. -- **Missing TT devices:** check `/dev/tenstorrent`, the KMD and TT operator pods, - then ResourceSlices/ResourceClaims. -- **Job waiting:** inspect portal message, team limits and actual device capacity; - cluster admins can inspect pod/claim events in its team namespace. -- **Image pull fails:** image must be accessible and contain compatible code. - Locally imported Docker images must also be imported into k3s containerd. -- **Storage unavailable:** verify QuietBox's NFS/team-volume services and both pool - mounts. Do not delete PVCs or overwrite mounted backing files. - -Current live evidence is in [the verification record](../../deploy/k3s/evidence/department-2026-10-09/README.md). -No new reboot, operator upgrade or rejoin was performed for this documentation audit. - -References: [K3s quick start](https://docs.k3s.io/quick-start), -[network requirements](https://docs.k3s.io/installation/requirements), -[GPU Operator](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/getting-started.html), -[TT-Operator](https://docs.tenstorrent.com/tt-operator/latest/). diff --git a/docs/content/kubernetes-pilot.md b/docs/content/kubernetes-pilot.md deleted file mode 100644 index a91ce37..0000000 --- a/docs/content/kubernetes-pilot.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Kubernetes Pilot (Historical)" -weight: 303 ---- - -# Historical guide - -This phase has been superseded by the department platform on main. - -- [Current documentation](_index.md) -- [Current operating guide](department-rollout.md) -- [Archived original record](archive/kubernetes-pilot.md) diff --git a/docs/content/local-job-foundation.md b/docs/content/local-job-foundation.md deleted file mode 100644 index 5cf0eda..0000000 --- a/docs/content/local-job-foundation.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Local Job Foundation (Historical)" -weight: 304 ---- - -# Historical guide - -This phase has been superseded by the department platform on main. - -- [Current documentation](_index.md) -- [Current operating guide](department-rollout.md) -- [Archived original record](archive/local-job-foundation.md) diff --git a/docs/content/repository-cleanup.md b/docs/content/repository-cleanup.md deleted file mode 100644 index 332e596..0000000 --- a/docs/content/repository-cleanup.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "Repository Cleanup" -weight: 110 ---- - -# Repository cleanup — October 9, 2026 - -Based on main commit `3431ffd`, the department release merged through PR #110. -Changes are published in [PR #111](https://github.com/UTMIST/Mist/pull/111) -on `chore/main-cleanup-20261009`. The main ruleset still -requires a pull request and an independent review; Git publication is separate -from deploying services. - -## Removed and organized - -- Retired the unfinished Redis scheduler/supervisor, status registry, fake auth - handlers, Docker manager and prototype CPU/CUDA/ROCm images/scripts. Removed - their tests, Redis Compose/config and unused custom logger/config. Docker - remains image build/import tooling for the current platform. -- Removed the empty tracked `go` file and unused root Go module. `go.work` now - joins the active API and CLI modules. `go mod tidy` pruned retired dependencies. -- Split API lifecycle (`main.go`, `app.go`), HTTP job handlers (`jobs_http.go`), - shared errors/responses (`http.go`) and job types (`job_types.go`) from the - mixed prototype. Current wire fields, authentication/team enforcement and - Kubernetes state/history handling remain compatible. -- Removed unreachable `teamHTTPError` after compiler-based dead-code analysis. - A final analysis with tests reports no remaining unreachable Go functions. -- Removed the CLI dummy configuration command/tests, unused input/job helpers, - editor workspace artifact, malformed command tag and empty command fallback. - Persistent config-path handling is in production code; output helpers are - compiled only for tests. -- Removed the unused frontend fake-user/logout helper, obsolete chart and - `use-immer`/`immer` packages. Existing interactive components remain in use. -- Removed five pre-team API/browser verifiers that no longer reflect deployed - authentication/storage. Current department/storage/accelerator verifiers and - dated evidence remain. -- Archived seven superseded guides and preserved old document entry points. - Added a current documentation index, k3s/Tailscale/SSH/storage/development - handoff and a source/architecture map. Corrected submission HTTP status, - current TT runtime/image rules and main's merged release state. -- Removed the plaintext password from the old SSH guide. Git history retains it; - retire that credential if valid. This cleanup did not rotate account passwords. - -## Verification - -- [Sanitized validation report](../../deploy/k3s/evidence/department-2026-10-09/cleanup-validation.json). -- Full current Go workspace tests with race detection: **29 API tests + 6 CLI - tests**, no skipped tests; CLI entrypoint has no test files. Vet passes. -- API and CLI static builds, CLI/root/job help and retired-executor rejection pass. -- **10 React tests**, TypeScript, full frontend lint and production build pass. - Removing the unused dependency reported **zero npm vulnerabilities**. -- **6 migration tests** pass as root in a disposable container with read-only - test source and tiny temporary files. An ordinary non-root invocation skips - these ownership tests; it is not represented as successful coverage. -- Both live cluster nodes, operator deployments/daemonsets and API/auth services - were inspected. Host service enablement, regular OpenSSH/Tailscale SSH settings, - LAN interfaces, token-file permissions, GPU/KMD inventory and storage usage - were checked on the owning hosts. No rejoin/reboot/operator upgrade was run. -- The compiled candidate API is checked on a temporary authenticated localhost - listener against real Kubernetes/auth: startup/health, anonymous session, - anonymous-job denial and graceful SIGTERM. Team admission is disabled for - this read-only probe, so it cannot run a second department controller. -- Local documentation links/anchors and current shell examples are checked by - `python3 scripts/check-docs.py`, without executing the examples. - -The existing portal continues to run the verified department release. These -source changes do not redeploy it. Previous live CUDA/TT/browser/isolation -[release evidence](../../deploy/k3s/evidence/department-2026-10-09/README.md) remains -valid for that release; it is not claimed as a fresh training/browser run of the -cleanup candidate. No large storage tests, production restarts, account/job/file -mutations or full-disk cleanup were performed. - -Full-host storage and account data live outside the repository. Removing old -source/fixtures does not remove existing Docker containers/volumes or Kubernetes -Jobs/PVCs. Historical account jobs/files remain accessible through the current -legacy workspace. No blanket prune, formatting or history rewrite is used. - -## Reproduce current source checks - -See [testing](testing.md), [developer setup](development.md) and -[documentation index](_index.md). Raw local validation output is kept outside Git -under `/home/utmist/mist-cleanup-validation-20261009`; publish only sanitized -summaries. Credentials, session state, kubeconfig and SSH private keys stay out -of committed documentation/evidence. diff --git a/docs/content/shared-storage-deployment-plan.md b/docs/content/shared-storage-deployment-plan.md deleted file mode 100644 index f5252e5..0000000 --- a/docs/content/shared-storage-deployment-plan.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Shared Storage Plan (Historical)" -weight: 305 ---- - -# Historical guide - -This phase has been superseded by the department platform on main. - -- [Current documentation](_index.md) -- [Current operating guide](department-rollout.md) -- [Archived original record](archive/shared-storage-deployment-plan.md) diff --git a/docs/content/storage.md b/docs/content/storage.md deleted file mode 100644 index 2672e8e..0000000 --- a/docs/content/storage.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: "Storage & Upload Limits" -weight: 50 ---- - -# Storage and upload limits - -Current department storage on **QuietBox**, verified October 9, 2026. Both -compute nodes mount scoped NFSv4 paths over their existing LAN. - -## Layout and authority - -```text -QuietBox /srv/mist-storage-volume.img (sparse base filesystem) -└── /srv/mist-storage/ - ├── metadata/ API-owned requests and metadata - ├── legacy/ preserved historical files - └── teams// bounded dataset filesystem - ├── common/datasets/ - ├── members//datasets/ - └── .models/ separate bounded model/result filesystem - ├── common/jobs//outputs/ - └── members//jobs//outputs/ -``` - -Member directory keys are derived internally; use API/UI scopes rather than -constructing filesystem paths. Teammates can read their team's common/member -folders. Members write their own folders; common writing needs assigned authority. -Other teams need an explicit read/use grant. Cross-team grants never permit writes. -Administrators must belong to a team to use its storage. - -Inputs mount read-only at `/inputs`; each job mounts only its own result directory -at `/outputs` and the checkpoint alias. Auth data lives on main's local SQLite -PVC. File ownership/permissions support the mounts; API and workload policy -provide authorization. They are not separate hard quotas for every member. - -## Capacity - -| Limit | Current value/behavior | -|---|---| -| New team datasets | **200 GiB total**, administrator configurable | -| New team models/results | **500 GiB total**, administrator configurable | -| Base logical capacity | **1,600 GiB** sparse ext4 image | -| Combined team allocation budget | **1,500 GiB** across dataset and model pools | -| Per-member hard quota | None; members share their team's corresponding pool | -| Expansion/shrink | Online expansion supported; shrink rejected | -| Team disable/removal | Preserves files and reserved allocation | - -At most two full 700-GiB default allocations fit within the budget before other -reserved allocations are counted. Existing teams retain their configured sizes; -new defaults do not silently resize them. Administrators can allocate smaller -pools for more teams. Policy overcommit is rejected before persistence. - -Dedicated bounded filesystems enforce both upload capacity and workload result -writes. PVC declarations alone do not enforce NFS capacity. The base/PVC sizes -may retain earlier declarative values; actual filesystem checks are authoritative. - -The image is sparse, so logical quota is not a physical disk reservation. During -the audit the base contained about **1.4 GiB** of data, the backing file consumed -about **5.9 GiB** physically and QuietBox had **1.9 TiB** free. These are dated -observations, not permanent capacity guarantees. The earlier unused bulk -reservation was released; unrelated research files were preserved. - -## Uploads - -Use **Datasets → Add dataset**, choose your own/common folder and upload a file -or ZIP. Bodies stream through Nginx and the API. Capacity is bounded by dataset -free space minus a **64 MiB metadata reserve**, with an optional lower -`MIST_MAX_DATASET_GIB` ceiling. There is no fixed 64 GiB upload limit. - -Transfers can run for up to **24 hours** and can be cancelled. An interrupted -transfer restarts from the beginning; resumable uploads are not implemented. -ZIP uploads require space for staging plus expanded content and reject unsafe -paths/links and expansion beyond the allowed limit. Dataset deletion is blocked -while any active/queued/terminating authorized job references it. - -Use the saved Files panel to download results. There is no automatic results -cleanup or retention service. Jobs that write outside `/outputs` do not retain -those container files. - -## Administration and inspection - -Set dataset/model sizes in **Teams → Manage → Limits**. The QuietBox provisioning -service checks manifests, mounts bounded images and publishes distinct NFS exports. -The API reports storage ready only when both mounts have the expected identities -and capacities. Missing model storage cannot borrow dataset capacity. - -On QuietBox: - -```bash -systemctl status nfs-server mist-team-storage --no-pager -mountpoint /srv/mist-storage -df -h / /srv/mist-storage -findmnt -t ext4,nfs,nfs4 -``` - -With root access, inspect `exportfs -v`, per-team mounts and the storage-agent -journal when readiness fails. Migration/expansion and service installation are -in [deployment operations](../../deploy/private/README.md). Never truncate or unlink -mounted image files, recreate populated filesystems or treat team removal as cleanup. - -Small-file migration, quota bounds and real accelerator input/output paths passed. -The earlier 2 GiB + 4 MiB test is historical evidence; large transfers and -exhaustion were not repeated after the user's request. No 200/500 GiB stress, -automatic backup or disk-failure recovery is claimed. See [testing](testing.md). diff --git a/docs/content/tailscale-ssh.md b/docs/content/tailscale-ssh.md deleted file mode 100644 index 19bd196..0000000 --- a/docs/content/tailscale-ssh.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -title: "Tailscale & Admin SSH" -weight: 40 ---- - -# Tailscale and SSH setup - -Verified against both hosts on **October 9, 2026**. Tailscale **1.102.4** is -running on both. Both use Ubuntu OpenSSH on port **22**, with Tailscale's built-in -SSH handler **disabled**. The private portal uses the existing Tailscale network. - -## Machine addresses - -| Machine | Linux user | Tailscale IP | LAN IP | SSH command | -|---|---|---|---|---| -| NVIDIA/main | `utmist` | `100.73.139.66` | `10.0.0.175` | `ssh utmist@100.73.139.66` | -| QuietBox original | `utmist-tt` | `100.95.175.37` | `10.0.0.112` | `ssh utmist-tt@100.95.175.37` | - -Main's observed MagicDNS name is `utmist.tail459b5e.ts.net`. Its OS hostname has -mixed-case letters; Kubernetes normalizes the node name to `utmist-z1opa08`. -Use the IP commands above when DNS or shared-device name resolution is uncertain. - -## What each login grants - -- **Tailscale access:** reach a shared/authorized machine over the private network. -- **Linux SSH login:** administer that machine with its local account/password or - an authorized SSH key. This password is unrelated to Google/Tailscale login. -- **Mist login:** use the website/CLI with a Mist account and assigned team role. - -Researchers can use http://100.73.139.66:8088 without SSH. Machine sharing does -not create a Mist account or automatically permit administrator SSH. - -## Check the existing setup - -Run locally on either machine: - -```bash -tailscale version -tailscale status -tailscale ip -4 -systemctl is-active tailscaled ssh -``` - -From an authorized administrator device, connect with the table's SSH command. -An SSH key connection to QuietBox was checked during this documentation audit. -Both hosts' OpenSSH configurations enable public-key and password authentication. -Passwords are intentionally absent from this repository. - -## Set up a fresh Ubuntu host - -Run these steps from its local console or an existing administrator session. -For an already connected host, verify its current tailnet before changing login. - -```bash -curl -fsSL https://tailscale.com/install.sh | sh -sudo systemctl enable --now tailscaled -sudo tailscale up -``` - -Open the displayed authentication link and join the intended existing tailnet. -Use its administrator console to manage machine sharing or network access. -Do not log out an existing infrastructure node merely to repeat installation. - -Install Ubuntu's SSH server and choose regular SSH over Tailscale: - -```bash -sudo apt update -sudo apt install openssh-server -sudo /usr/sbin/sshd -t -sudo systemctl enable --now ssh -sudo tailscale set --ssh=false -tailscale ip -4 -``` - -Disabling the built-in SSH handler makes Ubuntu OpenSSH handle authentication. -Tailscale SSH has its own policy and can reject connections even when ordinary -network traffic is allowed. Changing handlers may interrupt a session that uses -Tailscale SSH; perform the switch from a local console when applicable. - -## SSH keys and convenient aliases - -On your administrator laptop, use an existing key or create one: - -```bash -ssh-keygen -t ed25519 -ssh-copy-id -i ~/.ssh/id_ed25519.pub utmist@100.73.139.66 -ssh-copy-id -i ~/.ssh/id_ed25519.pub utmist-tt@100.95.175.37 -``` - -`ssh-copy-id` requires an existing allowed login and adds only the public key. -Alternatively, a host administrator can install the `.pub` contents in that -Linux user's `~/.ssh/authorized_keys`. Keep private keys on their owner device. - -Optional entries in your laptop's `~/.ssh/config`: - -```sshconfig -Host mist-main - HostName 100.73.139.66 - User utmist - IdentityFile ~/.ssh/id_ed25519 - IdentitiesOnly yes - -Host mist-quietbox - HostName 100.95.175.37 - User utmist-tt - IdentityFile ~/.ssh/id_ed25519 - IdentitiesOnly yes -``` - -Connect with `ssh mist-main` or `ssh mist-quietbox`. Adjust the IdentityFile when -using a different key. A successful network connection still needs valid Linux -credentials and access permitted by the host rules. - -## Current host restrictions - -The installed `mist-portal-firewall.service` permits ordinary Tailscale sources -to main's TCP **8088**, denying direct SSH/backend/cluster access. Infrastructure -IPs and the recorded administrator device **100.99.194.52** retain broader access. -The script contains matching IPv6 entries. Adding an administrator device needs -an explicit update to [the host allowlist](../../deploy/private/portal-firewall.sh), -plus any applicable tailnet policy. LAN rules are separate. - -A plain SSH public key does not bypass this firewall. Access from an external -researcher's device has not been verified by this host-side documentation audit. - -The GCP jump-host, port-2025 and manual Discord-reservation instructions from the -old guide are superseded for this installation. Its plaintext password has been -removed from current documentation; Git history still contains that old value. -Retire that credential if it remains valid. No passwords were changed by this audit. - -## Troubleshooting - -| Symptom | Check | -|---|---| -| Timeout or host unreachable | Tailscale connectivity, machine online, host allowlist and tailnet access | -| `tailnet policy does not permit you to SSH` | Built-in Tailscale SSH handler/policy; current hosts use regular OpenSSH | -| `Permission denied` | Correct Linux user, authorized key or Linux password | -| Browser loads but cannot sign in | Mist account/session and trusted browser origin; SSH credentials are unrelated | -| SSH works but worker cannot join | k3s currently uses LAN `10.0.0.175:6443`; tailnet membership alone does not supply that route | - -The current website is private HTTP over Tailscale. Public hosting, Serve/Funnel -and HTTPS setup were excluded from this release. Tailscale subscription limits -should be checked in the account console; machine count and user-seat count are -different and no fixed seat limit is asserted here. - -References: [Tailscale Linux installation](https://tailscale.com/docs/install/linux), -[Tailscale SSH](https://tailscale.com/docs/features/tailscale-ssh), -[Ubuntu OpenSSH](https://documentation.ubuntu.com/server/how-to/security/openssh-server/). diff --git a/docs/content/testing.md b/docs/content/testing.md deleted file mode 100644 index 2060c3d..0000000 --- a/docs/content/testing.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Automated Testing" -weight: 70 ---- - -# Testing - -Use the pinned Go/Node runtimes in [developer setup](development.md). The root -workspace joins the API and CLI. From the repository root: - -```bash -go test ./src/... ./cli/... -count=1 -go test -race ./src/... ./cli/... -count=1 -go vet ./src/... ./cli/... -npm --prefix web-interface ci -npm --prefix web-interface test -npx --prefix web-interface tsc --noEmit -p web-interface/tsconfig.json -npm --prefix web-interface run lint -npm --prefix web-interface run build -python3 scripts/check-docs.py -``` - -## Automated scope - -Go tests use fake Kubernetes clients and small temporary filesystem fixtures for -job state/cancellation/validation, hardware allocation, authentication/isolation, -team grants/quotas/admission/restarts, scoped storage and uploads/ZIP checks. -Application tests cover unavailable-cluster startup and the scoped compatibility -status endpoint. CLI tests exercise real request/response behavior through test -servers. React tests cover submission, image defaults/editing, pagination, -logs/cancellation and accessible shared controls. Migration tests use tiny files. They require root to verify ownership; a normal -user run reports skips. Run them as root in an isolated environment, for example: - -```bash -sudo python3 -m unittest discover -s deploy/k3s/storage -p test_migration.py -v -``` - -The tests replace the store root with a temporary directory and do not access -live storage. Docker can provide an isolated root environment when sudo is -unavailable. - -Current automated suites do not require Redis or Docker. The old supervisor, -Docker manager/logger tests and fake CLI-config tests were removed with their -retired implementations. This is not a test skip: those products are no longer -part of the application. The earlier full legacy suite results remain as dated -[pre-cleanup evidence](../../deploy/k3s/evidence/department-2026-10-09/release-validation.json). - -## Real installation checks - -| Verifier | Purpose | -|---|---| -| `deploy/k3s/verify_department.mjs` | API, auth, teams, grants, queue/revocation, storage and training | -| `deploy/k3s/verify_department_browser.mjs` | Real admin/member UI, custom image flow, pagination and responsive layout | -| `deploy/k3s/verify_department_runtime.py` | Concurrent TT allocations, failure and execution deadline | -| `deploy/k3s/verify_department_remote_cli.py` | SSH to TT, submit through CLI, execute on NVIDIA | -| `deploy/k3s/verify_department_admission.py` | Admission denials for unsafe workload specifications | -| `deploy/k3s/verify_split_storage.py` | Separate dataset/model pools, migration preservation and small-file training | -| `deploy/k3s/verify_large_dataset.py` | Earlier large-upload fixture; not part of ordinary checks | -| `deploy/private/verify-portal-firewall.sh` | Installed host chains with a synthetic untrusted source | - -These require existing protected credentials, node addresses and operators. -Inspect the script before rerunning: API restart, revocation/deactivation, quota -exhaustion and firewall tests belong in an idle maintenance window. Verification -fixtures preserve history/files; new browser teams reserve 1 GiB per pool even -after being disabled. Do not repeatedly create fixtures without accounting for -reserved storage. - -The retained `verify_tenstorrent_allocation.py` is an administrator infrastructure -diagnostic; it bypasses the portal's team admission. Pre-team browser/API -verifiers have been retired because they no longer reflect current auth/storage. - -## Evidence and limits - -The [October 9 evidence](../../deploy/k3s/evidence/department-2026-10-09/README.md) -records real CUDA/TT training, separate board/GPU reservations, input/output -mounts, checkpoint reload/download, grants/revocation, queue restart and browser -flows. The regular-member Container demonstration preserved its own image CMD; -that image was locally preloaded, not registry-pushed. - -The [cleanup record](repository-cleanup.md) separates new source checks from -previous live-release evidence. A running service is not silently redeployed by -checking out a branch or editing documentation. - -Large uploads and exhaustion are not repeated at the user's request. The -separate-pool follow-up used a 260,729-byte dataset. No 200/500 GiB transfer stress, -every possible edge case, arbitrary research model, HA or disk-failure recovery -is claimed. Excluded features remain outside the release. diff --git a/docs/frontend-architecture.md b/docs/frontend-architecture.md deleted file mode 100644 index f27ed6a..0000000 --- a/docs/frontend-architecture.md +++ /dev/null @@ -1,125 +0,0 @@ -# Frontend Architecture & Backend Offloading - -Documentation of the current Mist frontend ([`web-interface`](../web-interface)), its structural organization, and a roadmap of client-side processing to offload to the backend. - -## Architecture overview - -```mermaid -flowchart TD - User([User Browser]) --> Shell[Root Shell: __root.tsx] - Shell --> AG[AccountGate: auth.tsx] - AG --> TG[TeamGate: teams.tsx] - TG --> Nav[Navbar.tsx] - TG --> RouterOutlet[TanStack Router Outlet] - - RouterOutlet --> DPage[Dashboard: dashboard.tsx] - RouterOutlet --> JPage[Jobs Page: jobs.tsx] - RouterOutlet --> SPage[Datasets Page: datasets.tsx] - RouterOutlet --> MPage[Machines Page: machines.tsx] - RouterOutlet --> TPage[Teams Page: teams.tsx] - RouterOutlet --> PPage[Profile: profile.tsx] - - JPage --> JSF[JobSubmissionForm.tsx] - JPage --> JC[JobCard.tsx] - JC --> JL[JobLogs.tsx] - JC --> JF[JobFiles.tsx] - - SPage --> TSB[TeamStorageBrowser.tsx] -``` - -### Technology stack - -- **Vite 7.3**: Build tool and development proxy (`/api` and `/auth` forwards). -- **React 19.3**: Functional component architecture with custom hooks. -- **TanStack Router**: File-based routing located in `src/routes/` with code-splitting. -- **Tailwind CSS 4**: Modern styling via `@tailwindcss/vite` and customized Mist theme classes. -- **Better Auth Client**: Authentication state and admin member management. -- **Vitest 5 & Testing Library**: Unit and component tests. - -### Source layout - -| Location | Purpose | -|---|---| -| `src/main.tsx`, `router.tsx` | Router initialization and DOM hydration | -| `src/routes/__root.tsx` | Shell wrapper containing `AccountGate`, `TeamGate`, and `Navbar` | -| `src/routes/` | File-based routes (`dashboard.tsx`, `jobs.tsx`, `datasets.tsx`, `machines.tsx`, `teams.tsx`, `profile.tsx`) | -| `src/auth.tsx` | Better Auth client configuration, `AccountContext`, and `AccountGate` | -| `src/teams.tsx` | `TeamContext`, active team selection, workspace selector | -| `src/api.ts` | Typed HTTP client for jobs, datasets, hardware, and teams | -| `src/hooks/usePolling.ts` | In-flight request deduplication and abortable periodic polling | -| `src/components/jobs/` | `JobSubmissionForm`, `JobCard`, `JobLogs`, `JobFiles` | -| `src/components/` | `HardwarePanel`, `TeamStorageBrowser`, `Modal`, `Picker`, `Tabs`, `Card`, `Buttons` | - ---- - -## Backend offloading plan - -To keep the frontend as lightweight and simple as possible, the following responsibilities currently performed on the client should be handled by the backend: - -1. **Pagination and filtering**: - - `JobsPage`: Replace client-side slicing and array filtering with query parameters on `GET /jobs?status=...&q=...&page=...&limit=...`. - - `DatasetsPage`: Add `GET /datasets?q=...`. - - `AccountPage`: Replace Better Auth `listUsers({ limit: 1000 })` with a paginated endpoint `GET /members?page=...&q=...`. -2. **Metrics aggregation**: - - Provide `GET /metrics/summary` or summary counters in list endpoints to avoid transferring full item arrays just to compute badge totals. -3. **Image catalog and validation**: - - Move registry string parsing and image approval checks from `JobSubmissionForm` to server-side submission validation. -4. **Quota and limit calculation**: - - Replace client-side calculation of `maxDevices` and `maxTimeout` with authoritative constraints provided by the team policy API. -5. **Form parsing**: - - Accept raw multiline environment variable text and shell commands on `POST /jobs`, delegating parsing and validation to the server. -6. **Error status handling**: - - Replace English error string matching (e.g. `isPreparing`) with typed machine-readable status fields (`{ status: "provisioning" }`). -7. **Permission flags**: - - Return explicit capability booleans (`can_cancel`, `can_delete`, `can_manage`) on entities rather than parsing role strings on the client. -8. **Atomic operations**: - - Consolidate multi-call client sequences (e.g. team creation + creator enrollment, password reset + session revocation) into atomic backend operations. -9. **Event-driven updates**: - - Replace high-frequency polling with Server-Sent Events (SSE) or WebSockets for live job status and log streaming. - ---- - -## Testing with the fake backend - -A self-contained testing backend is provided in `scripts/fake-backend.mjs`. It simulates all Mist API endpoints and Better Auth handlers in memory. - -### Running locally - -```bash -# Terminal 1: Start fake backend (default port 3000) -npm --prefix web-interface run fake-backend -``` - -```bash -# Terminal 2: Start frontend dev server (port 3001) -npm --prefix web-interface run dev -- --host 127.0.0.1 --port 3001 --strictPort -``` - -Open http://127.0.0.1:3001 in your browser. Pre-seeded users include `ada@utmist.gitlab.io` (admin), `alan@utmist.gitlab.io`, and `grace@utmist.gitlab.io`. - -### Configuring hypothetical scenarios and fake information - -A companion configure tool is provided at `scripts/configure-fake-backend.mjs` to set up hypothetical cluster topologies, error conditions, and user setups: - -```bash -# Interactive menu (choose scenarios, add fake nodes, switch active user) -npm --prefix web-interface run configure-fake-backend - -# Switch to a preset scenario directly -node scripts/configure-fake-backend.mjs --scenario high-load -node scripts/configure-fake-backend.mjs --scenario unhealthy -node scripts/configure-fake-backend.mjs --scenario empty-slate -node scripts/configure-fake-backend.mjs --scenario large-cluster -node scripts/configure-fake-backend.mjs --scenario default - -# Inspect current cluster topology & status -node scripts/configure-fake-backend.mjs --status - -# Add custom fake machines, users, or teams -node scripts/configure-fake-backend.mjs --add-machine name=dgx-custom,ip=10.99.1.5,cpu=64,ram=256Gi,gpu=8 -node scripts/configure-fake-backend.mjs --add-user name="Marie Curie",email=curie@rad.edu,role=admin -node scripts/configure-fake-backend.mjs --set-user curie@rad.edu -``` - -If the fake backend is running, `configure-fake-backend.mjs` updates the live server immediately without requiring a restart, while also saving to `.fake-backend-config.json` for persistence. - diff --git a/docs/go.mod b/docs/go.mod deleted file mode 100644 index 1e7e5e9..0000000 --- a/docs/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/UTMIST/Mist/docs - -go 1.25.3 - -require github.com/imfing/hextra v0.13.0 // indirect diff --git a/docs/go.sum b/docs/go.sum deleted file mode 100644 index 6557292..0000000 --- a/docs/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/imfing/hextra v0.13.0 h1:1zhCYy0tA9ZRErFBlU6NJEgR1HjK69bgd52EmpwnG00= -github.com/imfing/hextra v0.13.0/go.mod h1:vi+yhpq8YPp/aghvJlNKVnJKcPJ/VyAEcfC1BSV9ARo= diff --git a/docs/hugo.yaml b/docs/hugo.yaml deleted file mode 100644 index 94f90f1..0000000 --- a/docs/hugo.yaml +++ /dev/null @@ -1,92 +0,0 @@ -baseURL: "/docs/" -title: "Mist Documentation" -defaultContentLanguage: "en" -enableRobotsTXT: true - -module: - imports: - - path: "github.com/imfing/hextra" - -markup: - highlight: - noClasses: false - guessSyntax: true - goldmark: - renderer: - unsafe: true - extensions: - passthrough: - delimiters: - block: [['\[', '\]'], ['$$', '$$']] - inline: [['\(', '\)']] - enable: true - -menu: - main: - - name: "Overview" - pageRef: "/" - weight: 1 - - name: "Web Portal" - url: "/" - weight: 2 - - name: "Search" - weight: 5 - params: - type: search - - name: "GitHub" - url: "https://github.com/UTMIST/Mist" - weight: 10 - params: - icon: "github" - -params: - description: "Documentation and operational guides for UTMIST's research compute platform." - - externalLinkDecoration: true - - navbar: - displayTitle: true - displayLogo: true - logo: - text: "Mist Docs" - width: wide - - theme: - default: "system" - displayToggle: true - - footer: - enable: true - displayCopyright: true - displayPoweredBy: false - width: normal - - displayUpdatedDate: true - dateFormat: "January 2, 2006" - - search: - enable: true - type: flexsearch - flexsearch: - index: content - tokenize: forward - - editURL: - enable: true - base: "https://github.com/UTMIST/Mist/edit/main/docs/content" - - highlight: - copy: - enable: true - display: hover - - toc: - enable: true - displayTags: true - - page: - width: normal - displayPagination: true - - imageZoom: - enable: true diff --git a/go.work b/go.work deleted file mode 100644 index adb0998..0000000 --- a/go.work +++ /dev/null @@ -1,6 +0,0 @@ -go 1.26.0 - -use ( - ./cli - ./src -) diff --git a/go.work.sum b/go.work.sum deleted file mode 100644 index a4e06a3..0000000 --- a/go.work.sum +++ /dev/null @@ -1,30 +0,0 @@ -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/pprof v0.0.0-20260802141513-ef3492d7dac3/go.mod h1:jl5iWTm0/hd5PjEYEOuwAJ57L/CibdZfrqZ5XA5GrCk= -github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= -golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sync v0.24.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= -golang.org/x/tools v0.51.0/go.mod h1:9eEncMayCV6zRMGhR5eZEC2iBx98qWcF1HZ9Z7wJOoA= -k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= -modernc.org/cc/v4 v4.29.7/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI= -modernc.org/ccgo/v4 v4.36.1/go.mod h1:rrtGc2QkS239nYb/mQNuBMyjq3/y3ZXWbBjPoV3wqzA= -modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= -modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/gc/v3 v3.1.5/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= -modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= -modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/pre_compute_platform.md b/pre_compute_platform.md deleted file mode 100644 index 6f67bdb..0000000 --- a/pre_compute_platform.md +++ /dev/null @@ -1,12 +0,0 @@ -# Machine access - -The earlier GCP jump-host, shared-password and manual reservation guide is -superseded by the current private Mist installation. - -- [Tailscale and SSH setup](docs/content/tailscale-ssh.md) -- [Research portal and team job submission](docs/content/department-rollout.md) -- [k3s cluster setup](docs/content/k3s-setup.md) - -Passwords are not published in current documentation. The previous password -remains in Git history; retire it if still valid. Researchers use Mist accounts -and team membership, while administrator SSH is separately restricted. diff --git a/scripts/configure-fake-backend.mjs b/scripts/configure-fake-backend.mjs deleted file mode 100644 index 4796596..0000000 --- a/scripts/configure-fake-backend.mjs +++ /dev/null @@ -1,547 +0,0 @@ -#!/usr/bin/env node -/** - * Mist Fake Backend Configuration CLI - * - * Configures hypothetical scenarios, fake users, machines, and hardware pools - * for local testing of the web interface. - * - * Usage: - * node scripts/configure-fake-backend.mjs # Interactive mode - * node scripts/configure-fake-backend.mjs --scenario high-load # Switch scenario - * node scripts/configure-fake-backend.mjs --status # Show current topology - * node scripts/configure-fake-backend.mjs --list-scenarios # List all presets - * node scripts/configure-fake-backend.mjs --reset # Reset to default - */ - -import fs from 'node:fs' -import path from 'node:path' -import http from 'node:http' -import readline from 'node:readline/promises' -import { stdin as input, stdout as output } from 'node:process' -import { fileURLToPath } from 'node:url' -import { - getScenario, - SCENARIO_DESCRIPTIONS, - SCENARIO_FACTORIES, -} from './fake-backend-scenarios.mjs' - -const ROOT_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') -const CONFIG_FILE = path.resolve(ROOT_DIR, '.fake-backend-config.json') - -// Parse CLI flags -const argv = process.argv.slice(2) -function getFlag(name) { - const idx = argv.indexOf(name) - return idx !== -1 && argv[idx + 1] ? argv[idx + 1] : null -} -function hasFlag(name) { - return argv.includes(name) -} - -const PORT = Number( - getFlag('--port') || process.env.PORT || process.env.MIST_FAKE_PORT || 3000, -) -const HOST = process.env.HOST || '127.0.0.1' - -// --- Server Communication Helpers --- - -function requestJSON(method, endpointPath, body = null) { - return new Promise((resolve, reject) => { - const data = body ? JSON.stringify(body) : null - const req = http.request( - { - hostname: HOST, - port: PORT, - path: endpointPath, - method, - headers: { - 'Content-Type': 'application/json', - ...(data ? { 'Content-Length': Buffer.byteLength(data) } : {}), - }, - timeout: 1500, - }, - (res) => { - let resData = '' - res.on('data', (chunk) => (resData += chunk)) - res.on('end', () => { - try { - resolve({ - status: res.statusCode, - data: resData ? JSON.parse(resData) : null, - }) - } catch (e) { - resolve({ status: res.statusCode, raw: resData }) - } - }) - }, - ) - req.on('timeout', () => { - req.destroy() - reject(new Error('Connection timed out')) - }) - req.on('error', (err) => reject(err)) - if (data) req.write(data) - req.end() - }) -} - -async function checkLiveServer() { - try { - const res = await requestJSON('GET', '/_fake/state') - if (res.status === 200 && res.data) { - return res.data - } - } catch {} - return null -} - -function loadLocalConfigFile() { - if (fs.existsSync(CONFIG_FILE)) { - try { - return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8')) - } catch {} - } - return null -} - -function saveLocalConfigFile(state) { - fs.writeFileSync(CONFIG_FILE, JSON.stringify(state, null, 2), 'utf-8') -} - -async function applyState(state) { - // 1. Save to local config file - saveLocalConfigFile(state) - - // 2. If live server running, update it dynamically - const live = await checkLiveServer() - if (live) { - try { - await requestJSON('POST', '/_fake/state', state) - console.log(`\n✓ Live fake backend at http://${HOST}:${PORT} updated instantly!`) - console.log(`✓ Saved configuration to .fake-backend-config.json`) - return - } catch (err) { - console.warn(`\n(Live update failed: ${err.message})`) - } - } - console.log(`\n✓ Saved configuration to .fake-backend-config.json`) - console.log(` (The fake backend is offline. Changes will take effect when it starts.)`) -} - -function parseKeyValue(inputStr) { - const result = {} - const pairs = inputStr.split(',') - for (const pair of pairs) { - const [k, v] = pair.split('=').map((s) => s.trim()) - if (k && v !== undefined) { - result[k] = v.replace(/^["']|["']$/g, '') - } - } - return result -} - -function printStatus(state) { - console.log('\n======================================================') - console.log(`Scenario: ${state.activeScenario || state.name || 'custom'}`) - const activeUser = - state.users?.[state.currentUserIndex] || state.currentUser || null - console.log( - `Active User: ${activeUser ? `${activeUser.name} <${activeUser.email}> [${activeUser.role}]` : 'None'}`, - ) - console.log(`Total Users: ${state.users?.length ?? 0}`) - console.log('------------------------------------------------------') - console.log('Machines & Nodes:') - for (const m of state.machines || []) { - const status = m.ready ? (m.schedulable ? 'Ready' : 'Placement Paused') : 'Offline' - console.log(` • ${m.name.padEnd(22)} ${m.address.padEnd(14)} [${status.padEnd(16)}] ${m.cpu_allocatable} CPU · ${m.memory_allocatable} RAM`) - } - console.log('Hardware Accelerator Pools:') - for (const p of state.pools || []) { - const avail = p.available === null ? 'Unknown' : p.available - const msg = p.message ? ` (${p.message})` : '' - console.log(` • ${p.accelerator.toUpperCase().padEnd(12)} Node: ${p.node.padEnd(20)} Total: ${p.total} Allocated: ${p.allocated} Available: ${avail}${msg}`) - } - console.log('Teams:') - for (const t of state.teams || []) { - console.log(` • ${t.name.padEnd(26)} Members: ${t.members?.length ?? 0} Policy: ${t.policy?.storage_gib ?? 0} GiB Datasets / ${t.policy?.model_storage_gib ?? 0} GiB Models`) - } - console.log('Jobs in History:') - const states = {} - for (const j of state.jobs || []) { - states[j.job_state] = (states[j.job_state] || 0) + 1 - } - console.log(` Total: ${state.jobs?.length ?? 0} (${Object.entries(states).map(([k, v]) => `${k}: ${v}`).join(', ') || '0'})`) - console.log('======================================================\n') -} - -// --- CLI Commands --- - -async function main() { - if (hasFlag('--help') || hasFlag('-h')) { - console.log(` -Mist Fake Backend Configurator - -Commands & Options: - --scenario Load a preset scenario (default, high-load, unhealthy, empty-slate, large-cluster) - --list-scenarios List all available built-in scenarios - --status Display current cluster topology, machines, users, and jobs - --set-user Set which user is active in the web session - --add-user Add a user: name="...",email="...",role=admin|user - --add-machine Add a machine: name="...",ip="...",cpu=32,ram=128Gi,gpu=4,tt=0 - --add-team Add a team: name="...",storage=300,models=600 - --config Load configuration from a JSON file - --export Export active configuration to a JSON file - --reset Reset back to the default scenario - --port Target port (default: 3000) - -Run with no flags for the interactive menu. -`) - return - } - - if (hasFlag('--list-scenarios')) { - console.log('\nAvailable Hypothetical Scenarios:') - for (const [name, desc] of Object.entries(SCENARIO_DESCRIPTIONS)) { - console.log(` • ${name.padEnd(16)} : ${desc}`) - } - console.log('') - return - } - - // Current state resolution - let currentState = (await checkLiveServer()) || loadLocalConfigFile() || getScenario('default') - - if (hasFlag('--status')) { - const live = await checkLiveServer() - console.log(live ? `[Backend Server: ONLINE at http://${HOST}:${PORT}]` : `[Backend Server: OFFLINE (reading config file)]`) - printStatus(currentState) - return - } - - if (hasFlag('--scenario')) { - const name = getFlag('--scenario') - try { - const scenario = getScenario(name) - await applyState(scenario) - printStatus(scenario) - } catch (err) { - console.error(`Error: ${err.message}`) - process.exit(1) - } - return - } - - if (hasFlag('--reset')) { - const defaultScenario = getScenario('default') - await applyState(defaultScenario) - console.log('Reset to default scenario successfully.') - return - } - - if (hasFlag('--config')) { - const filePath = getFlag('--config') - if (!fs.existsSync(filePath)) { - console.error(`File not found: ${filePath}`) - process.exit(1) - } - const data = JSON.parse(fs.readFileSync(filePath, 'utf-8')) - await applyState(data) - console.log(`Loaded configuration from ${filePath}.`) - return - } - - if (hasFlag('--export')) { - const outPath = getFlag('--export') - fs.writeFileSync(outPath, JSON.stringify(currentState, null, 2), 'utf-8') - console.log(`Exported configuration to ${outPath}.`) - return - } - - if (hasFlag('--set-user')) { - const target = getFlag('--set-user') - const idx = (currentState.users || []).findIndex( - (u) => u.id === target || u.email.toLowerCase() === target.toLowerCase(), - ) - if (idx === -1) { - console.error(`User '${target}' not found. Available: ${currentState.users.map((u) => u.email).join(', ')}`) - process.exit(1) - } - currentState.currentUserIndex = idx - await applyState(currentState) - console.log(`Active user set to: ${currentState.users[idx].name} (${currentState.users[idx].email})`) - return - } - - if (hasFlag('--add-user')) { - const kv = parseKeyValue(getFlag('--add-user')) - if (!kv.name || !kv.email) { - console.error('Error: name and email are required (e.g. name="Marie Curie",email="curie@rad.edu",role=admin)') - process.exit(1) - } - const newUser = { - id: 'usr_' + Date.now().toString(36), - name: kv.name, - email: kv.email, - role: kv.role || 'user', - banned: false, - } - currentState.users = currentState.users || [] - currentState.users.push(newUser) - await applyState(currentState) - console.log(`Added user: ${newUser.name} <${newUser.email}> (${newUser.role})`) - return - } - - if (hasFlag('--add-machine')) { - const kv = parseKeyValue(getFlag('--add-machine')) - if (!kv.name) { - console.error('Error: machine name is required (e.g. name=dgx-a100,ip=10.0.1.50,cpu=64,ram=256Gi,gpu=8)') - process.exit(1) - } - const newMachine = { - name: kv.name, - address: kv.ip || kv.address || '10.0.1.' + Math.floor(Math.random() * 200 + 20), - ready: kv.ready !== 'false', - schedulable: kv.schedulable !== 'false', - cpu_allocatable: kv.cpu || '32', - memory_allocatable: kv.ram || '128Gi', - } - currentState.machines = currentState.machines || [] - currentState.machines.push(newMachine) - - // Add GPU or TT pools if requested - currentState.pools = currentState.pools || [] - if (Number(kv.gpu) > 0) { - currentState.pools.push({ - accelerator: 'nvidia', - node: newMachine.name, - unit: 'GPU', - total: Number(kv.gpu), - allocated: 0, - available: Number(kv.gpu), - ready: true, - }) - } - if (Number(kv.tt) > 0) { - currentState.pools.push({ - accelerator: 'tenstorrent', - node: newMachine.name, - unit: 'board', - total: Number(kv.tt), - allocated: 0, - available: Number(kv.tt), - ready: true, - chips_per_device: 2, - }) - } - await applyState(currentState) - console.log(`Added machine: ${newMachine.name} with ${kv.gpu || 0} GPUs and ${kv.tt || 0} Tenstorrent boards.`) - return - } - - if (hasFlag('--add-team')) { - const kv = parseKeyValue(getFlag('--add-team')) - if (!kv.name) { - console.error('Error: team name is required (e.g. name="Quantum ML",storage=500,models=1000)') - process.exit(1) - } - const activeUser = currentState.users?.[currentState.currentUserIndex] - const newTeam = { - id: 'team-' + kv.name.toLowerCase().replace(/\W+/g, '-'), - name: kv.name, - disabled: false, - policy: { - cpu: kv.cpu || '16', - memory: kv.memory || '64Gi', - nvidia: Number(kv.gpu ?? 2), - tenstorrent: Number(kv.tt ?? 2), - concurrent: 4, - queued: 20, - storage_gib: Number(kv.storage || 300), - model_storage_gib: Number(kv.models || 600), - runtime_seconds: 86400, - registries: ['docker.io', 'ghcr.io'], - }, - members: activeUser - ? [{ id: activeUser.id, name: activeUser.name, email: activeUser.email, common_writer: true }] - : [], - grants: [], - } - currentState.teams = currentState.teams || [] - currentState.teams.push(newTeam) - await applyState(currentState) - console.log(`Added team: ${newTeam.name}`) - return - } - - // --- Interactive Terminal Menu --- - const rl = readline.createInterface({ input, output }) - try { - while (true) { - const live = await checkLiveServer() - console.clear() - console.log('======================================================') - console.log(' MIST FAKE BACKEND CONFIGURATOR') - console.log('======================================================') - console.log(`Backend Server: ${live ? `ONLINE (http://${HOST}:${PORT})` : 'OFFLINE (saving to config file)'}`) - console.log(`Active Scenario: ${currentState.activeScenario || currentState.name || 'custom'}`) - const u = currentState.users?.[currentState.currentUserIndex] - console.log(`Active User: ${u ? `${u.name} <${u.email}> (${u.role})` : 'None'}`) - console.log(`Machines: ${currentState.machines?.map((m) => m.name).join(', ') || 'None'}`) - console.log(`Teams: ${currentState.teams?.map((t) => t.name).join(', ') || 'None'}`) - console.log('------------------------------------------------------') - console.log('Select an action:') - console.log(' 1) Switch to a hypothetical scenario preset') - console.log(' 2) Switch active logged-in user') - console.log(' 3) Add a fake machine / node') - console.log(' 4) Add a fake user') - console.log(' 5) Add a fake team') - console.log(' 6) View full cluster status') - console.log(' 7) Reset to default scenario') - console.log(' 8) Exit') - console.log('------------------------------------------------------') - - const choice = (await rl.question('Enter choice [1-8]: ')).trim() - - if (choice === '1') { - console.log('\nAvailable Hypothetical Scenarios:') - const keys = Object.keys(SCENARIO_DESCRIPTIONS) - keys.forEach((key, i) => { - console.log(` ${i + 1}) ${key.padEnd(16)} : ${SCENARIO_DESCRIPTIONS[key]}`) - }) - const sel = (await rl.question('\nSelect scenario [1-5]: ')).trim() - const idx = parseInt(sel, 10) - 1 - if (keys[idx]) { - currentState = getScenario(keys[idx]) - await applyState(currentState) - await rl.question('\nPress Enter to continue...') - } - } else if (choice === '2') { - console.log('\nAvailable Users:') - currentState.users.forEach((user, i) => { - const mark = i === currentState.currentUserIndex ? ' (ACTIVE)' : '' - console.log(` ${i + 1}) ${user.name} <${user.email}> [${user.role}]${mark}`) - }) - const sel = (await rl.question('\nSelect user number: ')).trim() - const idx = parseInt(sel, 10) - 1 - if (currentState.users[idx]) { - currentState.currentUserIndex = idx - await applyState(currentState) - } - } else if (choice === '3') { - console.log('\n--- Add Fake Machine ---') - const name = (await rl.question('Machine name (e.g. dgx-h100-01): ')).trim() - if (!name) continue - const ip = (await rl.question('IP Address (default 10.0.1.25): ')).trim() || '10.0.1.25' - const cpu = (await rl.question('Allocatable CPU cores (default 32): ')).trim() || '32' - const ram = (await rl.question('Allocatable RAM (default 128Gi): ')).trim() || '128Gi' - const gpu = parseInt((await rl.question('NVIDIA GPUs count (default 0): ')).trim() || '0', 10) - const tt = parseInt((await rl.question('Tenstorrent boards count (default 0): ')).trim() || '0', 10) - - const machine = { - name, - address: ip, - ready: true, - schedulable: true, - cpu_allocatable: cpu, - memory_allocatable: ram, - } - currentState.machines = currentState.machines || [] - currentState.machines.push(machine) - - currentState.pools = currentState.pools || [] - if (gpu > 0) { - currentState.pools.push({ - accelerator: 'nvidia', - node: name, - unit: 'GPU', - total: gpu, - allocated: 0, - available: gpu, - ready: true, - }) - } - if (tt > 0) { - currentState.pools.push({ - accelerator: 'tenstorrent', - node: name, - unit: 'board', - total: tt, - allocated: 0, - available: tt, - ready: true, - chips_per_device: 2, - }) - } - await applyState(currentState) - await rl.question('\nMachine added! Press Enter to continue...') - } else if (choice === '4') { - console.log('\n--- Add Fake User ---') - const name = (await rl.question('Full name (e.g. Marie Curie): ')).trim() - if (!name) continue - const email = (await rl.question('Email (e.g. marie@utmist.gitlab.io): ')).trim() - if (!email) continue - const role = (await rl.question('Role (admin / user, default user): ')).trim() || 'user' - currentState.users = currentState.users || [] - currentState.users.push({ - id: 'usr_' + Date.now().toString(36), - name, - email, - role, - banned: false, - }) - await applyState(currentState) - await rl.question('\nUser added! Press Enter to continue...') - } else if (choice === '5') { - console.log('\n--- Add Fake Team ---') - const name = (await rl.question('Team name (e.g. Quantum Computing Lab): ')).trim() - if (!name) continue - const storage = parseInt((await rl.question('Dataset storage in GiB (default 300): ')).trim() || '300', 10) - const models = parseInt((await rl.question('Model storage in GiB (default 600): ')).trim() || '600', 10) - const activeUser = currentState.users?.[currentState.currentUserIndex] - - const newTeam = { - id: 'team-' + name.toLowerCase().replace(/\W+/g, '-'), - name, - disabled: false, - policy: { - cpu: '16', - memory: '64Gi', - nvidia: 2, - tenstorrent: 2, - concurrent: 4, - queued: 20, - storage_gib: storage, - model_storage_gib: models, - runtime_seconds: 86400, - registries: ['docker.io', 'ghcr.io'], - }, - members: activeUser - ? [{ id: activeUser.id, name: activeUser.name, email: activeUser.email, common_writer: true }] - : [], - grants: [], - } - currentState.teams = currentState.teams || [] - currentState.teams.push(newTeam) - await applyState(currentState) - await rl.question('\nTeam added! Press Enter to continue...') - } else if (choice === '6') { - printStatus(currentState) - await rl.question('\nPress Enter to return to menu...') - } else if (choice === '7') { - currentState = getScenario('default') - await applyState(currentState) - await rl.question('\nReset to default scenario! Press Enter to continue...') - } else if (choice === '8') { - break - } - } - } finally { - rl.close() - } -} - -main().catch((err) => { - console.error('Fatal error:', err) - process.exit(1) -}) diff --git a/scripts/dev.sh b/scripts/dev.sh deleted file mode 100755 index 0f5b7a9..0000000 --- a/scripts/dev.sh +++ /dev/null @@ -1,236 +0,0 @@ -#!/usr/bin/env bash -# -# scripts/dev.sh - Bring up local development environment for Mist -# -set -euo pipefail - -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -cd "$ROOT_DIR" - -# Text styles -BOLD='\033[1m' -GREEN='\033[0;32m' -YELLOW='\033[0;33m' -BLUE='\033[0;34m' -RED='\033[0;31m' -NC='\033[0m' - -log_info() { echo -e "${BLUE}[INFO]${NC} $*"; } -log_ok() { echo -e "${GREEN}[OK]${NC} $*"; } -log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } -log_error() { echo -e "${RED}[ERROR]${NC} $*" >&2; } - -usage() { - echo -e "${BOLD}Usage:${NC} $0 [options] - -${BOLD}Options:${NC} - --frontend-only Run only the web interface dev server (Vite) - --port-forward Forward Kubernetes mist-api service to localhost:3000 and run frontend - --full-stack Start Backend API (with built-in auth) and Frontend dev server - --k3s Start a local k3s server instance - --port Frontend dev server port (default: 3001) - --api-proxy Set backend API proxy URL (default: http://127.0.0.1:3000) - --help, -h Show this help message - -${BOLD}Examples:${NC} - $0 Auto-detect cluster and start local dev environment - $0 --port-forward Forward deployed cluster API (port 3000) & start frontend (port 3001) - $0 --api-proxy http://100.73.139.66:8088/api" - exit 0 -} - -# Parse options -MODE="auto" -FRONTEND_PORT="3001" -API_PROXY="${MIST_API_PROXY:-http://127.0.0.1:3000}" -START_K3S=false - -while [[ $# -gt 0 ]]; do - case "$1" in - --frontend-only) - MODE="frontend" - shift - ;; - --port-forward) - MODE="port-forward" - shift - ;; - --full-stack) - MODE="full-stack" - shift - ;; - --k3s) - START_K3S=true - shift - ;; - --port) - FRONTEND_PORT="$2" - shift 2 - ;; - --api-proxy) - API_PROXY="$2" - shift 2 - ;; - --help|-h) - usage - ;; - *) - log_error "Unknown option: $1" - usage - ;; - esac -done - -# Track background PIDs for cleanup -PIDS=() -cleanup() { - if [ ${#PIDS[@]} -gt 0 ]; then - log_info "Stopping background services..." - for pid in "${PIDS[@]}"; do - if kill -0 "$pid" 2>/dev/null; then - kill "$pid" 2>/dev/null || true - fi - done - wait 2>/dev/null || true - fi - log_ok "All services stopped." -} -trap cleanup EXIT INT TERM - -# Ensure dependencies exist -check_command() { - if ! command -v "$1" >/dev/null 2>&1; then - log_error "Command '$1' not found. Please activate the dev environment using 'direnv' or 'nix develop'." - exit 1 - fi -} - -check_command node -check_command npm -check_command go - -# Discover KUBECONFIG if not set -find_kubeconfig() { - if [ -n "${KUBECONFIG:-}" ] && [ -f "$KUBECONFIG" ]; then - return 0 - fi - for path in \ - "/home/utmist/.kube/config" \ - "$HOME/.kube/config" \ - "/etc/rancher/k3s/k3s.yaml" \ - "$HOME/.config/rancher/k3s/k3s.yaml"; do - if [ -r "$path" ]; then - export KUBECONFIG="$path" - log_info "Found Kubeconfig at: $KUBECONFIG" - return 0 - fi - done - return 1 -} - -# Check cluster reachability -cluster_reachable() { - if command -v kubectl >/dev/null 2>&1; then - kubectl cluster-info >/dev/null 2>&1 && return 0 - fi - if command -v k3s >/dev/null 2>&1; then - k3s kubectl cluster-info >/dev/null 2>&1 && return 0 - fi - return 1 -} - -KUBECTL_CMD="kubectl" -if ! command -v kubectl >/dev/null 2>&1 && command -v k3s >/dev/null 2>&1; then - KUBECTL_CMD="k3s kubectl" -fi - -# Start local k3s if requested -if [ "$START_K3S" = true ]; then - log_info "Starting local k3s server..." - check_command k3s - K3S_DATA_DIR="$ROOT_DIR/.k3s-dev" - mkdir -p "$K3S_DATA_DIR" - - if [ "$(id -u)" -eq 0 ]; then - k3s server --data-dir "$K3S_DATA_DIR" & - else - log_info "Running k3s in rootless mode..." - k3s server --rootless --data-dir "$K3S_DATA_DIR" & - fi - PIDS+=($!) - - export KUBECONFIG="$HOME/.kube/k3s.yaml" - log_info "Waiting for k3s cluster to be ready..." - for _ in $(seq 1 30); do - if cluster_reachable; then - log_ok "Local k3s cluster is ready!" - break - fi - sleep 2 - done -fi - -# Auto-detect mode if "auto" -if [ "$MODE" = "auto" ]; then - find_kubeconfig || true - if cluster_reachable; then - # Check if mist-api service exists in mist-system - if $KUBECTL_CMD -n mist-system get service/mist-api >/dev/null 2>&1; then - log_info "Detected active cluster with service/mist-api in mist-system." - MODE="port-forward" - else - log_info "Detected Kubernetes cluster. Will use local full-stack mode with cluster connectivity." - MODE="full-stack" - fi - else - log_info "No reachable Kubernetes cluster found. Starting frontend with API proxy: $API_PROXY" - MODE="frontend" - fi -fi - -# Setup web-interface dependencies -if [ ! -d "web-interface/node_modules" ]; then - log_info "Installing web-interface dependencies..." - npm --prefix web-interface ci -fi - -# Execute according to mode -case "$MODE" in - port-forward) - log_info "Starting port-forward for service/mist-api on 127.0.0.1:3000..." - $KUBECTL_CMD -n mist-system port-forward service/mist-api 3000:3000 --address 127.0.0.1 & - PIDS+=($!) - sleep 2 - - log_info "Starting Vite frontend at http://127.0.0.1:${FRONTEND_PORT} (proxying to http://127.0.0.1:3000)..." - export MIST_API_PROXY="http://127.0.0.1:3000" - npm --prefix web-interface run dev -- --host 127.0.0.1 --port "$FRONTEND_PORT" --strictPort - ;; - - full-stack) - # 1. Build and start API with built-in auth - log_info "Building mist-api..." - go -C src build -o ../bin/mist-api . - log_info "Starting mist-api on 127.0.0.1:3000..." - export BETTER_AUTH_SECRET="${BETTER_AUTH_SECRET:-mist-local-dev-secret-key-32-chars-long}" - export MIST_ADMIN_EMAIL="${MIST_ADMIN_EMAIL:-admin@mist.local}" - export MIST_ADMIN_PASSWORD="${MIST_ADMIN_PASSWORD:-mistadmin12345}" - export MIST_AUTH_DATABASE="${MIST_AUTH_DATABASE:-./data/auth.sqlite}" - export MIST_HTTP_ADDR="127.0.0.1:3000" - export MIST_SITE_ORIGIN="http://127.0.0.1:${FRONTEND_PORT}" - bin/mist-api & - PIDS+=($!) - sleep 2 - - # 2. Start Frontend - log_info "Starting Vite frontend at http://127.0.0.1:${FRONTEND_PORT}..." - export MIST_API_PROXY="http://127.0.0.1:3000" - npm --prefix web-interface run dev -- --host 127.0.0.1 --port "$FRONTEND_PORT" --strictPort - ;; - - frontend) - log_info "Starting Vite frontend at http://127.0.0.1:${FRONTEND_PORT} (proxying to ${API_PROXY})..." - export MIST_API_PROXY="$API_PROXY" - npm --prefix web-interface run dev -- --host 127.0.0.1 --port "$FRONTEND_PORT" --strictPort - ;; -esac diff --git a/scripts/fake-backend-scenarios.mjs b/scripts/fake-backend-scenarios.mjs deleted file mode 100644 index b9a0636..0000000 --- a/scripts/fake-backend-scenarios.mjs +++ /dev/null @@ -1,643 +0,0 @@ -/** - * Mist Fake Backend - Built-in Hypothetical Scenarios - * - * Provides modular scenario generators for testing various cluster topologies, - * load conditions, failure modes, and organizational structures. - */ - -export const SCENARIO_DESCRIPTIONS = { - default: 'Standard balanced cluster with 1 GPU node, 1 Tenstorrent node, 2 teams, and 3 users.', - 'high-load': 'Resource-exhausted cluster: 100% GPU/TT saturation, long waiting queue, and 95% full storage.', - unhealthy: 'Degraded cluster with offline nodes, failed jobs, driver error messages, and storage errors.', - 'empty-slate': 'Clean empty cluster with 0 jobs, 0 datasets, and 0 teams for onboarding / first-run testing.', - 'large-cluster': 'Multi-node enterprise setup with 5 machines (H100s, Wormholes), 5 teams, and 30+ jobs.', -} - -export function createDefaultScenario() { - const now = Date.now() - return { - name: 'default', - description: SCENARIO_DESCRIPTIONS.default, - currentUserIndex: 0, - storageBudgetGiB: 2000, - users: [ - { - id: 'usr_ada', - name: 'Ada Lovelace', - email: 'ada@utmist.gitlab.io', - role: 'admin', - banned: false, - }, - { - id: 'usr_alan', - name: 'Alan Turing', - email: 'alan@utmist.gitlab.io', - role: 'user', - banned: false, - }, - { - id: 'usr_grace', - name: 'Grace Hopper', - email: 'grace@utmist.gitlab.io', - role: 'user', - banned: false, - }, - ], - machines: [ - { - name: 'mist-gpu-node-01', - address: '10.0.1.10', - ready: true, - schedulable: true, - cpu_allocatable: '32', - memory_allocatable: '128Gi', - }, - { - name: 'mist-tt-worker-01', - address: '10.0.1.11', - ready: true, - schedulable: true, - cpu_allocatable: '16', - memory_allocatable: '64Gi', - }, - ], - pools: [ - { - accelerator: 'nvidia', - node: 'mist-gpu-node-01', - unit: 'GPU', - total: 4, - allocated: 1, - available: 3, - ready: true, - }, - { - accelerator: 'tenstorrent', - node: 'mist-tt-worker-01', - unit: 'board', - total: 4, - allocated: 0, - available: 4, - ready: true, - chips_per_device: 2, - }, - ], - storage: { - enabled: true, - capacity_bytes: 1099511627776, // 1 TiB - available_bytes: 879609302220, // 800 GiB - model_capacity_bytes: 2199023255552, // 2 TiB - model_available_bytes: 1759218604441, // 1.6 TiB - dataset_allocation_gib: 500, - model_allocation_gib: 1000, - upload_limit_bytes: 5368709120, // 5 GiB - }, - teams: [ - { - id: 'team-vision', - name: 'Computer Vision', - disabled: false, - policy: { - cpu: '16', - memory: '64Gi', - nvidia: 2, - tenstorrent: 4, - concurrent: 4, - queued: 20, - storage_gib: 300, - model_storage_gib: 600, - runtime_seconds: 86400, - registries: ['docker.io', 'ghcr.io', 'quay.io'], - }, - members: [ - { - id: 'usr_ada', - name: 'Ada Lovelace', - email: 'ada@utmist.gitlab.io', - common_writer: true, - }, - { - id: 'usr_alan', - name: 'Alan Turing', - email: 'alan@utmist.gitlab.io', - common_writer: false, - }, - ], - grants: [ - { - id: 'grant-nlp-share', - target_team: 'team-nlp', - scope: 'common', - }, - ], - }, - { - id: 'team-nlp', - name: 'Natural Language Processing', - disabled: false, - policy: { - cpu: '8', - memory: '32Gi', - nvidia: 1, - tenstorrent: 2, - concurrent: 2, - queued: 10, - storage_gib: 200, - model_storage_gib: 400, - runtime_seconds: 43200, - registries: ['docker.io', 'ghcr.io'], - }, - members: [ - { - id: 'usr_ada', - name: 'Ada Lovelace', - email: 'ada@utmist.gitlab.io', - common_writer: true, - }, - { - id: 'usr_grace', - name: 'Grace Hopper', - email: 'grace@utmist.gitlab.io', - common_writer: false, - }, - ], - grants: [], - }, - ], - jobs: [ - { - id: 'job-seed-001', - name: 'ResNet50 Vision Benchmark', - created: new Date(now - 3600000).toISOString(), - job_state: 'Success', - accelerator: 'nvidia', - device_count: 2, - image: 'ghcr.io/utmist/pytorch-cuda:latest', - cpu: '8', - memory: '32Gi', - node: 'mist-gpu-node-01', - exit_code: 0, - message: 'Job completed successfully in 1420s', - checkpoint_directory: '/outputs/checkpoints/job-seed-001', - output_directory: '/outputs/runs/job-seed-001', - timeout_seconds: 7200, - team_id: 'team-vision', - creator_id: 'usr_ada', - creator_name: 'Ada Lovelace', - storage_scope: 'common', - can_cancel: false, - }, - { - id: 'job-seed-002', - name: 'BERT Fine-tuning Test', - created: new Date(now - 1800000).toISOString(), - job_state: 'InProgress', - accelerator: 'nvidia', - device_count: 1, - image: 'ghcr.io/utmist/pytorch-cuda:latest', - cpu: '4', - memory: '16Gi', - node: 'mist-gpu-node-01', - checkpoint_directory: '/outputs/checkpoints/job-seed-002', - output_directory: '/outputs/runs/job-seed-002', - timeout_seconds: 3600, - team_id: 'team-nlp', - creator_id: 'usr_grace', - creator_name: 'Grace Hopper', - storage_scope: 'usr_grace', - can_cancel: true, - }, - { - id: 'job-seed-003', - name: 'Tenstorrent Wormhole Matrix Multiplication', - created: new Date(now - 600000).toISOString(), - job_state: 'Scheduled', - accelerator: 'tenstorrent', - device_count: 2, - image: 'ghcr.io/utmist/tt-metal-runtime:latest', - cpu: '4', - memory: '16Gi', - message: 'Queued; waiting for 2 Tenstorrent n300 board allocations', - checkpoint_directory: '/outputs/checkpoints/job-seed-003', - output_directory: '/outputs/runs/job-seed-003', - timeout_seconds: 1800, - team_id: 'team-vision', - creator_id: 'usr_alan', - creator_name: 'Alan Turing', - storage_scope: 'usr_alan', - can_cancel: true, - }, - ], - datasets: [ - { - id: 'ds-cifar100', - name: 'CIFAR-100 Benchmark Dataset', - filename: 'cifar100.zip', - size: 169000000, - files: 100, - sha256: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', - created: new Date(now - 86400000).toISOString(), - state: 'ready', - team_id: 'team-vision', - team_name: 'Computer Vision', - scope: 'common', - member_name: 'Ada Lovelace', - shared: false, - }, - { - id: 'ds-wikitext', - name: 'Wikitext-103 Subset', - filename: 'wikitext.tar.gz', - size: 512000000, - files: 1, - sha256: 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', - created: new Date(now - 43200000).toISOString(), - state: 'ready', - team_id: 'team-nlp', - team_name: 'Natural Language Processing', - scope: 'common', - member_name: 'Grace Hopper', - shared: true, - }, - ], - } -} - -export function createHighLoadScenario() { - const now = Date.now() - const base = createDefaultScenario() - base.name = 'high-load' - base.description = SCENARIO_DESCRIPTIONS['high-load'] - - // Saturated hardware: 0 available - base.pools = [ - { - accelerator: 'nvidia', - node: 'mist-gpu-node-01', - unit: 'GPU', - total: 4, - allocated: 4, - available: 0, - ready: true, - }, - { - accelerator: 'tenstorrent', - node: 'mist-tt-worker-01', - unit: 'board', - total: 4, - allocated: 4, - available: 0, - ready: true, - chips_per_device: 2, - }, - ] - - // Storage 95% consumed - base.storage = { - enabled: true, - capacity_bytes: 1073741824000, // 1 TiB - available_bytes: 32212254720, // 30 GiB left (near capacity!) - model_capacity_bytes: 2147483648000, - model_available_bytes: 53687091200, // 50 GiB left - dataset_allocation_gib: 980, - model_allocation_gib: 1950, - upload_limit_bytes: 2147483648, - } - - // 4 running jobs taking all accelerators + 8 queued jobs - base.jobs = [ - { - id: 'job-hl-run-01', - name: 'LLM Multi-GPU Pretraining Node 1', - created: new Date(now - 7200000).toISOString(), - job_state: 'InProgress', - accelerator: 'nvidia', - device_count: 2, - image: 'ghcr.io/utmist/pytorch-cuda:latest', - cpu: '16', - memory: '64Gi', - node: 'mist-gpu-node-01', - checkpoint_directory: '/outputs/checkpoints/job-hl-run-01', - output_directory: '/outputs/runs/job-hl-run-01', - team_id: 'team-vision', - creator_name: 'Ada Lovelace', - can_cancel: true, - }, - { - id: 'job-hl-run-02', - name: 'Diffusion Video Upscaler', - created: new Date(now - 3600000).toISOString(), - job_state: 'InProgress', - accelerator: 'nvidia', - device_count: 2, - image: 'ghcr.io/utmist/pytorch-cuda:latest', - cpu: '16', - memory: '64Gi', - node: 'mist-gpu-node-01', - checkpoint_directory: '/outputs/checkpoints/job-hl-run-02', - output_directory: '/outputs/runs/job-hl-run-02', - team_id: 'team-nlp', - creator_name: 'Grace Hopper', - can_cancel: true, - }, - { - id: 'job-hl-run-03', - name: 'TT Wormhole Full-Board Stress Test', - created: new Date(now - 5400000).toISOString(), - job_state: 'InProgress', - accelerator: 'tenstorrent', - device_count: 4, - image: 'ghcr.io/utmist/tt-metal-runtime:latest', - cpu: '16', - memory: '64Gi', - node: 'mist-tt-worker-01', - checkpoint_directory: '/outputs/checkpoints/job-hl-run-03', - output_directory: '/outputs/runs/job-hl-run-03', - team_id: 'team-vision', - creator_name: 'Alan Turing', - can_cancel: true, - }, - // Queued jobs - ...Array.from({ length: 8 }, (_, i) => ({ - id: `job-hl-wait-0${i + 1}`, - name: `Queued Experiment #${i + 1}`, - created: new Date(now - (8 - i) * 300000).toISOString(), - job_state: 'Scheduled', - accelerator: i % 2 === 0 ? 'nvidia' : 'tenstorrent', - device_count: (i % 2) + 1, - image: i % 2 === 0 ? 'ghcr.io/utmist/pytorch-cuda:latest' : 'ghcr.io/utmist/tt-metal-runtime:latest', - cpu: '4', - memory: '16Gi', - message: `Waiting for resources (Position in queue: ${i + 1})`, - checkpoint_directory: `/outputs/checkpoints/wait-${i + 1}`, - output_directory: `/outputs/runs/wait-${i + 1}`, - team_id: i % 2 === 0 ? 'team-vision' : 'team-nlp', - creator_name: i % 3 === 0 ? 'Ada Lovelace' : i % 3 === 1 ? 'Alan Turing' : 'Grace Hopper', - can_cancel: true, - })), - ] - - return base -} - -export function createUnhealthyScenario() { - const now = Date.now() - const base = createDefaultScenario() - base.name = 'unhealthy' - base.description = SCENARIO_DESCRIPTIONS.unhealthy - - base.machines = [ - { - name: 'mist-gpu-node-01', - address: '10.0.1.10', - ready: false, - schedulable: false, - cpu_allocatable: '0', - memory_allocatable: '0Gi', - }, - { - name: 'mist-tt-worker-01', - address: '10.0.1.11', - ready: true, - schedulable: false, // Placement paused! - cpu_allocatable: '16', - memory_allocatable: '64Gi', - }, - ] - - base.pools = [ - { - accelerator: 'nvidia', - node: 'mist-gpu-node-01', - unit: 'GPU', - total: 4, - allocated: 0, - available: null, - ready: false, - message: 'Node offline; NVIDIA driver communication lost (NVML error 999)', - }, - { - accelerator: 'tenstorrent', - node: 'mist-tt-worker-01', - unit: 'board', - total: 4, - allocated: 0, - available: 0, - ready: false, - chips_per_device: 2, - message: 'Node cordon active: scheduling paused for driver kernel patch', - }, - ] - - base.jobs = [ - { - id: 'job-fail-001', - name: 'Vision Model OOM Failure', - created: new Date(now - 7200000).toISOString(), - job_state: 'Failure', - accelerator: 'nvidia', - device_count: 2, - image: 'ghcr.io/utmist/pytorch-cuda:latest', - cpu: '8', - memory: '16Gi', - node: 'mist-gpu-node-01', - exit_code: 137, - message: 'Command terminated by SIGKILL (Out of Memory - cgroup limit exceeded)', - checkpoint_directory: '/outputs/checkpoints/job-fail-001', - output_directory: '/outputs/runs/job-fail-001', - team_id: 'team-vision', - creator_name: 'Ada Lovelace', - can_cancel: false, - }, - { - id: 'job-fail-002', - name: 'Faulty Python Script Crash', - created: new Date(now - 3600000).toISOString(), - job_state: 'Failure', - accelerator: 'cpu', - device_count: 0, - image: 'docker.io/library/python:3.11-slim', - cpu: '2', - memory: '4Gi', - node: 'mist-tt-worker-01', - exit_code: 1, - message: 'RuntimeError: ModuleNotFoundError: No module named torch_geometric', - checkpoint_directory: '/outputs/checkpoints/job-fail-002', - output_directory: '/outputs/runs/job-fail-002', - team_id: 'team-nlp', - creator_name: 'Grace Hopper', - can_cancel: false, - }, - { - id: 'job-stuck-003', - name: 'Stuck Queued Job', - created: new Date(now - 1800000).toISOString(), - job_state: 'Scheduled', - accelerator: 'nvidia', - device_count: 1, - image: 'ghcr.io/utmist/pytorch-cuda:latest', - cpu: '4', - memory: '16Gi', - message: '0/2 nodes are available: 1 node is offline, 1 node has untolerated taint', - checkpoint_directory: '/outputs/checkpoints/job-stuck-003', - output_directory: '/outputs/runs/job-stuck-003', - team_id: 'team-vision', - creator_name: 'Alan Turing', - can_cancel: true, - }, - ] - - return base -} - -export function createEmptySlateScenario() { - return { - name: 'empty-slate', - description: SCENARIO_DESCRIPTIONS['empty-slate'], - currentUserIndex: 0, - storageBudgetGiB: 1000, - users: [ - { - id: 'usr_newcomer', - name: 'New Researcher', - email: 'researcher@utmist.gitlab.io', - role: 'admin', - banned: false, - }, - ], - machines: [ - { - name: 'lab-cluster-master', - address: '192.168.1.10', - ready: true, - schedulable: true, - cpu_allocatable: '16', - memory_allocatable: '64Gi', - }, - ], - pools: [ - { - accelerator: 'nvidia', - node: 'lab-cluster-master', - unit: 'GPU', - total: 2, - allocated: 0, - available: 2, - ready: true, - }, - ], - storage: { - enabled: true, - capacity_bytes: 536870912000, // 500 GiB - available_bytes: 536870912000, - model_capacity_bytes: 1073741824000, - model_available_bytes: 1073741824000, - dataset_allocation_gib: 0, - model_allocation_gib: 0, - upload_limit_bytes: 5368709120, - }, - teams: [], - jobs: [], - datasets: [], - } -} - -export function createLargeClusterScenario() { - const now = Date.now() - const base = createDefaultScenario() - base.name = 'large-cluster' - base.description = SCENARIO_DESCRIPTIONS['large-cluster'] - base.storageBudgetGiB = 10000 - - base.users = [ - { id: 'usr_ada', name: 'Ada Lovelace', email: 'ada@utmist.gitlab.io', role: 'admin', banned: false }, - { id: 'usr_alan', name: 'Alan Turing', email: 'alan@utmist.gitlab.io', role: 'user', banned: false }, - { id: 'usr_grace', name: 'Grace Hopper', email: 'grace@utmist.gitlab.io', role: 'user', banned: false }, - { id: 'usr_curie', name: 'Marie Curie', email: 'marie@utmist.gitlab.io', role: 'admin', banned: false }, - { id: 'usr_feynman', name: 'Richard Feynman', email: 'feynman@utmist.gitlab.io', role: 'user', banned: false }, - { id: 'usr_shannon', name: 'Claude Shannon', email: 'shannon@utmist.gitlab.io', role: 'user', banned: false }, - { id: 'usr_neumann', name: 'John von Neumann', email: 'neumann@utmist.gitlab.io', role: 'user', banned: true }, - ] - - base.machines = [ - { name: 'dgx-h100-node-01', address: '10.10.1.1', ready: true, schedulable: true, cpu_allocatable: '64', memory_allocatable: '512Gi' }, - { name: 'dgx-h100-node-02', address: '10.10.1.2', ready: true, schedulable: true, cpu_allocatable: '64', memory_allocatable: '512Gi' }, - { name: 'tt-wormhole-box-01', address: '10.10.1.3', ready: true, schedulable: true, cpu_allocatable: '32', memory_allocatable: '128Gi' }, - { name: 'tt-wormhole-box-02', address: '10.10.1.4', ready: true, schedulable: true, cpu_allocatable: '32', memory_allocatable: '128Gi' }, - { name: 'control-plane-k3s', address: '10.10.1.100', ready: true, schedulable: true, cpu_allocatable: '16', memory_allocatable: '64Gi' }, - ] - - base.pools = [ - { accelerator: 'nvidia', node: 'dgx-h100-node-01', unit: 'GPU', total: 8, allocated: 4, available: 4, ready: true }, - { accelerator: 'nvidia', node: 'dgx-h100-node-02', unit: 'GPU', total: 8, allocated: 6, available: 2, ready: true }, - { accelerator: 'tenstorrent', node: 'tt-wormhole-box-01', unit: 'board', total: 4, allocated: 2, available: 2, ready: true, chips_per_device: 2 }, - { accelerator: 'tenstorrent', node: 'tt-wormhole-box-02', unit: 'board', total: 4, allocated: 1, available: 3, ready: true, chips_per_device: 2 }, - ] - - base.teams = [ - { - id: 'team-cv', - name: 'Computer Vision Lab', - disabled: false, - policy: { cpu: '32', memory: '128Gi', nvidia: 8, tenstorrent: 4, concurrent: 8, queued: 40, storage_gib: 1000, model_storage_gib: 2000, runtime_seconds: 86400, registries: ['docker.io', 'ghcr.io'] }, - members: [{ id: 'usr_ada', name: 'Ada Lovelace', email: 'ada@utmist.gitlab.io', common_writer: true }, { id: 'usr_curie', name: 'Marie Curie', email: 'marie@utmist.gitlab.io', common_writer: true }], - grants: [], - }, - { - id: 'team-llm', - name: 'Foundation Models & NLP', - disabled: false, - policy: { cpu: '64', memory: '256Gi', nvidia: 8, tenstorrent: 2, concurrent: 6, queued: 30, storage_gib: 2000, model_storage_gib: 4000, runtime_seconds: 86400, registries: ['docker.io', 'ghcr.io'] }, - members: [{ id: 'usr_grace', name: 'Grace Hopper', email: 'grace@utmist.gitlab.io', common_writer: true }, { id: 'usr_shannon', name: 'Claude Shannon', email: 'shannon@utmist.gitlab.io', common_writer: false }], - grants: [], - }, - { - id: 'team-robotics', - name: 'Autonomous Robotics', - disabled: false, - policy: { cpu: '16', memory: '64Gi', nvidia: 4, tenstorrent: 4, concurrent: 4, queued: 20, storage_gib: 800, model_storage_gib: 1200, runtime_seconds: 43200, registries: ['docker.io'] }, - members: [{ id: 'usr_alan', name: 'Alan Turing', email: 'alan@utmist.gitlab.io', common_writer: true }, { id: 'usr_feynman', name: 'Richard Feynman', email: 'feynman@utmist.gitlab.io', common_writer: false }], - grants: [], - }, - ] - - // Generate 25 jobs across all states - const jobStates = ['Success', 'InProgress', 'Scheduled', 'Failure', 'Cancelled'] - base.jobs = Array.from({ length: 25 }, (_, i) => ({ - id: `job-enterprise-${String(i + 1).padStart(3, '0')}`, - name: `Model Exploration #${i + 1}`, - created: new Date(now - (25 - i) * 1200000).toISOString(), - job_state: jobStates[i % jobStates.length], - accelerator: i % 3 === 0 ? 'nvidia' : i % 3 === 1 ? 'tenstorrent' : 'cpu', - device_count: i % 3 === 2 ? 0 : (i % 4) + 1, - image: i % 3 === 0 ? 'ghcr.io/utmist/pytorch-cuda:latest' : i % 3 === 1 ? 'ghcr.io/utmist/tt-metal-runtime:latest' : 'docker.io/library/python:3.11-slim', - cpu: String((i % 4 + 1) * 4), - memory: `${(i % 4 + 1) * 16}Gi`, - node: i % 2 === 0 ? 'dgx-h100-node-01' : 'tt-wormhole-box-01', - exit_code: jobStates[i % jobStates.length] === 'Failure' ? 1 : jobStates[i % jobStates.length] === 'Success' ? 0 : undefined, - message: jobStates[i % jobStates.length] === 'Failure' ? 'Killed by cluster controller' : undefined, - checkpoint_directory: `/outputs/checkpoints/job-enterprise-${i + 1}`, - output_directory: `/outputs/runs/job-enterprise-${i + 1}`, - team_id: i % 2 === 0 ? 'team-cv' : 'team-llm', - creator_name: base.users[i % base.users.length].name, - can_cancel: jobStates[i % jobStates.length] === 'InProgress' || jobStates[i % jobStates.length] === 'Scheduled', - })) - - return base -} - -export const SCENARIO_FACTORIES = { - default: createDefaultScenario, - 'high-load': createHighLoadScenario, - unhealthy: createUnhealthyScenario, - 'empty-slate': createEmptySlateScenario, - 'large-cluster': createLargeClusterScenario, -} - -export function getScenario(name) { - const factory = SCENARIO_FACTORIES[name] - if (!factory) { - throw new Error(`Unknown scenario '${name}'. Available: ${Object.keys(SCENARIO_FACTORIES).join(', ')}`) - } - return factory() -} diff --git a/scripts/fake-backend.mjs b/scripts/fake-backend.mjs deleted file mode 100644 index 0abce2a..0000000 --- a/scripts/fake-backend.mjs +++ /dev/null @@ -1,898 +0,0 @@ -#!/usr/bin/env node -/** - * Mist Fake Backend Server - * - * A standalone, zero-dependency Node.js HTTP server simulating the Mist Go API - * and Better Auth service. Designed for local frontend development, testing, - * and rapid prototyping without requiring k3s, GPUs, or Better Auth SQLite. - * - * Usage: - * node scripts/fake-backend.mjs - * node scripts/fake-backend.mjs --scenario high-load - * node scripts/fake-backend.mjs --config ./custom-config.json - * PORT=3000 node scripts/fake-backend.mjs - * npm --prefix web-interface run fake-backend - */ - -import http from 'node:http' -import fs from 'node:fs' -import path from 'node:path' -import { URL, fileURLToPath } from 'node:url' -import crypto from 'node:crypto' -import { - getScenario, - SCENARIO_DESCRIPTIONS, - SCENARIO_FACTORIES, -} from './fake-backend-scenarios.mjs' - -// Parse command line arguments -const args = process.argv.slice(2) -function getArg(flag) { - const idx = args.indexOf(flag) - return idx !== -1 && args[idx + 1] ? args[idx + 1] : null -} - -const PORT = Number( - getArg('--port') || process.env.PORT || process.env.MIST_FAKE_PORT || 3000, -) -const HOST = process.env.HOST || '127.0.0.1' -const ROOT_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') -const DEFAULT_CONFIG_FILE = path.resolve(ROOT_DIR, '.fake-backend-config.json') - -// --- Initial State Management --- - -let state = { - activeScenario: 'default', - users: [], - currentUserIndex: 0, - machines: [], - pools: [], - storageBudgetGiB: 2000, - storage: {}, - teams: [], - jobs: [], - datasets: [], - images: { - self_service: true, - teams_enabled: true, - registries: ['docker.io', 'ghcr.io', 'quay.io', 'localhost:5000'], - images: [ - { reference: 'docker.io/library/python:3.11-slim', accelerators: ['cpu'] }, - { reference: 'docker.io/library/pytorch-cpu:2.2.0', accelerators: ['cpu'] }, - { reference: 'ghcr.io/utmist/pytorch-cuda:latest', accelerators: ['nvidia'] }, - { reference: 'ghcr.io/utmist/tt-metal-runtime:latest', accelerators: ['tenstorrent'] }, - ], - profiles: [ - { - accelerator: 'cpu', - default_image: 'docker.io/library/python:3.11-slim', - device_unit: 'core', - max_devices: 16, - note: 'Standard CPU runtime', - }, - { - accelerator: 'nvidia', - default_image: 'ghcr.io/utmist/pytorch-cuda:latest', - device_unit: 'GPU', - max_devices: 4, - note: 'NVIDIA CUDA 12.4 + PyTorch runtime', - }, - { - accelerator: 'tenstorrent', - default_image: 'ghcr.io/utmist/tt-metal-runtime:latest', - device_unit: 'board', - max_devices: 4, - note: 'Tenstorrent Wormhole n300 PCIe runtime', - }, - ], - }, - jobLogs: new Map(), - jobFiles: new Map(), -} - -export function applyConfiguration(config) { - if (config.users) state.users = JSON.parse(JSON.stringify(config.users)) - if (config.currentUserIndex !== undefined) state.currentUserIndex = config.currentUserIndex - if (config.activeUserId) { - const idx = state.users.findIndex( - (u) => u.id === config.activeUserId || u.email.toLowerCase() === config.activeUserId.toLowerCase(), - ) - if (idx >= 0) state.currentUserIndex = idx - } - if (config.machines) state.machines = JSON.parse(JSON.stringify(config.machines)) - if (config.pools) state.pools = JSON.parse(JSON.stringify(config.pools)) - if (config.storage) state.storage = JSON.parse(JSON.stringify(config.storage)) - if (config.storageBudgetGiB !== undefined) state.storageBudgetGiB = config.storageBudgetGiB - if (config.teams) state.teams = JSON.parse(JSON.stringify(config.teams)) - if (config.jobs) { - state.jobs = JSON.parse(JSON.stringify(config.jobs)) - for (const job of state.jobs) { - if (!state.jobLogs.has(job.id)) { - state.jobLogs.set( - job.id, - `[${job.created}] Job ${job.name} initialized in state ${job.job_state}\n`, - ) - } - } - } - if (config.datasets) state.datasets = JSON.parse(JSON.stringify(config.datasets)) - if (config.images) state.images = JSON.parse(JSON.stringify(config.images)) - if (config.name) state.activeScenario = config.name -} - -// Determine initial scenario / config -function initializeState() { - const cliScenario = getArg('--scenario') || process.env.MIST_FAKE_SCENARIO - const cliConfig = getArg('--config') || process.env.MIST_FAKE_CONFIG - - if (cliScenario) { - try { - console.log(`[Config] Loading requested scenario: '${cliScenario}'`) - applyConfiguration(getScenario(cliScenario)) - return - } catch (err) { - console.warn(`[Config] Warning: ${err.message}. Falling back to default.`) - } - } - - if (cliConfig && fs.existsSync(cliConfig)) { - try { - console.log(`[Config] Loading configuration from: ${cliConfig}`) - const raw = fs.readFileSync(cliConfig, 'utf-8') - applyConfiguration(JSON.parse(raw)) - return - } catch (err) { - console.warn(`[Config] Failed to load config from ${cliConfig}: ${err.message}`) - } - } - - if (fs.existsSync(DEFAULT_CONFIG_FILE)) { - try { - console.log(`[Config] Found local ${DEFAULT_CONFIG_FILE}, loading...`) - const raw = fs.readFileSync(DEFAULT_CONFIG_FILE, 'utf-8') - applyConfiguration(JSON.parse(raw)) - return - } catch (err) { - console.warn(`[Config] Failed to parse ${DEFAULT_CONFIG_FILE}: ${err.message}`) - } - } - - // Fallback to default scenario - applyConfiguration(getScenario('default')) -} - -initializeState() - -// Automatically progress queued jobs over time -setInterval(() => { - for (const job of state.jobs) { - if (job.job_state === 'Scheduled') { - // Find suitable node if available - const pool = state.pools.find( - (p) => p.accelerator === job.accelerator && p.ready && (p.available === null || p.available > 0), - ) - if (pool) { - job.job_state = 'InProgress' - job.node = pool.node - job.message = `Pod running on ${job.node}` - const logs = state.jobLogs.get(job.id) || `[${new Date().toISOString()}] Job submitted.\n` - state.jobLogs.set( - job.id, - logs + `[${new Date().toISOString()}] Admitted to cluster. Initializing pod on ${job.node}...\n`, - ) - } - } else if (job.job_state === 'InProgress') { - const elapsed = Date.now() - new Date(job.created).getTime() - if (elapsed > 20000 && !job.id.startsWith('job-hl-run')) { - job.job_state = 'Success' - job.exit_code = 0 - job.message = 'Job completed successfully' - job.can_cancel = false - const logs = state.jobLogs.get(job.id) || '' - state.jobLogs.set( - job.id, - logs + `[${new Date().toISOString()}] Execution finished with code 0.\nOutputs saved.\n`, - ) - if (!state.jobFiles.has(job.id)) { - state.jobFiles.set(job.id, [ - { path: 'output.log', size: 2048, modified: new Date().toISOString() }, - { path: 'model_weights.bin', size: 52428800, modified: new Date().toISOString() }, - ]) - } - } - } - } -}, 5000) - -// --- Helper Functions --- - -function parseJSONBody(req) { - return new Promise((resolve, reject) => { - let data = '' - req.on('data', (chunk) => { - data += chunk - if (data.length > 50 * 1024 * 1024) { - req.destroy() - reject(new Error('Request payload too large')) - } - }) - req.on('end', () => { - if (!data.trim()) return resolve({}) - try { - resolve(JSON.parse(data)) - } catch (err) { - reject(new Error('Malformed JSON: ' + err.message)) - } - }) - req.on('error', reject) - }) -} - -function sendJSON(res, statusCode, payload) { - const body = JSON.stringify(payload) - res.writeHead(statusCode, { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(body), - 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Methods': 'GET, POST, PATCH, DELETE, OPTIONS', - 'Access-Control-Allow-Headers': 'Content-Type, X-Mist-Team, Authorization', - }) - res.end(body) -} - -function sendError(res, statusCode, message) { - sendJSON(res, statusCode, { error: message }) -} - -// --- Request Router --- - -const server = http.createServer(async (req, res) => { - // CORS Preflight - if (req.method === 'OPTIONS') { - res.writeHead(204, { - 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Methods': 'GET, POST, PATCH, DELETE, OPTIONS', - 'Access-Control-Allow-Headers': 'Content-Type, X-Mist-Team, Authorization', - 'Access-Control-Max-Age': '86400', - }) - res.end() - return - } - - const parsedUrl = new URL(req.url, `http://${req.headers.host || 'localhost'}`) - let pathname = parsedUrl.pathname - const query = Object.fromEntries(parsedUrl.searchParams.entries()) - const activeTeam = req.headers['x-mist-team'] || query.team_id || '' - - // Normalize path by stripping optional '/api' prefix - if (pathname.startsWith('/api/')) { - pathname = pathname.slice(4) - } else if (pathname === '/api') { - pathname = '/' - } - - const currentUser = state.users[state.currentUserIndex] || null - - try { - // ---------------------------------------------------- - // FAKE BACKEND DYNAMIC CONFIGURATION & SCENARIO CONTROL - // ---------------------------------------------------- - - if (pathname === '/_fake/state' && req.method === 'GET') { - sendJSON(res, 200, { - activeScenario: state.activeScenario, - currentUserIndex: state.currentUserIndex, - currentUser, - users: state.users, - machines: state.machines, - pools: state.pools, - storage: state.storage, - storageBudgetGiB: state.storageBudgetGiB, - teams: state.teams, - jobs: state.jobs, - datasets: state.datasets, - }) - return - } - - if ((pathname === '/_fake/state' || pathname === '/_fake/configure') && req.method === 'POST') { - const body = await parseJSONBody(req) - applyConfiguration(body) - sendJSON(res, 200, { - success: true, - message: 'Configuration applied successfully', - activeScenario: state.activeScenario, - }) - return - } - - if (pathname === '/_fake/scenarios' && req.method === 'GET') { - sendJSON(res, 200, { - scenarios: Object.entries(SCENARIO_DESCRIPTIONS).map(([name, description]) => ({ - name, - description, - active: state.activeScenario === name, - })), - }) - return - } - - const scenarioMatch = pathname.match(/^\/_fake\/scenario\/([^/]+)$/) - if (scenarioMatch && req.method === 'POST') { - const name = scenarioMatch[1] - try { - const scenarioData = getScenario(name) - applyConfiguration(scenarioData) - sendJSON(res, 200, { - success: true, - scenario: name, - message: `Switched to hypothetical scenario: '${name}'`, - }) - } catch (err) { - sendError(res, 400, err.message) - } - return - } - - if (pathname === '/_fake/reset' && req.method === 'POST') { - const defaultData = getScenario('default') - applyConfiguration(defaultData) - sendJSON(res, 200, { success: true, message: 'Reset to default scenario' }) - return - } - - // ---------------------------------------------------- - // AUTH & SESSION ENDPOINTS - // ---------------------------------------------------- - - if (pathname === '/session' && req.method === 'GET') { - sendJSON(res, 200, { - enabled: true, - user: currentUser, - }) - return - } - - if (pathname === '/auth/get-session' && req.method === 'GET') { - if (!currentUser) { - sendJSON(res, 200, null) - } else { - sendJSON(res, 200, { - user: currentUser, - session: { - id: 'sess_' + currentUser.id, - userId: currentUser.id, - expiresAt: new Date(Date.now() + 86400000).toISOString(), - }, - }) - } - return - } - - if (pathname === '/auth/sign-in/email' && req.method === 'POST') { - const body = await parseJSONBody(req) - const user = state.users.find( - (u) => u.email.toLowerCase() === (body.email || '').toLowerCase(), - ) - if (!user) { - sendJSON(res, 401, { - error: { message: 'Invalid credentials or user not found' }, - }) - return - } - if (user.banned) { - sendJSON(res, 403, { - error: { message: 'Account is deactivated' }, - }) - return - } - state.currentUserIndex = state.users.findIndex((u) => u.id === user.id) - sendJSON(res, 200, { - user, - session: { - id: 'sess_' + user.id, - userId: user.id, - expiresAt: new Date(Date.now() + 86400000).toISOString(), - }, - }) - return - } - - if (pathname === '/auth/sign-out' && req.method === 'POST') { - state.currentUserIndex = -1 // signed out - sendJSON(res, 200, { success: true }) - return - } - - if (pathname === '/auth/change-password' && req.method === 'POST') { - await parseJSONBody(req) - sendJSON(res, 200, { success: true }) - return - } - - if ( - (pathname === '/auth/admin/list-users' || pathname === '/auth/admin/listUsers') && - (req.method === 'GET' || req.method === 'POST') - ) { - sendJSON(res, 200, { - users: state.users, - total: state.users.length, - }) - return - } - - if (pathname === '/auth/admin/create-user' && req.method === 'POST') { - const body = await parseJSONBody(req) - if (!body.name || !body.email) { - sendError(res, 400, 'Name and email are required') - return - } - const newUser = { - id: 'usr_' + crypto.randomBytes(4).toString('hex'), - name: body.name, - email: body.email, - role: body.role || 'user', - banned: false, - } - state.users.push(newUser) - sendJSON(res, 200, { user: newUser }) - return - } - - if (pathname === '/auth/admin/set-user-password' && req.method === 'POST') { - await parseJSONBody(req) - sendJSON(res, 200, { success: true }) - return - } - - if (pathname === '/auth/admin/revoke-user-sessions' && req.method === 'POST') { - await parseJSONBody(req) - sendJSON(res, 200, { success: true }) - return - } - - if (pathname === '/auth/admin/ban-user' && req.method === 'POST') { - const body = await parseJSONBody(req) - const target = state.users.find((u) => u.id === body.userId) - if (target) target.banned = true - sendJSON(res, 200, { success: true }) - return - } - - if (pathname === '/auth/admin/unban-user' && req.method === 'POST') { - const body = await parseJSONBody(req) - const target = state.users.find((u) => u.id === body.userId) - if (target) target.banned = false - sendJSON(res, 200, { success: true }) - return - } - - // ---------------------------------------------------- - // HARDWARE & IMAGES ENDPOINTS - // ---------------------------------------------------- - - if (pathname === '/hardware' && req.method === 'GET') { - sendJSON(res, 200, { - observed_at: new Date().toISOString(), - machines: state.machines, - pools: state.pools, - }) - return - } - - if (pathname === '/images' && req.method === 'GET') { - sendJSON(res, 200, state.images) - return - } - - // ---------------------------------------------------- - // TEAMS ENDPOINTS - // ---------------------------------------------------- - - if (pathname === '/teams' && req.method === 'GET') { - sendJSON(res, 200, { - teams: state.teams, - storage_budget_gib: state.storageBudgetGiB, - storage_limits_enforced: false, - }) - return - } - - if (pathname === '/teams' && req.method === 'POST') { - const body = await parseJSONBody(req) - const newTeam = { - id: 'team-' + (body.name || 'unnamed').toLowerCase().replace(/\W+/g, '-'), - name: body.name || 'New Team', - disabled: false, - policy: { - cpu: '8', - memory: '32Gi', - nvidia: 1, - tenstorrent: 2, - concurrent: 2, - queued: 10, - storage_gib: Number(body.storage_gib || 200), - model_storage_gib: Number(body.model_storage_gib || 500), - runtime_seconds: 86400, - registries: ['docker.io', 'ghcr.io'], - }, - members: currentUser - ? [ - { - id: currentUser.id, - name: currentUser.name, - email: currentUser.email, - common_writer: true, - }, - ] - : [], - grants: [], - } - state.teams.push(newTeam) - sendJSON(res, 200, newTeam) - return - } - - const teamMatch = pathname.match(/^\/teams\/([^/]+)$/) - if (teamMatch && req.method === 'PATCH') { - const teamId = teamMatch[1] - const team = state.teams.find((t) => t.id === teamId) - if (!team) return sendError(res, 404, 'Team not found') - const body = await parseJSONBody(req) - if (body.name !== undefined) team.name = body.name - if (body.disabled !== undefined) team.disabled = body.disabled - if (body.policy !== undefined) team.policy = { ...team.policy, ...body.policy } - sendJSON(res, 200, team) - return - } - - const teamMembersMatch = pathname.match(/^\/teams\/([^/]+)\/members$/) - if (teamMembersMatch && req.method === 'POST') { - const teamId = teamMembersMatch[1] - const team = state.teams.find((t) => t.id === teamId) - if (!team) return sendError(res, 404, 'Team not found') - const body = await parseJSONBody(req) - const user = state.users.find((u) => u.id === body.user_id) - if (!user) return sendError(res, 404, 'User not found') - const existing = team.members.find((m) => m.id === user.id) - if (existing) { - existing.common_writer = !!body.common_writer - } else { - team.members.push({ - id: user.id, - name: user.name, - email: user.email, - common_writer: !!body.common_writer, - }) - } - sendJSON(res, 200, team) - return - } - - const teamMemberDeleteMatch = pathname.match(/^\/teams\/([^/]+)\/members\/([^/]+)$/) - if (teamMemberDeleteMatch && req.method === 'DELETE') { - const teamId = teamMemberDeleteMatch[1] - const userId = decodeURIComponent(teamMemberDeleteMatch[2]) - const team = state.teams.find((t) => t.id === teamId) - if (!team) return sendError(res, 404, 'Team not found') - team.members = team.members.filter((m) => m.id !== userId) - sendJSON(res, 200, team) - return - } - - const teamGrantsMatch = pathname.match(/^\/teams\/([^/]+)\/grants$/) - if (teamGrantsMatch && req.method === 'POST') { - const teamId = teamGrantsMatch[1] - const team = state.teams.find((t) => t.id === teamId) - if (!team) return sendError(res, 404, 'Team not found') - const body = await parseJSONBody(req) - const newGrant = { - id: 'grant-' + crypto.randomBytes(3).toString('hex'), - target_team: body.target_team, - scope: body.scope || 'common', - } - team.grants.push(newGrant) - sendJSON(res, 200, team) - return - } - - const teamGrantDeleteMatch = pathname.match(/^\/teams\/([^/]+)\/grants\/([^/]+)$/) - if (teamGrantDeleteMatch && req.method === 'DELETE') { - const teamId = teamGrantDeleteMatch[1] - const grantId = teamGrantDeleteMatch[2] - const team = state.teams.find((t) => t.id === teamId) - if (!team) return sendError(res, 404, 'Team not found') - team.grants = team.grants.filter((g) => g.id !== grantId) - sendJSON(res, 200, team) - return - } - - // ---------------------------------------------------- - // JOBS ENDPOINTS - // ---------------------------------------------------- - - if (pathname === '/jobs' && req.method === 'GET') { - let filtered = state.jobs - if (activeTeam) { - filtered = filtered.filter((j) => j.team_id === activeTeam) - } - sendJSON(res, 200, { - jobs: filtered, - count: filtered.length, - }) - return - } - - if (pathname === '/jobs' && req.method === 'POST') { - const body = await parseJSONBody(req) - const jobId = 'job-' + crypto.randomBytes(4).toString('hex') - const newJob = { - id: jobId, - name: body.name || `Experiment ${jobId}`, - created: new Date().toISOString(), - job_state: 'Scheduled', - accelerator: body.accelerator || 'cpu', - device_count: body.device_count || (body.accelerator === 'cpu' ? 0 : 1), - image: body.image || 'docker.io/library/python:3.11-slim', - cpu: body.cpu || '2', - memory: body.memory || '4Gi', - message: 'Job submitted; awaiting placement', - checkpoint_directory: `/outputs/checkpoints/${jobId}`, - output_directory: `/outputs/runs/${jobId}`, - working_directory: body.working_directory || '/workspace', - timeout_seconds: body.timeout_seconds || 3600, - team_id: activeTeam || 'legacy', - creator_id: currentUser?.id || 'usr_anonymous', - creator_name: currentUser?.name || 'Local Developer', - storage_scope: body.storage_scope || currentUser?.id || 'common', - can_cancel: true, - } - state.jobs.unshift(newJob) - state.jobLogs.set( - jobId, - `[${newJob.created}] Job created: ${newJob.name}\n[${newJob.created}] Image: ${newJob.image}\n[${newJob.created}] Queueing job on Kubernetes admission controller...\n`, - ) - sendJSON(res, 200, { - job_id: jobId, - job: newJob, - }) - return - } - - const jobCancelMatch = pathname.match(/^\/jobs\/([^/]+)\/cancel$/) - if (jobCancelMatch && req.method === 'POST') { - const jobId = decodeURIComponent(jobCancelMatch[1]) - const job = state.jobs.find((j) => j.id === jobId) - if (!job) return sendError(res, 404, 'Job not found') - job.job_state = 'Cancelled' - job.message = 'Cancelled by user' - job.can_cancel = false - const logs = state.jobLogs.get(jobId) || '' - state.jobLogs.set( - jobId, - logs + `[${new Date().toISOString()}] Job cancelled by user.\n`, - ) - sendJSON(res, 200, job) - return - } - - const jobLogsMatch = pathname.match(/^\/jobs\/([^/]+)\/logs$/) - if (jobLogsMatch && req.method === 'GET') { - const jobId = decodeURIComponent(jobLogsMatch[1]) - const logs = state.jobLogs.get(jobId) || 'No logs recorded for this job yet.' - sendJSON(res, 200, { logs }) - return - } - - const jobFilesMatch = pathname.match(/^\/jobs\/([^/]+)\/files$/) - if (jobFilesMatch && req.method === 'GET') { - const jobId = decodeURIComponent(jobFilesMatch[1]) - const files = state.jobFiles.get(jobId) || [] - sendJSON(res, 200, { files }) - return - } - - const jobDownloadMatch = pathname.match(/^\/jobs\/([^/]+)\/files\/download$/) - if (jobDownloadMatch && req.method === 'GET') { - const filePath = query.path || 'output.txt' - res.writeHead(200, { - 'Content-Type': 'text/plain; charset=utf-8', - 'Content-Disposition': `attachment; filename="${filePath.split('/').pop()}"`, - 'Access-Control-Allow-Origin': '*', - }) - res.end(`[Mock file content for ${filePath} from job]`) - return - } - - // ---------------------------------------------------- - // STORAGE & DATASETS ENDPOINTS - // ---------------------------------------------------- - - if (pathname === '/storage' && req.method === 'GET') { - const team = state.teams.find((t) => t.id === activeTeam) - const datasets = state.datasets.filter((d) => !activeTeam || d.team_id === activeTeam) - const jobs = state.jobs.filter((j) => !activeTeam || j.team_id === activeTeam) - sendJSON(res, 200, { - ...state.storage, - storage_mode: 'shared-folders', - storage_limits_enforced: false, - dataset_used_bytes: datasets.reduce((total, dataset) => total + dataset.size, 0), - model_used_bytes: jobs.reduce((total, job) => - total + (state.jobFiles.get(job.id) ?? []).reduce((sum, file) => sum + file.size, 0), 0), - dataset_allocation_gib: team?.policy.storage_gib ?? state.storage.dataset_allocation_gib, - model_allocation_gib: team?.policy.model_storage_gib ?? state.storage.model_allocation_gib, - usage_observed_at: new Date().toISOString(), - usage_stale: false, - storage_low: state.storage.available_bytes < state.storage.capacity_bytes / 10, - }) - return - } - - if (pathname === '/storage/folders' && req.method === 'GET') { - const folders = [] - for (const t of state.teams) { - folders.push({ - team_id: t.id, - team_name: t.name, - scope: 'common', - name: 'Common Space', - shared: false, - writable: true, - }) - for (const m of t.members) { - folders.push({ - team_id: t.id, - team_name: t.name, - scope: m.id, - name: `${m.name}'s Folder`, - shared: false, - writable: m.id === currentUser?.id, - }) - } - } - sendJSON(res, 200, { folders }) - return - } - - if (pathname === '/storage/files' && req.method === 'GET') { - if (query.download === 'true') { - const filePath = query.path || 'downloaded-file.dat' - res.writeHead(200, { - 'Content-Type': 'application/octet-stream', - 'Content-Disposition': `attachment; filename="${filePath.split('/').pop()}"`, - 'Access-Control-Allow-Origin': '*', - }) - res.end(`[Mock content of ${filePath} in team ${query.source_team}]`) - return - } - sendJSON(res, 200, { - files: [ - { - path: 'data/train_manifest.json', - size: 15360, - modified: new Date(Date.now() - 7200000).toISOString(), - }, - { - path: 'models/model_final.pt', - size: 89128960, - modified: new Date(Date.now() - 3600000).toISOString(), - }, - ], - }) - return - } - - if (pathname === '/datasets' && req.method === 'GET') { - let filtered = state.datasets - if (activeTeam) { - filtered = filtered.filter((d) => !d.team_id || d.team_id === activeTeam) - } - sendJSON(res, 200, { - datasets: filtered, - upload_limit_bytes: state.storage.upload_limit_bytes || 5368709120, - }) - return - } - - if (pathname === '/datasets' && req.method === 'POST') { - const filename = query.filename || 'dataset.bin' - const name = query.name || filename - const scope = query.scope || currentUser?.id || 'common' - const activeTeamObj = state.teams.find((t) => t.id === activeTeam) - - let totalBytes = 0 - req.on('data', (chunk) => { - totalBytes += chunk.length - }) - - req.on('end', () => { - const newDs = { - id: 'ds-' + crypto.randomBytes(4).toString('hex'), - name, - filename, - size: totalBytes || 1048576, - files: query.format === 'zip' ? 12 : 1, - sha256: crypto.randomBytes(32).toString('hex'), - created: new Date().toISOString(), - state: 'ready', - team_id: activeTeam || 'legacy', - team_name: activeTeamObj?.name || 'Legacy Workspace', - scope, - member_name: currentUser?.name || 'Local Pilot', - shared: false, - } - state.datasets.unshift(newDs) - sendJSON(res, 200, newDs) - }) - return - } - - const datasetDeleteMatch = pathname.match(/^\/datasets\/([^/]+)$/) - if (datasetDeleteMatch && req.method === 'DELETE') { - const datasetId = datasetDeleteMatch[1] - state.datasets = state.datasets.filter((d) => d.id !== datasetId) - sendJSON(res, 200, { success: true }) - return - } - - const datasetFilesMatch = pathname.match(/^\/datasets\/([^/]+)\/files$/) - if (datasetFilesMatch && req.method === 'GET') { - sendJSON(res, 200, { - files: [ - { - path: 'metadata.json', - size: 2048, - modified: new Date().toISOString(), - }, - { - path: 'samples/sample_001.png', - size: 45056, - modified: new Date().toISOString(), - }, - ], - }) - return - } - - const datasetDownloadMatch = pathname.match(/^\/datasets\/([^/]+)\/files\/download$/) - if (datasetDownloadMatch && req.method === 'GET') { - const filePath = query.path || 'dataset-file.dat' - res.writeHead(200, { - 'Content-Type': 'application/octet-stream', - 'Content-Disposition': `attachment; filename="${filePath.split('/').pop()}"`, - 'Access-Control-Allow-Origin': '*', - }) - res.end(`[Mock content of dataset file ${filePath}]`) - return - } - - if (pathname === '/healthz' && req.method === 'GET') { - sendJSON(res, 200, { status: 'ok', executor: 'fake-backend' }) - return - } - - sendError(res, 404, `Endpoint not found: ${req.method} ${pathname}`) - } catch (err) { - console.error('[Fake Backend Error]', err) - sendError(res, 500, 'Internal Server Error: ' + err.message) - } -}) - -server.listen(PORT, HOST, () => { - console.log(`======================================================`) - console.log(`Mist Fake Backend running at http://${HOST}:${PORT}`) - console.log(`Active Scenario: '${state.activeScenario}'`) - console.log(`Simulated User: ${state.users[state.currentUserIndex]?.name} (${state.users[state.currentUserIndex]?.role})`) - console.log(`Machines: ${state.machines.map((m) => m.name).join(', ')}`) - console.log(`Teams: ${state.teams.map((t) => t.name).join(', ')}`) - console.log(`Jobs: ${state.jobs.length} in history`) - console.log(`Run 'node scripts/configure-fake-backend.mjs' to modify`) - console.log(`======================================================`) -}) - -process.on('SIGINT', () => { - server.close(() => { - console.log('\nFake backend stopped.') - process.exit(0) - }) -}) diff --git a/src/app.go b/src/app.go deleted file mode 100644 index d74cd05..0000000 --- a/src/app.go +++ /dev/null @@ -1,122 +0,0 @@ -package main - -import ( - "context" - "log/slog" - "net" - "net/http" - "os" - "sync" - "time" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// App owns the HTTP gateway and the single team admission controller. -// Execution and persisted job state live in Kubernetes. -type App struct { - httpServer *http.Server - wg sync.WaitGroup - log *slog.Logger - executor *KubernetesExecutor - auth *AuthGateway - teams *TeamService -} - -func NewKubernetesApp(executor *KubernetesExecutor, log *slog.Logger) *App { - mux := http.NewServeMux() - a := &App{executor: executor, log: log, httpServer: &http.Server{ - Addr: envOr("MIST_HTTP_ADDR", "127.0.0.1:3000"), Handler: mux, - ReadHeaderTimeout: 5 * time.Second, ReadTimeout: 30 * time.Second, WriteTimeout: 60 * time.Second, IdleTimeout: 60 * time.Second}} - mux.HandleFunc("/session", func(w http.ResponseWriter, r *http.Request) { - writeJSON(w, 200, map[string]interface{}{"enabled": false, "user": nil}) - }) - mux.HandleFunc("/datasets", a.datasets) - mux.HandleFunc("/datasets/", a.dataset) - mux.HandleFunc("GET /storage", a.storageInfo) - mux.HandleFunc("GET /storage/folders", a.storageFolders) - mux.HandleFunc("GET /storage/files", a.storageFolderFiles) - authDisabled := os.Getenv("MIST_AUTH_DISABLED") == "true" - authDB := os.Getenv("MIST_AUTH_DATABASE") - authRequired := os.Getenv("MIST_AUTH_ENABLED") == "true" || - os.Getenv("MIST_TEAMS_ENABLED") == "true" || - os.Getenv("BETTER_AUTH_SECRET") != "" || - authDB != "" || - os.Getenv("MIST_AUTH_URL") != "" - - if !authDisabled && authRequired { - if authDB == "" { - authDB = "./data/auth.sqlite" - } - var err error - a.auth, err = newAuthService(authDB, log) - if err != nil { - panic(err) - } - if os.Getenv("MIST_TEAMS_ENABLED") == "true" { - if executor.storage == nil { - panic("team workspaces require shared storage") - } - a.teams = newTeamService(a) - mux.HandleFunc("/teams", a.teamEndpoint) - mux.HandleFunc("/teams/", a.teamEndpoint) - a.httpServer.Handler = a.auth.middleware(a.teams.middleware(mux)) - } else { - a.httpServer.Handler = a.auth.middleware(mux) - } - } - mux.HandleFunc("/jobs", a.kubernetesJobs) - mux.HandleFunc("/jobs/status", a.getJobStatus) - mux.HandleFunc("/jobs/", a.kubernetesJob) - mux.HandleFunc("GET /hardware", a.hardware) - mux.HandleFunc("GET /images", a.images) - mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) - return - } - _, err := executor.client.BatchV1().Jobs(executor.namespace).List(r.Context(), metav1.ListOptions{Limit: 1, LabelSelector: managedLabel + "=mist"}) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, map[string]string{"status": "ok", "executor": "kubernetes"}) - }) - return a -} - -func (a *App) Start() error { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - if _, err := a.executor.client.BatchV1().Jobs(a.executor.namespace).List(ctx, metav1.ListOptions{Limit: 1}); err != nil { - return err - } - listener, err := net.Listen("tcp", a.httpServer.Addr) - if err != nil { - return err - } - if a.teams != nil { - a.teams.start() - } - a.wg.Add(1) - go func() { - defer a.wg.Done() - a.log.Info("http server started", "address", listener.Addr().String()) - if err := a.httpServer.Serve(listener); err != nil && err != http.ErrServerClosed { - a.log.Error("HTTP server error", "error", err) - } - }() - return nil -} - -func (a *App) Shutdown(ctx context.Context) error { - err := a.httpServer.Shutdown(ctx) - a.wg.Wait() - if a.teams != nil { - a.teams.shutdown() - } - if a.auth != nil { - _ = a.auth.Close() - } - return err -} diff --git a/src/app_test.go b/src/app_test.go deleted file mode 100644 index 3590490..0000000 --- a/src/app_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package main - -import ( - "context" - "errors" - "io" - "log/slog" - "net/http" - "net/http/httptest" - "strings" - "testing" - - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes/fake" - clienttesting "k8s.io/client-go/testing" -) - -func TestAppStartupRejectsUnavailableKubernetes(t *testing.T) { - e := testExecutor() - unavailable := errors.New("cluster unavailable") - e.client.(*fake.Clientset).PrependReactor("list", "jobs", func(clienttesting.Action) (bool, runtime.Object, error) { - return true, nil, unavailable - }) - app := NewKubernetesApp(e, slog.New(slog.NewTextHandler(io.Discard, nil))) - if err := app.Start(); !errors.Is(err, unavailable) { - t.Fatalf("started gateway despite unavailable executor: %v", err) - } -} - -func TestKubernetesCompatibilityStatusUsesScopedExecutor(t *testing.T) { - e := testExecutor() - job, err := e.submit(context.Background(), CreateJobRequest{Command: []string{"true"}}) - if err != nil { - t.Fatal(err) - } - app := NewKubernetesApp(e, slog.New(slog.NewTextHandler(io.Discard, nil))) - for _, tc := range []struct { - method string - path string - want int - }{ - {http.MethodGet, "/jobs/status?id=" + job.ID, http.StatusOK}, - {http.MethodGet, "/jobs/status?id=unknown-job", http.StatusNotFound}, - {http.MethodGet, "/jobs/status", http.StatusBadRequest}, - {http.MethodPost, "/jobs/status?id=" + job.ID, http.StatusMethodNotAllowed}, - } { - t.Run(tc.method+tc.path, func(t *testing.T) { - response := httptest.NewRecorder() - app.httpServer.Handler.ServeHTTP(response, httptest.NewRequest(tc.method, tc.path, nil)) - if response.Code != tc.want { - t.Fatalf("status %d, wanted %d: %s", response.Code, tc.want, response.Body.String()) - } - if tc.want == http.StatusOK && !strings.Contains(response.Body.String(), job.ID) { - t.Fatal("compatibility endpoint did not return the managed Kubernetes job") - } - }) - } - other := *e - other.owner = "other-member" - otherApp := NewKubernetesApp(&other, app.log) - response := httptest.NewRecorder() - otherApp.httpServer.Handler.ServeHTTP(response, httptest.NewRequest(http.MethodGet, "/jobs/status?id="+job.ID, nil)) - if response.Code != http.StatusNotFound { - t.Fatalf("compatibility route leaked another owner's job: %d", response.Code) - } -} diff --git a/src/auth.go b/src/auth.go deleted file mode 100644 index f8d1fe1..0000000 --- a/src/auth.go +++ /dev/null @@ -1,879 +0,0 @@ -package main - -import ( - "context" - "crypto/rand" - "crypto/subtle" - "database/sql" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "log/slog" - "net/http" - "os" - "path/filepath" - "strconv" - "strings" - "sync" - "time" - - "golang.org/x/crypto/bcrypt" - "golang.org/x/crypto/scrypt" - "golang.org/x/text/unicode/norm" - _ "modernc.org/sqlite" -) - -type AuthService struct { - db *sql.DB - log *slog.Logger - origins map[string]bool - legacyEmail string - mu sync.Mutex -} - -func newAuthService(dbPath string, log *slog.Logger) (*AuthService, error) { - if log == nil { - log = slog.Default() - } - if dbPath == "" { - dbPath = envOr("MIST_AUTH_DATABASE", "./data/auth.sqlite") - } - if dbPath != ":memory:" && !strings.HasPrefix(dbPath, "file:") { - if err := os.MkdirAll(filepath.Dir(dbPath), 0700); err != nil { - return nil, fmt.Errorf("auth db dir: %w", err) - } - } - - db, err := sql.Open("sqlite", dbPath) - if err != nil { - return nil, fmt.Errorf("open auth db: %w", err) - } - - for _, pragma := range []string{ - "PRAGMA journal_mode = WAL;", - "PRAGMA busy_timeout = 5000;", - "PRAGMA foreign_keys = ON;", - } { - if _, err := db.Exec(pragma); err != nil { - log.Debug("auth pragma", "pragma", pragma, "error", err) - } - } - - schema := ` - CREATE TABLE IF NOT EXISTS user ( - id TEXT PRIMARY KEY, - name TEXT NOT NULL, - email TEXT NOT NULL UNIQUE, - emailVerified INTEGER DEFAULT 0, - image TEXT, - createdAt TEXT NOT NULL, - updatedAt TEXT NOT NULL, - role TEXT DEFAULT 'user', - banned INTEGER NOT NULL DEFAULT 0 - ); - - CREATE TABLE IF NOT EXISTS session ( - id TEXT PRIMARY KEY, - token TEXT NOT NULL UNIQUE, - userId TEXT NOT NULL, - expiresAt TEXT NOT NULL, - createdAt TEXT NOT NULL, - updatedAt TEXT NOT NULL, - ipAddress TEXT, - userAgent TEXT, - impersonatedBy TEXT, - FOREIGN KEY(userId) REFERENCES user(id) ON DELETE CASCADE - ); - - CREATE TABLE IF NOT EXISTS account ( - id TEXT PRIMARY KEY, - userId TEXT NOT NULL, - accountId TEXT NOT NULL, - providerId TEXT NOT NULL, - password TEXT, - createdAt TEXT NOT NULL, - updatedAt TEXT NOT NULL, - FOREIGN KEY(userId) REFERENCES user(id) ON DELETE CASCADE - ); - - CREATE TABLE IF NOT EXISTS rate_limit ( - key TEXT PRIMARY KEY, - count INTEGER NOT NULL, - lastRequest INTEGER NOT NULL - ); - ` - if _, err := db.Exec(schema); err != nil { - db.Close() - return nil, fmt.Errorf("init auth schema: %w", err) - } - // Preserve deactivated Better Auth accounts, and upgrade Go-auth databases - // created before that compatibility column was retained. - var hasBanned int - if err := db.QueryRow("SELECT COUNT(*) FROM pragma_table_info('user') WHERE name='banned'").Scan(&hasBanned); err != nil { - db.Close() - return nil, err - } - if hasBanned == 0 { - if _, err := db.Exec("ALTER TABLE user ADD COLUMN banned INTEGER NOT NULL DEFAULT 0"); err != nil { - db.Close() - return nil, err - } - } - - s := &AuthService{ - db: db, - log: log, - origins: map[string]bool{}, - legacyEmail: os.Getenv("MIST_LEGACY_OWNER_EMAIL"), - } - - defaultOrigins := []string{ - "http://127.0.0.1:3000", - "http://127.0.0.1:3001", - "http://localhost:3000", - "http://localhost:3001", - "http://127.0.0.1:8088", - "http://localhost:8088", - } - for _, o := range defaultOrigins { - s.origins[o] = true - } - if siteOrigin := os.Getenv("MIST_SITE_ORIGIN"); siteOrigin != "" { - s.origins[strings.TrimSpace(siteOrigin)] = true - } - for _, o := range strings.Split(os.Getenv("MIST_ALLOWED_ORIGINS"), ",") { - if o = strings.TrimSpace(o); o != "" { - s.origins[o] = true - } - } - - if err := s.bootstrapAdmin(); err != nil { - log.Warn("bootstrap admin failed", "error", err) - } - - return s, nil -} - -func (s *AuthService) Close() error { - if s.db != nil { - return s.db.Close() - } - return nil -} - -func (s *AuthService) bootstrapAdmin() error { - var count int - if err := s.db.QueryRow("SELECT COUNT(*) FROM user").Scan(&count); err != nil { - return err - } - if count > 0 { - return nil - } - email := os.Getenv("MIST_ADMIN_EMAIL") - password := os.Getenv("MIST_ADMIN_PASSWORD") - if email == "" || password == "" || len(password) < 12 { - return nil - } - hashed, err := hashPassword(password) - if err != nil { - return err - } - now := time.Now().UTC().Format(time.RFC3339Nano) - userID := "user-" + randomToken(12) - tx, err := s.db.Begin() - if err != nil { - return err - } - defer tx.Rollback() - - _, err = tx.Exec(` - INSERT INTO user (id, name, email, role, emailVerified, createdAt, updatedAt) - VALUES (?, ?, ?, 'admin', 0, ?, ?) - `, userID, "Mist Administrator", email, now, now) - if err != nil { - return err - } - - accountID := "acc-" + randomToken(12) - _, err = tx.Exec(` - INSERT INTO account (id, userId, accountId, providerId, password, createdAt, updatedAt) - VALUES (?, ?, ?, 'credential', ?, ?, ?) - `, accountID, userID, email, hashed, now, now) - if err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - s.log.Info("Initial Mist administrator created; credentials are not logged") - return nil -} - -func randomToken(byteCount int) string { - b := make([]byte, byteCount) - _, _ = rand.Read(b) - return hex.EncodeToString(b) -} - -func hashPassword(password string) (string, error) { - hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) - return string(hash), err -} - -func verifyPassword(hashed, password string) bool { - if strings.HasPrefix(hashed, "$2a$") || strings.HasPrefix(hashed, "$2b$") { - return bcrypt.CompareHashAndPassword([]byte(hashed), []byte(password)) == nil - } - parts := strings.Split(hashed, ":") - if len(parts) == 2 && len(parts[0]) == 32 && len(parts[1]) == 128 { - _, saltErr := hex.DecodeString(parts[0]) - expected, err := hex.DecodeString(parts[1]) - if saltErr == nil && err == nil { - // Better Auth uses the hex salt text (not decoded bytes), NFKC - // normalization and scrypt r=16. Preserve existing account logins. - derived, err := scrypt.Key([]byte(norm.NFKC.String(password)), []byte(parts[0]), 16384, 16, 1, 64) - return err == nil && subtle.ConstantTimeCompare(derived, expected) == 1 - } - } - return false -} - -func (s *AuthService) checkRateLimit(key string, windowSec int64, maxReq int) bool { - s.mu.Lock() - defer s.mu.Unlock() - now := time.Now().Unix() - var count int - var lastRequest int64 - err := s.db.QueryRow("SELECT count, lastRequest FROM rate_limit WHERE key = ?", key).Scan(&count, &lastRequest) - if err == sql.ErrNoRows { - _, _ = s.db.Exec("INSERT INTO rate_limit (key, count, lastRequest) VALUES (?, 1, ?)", key, now) - return true - } else if err != nil { - return true - } - if now-lastRequest > windowSec { - _, _ = s.db.Exec("UPDATE rate_limit SET count = 1, lastRequest = ? WHERE key = ?", now, key) - return true - } - if count >= maxReq { - return false - } - _, _ = s.db.Exec("UPDATE rate_limit SET count = count + 1 WHERE key = ?", key) - return true -} - -func extractSessionToken(r *http.Request) string { - for _, cookieName := range []string{"better-auth.session_token", "session_token"} { - if c, err := r.Cookie(cookieName); err == nil && c.Value != "" { - val := c.Value - if idx := strings.Index(val, "."); idx != -1 { - val = val[:idx] - } - return val - } - } - cookieHeader := r.Header.Get("Cookie") - for _, part := range strings.Split(cookieHeader, ";") { - part = strings.TrimSpace(part) - for _, name := range []string{"better-auth.session_token=", "session_token="} { - if strings.HasPrefix(part, name) { - val := strings.TrimPrefix(part, name) - if idx := strings.Index(val, "."); idx != -1 { - val = val[:idx] - } - return val - } - } - } - return "" -} - -func (s *AuthService) session(r *http.Request) (*Member, error) { - token := extractSessionToken(r) - if token == "" { - return nil, nil - } - now := time.Now().UTC().Format(time.RFC3339Nano) - var m Member - err := s.db.QueryRowContext(r.Context(), ` - SELECT u.id, u.name, u.email, u.role - FROM session s - JOIN user u ON s.userId = u.id - WHERE s.token = ? AND s.expiresAt > ? AND COALESCE(u.banned, 0) = 0 - `, token, now).Scan(&m.ID, &m.Name, &m.Email, &m.Role) - if err == nil { - return &m, nil - } else if !errors.Is(err, sql.ErrNoRows) { - return nil, err - } - - return nil, nil -} - -func (s *AuthService) activeMembers(ctx context.Context) (map[string]AccountStatus, error) { - rows, err := s.db.QueryContext(ctx, "SELECT id, role FROM user WHERE COALESCE(banned, 0) = 0") - if err != nil { - return nil, err - } - defer rows.Close() - result := map[string]AccountStatus{} - for rows.Next() { - var id, role string - if err := rows.Scan(&id, &role); err != nil { - return nil, err - } - result[id] = AccountStatus{Role: role} - } - return result, rows.Err() -} - -func (s *AuthService) LookupMember(ctx context.Context, id string) (*Member, error) { - var m Member - err := s.db.QueryRowContext(ctx, "SELECT id, name, email, role FROM user WHERE id = ? AND COALESCE(banned, 0) = 0", id). - Scan(&m.ID, &m.Name, &m.Email, &m.Role) - if err != nil { - return nil, errors.New("account unavailable") - } - return &m, nil -} - -func (s *AuthService) lookupMember(r *http.Request, id string) (*Member, error) { - return s.LookupMember(r.Context(), id) -} - -func writeAuthError(w http.ResponseWriter, status int, message, code string) { - resp := map[string]interface{}{"message": message} - if code != "" { - resp["code"] = code - } - writeJSON(w, status, resp) -} - -func setSessionCookies(w http.ResponseWriter, token string, maxAge int, isSecure bool) { - for _, name := range []string{"better-auth.session_token", "session_token"} { - cookie := &http.Cookie{ - Name: name, - Value: token, - Path: "/", - MaxAge: maxAge, - HttpOnly: true, - SameSite: http.SameSiteLaxMode, - Secure: isSecure, - } - if maxAge < 0 { - cookie.Expires = time.Unix(0, 0) - } else { - cookie.Expires = time.Now().Add(time.Duration(maxAge) * time.Second) - } - http.SetCookie(w, cookie) - } -} - -func (s *AuthService) ServeHTTP(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "no-store") - path := r.URL.Path - - switch { - case path == "/auth/sign-in/email" && r.Method == http.MethodPost: - s.handleSignInEmail(w, r) - case path == "/auth/sign-out" && r.Method == http.MethodPost: - s.handleSignOut(w, r) - case path == "/auth/get-session" && r.Method == http.MethodGet: - s.handleGetSession(w, r) - case path == "/auth/change-password" && r.Method == http.MethodPost: - s.handleChangePassword(w, r) - case path == "/auth/admin/list-users" && r.Method == http.MethodGet: - s.handleListUsers(w, r) - case path == "/auth/admin/create-user" && r.Method == http.MethodPost: - s.handleCreateUser(w, r) - case path == "/auth/admin/set-user-password" && r.Method == http.MethodPost: - s.handleSetUserPassword(w, r) - case (path == "/auth/admin/revoke-user-sessions" || path == "/auth/admin/revoke-user-session") && r.Method == http.MethodPost: - s.handleRevokeUserSessions(w, r) - case path == "/auth/admin/get-user" && r.Method == http.MethodGet: - s.handleGetUser(w, r) - case path == "/auth/healthz" && r.Method == http.MethodGet: - s.handleHealthz(w, r) - default: - writeAuthError(w, 404, "Endpoint not found", "NOT_FOUND") - } -} - -func (s *AuthService) handleSignInEmail(w http.ResponseWriter, r *http.Request) { - ip := clientAddress(r) - if !s.checkRateLimit("sign-in:"+ip, 60, 8) { - writeAuthError(w, 429, "Too many login attempts. Please try again later.", "TOO_MANY_REQUESTS") - return - } - var req struct { - Email string `json:"email"` - Password string `json:"password"` - } - if err := json.NewDecoder(io.LimitReader(r.Body, 64*1024)).Decode(&req); err != nil { - writeAuthError(w, 400, "Invalid request body", "BAD_REQUEST") - return - } - req.Email = strings.TrimSpace(req.Email) - if req.Email == "" || req.Password == "" { - writeAuthError(w, 400, "Email and password are required", "BAD_REQUEST") - return - } - - var user struct { - ID string - Name string - Email string - Role string - CreatedAt string - UpdatedAt string - } - err := s.db.QueryRowContext(r.Context(), ` - SELECT id, name, email, role, createdAt, updatedAt - FROM user - WHERE LOWER(email) = LOWER(?) AND COALESCE(banned, 0) = 0 - `, req.Email).Scan(&user.ID, &user.Name, &user.Email, &user.Role, &user.CreatedAt, &user.UpdatedAt) - if errors.Is(err, sql.ErrNoRows) { - writeAuthError(w, 401, "Invalid email or password", "INVALID_EMAIL_OR_PASSWORD") - return - } else if err != nil { - writeAuthError(w, 500, "Authentication failed", "INTERNAL_ERROR") - return - } - - var hashedPassword string - err = s.db.QueryRowContext(r.Context(), "SELECT password FROM account WHERE userId = ?", user.ID).Scan(&hashedPassword) - if err != nil || !verifyPassword(hashedPassword, req.Password) { - writeAuthError(w, 401, "Invalid email or password", "INVALID_EMAIL_OR_PASSWORD") - return - } - - token := randomToken(24) - sessionID := "sess-" + randomToken(12) - now := time.Now().UTC() - expiresAt := now.Add(7 * 24 * time.Hour).Format(time.RFC3339Nano) - createdAt := now.Format(time.RFC3339Nano) - userAgent := r.UserAgent() - - _, err = s.db.ExecContext(r.Context(), ` - INSERT INTO session (id, token, userId, expiresAt, createdAt, updatedAt, ipAddress, userAgent) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) - `, sessionID, token, user.ID, expiresAt, createdAt, createdAt, ip, userAgent) - if err != nil { - writeAuthError(w, 500, "Failed to create session", "INTERNAL_ERROR") - return - } - - isSecure := strings.HasPrefix(os.Getenv("MIST_SITE_ORIGIN"), "https:") || r.TLS != nil - setSessionCookies(w, token, 604800, isSecure) - - writeJSON(w, 200, map[string]interface{}{ - "redirect": false, - "token": token, - "user": map[string]interface{}{ - "id": user.ID, - "name": user.Name, - "email": user.Email, - "role": user.Role, - "emailVerified": false, - "createdAt": user.CreatedAt, - "updatedAt": user.UpdatedAt, - }, - }) -} - -func (s *AuthService) handleSignOut(w http.ResponseWriter, r *http.Request) { - token := extractSessionToken(r) - if token != "" { - _, _ = s.db.ExecContext(r.Context(), "DELETE FROM session WHERE token = ?", token) - } - isSecure := strings.HasPrefix(os.Getenv("MIST_SITE_ORIGIN"), "https:") || r.TLS != nil - setSessionCookies(w, "", -1, isSecure) - writeJSON(w, 200, map[string]interface{}{"success": true}) -} - -func (s *AuthService) handleGetSession(w http.ResponseWriter, r *http.Request) { - token := extractSessionToken(r) - if token == "" { - writeJSON(w, 200, map[string]interface{}{"user": nil, "session": nil}) - return - } - now := time.Now().UTC().Format(time.RFC3339Nano) - var user Member - var sess struct { - ID string - UserID string - Token string - ExpiresAt string - } - err := s.db.QueryRowContext(r.Context(), ` - SELECT u.id, u.name, u.email, u.role, s.id, s.userId, s.token, s.expiresAt - FROM session s - JOIN user u ON s.userId = u.id - WHERE s.token = ? AND s.expiresAt > ? AND COALESCE(u.banned, 0) = 0 - `, token, now).Scan(&user.ID, &user.Name, &user.Email, &user.Role, - &sess.ID, &sess.UserID, &sess.Token, &sess.ExpiresAt) - if err == nil { - writeJSON(w, 200, map[string]interface{}{ - "user": user, - "session": map[string]interface{}{ - "id": sess.ID, - "userId": sess.UserID, - "token": sess.Token, - "expiresAt": sess.ExpiresAt, - }, - }) - return - } - - writeJSON(w, 200, map[string]interface{}{"user": nil, "session": nil}) -} - -func (s *AuthService) handleChangePassword(w http.ResponseWriter, r *http.Request) { - member, err := s.session(r) - if err != nil || member == nil { - writeAuthError(w, 401, "Sign in to Mist", "UNAUTHORIZED") - return - } - var req struct { - CurrentPassword string `json:"currentPassword"` - NewPassword string `json:"newPassword"` - RevokeOtherSessions bool `json:"revokeOtherSessions"` - } - if err := json.NewDecoder(io.LimitReader(r.Body, 64*1024)).Decode(&req); err != nil { - writeAuthError(w, 400, "Invalid request body", "BAD_REQUEST") - return - } - if len(req.NewPassword) < 12 || len(req.NewPassword) > 128 { - writeAuthError(w, 400, "Password must contain 12–128 characters", "BAD_REQUEST") - return - } - var currentHashed string - err = s.db.QueryRowContext(r.Context(), "SELECT password FROM account WHERE userId = ?", member.ID).Scan(¤tHashed) - if err != nil || !verifyPassword(currentHashed, req.CurrentPassword) { - writeAuthError(w, 400, "Invalid current password", "BAD_REQUEST") - return - } - newHashed, err := hashPassword(req.NewPassword) - if err != nil { - writeAuthError(w, 500, "Failed to hash password", "INTERNAL_ERROR") - return - } - now := time.Now().UTC().Format(time.RFC3339Nano) - _, err = s.db.ExecContext(r.Context(), "UPDATE account SET password = ?, updatedAt = ? WHERE userId = ?", newHashed, now, member.ID) - if err != nil { - writeAuthError(w, 500, "Failed to update password", "INTERNAL_ERROR") - return - } - token := extractSessionToken(r) - if req.RevokeOtherSessions && token != "" { - _, _ = s.db.ExecContext(r.Context(), "DELETE FROM session WHERE userId = ? AND token != ?", member.ID, token) - } - writeJSON(w, 200, map[string]interface{}{"status": true, "token": token}) -} - -func (s *AuthService) handleListUsers(w http.ResponseWriter, r *http.Request) { - member, err := s.session(r) - if err != nil || !isAdmin(member) { - writeAuthError(w, 403, "Administrator access required", "FORBIDDEN") - return - } - limit := 1000 - if raw := r.URL.Query().Get("limit"); raw != "" { - if val, err := strconv.Atoi(raw); err == nil && val > 0 && val <= 1000 { - limit = val - } - } - rows, err := s.db.QueryContext(r.Context(), ` - SELECT id, name, email, role, createdAt, updatedAt - FROM user - ORDER BY createdAt DESC - LIMIT ? - `, limit) - if err != nil { - writeAuthError(w, 500, "Failed to query members", "INTERNAL_ERROR") - return - } - defer rows.Close() - - type userRecord struct { - ID string `json:"id"` - Name string `json:"name"` - Email string `json:"email"` - Role string `json:"role"` - CreatedAt string `json:"createdAt"` - UpdatedAt string `json:"updatedAt"` - } - users := []userRecord{} - for rows.Next() { - var u userRecord - if err := rows.Scan(&u.ID, &u.Name, &u.Email, &u.Role, &u.CreatedAt, &u.UpdatedAt); err != nil { - writeAuthError(w, 500, "Failed to scan members", "INTERNAL_ERROR") - return - } - users = append(users, u) - } - var total int - _ = s.db.QueryRowContext(r.Context(), "SELECT COUNT(*) FROM user").Scan(&total) - writeJSON(w, 200, map[string]interface{}{ - "users": users, - "total": total, - }) -} - -func (s *AuthService) handleCreateUser(w http.ResponseWriter, r *http.Request) { - member, err := s.session(r) - if err != nil || !isAdmin(member) { - writeAuthError(w, 403, "Administrator access required", "FORBIDDEN") - return - } - var req struct { - Name string `json:"name"` - Email string `json:"email"` - Password string `json:"password"` - Role string `json:"role"` - } - if err := json.NewDecoder(io.LimitReader(r.Body, 64*1024)).Decode(&req); err != nil { - writeAuthError(w, 400, "Invalid request body", "BAD_REQUEST") - return - } - req.Name = strings.TrimSpace(req.Name) - req.Email = strings.TrimSpace(req.Email) - if req.Name == "" || req.Email == "" { - writeAuthError(w, 400, "Name and email are required", "BAD_REQUEST") - return - } - if len(req.Password) < 12 || len(req.Password) > 128 { - writeAuthError(w, 400, "Password must contain 12–128 characters", "BAD_REQUEST") - return - } - if req.Role == "" { - req.Role = "user" - } - - var existing string - err = s.db.QueryRowContext(r.Context(), "SELECT id FROM user WHERE LOWER(email) = LOWER(?)", req.Email).Scan(&existing) - if err == nil { - writeAuthError(w, 400, "Email already exists", "EMAIL_EXISTS") - return - } - - hashed, err := hashPassword(req.Password) - if err != nil { - writeAuthError(w, 500, "Failed to hash password", "INTERNAL_ERROR") - return - } - - userID := "user-" + randomToken(12) - now := time.Now().UTC().Format(time.RFC3339Nano) - tx, err := s.db.BeginTx(r.Context(), nil) - if err != nil { - writeAuthError(w, 500, "Failed to start transaction", "INTERNAL_ERROR") - return - } - defer tx.Rollback() - - _, err = tx.ExecContext(r.Context(), ` - INSERT INTO user (id, name, email, role, emailVerified, createdAt, updatedAt) - VALUES (?, ?, ?, ?, 0, ?, ?) - `, userID, req.Name, req.Email, req.Role, now, now) - if err != nil { - writeAuthError(w, 500, "Failed to create user", "INTERNAL_ERROR") - return - } - - accountID := "acc-" + randomToken(12) - _, err = tx.ExecContext(r.Context(), ` - INSERT INTO account (id, userId, accountId, providerId, password, createdAt, updatedAt) - VALUES (?, ?, ?, 'credential', ?, ?, ?) - `, accountID, userID, req.Email, hashed, now, now) - if err != nil { - writeAuthError(w, 500, "Failed to create account", "INTERNAL_ERROR") - return - } - - if err := tx.Commit(); err != nil { - writeAuthError(w, 500, "Failed to commit user creation", "INTERNAL_ERROR") - return - } - - writeJSON(w, 200, map[string]interface{}{ - "user": map[string]interface{}{ - "id": userID, - "name": req.Name, - "email": req.Email, - "role": req.Role, - "createdAt": now, - "updatedAt": now, - }, - }) -} - -func (s *AuthService) handleSetUserPassword(w http.ResponseWriter, r *http.Request) { - member, err := s.session(r) - if err != nil || !isAdmin(member) { - writeAuthError(w, 403, "Administrator access required", "FORBIDDEN") - return - } - var req struct { - UserID string `json:"userId"` - NewPassword string `json:"newPassword"` - } - if err := json.NewDecoder(io.LimitReader(r.Body, 64*1024)).Decode(&req); err != nil { - writeAuthError(w, 400, "Invalid request body", "BAD_REQUEST") - return - } - if req.UserID == "" { - writeAuthError(w, 400, "User ID is required", "BAD_REQUEST") - return - } - if len(req.NewPassword) < 12 || len(req.NewPassword) > 128 { - writeAuthError(w, 400, "Password must contain 12–128 characters", "BAD_REQUEST") - return - } - hashed, err := hashPassword(req.NewPassword) - if err != nil { - writeAuthError(w, 500, "Failed to hash password", "INTERNAL_ERROR") - return - } - now := time.Now().UTC().Format(time.RFC3339Nano) - res, err := s.db.ExecContext(r.Context(), "UPDATE account SET password = ?, updatedAt = ? WHERE userId = ?", hashed, now, req.UserID) - if err != nil { - writeAuthError(w, 500, "Failed to update password", "INTERNAL_ERROR") - return - } - if rows, _ := res.RowsAffected(); rows == 0 { - var email string - err = s.db.QueryRowContext(r.Context(), "SELECT email FROM user WHERE id = ?", req.UserID).Scan(&email) - if err != nil { - writeAuthError(w, 404, "User not found", "USER_NOT_FOUND") - return - } - accountID := "acc-" + randomToken(12) - _, _ = s.db.ExecContext(r.Context(), ` - INSERT INTO account (id, userId, accountId, providerId, password, createdAt, updatedAt) - VALUES (?, ?, ?, 'credential', ?, ?, ?) - `, accountID, req.UserID, email, hashed, now, now) - } - writeJSON(w, 200, map[string]interface{}{"status": true}) -} - -func (s *AuthService) handleRevokeUserSessions(w http.ResponseWriter, r *http.Request) { - member, err := s.session(r) - if err != nil || !isAdmin(member) { - writeAuthError(w, 403, "Administrator access required", "FORBIDDEN") - return - } - var req struct { - UserID string `json:"userId"` - } - if err := json.NewDecoder(io.LimitReader(r.Body, 64*1024)).Decode(&req); err != nil { - writeAuthError(w, 400, "Invalid request body", "BAD_REQUEST") - return - } - if req.UserID != "" { - _, _ = s.db.ExecContext(r.Context(), "DELETE FROM session WHERE userId = ?", req.UserID) - } - writeJSON(w, 200, map[string]interface{}{"status": true}) -} - -func (s *AuthService) handleGetUser(w http.ResponseWriter, r *http.Request) { - member, err := s.session(r) - if err != nil || member == nil { - writeAuthError(w, 401, "Sign in to Mist", "UNAUTHORIZED") - return - } - id := r.URL.Query().Get("id") - if id == "" { - id = member.ID - } - if id != member.ID && !isAdmin(member) { - writeAuthError(w, 403, "Administrator access required", "FORBIDDEN") - return - } - var u Member - err = s.db.QueryRowContext(r.Context(), "SELECT id, name, email, role FROM user WHERE id = ?", id). - Scan(&u.ID, &u.Name, &u.Email, &u.Role) - if err != nil { - writeAuthError(w, 404, "User not found", "USER_NOT_FOUND") - return - } - writeJSON(w, 200, u) -} - -func (s *AuthService) handleInternalMembers(w http.ResponseWriter, r *http.Request) { - configured := os.Getenv("MIST_INTERNAL_TOKEN") - authHeader := r.Header.Get("Authorization") - presented := strings.TrimPrefix(authHeader, "Bearer ") - if configured == "" || len(configured) < 32 || subtle.ConstantTimeCompare([]byte(configured), []byte(presented)) != 1 { - writeJSON(w, 403, map[string]string{"error": "Forbidden"}) - return - } - active, err := s.activeMembers(r.Context()) - if err != nil { - writeJSON(w, 500, map[string]string{"error": "Failed to read members"}) - return - } - type memberEntry struct { - ID string `json:"id"` - Role string `json:"role"` - } - var list []memberEntry - for id, status := range active { - list = append(list, memberEntry{ID: id, Role: status.Role}) - } - writeJSON(w, 200, map[string]interface{}{"members": list}) -} - -func (s *AuthService) handleHealthz(w http.ResponseWriter, r *http.Request) { - var one int - if err := s.db.QueryRowContext(r.Context(), "SELECT 1").Scan(&one); err != nil { - w.WriteHeader(503) - _, _ = w.Write([]byte("database unavailable")) - return - } - w.WriteHeader(200) - _, _ = w.Write([]byte("ok")) -} - -func (s *AuthService) middleware(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "no-store") - if r.URL.Path == "/healthz" { - next.ServeHTTP(w, r) - return - } - if strings.HasPrefix(r.URL.Path, "/auth/") { - r.Body = http.MaxBytesReader(w, r.Body, 64*1024) - s.ServeHTTP(w, r) - return - } - if r.URL.Path == "/internal/members" && r.Method == http.MethodGet { - s.handleInternalMembers(w, r) - return - } - member, err := s.session(r) - if err != nil { - writeJSON(w, 503, map[string]string{"error": "Authentication service unavailable"}) - return - } - if r.URL.Path == "/session" && r.Method == http.MethodGet { - writeJSON(w, 200, map[string]interface{}{"enabled": true, "user": member}) - return - } - if member == nil { - writeJSON(w, 401, map[string]string{"error": "Sign in to Mist"}) - return - } - if r.Method != http.MethodGet && r.Method != http.MethodHead { - origin := r.Header.Get("Origin") - if (origin != "" && !s.origins[origin]) || r.Header.Get("Sec-Fetch-Site") == "cross-site" { - writeJSON(w, 403, map[string]string{"error": "Untrusted request origin"}) - return - } - } - next.ServeHTTP(w, r.WithContext(context.WithValue(r.Context(), memberKey{}, member))) - }) -} diff --git a/src/auth_test.go b/src/auth_test.go deleted file mode 100644 index 9432a5d..0000000 --- a/src/auth_test.go +++ /dev/null @@ -1,389 +0,0 @@ -package main - -import ( - "bytes" - "context" - "database/sql" - "encoding/json" - "io" - "log/slog" - "net/http/httptest" - "path/filepath" - "strings" - "testing" - "time" -) - -func newTestAuthService(t *testing.T) *AuthService { - t.Helper() - dbPath := filepath.Join(t.TempDir(), "test-auth.sqlite") - s, err := newAuthService(dbPath, slog.New(slog.NewTextHandler(io.Discard, nil))) - if err != nil { - t.Fatal(err) - } - t.Cleanup(func() { s.Close() }) - return s -} - -func authRequest(s *AuthService, method, path string, body any, cookie string) *httptest.ResponseRecorder { - var reader io.Reader - if body != nil { - data, _ := json.Marshal(body) - reader = bytes.NewReader(data) - } - req := httptest.NewRequest(method, path, reader) - if cookie != "" { - req.Header.Set("Cookie", cookie) - } - rec := httptest.NewRecorder() - s.ServeHTTP(rec, req) - return rec -} - -func TestAuthService_BootstrapAdmin(t *testing.T) { - t.Setenv("MIST_ADMIN_EMAIL", "admin@mist.local") - t.Setenv("MIST_ADMIN_PASSWORD", "adminpassword123") - s := newTestAuthService(t) - - var count int - if err := s.db.QueryRow("SELECT COUNT(*) FROM user WHERE role = 'admin'").Scan(&count); err != nil { - t.Fatal(err) - } - if count != 1 { - t.Fatalf("expected 1 admin user, got %d", count) - } - - rec := authRequest(s, "POST", "/auth/sign-in/email", map[string]string{ - "email": "admin@mist.local", - "password": "adminpassword123", - }, "") - if rec.Code != 200 { - t.Fatalf("expected 200 login for bootstrap admin, got %d %s", rec.Code, rec.Body.String()) - } -} - -func TestAuthService_SignInAndSessionLifecycle(t *testing.T) { - s := newTestAuthService(t) - - // Create user - hashed, _ := hashPassword("initialpassword123") - _, err := s.db.Exec(`INSERT INTO user (id, name, email, role, createdAt, updatedAt) VALUES ('u1', 'Test User', 'user@mist.local', 'user', datetime('now'), datetime('now'))`) - if err != nil { - t.Fatal(err) - } - _, err = s.db.Exec(`INSERT INTO account (id, userId, accountId, providerId, password, createdAt, updatedAt) VALUES ('a1', 'u1', 'user@mist.local', 'credential', ?, datetime('now'), datetime('now'))`, hashed) - if err != nil { - t.Fatal(err) - } - - // Bad password - rec := authRequest(s, "POST", "/auth/sign-in/email", map[string]string{ - "email": "user@mist.local", - "password": "wrongpassword123", - }, "") - if rec.Code != 401 { - t.Fatalf("expected 401 for wrong password, got %d", rec.Code) - } - - // Non-existent user - rec = authRequest(s, "POST", "/auth/sign-in/email", map[string]string{ - "email": "nobody@mist.local", - "password": "wrongpassword123", - }, "") - if rec.Code != 401 { - t.Fatalf("expected 401 for non-existent user, got %d", rec.Code) - } - - // Valid login - rec = authRequest(s, "POST", "/auth/sign-in/email", map[string]string{ - "email": "user@mist.local", - "password": "initialpassword123", - }, "") - if rec.Code != 200 { - t.Fatalf("expected 200 for valid login, got %d %s", rec.Code, rec.Body.String()) - } - - cookie := rec.Header().Get("Set-Cookie") - if !strings.Contains(cookie, "better-auth.session_token=") { - t.Fatalf("missing better-auth.session_token cookie: %s", cookie) - } - - // Parse session token from cookie - var sessionToken string - for _, c := range rec.Result().Cookies() { - if c.Name == "better-auth.session_token" { - sessionToken = c.Value - } - } - if sessionToken == "" { - t.Fatal("empty session token") - } - - // Get session - rec = authRequest(s, "GET", "/auth/get-session", nil, "better-auth.session_token="+sessionToken) - if rec.Code != 200 { - t.Fatalf("expected 200 get-session, got %d", rec.Code) - } - var sessResp struct { - User *Member `json:"user"` - } - if err := json.Unmarshal(rec.Body.Bytes(), &sessResp); err != nil { - t.Fatal(err) - } - if sessResp.User == nil || sessResp.User.ID != "u1" { - t.Fatalf("unexpected session response: %+v", sessResp.User) - } - - // Change password - rec = authRequest(s, "POST", "/auth/change-password", map[string]any{ - "currentPassword": "initialpassword123", - "newPassword": "newpassword12345", - "revokeOtherSessions": true, - }, "better-auth.session_token="+sessionToken) - if rec.Code != 200 { - t.Fatalf("expected 200 change-password, got %d %s", rec.Code, rec.Body.String()) - } - - // Sign out - rec = authRequest(s, "POST", "/auth/sign-out", map[string]string{}, "better-auth.session_token="+sessionToken) - if rec.Code != 200 { - t.Fatalf("expected 200 sign-out, got %d", rec.Code) - } - - // Get session after logout -> should be nil - rec = authRequest(s, "GET", "/auth/get-session", nil, "better-auth.session_token="+sessionToken) - if rec.Code != 200 { - t.Fatalf("expected 200 get-session after logout, got %d", rec.Code) - } - json.Unmarshal(rec.Body.Bytes(), &sessResp) - if sessResp.User != nil { - t.Fatalf("expected nil user after logout, got %+v", sessResp.User) - } -} - -func TestAuthService_AdminUserManagement(t *testing.T) { - s := newTestAuthService(t) - - // Seed admin and user - hashed, _ := hashPassword("adminpassword123") - _, _ = s.db.Exec(`INSERT INTO user (id, name, email, role, createdAt, updatedAt) VALUES ('admin1', 'Admin', 'admin@mist.local', 'admin', datetime('now'), datetime('now'))`) - _, _ = s.db.Exec(`INSERT INTO account (id, userId, accountId, providerId, password, createdAt, updatedAt) VALUES ('a_admin', 'admin1', 'admin@mist.local', 'credential', ?, datetime('now'), datetime('now'))`, hashed) - - _, _ = s.db.Exec(`INSERT INTO user (id, name, email, role, createdAt, updatedAt) VALUES ('user1', 'User', 'user@mist.local', 'user', datetime('now'), datetime('now'))`) - _, _ = s.db.Exec(`INSERT INTO account (id, userId, accountId, providerId, password, createdAt, updatedAt) VALUES ('a_user', 'user1', 'user@mist.local', 'credential', ?, datetime('now'), datetime('now'))`, hashed) - - seedTestSession(t, s, "admin1") - seedTestSession(t, s, "user1") - - // Admin creates a new user - rec := authRequest(s, "POST", "/auth/admin/create-user", map[string]string{ - "name": "Bob", - "email": "bob@mist.local", - "password": "bobpassword123", - "role": "user", - }, "better-auth.session_token=test-session-admin1") - if rec.Code != 200 { - t.Fatalf("create-user failed: %d %s", rec.Code, rec.Body.String()) - } - var created struct { - User Member `json:"user"` - } - json.Unmarshal(rec.Body.Bytes(), &created) - if created.User.Email != "bob@mist.local" { - t.Fatalf("unexpected user created: %+v", created.User) - } - - // Non-admin cannot create user - rec = authRequest(s, "POST", "/auth/admin/create-user", map[string]string{ - "name": "Mallory", - "email": "mallory@mist.local", - "password": "mallorypassword123", - }, "better-auth.session_token=test-session-user1") - if rec.Code != 403 { - t.Fatalf("expected 403 for non-admin create-user, got %d", rec.Code) - } - - // List users - rec = authRequest(s, "GET", "/auth/admin/list-users?limit=100", nil, "better-auth.session_token=test-session-admin1") - if rec.Code != 200 { - t.Fatalf("list-users failed: %d %s", rec.Code, rec.Body.String()) - } - var listResp struct { - Users []Member `json:"users"` - Total int `json:"total"` - } - json.Unmarshal(rec.Body.Bytes(), &listResp) - if listResp.Total < 3 || len(listResp.Users) < 3 { - t.Fatalf("expected at least 3 users, got %d (total %d)", len(listResp.Users), listResp.Total) - } - - // Reset password - rec = authRequest(s, "POST", "/auth/admin/set-user-password", map[string]string{ - "userId": created.User.ID, - "newPassword": "newbobpassword123", - }, "better-auth.session_token=test-session-admin1") - if rec.Code != 200 { - t.Fatalf("set-user-password failed: %d %s", rec.Code, rec.Body.String()) - } - - // Login with new password - rec = authRequest(s, "POST", "/auth/sign-in/email", map[string]string{ - "email": "bob@mist.local", - "password": "newbobpassword123", - }, "") - if rec.Code != 200 { - t.Fatalf("expected 200 for user login with new password, got %d %s", rec.Code, rec.Body.String()) - } -} - -func TestAuthService_InternalMembers(t *testing.T) { - token := "abcdef12345678901234567890123456" - t.Setenv("MIST_INTERNAL_TOKEN", token) - s := newTestAuthService(t) - - _, _ = s.db.Exec(`INSERT INTO user (id, name, email, role, createdAt, updatedAt) VALUES ('u1', 'Alice', 'alice@mist.local', 'user', datetime('now'), datetime('now'))`) - _, _ = s.db.Exec(`INSERT INTO user (id, name, email, role, createdAt, updatedAt) VALUES ('u2', 'Bob', 'bob@mist.local', 'admin', datetime('now'), datetime('now'))`) - - req := httptest.NewRequest("GET", "/internal/members", nil) - rec := httptest.NewRecorder() - s.handleInternalMembers(rec, req) - if rec.Code != 403 { - t.Fatalf("expected 403 without token, got %d", rec.Code) - } - - req = httptest.NewRequest("GET", "/internal/members", nil) - req.Header.Set("Authorization", "Bearer "+token) - rec = httptest.NewRecorder() - s.handleInternalMembers(rec, req) - if rec.Code != 200 { - t.Fatalf("expected 200 with token, got %d", rec.Code) - } - var body struct { - Members []struct { - ID string `json:"id"` - Active bool `json:"active"` - Role string `json:"role"` - } `json:"members"` - } - json.Unmarshal(rec.Body.Bytes(), &body) - if len(body.Members) != 2 { - t.Fatalf("expected 2 members, got %d", len(body.Members)) - } -} - -// Fixture sessions exercise the same lookup as real sign-in, never user-ID cookies. -func seedTestSession(t *testing.T, service *AuthService, id string) { - t.Helper() - now := time.Now().UTC() - _, err := service.db.Exec(`INSERT INTO session (id,token,userId,expiresAt,createdAt,updatedAt) VALUES (?,?,?,?,?,?)`, "session-"+id, "test-session-"+id, id, now.Add(time.Hour).Format(time.RFC3339Nano), now.Format(time.RFC3339Nano), now.Format(time.RFC3339Nano)) - if err != nil { - t.Fatal(err) - } -} - -func TestAuthServiceRejectsUserIDAndExpiredSessionCookies(t *testing.T) { - service := newTestAuthService(t) - now := time.Now().UTC().Format(time.RFC3339Nano) - _, err := service.db.Exec(`INSERT INTO user (id,name,email,role,createdAt,updatedAt) VALUES (?,?,?,?,?,?)`, "known-user", "Known", "known@mist.local", "admin", now, now) - if err != nil { - t.Fatal(err) - } - seedTestSession(t, service, "known-user") - for _, cookie := range []string{"identity=known-user", "member=known-user", "session_token=known-user", "better-auth.session_token=known-user"} { - request := httptest.NewRequest("GET", "/session", nil) - request.Header.Set("Cookie", cookie) - member, err := service.session(request) - if err != nil || member != nil { - t.Fatalf("forged identity cookie accepted: %v", err) - } - response := authRequest(service, "GET", "/auth/get-session", nil, cookie) - var body struct { - User *Member `json:"user"` - } - if err := json.Unmarshal(response.Body.Bytes(), &body); err != nil || body.User != nil { - t.Fatal("session endpoint accepted a forged identity") - } - } - if _, err := service.db.Exec(`UPDATE session SET expiresAt=?`, time.Now().Add(-time.Hour).UTC().Format(time.RFC3339Nano)); err != nil { - t.Fatal(err) - } - request := httptest.NewRequest("GET", "/session", nil) - request.Header.Set("Cookie", "better-auth.session_token=test-session-known-user") - if member, err := service.session(request); err != nil || member != nil { - t.Fatalf("expired session accepted: %v", err) - } -} - -func TestBetterAuthPasswordCompatibility(t *testing.T) { - // Public test vector generated with Better Auth's Node scrypt parameters. - const hash = "0123456789abcdef0123456789abcdef:8582d1a409fb81869c9f080d49ce2d8839d611a9905642ce9e7b9e5c1cf7e7b71add2af990c5095edf0733f174780d62b2f7ff2fb42cd07a5edf561bef26dc34" - if !verifyPassword(hash, "legacy-password-123") || verifyPassword(hash, "wrong-password") { - t.Fatal("existing Better Auth password compatibility is broken") - } -} - -func TestDeactivatedAccountsCannotUseExistingSessions(t *testing.T) { - service := newTestAuthService(t) - now := time.Now().UTC().Format(time.RFC3339Nano) - _, err := service.db.Exec(`INSERT INTO user (id,name,email,role,banned,createdAt,updatedAt) VALUES (?,?,?,?,?,?,?)`, "inactive", "Inactive", "inactive@mist.local", "admin", 1, now, now) - if err != nil { - t.Fatal(err) - } - seedTestSession(t, service, "inactive") - request := httptest.NewRequest("GET", "/session", nil) - request.Header.Set("Cookie", "better-auth.session_token=test-session-inactive") - if member, err := service.session(request); err != nil || member != nil { - t.Fatal("deactivated account retained access") - } - active, err := service.activeMembers(context.Background()) - if err != nil { - t.Fatal(err) - } - if _, exists := active["inactive"]; exists { - t.Fatal("deactivated account can keep running jobs") - } - if _, err := service.LookupMember(context.Background(), "inactive"); err == nil { - t.Fatal("deactivated account can be enrolled") - } - response := authRequest(service, "GET", "/auth/get-session", nil, "better-auth.session_token=test-session-inactive") - var body struct { - User *Member `json:"user"` - } - if err := json.Unmarshal(response.Body.Bytes(), &body); err != nil || body.User != nil { - t.Fatal("session endpoint exposes deactivated account") - } -} - -func TestExistingBetterAuthSchemaCanCreateAccounts(t *testing.T) { - path := filepath.Join(t.TempDir(), "existing.sqlite") - db, err := sql.Open("sqlite", path) - if err != nil { - t.Fatal(err) - } - _, err = db.Exec(`CREATE TABLE user (id TEXT PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, emailVerified INTEGER NOT NULL, createdAt TEXT NOT NULL, updatedAt TEXT NOT NULL, role TEXT)`) - db.Close() - if err != nil { - t.Fatal(err) - } - t.Setenv("MIST_ADMIN_EMAIL", "existing-schema@mist.local") - t.Setenv("MIST_ADMIN_PASSWORD", "test-password-123") - service, err := newAuthService(path, nil) - if err != nil { - t.Fatal(err) - } - t.Cleanup(func() { _ = service.Close() }) - login := authRequest(service, "POST", "/auth/sign-in/email", map[string]string{"email": "existing-schema@mist.local", "password": "test-password-123"}, "") - if login.Code != 200 { - t.Fatal("bootstrap must support old NOT NULL columns") - } - var body struct { - Token string `json:"token"` - } - if err := json.Unmarshal(login.Body.Bytes(), &body); err != nil { - t.Fatal(err) - } - created := authRequest(service, "POST", "/auth/admin/create-user", map[string]string{"name": "New member", "email": "new-schema@mist.local", "password": "test-password-456"}, "better-auth.session_token="+body.Token) - if created.Code != 200 { - t.Fatalf("member creation failed against existing schema: %s", created.Body) - } -} diff --git a/src/go.mod b/src/go.mod deleted file mode 100644 index 972e1e9..0000000 --- a/src/go.mod +++ /dev/null @@ -1,63 +0,0 @@ -module mist - -go 1.26.0 - -require ( - github.com/distribution/reference v0.6.0 - golang.org/x/crypto v0.58.0 - golang.org/x/text v0.43.0 - k8s.io/api v0.34.1 - k8s.io/apimachinery v0.34.1 - k8s.io/client-go v0.34.1 - modernc.org/sqlite v1.60.1 -) - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.12.2 // indirect - github.com/fxamacker/cbor/v2 v2.9.0 // indirect - github.com/go-logr/logr v1.4.3 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.23.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gnostic-models v0.7.0 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-isatty v0.0.24 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/ncruces/go-strftime v1.0.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rogpeppe/go-internal v1.14.1 // indirect - github.com/spf13/pflag v1.0.6 // indirect - github.com/stretchr/testify v1.11.1 // indirect - github.com/x448/float16 v0.8.4 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect - go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/net v0.60.0 // indirect - golang.org/x/oauth2 v0.27.0 // indirect - golang.org/x/sys v0.49.0 // indirect - golang.org/x/term v0.47.0 // indirect - golang.org/x/time v0.12.0 // indirect - google.golang.org/protobuf v1.36.11 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect - k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect - modernc.org/libc v1.77.1 // indirect - modernc.org/mathutil v1.7.1 // indirect - modernc.org/memory v1.12.1 // indirect - sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect - sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect - sigs.k8s.io/yaml v1.6.0 // indirect -) diff --git a/src/go.sum b/src/go.sum deleted file mode 100644 index 1ea1ff4..0000000 --- a/src/go.sum +++ /dev/null @@ -1,204 +0,0 @@ -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= -github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= -github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= -github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= -github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20260802141513-ef3492d7dac3 h1:LMLX+LgTNWpfvCBdFebv6EsYotImrt/Ppc5cXIriCSo= -github.com/google/pprof v0.0.0-20260802141513-ef3492d7dac3/go.mod h1:jl5iWTm0/hd5PjEYEOuwAJ57L/CibdZfrqZ5XA5GrCk= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-isatty v0.0.24 h1:tGZZoVgT/KiqK1c8ocVLeDS8BSWMRd47J3Lbz7vsReI= -github.com/mattn/go-isatty v0.0.24/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI3HqDio6A= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= -github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= -github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= -github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= -github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= -github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= -github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= -go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.58.0 h1:COkYLr4k7nDI4r6QtMML2AfzeIswWHAJthLS6K/M/54= -golang.org/x/crypto v0.58.0/go.mod h1:Xh+kl5A+M0gMiWDytH2Hhr5Z7WbNCpv/eB/EFgfSk+w= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= -golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.60.0 h1:79p50tfZlm0J9YfoDsSi639qSXNGVwEzOPLCxM2FsYU= -golang.org/x/net v0.60.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.24.0 h1:iqiDrGoDgyuvAKrhLQthUEzU/R378N78gXbBjxed7oA= -golang.org/x/sync v0.24.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.49.0 h1:XbzkgYJHdqh/8m2Uu0W/dQv8nktxx4BFHp1M0gROTXA= -golang.org/x/sys v0.49.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= -golang.org/x/term v0.47.0 h1:cpyOwQkr2Nzxe2p6KnrTG7Ei2wtzjsuSjhpXXepZ/BM= -golang.org/x/term v0.47.0/go.mod h1:efAfAuG6RKABvg1ArGebRkvX6LXul14SM67o2e4mUCY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.43.0 h1:1QivrlhwAsnMOcqgOdl9my7s9OyZl8O5/UGUTJVXoWc= -golang.org/x/text v0.43.0/go.mod h1:hbSIYA/amXcRXTFSZqh8tWHEoqRvvbKPJ2uz/KU+a+s= -golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= -golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.51.0 h1:k4Xc/1Om9jwkBJBo4NVLMSARBoWtK10mx+W5BnXCeAI= -golang.org/x/tools v0.51.0/go.mod h1:9eEncMayCV6zRMGhR5eZEC2iBx98qWcF1HZ9Z7wJOoA= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= -k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= -k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= -k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= -k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= -k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= -k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= -k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= -k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -modernc.org/cc/v4 v4.29.7 h1:q+NXGJ0bK3b4TXFYQQVr9pYETGnmwFWkrUzJnMya/Tg= -modernc.org/cc/v4 v4.29.7/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI= -modernc.org/ccgo/v4 v4.36.1 h1:ZNIUZAryN0UgnJwtyxrdEzcFc3yD4Cu4AzjfPXsLsIE= -modernc.org/ccgo/v4 v4.36.1/go.mod h1:rrtGc2QkS239nYb/mQNuBMyjq3/y3ZXWbBjPoV3wqzA= -modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= -modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= -modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= -modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/gc/v3 v3.1.5 h1:21ldfPfRYE31Tb7B3mwAK8gy1AxP4+dKjrOQPfqakoc= -modernc.org/gc/v3 v3.1.5/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= -modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= -modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/libc v1.77.1 h1:Ct8j47QtiZ1Enj2DtFXQtUqrPCAjdCmPjtCuvrYQ0Hs= -modernc.org/libc v1.77.1/go.mod h1:87/pZ4L6nD1zqW4nItuS12YO7hN1igAah34xjnQo/W0= -modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= -modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= -modernc.org/memory v1.12.1 h1:nFMiWrpStgZczNl6XI9GnIk/rWhYIyHGUaR04pGbp9g= -modernc.org/memory v1.12.1/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= -modernc.org/opt v0.2.0 h1:tGyef5ApycA7FSEOMraay9SaTk5zmbx7Tu+cJs4QKZg= -modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= -modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= -modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.60.1 h1:/blz53O951KWFOso4QQvEs/Fq6cDBKLtMVrYNSeJVKw= -modernc.org/sqlite v1.60.1/go.mod h1:1dIoEagfDE72QytD5scH1lxARtaUgKgHC/NuApA27r0= -modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= -modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= -sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= -sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= -sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/src/hardware.go b/src/hardware.go deleted file mode 100644 index d979231..0000000 --- a/src/hardware.go +++ /dev/null @@ -1,266 +0,0 @@ -package main - -import ( - "context" - "fmt" - "net" - "net/http" - "sync" - "time" - - corev1 "k8s.io/api/core/v1" - resourcev1 "k8s.io/api/resource/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -type MachineHardware struct { - Name string `json:"name"` - Address string `json:"address"` - Ready bool `json:"ready"` - Schedulable bool `json:"schedulable"` - CPUAllocatable string `json:"cpu_allocatable"` - MemoryAllocatable string `json:"memory_allocatable"` -} - -type AcceleratorPool struct { - Accelerator string `json:"accelerator"` - Node string `json:"node"` - Unit string `json:"unit"` - Total int64 `json:"total"` - Allocated int64 `json:"allocated"` - Available *int64 `json:"available"` - Ready bool `json:"ready"` - ChipsPerDevice int `json:"chips_per_device,omitempty"` - Message string `json:"message,omitempty"` -} - -type HardwareSnapshot struct { - ObservedAt time.Time `json:"observed_at"` - Machines []MachineHardware `json:"machines"` - Pools []AcceleratorPool `json:"pools"` -} - -func (e *KubernetesExecutor) hardware(ctx context.Context) (*HardwareSnapshot, error) { - var nodes *corev1.NodeList - var pods *corev1.PodList - var claims *resourcev1.ResourceClaimList - var slices *resourcev1.ResourceSliceList - // These reads are independent. Fail rather than invent free-device counts - // when permissions/connectivity are incomplete. - reads := []func() error{ - func() (err error) { nodes, err = e.client.CoreV1().Nodes().List(ctx, metav1.ListOptions{}); return }, - func() (err error) { pods, err = e.client.CoreV1().Pods("").List(ctx, metav1.ListOptions{}); return }, - func() (err error) { - claims, err = e.client.ResourceV1().ResourceClaims("").List(ctx, metav1.ListOptions{}) - return - }, - func() (err error) { - slices, err = e.client.ResourceV1().ResourceSlices().List(ctx, metav1.ListOptions{}) - return - }, - } - errors := make([]error, len(reads)) - var wg sync.WaitGroup - for i, read := range reads { - wg.Add(1) - go func(i int, read func() error) { defer wg.Done(); errors[i] = read() }(i, read) - } - wg.Wait() - for _, err := range errors { - if err != nil { - return nil, fmt.Errorf("hardware discovery: %w", err) - } - } - return e.hardwareFrom(nodes.Items, pods.Items, claims.Items, slices.Items), nil -} - -func conditionReady(conditions []corev1.PodCondition) bool { - for _, condition := range conditions { - if condition.Type == corev1.PodReady { - return condition.Status == corev1.ConditionTrue - } - } - return false -} - -func driverReady(pods []corev1.Pod, node, driver string) bool { - for _, pod := range pods { - if pod.Spec.NodeName != node || pod.DeletionTimestamp != nil { - continue - } - matches := pod.Labels["app.kubernetes.io/name"] == driver || pod.Labels["app"] == driver - if matches && conditionReady(pod.Status.Conditions) { - return true - } - } - return false -} - -// podGPURequest follows effective scheduling requests: app containers plus -// restartable init containers, or the peak of sequential init requirements. -// Scheduled Pending and Terminating pods still reserve resources; terminal -// pods and unplaced pods do not. This counts every namespace, not just Mist. -func podGPURequest(pod corev1.Pod) int64 { - if pod.Spec.NodeName == "" || pod.Status.Phase == corev1.PodSucceeded || pod.Status.Phase == corev1.PodFailed { - return 0 - } - request := func(c corev1.Container) int64 { - q, ok := c.Resources.Requests["nvidia.com/gpu"] - if !ok { - q = c.Resources.Limits["nvidia.com/gpu"] - } - return q.Value() - } - var app, sidecars, peak int64 - for _, c := range pod.Spec.Containers { - app += request(c) - } - for _, c := range pod.Spec.InitContainers { - value := request(c) - if c.RestartPolicy != nil && *c.RestartPolicy == corev1.ContainerRestartPolicyAlways { - sidecars += value - value = 0 - } - peak = max(peak, sidecars+value) - } - return max(app+sidecars, peak) -} - -func (e *KubernetesExecutor) hardwareFrom(nodes []corev1.Node, pods []corev1.Pod, claims []resourcev1.ResourceClaim, slices []resourcev1.ResourceSlice) *HardwareSnapshot { - snapshot := &HardwareSnapshot{ObservedAt: time.Now().UTC(), Machines: []MachineHardware{}, Pools: []AcceleratorPool{}} - machines := map[string]MachineHardware{} - nvidiaCapacity, nvidiaAllocatable := int64(0), int64(0) - for _, node := range nodes { - if node.Name != e.cpuNode && node.Name != e.ttNode { - continue - } - machine := MachineHardware{Name: node.Name} - for _, condition := range node.Status.Conditions { - if condition.Type == corev1.NodeReady { - machine.Ready = condition.Status == corev1.ConditionTrue - } - } - machine.Schedulable = machine.Ready && !node.Spec.Unschedulable - for _, taint := range node.Spec.Taints { - // Pilot jobs have no tolerations; a blocking taint prevents placement. - if taint.Effect == corev1.TaintEffectNoSchedule || taint.Effect == corev1.TaintEffectNoExecute { - machine.Schedulable = false - } - } - for _, address := range node.Status.Addresses { - if address.Type == corev1.NodeInternalIP { - if machine.Address == "" { - machine.Address = address.Address - } - if ip := net.ParseIP(address.Address); ip != nil && ip.To4() != nil { - machine.Address = address.Address - break - } - } - } - cpu, memory := node.Status.Allocatable[corev1.ResourceCPU], node.Status.Allocatable[corev1.ResourceMemory] - machine.CPUAllocatable, machine.MemoryAllocatable = cpu.String(), memory.String() - machines[node.Name] = machine - if node.Name == e.cpuNode { - capacity, allocatable := node.Status.Capacity["nvidia.com/gpu"], node.Status.Allocatable["nvidia.com/gpu"] - nvidiaCapacity, nvidiaAllocatable = capacity.Value(), allocatable.Value() - } - } - for _, name := range []string{e.cpuNode, e.ttNode} { - machine, ok := machines[name] - if !ok { - machine = MachineHardware{Name: name} - } - snapshot.Machines = append(snapshot.Machines, machine) - } - nvidia := AcceleratorPool{Accelerator: "nvidia", Node: e.cpuNode, Unit: "GPU", Total: nvidiaCapacity} - for _, pod := range pods { - if pod.Spec.NodeName == e.cpuNode { - nvidia.Allocated += podGPURequest(pod) - } - } - nvidia.Ready = machines[e.cpuNode].Schedulable && nvidiaAllocatable > 0 && driverReady(pods, e.cpuNode, "nvidia-device-plugin-daemonset") - free := max(int64(0), nvidiaAllocatable-nvidia.Allocated) - if !nvidia.Ready { - free = 0 - nvidia.Message = "Node or NVIDIA device plugin is unavailable for placement" - } - nvidia.Available = &free - - // Use only the newest complete generation of each advertised device pool. - // Ignore the vendor's incorrect memory capacity and deduplicate devices. - type poolGeneration struct { - generation int64 - expected int64 - slices []resourcev1.ResourceSlice - } - pools := map[string]*poolGeneration{} - for _, slice := range slices { - if slice.Spec.Driver != "tenstorrent.com" || slice.Spec.NodeName == nil || *slice.Spec.NodeName != e.ttNode { - continue - } - key := slice.Spec.Driver + "/" + slice.Spec.Pool.Name - pool := pools[key] - if pool == nil || slice.Spec.Pool.Generation > pool.generation { - pool = &poolGeneration{generation: slice.Spec.Pool.Generation, expected: slice.Spec.Pool.ResourceSliceCount} - pools[key] = pool - } - if slice.Spec.Pool.Generation == pool.generation { - pool.slices = append(pool.slices, slice) - } - } - devices := map[string]bool{} - complete := len(pools) > 0 - for _, pool := range pools { - if int64(len(pool.slices)) != pool.expected { - complete = false - } - for _, slice := range pool.slices { - for _, device := range slice.Spec.Devices { - board, chips := device.Attributes["boardName"], device.Attributes["chipCount"] - if board.StringValue == nil || *board.StringValue != "n300" || chips.IntValue == nil || *chips.IntValue != 2 { - continue - } - devices[slice.Spec.Driver+"/"+slice.Spec.Pool.Name+"/"+device.Name] = true - } - } - } - allocated := map[string]bool{} - for _, claim := range claims { - if claim.Status.Allocation == nil { - continue - } - for _, allocation := range claim.Status.Allocation.Devices.Results { - if allocation.AdminAccess != nil && *allocation.AdminAccess { - continue - } - key := allocation.Driver + "/" + allocation.Pool + "/" + allocation.Device - if devices[key] { - allocated[key] = true - } - } - } - tt := AcceleratorPool{Accelerator: "tenstorrent", Node: e.ttNode, Unit: "board", ChipsPerDevice: 2, Total: int64(len(devices)), Allocated: int64(len(allocated))} - tt.Ready = machines[e.ttNode].Schedulable && complete && driverReady(pods, e.ttNode, "tt-dra-driver") - ttFree := max(int64(0), tt.Total-tt.Allocated) - if !tt.Ready { - ttFree = 0 - tt.Message = "Node, TT device driver, or complete device inventory is unavailable" - } - tt.Available = &ttFree - if !complete { - tt.Available = nil - } - snapshot.Pools = append(snapshot.Pools, nvidia, tt) - return snapshot -} - -func (a *App) hardware(w http.ResponseWriter, r *http.Request) { - snapshot, err := a.executor.hardware(r.Context()) - if err != nil { - writeJSON(w, http.StatusServiceUnavailable, map[string]string{"error": err.Error()}) - return - } - w.Header().Set("Cache-Control", "no-store") - writeJSON(w, http.StatusOK, snapshot) -} diff --git a/src/hardware_test.go b/src/hardware_test.go deleted file mode 100644 index 985c150..0000000 --- a/src/hardware_test.go +++ /dev/null @@ -1,109 +0,0 @@ -package main - -import ( - "errors" - "io" - "log/slog" - "net/http/httptest" - "strings" - "testing" - - corev1 "k8s.io/api/core/v1" - resourcev1 "k8s.io/api/resource/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes/fake" - ktesting "k8s.io/client-go/testing" -) - -func hardwareFixture() ([]corev1.Node, []corev1.Pod, []resourcev1.ResourceSlice) { - nodes := []corev1.Node{} - for _, name := range []string{"cpu-node", "tt-node"} { - nodes = append(nodes, corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: name}, Status: corev1.NodeStatus{ - Conditions: []corev1.NodeCondition{{Type: corev1.NodeReady, Status: corev1.ConditionTrue}}, - Capacity: corev1.ResourceList{"nvidia.com/gpu": resource.MustParse("2")}, - Allocatable: corev1.ResourceList{"nvidia.com/gpu": resource.MustParse("2")}, - }}) - } - pods := []corev1.Pod{} - for _, driver := range []struct{ node, name string }{{"cpu-node", "nvidia-device-plugin-daemonset"}, {"tt-node", "tt-dra-driver"}} { - pods = append(pods, corev1.Pod{ObjectMeta: metav1.ObjectMeta{Labels: map[string]string{"app.kubernetes.io/name": driver.name}}, - Spec: corev1.PodSpec{NodeName: driver.node}, Status: corev1.PodStatus{Conditions: []corev1.PodCondition{{Type: corev1.PodReady, Status: corev1.ConditionTrue}}}}) - } - slice := resourcev1.ResourceSlice{Spec: resourcev1.ResourceSliceSpec{Driver: "tenstorrent.com", NodeName: ptr("tt-node"), Pool: resourcev1.ResourcePool{Name: "tt-node", Generation: 1, ResourceSliceCount: 1}}} - for _, name := range []string{"tt-0", "tt-1", "tt-2", "tt-3"} { - slice.Spec.Devices = append(slice.Spec.Devices, resourcev1.Device{Name: name, Attributes: map[resourcev1.QualifiedName]resourcev1.DeviceAttribute{ - "boardName": {StringValue: ptr("n300")}, "chipCount": {IntValue: ptr(int64(2))}, - }}) - } - return nodes, pods, []resourcev1.ResourceSlice{slice} -} - -func gpuContainer(count string) corev1.Container { - return corev1.Container{Resources: corev1.ResourceRequirements{Requests: corev1.ResourceList{"nvidia.com/gpu": resource.MustParse(count)}}} -} - -func TestHardwareCountsExternalScheduledPodsAndDRAReservations(t *testing.T) { - e := testExecutor() - nodes, pods, slices := hardwareFixture() - for _, state := range []struct { - node string - phase corev1.PodPhase - }{{"cpu-node", corev1.PodPending}, {"", corev1.PodPending}, {"cpu-node", corev1.PodSucceeded}} { - pods = append(pods, corev1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "another-team"}, Spec: corev1.PodSpec{NodeName: state.node, Containers: []corev1.Container{gpuContainer("1")}}, Status: corev1.PodStatus{Phase: state.phase}}) - } - claim := resourcev1.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Namespace: "another-team"}, Status: resourcev1.ResourceClaimStatus{Allocation: &resourcev1.AllocationResult{ - Devices: resourcev1.DeviceAllocationResult{Results: []resourcev1.DeviceRequestAllocationResult{{Driver: "tenstorrent.com", Pool: "tt-node", Device: "tt-0"}}}, - }}} - // An allocation reserves the board even before its pod starts; duplicate - // references must not count the same physical device twice. - snapshot := e.hardwareFrom(nodes, pods, []resourcev1.ResourceClaim{claim, claim}, slices) - if p := snapshot.Pools[0]; p.Total != 2 || p.Allocated != 1 || p.Available == nil || *p.Available != 1 { - t.Fatalf("bad GPU accounting: %+v", p) - } - if p := snapshot.Pools[1]; p.Total != 4 || p.Allocated != 1 || p.Available == nil || *p.Available != 3 || p.ChipsPerDevice != 2 { - t.Fatalf("bad TT accounting: %+v", p) - } -} - -func TestHardwareDoesNotAdvertiseOfflineOrIncompleteInventory(t *testing.T) { - e := testExecutor() - nodes, pods, slices := hardwareFixture() - nodes[0].Status.Conditions[0].Status = corev1.ConditionFalse - slices[0].Spec.Pool.Generation = 2 - slices[0].Spec.Pool.ResourceSliceCount = 2 - snapshot := e.hardwareFrom(nodes, pods, nil, slices) - if p := snapshot.Pools[0]; p.Ready || *p.Available != 0 { - t.Fatalf("offline node appeared available: %+v", p) - } - if p := snapshot.Pools[1]; p.Ready || p.Available != nil { - t.Fatalf("partial inventory appeared available: %+v", p) - } - nodes[0].Status.Conditions[0].Status = corev1.ConditionTrue - nodes[0].Spec.Unschedulable = true - snapshot = e.hardwareFrom(nodes, pods, nil, nil) - if snapshot.Pools[0].Ready { - t.Fatal("cordoned node appeared schedulable") - } -} - -func TestGPURequestIncludesInitPeakAndSidecars(t *testing.T) { - app, sidecar, init := gpuContainer("1"), gpuContainer("1"), gpuContainer("3") - sidecar.RestartPolicy = ptr(corev1.ContainerRestartPolicyAlways) - pod := corev1.Pod{Spec: corev1.PodSpec{NodeName: "cpu-node", Containers: []corev1.Container{app}, InitContainers: []corev1.Container{sidecar, init}}} - if n := podGPURequest(pod); n != 4 { - t.Fatalf("init peak reservation = %d, want 4", n) - } -} - -func TestHardwarePermissionFailureIsAnError(t *testing.T) { - e := testExecutor() - e.client.(*fake.Clientset).PrependReactor("list", "nodes", func(ktesting.Action) (bool, runtime.Object, error) { return true, nil, errors.New("forbidden") }) - app := NewKubernetesApp(e, slog.New(slog.NewTextHandler(io.Discard, nil))) - response := httptest.NewRecorder() - app.httpServer.Handler.ServeHTTP(response, httptest.NewRequest("GET", "/hardware", nil)) - if response.Code != 503 || !strings.Contains(response.Body.String(), "forbidden") { - t.Fatalf("invented availability after failed discovery: %d %s", response.Code, response.Body.String()) - } -} diff --git a/src/http.go b/src/http.go deleted file mode 100644 index 18e7e9c..0000000 --- a/src/http.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "encoding/json" - "errors" - "net/http" - "syscall" - - apierrors "k8s.io/apimachinery/pkg/api/errors" -) - -func writeJSON(w http.ResponseWriter, code int, value interface{}) { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(code) - _ = json.NewEncoder(w).Encode(value) -} - -func executorError(w http.ResponseWriter, err error) { - code := http.StatusBadGateway - var invalid *submissionError - if errors.As(err, &invalid) { - code = http.StatusBadRequest - } - if apierrors.IsNotFound(err) { - code = http.StatusNotFound - } - var denied *permissionError - if errors.As(err, &denied) { - code = http.StatusForbidden - } - if errors.Is(err, syscall.ENOSPC) || errors.Is(err, syscall.EDQUOT) { - code = 507 - } - writeJSON(w, code, map[string]string{"error": err.Error()}) -} diff --git a/src/images.go b/src/images.go deleted file mode 100644 index cd9da95..0000000 --- a/src/images.go +++ /dev/null @@ -1,59 +0,0 @@ -package main - -import ( - "net/http" - "sort" -) - -type ImageOption struct { - Reference string `json:"reference"` - Accelerators []string `json:"accelerators"` -} - -type ComputeProfile struct { - Accelerator string `json:"accelerator"` - DefaultImage string `json:"default_image"` - DeviceUnit string `json:"device_unit"` - MaxDevices int `json:"max_devices"` - Note string `json:"note,omitempty"` -} - -type ImageCatalog struct { - Images []ImageOption `json:"images"` - Profiles []ComputeProfile `json:"profiles"` - Registries []string `json:"registries,omitempty"` - SelfService bool `json:"self_service"` - TeamsEnabled bool `json:"teams_enabled"` -} - -// Accelerator lists describe server policy, not a guarantee that an image's -// code supports that hardware. Team TT jobs can select a compatible container -// runtime or the tested read-only host runtime profile. -func (e *KubernetesExecutor) imageCatalog() ImageCatalog { - catalog := ImageCatalog{Images: []ImageOption{}, Profiles: []ComputeProfile{ - {Accelerator: "cpu", DefaultImage: cpuImage, DeviceUnit: "none", MaxDevices: 0}, - {Accelerator: "nvidia", DefaultImage: nvidiaImage, DeviceUnit: "GPU", MaxDevices: 2}, - {Accelerator: "tenstorrent", DefaultImage: ttImage, DeviceUnit: "board", MaxDevices: 4, - Note: "One n300 board has two chips. This pilot uses the tested image and installed host TT runtime."}, - }} - for ref := range e.allowedImages { - accelerators := []string{"cpu", "nvidia"} - if ref == ttImage { - accelerators = append(accelerators, "tenstorrent") - } - catalog.Images = append(catalog.Images, ImageOption{ref, accelerators}) - } - sort.Slice(catalog.Images, func(i, j int) bool { return catalog.Images[i].Reference < catalog.Images[j].Reference }) - return catalog -} - -func (a *App) images(w http.ResponseWriter, r *http.Request) { - e := a.requestExecutor(r) - catalog := e.imageCatalog() - catalog.TeamsEnabled = a.teams != nil - if e.team != nil { - catalog.SelfService = true - catalog.Registries = e.team.Team.Policy.Registries - } - writeJSON(w, http.StatusOK, catalog) -} diff --git a/src/images_test.go b/src/images_test.go deleted file mode 100644 index abba9d5..0000000 --- a/src/images_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package main - -import "testing" - -func TestCustomImagePreservesEntrypointAndWorkingDirectory(t *testing.T) { - e := testExecutor() - image := "registry.example/training:v1" - e.allowedImages[image] = true - req, err := e.normalize(CreateJobRequest{Image: image, Args: []string{"--epochs", "10"}}) - if err != nil { - t.Fatal(err) - } - job := e.buildJob("image-test", req) - c := job.Spec.Template.Spec.Containers[0] - if len(c.Command) != 0 || c.WorkingDir != "" || len(c.Args) != 2 { - t.Fatalf("overrode image defaults: %+v", c) - } - req.WorkingDirectory = "/app" - if c := e.buildJob("override-test", req).Spec.Template.Spec.Containers[0]; c.WorkingDir != "/app" { - t.Fatal("explicit working directory ignored") - } - if _, err := e.normalize(CreateJobRequest{Image: image, WorkingDirectory: "relative/path"}); err == nil { - t.Fatal("accepted relative working directory") - } - if _, err := e.normalize(CreateJobRequest{}); err == nil { - t.Fatal("empty submission silently ran a default image") - } -} - -func TestTenstorrentCustomImageRestrictionIsInCatalogAndValidation(t *testing.T) { - e := testExecutor() - e.allowedImages["custom/tt:v1"] = true - if _, err := e.normalize(CreateJobRequest{Image: "custom/tt:v1", Accelerator: "tenstorrent"}); err == nil { - t.Fatal("accepted incompatible TT image") - } - for _, image := range e.imageCatalog().Images { - for _, accelerator := range image.Accelerators { - if accelerator == "tenstorrent" && image.Reference != ttImage { - t.Fatal("catalog offers incompatible TT image") - } - } - } -} diff --git a/src/job_states.go b/src/job_states.go deleted file mode 100644 index c7c77fc..0000000 --- a/src/job_states.go +++ /dev/null @@ -1,49 +0,0 @@ -package main - -import ( - "context" - - corev1 "k8s.io/api/core/v1" - resourcev1 "k8s.io/api/resource/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// A list response reads each collection once. History polling must not issue -// one pod/event/claim request per retained job (the pilot retains all jobs). -type jobStateData struct { - pods map[string][]corev1.Pod - events []corev1.Event - claims map[string]resourcev1.ResourceClaim -} - -func (e *KubernetesExecutor) loadJobState(ctx context.Context) (*jobStateData, error) { - pods, err := e.client.CoreV1().Pods(e.namespace).List(ctx, metav1.ListOptions{LabelSelector: managedLabel + "=mist,mist.io/owner=" + e.owner}) - if err != nil { - return nil, err - } - data := &jobStateData{pods: map[string][]corev1.Pod{}, claims: map[string]resourcev1.ResourceClaim{}} - needEvents, needClaims := false, false - for _, pod := range pods.Items { - name := pod.Labels["batch.kubernetes.io/job-name"] - data.pods[name] = append(data.pods[name], pod) - needEvents = needEvents || (pod.Status.Phase == corev1.PodPending && pod.Spec.NodeName == "") - needClaims = needClaims || len(pod.Status.ResourceClaimStatuses) > 0 - } - if needEvents { - events, err := e.client.CoreV1().Events(e.namespace).List(ctx, metav1.ListOptions{}) - if err != nil { - return nil, err - } - data.events = events.Items - } - if needClaims { - claims, err := e.client.ResourceV1().ResourceClaims(e.namespace).List(ctx, metav1.ListOptions{}) - if err != nil { - return nil, err - } - for _, claim := range claims.Items { - data.claims[claim.Name] = claim - } - } - return data, nil -} diff --git a/src/job_types.go b/src/job_types.go deleted file mode 100644 index e44b061..0000000 --- a/src/job_types.go +++ /dev/null @@ -1,84 +0,0 @@ -package main - -import "time" - -type JobState string - -const ( - JobStateScheduled JobState = "Scheduled" - JobStateInProgress JobState = "InProgress" - JobStateSuccess JobState = "Success" - JobStateFailure JobState = "Failure" - JobStateCancelled JobState = "Cancelled" -) - -type Job struct { - ID string `json:"id"` - Type string `json:"type"` - Payload map[string]interface{} `json:"payload"` - Retries int `json:"retries"` - Created time.Time `json:"created"` - RequiredGPU string `json:"required_gpu,omitempty"` - JobState JobState `json:"job_state"` - ConsumerID *string `json:"consumer_id,omitempty"` - TimeAssigned *time.Time `json:"time_assigned,omitempty"` - TimeStarted *time.Time `json:"time_started,omitempty"` - TimeCompleted *time.Time `json:"time_completed,omitempty"` - Result map[string]interface{} `json:"result,omitempty"` - Error *string `json:"error,omitempty"` -} - -type CreateJobRequest struct { - Type string `json:"type"` - DatasetID string `json:"dataset_id,omitempty"` - StorageScope string `json:"storage_scope,omitempty"` - TTRuntime string `json:"tt_runtime,omitempty"` - Payload map[string]interface{} `json:"payload"` - RequiredGPU string `json:"gpu,omitempty"` - Name string `json:"name,omitempty"` - Image string `json:"image,omitempty"` - Command []string `json:"command,omitempty"` - Args []string `json:"args,omitempty"` - WorkingDirectory string `json:"working_directory,omitempty"` - Script string `json:"script,omitempty"` - ScriptName string `json:"script_name,omitempty"` - Env map[string]string `json:"env,omitempty"` - CPU string `json:"cpu,omitempty"` - Memory string `json:"memory,omitempty"` - Accelerator string `json:"accelerator,omitempty"` - DeviceCount int `json:"device_count,omitempty"` - TimeoutSeconds int64 `json:"timeout_seconds,omitempty"` -} - -type KubernetesJobStatus struct { - Job - Name string `json:"name"` - Image string `json:"image"` - Accelerator string `json:"accelerator"` - DeviceCount int `json:"device_count"` - CPU string `json:"cpu"` - Memory string `json:"memory"` - Owner string `json:"owner"` - Node string `json:"node,omitempty"` - Pod string `json:"pod,omitempty"` - ExitCode *int32 `json:"exit_code,omitempty"` - Message string `json:"message,omitempty"` - Devices []AllocatedDevice `json:"devices,omitempty"` - CheckpointDirectory string `json:"checkpoint_directory"` - OutputDirectory string `json:"output_directory"` - WorkingDirectory string `json:"working_directory,omitempty"` - TimeoutSeconds int64 `json:"timeout_seconds"` - DatasetID string `json:"dataset_id,omitempty"` - TeamID string `json:"team_id,omitempty"` - CreatorID string `json:"creator_id,omitempty"` - CreatorName string `json:"creator_name,omitempty"` - StorageScope string `json:"storage_scope,omitempty"` - QueuePosition int `json:"queue_position,omitempty"` - CanCancel *bool `json:"can_cancel,omitempty"` -} - -type AllocatedDevice struct { - Driver string `json:"driver"` - Pool string `json:"pool"` - Device string `json:"device"` -} diff --git a/src/jobs.md b/src/jobs.md deleted file mode 100644 index df373c2..0000000 --- a/src/jobs.md +++ /dev/null @@ -1,54 +0,0 @@ -# Job lifecycle and API - -Current authenticated team execution. See [the operating guide](../docs/content/department-rollout.md#developer-api-contract) -for the complete API and [architecture](../docs/content/architecture.md) for source layout. - -## Lifecycle - -1. Authenticate the Better Auth session and select an active team. Validate image - registry, workload, device count, CPU/memory/runtime and writing authority. -2. Create a suspended `mist-...` Job in `mist-team-` and persist its - submission/creator metadata. Scripts use a Job-owned ConfigMap. -3. A single durable controller applies fair team admission and resource limits. - Kubernetes then schedules the pod using whole GPU resources or TT DRA claims. -4. Read actual Job/pod status, placement, logs and exit code. API states remain - `Scheduled`, `InProgress`, `Success`, `Failure` and `Cancelled`. Scheduled - includes queued/admitted/pending work; inspect the message/queue metadata. -5. Cancellation/revocation suspends the Job and removes pods, freeing allocated - devices. It preserves outputs/history; explicit cancellation saves recent logs. -6. Dataset mounts are read-only `/inputs`. Outputs are the job's own model-pool - directory at `/outputs` and `/checkpoints/`. Finished outputs remain. - -A team's timeout starts after admission, not while waiting in the Mist queue. -The controller is single-replica. Jobs have no automatic retry or TTL. Retained -pods/kubelet retention determine normal log availability; cancellation keeps the -last 32 KiB. Workloads receive no service-account token or arbitrary host mounts. - -Historical account jobs and original local PVCs remain available through the -explicit legacy workspace. New deployed submissions/uploads require a team. -The former Redis/Docker executor and fake supervisor endpoints are retired. - -## Job endpoints - -Browser/CLI calls use the portal prefix `/api`; Nginx strips it before Go. -Team work sends `X-Mist-Team` with a real team ID. Go derives identity and authority -from the session, not request ownership fields. - -| Method/path after `/api` | Action | -|---|---| -| `POST /jobs` | Submit; **201** with `job_id` and job metadata | -| `GET /jobs` | List permitted team jobs, or selected legacy account history | -| `GET /jobs/{id}` | Actual state, placement, resources, exit and active TT allocation | -| `GET /jobs/{id}/logs` | Recent stdout/stderr JSON, up to 64 KiB | -| `POST /jobs/{id}/cancel` | Authorized cancellation | -| `DELETE /jobs/{id}` | Cancellation alias, preserves history | -| `GET /jobs/{id}/files` | Output listing; `/files/download?path=...` downloads | -| `GET /jobs/status?id=...` | Compatibility status route using the same scoped executor | -| `GET /hardware`, `/images` | Capacity and image/runtime policy profiles | -| `GET /healthz` | Kubernetes Jobs API availability | - -Scripts are limited to 32 KiB; request JSON is bounded and rejects unknown fields -or multiple objects. An explicit image with no command/arguments preserves its -ENTRYPOINT/CMD. CPU/NVIDIA preserve image WORKDIR without an override. TT requires -compatible libraries and an explicit host/container runtime choice when applicable. -Custom tagged images are self-service within allowed registry rules. diff --git a/src/jobs_http.go b/src/jobs_http.go deleted file mode 100644 index 6044ce9..0000000 --- a/src/jobs_http.go +++ /dev/null @@ -1,109 +0,0 @@ -package main - -import ( - "encoding/json" - "io" - "net/http" - "strings" -) - -func (a *App) kubernetesJobs(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodPost: - var req CreateJobRequest - decoder := json.NewDecoder(http.MaxBytesReader(w, r.Body, 128*1024)) - decoder.DisallowUnknownFields() - if err := decoder.Decode(&req); err != nil { - writeJSON(w, 400, map[string]string{"error": "invalid submission: " + err.Error()}) - return - } - if err := decoder.Decode(new(interface{})); err != io.EOF { - writeJSON(w, 400, map[string]string{"error": "request must contain one JSON object"}) - return - } - status, err := a.requestExecutor(r).submit(r.Context(), req) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, http.StatusCreated, map[string]interface{}{"job_id": status.ID, "job": status}) - case http.MethodGet: - jobs, err := a.requestExecutor(r).list(r.Context()) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, map[string]interface{}{"jobs": jobs, "count": len(jobs)}) - default: - w.Header().Set("Allow", "GET, POST") - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) - } -} - -func (a *App) kubernetesJob(w http.ResponseWriter, r *http.Request) { - if strings.Contains(r.URL.Path, "/files") { - a.jobFiles(w, r) - return - } - parts := strings.Split(strings.TrimPrefix(r.URL.Path, "/jobs/"), "/") - if len(parts) == 0 || parts[0] == "" || len(parts) > 2 { - http.NotFound(w, r) - return - } - id := parts[0] - if len(parts) == 2 && parts[1] == "logs" && r.Method == http.MethodGet { - logs, err := a.requestExecutor(r).logs(r.Context(), id) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, map[string]string{"job_id": id, "logs": logs}) - return - } - if (len(parts) == 2 && parts[1] == "cancel" && r.Method == http.MethodPost) || (len(parts) == 1 && r.Method == http.MethodDelete) { - status, err := a.requestExecutor(r).cancel(r.Context(), id) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, status) - return - } - if len(parts) == 1 && r.Method == http.MethodGet { - status, err := a.requestExecutor(r).get(r.Context(), id) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, status) - return - } - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) -} - -func (a *App) getJobStatus(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - return - } - - jobID := r.URL.Query().Get("id") - if jobID == "" { - // Try to get from path if query param not provided - path := strings.TrimPrefix(r.URL.Path, "/jobs/status/") - if path != "" && path != "/jobs/status" { - jobID = path - } - } - - if jobID == "" { - http.Error(w, "Job ID is required", http.StatusBadRequest) - return - } - status, err := a.requestExecutor(r).get(r.Context(), jobID) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, status) -} diff --git a/src/kubernetes.go b/src/kubernetes.go deleted file mode 100644 index 7130dbe..0000000 --- a/src/kubernetes.go +++ /dev/null @@ -1,815 +0,0 @@ -package main - -import ( - "context" - "crypto/rand" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strconv" - "strings" - "time" - - batchv1 "k8s.io/api/batch/v1" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - "k8s.io/client-go/util/retry" -) - -const ( - managedLabel = "app.kubernetes.io/managed-by" - requestAnnotation = "mist.io/submission" - cancelAnnotation = "mist.io/cancelled-at" - cancelLogsAnnotation = "mist.io/cancelled-logs" - ttImage = "ghcr.io/tenstorrent/tt-metal/tt-metalium/ubuntu-22.04-dev-amd64:6b765c0bc2b40ea02566d169d7b0ee902377ba04" - nvidiaImage = "pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime" - cpuImage = "python:3.10-slim" - ttMetal = "/home/utmist-tt/TT/tt-metal" - ttPython = ttMetal + "/python_env/bin/python" - maxLogBytes int64 = 64 * 1024 -) - -type KubernetesExecutor struct { - client kubernetes.Interface - namespace string - owner string - allowedImages map[string]bool - pullSecrets []corev1.LocalObjectReference - cpuNode, ttNode string - storage *SharedStorage - sharedPVC string - team *TeamAccess - inputPVC string - inputSubPath string - outputSubPath string -} - -func NewKubernetesExecutor() (*KubernetesExecutor, error) { - var config *rest.Config - var err error - if path := os.Getenv("KUBECONFIG"); path != "" { - config, err = clientcmd.NewNonInteractiveDeferredLoadingClientConfig(clientcmd.NewDefaultClientConfigLoadingRules(), &clientcmd.ConfigOverrides{}).ClientConfig() - } else { - config, err = rest.InClusterConfig() - if err != nil { - config, err = clientcmd.NewNonInteractiveDeferredLoadingClientConfig(clientcmd.NewDefaultClientConfigLoadingRules(), &clientcmd.ConfigOverrides{}).ClientConfig() - } - } - if err != nil { - return nil, fmt.Errorf("load Kubernetes credentials: %w", err) - } - config.Timeout = 20 * time.Second - config.QPS = 20 - config.Burst = 40 - client, err := kubernetes.NewForConfig(config) - if err != nil { - return nil, err - } - e := &KubernetesExecutor{client: client, namespace: envOr("MIST_NAMESPACE", "mist"), - owner: envOr("MIST_PILOT_OWNER", "pilot"), cpuNode: envOr("MIST_CPU_NODE", "utmist-z1opa08"), - ttNode: envOr("MIST_TT_NODE", "utmist-tt"), allowedImages: map[string]bool{cpuImage: true, ttImage: true, - nvidiaImage: true, "busybox:1.36": true, "alpine:3.16.3": true, - "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0": true}} - if images := os.Getenv("MIST_ALLOWED_IMAGES"); images != "" { - e.allowedImages = map[string]bool{} - for _, image := range strings.Split(images, ",") { - e.allowedImages[strings.TrimSpace(image)] = true - } - } - if len(validation.IsValidLabelValue(e.owner)) != 0 { - return nil, errors.New("MIST_PILOT_OWNER must be a valid label value") - } - for _, name := range strings.Split(os.Getenv("MIST_IMAGE_PULL_SECRETS"), ",") { - name = strings.TrimSpace(name) - if name == "" { - continue - } - if len(validation.IsDNS1123Subdomain(name)) != 0 { - return nil, errors.New("invalid MIST_IMAGE_PULL_SECRETS name") - } - e.pullSecrets = append(e.pullSecrets, corev1.LocalObjectReference{Name: name}) - } - if root := os.Getenv("MIST_STORAGE_ROOT"); root != "" { - e.storage, err = NewSharedStorage(root) - if err != nil { - return nil, err - } - e.sharedPVC = envOr("MIST_SHARED_PVC", "mist-shared-jobs") - } - return e, nil -} - -func envOr(key, fallback string) string { - if value := os.Getenv(key); value != "" { - return value - } - return fallback -} -func ptr[T any](value T) *T { return &value } - -func (e *KubernetesExecutor) normalize(req CreateJobRequest) (CreateJobRequest, error) { - explicitImage := req.Image != "" - if len(req.Payload) != 0 { - return req, errors.New("use image/command/args or script instead of the legacy payload") - } - if req.Accelerator == "" { - req.Accelerator = req.RequiredGPU - } - switch strings.ToLower(req.Accelerator) { - case "", "cpu": - req.Accelerator = "cpu" - case "nvidia", "cuda": - req.Accelerator = "nvidia" - case "tt", "tenstorrent": - req.Accelerator = "tenstorrent" - default: - return req, errors.New("accelerator must be cpu, nvidia, or tenstorrent") - } - if req.RequiredGPU != "" { - alias := strings.ToLower(req.RequiredGPU) - if alias == "tt" { - alias = "tenstorrent" - } - if alias == "cuda" { - alias = "nvidia" - } - if alias != req.Accelerator { - return req, errors.New("gpu and accelerator disagree") - } - } - req.RequiredGPU = "" - if req.Type == "" { - req.Type = "command" - } - if req.Type != "command" && req.Type != "training-smoke" { - return req, errors.New("type must be command or training-smoke") - } - if req.Accelerator == "cpu" { - if req.DeviceCount != 0 { - return req, errors.New("CPU jobs cannot request accelerator devices") - } - } else { - if req.DeviceCount == 0 { - req.DeviceCount = 1 - } - maximum := 2 - if req.Accelerator == "tenstorrent" { - maximum = 4 - } - if req.DeviceCount < 1 || req.DeviceCount > maximum { - return req, fmt.Errorf("device_count must be between 1 and %d", maximum) - } - } - if req.Image == "" { - switch req.Accelerator { - case "tenstorrent": - req.Image = ttImage - case "nvidia": - req.Image = nvidiaImage - default: - req.Image = cpuImage - } - } - if e.team != nil { - if err := validateImageReference(req.Image, e.team.Team.Policy.Registries, e.allowedImages); err != nil { - return req, err - } - } else if !e.allowedImages[req.Image] { - return req, errors.New("image is not in the server's approved image list") - } - if e.team == nil && req.Accelerator == "tenstorrent" && req.Image != ttImage { - return req, errors.New("this QuietBox pilot requires the configured TT runtime image") - } - if req.Type == "training-smoke" && (req.Accelerator == "cpu" || req.Script != "" || len(req.Command) != 0) { - return req, errors.New("training-smoke requires NVIDIA or Tenstorrent and supplies its own command") - } - if req.Script != "" { - if len(req.Command) != 0 { - return req, errors.New("provide script or command, not both") - } - if len(req.Script) > 32*1024 { - return req, errors.New("script exceeds 32 KiB") - } - if req.ScriptName == "" { - req.ScriptName = "script.py" - } - if filepath.Base(req.ScriptName) != req.ScriptName || strings.ContainsAny(req.ScriptName, "\\\x00") || len(req.ScriptName) > 63 || - (filepath.Ext(req.ScriptName) != ".py" && filepath.Ext(req.ScriptName) != ".sh") { - return req, errors.New("script_name must be a .py or .sh filename without directories") - } - } else if req.Type == "command" && len(req.Command) == 0 && !explicitImage { - return req, errors.New("provide an image to run its default entrypoint, a command, or a script") - } - if len(req.Command) != 0 && req.Command[0] == "" { - return req, errors.New("command executable cannot be empty") - } - if req.WorkingDirectory != "" && (!filepath.IsAbs(req.WorkingDirectory) || len(req.WorkingDirectory) > 1024 || strings.ContainsRune(req.WorkingDirectory, 0)) { - return req, errors.New("working_directory must be an absolute container path") - } - if len(req.Command)+len(req.Args) > 64 { - return req, errors.New("too many command arguments") - } - for _, value := range append(append([]string{}, req.Command...), req.Args...) { - if len(value) > 8192 || strings.ContainsRune(value, 0) { - return req, errors.New("invalid command argument") - } - } - if len(req.Env) > 32 { - return req, errors.New("too many environment variables") - } - for key, value := range req.Env { - if len(validation.IsEnvVarName(key)) != 0 || len(value) > 4096 || strings.ContainsRune(value, 0) { - return req, errors.New("invalid environment variable") - } - if key == "MIST_JOB_ID" || key == "MIST_CHECKPOINT_DIR" || key == "MIST_OUTPUT_DIR" || key == "MIST_INPUT_DIR" { - return req, fmt.Errorf("%s is managed by Mist", key) - } - if req.Accelerator == "tenstorrent" && (key == "TT_METAL_VISIBLE_DEVICES" || ((e.team == nil || (req.Image == ttImage && req.TTRuntime != "container")) && (strings.HasPrefix(key, "TT_METAL_") || key == "PYTHONPATH" || key == "LD_LIBRARY_PATH"))) { - return req, fmt.Errorf("%s is managed by the TT runtime profile", key) - } - } - if len(req.Name) > 128 { - return req, errors.New("name exceeds 128 characters") - } - if req.TimeoutSeconds == 0 { - req.TimeoutSeconds = 600 - } - if req.TimeoutSeconds < 10 || req.TimeoutSeconds > 86400 { - return req, errors.New("timeout_seconds must be between 10 and 86400") - } - if req.CPU == "" { - req.CPU = "250m" - if req.Accelerator != "cpu" { - req.CPU = "2" - } - if req.Accelerator == "tenstorrent" { - req.CPU = strconv.Itoa(req.DeviceCount * 2) - } - } - if req.Memory == "" { - req.Memory = "256Mi" - if req.Accelerator == "nvidia" { - req.Memory = "2Gi" - } - if req.Accelerator == "tenstorrent" { - req.Memory = strconv.Itoa(req.DeviceCount*4) + "Gi" - } - } - cpu, err := resource.ParseQuantity(req.CPU) - if err != nil || cpu.Sign() <= 0 || cpu.Cmp(resource.MustParse("8")) > 0 { - return req, errors.New("cpu must be a Kubernetes quantity greater than zero and at most 8") - } - memory, err := resource.ParseQuantity(req.Memory) - if err != nil || memory.Cmp(resource.MustParse("64Mi")) < 0 || memory.Cmp(resource.MustParse("32Gi")) > 0 { - return req, errors.New("memory must be between 64Mi and 32Gi") - } - if req.Accelerator == "tenstorrent" && memory.Cmp(resource.MustParse("2Gi")) < 0 { - return req, errors.New("Tenstorrent runtime requires at least 2Gi memory") - } - if e.team != nil { - if err := validateTeamRequest(e.team.Team, e.team.Member, &req); err != nil { - return req, err - } - } - return req, nil -} - -func (e *KubernetesExecutor) buildJob(id string, req CreateJobRequest) *batchv1.Job { - requestJSON, _ := json.Marshal(req) - labels := map[string]string{managedLabel: "mist", "mist.io/owner": e.owner} - if e.team != nil { - labels["mist.io/team"] = e.team.Team.ID - labels["mist.io/creator"] = memberOwner(e.team.Member.ID) - } - resources := corev1.ResourceList{corev1.ResourceCPU: resource.MustParse(req.CPU), corev1.ResourceMemory: resource.MustParse(req.Memory)} - workingDir := req.WorkingDirectory - if workingDir == "" && (req.Script != "" || req.Type == "training-smoke" || req.Accelerator == "tenstorrent") { - workingDir = "/tmp" - } - container := corev1.Container{Name: "workload", Image: req.Image, ImagePullPolicy: corev1.PullIfNotPresent, - Command: req.Command, Args: req.Args, WorkingDir: workingDir, - SecurityContext: &corev1.SecurityContext{Privileged: ptr(false), AllowPrivilegeEscalation: ptr(false), Capabilities: &corev1.Capabilities{Drop: []corev1.Capability{"ALL"}}}, - Resources: corev1.ResourceRequirements{Requests: resources.DeepCopy(), Limits: resources.DeepCopy()}, - VolumeMounts: []corev1.VolumeMount{{Name: "checkpoints", MountPath: "/checkpoints/" + id, SubPath: id}, {Name: "checkpoints", MountPath: "/outputs", SubPath: id}}, - Env: []corev1.EnvVar{{Name: "MIST_JOB_ID", Value: id}, {Name: "MIST_CHECKPOINT_DIR", Value: "/checkpoints/" + id}, {Name: "MIST_OUTPUT_DIR", Value: "/outputs"}}} - keys := []string{} - for key := range req.Env { - keys = append(keys, key) - } - sort.Strings(keys) - for _, key := range keys { - container.Env = append(container.Env, corev1.EnvVar{Name: key, Value: req.Env[key]}) - } - pvc := "mist-cpu-checkpoints" - pod := corev1.PodSpec{RestartPolicy: corev1.RestartPolicyNever, AutomountServiceAccountToken: ptr(false), - ImagePullSecrets: e.pullSecrets, - TerminationGracePeriodSeconds: ptr(int64(5)), NodeSelector: map[string]string{"kubernetes.io/hostname": e.cpuNode}} - if e.team != nil { - pod.SecurityContext = &corev1.PodSecurityContext{SeccompProfile: &corev1.SeccompProfile{Type: corev1.SeccompProfileTypeRuntimeDefault}} - } - if req.Accelerator == "nvidia" { - pvc = "training-nvidia-checkpoints" - count := resource.MustParse(strconv.Itoa(req.DeviceCount)) - container.Resources.Requests["nvidia.com/gpu"] = count - container.Resources.Limits["nvidia.com/gpu"] = count - } - if req.Accelerator == "tenstorrent" { - pvc = "training-tenstorrent-checkpoints" - pod.NodeSelector = map[string]string{"kubernetes.io/hostname": e.ttNode} - pod.ResourceClaims = []corev1.PodResourceClaim{{Name: "boards", ResourceClaimTemplateName: ptr(fmt.Sprintf("mist-tenstorrent-%d-boards", req.DeviceCount))}} - container.Resources.Claims = []corev1.ResourceClaim{{Name: "boards"}} - hugepages := resource.MustParse(fmt.Sprintf("%dGi", req.DeviceCount*2)) - container.Resources.Requests["hugepages-1Gi"] = hugepages - container.Resources.Limits["hugepages-1Gi"] = hugepages - if req.TTRuntime != "container" { - container.Env = append(container.Env, corev1.EnvVar{Name: "TT_METAL_HOME", Value: ttMetal}, corev1.EnvVar{Name: "PYTHONPATH", Value: ttMetal}, - corev1.EnvVar{Name: "LD_LIBRARY_PATH", Value: ttMetal + "/build/lib"}, corev1.EnvVar{Name: "TT_METAL_CACHE", Value: "/tmp/tt-metal-cache"}) - for _, host := range []struct{ name, path string }{{"metal", ttMetal}, {"python", "/home/utmist-tt/.local/share/uv/python"}} { - pod.Volumes = append(pod.Volumes, corev1.Volume{Name: host.name, VolumeSource: corev1.VolumeSource{HostPath: &corev1.HostPathVolumeSource{Path: host.path, Type: ptr(corev1.HostPathDirectory)}}}) - container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{Name: host.name, MountPath: host.path, ReadOnly: true}) - } - } - } - pod.Volumes = append(pod.Volumes, corev1.Volume{Name: "checkpoints", VolumeSource: corev1.VolumeSource{PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ClaimName: pvc}}}) - pod.InitContainers = []corev1.Container{prepareOutputs(id)} - if e.storage != nil { - pod.Volumes[len(pod.Volumes)-1].PersistentVolumeClaim.ClaimName = e.sharedPVC - subpath := "jobs/" + id + "/outputs" - if e.outputSubPath != "" { - subpath = e.outputSubPath - } - for i := range container.VolumeMounts { - if container.VolumeMounts[i].Name == "checkpoints" { - container.VolumeMounts[i].SubPath = subpath - } - } - // The API creates directories before submission. Init is restricted to this job's directory. - pod.InitContainers = nil - if req.DatasetID != "" { - volume, subpath := "checkpoints", "datasets/"+req.DatasetID+"/content" - if e.inputSubPath != "" { - subpath = e.inputSubPath - } - if e.inputPVC != "" { - volume, subpath = "input", e.inputSubPath - pod.Volumes = append(pod.Volumes, corev1.Volume{Name: volume, VolumeSource: corev1.VolumeSource{PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ClaimName: e.inputPVC, ReadOnly: true}}}) - } - container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{Name: volume, MountPath: "/inputs", SubPath: subpath, ReadOnly: true}) - container.Env = append(container.Env, corev1.EnvVar{Name: "MIST_INPUT_DIR", Value: "/inputs"}) - } - } - if req.Script != "" || req.Type == "training-smoke" { - configmap, mount := id+"-script", "/mist-script" - python := "python" - if req.Accelerator == "tenstorrent" && req.TTRuntime != "container" { - python = ttPython - } - if req.Type == "training-smoke" { - configmap, mount = "training-smoke-script", "/scripts" - expected := req.DeviceCount - if req.Accelerator == "tenstorrent" { - expected *= 2 - } - container.Command = []string{python, "-u", "/scripts/training_smoke.py", req.Accelerator, - "--expected-devices", strconv.Itoa(expected), "--output", "/checkpoints/" + id} - } else { - container.Command = []string{python, "-u", mount + "/" + req.ScriptName} - if filepath.Ext(req.ScriptName) == ".sh" { - container.Command = []string{"sh", mount + "/" + req.ScriptName} - } - } - pod.Volumes = append(pod.Volumes, corev1.Volume{Name: "script", VolumeSource: corev1.VolumeSource{ConfigMap: &corev1.ConfigMapVolumeSource{LocalObjectReference: corev1.LocalObjectReference{Name: configmap}}}}) - container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{Name: "script", MountPath: mount, ReadOnly: true}) - } - pod.Containers = []corev1.Container{container} - annotations := map[string]string{requestAnnotation: string(requestJSON)} - if e.storage != nil { - annotations["mist.io/storage"] = "shared-v1" - } - if e.team != nil { - annotations["mist.io/creator-id"] = e.team.Member.ID - annotations["mist.io/creator-name"] = e.team.Member.Name - annotations["mist.io/storage-scope"] = req.StorageScope - annotations["mist.io/output-path"] = e.outputSubPath - annotations["mist.io/queued-at"] = time.Now().UTC().Format(time.RFC3339Nano) - if isAdmin(e.team.Member) { - annotations["mist.io/admin-submission"] = "true" - } - } - return &batchv1.Job{ObjectMeta: metav1.ObjectMeta{Name: id, Namespace: e.namespace, Labels: labels, Annotations: annotations}, - Spec: batchv1.JobSpec{BackoffLimit: ptr(int32(0)), ActiveDeadlineSeconds: ptr(req.TimeoutSeconds), - Template: corev1.PodTemplateSpec{ObjectMeta: metav1.ObjectMeta{Labels: labels}, Spec: pod}}} -} - -func (e *KubernetesExecutor) submit(ctx context.Context, request CreateJobRequest) (*KubernetesJobStatus, error) { - if e.team != nil { - return e.team.Service.submitTeam(ctx, e, request) - } - if e.storage != nil { - e.storage.mu.Lock() - defer e.storage.mu.Unlock() - } - req, err := e.normalize(request) - if err != nil { - return nil, &submissionError{err} - } - if req.DatasetID != "" { - if e.storage == nil { - return nil, &submissionError{errors.New("shared datasets are not configured")} - } - if _, err := e.storage.dataset(req.DatasetID, e.owner); err != nil { - return nil, &submissionError{errors.New("dataset unavailable")} - } - } - if req.Accelerator == "tenstorrent" { - if _, err := e.client.ResourceV1().ResourceClaimTemplates(e.namespace).Get(ctx, fmt.Sprintf("mist-tenstorrent-%d-boards", req.DeviceCount), metav1.GetOptions{}); err != nil { - return nil, fmt.Errorf("Tenstorrent claim template unavailable: %w", err) - } - } - if req.Type == "training-smoke" { - if _, err := e.client.CoreV1().ConfigMaps(e.namespace).Get(ctx, "training-smoke-script", metav1.GetOptions{}); err != nil { - return nil, fmt.Errorf("training smoke script unavailable: %w", err) - } - } - random := make([]byte, 12) - if _, err := rand.Read(random); err != nil { - return nil, err - } - id := "mist-" + hex.EncodeToString(random) - if e.storage != nil { - if err := e.storage.prepareJob(id); err != nil { - return nil, err - } - } - jobCreated := false - defer func() { - if e.storage != nil && !jobCreated { - _ = os.RemoveAll(filepath.Join(e.storage.root, "jobs", id)) - } - }() - var script *corev1.ConfigMap - if req.Script != "" { - script, err = e.client.CoreV1().ConfigMaps(e.namespace).Create(ctx, &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: id + "-script", Labels: map[string]string{managedLabel: "mist"}}, Data: map[string]string{req.ScriptName: req.Script}}, metav1.CreateOptions{}) - if err != nil { - return nil, err - } - } - job, err := e.client.BatchV1().Jobs(e.namespace).Create(ctx, e.buildJob(id, req), metav1.CreateOptions{}) - if err != nil { - if script != nil { - _ = e.client.CoreV1().ConfigMaps(e.namespace).Delete(ctx, script.Name, metav1.DeleteOptions{}) - } - return nil, err - } - jobCreated = true - if script != nil { - script.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(job, batchv1.SchemeGroupVersion.WithKind("Job"))} - if _, err := e.client.CoreV1().ConfigMaps(e.namespace).Update(ctx, script, metav1.UpdateOptions{}); err != nil { - // Roll back submission rather than returning an error for a running orphan. - _ = e.client.BatchV1().Jobs(e.namespace).Delete(ctx, id, metav1.DeleteOptions{PropagationPolicy: ptr(metav1.DeletePropagationForeground)}) - _ = e.client.CoreV1().ConfigMaps(e.namespace).Delete(ctx, script.Name, metav1.DeleteOptions{}) - return nil, fmt.Errorf("attach script ownership: %w", err) - } - } - return e.baseStatus(job) -} - -type submissionError struct{ error } - -func (e *submissionError) Unwrap() error { return e.error } - -func (e *KubernetesExecutor) managedJob(ctx context.Context, id string) (*batchv1.Job, error) { - if len(validation.IsDNS1123Subdomain(id)) != 0 { - return nil, &submissionError{errors.New("invalid job ID")} - } - job, err := e.client.BatchV1().Jobs(e.namespace).Get(ctx, id, metav1.GetOptions{}) - if err == nil && (job.Labels[managedLabel] != "mist" || job.Labels["mist.io/owner"] != e.owner) { - return nil, apierrors.NewNotFound(batchv1.Resource("jobs"), id) - } - return job, err -} - -func (e *KubernetesExecutor) get(ctx context.Context, id string) (*KubernetesJobStatus, error) { - job, err := e.managedJob(ctx, id) - if err != nil { - return nil, err - } - return e.statusFor(ctx, job) -} - -func terminal(job *batchv1.Job) bool { - for _, condition := range job.Status.Conditions { - if condition.Status == corev1.ConditionTrue && (condition.Type == batchv1.JobComplete || condition.Type == batchv1.JobFailed) { - return true - } - } - return false -} - -func (e *KubernetesExecutor) baseStatus(job *batchv1.Job) (*KubernetesJobStatus, error) { - var req CreateJobRequest - if err := json.Unmarshal([]byte(job.Annotations[requestAnnotation]), &req); err != nil { - return nil, fmt.Errorf("invalid stored submission: %w", err) - } - status := &KubernetesJobStatus{Job: Job{ID: job.Name, Type: req.Type, Created: job.CreationTimestamp.Time, - JobState: JobStateScheduled, Payload: map[string]interface{}{"command": req.Command, "args": req.Args}}, Name: req.Name, - Image: req.Image, Accelerator: req.Accelerator, DeviceCount: req.DeviceCount, CPU: req.CPU, Memory: req.Memory, Owner: e.owner, CheckpointDirectory: "/checkpoints/" + job.Name, - WorkingDirectory: req.WorkingDirectory, TimeoutSeconds: req.TimeoutSeconds, DatasetID: req.DatasetID} - status.Owner = job.Labels["mist.io/owner"] - status.TeamID, status.CreatorID, status.CreatorName, status.StorageScope = job.Labels["mist.io/team"], job.Annotations["mist.io/creator-id"], job.Annotations["mist.io/creator-name"], job.Annotations["mist.io/storage-scope"] - if e.team != nil { - status.CanCancel = ptr(isAdmin(e.team.Member) || status.CreatorID == e.team.Member.ID) - } - if job.Annotations["mist.io/queued-at"] != "" && job.Annotations["mist.io/admitted-at"] == "" { - status.Message = "Queued: waiting for a fair turn and available team/machine resources" - } - // Older pilot jobs mounted the shared checkpoint root, before /outputs existed. - for _, container := range job.Spec.Template.Spec.Containers { - if container.Name != "workload" { - continue - } - for _, mount := range container.VolumeMounts { - if mount.MountPath == "/outputs" { - status.OutputDirectory = "/outputs" - } - } - } - if status.Name == "" { - status.Name = job.Name - } - if req.Accelerator != "cpu" { - status.RequiredGPU = req.Accelerator - } - return status, nil -} - -func (e *KubernetesExecutor) statusFor(ctx context.Context, job *batchv1.Job) (*KubernetesJobStatus, error) { - return e.statusWithData(ctx, job, nil) -} - -func (e *KubernetesExecutor) statusWithData(ctx context.Context, job *batchv1.Job, data *jobStateData) (*KubernetesJobStatus, error) { - status, err := e.baseStatus(job) - if err != nil { - return nil, err - } - if job.Status.StartTime != nil { - status.TimeAssigned = &job.Status.StartTime.Time - } - if job.Status.CompletionTime != nil { - status.TimeCompleted = &job.Status.CompletionTime.Time - } - for _, condition := range job.Status.Conditions { - if condition.Status != corev1.ConditionTrue { - continue - } - if condition.Type == batchv1.JobComplete { - status.JobState = JobStateSuccess - } - if condition.Type == batchv1.JobFailed { - status.JobState = JobStateFailure - status.Message = condition.Reason + ": " + condition.Message - status.Error = ptr(status.Message) - status.TimeCompleted = &condition.LastTransitionTime.Time - } - } - pods := &corev1.PodList{} - if data != nil { - pods.Items = data.pods[job.Name] - } else { - pods, err = e.client.CoreV1().Pods(e.namespace).List(ctx, metav1.ListOptions{LabelSelector: "batch.kubernetes.io/job-name=" + job.Name}) - if err != nil { - return nil, err - } - } - sort.Slice(pods.Items, func(i, j int) bool { return pods.Items[i].CreationTimestamp.Before(&pods.Items[j].CreationTimestamp) }) - if len(pods.Items) != 0 { - pod := pods.Items[len(pods.Items)-1] - status.Node, status.Pod = pod.Spec.NodeName, pod.Name - if pod.Status.Phase == corev1.PodRunning && !terminal(job) { - status.JobState = JobStateInProgress - } - for _, init := range pod.Status.InitContainerStatuses { - if init.State.Waiting != nil && !terminal(job) { - status.Message = init.Name + ": " + init.State.Waiting.Reason + ": " + init.State.Waiting.Message - } - if exit := init.State.Terminated; exit != nil && exit.ExitCode != 0 { - status.JobState = JobStateFailure - status.ExitCode = &exit.ExitCode - status.Message = init.Name + " failed: " + exit.Reason - status.Error = ptr(status.Message) - } - } - for _, container := range pod.Status.ContainerStatuses { - if container.Name != "workload" { - continue - } - if container.State.Running != nil { - status.TimeStarted = &container.State.Running.StartedAt.Time - } - if container.State.Terminated != nil { - exit := container.State.Terminated - status.ExitCode = &exit.ExitCode - status.TimeStarted = &exit.StartedAt.Time - status.TimeCompleted = &exit.FinishedAt.Time - if exit.ExitCode != 0 { - status.JobState = JobStateFailure - if status.Message == "" { - status.Message = exit.Reason - } - status.Error = ptr(status.Message) - } - } - if container.State.Waiting != nil && container.State.Waiting.Reason != "PodInitializing" && !terminal(job) { - status.Message = container.State.Waiting.Reason + ": " + container.State.Waiting.Message - } - } - if pod.Status.Phase == corev1.PodPending && pod.Spec.NodeName == "" && !terminal(job) { - events := &corev1.EventList{} - if data != nil { - events.Items = data.events - } else { - events, err = e.client.CoreV1().Events(e.namespace).List(ctx, metav1.ListOptions{FieldSelector: "involvedObject.uid=" + string(pod.UID)}) - if err != nil { - return nil, err - } - } - for _, event := range events.Items { - if event.InvolvedObject.UID == pod.UID && event.Reason == "FailedScheduling" { - status.Message = event.Message - } - } - } - for _, claimStatus := range pod.Status.ResourceClaimStatuses { - if claimStatus.ResourceClaimName == nil { - continue - } - var allocation []AllocatedDevice - if data != nil { - claim := data.claims[*claimStatus.ResourceClaimName] - if claim.Status.Allocation != nil { - for _, result := range claim.Status.Allocation.Devices.Results { - allocation = append(allocation, AllocatedDevice{result.Driver, result.Pool, result.Device}) - } - } - } else { - claim, err := e.client.ResourceV1().ResourceClaims(e.namespace).Get(ctx, *claimStatus.ResourceClaimName, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - continue - } - if err != nil { - return nil, err - } - if claim.Status.Allocation != nil { - for _, result := range claim.Status.Allocation.Devices.Results { - allocation = append(allocation, AllocatedDevice{result.Driver, result.Pool, result.Device}) - } - } - } - status.Devices = append(status.Devices, allocation...) - } - } - if cancelled := job.Annotations[cancelAnnotation]; cancelled != "" { - status.JobState = JobStateCancelled - status.Message = "Cancelled by user" - if reason := job.Annotations["mist.io/stop-reason"]; reason != "" { - status.Message = reason - } - if when, err := time.Parse(time.RFC3339, cancelled); err == nil { - status.TimeCompleted = &when - } - } - return status, nil -} - -func (e *KubernetesExecutor) list(ctx context.Context) ([]KubernetesJobStatus, error) { - jobs, err := e.client.BatchV1().Jobs(e.namespace).List(ctx, metav1.ListOptions{LabelSelector: managedLabel + "=mist,mist.io/owner=" + e.owner}) - if err != nil { - return nil, err - } - result := make([]KubernetesJobStatus, 0, len(jobs.Items)) - data, err := e.loadJobState(ctx) - if err != nil { - return nil, err - } - for i := range jobs.Items { - status, err := e.statusWithData(ctx, &jobs.Items[i], data) - if err != nil { - return nil, err - } - result = append(result, *status) - } - sort.Slice(result, func(i, j int) bool { return result[i].Created.After(result[j].Created) }) - return result, nil -} - -func (e *KubernetesExecutor) logs(ctx context.Context, id string) (string, error) { - job, err := e.managedJob(ctx, id) - if err != nil { - return "", err - } - if job.Annotations[cancelAnnotation] != "" { - return job.Annotations[cancelLogsAnnotation], nil - } - pods, err := e.client.CoreV1().Pods(e.namespace).List(ctx, metav1.ListOptions{LabelSelector: "batch.kubernetes.io/job-name=" + id}) - if err != nil { - return "", err - } - var logs strings.Builder - for _, pod := range pods.Items { - if len(pod.Status.ContainerStatuses) == 0 { - continue - } - state := pod.Status.ContainerStatuses[0].State - if state.Running == nil && state.Terminated == nil { - continue - } - stream, err := e.client.CoreV1().Pods(e.namespace).GetLogs(pod.Name, &corev1.PodLogOptions{Container: "workload", TailLines: ptr(int64(1000)), LimitBytes: ptr(maxLogBytes)}).Stream(ctx) - if err != nil { - return "", err - } - data, err := io.ReadAll(io.LimitReader(stream, maxLogBytes)) - stream.Close() - if err != nil { - return "", err - } - logs.Write(data) - } - value := logs.String() - if len(value) > int(maxLogBytes) { - value = value[len(value)-int(maxLogBytes):] - } - return value, nil -} - -func (e *KubernetesExecutor) cancel(ctx context.Context, id string) (*KubernetesJobStatus, error) { - job, err := e.managedJob(ctx, id) - if err != nil { - return nil, err - } - if e.team != nil && !isAdmin(e.team.Member) && job.Annotations["mist.io/creator-id"] != e.team.Member.ID { - return nil, &permissionError{errors.New("Only the job owner or an administrator can cancel this job")} - } - if job.Annotations[cancelAnnotation] != "" { - return e.statusFor(ctx, job) - } - if terminal(job) { - return nil, &submissionError{errors.New("completed jobs cannot be cancelled")} - } - initial, err := e.statusFor(ctx, job) - if err != nil { - return nil, err - } - if initial.ExitCode != nil { - return nil, &submissionError{errors.New("workload has already exited")} - } - logs, logErr := e.logs(ctx, id) - if logErr != nil { - return nil, fmt.Errorf("preserve logs before cancellation: %w", logErr) - } - // Keep cancellation annotations below Kubernetes' metadata size limit, - // including submissions and replacement encoding of non-UTF-8 output. - if len(logs) > 32*1024 { - logs = logs[len(logs)-32*1024:] - } - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - current, err := e.managedJob(ctx, id) - if err != nil { - return err - } - if terminal(current) { - return &submissionError{errors.New("job completed before cancellation")} - } - status, err := e.statusFor(ctx, current) - if err != nil { - return err - } - if status.ExitCode != nil { - return &submissionError{errors.New("workload has already exited")} - } - if current.Annotations[cancelAnnotation] != "" { - job = current - return nil - } - current.Spec.Suspend = ptr(true) - current.Annotations[cancelAnnotation] = time.Now().UTC().Format(time.RFC3339) - current.Annotations[cancelLogsAnnotation] = logs - job, err = e.client.BatchV1().Jobs(e.namespace).Update(ctx, current, metav1.UpdateOptions{}) - return err - }) - if err != nil { - return nil, err - } - return e.statusFor(ctx, job) -} diff --git a/src/kubernetes_test.go b/src/kubernetes_test.go deleted file mode 100644 index e11a0ab..0000000 --- a/src/kubernetes_test.go +++ /dev/null @@ -1,159 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "io" - "log/slog" - "net/http/httptest" - "strings" - "testing" - - batchv1 "k8s.io/api/batch/v1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/fake" -) - -func testExecutor() *KubernetesExecutor { - return &KubernetesExecutor{client: fake.NewSimpleClientset(), namespace: "mist", owner: "test", cpuNode: "cpu-node", ttNode: "tt-node", - allowedImages: map[string]bool{cpuImage: true, nvidiaImage: true, ttImage: true}} -} - -func TestKubernetesRejectInvalidSubmission(t *testing.T) { - e := testExecutor() - for _, request := range []CreateJobRequest{ - {Command: []string{"true"}, Accelerator: "amd"}, - {Command: []string{"true"}, Accelerator: "cpu", DeviceCount: 1}, - {Command: []string{"true"}, Accelerator: "nvidia", DeviceCount: 3}, - {Command: []string{"true"}, Accelerator: "tenstorrent", DeviceCount: 5}, - {Command: []string{"true"}, CPU: "-1"}, - {Command: []string{"true"}, CPU: "9"}, - {Command: []string{"true"}, Memory: "1Ti"}, - {Command: []string{"true"}, Image: "unapproved/image:latest"}, - {Script: "print(1)", ScriptName: "../escape.py"}, - {Script: "print(1)", Command: []string{"sh"}}, - {Command: []string{"true"}, Env: map[string]string{"MIST_JOB_ID": "spoofed"}}, - {Command: []string{"true"}, Accelerator: "tenstorrent", Env: map[string]string{"TT_METAL_HOME": "/host"}}, - } { - if _, err := e.submit(context.Background(), request); err == nil { - t.Errorf("accepted invalid submission: %+v", request) - } - } - jobs, _ := e.client.BatchV1().Jobs("mist").List(context.Background(), metav1.ListOptions{}) - if len(jobs.Items) != 0 { - t.Fatal("invalid submissions created jobs") - } -} - -func TestKubernetesReportsActualExitBeforeControllerCompletion(t *testing.T) { - e := testExecutor() - ctx := context.Background() - status, err := e.submit(ctx, CreateJobRequest{Command: []string{"sh", "-c", "exit 17"}}) - if err != nil { - t.Fatal(err) - } - _, err = e.client.CoreV1().Pods("mist").Create(ctx, &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "failed-pod", Labels: map[string]string{"batch.kubernetes.io/job-name": status.ID}}, - Status: corev1.PodStatus{Phase: corev1.PodFailed, ContainerStatuses: []corev1.ContainerStatus{{Name: "workload", State: corev1.ContainerState{Terminated: &corev1.ContainerStateTerminated{ExitCode: 17, Reason: "Error"}}}}}}, metav1.CreateOptions{}) - if err != nil { - t.Fatal(err) - } - actual, err := e.get(ctx, status.ID) - if err != nil { - t.Fatal(err) - } - if actual.JobState != JobStateFailure || actual.ExitCode == nil || *actual.ExitCode != 17 { - t.Fatalf("wrong status: %+v", actual) - } - if _, err := e.cancel(ctx, status.ID); err == nil { - t.Fatal("cancellation overwrote an already failed workload") - } -} - -func TestKubernetesReportsCurrentWaitingReasonAfterPlacement(t *testing.T) { - e := testExecutor() - ctx := context.Background() - job, err := e.submit(ctx, CreateJobRequest{Accelerator: "nvidia", Command: []string{"true"}}) - if err != nil { - t.Fatal(err) - } - _, err = e.client.CoreV1().Pods("mist").Create(ctx, &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{Name: "waiting-pod", UID: "waiting-uid", Labels: map[string]string{ - "batch.kubernetes.io/job-name": job.ID, managedLabel: "mist", "mist.io/owner": e.owner}}, - Spec: corev1.PodSpec{NodeName: e.cpuNode}, - Status: corev1.PodStatus{Phase: corev1.PodPending, ContainerStatuses: []corev1.ContainerStatus{{Name: "workload", - State: corev1.ContainerState{Waiting: &corev1.ContainerStateWaiting{Reason: "ImagePullBackOff", Message: "image unavailable"}}}}}, - }, metav1.CreateOptions{}) - if err != nil { - t.Fatal(err) - } - _, err = e.client.CoreV1().Events("mist").Create(ctx, &corev1.Event{ - ObjectMeta: metav1.ObjectMeta{Name: "old-scheduling-failure"}, - InvolvedObject: corev1.ObjectReference{UID: "waiting-uid"}, Reason: "FailedScheduling", Message: "Insufficient nvidia.com/gpu", - }, metav1.CreateOptions{}) - if err != nil { - t.Fatal(err) - } - actual, err := e.get(ctx, job.ID) - if err != nil { - t.Fatal(err) - } - listed, err := e.list(ctx) - if err != nil { - t.Fatal(err) - } - if !strings.Contains(actual.Message, "ImagePullBackOff") || len(listed) != 1 || !strings.Contains(listed[0].Message, "ImagePullBackOff") { - t.Fatalf("old queue event replaced current pull failure: single=%+v list=%+v", actual, listed) - } -} - -func TestKubernetesCancellationPersistsAcrossExecutorRestart(t *testing.T) { - e := testExecutor() - ctx := context.Background() - status, err := e.submit(ctx, CreateJobRequest{Command: []string{"sleep", "120"}}) - if err != nil { - t.Fatal(err) - } - if _, err := e.cancel(ctx, status.ID); err != nil { - t.Fatal(err) - } - restarted := *e - actual, err := restarted.get(ctx, status.ID) - if err != nil { - t.Fatal(err) - } - job, _ := e.client.BatchV1().Jobs("mist").Get(ctx, status.ID, metav1.GetOptions{}) - if actual.JobState != JobStateCancelled || job.Spec.Suspend == nil || !*job.Spec.Suspend { - t.Fatal("cancelled job did not retain state and stop scheduling") - } - if _, err := restarted.cancel(ctx, status.ID); err != nil { - t.Fatal("repeat cancellation must be idempotent", err) - } -} - -func TestKubernetesDoesNotExposeUnmanagedJobs(t *testing.T) { - e := testExecutor() - ctx := context.Background() - _, _ = e.client.BatchV1().Jobs("mist").Create(ctx, &batchv1.Job{ObjectMeta: metav1.ObjectMeta{Name: "operator-job"}}, metav1.CreateOptions{}) - if _, err := e.get(ctx, "operator-job"); err == nil { - t.Fatal("exposed unmanaged job") - } - if _, err := e.cancel(ctx, "operator-job"); err == nil { - t.Fatal("cancelled unmanaged job") - } -} - -func TestKubernetesHTTPRejectsUnknownAndMultipleObjects(t *testing.T) { - app := NewKubernetesApp(testExecutor(), slog.New(slog.NewTextHandler(io.Discard, nil))) - for _, body := range []string{`{"command":["true"],"privileged":true}`, `{"command":["true"]} {"command":["false"]}`} { - recorder := httptest.NewRecorder() - app.httpServer.Handler.ServeHTTP(recorder, httptest.NewRequest("POST", "/jobs", strings.NewReader(body))) - if recorder.Code != 400 { - t.Fatalf("unexpected response %d: %s", recorder.Code, recorder.Body.String()) - } - var result map[string]string - if err := json.Unmarshal(recorder.Body.Bytes(), &result); err != nil || result["error"] == "" { - t.Fatal("missing structured error") - } - } -} diff --git a/src/main.go b/src/main.go deleted file mode 100644 index fb3241d..0000000 --- a/src/main.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - -import ( - "context" - "log/slog" - "os" - "os/signal" - "syscall" - "time" -) - -func main() { - log := slog.New(slog.NewJSONHandler(os.Stdout, nil)) - if mode := envOr("MIST_EXECUTOR", "kubernetes"); mode != "kubernetes" { - log.Error("unsupported executor; the Docker/Redis executor has been retired", "executor", mode) - os.Exit(1) - } - executor, err := NewKubernetesExecutor() - if err != nil { - log.Error("Kubernetes configuration failed", "error", err) - os.Exit(1) - } - if os.Getenv("MIST_AUTH_DISABLED") != "true" && os.Getenv("MIST_AUTH_ENABLED") == "" { - _ = os.Setenv("MIST_AUTH_ENABLED", "true") - } - app := NewKubernetesApp(executor, log) - if err := app.Start(); err != nil { - log.Error("API startup failed", "error", err) - os.Exit(1) - } - ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) - defer stop() - <-ctx.Done() - shutdown, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - if err := app.Shutdown(shutdown); err != nil { - log.Error("API shutdown failed", "error", err) - } -} diff --git a/src/member_auth.go b/src/member_auth.go deleted file mode 100644 index 76d6511..0000000 --- a/src/member_auth.go +++ /dev/null @@ -1,69 +0,0 @@ -package main - -import ( - "crypto/sha256" - "encoding/hex" - "net" - "net/http" - "os" - "strings" -) - -type memberKey struct{} - -func hashID(id string) string { - digest := sha256.Sum256([]byte(id)) - return hex.EncodeToString(digest[:12]) -} - -type Member struct { - ID string `json:"id"` - Email string `json:"email"` - Name string `json:"name"` - Role string `json:"role"` -} - -type AccountStatus struct { - Role string `json:"role"` -} - -type AuthGateway = AuthService - -func newAuthGateway(raw string) (*AuthGateway, error) { - return newAuthService(raw, nil) -} - -func (a *App) requestExecutor(r *http.Request) *KubernetesExecutor { - if access, _ := r.Context().Value(teamContextKey{}).(*TeamAccess); access != nil { - clone := *a.executor - clone.namespace, clone.owner = access.Team.namespace(), access.Team.ID - clone.storage, clone.sharedPVC, clone.team = access.Store, "team-results", access - clone.inputPVC = "team-datasets" - return &clone - } - member, _ := r.Context().Value(memberKey{}).(*Member) - if member == nil { - return a.executor - } - clone := *a.executor - if a.auth != nil && strings.EqualFold(member.Email, a.auth.legacyEmail) { - clone.owner = a.executor.owner - } else { - digest := sha256.Sum256([]byte(member.ID)) - clone.owner = "user-" + hex.EncodeToString(digest[:12]) - } - return &clone -} - -// Trust exactly the deployed Nginx host/gateway, never a client-supplied chain. -func clientAddress(r *http.Request) string { - host, _, _ := net.SplitHostPort(r.RemoteAddr) - for _, trusted := range strings.Split(os.Getenv("MIST_TRUSTED_PROXY_IPS"), ",") { - if trusted != "" && trusted == host { - if ip := net.ParseIP(r.Header.Get("X-Real-IP")); ip != nil { - return ip.String() - } - } - } - return host -} diff --git a/src/outputs.go b/src/outputs.go deleted file mode 100644 index 9ea11f7..0000000 --- a/src/outputs.go +++ /dev/null @@ -1,24 +0,0 @@ -package main - -import ( - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" -) - -// prepareOutputs creates the job's PVC subdirectory before kubelet mounts it -// into the workload. Both supported root and nonroot images can write results. -// Retained node-local jobs use this initializer. Team jobs prepare their scoped -// NFS output directory through the API and do not mount the parent checkpoint PVC. -func prepareOutputs(id string) corev1.Container { - return corev1.Container{ - Name: "prepare-outputs", Image: "busybox:1.36", ImagePullPolicy: corev1.PullIfNotPresent, - Command: []string{"sh", "-c", `mkdir -p "/checkpoints/$MIST_JOB_ID" && chmod 0777 "/checkpoints/$MIST_JOB_ID"`}, - Env: []corev1.EnvVar{{Name: "MIST_JOB_ID", Value: id}}, - VolumeMounts: []corev1.VolumeMount{{Name: "checkpoints", MountPath: "/checkpoints"}}, - SecurityContext: &corev1.SecurityContext{RunAsUser: ptr(int64(0)), Privileged: ptr(false), AllowPrivilegeEscalation: ptr(false), Capabilities: &corev1.Capabilities{Drop: []corev1.Capability{"ALL"}}}, - Resources: corev1.ResourceRequirements{ - Requests: corev1.ResourceList{corev1.ResourceCPU: resource.MustParse("10m"), corev1.ResourceMemory: resource.MustParse("16Mi")}, - Limits: corev1.ResourceList{corev1.ResourceCPU: resource.MustParse("100m"), corev1.ResourceMemory: resource.MustParse("32Mi")}, - }, - } -} diff --git a/src/shared_storage.go b/src/shared_storage.go deleted file mode 100644 index 5d7c095..0000000 --- a/src/shared_storage.go +++ /dev/null @@ -1,593 +0,0 @@ -package main - -import ( - "archive/zip" - "crypto/rand" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - batchv1 "k8s.io/api/batch/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "mime" - "net/http" - "os" - "path/filepath" - "regexp" - "sort" - "strconv" - "strings" - "sync" - "syscall" - "time" -) - -// Uploads are bounded by real shared-disk free space and an optional upload cap. -const maxDatasetBytes int64 = 1 << 50 - -var datasetIDPattern = regexp.MustCompile(`^dataset-[a-f0-9]{24}$`) - -type SharedStorage struct { - root string - modelRoot string - mu sync.Mutex - uploadMu sync.Mutex - uploadLimit int64 -} -type Dataset struct { - ID string `json:"id"` - Name string `json:"name"` - Filename string `json:"filename"` - Owner string `json:"owner"` - Size int64 `json:"size"` - SHA256 string `json:"sha256"` - Created time.Time `json:"created"` - State string `json:"state"` - Files int `json:"files"` - TeamID string `json:"team_id,omitempty"` - TeamName string `json:"team_name,omitempty"` - Scope string `json:"scope,omitempty"` - MemberName string `json:"member_name,omitempty"` - ContentPath string `json:"content_path,omitempty"` - Shared bool `json:"shared,omitempty"` -} - -func NewSharedStorage(root string) (*SharedStorage, error) { - if !filepath.IsAbs(root) { - return nil, errors.New("storage root must be absolute") - } - for _, dir := range []string{"metadata/datasets", ".uploads", "datasets", "jobs", "legacy"} { - if err := os.MkdirAll(filepath.Join(root, dir), 0700); err != nil { - return nil, err - } - } - limit := maxDatasetBytes - if configured := os.Getenv("MIST_MAX_DATASET_GIB"); configured != "" { - gib, err := strconv.ParseInt(configured, 10, 64) - if err != nil || gib < 1 || gib > maxDatasetBytes/(1024*1024*1024) { - return nil, errors.New("MIST_MAX_DATASET_GIB is outside the supported range") - } - limit = gib * 1024 * 1024 * 1024 - } - return &SharedStorage{root: root, uploadLimit: limit}, nil -} - -func (s *SharedStorage) availableUploadLimit(team bool) int64 { - var stats syscall.Statfs_t - if syscall.Statfs(s.root, &stats) != nil { - return 0 - } - reserve := int64(1024 * 1024 * 1024) - return max(0, min(s.uploadLimit, int64(stats.Bavail)*stats.Bsize-reserve)) -} -func (s *SharedStorage) dataset(id, owner string) (*Dataset, error) { - if !datasetIDPattern.MatchString(id) { - return nil, os.ErrNotExist - } - data, err := os.ReadFile(filepath.Join(s.root, "metadata/datasets", id+".json")) - if err != nil { - return nil, err - } - var ds Dataset - if err = json.Unmarshal(data, &ds); err != nil { - return nil, err - } - if ds.ID != id || ds.Owner != owner || ds.State != "Ready" { - return nil, os.ErrNotExist - } - return &ds, nil -} -func (s *SharedStorage) resultsRoot() string { - if s.modelRoot != "" { - return s.modelRoot - } - return s.root -} -func (s *SharedStorage) prepareJob(id string) error { - dir := filepath.Join(s.resultsRoot(), "jobs", id, "outputs") - if err := os.MkdirAll(dir, 0755); err != nil { - return err - } - return os.Chmod(dir, 0777) -} -func safeRelative(path string) bool { - return path != "" && path != "." && filepath.IsLocal(path) && !strings.ContainsAny(path, "\\\x00") && filepath.Clean(path) == path -} -func (s *SharedStorage) upload(r *http.Request, owner string) (*Dataset, error) { - filename := r.URL.Query().Get("filename") - if !safeRelative(filename) || filepath.Base(filename) != filename || len(filename) > 200 { - return nil, &submissionError{errors.New("invalid upload filename")} - } - name := strings.TrimSpace(r.URL.Query().Get("name")) - if name == "" { - name = filename - } - if len(name) > 120 { - return nil, &submissionError{errors.New("dataset name exceeds 120 characters")} - } - format := r.URL.Query().Get("format") - if format != "" && format != "zip" { - return nil, &submissionError{errors.New("format must be zip or omitted")} - } - s.uploadMu.Lock() - defer s.uploadMu.Unlock() - var stats syscall.Statfs_t - if err := syscall.Statfs(s.root, &stats); err != nil { - return nil, err - } - reserve := int64(1024 * 1024 * 1024) - remaining := int64(stats.Bavail)*stats.Bsize - reserve - if remaining <= 0 { - return nil, fmt.Errorf("dataset storage has insufficient free space: %w", syscall.ENOSPC) - } - limit := min(s.uploadLimit, remaining) - if r.ContentLength > limit { - return nil, &submissionError{errors.New("dataset exceeds upload limit or available storage")} - } - random := make([]byte, 12) - if _, err := rand.Read(random); err != nil { - return nil, err - } - id := "dataset-" + hex.EncodeToString(random) - stage := filepath.Join(s.root, ".uploads", id) - if err := os.Mkdir(stage, 0700); err != nil { - return nil, err - } - defer os.RemoveAll(stage) - upload := filepath.Join(stage, "upload") - file, err := os.OpenFile(upload, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600) - if err != nil { - return nil, err - } - checksum := sha256.New() - n, copyErr := io.Copy(io.MultiWriter(file, checksum), io.LimitReader(r.Body, limit+1)) - syncErr := file.Sync() - closeErr := file.Close() - if copyErr != nil { - return nil, copyErr - } - if syncErr != nil { - return nil, syncErr - } - if closeErr != nil { - return nil, closeErr - } - if err = r.Context().Err(); err != nil { - return nil, err - } - if n > limit { - return nil, &submissionError{errors.New("dataset exceeds upload limit or available storage")} - } - if n == 0 { - return nil, &submissionError{errors.New("dataset is empty")} - } - content := filepath.Join(stage, "content") - if err = os.Mkdir(content, 0755); err != nil { - return nil, err - } - count, size := 1, n - if format == "zip" { - count, size, err = extractDatasetZip(upload, content, min(s.uploadLimit, remaining-n)) - if err != nil { - return nil, &submissionError{err} - } - } else { - if err = os.Rename(upload, filepath.Join(content, filename)); err != nil { - return nil, err - } - if err = os.Chmod(filepath.Join(content, filename), 0644); err != nil { - return nil, err - } - } - ds := &Dataset{ID: id, Name: name, Filename: filename, Owner: owner, Size: size, SHA256: hex.EncodeToString(checksum.Sum(nil)), Created: time.Now().UTC(), State: "Ready", Files: count} - relative := "datasets/" + id - access, _ := r.Context().Value(teamContextKey{}).(*TeamAccess) - if access != nil { - access.Service.mu.Lock() - defer access.Service.mu.Unlock() - scope := r.URL.Query().Get("scope") - if scope == "" { - scope = access.Member.ID - } - if err = access.Service.canWrite(r.Context(), access, scope); err != nil { - return nil, err - } - ds.TeamID, ds.Scope, ds.MemberName = access.Team.ID, scope, access.Member.Name - relative = scopePath(scope) + "/datasets/" + id - ds.ContentPath = relative + "/content" - } - target := filepath.Join(s.root, relative) - if err = os.MkdirAll(target, 0755); err != nil { - return nil, err - } - published := false - defer func() { - if !published { - _ = os.RemoveAll(target) - } - }() - if err = os.Rename(content, filepath.Join(target, "content")); err != nil { - return nil, err - } - data, _ := json.Marshal(ds) - temp := filepath.Join(stage, "metadata.json") - if err = os.WriteFile(temp, data, 0600); err != nil { - return nil, err - } - if err = os.Rename(temp, filepath.Join(s.root, "metadata/datasets", id+".json")); err != nil { - return nil, err - } - published = true - return ds, nil -} -func extractDatasetZip(path, destination string, limit int64) (int, int64, error) { - archive, err := zip.OpenReader(path) - if err != nil { - return 0, 0, errors.New("invalid ZIP archive") - } - defer archive.Close() - if len(archive.File) > 10000 { - return 0, 0, errors.New("ZIP contains too many entries") - } - var total int64 - files := 0 - for _, entry := range archive.File { - name := strings.TrimSuffix(entry.Name, "/") - if !safeRelative(name) || entry.Mode()&os.ModeSymlink != 0 || (!entry.FileInfo().IsDir() && !entry.Mode().IsRegular()) { - return 0, 0, errors.New("ZIP contains an unsafe path or special file") - } - target := filepath.Join(destination, name) - if entry.FileInfo().IsDir() { - if err = os.MkdirAll(target, 0755); err != nil { - return 0, 0, err - } - continue - } - if entry.UncompressedSize64 > uint64(max(int64(0), limit-total)) { - return 0, 0, errors.New("expanded ZIP exceeds dataset limit") - } - if err = os.MkdirAll(filepath.Dir(target), 0755); err != nil { - return 0, 0, err - } - output, err := os.OpenFile(target, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644) - if err != nil { - return 0, 0, err - } - reader, err := entry.Open() - if err != nil { - output.Close() - return 0, 0, err - } - n, copyErr := io.Copy(output, io.LimitReader(reader, limit-total+1)) - reader.Close() - closeErr := output.Close() - total += n - if copyErr != nil { - return 0, 0, copyErr - } - if closeErr != nil { - return 0, 0, closeErr - } - if total > limit { - return 0, 0, errors.New("expanded ZIP exceeds dataset limit") - } - files++ - } - if files == 0 { - return 0, 0, errors.New("ZIP contains no files") - } - return files, total, nil -} -func (a *App) storageInfo(w http.ResponseWriter, r *http.Request) { - e := a.requestExecutor(r) - s := e.storage - if s == nil { - writeJSON(w, 200, map[string]interface{}{"enabled": false}) - return - } - var stat syscall.Statfs_t - if err := syscall.Statfs(s.root, &stat); err != nil { - executorError(w, err) - return - } - info := map[string]interface{}{"enabled": true, "capacity_bytes": stat.Blocks * uint64(stat.Bsize), "available_bytes": stat.Bavail * uint64(stat.Bsize), "upload_limit_bytes": s.availableUploadLimit(e.team != nil), "max_dataset_bytes": s.uploadLimit} - if e.team != nil { - usage, err := a.teams.storageStatus(e.team.Team.ID) - if err != nil { - executorError(w, err) - return - } - info["storage_mode"] = "shared-folders" - info["storage_limits_enforced"] = false - // Retained response fields are aliases for the same shared disk, not - // independent model capacity. New clients use the sampled usage fields. - info["model_capacity_bytes"], info["model_available_bytes"] = info["capacity_bytes"], info["available_bytes"] - info["dataset_used_bytes"], info["model_used_bytes"] = usage.DatasetUsedBytes, usage.ModelUsedBytes - info["usage_observed_at"] = usage.observedAt() - info["usage_stale"] = time.Since(time.Unix(usage.UsageObservedUnix, 0)) > 2*time.Minute - info["storage_low"] = stat.Bavail*uint64(stat.Bsize) < max(uint64(5*1024*1024*1024), stat.Blocks*uint64(stat.Bsize)/10) - info["dataset_allocation_gib"], info["model_allocation_gib"] = e.team.Team.Policy.StorageGiB, e.team.Team.Policy.ModelStorageGiB - } - writeJSON(w, 200, info) -} -func (a *App) datasets(w http.ResponseWriter, r *http.Request) { - e := a.requestExecutor(r) - s := e.storage - if s == nil { - writeJSON(w, 503, map[string]string{"error": "Shared storage is not configured"}) - return - } - if e.team != nil { - a.teamDatasets(w, r, e) - return - } - switch r.Method { - case http.MethodGet: - s.mu.Lock() - defer s.mu.Unlock() - entries, err := os.ReadDir(filepath.Join(s.root, "metadata/datasets")) - if err != nil { - executorError(w, err) - return - } - list := []Dataset{} - for _, entry := range entries { - if ds, err := s.dataset(strings.TrimSuffix(entry.Name(), ".json"), e.owner); err == nil { - list = append(list, *ds) - } - } - sort.Slice(list, func(i, j int) bool { return list[i].Created.After(list[j].Created) }) - writeJSON(w, 200, map[string]interface{}{"datasets": list, "upload_limit_bytes": s.availableUploadLimit(false)}) - case http.MethodPost: - controller := http.NewResponseController(w) - _ = controller.SetReadDeadline(time.Now().Add(24 * time.Hour)) - _ = controller.SetWriteDeadline(time.Now().Add(24 * time.Hour)) - r.Body = http.MaxBytesReader(w, r.Body, s.uploadLimit+1) - ds, err := s.upload(r, e.owner) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 201, ds) - default: - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) - } -} -func (a *App) dataset(w http.ResponseWriter, r *http.Request) { - if strings.Contains(r.URL.Path, "/files") { - a.datasetFiles(w, r) - return - } - e := a.requestExecutor(r) - s := e.storage - if s == nil { - writeJSON(w, 503, map[string]string{"error": "Shared storage is not configured"}) - return - } - id := strings.TrimPrefix(r.URL.Path, "/datasets/") - if e.team != nil { - a.teamDataset(w, r, e, id) - return - } - s.mu.Lock() - defer s.mu.Unlock() - ds, err := s.dataset(id, e.owner) - if err != nil { - writeJSON(w, 404, map[string]string{"error": "dataset not found"}) - return - } - switch r.Method { - case http.MethodGet: - writeJSON(w, 200, ds) - case http.MethodDelete: - jobs, err := e.client.BatchV1().Jobs(e.namespace).List(r.Context(), metav1.ListOptions{LabelSelector: managedLabel + "=mist,mist.io/owner=" + e.owner}) - if err != nil { - executorError(w, err) - return - } - for _, job := range jobs.Items { - var req CreateJobRequest - _ = json.Unmarshal([]byte(job.Annotations[requestAnnotation]), &req) - if req.DatasetID == id && !terminal(&job) { - if job.Annotations[cancelAnnotation] != "" { - pods, err := e.client.CoreV1().Pods(e.namespace).List(r.Context(), metav1.ListOptions{LabelSelector: "batch.kubernetes.io/job-name=" + job.Name}) - if err != nil { - executorError(w, err) - return - } - if len(pods.Items) == 0 { - continue - } - } - writeJSON(w, 409, map[string]string{"error": "Dataset is still referenced by an active or terminating job"}) - return - } - } - if err = os.Remove(filepath.Join(s.root, "metadata/datasets", id+".json")); err != nil { - executorError(w, err) - return - } - if err = os.RemoveAll(filepath.Join(s.root, "datasets", id)); err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, map[string]string{"id": id, "state": "Deleted"}) - default: - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) - } -} -func (s *SharedStorage) outputPath(job *batchv1.Job) (string, error) { - if path := job.Annotations["mist.io/output-path"]; path != "" { - if !safeRelative(path) { - return "", errors.New("invalid job storage path") - } - return filepath.Join(s.resultsRoot(), path), nil - } - if job.Annotations["mist.io/storage"] == "shared-v1" { - return filepath.Join(s.resultsRoot(), "jobs", job.Name, "outputs"), nil - } - for _, vol := range job.Spec.Template.Spec.Volumes { - if vol.Name == "checkpoints" && vol.PersistentVolumeClaim != nil && vol.PersistentVolumeClaim.ClaimName == "mist-shared-jobs" { - return filepath.Join(s.resultsRoot(), "jobs", job.Name, "outputs"), nil - } - } - var req CreateJobRequest - if err := json.Unmarshal([]byte(job.Annotations[requestAnnotation]), &req); err != nil { - return "", err - } - if req.Accelerator != "cpu" && req.Accelerator != "nvidia" && req.Accelerator != "tenstorrent" { - return "", errors.New("unknown legacy output storage") - } - return filepath.Join(s.resultsRoot(), "legacy", req.Accelerator, job.Name), nil -} - -type ResultFile struct { - Path string `json:"path"` - Size int64 `json:"size"` - Modified time.Time `json:"modified"` -} - -func listResultFiles(root *os.Root) ([]ResultFile, error) { - files := []ResultFile{} - visited := 0 - var visit func(string, int) error - visit = func(path string, depth int) error { - if depth > 20 { - return errors.New("output directory exceeds 20 levels") - } - dir, err := root.Open(path) - if err != nil { - return err - } - defer dir.Close() - for { - entries, readErr := dir.ReadDir(128) - for _, entry := range entries { - visited++ - if visited > 10000 { - return errors.New("output directory exceeds 10000 entries") - } - name := filepath.Join(path, entry.Name()) - info, err := root.Lstat(name) - if err != nil { - return err - } - if info.IsDir() { - if err = visit(name, depth+1); err != nil { - return err - } - } else if info.Mode().IsRegular() { - files = append(files, ResultFile{name, info.Size(), info.ModTime()}) - } - if len(files) > 5000 { - return errors.New("output directory exceeds 5000 files") - } - } - if readErr == io.EOF { - break - } - if readErr != nil { - return readErr - } - } - return nil - } - err := visit(".", 0) - sort.Slice(files, func(i, j int) bool { return files[i].Path < files[j].Path }) - return files, err -} -func (a *App) jobFiles(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) - return - } - parts := strings.Split(strings.TrimPrefix(r.URL.Path, "/jobs/"), "/") - if len(parts) < 2 || len(parts) > 3 || parts[1] != "files" || (len(parts) == 3 && parts[2] != "download") { - writeJSON(w, 404, map[string]string{"error": "not found"}) - return - } - e := a.requestExecutor(r) - job, err := e.managedJob(r.Context(), parts[0]) - if err != nil { - executorError(w, err) - return - } - if e.storage == nil { - writeJSON(w, 503, map[string]string{"error": "Shared storage is not configured"}) - return - } - path, err := e.storage.outputPath(job) - if err != nil { - executorError(w, err) - return - } - serveStoredFiles(w, r, path, len(parts) == 3) -} -func serveStoredFiles(w http.ResponseWriter, r *http.Request, path string, download bool) { - root, err := os.OpenRoot(path) - if os.IsNotExist(err) { - if !download { - writeJSON(w, 200, map[string]interface{}{"files": []ResultFile{}}) - } else { - writeJSON(w, 404, map[string]string{"error": "file not found"}) - } - return - } - if err != nil { - executorError(w, err) - return - } - defer root.Close() - if !download { - files, err := listResultFiles(root) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, map[string]interface{}{"files": files}) - return - } - filename := r.URL.Query().Get("path") - if !safeRelative(filename) { - writeJSON(w, 400, map[string]string{"error": "Invalid file path"}) - return - } - file, err := root.Open(filename) - if err != nil { - writeJSON(w, 404, map[string]string{"error": "file not found"}) - return - } - defer file.Close() - info, err := file.Stat() - if err != nil || !info.Mode().IsRegular() { - writeJSON(w, 404, map[string]string{"error": "file not found"}) - return - } - _ = http.NewResponseController(w).SetWriteDeadline(time.Now().Add(24 * time.Hour)) - w.Header().Set("Content-Disposition", mime.FormatMediaType("attachment", map[string]string{"filename": filepath.Base(filename)})) - w.Header().Set("X-Content-Type-Options", "nosniff") - w.Header().Set("Content-Type", "application/octet-stream") - http.ServeContent(w, r, filename, info.ModTime(), file) -} diff --git a/src/shared_storage_test.go b/src/shared_storage_test.go deleted file mode 100644 index f3e0f78..0000000 --- a/src/shared_storage_test.go +++ /dev/null @@ -1,198 +0,0 @@ -package main - -import ( - "archive/zip" - "bytes" - "context" - "io" - "log/slog" - "net/http/httptest" - "os" - "path/filepath" - "strings" - "testing" - "time" -) - -func uploadTest(t *testing.T, s *SharedStorage, path string, data []byte) (*Dataset, error) { - t.Helper() - return s.upload(httptest.NewRequest("POST", path, bytes.NewReader(data)), "test") -} -func TestSharedDatasetAtomicLimitsAndOwnership(t *testing.T) { - s, err := NewSharedStorage(t.TempDir()) - if err != nil { - t.Fatal(err) - } - s.uploadLimit = 16 - ds, err := uploadTest(t, s, "/datasets?filename=data.csv", []byte("1,2\n")) - if err != nil { - t.Fatal(err) - } - if ds.State != "Ready" || ds.Files != 1 || ds.Size != 4 || len(ds.SHA256) != 64 { - t.Fatalf("bad dataset %+v", ds) - } - if _, err = s.dataset(ds.ID, "other"); err == nil { - t.Fatal("another member can access dataset") - } - if _, err = uploadTest(t, s, "/datasets?filename=data.csv", bytes.Repeat([]byte("a"), 17)); err == nil { - t.Fatal("oversized upload accepted") - } - if _, err = uploadTest(t, s, "/datasets?filename=../escape", []byte("a")); err == nil { - t.Fatal("unsafe filename accepted") - } - entries, _ := os.ReadDir(filepath.Join(s.root, ".uploads")) - if len(entries) != 0 { - t.Fatal("failed upload retained staging files") - } - entries, _ = os.ReadDir(filepath.Join(s.root, "metadata/datasets")) - if len(entries) != 1 { - t.Fatal("failed upload published metadata") - } -} - -func TestSharedDatasetConfiguredCeilingAndMissingStorage(t *testing.T) { - t.Setenv("MIST_MAX_DATASET_GIB", "4") - root := t.TempDir() - s, err := NewSharedStorage(root) - if err != nil { - t.Fatal(err) - } - // Reject an oversized declared body without reading or staging gigabytes. - request := httptest.NewRequest("POST", "/datasets?filename=data.bin", strings.NewReader("small")) - request.ContentLength = 5 * 1024 * 1024 * 1024 - if _, err = s.upload(request, "test"); err == nil { - t.Fatal("configured dataset ceiling was bypassed") - } - if limit := s.availableUploadLimit(true); limit < 0 || limit > 4*1024*1024*1024 { - t.Fatalf("unsafe advertised upload limit: %d", limit) - } - if err = os.RemoveAll(root); err != nil { - t.Fatal(err) - } - if s.availableUploadLimit(true) != 0 { - t.Fatal("missing storage advertised upload capacity") - } - for _, value := range []string{"0", "1048577", "invalid"} { - t.Setenv("MIST_MAX_DATASET_GIB", value) - if _, err = NewSharedStorage(t.TempDir()); err == nil { - t.Fatalf("accepted invalid upload ceiling %q", value) - } - } -} -func TestSharedZipRejectsTraversalSymlinksAndExpansion(t *testing.T) { - for _, tc := range []struct { - name string - mode os.FileMode - data string - limit int64 - }{{"../escape", 0644, "x", 100}, {"symlink", os.ModeSymlink | 0777, "/etc/passwd", 100}, {"data", 0644, strings.Repeat("x", 1000), 10}} { - var buffer bytes.Buffer - writer := zip.NewWriter(&buffer) - header := &zip.FileHeader{Name: tc.name, Method: zip.Deflate} - header.SetMode(tc.mode) - file, _ := writer.CreateHeader(header) - _, _ = io.WriteString(file, tc.data) - writer.Close() - dir := t.TempDir() - path := filepath.Join(dir, "test.zip") - os.WriteFile(path, buffer.Bytes(), 0600) - if _, _, err := extractDatasetZip(path, filepath.Join(dir, "out"), tc.limit); err == nil { - t.Fatalf("accepted unsafe archive %s", tc.name) - } - } -} -func TestSharedJobMountAndEscapingOutput(t *testing.T) { - e := testExecutor() - s, _ := NewSharedStorage(t.TempDir()) - e.storage = s - e.sharedPVC = "mist-shared-jobs" - ds, err := uploadTest(t, s, "/datasets?filename=data.csv", []byte("1,2\n")) - if err != nil { - t.Fatal(err) - } - status, err := e.submit(context.Background(), CreateJobRequest{Command: []string{"true"}, DatasetID: ds.ID}) - if err != nil { - t.Fatal(err) - } - job, _ := e.managedJob(context.Background(), status.ID) - spec := job.Spec.Template.Spec - if len(spec.InitContainers) != 0 { - t.Fatal("shared job exposes full storage in init") - } - input := false - for _, mount := range spec.Containers[0].VolumeMounts { - if mount.MountPath == "/inputs" { - input = mount.ReadOnly && mount.SubPath == "datasets/"+ds.ID+"/content" - } - } - if !input { - t.Fatal("dataset not mounted read-only") - } - output, _ := s.outputPath(job) - os.WriteFile(filepath.Join(output, "model.json"), []byte("{}"), 0644) - os.Symlink("/etc/passwd", filepath.Join(output, "escape")) - app := NewKubernetesApp(e, slog.New(slog.NewTextHandler(io.Discard, nil))) - for _, tc := range []struct { - path string - status int - }{{"model.json", 200}, {"../metadata", 400}, {"escape", 404}} { - req := httptest.NewRequest("GET", "/jobs/"+status.ID+"/files/download?path="+tc.path, nil) - response := httptest.NewRecorder() - app.httpServer.Handler.ServeHTTP(response, req) - if response.Code != tc.status { - t.Fatalf("%s: got %d: %s", tc.path, response.Code, response.Body.String()) - } - } - e.owner = "other" - response := httptest.NewRecorder() - app.httpServer.Handler.ServeHTTP(response, httptest.NewRequest("GET", "/jobs/"+status.ID+"/files", nil)) - if response.Code != 404 { - t.Fatal("foreign job files accessible") - } -} -func TestMemberAuthIsolationAndFailureClosed(t *testing.T) { - t.Setenv("MIST_AUTH_DATABASE", filepath.Join(t.TempDir(), "auth.sqlite")) - t.Setenv("MIST_ALLOWED_ORIGINS", "http://mist.test") - app := NewKubernetesApp(testExecutor(), slog.New(slog.NewTextHandler(io.Discard, nil))) - now := time.Now().UTC().Format(time.RFC3339Nano) - for _, m := range []Member{ - {ID: "alice", Name: "Alice", Email: "alice@example.org", Role: "user"}, - {ID: "bob", Name: "Bob", Email: "bob@example.org", Role: "user"}, - } { - if _, err := app.auth.db.Exec(` - INSERT INTO user (id, name, email, role, createdAt, updatedAt) - VALUES (?, ?, ?, ?, ?, ?) - `, m.ID, m.Name, m.Email, m.Role, now, now); err != nil { - t.Fatal(err) - } - } - seedTestSession(t, app.auth, "alice") - seedTestSession(t, app.auth, "bob") - t.Cleanup(func() { _ = app.auth.Close() }) - - request := func(method, path, cookie, origin, body string) *httptest.ResponseRecorder { - req := httptest.NewRequest(method, path, strings.NewReader(body)) - req.Header.Set("Cookie", cookie) - req.Header.Set("Origin", origin) - req.Header.Set("X-Mist-Owner", "test") - response := httptest.NewRecorder() - app.httpServer.Handler.ServeHTTP(response, req) - return response - } - if response := request("GET", "/jobs", "", "", ""); response.Code != 401 { - t.Fatal("anonymous request accepted") - } - if response := request("POST", "/jobs", "better-auth.session_token=test-session-alice", "http://evil.test", `{"command":["true"]}`); response.Code != 403 { - t.Fatal("cross-origin mutation accepted") - } - if response := request("POST", "/jobs", "better-auth.session_token=test-session-alice", "http://mist.test", `{"command":["true"]}`); response.Code != 201 { - t.Fatalf("submit failed %d %s", response.Code, response.Body.String()) - } - if response := request("GET", "/jobs", "better-auth.session_token=test-session-bob", "", ""); response.Code != 200 || !strings.Contains(response.Body.String(), `"count":0`) { - t.Fatalf("another member sees jobs: %s", response.Body.String()) - } - app.auth.Close() - if response := request("GET", "/jobs", "better-auth.session_token=test-session-alice", "", ""); response.Code != 503 { - t.Fatal("auth failure did not close access") - } -} diff --git a/src/storage_status.go b/src/storage_status.go deleted file mode 100644 index 524dd9f..0000000 --- a/src/storage_status.go +++ /dev/null @@ -1,38 +0,0 @@ -package main - -import ( - "encoding/json" - "errors" - "os" - "path/filepath" - "time" -) - -// Usage is sampled on the owning storage host; HTTP handlers never walk NFS -// trees. Numbers are logical file bytes and may lag active writes by 30 seconds. -type teamStorageStatus struct { - State string `json:"state"` - Layout string `json:"layout"` - DatasetUsedBytes int64 `json:"dataset_used_bytes"` - ModelUsedBytes int64 `json:"model_used_bytes"` - UsageObservedUnix int64 `json:"usage_observed_unix"` -} - -func (s *TeamService) storageStatus(id string) (teamStorageStatus, error) { - var status teamStorageStatus - data, err := os.ReadFile(filepath.Join(s.app.executor.storage.root, "metadata/provision-status", id+".json")) - if err != nil { - return status, err - } - if err = json.Unmarshal(data, &status); err != nil { - return status, err - } - if status.State != "Ready" || status.Layout != sharedFolderLayout || status.DatasetUsedBytes < 0 || status.ModelUsedBytes < 0 || status.UsageObservedUnix <= 0 { - return status, errors.New("team storage usage is unavailable") - } - return status, nil -} - -func (s teamStorageStatus) observedAt() string { - return time.Unix(s.UsageObservedUnix, 0).UTC().Format(time.RFC3339) -} diff --git a/src/team_queue.go b/src/team_queue.go deleted file mode 100644 index f9b6389..0000000 --- a/src/team_queue.go +++ /dev/null @@ -1,539 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "errors" - "os" - "path/filepath" - "sort" - "time" - - batchv1 "k8s.io/api/batch/v1" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/util/retry" -) - -func (s *TeamService) submitTeam(ctx context.Context, e *KubernetesExecutor, request CreateJobRequest) (*KubernetesJobStatus, error) { - s.mu.Lock() - defer s.mu.Unlock() - t, err := s.team(ctx, e.team.Team.ID) - if err != nil { - return nil, err - } - e.team.Team = t - req, err := e.normalize(request) - if err != nil { - return nil, &submissionError{err} - } - if err = s.provisionNamespace(ctx, t); err != nil { - return nil, err - } - jobs, err := e.client.BatchV1().Jobs(e.namespace).List(ctx, metav1.ListOptions{LabelSelector: managedLabel + "=mist"}) - if err != nil { - return nil, err - } - queued := 0 - for _, job := range jobs.Items { - if !terminal(&job) && job.Annotations[cancelAnnotation] == "" && job.Annotations["mist.io/admitted-at"] == "" { - queued++ - } - } - if queued >= t.Policy.Queued { - return nil, &submissionError{errors.New("team queue is full; wait for jobs to start or cancel a queued job")} - } - id, err := randomJobID() - if err != nil { - return nil, err - } - var source *Team - if req.DatasetID != "" { - var ds *Dataset - _, source, ds, err = s.resolveDataset(ctx, t, req.DatasetID) - if err != nil { - return nil, &submissionError{errors.New("dataset is unavailable to this team")} - } - e.inputSubPath = ds.ContentPath - if source.ID != t.ID { - claim := "input-" + req.DatasetID - if err = s.ensureVolume(ctx, source.ID, e.namespace, claim, "teams/"+source.ID+"/datasets/"+ds.ContentPath, source.Policy.StorageGiB, true); err != nil { - return nil, err - } - e.inputPVC, e.inputSubPath = claim, "" - } - } - e.outputSubPath = scopePath(req.StorageScope) + "/jobs/" + id + "/outputs" - output := filepath.Join(e.storage.resultsRoot(), e.outputSubPath) - if err = os.MkdirAll(output, 0755); err != nil { - return nil, err - } - if err = os.Chmod(output, 0777); err != nil { - return nil, err - } - committed := false - defer func() { - if !committed { - _ = os.RemoveAll(filepath.Dir(output)) - } - }() - if req.Script != "" { - _, err = e.client.CoreV1().ConfigMaps(e.namespace).Create(ctx, &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: id + "-script", Labels: map[string]string{managedLabel: "mist"}}, Data: map[string]string{req.ScriptName: req.Script}}, metav1.CreateOptions{}) - if err != nil { - return nil, err - } - } - job := e.buildJob(id, req) - job.Spec.Suspend = ptr(true) - if source != nil { - job.Annotations["mist.io/input-team"] = source.ID - } - job, err = e.client.BatchV1().Jobs(e.namespace).Create(ctx, job, metav1.CreateOptions{}) - if err != nil { - if req.Script != "" { - _ = e.client.CoreV1().ConfigMaps(e.namespace).Delete(ctx, id+"-script", metav1.DeleteOptions{}) - } - return nil, err - } - if req.Script != "" { - defer func() { - if !committed { - propagation := metav1.DeletePropagationForeground - _ = e.client.BatchV1().Jobs(e.namespace).Delete(ctx, id, metav1.DeleteOptions{PropagationPolicy: &propagation}) - _ = e.client.CoreV1().ConfigMaps(e.namespace).Delete(ctx, id+"-script", metav1.DeleteOptions{}) - } - }() - - cm, readErr := e.client.CoreV1().ConfigMaps(e.namespace).Get(ctx, id+"-script", metav1.GetOptions{}) - if readErr != nil { - return nil, readErr - } - cm.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(job, batchv1.SchemeGroupVersion.WithKind("Job"))} - if _, err = e.client.CoreV1().ConfigMaps(e.namespace).Update(ctx, cm, metav1.UpdateOptions{}); err != nil { - return nil, err - } - } - committed = true - return e.baseStatus(job) -} -func randomJobID() (string, error) { - id, err := randomID("mist-") - if err != nil { - return "", err - } - suffix, err := randomID("") - if err != nil { - return "", err - } - return id + suffix[:8], nil -} -func (s *TeamService) start() { - go func() { - defer close(s.done) - ticker := time.NewTicker(2 * time.Second) - defer ticker.Stop() - for { - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - s.mu.Lock() - err := s.reconcile(ctx) - s.mu.Unlock() - cancel() - if err != nil { - s.app.log.Error("team reconciliation failed", "error", err) - } - select { - case <-s.stop: - return - case <-ticker.C: - } - } - }() -} -func (s *TeamService) shutdown() { close(s.stop); <-s.done } -func (s *TeamService) reconcile(ctx context.Context) error { - _, teams, err := s.registry(ctx) - if err != nil { - return err - } - for i := range teams { - t := &teams[i] - if err = s.provisionRequest(t); err != nil { - return err - } - if _, err = s.store(t); err != nil { - continue - } - if err = s.provisionNamespace(ctx, t); err != nil { - return err - } - } - if err = s.revokeJobs(ctx); err != nil { - return err - } - return s.admit(ctx, teams) -} -func (s *TeamService) revoked(ctx context.Context, t *Team, job *batchv1.Job, active map[string]AccountStatus) (string, error) { - if t == nil || t.Disabled { - return "Team disabled or unavailable", nil - } - id := job.Annotations["mist.io/creator-id"] - if t.member(id) == nil { - return "Team membership revoked", nil - } - status, ok := active[id] - if !ok { - return "Account unavailable", nil - } - var err error - var req CreateJobRequest - if err = json.Unmarshal([]byte(job.Annotations[requestAnnotation]), &req); err != nil { - return "Invalid stored submission", nil - } - m := &Member{ID: id, Role: status.Role} - if err = validateTeamRequest(t, m, &req); err != nil { - return "Team policy changed: " + err.Error(), nil - } - if err = validateImageReference(req.Image, t.Policy.Registries, s.app.executor.allowedImages); err != nil { - return "Image policy changed", nil - } - if req.DatasetID != "" { - if _, _, _, err = s.resolveDataset(ctx, t, req.DatasetID); err != nil { - return "Dataset access revoked", nil - } - } - return "", nil -} -func (s *TeamService) revokeJobs(ctx context.Context) error { - _, teams, err := s.registry(ctx) - if err != nil { - return err - } - // A fresh authoritative account snapshot is used for each reconciliation, so - // disabling an account also releases jobs even if its team membership remains. - active, err := s.app.auth.activeMembers(ctx) - if err != nil { - return err - } - jobs, err := s.app.executor.client.BatchV1().Jobs("").List(ctx, metav1.ListOptions{LabelSelector: "mist.io/team"}) - if err != nil { - return err - } - for _, job := range jobs.Items { - if terminal(&job) || job.Annotations[cancelAnnotation] != "" { - continue - } - reason, err := s.revoked(ctx, findTeam(teams, job.Labels["mist.io/team"]), &job, active) - if err != nil { - return err - } - if reason != "" { - if err = s.stopJob(ctx, &job, reason); err != nil { - return err - } - } - } - return nil -} -func (s *TeamService) stopJob(ctx context.Context, job *batchv1.Job, reason string) error { - e := *s.app.executor - e.namespace, e.owner = job.Namespace, job.Labels["mist.io/owner"] - logs, err := e.logs(ctx, job.Name) - if err != nil { - logs = "Logs unavailable at cancellation: " + err.Error() - } - if len(logs) > 32*1024 { - logs = logs[len(logs)-32*1024:] - } - return retry.RetryOnConflict(retry.DefaultRetry, func() error { - current, err := e.managedJob(ctx, job.Name) - if err != nil { - return err - } - if terminal(current) || current.Annotations[cancelAnnotation] != "" { - return nil - } - current.Spec.Suspend = ptr(true) - current.Annotations[cancelAnnotation] = time.Now().UTC().Format(time.RFC3339) - current.Annotations[cancelLogsAnnotation] = logs - current.Annotations["mist.io/stop-reason"] = reason - _, err = e.client.BatchV1().Jobs(job.Namespace).Update(ctx, current, metav1.UpdateOptions{}) - return err - }) -} - -type admissionUse struct { - CPU, Memory int64 - NVIDIA, TT, Concurrent int -} - -func (u *admissionUse) add(req CreateJobRequest) { - u.CPU += quantity(req.CPU).MilliValue() - u.Memory += quantity(req.Memory).Value() - if req.Accelerator == "nvidia" { - u.NVIDIA += req.DeviceCount - } - if req.Accelerator == "tenstorrent" { - u.TT += req.DeviceCount - } - u.Concurrent++ -} -func (u admissionUse) fits(p TeamPolicy, req CreateJobRequest) bool { - v := u - v.add(req) - return v.CPU <= quantity(p.CPU).MilliValue() && v.Memory <= quantity(p.Memory).Value() && v.NVIDIA <= p.NVIDIA && v.TT <= p.Tenstorrent && v.Concurrent <= p.Concurrent -} -func (s *TeamService) admit(ctx context.Context, teams []Team) error { - c := s.app.executor.client - jobs, err := c.BatchV1().Jobs("").List(ctx, metav1.ListOptions{LabelSelector: "mist.io/team"}) - if err != nil { - return err - } - pods, err := c.CoreV1().Pods("").List(ctx, metav1.ListOptions{}) - if err != nil { - return err - } - snapshot, err := s.app.executor.hardware(ctx) - if err != nil { - return err - } - machineFree := map[string]*admissionUse{} - ready := map[string]bool{} - for _, m := range snapshot.Machines { - machineFree[m.Name] = &admissionUse{CPU: quantity(m.CPUAllocatable).MilliValue(), Memory: quantity(m.MemoryAllocatable).Value()} - ready[m.Name] = m.Schedulable - } - nvidiaFree, ttFree := 0, 0 - for _, pool := range snapshot.Pools { - if pool.Ready && pool.Available != nil { - if pool.Accelerator == "nvidia" { - nvidiaFree = int(*pool.Available) - } else { - ttFree = int(*pool.Available) - } - } - } - placed := map[string]bool{} - ttAllocated := map[string]int{} - podJobs := map[string]string{} - claimJobs := map[string]string{} - for _, pod := range pods.Items { - jobName := pod.Labels["batch.kubernetes.io/job-name"] - if jobName == "" { - continue - } - jobKey := pod.Namespace + "/" + jobName - podJobs[pod.Namespace+"/"+pod.Name] = jobKey - for _, status := range pod.Status.ResourceClaimStatuses { - if status.ResourceClaimName != nil { - claimJobs[pod.Namespace+"/"+*status.ResourceClaimName] = jobKey - } - } - } - claims, err := c.ResourceV1().ResourceClaims("").List(ctx, metav1.ListOptions{}) - if err != nil { - return err - } - for _, claim := range claims.Items { - if claim.Status.Allocation == nil { - continue - } - for _, owner := range claim.OwnerReferences { - if owner.Kind == "Job" { - claimJobs[claim.Namespace+"/"+claim.Name] = claim.Namespace + "/" + owner.Name - } else if owner.Kind == "Pod" { - if jobKey := podJobs[claim.Namespace+"/"+owner.Name]; jobKey != "" { - claimJobs[claim.Namespace+"/"+claim.Name] = jobKey - } - } - } - if jobKey := claimJobs[claim.Namespace+"/"+claim.Name]; jobKey != "" { - for _, result := range claim.Status.Allocation.Devices.Results { - if result.Driver == "tenstorrent.com" { - ttAllocated[jobKey]++ - } - } - } - } - for _, pod := range pods.Items { - if pod.Status.Phase == corev1.PodSucceeded || pod.Status.Phase == corev1.PodFailed { - continue - } - if pod.Spec.NodeName != "" { - placed[pod.Namespace+"/"+pod.Labels["batch.kubernetes.io/job-name"]] = true - if free := machineFree[pod.Spec.NodeName]; free != nil { - var cpu, mem int64 - for _, ct := range pod.Spec.Containers { - a, b := ct.Resources.Requests[corev1.ResourceCPU], ct.Resources.Requests[corev1.ResourceMemory] - cpu += a.MilliValue() - mem += b.Value() - } - free.CPU -= cpu - free.Memory -= mem - } - } - } - use := map[string]*admissionUse{} - queue := map[string][]batchv1.Job{} - for _, t := range teams { - use[t.ID] = &admissionUse{} - } - for _, job := range jobs.Items { - if terminal(&job) || job.Annotations[cancelAnnotation] != "" { - continue - } - var req CreateJobRequest - if json.Unmarshal([]byte(job.Annotations[requestAnnotation]), &req) != nil { - continue - } - id := job.Labels["mist.io/team"] - if use[id] == nil { - continue - } - if job.Annotations["mist.io/admitted-at"] == "" { - if time.Since(queuedAt(&job)) > 24*time.Hour { - if err = s.stopJob(ctx, &job, "Queue wait exceeded 24 hours"); err != nil { - return err - } - continue - } - queue[id] = append(queue[id], job) - } else { - use[id].add(req) - if !placed[job.Namespace+"/"+job.Name] { - node := s.app.executor.cpuNode - if req.Accelerator == "tenstorrent" { - node = s.app.executor.ttNode - ttFree -= max(0, req.DeviceCount-ttAllocated[job.Namespace+"/"+job.Name]) - } - if req.Accelerator == "nvidia" { - nvidiaFree -= req.DeviceCount - } - if free := machineFree[node]; free != nil { - free.CPU -= quantity(req.CPU).MilliValue() - free.Memory -= quantity(req.Memory).Value() - } - } - } - } - cursor, err := c.CoreV1().ConfigMaps("mist-system").Get(ctx, "mist-queue-cursor", metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - cursor = &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: "mist-queue-cursor"}, Data: map[string]string{}} - } else if err != nil { - return err - } - sortedTeams(teams) - start := 0 - for i, t := range teams { - if t.ID == cursor.Data["last_team"] { - start = (i + 1) % len(teams) - } - } - aged := map[string]batchv1.Job{} - for _, t := range teams { - q := queue[t.ID] - sort.Slice(q, func(i, j int) bool { return queuedAt(&q[i]).Before(queuedAt(&q[j])) }) - queue[t.ID] = q - if t.Disabled || len(q) == 0 || time.Since(queuedAt(&q[0])) < 30*time.Second { - continue - } - var req CreateJobRequest - _ = json.Unmarshal([]byte(q[0].Annotations[requestAnnotation]), &req) - if !use[t.ID].fits(t.Policy, req) { - continue - } - node := s.app.executor.cpuNode - if req.Accelerator == "tenstorrent" { - node = s.app.executor.ttNode - } - if !ready[node] { - continue - } - if old, ok := aged[node]; !ok || queuedAt(&q[0]).Before(queuedAt(&old)) { - aged[node] = q[0] - } - } - admitted := false - for i := 0; i < len(teams); i++ { - t := teams[(start+i)%len(teams)] - if t.Disabled { - continue - } - q := queue[t.ID] - sort.Slice(q, func(i, j int) bool { return queuedAt(&q[i]).Before(queuedAt(&q[j])) }) - // FIFO within a team; one admission per team per pass. Large requests cannot - // be perpetually overtaken by smaller later submissions from the same team. - if len(q) == 0 { - continue - } - job := q[0] - var req CreateJobRequest - if json.Unmarshal([]byte(job.Annotations[requestAnnotation]), &req) != nil { - continue - } - if !use[t.ID].fits(t.Policy, req) { - continue - } - node := s.app.executor.cpuNode - if req.Accelerator == "tenstorrent" { - node = s.app.executor.ttNode - } - if reserved, ok := aged[node]; ok && reserved.Name != job.Name { - continue - } - free := machineFree[node] - if free == nil || !ready[node] || quantity(req.CPU).MilliValue() > free.CPU || quantity(req.Memory).Value() > free.Memory { - continue - } - if req.Accelerator == "nvidia" && req.DeviceCount > nvidiaFree || req.Accelerator == "tenstorrent" && req.DeviceCount > ttFree { - continue - } - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - fresh, err := c.BatchV1().Jobs(job.Namespace).Get(ctx, job.Name, metav1.GetOptions{}) - if err != nil { - return err - } - if fresh.Annotations[cancelAnnotation] != "" || fresh.Annotations["mist.io/admitted-at"] != "" { - return nil - } - fresh.Spec.Suspend = ptr(false) - fresh.Annotations["mist.io/admitted-at"] = time.Now().UTC().Format(time.RFC3339Nano) - _, err = c.BatchV1().Jobs(job.Namespace).Update(ctx, fresh, metav1.UpdateOptions{}) - return err - }) - if err != nil { - return err - } - admitted = true - cursor.Data["last_team"] = t.ID - use[t.ID].add(req) - free.CPU -= quantity(req.CPU).MilliValue() - free.Memory -= quantity(req.Memory).Value() - if req.Accelerator == "nvidia" { - nvidiaFree -= req.DeviceCount - } - if req.Accelerator == "tenstorrent" { - ttFree -= req.DeviceCount - } - } - if admitted { - if cursor.ResourceVersion == "" { - _, err = c.CoreV1().ConfigMaps("mist-system").Create(ctx, cursor, metav1.CreateOptions{}) - } else { - _, err = c.CoreV1().ConfigMaps("mist-system").Update(ctx, cursor, metav1.UpdateOptions{}) - } - return err - } - return nil -} - -// Silence is not successful admission: a queued job remains suspended and its -// status explains that resource availability and team limits govern placement. - -func queuedAt(job *batchv1.Job) time.Time { - t, err := time.Parse(time.RFC3339Nano, job.Annotations["mist.io/queued-at"]) - if err == nil { - return t - } - return job.CreationTimestamp.Time -} diff --git a/src/team_runtime.go b/src/team_runtime.go deleted file mode 100644 index 256f21a..0000000 --- a/src/team_runtime.go +++ /dev/null @@ -1,241 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "os" - "path/filepath" - "regexp" - "strings" - "time" - - "github.com/distribution/reference" - corev1 "k8s.io/api/core/v1" - networkv1 "k8s.io/api/networking/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" -) - -var registryPattern = regexp.MustCompile(`^[a-z0-9]+([.-][a-z0-9]+)*\.[a-z]{2,}$`) - -type permissionError struct{ error } - -func memberOwner(id string) string { m := &Member{ID: id}; return accountOwner(m) } -func accountOwner(m *Member) string { return "member-" + hashID(m.ID) } -func validateImageReference(image string, registries []string, local map[string]bool) error { - if local[image] && strings.HasPrefix(image, "mist-training:") { - return nil - } - named, err := reference.ParseNormalizedNamed(image) - if err != nil { - return errors.New("invalid container image reference") - } - if !contains(registries, reference.Domain(named)) { - return errors.New("image registry is not allowed by this team's policy") - } - if _, tagged := named.(reference.Tagged); !tagged { - if _, digested := named.(reference.Digested); !digested { - return errors.New("include an image tag or sha256 digest") - } - } - return nil -} -func validateTeamRequest(t *Team, m *Member, req *CreateJobRequest) error { - if t.Disabled || t.member(m.ID) == nil { - return &permissionError{errors.New("team membership was revoked")} - } - p := t.Policy - if quantity(req.CPU).Cmp(resource.MustParse(p.CPU)) > 0 || quantity(req.Memory).Cmp(resource.MustParse(p.Memory)) > 0 { - return errors.New("job exceeds the team's CPU or memory limit") - } - if req.Accelerator == "nvidia" && req.DeviceCount > p.NVIDIA || req.Accelerator == "tenstorrent" && req.DeviceCount > p.Tenstorrent { - return errors.New("job exceeds the team's accelerator limit") - } - if req.TimeoutSeconds > p.RuntimeSeconds { - return errors.New("job runtime exceeds team policy") - } - if req.StorageScope == "" { - req.StorageScope = m.ID - } - if req.StorageScope != m.ID && (req.StorageScope != "common" || (!t.member(m.ID).CommonWriter && !isAdmin(m))) { - return &permissionError{errors.New("You can write your own folder; common-folder writes require permission")} - } - if req.TTRuntime != "" && req.TTRuntime != "host" && req.TTRuntime != "container" { - return errors.New("tt_runtime must be host or container") - } - if req.Accelerator != "tenstorrent" && req.TTRuntime != "" { - return errors.New("tt_runtime applies only to Tenstorrent jobs") - } - if req.Accelerator == "tenstorrent" { - if req.TTRuntime == "" { - if req.Image == ttImage { - req.TTRuntime = "host" - } else { - req.TTRuntime = "container" - } - } - if req.TTRuntime == "host" && req.Image != ttImage { - return errors.New("host TT runtime requires the tested default image; use container runtime for custom images") - } - if req.Type == "training-smoke" && (req.Image != ttImage || req.TTRuntime != "host") { - return errors.New("TT training check requires the tested host runtime") - } - } - return nil -} -func atomicJSON(path string, v any) error { - data, err := json.Marshal(v) - if err != nil { - return err - } - if err = os.MkdirAll(filepath.Dir(path), 0700); err != nil { - return err - } - f, err := os.CreateTemp(filepath.Dir(path), ".mist-") - if err != nil { - return err - } - defer os.Remove(f.Name()) - if _, err = f.Write(data); err != nil { - f.Close() - return err - } - if err = f.Sync(); err != nil { - f.Close() - return err - } - if err = f.Close(); err != nil { - return err - } - return os.Rename(f.Name(), path) -} -func (s *TeamService) provisionRequest(t *Team) error { - return atomicJSON(filepath.Join(s.app.executor.storage.root, "metadata/provision-requests", t.ID+".json"), map[string]any{"id": t.ID, "storage_gib": t.Policy.StorageGiB, "model_storage_gib": t.Policy.ModelStorageGiB}) -} -func (s *TeamService) provisionNamespace(ctx context.Context, t *Team) error { - signature, _ := json.Marshal(t.Policy) - cached := s.provisioned[t.ID] - if cached.signature == string(signature) && time.Since(cached.checked) < 30*time.Second { - return nil - } - c := s.app.executor.client - ns := t.namespace() - _, err := c.CoreV1().Namespaces().Get(ctx, ns, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - _, err = c.CoreV1().Namespaces().Create(ctx, &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: ns, Labels: map[string]string{"mist.io/workloads": "true", "mist.io/team": t.ID}}}, metav1.CreateOptions{}) - } - if err != nil { - return err - } - quota := &corev1.ResourceQuota{ObjectMeta: metav1.ObjectMeta{Name: "team-limits", Namespace: ns}, Spec: corev1.ResourceQuotaSpec{Hard: corev1.ResourceList{ - "requests.cpu": resource.MustParse(t.Policy.CPU), "limits.cpu": resource.MustParse(t.Policy.CPU), "requests.memory": resource.MustParse(t.Policy.Memory), "limits.memory": resource.MustParse(t.Policy.Memory), - "requests.nvidia.com/gpu": resource.MustParse(fmt.Sprint(t.Policy.NVIDIA)), "pods": resource.MustParse(fmt.Sprint(t.Policy.Concurrent)), - "requests.hugepages-1Gi": resource.MustParse(fmt.Sprintf("%dGi", t.Policy.Tenstorrent*2)), - }}} - old, err := c.CoreV1().ResourceQuotas(ns).Get(ctx, quota.Name, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - _, err = c.CoreV1().ResourceQuotas(ns).Create(ctx, quota, metav1.CreateOptions{}) - } else if err == nil && !quantitiesEqual(old.Spec.Hard, quota.Spec.Hard) { - quota.ResourceVersion = old.ResourceVersion - _, err = c.CoreV1().ResourceQuotas(ns).Update(ctx, quota, metav1.UpdateOptions{}) - } - if err != nil { - return err - } - policy := teamNetworkPolicy(ns) - if _, err = c.NetworkingV1().NetworkPolicies(ns).Get(ctx, policy.Name, metav1.GetOptions{}); apierrors.IsNotFound(err) { - _, err = c.NetworkingV1().NetworkPolicies(ns).Create(ctx, policy, metav1.CreateOptions{}) - } - if err != nil { - return err - } - for _, name := range []string{"training-smoke-script"} { - if _, err = c.CoreV1().ConfigMaps(ns).Get(ctx, name, metav1.GetOptions{}); apierrors.IsNotFound(err) { - source, readErr := c.CoreV1().ConfigMaps(s.app.executor.namespace).Get(ctx, name, metav1.GetOptions{}) - if readErr != nil { - return readErr - } - _, err = c.CoreV1().ConfigMaps(ns).Create(ctx, &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: name}, Data: source.Data}, metav1.CreateOptions{}) - } - if err != nil { - return err - } - } - for i := 1; i <= 4; i++ { - name := fmt.Sprintf("mist-tenstorrent-%d-boards", i) - if _, err = c.ResourceV1().ResourceClaimTemplates(ns).Get(ctx, name, metav1.GetOptions{}); apierrors.IsNotFound(err) { - source, readErr := c.ResourceV1().ResourceClaimTemplates(s.app.executor.namespace).Get(ctx, name, metav1.GetOptions{}) - if readErr != nil { - return readErr - } - source.ObjectMeta = metav1.ObjectMeta{Name: name} - _, err = c.ResourceV1().ResourceClaimTemplates(ns).Create(ctx, source, metav1.CreateOptions{}) - } - if err != nil { - return err - } - } - if err = s.ensureVolume(ctx, t.ID, ns, "team-datasets", fmt.Sprintf("teams/%s/datasets", t.ID), t.Policy.StorageGiB, false); err != nil { - return err - } - if err = s.ensureVolume(ctx, t.ID, ns, "team-results", fmt.Sprintf("teams/%s/results", t.ID), t.Policy.ModelStorageGiB, false); err != nil { - return err - } - s.provisioned[t.ID] = teamProvisioned{signature: string(signature), checked: time.Now()} - return nil -} -func quantitiesEqual(a, b corev1.ResourceList) bool { - if len(a) != len(b) { - return false - } - for k, v := range a { - w, ok := b[k] - if !ok || v.Cmp(w) != 0 { - return false - } - } - return true -} -func teamNetworkPolicy(ns string) *networkv1.NetworkPolicy { - return &networkv1.NetworkPolicy{ObjectMeta: metav1.ObjectMeta{Name: "team-boundary", Namespace: ns}, Spec: networkv1.NetworkPolicySpec{PodSelector: metav1.LabelSelector{}, PolicyTypes: []networkv1.PolicyType{networkv1.PolicyTypeIngress, networkv1.PolicyTypeEgress}, Ingress: []networkv1.NetworkPolicyIngressRule{}, Egress: []networkv1.NetworkPolicyEgressRule{ - {To: []networkv1.NetworkPolicyPeer{{NamespaceSelector: &metav1.LabelSelector{MatchLabels: map[string]string{"kubernetes.io/metadata.name": "kube-system"}}, PodSelector: &metav1.LabelSelector{MatchLabels: map[string]string{"k8s-app": "kube-dns"}}}}, Ports: []networkv1.NetworkPolicyPort{{Protocol: ptr(corev1.ProtocolUDP), Port: ptr(intstr.FromInt32(53))}, {Protocol: ptr(corev1.ProtocolTCP), Port: ptr(intstr.FromInt32(53))}}}, - {To: []networkv1.NetworkPolicyPeer{{IPBlock: &networkv1.IPBlock{CIDR: "0.0.0.0/0", Except: []string{"0.0.0.0/8", "10.0.0.0/8", "100.64.0.0/10", "127.0.0.0/8", "169.254.0.0/16", "172.16.0.0/12", "192.168.0.0/16", "224.0.0.0/4", "240.0.0.0/4"}}}}, Ports: []networkv1.NetworkPolicyPort{{Protocol: ptr(corev1.ProtocolTCP), Port: ptr(intstr.FromInt32(443))}}}, - }}} -} -func (s *TeamService) ensureVolume(ctx context.Context, sourceTeam, namespace, claim, path string, gib int64, readonly bool) error { - c := s.app.executor.client - name := namespace + "-" + claim - pv := &corev1.PersistentVolume{ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{"mist.io/team": sourceTeam}}, Spec: corev1.PersistentVolumeSpec{Capacity: corev1.ResourceList{corev1.ResourceStorage: resource.MustParse(fmt.Sprintf("%dGi", gib))}, AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteMany}, PersistentVolumeReclaimPolicy: corev1.PersistentVolumeReclaimRetain, StorageClassName: "", ClaimRef: &corev1.ObjectReference{Name: claim, Namespace: namespace}, MountOptions: []string{"nfsvers=4.1", "hard", "timeo=100", "retrans=2"}, PersistentVolumeSource: corev1.PersistentVolumeSource{NFS: &corev1.NFSVolumeSource{Server: envOr("MIST_NFS_SERVER", "192.168.240.2"), Path: envOr("MIST_NFS_ROOT", "/srv/mist-data") + "/" + path, ReadOnly: readonly}}}} - if existing, err := c.CoreV1().PersistentVolumes().Get(ctx, name, metav1.GetOptions{}); apierrors.IsNotFound(err) { - if _, err = c.CoreV1().PersistentVolumes().Create(ctx, pv, metav1.CreateOptions{}); err != nil { - return err - } - } else if err != nil { - return err - } else if existing.Spec.NFS == nil || *existing.Spec.NFS != *pv.Spec.NFS { - return fmt.Errorf("storage volume %s points at a different export; replace its retained binding during storage cutover", name) - } else if existing.Spec.Capacity.Storage().Cmp(pv.Spec.Capacity[corev1.ResourceStorage]) < 0 { - existing.Spec.Capacity = pv.Spec.Capacity - if _, err = c.CoreV1().PersistentVolumes().Update(ctx, existing, metav1.UpdateOptions{}); err != nil { - return err - } - } - pvc := &corev1.PersistentVolumeClaim{ObjectMeta: metav1.ObjectMeta{Name: claim, Namespace: namespace}, Spec: corev1.PersistentVolumeClaimSpec{AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteMany}, StorageClassName: ptr(""), VolumeName: name, Resources: corev1.VolumeResourceRequirements{Requests: corev1.ResourceList{corev1.ResourceStorage: resource.MustParse(fmt.Sprintf("%dGi", gib))}}}} - if _, err := c.CoreV1().PersistentVolumeClaims(namespace).Get(ctx, claim, metav1.GetOptions{}); apierrors.IsNotFound(err) { - _, err = c.CoreV1().PersistentVolumeClaims(namespace).Create(ctx, pvc, metav1.CreateOptions{}) - return err - } else { - return err - } -} -func quantity(value string) *resource.Quantity { - if value == "" { - value = "0" - } - q := resource.MustParse(value) - return &q -} diff --git a/src/team_storage.go b/src/team_storage.go deleted file mode 100644 index d402fb3..0000000 --- a/src/team_storage.go +++ /dev/null @@ -1,422 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "errors" - "net/http" - "os" - "path/filepath" - "sort" - "strings" - "time" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func scopePath(scope string) string { - if scope == "common" { - return "common" - } - return "members/" + hashID(scope) -} - -type StorageFolder struct { - TeamID string `json:"team_id"` - TeamName string `json:"team_name"` - Scope string `json:"scope"` - Name string `json:"name"` - Shared bool `json:"shared"` - Writable bool `json:"writable"` -} - -func (a *App) storageFolders(w http.ResponseWriter, r *http.Request) { - e := a.requestExecutor(r) - if e.team == nil { - writeJSON(w, 200, map[string]any{"folders": []StorageFolder{}}) - return - } - _, teams, err := a.teams.registry(r.Context()) - if err != nil { - executorError(w, err) - return - } - folders := []StorageFolder{} - for _, source := range teams { - if source.Disabled { - continue - } - scopes := map[string]string{} - if source.ID == e.team.Team.ID { - scopes["common"] = "Common" - for _, m := range source.Members { - scopes[m.ID] = m.Name - } - jobs, err := e.client.BatchV1().Jobs(e.namespace).List(r.Context(), metav1.ListOptions{LabelSelector: managedLabel + "=mist"}) - if err != nil { - executorError(w, err) - return - } - for _, job := range jobs.Items { - scope := job.Annotations["mist.io/storage-scope"] - if scope != "" && scope != "common" { - if _, exists := scopes[scope]; !exists { - scopes[scope] = job.Annotations["mist.io/creator-name"] + " (retained files)" - } - } - } - list, err := a.teams.accessibleDatasets(r.Context(), e.team.Team) - if err != nil { - executorError(w, err) - return - } - for _, ds := range list { - if ds.TeamID == source.ID && ds.Scope != "" { - if _, ok := scopes[ds.Scope]; !ok { - scopes[ds.Scope] = ds.MemberName + " (retained files)" - } - } - } - } - for _, g := range source.Grants { - if g.TargetTeam == e.team.Team.ID { - if g.Scope == "common" { - scopes[g.Scope] = "Common" - } else if m := source.member(g.Scope); m != nil { - scopes[g.Scope] = m.Name - } else { - scopes[g.Scope] = "Former member" - } - } - } - for scope, name := range scopes { - folders = append(folders, StorageFolder{TeamID: source.ID, TeamName: source.Name, Scope: scope, Name: name, Shared: source.ID != e.team.Team.ID, Writable: source.ID == e.team.Team.ID && a.teams.canWrite(r.Context(), e.team, scope) == nil}) - } - } - sort.Slice(folders, func(i, j int) bool { - if folders[i].TeamName == folders[j].TeamName { - return folders[i].Name < folders[j].Name - } - return folders[i].TeamName < folders[j].TeamName - }) - writeJSON(w, 200, map[string]any{"folders": folders}) -} -func (a *App) storageFolderFiles(w http.ResponseWriter, r *http.Request) { - e := a.requestExecutor(r) - if e.team == nil { - writeJSON(w, 400, map[string]string{"error": "Select a team workspace"}) - return - } - sourceID, scope := r.URL.Query().Get("source_team"), r.URL.Query().Get("scope") - if sourceID == "" { - sourceID = e.team.Team.ID - } - source, err := a.teams.team(r.Context(), sourceID) - if err != nil || source.Disabled { - writeJSON(w, 404, map[string]string{"error": "folder not found"}) - return - } - authorized := sourceID == e.team.Team.ID - if !authorized { - for _, grant := range source.Grants { - if grant.TargetTeam == e.team.Team.ID && grant.Scope == scope { - authorized = true - } - } - } - if !authorized || (scope != "common" && (scope == "" || len(scope) > 128 || strings.ContainsAny(scope, "/\\\x00"))) { - writeJSON(w, 404, map[string]string{"error": "folder not found"}) - return - } - store, err := a.teams.store(source) - if err != nil { - executorError(w, err) - return - } - serveTeamFolder(w, r, store, scope) -} -func (s *TeamService) resolveDataset(ctx context.Context, target *Team, id string) (*SharedStorage, *Team, *Dataset, error) { - if !datasetIDPattern.MatchString(id) { - return nil, nil, nil, os.ErrNotExist - } - if store, err := s.store(target); err == nil { - if ds, err := store.dataset(id, target.ID); err == nil { - return store, target, ds, nil - } - } - _, teams, err := s.registry(ctx) - if err != nil { - return nil, nil, nil, err - } - for i := range teams { - source := &teams[i] - if source.Disabled || source.ID == target.ID { - continue - } - scopes := map[string]bool{} - for _, g := range source.Grants { - if g.TargetTeam == target.ID { - scopes[g.Scope] = true - } - } - if len(scopes) == 0 { - continue - } - store, err := s.store(source) - if err != nil { - continue - } - ds, err := store.dataset(id, source.ID) - if err == nil && scopes[ds.Scope] { - ds.Shared = true - return store, source, ds, nil - } - } - return nil, nil, nil, os.ErrNotExist -} -func (s *TeamService) accessibleDatasets(ctx context.Context, target *Team) ([]Dataset, error) { - _, teams, err := s.registry(ctx) - if err != nil { - return nil, err - } - result := []Dataset{} - for i := range teams { - source := &teams[i] - if source.Disabled { - continue - } - scopes := map[string]bool{} - for _, g := range source.Grants { - if g.TargetTeam == target.ID { - scopes[g.Scope] = true - } - } - if source.ID != target.ID && len(scopes) == 0 { - continue - } - store, err := s.store(source) - if err != nil { - if source.ID == target.ID { - return nil, err - } - continue - } - entries, err := os.ReadDir(filepath.Join(store.root, "metadata/datasets")) - if err != nil { - return nil, err - } - for _, entry := range entries { - ds, err := store.dataset(strings.TrimSuffix(entry.Name(), ".json"), source.ID) - if err != nil { - continue - } - if source.ID == target.ID || scopes[ds.Scope] { - ds.TeamName = source.Name - ds.Shared = source.ID != target.ID - result = append(result, *ds) - } - } - } - sort.Slice(result, func(i, j int) bool { return result[i].Created.After(result[j].Created) }) - return result, nil -} -func (s *TeamService) canWrite(ctx context.Context, access *TeamAccess, scope string) error { - t, err := s.team(ctx, access.Team.ID) - if err != nil { - return err - } - m := t.member(access.Member.ID) - if t.Disabled || m == nil { - return &permissionError{errors.New("Team membership was revoked")} - } - if scope == access.Member.ID { - return nil - } - if scope == "common" && (m.CommonWriter || isAdmin(access.Member)) { - return nil - } - return &permissionError{errors.New("You can manage your own folder; common-folder writes require permission")} -} -func (a *App) teamDatasets(w http.ResponseWriter, r *http.Request, e *KubernetesExecutor) { - access := e.team - switch r.Method { - case http.MethodGet: - list, err := a.teams.accessibleDatasets(r.Context(), access.Team) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, map[string]any{"datasets": list, "upload_limit_bytes": e.storage.availableUploadLimit(true)}) - case http.MethodPost: - controller := http.NewResponseController(w) - _ = controller.SetReadDeadline(time.Now().Add(24 * time.Hour)) - _ = controller.SetWriteDeadline(time.Now().Add(24 * time.Hour)) - scope := r.URL.Query().Get("scope") - if scope == "" { - scope = access.Member.ID - } - if err := a.teams.canWrite(r.Context(), access, scope); err != nil { - executorError(w, err) - return - } - // upload() rechecks membership/permissions before atomically publishing. - r.Body = http.MaxBytesReader(w, r.Body, e.storage.uploadLimit+1) - ds, err := e.storage.upload(r, access.Team.ID) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 201, ds) - default: - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) - } -} -func (a *App) teamDataset(w http.ResponseWriter, r *http.Request, e *KubernetesExecutor, id string) { - store, source, ds, err := a.teams.resolveDataset(r.Context(), e.team.Team, id) - if err != nil { - writeJSON(w, 404, map[string]string{"error": "dataset not found"}) - return - } - switch r.Method { - case http.MethodGet: - writeJSON(w, 200, ds) - case http.MethodDelete: - if source.ID != e.team.Team.ID { - writeJSON(w, 403, map[string]string{"error": "Shared datasets are read-only"}) - return - } - a.teams.mu.Lock() - defer a.teams.mu.Unlock() - if err = a.teams.canWrite(r.Context(), e.team, ds.Scope); err != nil { - executorError(w, err) - return - } - store.mu.Lock() - defer store.mu.Unlock() - jobs, err := e.client.BatchV1().Jobs("").List(r.Context(), metav1.ListOptions{LabelSelector: managedLabel + "=mist"}) - if err != nil { - executorError(w, err) - return - } - for _, job := range jobs.Items { - var req CreateJobRequest - _ = json.Unmarshal([]byte(job.Annotations[requestAnnotation]), &req) - if req.DatasetID == id && !terminal(&job) { - pods, err := e.client.CoreV1().Pods(job.Namespace).List(r.Context(), metav1.ListOptions{LabelSelector: "batch.kubernetes.io/job-name=" + job.Name}) - if err != nil { - executorError(w, err) - return - } - if job.Annotations[cancelAnnotation] == "" || len(pods.Items) > 0 { - writeJSON(w, 409, map[string]string{"error": "Dataset is referenced by an active, queued or terminating job"}) - return - } - } - } - if err = os.Remove(filepath.Join(store.root, "metadata/datasets", id+".json")); err != nil { - executorError(w, err) - return - } - path, err := store.contentPath(ds) - if err != nil { - executorError(w, err) - return - } - if err = os.RemoveAll(filepath.Dir(path)); err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, map[string]string{"id": id, "state": "Deleted"}) - default: - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) - } -} -func (s *SharedStorage) contentPath(ds *Dataset) (string, error) { - path := ds.ContentPath - if path == "" { - path = "datasets/" + ds.ID + "/content" - } - if !safeRelative(path) { - return "", errors.New("invalid dataset storage path") - } - return filepath.Join(s.root, path), nil -} -func (a *App) datasetFiles(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) - return - } - parts := strings.Split(strings.TrimPrefix(r.URL.Path, "/datasets/"), "/") - if len(parts) < 2 || len(parts) > 3 || parts[1] != "files" || (len(parts) == 3 && parts[2] != "download") { - writeJSON(w, 404, map[string]string{"error": "not found"}) - return - } - e := a.requestExecutor(r) - store := e.storage - if store == nil { - writeJSON(w, 503, map[string]string{"error": "Storage is unavailable"}) - return - } - var ds *Dataset - var err error - if e.team != nil { - store, _, ds, err = a.teams.resolveDataset(r.Context(), e.team.Team, parts[0]) - } else { - ds, err = store.dataset(parts[0], e.owner) - } - if err != nil { - writeJSON(w, 404, map[string]string{"error": "dataset not found"}) - return - } - path, err := store.contentPath(ds) - if err != nil { - executorError(w, err) - return - } - serveStoredFiles(w, r, path, len(parts) == 3) -} - -// Keep the public common/member tree stable across dataset and result directories. -func serveTeamFolder(w http.ResponseWriter, r *http.Request, store *SharedStorage, scope string) { - data := filepath.Join(store.root, scopePath(scope)) - models := filepath.Join(store.resultsRoot(), scopePath(scope)) - if r.URL.Query().Get("download") == "true" { - path := r.URL.Query().Get("path") - if strings.HasPrefix(path, "jobs/") { - serveStoredFiles(w, r, models, true) - } else if strings.HasPrefix(path, "datasets/") { - serveStoredFiles(w, r, data, true) - } else { - writeJSON(w, 400, map[string]string{"error": "Invalid folder file path"}) - } - return - } - files := []ResultFile{} - for _, path := range []string{filepath.Join(data, "datasets"), filepath.Join(models, "jobs")} { - root, err := os.OpenRoot(path) - if os.IsNotExist(err) { - continue - } - if err != nil { - executorError(w, err) - return - } - listed, err := listResultFiles(root) - root.Close() - if err != nil { - executorError(w, err) - return - } - prefix := filepath.Base(path) + "/" - for _, f := range listed { - f.Path = prefix + f.Path - files = append(files, f) - } - if len(files) > 10000 { - writeJSON(w, 400, map[string]string{"error": "folder has too many files"}) - return - } - } - sort.Slice(files, func(i, j int) bool { return files[i].Path < files[j].Path }) - writeJSON(w, 200, map[string]any{"files": files}) -} diff --git a/src/teams.go b/src/teams.go deleted file mode 100644 index 9af698c..0000000 --- a/src/teams.go +++ /dev/null @@ -1,546 +0,0 @@ -package main - -// Teams are domain policy, independent of the authentication provider. Identity -// comes from the authentication service; ordinary clients never supply roles. -import ( - "context" - "crypto/rand" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "os" - "path/filepath" - "regexp" - "sort" - "strings" - "sync" - "syscall" - "time" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/util/retry" -) - -const teamRegistry = "mist-teams" -const maxStorageAllowanceGiB int64 = 1 << 20 -const sharedFolderLayout = "shared-folders-v1" - -var teamIDPattern = regexp.MustCompile(`^team-[a-f0-9]{16}$`) - -type TeamPolicy struct { - CPU string `json:"cpu"` - Memory string `json:"memory"` - NVIDIA int `json:"nvidia"` - Tenstorrent int `json:"tenstorrent"` - Concurrent int `json:"concurrent"` - Queued int `json:"queued"` - StorageGiB int64 `json:"storage_gib"` // Advisory dataset allowance; retained wire field. - ModelStorageGiB int64 `json:"model_storage_gib"` - RuntimeSeconds int64 `json:"runtime_seconds"` - Registries []string `json:"registries"` -} -type TeamMember struct { - ID string `json:"id"` - Name string `json:"name"` - Email string `json:"email"` - CommonWriter bool `json:"common_writer"` -} -type StorageGrant struct { - ID string `json:"id"` - TargetTeam string `json:"target_team"` - Scope string `json:"scope"` -} -type Team struct { - ID string `json:"id"` - Name string `json:"name"` - Created time.Time `json:"created"` - Disabled bool `json:"disabled"` - Policy TeamPolicy `json:"policy"` - Members []TeamMember `json:"members"` - Grants []StorageGrant `json:"grants"` -} -type TeamService struct { - app *App - mu sync.Mutex // admissions and policy changes are serialized on the single controller - storageMu sync.Mutex - stores map[string]*SharedStorage - provisioned map[string]teamProvisioned - stop chan struct{} - done chan struct{} -} -type teamProvisioned struct { - signature string - checked time.Time -} -type teamContextKey struct{} -type TeamAccess struct { - Team *Team - Member *Member - Store *SharedStorage - Service *TeamService -} - -func isAdmin(m *Member) bool { return m != nil && contains(strings.Split(m.Role, ","), "admin") } -func contains(values []string, value string) bool { - for _, v := range values { - if v == value { - return true - } - } - return false -} -func (t *Team) member(id string) *TeamMember { - for i := range t.Members { - if t.Members[i].ID == id { - return &t.Members[i] - } - } - return nil -} -func (t *Team) namespace() string { return "mist-" + t.ID } -func defaultTeamPolicy() TeamPolicy { - return TeamPolicy{CPU: "8", Memory: "32Gi", NVIDIA: 2, Tenstorrent: 4, Concurrent: 2, Queued: 50, StorageGiB: 200, ModelStorageGiB: 500, RuntimeSeconds: 86400, Registries: []string{"docker.io", "ghcr.io", "nvcr.io"}} -} - -// storageBudgetGiB retains the existing response field as informational physical -// shared capacity. Advisory allowances are not added up or reserved on disk. -func (s *TeamService) storageBudgetGiB() int64 { - var fs syscall.Statfs_t - if syscall.Statfs(s.app.executor.storage.root, &fs) != nil { - return 0 - } - return int64(fs.Blocks) * fs.Bsize / (1024 * 1024 * 1024) -} -func normalizeStoragePolicy(p *TeamPolicy) { - // Preserve legacy callers which supplied one advisory allowance. - if p.ModelStorageGiB == 0 { - p.ModelStorageGiB = p.StorageGiB - } -} -func validateTeam(team *Team) error { - normalizeStoragePolicy(&team.Policy) - if strings.TrimSpace(team.Name) == "" || len(team.Name) > 100 { - return errors.New("team name must contain 1–100 characters") - } - p := team.Policy - cpu, err := resource.ParseQuantity(p.CPU) - if err != nil || cpu.Sign() <= 0 || cpu.Cmp(resource.MustParse("32")) > 0 { - return errors.New("team CPU must be greater than zero and at most 32") - } - mem, err := resource.ParseQuantity(p.Memory) - if err != nil || mem.Cmp(resource.MustParse("64Mi")) < 0 || mem.Cmp(resource.MustParse("128Gi")) > 0 { - return errors.New("team memory must be between 64Mi and 128Gi") - } - if p.NVIDIA < 0 || p.NVIDIA > 2 || p.Tenstorrent < 0 || p.Tenstorrent > 4 || p.Concurrent < 1 || p.Concurrent > 16 || p.Queued < 1 || p.Queued > 200 || p.StorageGiB < 1 || p.StorageGiB > maxStorageAllowanceGiB || p.ModelStorageGiB < 1 || p.ModelStorageGiB > maxStorageAllowanceGiB || p.RuntimeSeconds < 10 || p.RuntimeSeconds > 86400 { - return errors.New("invalid team device, concurrency, queue, storage or runtime limits") - } - if len(p.Registries) > 20 { - return errors.New("too many image registries") - } - for _, host := range p.Registries { - if !registryPattern.MatchString(host) || strings.Contains(host, "..") { - return errors.New("image registries must be lowercase public registry hostnames") - } - } - return nil -} -func newTeamService(a *App) *TeamService { - return &TeamService{app: a, stores: map[string]*SharedStorage{}, provisioned: map[string]teamProvisioned{}, stop: make(chan struct{}), done: make(chan struct{})} -} -func (s *TeamService) registry(ctx context.Context) (*corev1.ConfigMap, []Team, error) { - cm, err := s.app.executor.client.CoreV1().ConfigMaps("mist-system").Get(ctx, teamRegistry, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - return &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: teamRegistry, Namespace: "mist-system"}, Data: map[string]string{"teams": "[]"}}, []Team{}, nil - } - if err != nil { - return nil, nil, err - } - var teams []Team - if err = json.Unmarshal([]byte(cm.Data["teams"]), &teams); err != nil { - return nil, nil, fmt.Errorf("invalid persisted team registry: %w", err) - } - for i := range teams { - normalizeStoragePolicy(&teams[i].Policy) - } - return cm, teams, nil -} -func (s *TeamService) mutate(ctx context.Context, change func(*[]Team) error) error { - return retry.RetryOnConflict(retry.DefaultRetry, func() error { - cm, teams, err := s.registry(ctx) - if err != nil { - return err - } - if err = change(&teams); err != nil { - return &submissionError{err} - } - data, err := json.Marshal(teams) - if err != nil { - return err - } - if len(data) > 240*1024 { - return &submissionError{errors.New("team registry is full")} - } - cm.Data["teams"] = string(data) - if cm.ResourceVersion == "" { - _, err = s.app.executor.client.CoreV1().ConfigMaps("mist-system").Create(ctx, cm, metav1.CreateOptions{}) - if apierrors.IsAlreadyExists(err) { - return apierrors.NewConflict(corev1.Resource("configmaps"), teamRegistry, err) - } - } else { - _, err = s.app.executor.client.CoreV1().ConfigMaps("mist-system").Update(ctx, cm, metav1.UpdateOptions{}) - } - return err - }) -} -func findTeam(teams []Team, id string) *Team { - for i := range teams { - if teams[i].ID == id { - return &teams[i] - } - } - return nil -} -func (s *TeamService) team(ctx context.Context, id string) (*Team, error) { - _, teams, err := s.registry(ctx) - if err != nil { - return nil, err - } - t := findTeam(teams, id) - if t == nil { - return nil, os.ErrNotExist - } - return t, nil -} -func (s *TeamService) store(t *Team) (*SharedStorage, error) { - s.storageMu.Lock() - defer s.storageMu.Unlock() - status, err := os.ReadFile(filepath.Join(s.app.executor.storage.root, "metadata/provision-status", t.ID+".json")) - if err != nil { - return nil, errors.New("team storage is being provisioned") - } - var ready teamStorageStatus - if json.Unmarshal(status, &ready) != nil || ready.State != "Ready" || ready.Layout != sharedFolderLayout { - return nil, errors.New("team storage is not ready") - } - base := filepath.Join(s.app.executor.storage.root, "teams", t.ID) - for _, path := range []string{base, filepath.Join(base, "datasets"), filepath.Join(base, "results")} { - info, err := os.Lstat(path) - if err != nil || !info.IsDir() || info.Mode()&os.ModeSymlink != 0 { - return nil, errors.New("team storage directories are unavailable") - } - } - if st := s.stores[t.ID]; st != nil { - return st, nil - } - st, err := NewSharedStorage(filepath.Join(base, "datasets")) - if err != nil { - return nil, err - } - st.modelRoot = filepath.Join(base, "results") - - s.stores[t.ID] = st - return st, nil -} -func (s *TeamService) middleware(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - id := r.Header.Get("X-Mist-Team") - if id == "" { - id = r.URL.Query().Get("team_id") - } - if id == "" || strings.HasPrefix(r.URL.Path, "/teams") || r.URL.Path == "/session" || r.URL.Path == "/healthz" || strings.HasPrefix(r.URL.Path, "/auth/") { - if id == "" && r.Method == http.MethodPost && (r.URL.Path == "/jobs" || r.URL.Path == "/datasets") { - writeJSON(w, 403, map[string]string{"error": "Select a team workspace before submitting jobs or uploading files"}) - return - } - next.ServeHTTP(w, r) - return - } - m, _ := r.Context().Value(memberKey{}).(*Member) - if m == nil { - writeJSON(w, 401, map[string]string{"error": "Sign in to Mist"}) - return - } - t, err := s.team(r.Context(), id) - if err != nil { - if !os.IsNotExist(err) { - executorError(w, err) - } else { - writeJSON(w, 404, map[string]string{"error": "team not found"}) - } - return - } - if t.Disabled || t.member(m.ID) == nil { - writeJSON(w, 403, map[string]string{"error": "You are not an active member of this team"}) - return - } - store, err := s.store(t) - if err != nil { - writeJSON(w, 503, map[string]string{"error": err.Error()}) - return - } - access := &TeamAccess{Team: t, Member: m, Store: store, Service: s} - next.ServeHTTP(w, r.WithContext(context.WithValue(r.Context(), teamContextKey{}, access))) - }) -} -func randomID(prefix string) (string, error) { - b := make([]byte, 8) - _, err := rand.Read(b) - return prefix + hex.EncodeToString(b), err -} -func decodeTeamJSON(w http.ResponseWriter, r *http.Request, value any) error { - d := json.NewDecoder(http.MaxBytesReader(w, r.Body, 64*1024)) - d.DisallowUnknownFields() - if err := d.Decode(value); err != nil { - return &submissionError{err} - } - if d.Decode(new(any)) != io.EOF { - return &submissionError{errors.New("expected one JSON object")} - } - return nil -} -func (a *App) teamEndpoint(w http.ResponseWriter, r *http.Request) { - s := a.teams - if s == nil { - writeJSON(w, 503, map[string]string{"error": "Team workspaces are not enabled"}) - return - } - m, _ := r.Context().Value(memberKey{}).(*Member) - if r.URL.Path == "/teams" && r.Method == http.MethodGet { - _, teams, err := s.registry(r.Context()) - if err != nil { - executorError(w, err) - return - } - result := []Team{} - for _, t := range teams { - if isAdmin(m) || t.member(m.ID) != nil { - result = append(result, t) - } - } - writeJSON(w, 200, map[string]any{"teams": result, "storage_budget_gib": s.storageBudgetGiB(), "storage_limits_enforced": false}) - return - } - if !isAdmin(m) { - writeJSON(w, 403, map[string]string{"error": "Administrator access required"}) - return - } - s.mu.Lock() - defer s.mu.Unlock() - parts := strings.Split(strings.TrimPrefix(r.URL.Path, "/teams"), "/") - if r.URL.Path == "/teams" && r.Method == http.MethodPost { - var body struct { - Name string `json:"name"` - StorageGiB *int64 `json:"storage_gib"` - ModelStorageGiB *int64 `json:"model_storage_gib"` - Policy *TeamPolicy `json:"policy"` - } - if err := decodeTeamJSON(w, r, &body); err != nil { - executorError(w, err) - return - } - id, err := randomID("team-") - if err != nil { - executorError(w, err) - return - } - t := Team{ID: id, Name: body.Name, Created: time.Now().UTC(), Policy: defaultTeamPolicy(), Members: []TeamMember{}, Grants: []StorageGrant{}} - if body.Policy != nil { - t.Policy = *body.Policy - } - if body.StorageGiB != nil { - t.Policy.StorageGiB = *body.StorageGiB - if body.ModelStorageGiB == nil { - t.Policy.ModelStorageGiB = *body.StorageGiB - } - } - if body.ModelStorageGiB != nil { - if *body.ModelStorageGiB < 1 { - executorError(w, &submissionError{errors.New("model storage must be at least 1 GiB")}) - return - } - t.Policy.ModelStorageGiB = *body.ModelStorageGiB - } - if err = validateTeam(&t); err != nil { - executorError(w, &submissionError{err}) - return - } - err = s.mutate(r.Context(), func(list *[]Team) error { - if len(*list) >= 100 { - return errors.New("at most 100 teams are supported") - } - *list = append(*list, t) - return nil - }) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 201, t) - return - } - if len(parts) < 2 || !teamIDPattern.MatchString(parts[1]) { - writeJSON(w, 404, map[string]string{"error": "team not found"}) - return - } - id := parts[1] - switch { - case len(parts) == 2 && r.Method == http.MethodPatch: - var body struct { - Name *string `json:"name"` - Policy *TeamPolicy `json:"policy"` - Disabled *bool `json:"disabled"` - } - if err := decodeTeamJSON(w, r, &body); err != nil { - executorError(w, err) - return - } - err := s.mutate(r.Context(), func(list *[]Team) error { - t := findTeam(*list, id) - if t == nil { - return errors.New("team not found") - } - if body.Name != nil { - t.Name = *body.Name - } - if body.Disabled != nil { - t.Disabled = *body.Disabled - } - if body.Policy != nil { - normalizeStoragePolicy(body.Policy) - t.Policy = *body.Policy - } - return validateTeam(t) - }) - if err != nil { - executorError(w, err) - return - } - case len(parts) == 3 && parts[2] == "members" && r.Method == http.MethodPost: - var body struct { - UserID string `json:"user_id"` - CommonWriter bool `json:"common_writer"` - } - if err := decodeTeamJSON(w, r, &body); err != nil { - executorError(w, err) - return - } - member, err := a.auth.lookupMember(r, body.UserID) - if err != nil { - executorError(w, &submissionError{errors.New("select an existing active Mist account")}) - return - } - err = s.mutate(r.Context(), func(list *[]Team) error { - t := findTeam(*list, id) - if t == nil { - return errors.New("team not found") - } - entry := TeamMember{ID: member.ID, Name: member.Name, Email: member.Email, CommonWriter: body.CommonWriter} - if old := t.member(member.ID); old != nil { - *old = entry - } else { - t.Members = append(t.Members, entry) - } - return nil - }) - if err != nil { - executorError(w, err) - return - } - case len(parts) == 4 && parts[2] == "members" && r.Method == http.MethodDelete: - err := s.mutate(r.Context(), func(list *[]Team) error { - t := findTeam(*list, id) - if t == nil { - return errors.New("team not found") - } - members := []TeamMember{} - for _, member := range t.Members { - if member.ID != parts[3] { - members = append(members, member) - } - } - t.Members = members - return nil - }) - if err != nil { - executorError(w, err) - return - } - case len(parts) == 3 && parts[2] == "grants" && r.Method == http.MethodPost: - var body struct { - TargetTeam string `json:"target_team"` - Scope string `json:"scope"` - } - if err := decodeTeamJSON(w, r, &body); err != nil { - executorError(w, err) - return - } - grantID, err := randomID("grant-") - if err != nil { - executorError(w, err) - return - } - err = s.mutate(r.Context(), func(list *[]Team) error { - t := findTeam(*list, id) - target := findTeam(*list, body.TargetTeam) - if t == nil || target == nil || target.Disabled || target.ID == id { - return errors.New("select a different active target team") - } - if body.Scope != "common" && t.member(body.Scope) == nil { - return errors.New("scope must be common or a source team member ID") - } - for _, g := range t.Grants { - if g.TargetTeam == body.TargetTeam && g.Scope == body.Scope { - return errors.New("this grant already exists") - } - } - t.Grants = append(t.Grants, StorageGrant{ID: grantID, TargetTeam: body.TargetTeam, Scope: body.Scope}) - return nil - }) - if err != nil { - executorError(w, err) - return - } - case len(parts) == 4 && parts[2] == "grants" && r.Method == http.MethodDelete: - err := s.mutate(r.Context(), func(list *[]Team) error { - t := findTeam(*list, id) - if t == nil { - return errors.New("team not found") - } - grants := []StorageGrant{} - for _, g := range t.Grants { - if g.ID != parts[3] { - grants = append(grants, g) - } - } - t.Grants = grants - return nil - }) - if err != nil { - executorError(w, err) - return - } - default: - writeJSON(w, 405, map[string]string{"error": "method not allowed"}) - return - } - // Reconcile revoked job access before reporting successful policy changes. - if err := s.revokeJobs(r.Context()); err != nil { - writeJSON(w, 503, map[string]string{"error": "Policy saved; job access reconciliation pending: " + err.Error()}) - return - } - t, err := s.team(r.Context(), id) - if err != nil { - executorError(w, err) - return - } - writeJSON(w, 200, t) -} -func sortedTeams(teams []Team) { - sort.Slice(teams, func(i, j int) bool { return teams[i].ID < teams[j].ID }) -} diff --git a/src/teams_test.go b/src/teams_test.go deleted file mode 100644 index b444812..0000000 --- a/src/teams_test.go +++ /dev/null @@ -1,587 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "fmt" - "io" - "log/slog" - "net/http/httptest" - "os" - "path/filepath" - "strings" - "testing" - "time" - - batchv1 "k8s.io/api/batch/v1" - corev1 "k8s.io/api/core/v1" - resourcev1 "k8s.io/api/resource/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes/fake" - kt "k8s.io/client-go/testing" -) - -func departmentTestApp(t *testing.T) (*App, *fake.Clientset, []Team) { - t.Helper() - root := t.TempDir() - store, err := NewSharedStorage(root) - if err != nil { - t.Fatal(err) - } - teams := []Team{{ID: "team-aaaaaaaaaaaaaaaa", Name: "A", Policy: defaultTeamPolicy(), Members: []TeamMember{{ID: "alice", Name: "Alice"}}, Grants: []StorageGrant{}}, {ID: "team-bbbbbbbbbbbbbbbb", Name: "B", Policy: defaultTeamPolicy(), Members: []TeamMember{{ID: "bob", Name: "Bob"}}, Grants: []StorageGrant{}}} - data, _ := json.Marshal(teams) - c := fake.NewSimpleClientset(&corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: teamRegistry, Namespace: "mist-system", ResourceVersion: "1"}, Data: map[string]string{"teams": string(data)}}, &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: "training-smoke-script", Namespace: "mist"}, Data: map[string]string{"training_smoke.py": "print('ok')"}}, &corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "main"}, Status: corev1.NodeStatus{Allocatable: corev1.ResourceList{corev1.ResourceCPU: resource.MustParse("8"), corev1.ResourceMemory: resource.MustParse("32Gi")}, Conditions: []corev1.NodeCondition{{Type: corev1.NodeReady, Status: corev1.ConditionTrue}}}}) - c.PrependReactor("create", "configmaps", func(action kt.Action) (bool, runtime.Object, error) { - action.(kt.CreateAction).GetObject().(*corev1.ConfigMap).ResourceVersion = "1" - return false, nil, nil - }) - for i := 1; i <= 4; i++ { - name := fmt.Sprintf("mist-tenstorrent-%d-boards", i) - _, err = c.ResourceV1().ResourceClaimTemplates("mist").Create(context.Background(), &resourcev1.ResourceClaimTemplate{ObjectMeta: metav1.ObjectMeta{Name: name}}, metav1.CreateOptions{}) - if err != nil { - t.Fatal(err) - } - } - t.Setenv("MIST_TEAMS_ENABLED", "true") - t.Setenv("MIST_AUTH_DATABASE", filepath.Join(t.TempDir(), "auth.sqlite")) - e := &KubernetesExecutor{client: c, namespace: "mist", owner: "legacy", storage: store, cpuNode: "main", ttNode: "tt", allowedImages: map[string]bool{cpuImage: true, ttImage: true, nvidiaImage: true}} - app := NewKubernetesApp(e, slog.New(slog.NewTextHandler(io.Discard, nil))) - now := time.Now().UTC().Format(time.RFC3339Nano) - for _, m := range []Member{ - {ID: "alice", Name: "Alice", Email: "alice@mist.local", Role: "user"}, - {ID: "bob", Name: "Bob", Email: "bob@mist.local", Role: "user"}, - {ID: "admin", Name: "Admin", Email: "admin@mist.local", Role: "admin"}, - } { - if _, err = app.auth.db.Exec(` - INSERT INTO user (id, name, email, role, createdAt, updatedAt) - VALUES (?, ?, ?, ?, ?, ?) - `, m.ID, m.Name, m.Email, m.Role, now, now); err != nil { - t.Fatal(err) - } - } - for _, id := range []string{"alice", "bob", "admin"} { - seedTestSession(t, app.auth, id) - } - t.Cleanup(func() { _ = app.auth.Close() }) - - for _, team := range teams { - for _, pool := range []string{"datasets", "results"} { - if err := os.MkdirAll(filepath.Join(root, "teams", team.ID, pool), 0750); err != nil { - t.Fatal(err) - } - } - if err = atomicJSON(filepath.Join(root, "metadata/provision-status", team.ID+".json"), teamStorageStatus{State: "Ready", Layout: sharedFolderLayout, UsageObservedUnix: time.Now().Unix()}); err != nil { - t.Fatal(err) - } - if _, err = app.teams.store(&team); err != nil { - t.Fatal(err) - } - } - return app, c, teams -} -func departmentRequest(a *App, method, path, identity, team, body string) *httptest.ResponseRecorder { - req := httptest.NewRequest(method, path, strings.NewReader(body)) - req.Header.Set("Cookie", "better-auth.session_token=test-session-"+identity) - if team != "" { - req.Header.Set("X-Mist-Team", team) - } - w := httptest.NewRecorder() - a.httpServer.Handler.ServeHTTP(w, req) - return w -} -func TestDepartmentTeamPermissionsAndScopedSharing(t *testing.T) { - a, _, teams := departmentTestApp(t) - alice, bob := teams[0], teams[1] - r := departmentRequest(a, "POST", "/datasets?filename=data.txt&scope=common", "alice", alice.ID, "data") - if r.Code != 403 { - t.Fatalf("member wrote common folder: %d %s", r.Code, r.Body) - } - r = departmentRequest(a, "POST", "/datasets?filename=data.txt", "alice", alice.ID, "data") - if r.Code != 201 { - t.Fatalf("own upload: %d %s", r.Code, r.Body) - } - var ds Dataset - _ = json.Unmarshal(r.Body.Bytes(), &ds) - if ds.Scope != "alice" || !strings.HasPrefix(ds.ContentPath, "members/") { - t.Fatalf("incorrect member folder: %+v", ds) - } - for _, path := range []string{"/datasets/" + ds.ID, "/datasets/" + ds.ID + "/files", "/storage/files?source_team=" + alice.ID + "&scope=alice"} { - r = departmentRequest(a, "GET", path, "bob", bob.ID, "") - if r.Code != 404 { - t.Fatalf("foreign data exposed at %s: %d", path, r.Code) - } - } - if r = departmentRequest(a, "GET", "/datasets", "bob", alice.ID, ""); r.Code != 403 { - t.Fatal("spoofed team membership accepted") - } - if r = departmentRequest(a, "POST", "/teams", "bob", "", `{"name":"bad"}`); r.Code != 403 { - t.Fatal("member created team") - } - if r = departmentRequest(a, "POST", "/jobs", "alice", "", `{"command":["true"]}`); r.Code != 403 { - t.Fatal("legacy submission bypasses team limits") - } - r = departmentRequest(a, "POST", "/teams/"+alice.ID+"/grants", "admin", "", `{"target_team":"`+bob.ID+`","scope":"alice"}`) - if r.Code != 200 { - t.Fatalf("grant failed: %d %s", r.Code, r.Body) - } - r = departmentRequest(a, "GET", "/datasets/"+ds.ID+"/files", "bob", bob.ID, "") - if r.Code != 200 || !strings.Contains(r.Body.String(), "data.txt") { - t.Fatalf("grant did not expose files: %d %s", r.Code, r.Body) - } - r = departmentRequest(a, "DELETE", "/datasets/"+ds.ID, "bob", bob.ID, "") - if r.Code != 403 { - t.Fatal("read grant permits deletion") - } - r = departmentRequest(a, "POST", "/jobs", "bob", bob.ID, `{"command":["true"],"dataset_id":"`+ds.ID+`"}`) - if r.Code != 201 { - t.Fatalf("shared input submission: %d %s", r.Code, r.Body) - } - var response struct { - Job KubernetesJobStatus `json:"job"` - } - _ = json.Unmarshal(r.Body.Bytes(), &response) - if response.Job.StorageScope != "bob" { - t.Fatal("output ownership incorrectly inherited from input") - } - _, updated, _ := a.teams.registry(context.Background()) - grant := findTeam(updated, alice.ID).Grants[0] - r = departmentRequest(a, "DELETE", "/teams/"+alice.ID+"/grants/"+grant.ID, "admin", "", "") - if r.Code != 200 { - t.Fatalf("revoke failed: %d %s", r.Code, r.Body) - } - r = departmentRequest(a, "GET", "/jobs/"+response.Job.ID, "bob", bob.ID, "") - if !strings.Contains(r.Body.String(), `"job_state":"Cancelled"`) { - t.Fatalf("revoked queued job not stopped: %s", r.Body) - } - r = departmentRequest(a, "GET", "/datasets/"+ds.ID+"/files", "bob", bob.ID, "") - if r.Code != 404 { - t.Fatal("revoked grant remains effective") - } -} -func TestDepartmentPolicyAndAdvisoryStorage(t *testing.T) { - a, _, teams := departmentTestApp(t) - p := defaultTeamPolicy() - p.CPU = "1" - p.NVIDIA = 0 - p.RuntimeSeconds = 60 - team := teams[0] - team.Policy = p - access := &TeamAccess{Team: &team, Member: &Member{ID: "alice"}} - e := *a.executor - e.team = access - for _, req := range []CreateJobRequest{{Command: []string{"true"}, CPU: "2"}, {Command: []string{"true"}, Accelerator: "nvidia"}, {Command: []string{"true"}, StorageScope: "bob"}, {Command: []string{"true"}, Image: "evil.invalid/test:v1"}, {Command: []string{"true"}, Image: "ghcr.io/team/app"}} { - req.TimeoutSeconds = 30 - if _, err := e.normalize(req); err == nil { - t.Fatalf("accepted invalid team request: %+v", req) - } - } - if _, err := e.normalize(CreateJobRequest{Command: []string{"true"}, TimeoutSeconds: 30}); err != nil { - t.Fatalf("valid request rejected: %v", err) - } - if err := a.teams.mutate(context.Background(), func(list *[]Team) error { (*list)[0].Policy.StorageGiB = 1500; return nil }); err != nil { - t.Fatalf("advisory allowance must not reserve disk space: %v", err) - } - changed := departmentRequest(a, "GET", "/teams", "alice", "", "") - if changed.Code != 200 || !strings.Contains(changed.Body.String(), `"storage_limits_enforced":false`) { - t.Fatalf("advisory semantics missing: %s", changed.Body) - } -} -func TestDepartmentDurableFairAdmission(t *testing.T) { - a, c, teams := departmentTestApp(t) - ctx := context.Background() - for i := range teams { - teams[i].Policy.Concurrent = 1 - } - _ = a.teams.mutate(ctx, func(list *[]Team) error { *list = teams; return nil }) - ids := map[string][]string{} - for _, team := range teams { - store, _ := a.teams.store(&team) - for i := 0; i < 2; i++ { - e := *a.executor - e.namespace, e.owner, e.storage, e.sharedPVC = team.namespace(), team.ID, store, "team-datasets" - e.team = &TeamAccess{Team: &team, Member: &Member{ID: team.Members[0].ID}, Service: a.teams} - job, err := e.submit(ctx, CreateJobRequest{Command: []string{"true"}, CPU: "1", Memory: "64Mi"}) - if err != nil { - t.Fatal(err) - } - ids[team.ID] = append(ids[team.ID], job.ID) - } - } - if err := a.teams.admit(ctx, teams); err != nil { - t.Fatal(err) - } - for _, team := range teams { - for i, id := range ids[team.ID] { - job, err := c.BatchV1().Jobs(team.namespace()).Get(ctx, id, metav1.GetOptions{}) - if err != nil { - t.Fatal(err) - } - if (job.Annotations["mist.io/admitted-at"] != "") != (i == 0) { - t.Fatalf("fair admission/concurrency failed for %s job %d", team.ID, i) - } - } - } - // Reconstruct controller state as after a restart; reservations remain in Jobs. - restarted := newTeamService(a) - if err := restarted.admit(ctx, teams); err != nil { - t.Fatal(err) - } - for _, team := range teams { - job, _ := c.BatchV1().Jobs(team.namespace()).Get(ctx, ids[team.ID][1], metav1.GetOptions{}) - if job.Spec.Suspend == nil || !*job.Spec.Suspend { - t.Fatal("restart lost active reservations") - } - first, _ := c.BatchV1().Jobs(team.namespace()).Get(ctx, ids[team.ID][0], metav1.GetOptions{}) - first.Status.Conditions = []batchv1.JobCondition{{Type: batchv1.JobComplete, Status: corev1.ConditionTrue, LastTransitionTime: metav1.NewTime(time.Now())}} - _, _ = c.BatchV1().Jobs(team.namespace()).UpdateStatus(ctx, first, metav1.UpdateOptions{}) - } - if err := restarted.admit(ctx, teams); err != nil { - t.Fatal(err) - } - for _, team := range teams { - job, _ := c.BatchV1().Jobs(team.namespace()).Get(ctx, ids[team.ID][1], metav1.GetOptions{}) - if job.Spec.Suspend == nil || *job.Spec.Suspend { - t.Fatal("completed jobs did not release admission") - } - } -} - -func TestDepartmentAgedHeadDrainsCapacityWithoutStarvation(t *testing.T) { - a, c, teams := departmentTestApp(t) - ctx := context.Background() - create := func(index int, id string, cpu string, admitted bool, age time.Duration) *batchv1.Job { - team := teams[index] - e := *a.executor - e.owner, e.namespace = team.ID, team.namespace() - e.team = &TeamAccess{Team: &team, Member: &Member{ID: team.Members[0].ID}} - req, err := e.normalize(CreateJobRequest{Command: []string{"true"}, CPU: cpu, Memory: "64Mi"}) - if err != nil { - t.Fatal(err) - } - job := e.buildJob(id, req) - job.Spec.Suspend = ptr(!admitted) - job.Annotations["mist.io/queued-at"] = time.Now().Add(-age).Format(time.RFC3339Nano) - if admitted { - job.Annotations["mist.io/admitted-at"] = time.Now().Format(time.RFC3339Nano) - } - saved, err := c.BatchV1().Jobs(e.namespace).Create(ctx, job, metav1.CreateOptions{}) - if err != nil { - t.Fatal(err) - } - return saved - } - big := create(0, "mist-aaaaaaaaaaaaaaaaaaaaaaaa", "8", false, 40*time.Second) - running := create(1, "mist-bbbbbbbbbbbbbbbbbbbbbbbb", "4", true, time.Minute) - small := create(1, "mist-cccccccccccccccccccccccc", "2", false, 0) - if err := a.teams.admit(ctx, teams); err != nil { - t.Fatal(err) - } - still, _ := c.BatchV1().Jobs(small.Namespace).Get(ctx, small.Name, metav1.GetOptions{}) - if still.Spec.Suspend == nil || !*still.Spec.Suspend { - t.Fatal("small requests overtook an aged large request") - } - running.Status.Conditions = []batchv1.JobCondition{{Type: batchv1.JobComplete, Status: corev1.ConditionTrue}} - _, _ = c.BatchV1().Jobs(running.Namespace).UpdateStatus(ctx, running, metav1.UpdateOptions{}) - if err := a.teams.admit(ctx, teams); err != nil { - t.Fatal(err) - } - admitted, _ := c.BatchV1().Jobs(big.Namespace).Get(ctx, big.Name, metav1.GetOptions{}) - if admitted.Spec.Suspend == nil || *admitted.Spec.Suspend { - t.Fatal("large request did not receive drained capacity") - } -} -func TestDepartmentDemotionRevokesAdministratorWritePrivilege(t *testing.T) { - a, _, teams := departmentTestApp(t) - team := teams[0] - e := *a.executor - e.team = &TeamAccess{Team: &team, Member: &Member{ID: "alice", Role: "admin"}} - req, err := e.normalize(CreateJobRequest{Command: []string{"true"}, StorageScope: "common"}) - if err != nil { - t.Fatal(err) - } - job := e.buildJob("mist-dddddddddddddddddddddddd", req) - reason, err := a.teams.revoked(context.Background(), &team, job, map[string]AccountStatus{"alice": {Role: "user"}}) - if err != nil || reason == "" { - t.Fatalf("historical admin flag bypassed current role: %s %v", reason, err) - } -} -func TestMemberProxyAddressCannotBeSpoofed(t *testing.T) { - t.Setenv("MIST_TRUSTED_PROXY_IPS", "10.42.0.1,10.0.0.175") - r := httptest.NewRequest("GET", "/auth/get-session", nil) - r.RemoteAddr = "100.127.1.1:12345" - r.Header.Set("X-Real-IP", "1.2.3.4") - if clientAddress(r) != "100.127.1.1" { - t.Fatal("untrusted caller spoofed rate-limit address") - } - r.RemoteAddr = "10.42.0.1:23456" - if clientAddress(r) != "1.2.3.4" { - t.Fatal("trusted Nginx address not forwarded") - } - r.Header.Set("X-Real-IP", "1.2.3.4,5.6.7.8") - if clientAddress(r) != "10.42.0.1" { - t.Fatal("forwarded chain accepted") - } -} - -// A claim can be owned by its Pod before the Pod is bound. The device inventory -// already subtracts that allocation; admission must not reserve it a second time. -func TestDepartmentPendingPodClaimDoesNotDoubleReserveBoards(t *testing.T) { - a, c, teams := departmentTestApp(t) - ctx := context.Background() - nodes, pods, slices := hardwareFixture() - a.executor.cpuNode, a.executor.ttNode = "cpu-node", "tt-node" - for _, node := range nodes { - node.Status.Allocatable[corev1.ResourceCPU] = resource.MustParse("32") - node.Status.Allocatable[corev1.ResourceMemory] = resource.MustParse("128Gi") - if _, err := c.CoreV1().Nodes().Create(ctx, &node, metav1.CreateOptions{}); err != nil { - t.Fatal(err) - } - } - for i := range pods { - pods[i].Name = fmt.Sprintf("driver-%d", i) - if _, err := c.CoreV1().Pods("drivers").Create(ctx, &pods[i], metav1.CreateOptions{}); err != nil { - t.Fatal(err) - } - } - slices[0].Name = "boards" - slices[0].Spec.Devices = slices[0].Spec.Devices[:2] - if _, err := c.ResourceV1().ResourceSlices().Create(ctx, &slices[0], metav1.CreateOptions{}); err != nil { - t.Fatal(err) - } - team := teams[0] - request := CreateJobRequest{Accelerator: "tenstorrent", DeviceCount: 1, CPU: "2", Memory: "4Gi"} - data, _ := json.Marshal(request) - for _, name := range []string{"pending-allocated", "queued"} { - annotations := map[string]string{requestAnnotation: string(data), "mist.io/queued-at": time.Now().Format(time.RFC3339Nano)} - if name == "pending-allocated" { - annotations["mist.io/admitted-at"] = time.Now().Format(time.RFC3339Nano) - } - _, err := c.BatchV1().Jobs(team.namespace()).Create(ctx, &batchv1.Job{ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{"mist.io/team": team.ID}, Annotations: annotations}, Spec: batchv1.JobSpec{Suspend: ptr(name == "queued")}}, metav1.CreateOptions{}) - if err != nil { - t.Fatal(err) - } - } - _, err := c.CoreV1().Pods(team.namespace()).Create(ctx, &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "unbound", Labels: map[string]string{"batch.kubernetes.io/job-name": "pending-allocated"}}, Status: corev1.PodStatus{Phase: corev1.PodPending}}, metav1.CreateOptions{}) - if err != nil { - t.Fatal(err) - } - claim := resourcev1.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Name: "allocated", OwnerReferences: []metav1.OwnerReference{{Kind: "Pod", Name: "unbound"}}}, Status: resourcev1.ResourceClaimStatus{Allocation: &resourcev1.AllocationResult{Devices: resourcev1.DeviceAllocationResult{Results: []resourcev1.DeviceRequestAllocationResult{{Driver: "tenstorrent.com", Pool: "tt-node", Device: "tt-0"}}}}}} - if _, err = c.ResourceV1().ResourceClaims(team.namespace()).Create(ctx, &claim, metav1.CreateOptions{}); err != nil { - t.Fatal(err) - } - if err = a.teams.admit(ctx, teams); err != nil { - t.Fatal(err) - } - queued, err := c.BatchV1().Jobs(team.namespace()).Get(ctx, "queued", metav1.GetOptions{}) - if err != nil { - t.Fatal(err) - } - if queued.Annotations["mist.io/admitted-at"] == "" { - t.Fatal("free board withheld by double-counting pending Pod claim") - } -} - -func TestDepartmentSplitDatasetAndModelPaths(t *testing.T) { - a, c, teams := departmentTestApp(t) - team := teams[0] - uploaded := departmentRequest(a, "POST", "/datasets?filename=train.csv", "alice", team.ID, "1,2\n") - if uploaded.Code != 201 { - t.Fatal(uploaded.Body.String()) - } - var ds Dataset - json.Unmarshal(uploaded.Body.Bytes(), &ds) - submitted := departmentRequest(a, "POST", "/jobs", "alice", team.ID, fmt.Sprintf(`{"accelerator":"cpu","type":"command","command":["true"],"dataset_id":%q}`, ds.ID)) - if submitted.Code != 201 { - t.Fatal(submitted.Body.String()) - } - var result struct { - ID string `json:"job_id"` - } - json.Unmarshal(submitted.Body.Bytes(), &result) - job, err := c.BatchV1().Jobs(team.namespace()).Get(context.Background(), result.ID, metav1.GetOptions{}) - if err != nil { - t.Fatal(err) - } - claims := map[string]string{} - for _, volume := range job.Spec.Template.Spec.Volumes { - if volume.PersistentVolumeClaim != nil { - claims[volume.Name] = volume.PersistentVolumeClaim.ClaimName - } - } - if claims["input"] != "team-datasets" || claims["checkpoints"] != "team-results" { - t.Fatalf("storage pools not separated: %+v", claims) - } - store, err := a.teams.store(&team) - if err != nil { - t.Fatal(err) - } - output, err := store.outputPath(job) - if err != nil { - t.Fatal(err) - } - if !strings.HasPrefix(output, store.modelRoot+string(os.PathSeparator)) { - t.Fatal("result path falls into datasets") - } - if err = os.WriteFile(filepath.Join(output, "weights.bin"), []byte("WEIGHTS"), 0600); err != nil { - t.Fatal(err) - } - listed := departmentRequest(a, "GET", "/storage/files?scope=alice", "alice", team.ID, "") - if listed.Code != 200 || !strings.Contains(listed.Body.String(), "weights.bin") || !strings.Contains(listed.Body.String(), "train.csv") { - t.Fatalf("virtual scope lost one pool: %s", listed.Body.String()) - } - path := "/storage/files?scope=alice&download=true&path=jobs/" + job.Name + "/outputs/weights.bin" - downloaded := departmentRequest(a, "GET", path, "alice", team.ID, "") - if downloaded.Code != 200 || downloaded.Body.String() != "WEIGHTS" { - t.Fatal("model download failed") - } - escaped := departmentRequest(a, "GET", path+"/../../../../outside", "alice", team.ID, "") - if escaped.Code == 200 { - t.Fatal("virtual model folder escaped its scope") - } -} - -func TestDepartmentFoldersFailClosedForMissingOrUnsafePaths(t *testing.T) { - a, _, teams := departmentTestApp(t) - team := teams[0] - results := filepath.Join(a.executor.storage.root, "teams", team.ID, "results") - if err := os.RemoveAll(results); err != nil { - t.Fatal(err) - } - if _, err := a.teams.store(&team); err == nil { - t.Fatal("missing results directory accepted") - } - if err := os.Symlink(t.TempDir(), results); err != nil { - t.Fatal(err) - } - if _, err := a.teams.store(&team); err == nil { - t.Fatal("symlink results directory accepted") - } - if err := os.Remove(results); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(results, 0750); err != nil { - t.Fatal(err) - } - path := filepath.Join(a.executor.storage.root, "metadata/provision-status", team.ID+".json") - if err := atomicJSON(path, map[string]any{"state": "Ready", "storage_gib": 200, "model_storage_gib": 500}); err != nil { - t.Fatal(err) - } - if _, err := a.teams.store(&team); err == nil { - t.Fatal("old image layout status accepted") - } -} - -func TestDepartmentSharedStorageUsageAndAdvisoryDecrease(t *testing.T) { - a, _, teams := departmentTestApp(t) - team := teams[0] - path := filepath.Join(a.executor.storage.root, "metadata/provision-status", team.ID+".json") - status := teamStorageStatus{State: "Ready", Layout: sharedFolderLayout, DatasetUsedBytes: 123, ModelUsedBytes: 456, UsageObservedUnix: time.Now().Add(-3 * time.Minute).Unix()} - if err := atomicJSON(path, status); err != nil { - t.Fatal(err) - } - response := departmentRequest(a, "GET", "/storage", "alice", team.ID, "") - var info struct { - DatasetUsed int64 `json:"dataset_used_bytes"` - ModelUsed int64 `json:"model_used_bytes"` - Stale bool `json:"usage_stale"` - Enforced bool `json:"storage_limits_enforced"` - Capacity uint64 `json:"capacity_bytes"` - Available uint64 `json:"available_bytes"` - ModelCapacity uint64 `json:"model_capacity_bytes"` - ModelAvailable uint64 `json:"model_available_bytes"` - } - if response.Code != 200 { - t.Fatal(response.Body.String()) - } - if err := json.Unmarshal(response.Body.Bytes(), &info); err != nil { - t.Fatal(err) - } - if info.DatasetUsed != 123 || info.ModelUsed != 456 || !info.Stale || info.Enforced || info.Capacity == 0 || info.Available == 0 { - t.Fatalf("incorrect folder usage: %+v", info) - } - if info.ModelCapacity != info.Capacity || info.ModelAvailable != info.Available { - t.Fatal("compatibility fields must refer to the same shared disk") - } - policy := team.Policy - policy.StorageGiB, policy.ModelStorageGiB = 1, 1 - body, _ := json.Marshal(map[string]any{"policy": policy}) - changed := departmentRequest(a, "PATCH", "/teams/"+team.ID, "admin", "", string(body)) - if changed.Code != 200 { - t.Fatalf("allowance decrease must not require migration: %s", changed.Body) - } - upload := departmentRequest(a, "POST", "/datasets?filename=tiny.csv", "alice", team.ID, "1,2\n") - if upload.Code != 201 { - t.Fatalf("advisory change blocked upload: %s", upload.Body) - } -} - -func TestDepartmentDefaultPoolsAndLegacyPolicy(t *testing.T) { - a, _, _ := departmentTestApp(t) - // Leave room for a default team without allocating any real disk images. - if err := a.teams.mutate(context.Background(), func(teams *[]Team) error { - for i := range *teams { - (*teams)[i].Policy.StorageGiB = 1 - (*teams)[i].Policy.ModelStorageGiB = 1 - } - return nil - }); err != nil { - t.Fatal(err) - } - created := departmentRequest(a, "POST", "/teams", "admin", "", `{"name":"Default pools"}`) - if created.Code != 201 { - t.Fatalf("%d %s", created.Code, created.Body.String()) - } - var team Team - if err := json.Unmarshal(created.Body.Bytes(), &team); err != nil { - t.Fatal(err) - } - if team.Policy.StorageGiB != 200 || team.Policy.ModelStorageGiB != 500 { - t.Fatalf("unexpected defaults: %+v", team.Policy) - } - for _, body := range []string{`{"name":"Invalid model pool","model_storage_gib":0}`, `{"name":"Invalid model pool","model_storage_gib":-1}`} { - rejected := departmentRequest(a, "POST", "/teams", "admin", "", body) - if rejected.Code != 400 { - t.Fatalf("invalid declared pool accepted: %d %s", rejected.Code, rejected.Body.String()) - } - } - legacy := TeamPolicy{StorageGiB: 3} - normalizeStoragePolicy(&legacy) - if legacy.StorageGiB != 3 || legacy.ModelStorageGiB != 3 { - t.Fatal("legacy allocation silently expanded") - } - p := defaultTeamPolicy() - p.ModelStorageGiB = -1 - if err := validateTeam(&Team{Name: "Invalid", Policy: p}); err == nil { - t.Fatal("negative model pool accepted") - } -} - -func TestTeamVolumesUseEthernetFolderExportsAndRejectStaleBindings(t *testing.T) { - a, client, teams := departmentTestApp(t) - t.Setenv("MIST_NFS_SERVER", "192.168.240.2") - t.Setenv("MIST_NFS_ROOT", "/srv/mist-data") - team := teams[0] - ctx := context.Background() - if err := a.teams.provisionNamespace(ctx, &team); err != nil { - t.Fatal(err) - } - for _, pair := range [][2]string{{"team-datasets", "datasets"}, {"team-results", "results"}} { - pv, err := client.CoreV1().PersistentVolumes().Get(ctx, team.namespace()+"-"+pair[0], metav1.GetOptions{}) - if err != nil { - t.Fatal(err) - } - if pv.Spec.NFS.Server != "192.168.240.2" || pv.Spec.NFS.Path != "/srv/mist-data/teams/"+team.ID+"/"+pair[1] { - t.Fatalf("wrong Ethernet export: %+v", pv.Spec.NFS) - } - pv.Spec.NFS.Path = "/obsolete-export" - if _, err = client.CoreV1().PersistentVolumes().Update(ctx, pv, metav1.UpdateOptions{}); err != nil { - t.Fatal(err) - } - err = a.teams.ensureVolume(ctx, team.ID, team.namespace(), pair[0], "teams/"+team.ID+"/"+pair[1], 1, false) - if err == nil { - t.Fatal("stale export binding accepted") - } - } -} diff --git a/web-interface/.cta.json b/web-interface/.cta.json deleted file mode 100644 index 38d1229..0000000 --- a/web-interface/.cta.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "projectName": "web-interface", - "mode": "file-router", - "typescript": true, - "packageManager": "bun", - "includeExamples": false, - "tailwind": true, - "addOnOptions": {}, - "envVarValues": {}, - "git": false, - "routerOnly": true, - "version": 1, - "framework": "react", - "chosenAddOns": ["eslint"] -} diff --git a/web-interface/.gitignore b/web-interface/.gitignore deleted file mode 100644 index 8b25bb5..0000000 --- a/web-interface/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -node_modules -.DS_Store -dist -dist-ssr -*.local -.env -.nitro -.tanstack -.wrangler -.output -.vinxi -__unconfig* -todos.json diff --git a/web-interface/.prettierignore b/web-interface/.prettierignore deleted file mode 100644 index e820c72..0000000 --- a/web-interface/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -package-lock.json -pnpm-lock.yaml -yarn.lock -public/docs -dist -dist-ssr -.tanstack diff --git a/web-interface/.vscode/settings.json b/web-interface/.vscode/settings.json deleted file mode 100644 index 00b5278..0000000 --- a/web-interface/.vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "files.watcherExclude": { - "**/routeTree.gen.ts": true - }, - "search.exclude": { - "**/routeTree.gen.ts": true - }, - "files.readonlyInclude": { - "**/routeTree.gen.ts": true - } -} diff --git a/web-interface/README.md b/web-interface/README.md deleted file mode 100644 index d965fb4..0000000 --- a/web-interface/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Mist web interface - -The authenticated React portal serves real team Jobs, hardware inventory, -dataset uploads, common/member folder browsing, account administration and team -policy/sharing controls. Production: **http://100.73.139.66:8088** through Tailscale. -See the [operating guide](../docs/content/department-rollout.md). - -## Start locally - -Use Node.js **22.16.0 or newer**. The main machine's existing API port-forward -listens on `127.0.0.1:3000`; its Vite development service uses port 3001. -Check those services before starting duplicate listeners: - -```bash -systemctl --user status mist-api-forward mist-web -``` - -With the API/port-forward available and port 3001 free, from this directory: - -```bash -npm ci -npm run dev -- --host 127.0.0.1 --port 3001 --strictPort -``` - -Vite forwards `/api` and `/auth` to the API on port 3000. `MIST_API_PROXY` changes -that target. Authenticate with a real Mist account and select your team; this -preview reaches real jobs/data. See [development](../docs/content/development.md) for -other-host origins and backend work. Production uses a static Nginx release, -not Vite or these per-user services. - -## Responsibilities - -- `src/auth.tsx`, `teams.tsx`: account/team context; server authorization remains - authoritative for every operation. -- `src/api.ts`: typed API models/requests and upload progress. -- `src/components/JobsPage.tsx`, `components/jobs/`: paginated history, focused - submission dialog, actual logs, cancellation and saved files. -- `src/components/DatasetsPage.tsx`, `TeamStorageBrowser.tsx`: uploads and - authorized common/member/shared storage browsing. -- `src/components/TeamsPage.tsx`, `AccountPage.tsx`: team policy/membership/sharing, - member administration and password controls. -- `src/components/Picker.tsx`, `Tabs.tsx`, `Modal.tsx`, `Card.tsx`: shared controls. -- `src/components/HardwarePanel.tsx`, `MachinesPage.tsx`: live node/device inventory. -- `src/hooks/usePolling.ts`: independent polling, cancellation and recovery. -- `src/routes/`: TanStack file routes; `routeTree.gen.ts` is generated. - -Compute choices request whole GPUs or TT boards. One TT board has two chips. -Custom tagged images follow team registry policy and need compatible libraries; -TT may use the tested host profile or an image-provided runtime. Container mode -preserves image startup with blank overrides. CPU/RAM inventory shows allocation, -not live utilization. Inputs are read-only; save results in `/outputs`. - -The old fake account helpers/chart and unused `use-immer` dependency are retired. -Current behavior and components follow [the design system](../docs/content/design-system.md). - -## Verify - -```bash -npm test -npx tsc --noEmit -npm run lint -npm run build -``` - -See [testing](../docs/content/testing.md) for browser-to-cluster checks and their scope. diff --git a/web-interface/eslint.config.js b/web-interface/eslint.config.js deleted file mode 100644 index 7cdf373..0000000 --- a/web-interface/eslint.config.js +++ /dev/null @@ -1,20 +0,0 @@ -// @ts-check - -import { tanstackConfig } from '@tanstack/eslint-config' - -export default [ - ...tanstackConfig, - { - rules: { - 'import/no-cycle': 'off', - 'import/order': 'off', - 'sort-imports': 'off', - '@typescript-eslint/array-type': 'off', - '@typescript-eslint/require-await': 'off', - 'pnpm/json-enforce-catalog': 'off', - }, - }, - { - ignores: ['eslint.config.js', 'prettier.config.js', 'public/**', 'dist/**'], - }, -] diff --git a/web-interface/index.html b/web-interface/index.html deleted file mode 100644 index b0d9689..0000000 --- a/web-interface/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - MIST Web Interface - - -

- - - diff --git a/web-interface/package-lock.json b/web-interface/package-lock.json deleted file mode 100644 index 2176980..0000000 --- a/web-interface/package-lock.json +++ /dev/null @@ -1,4695 +0,0 @@ -{ - "name": "web-interface", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "web-interface", - "dependencies": { - "@tailwindcss/vite": "^4.1.18", - "@tanstack/react-devtools": "latest", - "@tanstack/react-router": "latest", - "@tanstack/react-router-devtools": "latest", - "@tanstack/router-plugin": "^1.132.0", - "better-auth": "1.7.7", - "lucide-react": "^0.545.0", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "tailwindcss": "^4.1.18" - }, - "devDependencies": { - "@tailwindcss/typography": "^0.5.16", - "@tanstack/devtools-vite": "latest", - "@tanstack/eslint-config": "latest", - "@testing-library/dom": "^10.4.1", - "@testing-library/react": "^16.3.0", - "@types/node": "^22.10.2", - "@types/react": "^19.2.0", - "@types/react-dom": "^19.2.0", - "@vitejs/plugin-react": "^5.1.4", - "jsdom": "^28.1.0", - "prettier": "^3.8.1", - "typescript": "^5.7.2", - "vite": "^7.3.7", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^5.0.3" - }, - "engines": { - "node": ">=22.16.0" - } - }, - "node_modules/@acemir/cssom": { - "version": "0.9.31", - "dev": true, - "license": "MIT" - }, - "node_modules/@asamuzakjp/css-color": { - "version": "5.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@csstools/css-calc": "^3.2.0", - "@csstools/css-color-parser": "^4.1.0", - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/dom-selector": { - "version": "6.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/nwsapi": "^2.3.9", - "bidi-js": "^1.0.3", - "css-tree": "^3.1.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.6" - } - }, - "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { - "version": "11.5.3", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@asamuzakjp/generational-cache": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/nwsapi": { - "version": "2.3.9", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@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" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.8", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.9", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.29.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.29.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.8", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@better-auth/core": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/@better-auth/core/-/core-1.7.7.tgz", - "integrity": "sha512-srgFzHEjB2WWlokFz1i4BfG41sNhsA105Pukgqu6RrEh5A+LSkzf1mCHydVipkjt9l5qswtBMi7IL6ouHbZL4Q==", - "license": "MIT", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.41.1", - "@standard-schema/spec": "^1.1.0", - "zod": "^4.5.4" - }, - "peerDependencies": { - "@better-auth/utils": "0.4.2", - "@better-fetch/fetch": "1.3.2", - "@opentelemetry/api": "^1.9.0", - "better-call": "1.4.0", - "jose": "^6.1.0", - "kysely": "^0.28.5 || ^0.29.0", - "nanostores": "^1.0.1" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - } - } - }, - "node_modules/@better-auth/drizzle-adapter": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/@better-auth/drizzle-adapter/-/drizzle-adapter-1.7.7.tgz", - "integrity": "sha512-qon0U94PR5FQysuyGoAlGVQpIIiNg5dtDpwjE63sN/HjoRWZadZzHPcS9mn7JsJyQZK6iTNhd7LD0AaXt2f78w==", - "license": "MIT", - "peerDependencies": { - "@better-auth/core": "^1.7.7", - "@better-auth/utils": "0.4.2", - "drizzle-orm": "^0.45.2 || >=1.0.0-rc.1 <2.0.0" - }, - "peerDependenciesMeta": { - "drizzle-orm": { - "optional": true - } - } - }, - "node_modules/@better-auth/kysely-adapter": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/@better-auth/kysely-adapter/-/kysely-adapter-1.7.7.tgz", - "integrity": "sha512-9FONOCgOcrQI9wJ5v1oDGIg9sT7pa9RjZZQ4fsCTudo8R87SrIGNUvUxDFTJhZvUblvFfGaIBR9Vb8LA+8bqLQ==", - "license": "MIT", - "peerDependencies": { - "@better-auth/core": "^1.7.7", - "@better-auth/utils": "0.4.2", - "kysely": "^0.28.17 || ^0.29.0" - }, - "peerDependenciesMeta": { - "kysely": { - "optional": true - } - } - }, - "node_modules/@better-auth/memory-adapter": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/@better-auth/memory-adapter/-/memory-adapter-1.7.7.tgz", - "integrity": "sha512-FqKFEe+b5tXXV0gRbyirca+qXgMpLOeJ8Wk19yykb/scQKy0WJ4k22WzEV3TTPctQV9DZhwCXPlDtQhnlOv5Gg==", - "license": "MIT", - "peerDependencies": { - "@better-auth/core": "^1.7.7", - "@better-auth/utils": "0.4.2" - } - }, - "node_modules/@better-auth/mongo-adapter": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/@better-auth/mongo-adapter/-/mongo-adapter-1.7.7.tgz", - "integrity": "sha512-ZnVDuRrXqbf0oHphrEN27oTImNH5NTO26dtWatq5cXyYAsH7goof9QIoTOmxTbBxUQahKBw9T6+9h6n+RtOE+g==", - "license": "MIT", - "peerDependencies": { - "@better-auth/core": "^1.7.7", - "@better-auth/utils": "0.4.2", - "mongodb": "^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "mongodb": { - "optional": true - } - } - }, - "node_modules/@better-auth/prisma-adapter": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/@better-auth/prisma-adapter/-/prisma-adapter-1.7.7.tgz", - "integrity": "sha512-4YcnrcVdvWiAZw0sZl63tWUClPXg5r3QsLn7C2sG7kKEBY06zOng0ibecyxRBixKq1zE1ceHuEUqez5Rhi+nQA==", - "license": "MIT", - "peerDependencies": { - "@better-auth/core": "^1.7.7", - "@better-auth/utils": "0.4.2", - "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", - "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "@prisma/client": { - "optional": true - }, - "prisma": { - "optional": true - } - } - }, - "node_modules/@better-auth/telemetry": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/@better-auth/telemetry/-/telemetry-1.7.7.tgz", - "integrity": "sha512-PaRA6i+kAioVYmza2gHPcdrxP0hAotph4KV9hft2GeNJq+AZXDiBu3FuLM9HxvcmiZeUT74Vufqd9ypmB8veTA==", - "license": "MIT", - "peerDependencies": { - "@better-auth/core": "^1.7.7", - "@better-auth/utils": "0.4.2", - "@better-fetch/fetch": "1.3.2" - } - }, - "node_modules/@better-auth/utils": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@better-auth/utils/-/utils-0.4.2.tgz", - "integrity": "sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "^2.0.1" - } - }, - "node_modules/@better-fetch/fetch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@better-fetch/fetch/-/fetch-1.3.2.tgz", - "integrity": "sha512-Gs7n99b5tqUC6cQAPbV0uED3IraHB6xQbHLQ/C3l7ZFafHScOx9pQ+DYmP5blbLFShVWLqxNUlI9wi4xU/X+ow==", - "license": "MIT" - }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, - "node_modules/@cacheable/memory": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@cacheable/utils": "^2.5.0", - "@keyv/bigmap": "^1.3.1", - "hookified": "^1.15.1", - "keyv": "^5.6.0" - } - }, - "node_modules/@cacheable/utils": { - "version": "2.5.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hashery": "^1.5.1", - "keyv": "^5.6.0" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "6.1.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.4.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.1.1", - "@csstools/css-calc": "^3.4.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.14", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peerDependencies": { - "css-tree": "^3.2.1" - }, - "peerDependenciesMeta": { - "css-tree": { - "optional": true - } - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.2", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.7.0", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^1.2.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/js": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "eslint": "^10.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.3", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@exodus/bytes": { - "version": "1.16.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@keyv/bigmap": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hashery": "^1.4.0", - "hookified": "^1.15.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "keyv": "^5.6.0" - } - }, - "node_modules/@keyv/serialize": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@neodrag/core": { - "version": "3.0.0-next.11", - "license": "MIT" - }, - "node_modules/@neodrag/solid": { - "version": "3.0.0-next.11", - "license": "MIT", - "peerDependencies": { - "@neodrag/core": "3.0.0-next.11", - "solid-js": "^1.0.0" - } - }, - "node_modules/@noble/ciphers": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.4.0.tgz", - "integrity": "sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", - "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", - "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.120.0", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.120.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.63.5", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@solid-primitives/event-listener": { - "version": "2.4.6", - "license": "MIT", - "dependencies": { - "@solid-primitives/utils": "^6.4.1" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/keyboard": { - "version": "1.3.7", - "license": "MIT", - "dependencies": { - "@solid-primitives/event-listener": "^2.4.6", - "@solid-primitives/rootless": "^1.5.4", - "@solid-primitives/utils": "^6.4.1" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/resize-observer": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "@solid-primitives/event-listener": "^2.4.6", - "@solid-primitives/rootless": "^1.5.4", - "@solid-primitives/static-store": "^0.1.4", - "@solid-primitives/utils": "^6.4.1" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/rootless": { - "version": "1.5.4", - "license": "MIT", - "dependencies": { - "@solid-primitives/utils": "^6.4.1" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/static-store": { - "version": "0.1.4", - "license": "MIT", - "dependencies": { - "@solid-primitives/utils": "^6.4.1" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/utils": { - "version": "6.4.1", - "license": "MIT", - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT" - }, - "node_modules/@stylistic/eslint-plugin": { - "version": "5.10.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/types": "^8.56.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^9.0.0 || ^10.0.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.3.3", - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.24.1", - "jiti": "^2.7.0", - "lightningcss": "1.32.0", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.3.3" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.3.3", - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.3", - "@tailwindcss/oxide-darwin-arm64": "4.3.3", - "@tailwindcss/oxide-darwin-x64": "4.3.3", - "@tailwindcss/oxide-freebsd-x64": "4.3.3", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", - "@tailwindcss/oxide-linux-x64-musl": "4.3.3", - "@tailwindcss/oxide-wasm32-wasi": "4.3.3", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.3", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.20", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.3.3", - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.3.3", - "@tailwindcss/oxide": "4.3.3", - "tailwindcss": "4.3.3" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7 || ^8" - } - }, - "node_modules/@tanstack/devtools": { - "version": "0.15.0", - "license": "MIT", - "dependencies": { - "@neodrag/core": "3.0.0-next.11", - "@neodrag/solid": "3.0.0-next.11", - "@solid-primitives/event-listener": "^2.4.3", - "@solid-primitives/keyboard": "^1.3.3", - "@solid-primitives/resize-observer": "^2.1.3", - "@tanstack/devtools-client": "0.0.8", - "@tanstack/devtools-event-bus": "0.4.3", - "@tanstack/devtools-ui": "0.7.1", - "clsx": "^2.1.1", - "goober": "^2.1.16", - "solid-js": "^1.9.9" - }, - "bin": { - "intent": "bin/intent.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "solid-js": ">=1.9.7" - } - }, - "node_modules/@tanstack/devtools-bundler-core": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@tanstack/devtools-client": "0.0.8", - "@tanstack/devtools-event-bus": "0.4.3", - "chalk": "^5.6.2", - "launch-editor": "^2.14.1", - "magic-string": "^0.30.0", - "oxc-parser": "^0.120.0", - "picomatch": "^4.0.5" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/devtools-client": { - "version": "0.0.8", - "license": "MIT", - "dependencies": { - "@tanstack/devtools-event-client": "^0.5.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/devtools-event-bus": { - "version": "0.4.3", - "license": "MIT", - "dependencies": { - "ws": "^8.18.3" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/devtools-event-client": { - "version": "0.5.0", - "license": "MIT", - "bin": { - "intent": "bin/intent.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/devtools-ui": { - "version": "0.7.1", - "license": "MIT", - "dependencies": { - "clsx": "^2.1.1", - "dayjs": "^1.11.19", - "goober": "^2.1.16", - "solid-js": "^1.9.9" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "solid-js": ">=1.9.7" - } - }, - "node_modules/@tanstack/devtools-vite": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@tanstack/devtools-vite/-/devtools-vite-0.8.5.tgz", - "integrity": "sha512-xaifCEmiwwzizlbp973oISXNsnmuU/BugLa66gryAZaPJJ/qo1kJd2DxY5X960eHwmyIS3SN0KYrL3/aRhucmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tanstack/devtools-bundler-core": "0.1.3", - "@tanstack/devtools-client": "0.0.8", - "@tanstack/devtools-event-bus": "0.4.3", - "chalk": "^5.6.2" - }, - "bin": { - "intent": "bin/intent.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@tanstack/eslint-config": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@tanstack/eslint-config/-/eslint-config-0.4.0.tgz", - "integrity": "sha512-V+Cd81W/f65dqKJKpytbwTGx9R+IwxKAHsG/uJ3nSLYEh36hlAr54lRpstUhggQB8nf/cP733cIw8DuD2dzQUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint/js": "^10.0.1", - "@stylistic/eslint-plugin": "^5.8.0", - "eslint-plugin-import-x": "^4.16.1", - "eslint-plugin-n": "^17.24.0", - "globals": "^17.3.0", - "typescript-eslint": "^8.55.0", - "vue-eslint-parser": "^10.4.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "eslint": "^9.0.0 || ^10.0.0" - } - }, - "node_modules/@tanstack/history": { - "version": "1.162.4", - "license": "MIT", - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-devtools": { - "version": "0.10.13", - "resolved": "https://registry.npmjs.org/@tanstack/react-devtools/-/react-devtools-0.10.13.tgz", - "integrity": "sha512-r0cdB/14+st2Vxl/1Bodlyq4VC8pf9SykLQDYbGHDc1+V146WQo5B3KlYLkfyxD9Q/6+9NPRQHZyl8fvZVMdRA==", - "license": "MIT", - "dependencies": { - "@tanstack/devtools": "0.15.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "@types/react-dom": ">=16.8", - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/@tanstack/react-router": { - "version": "1.170.41", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.41.tgz", - "integrity": "sha512-Mpvw8Wm5MGDbTqI8Yc9flLKxbOHwoWocv0H2aGKcgw2a017oK5nZWqa954P+DrUx/8fI98YNywnHP5XcD3tQ9w==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.162.4", - "@tanstack/react-store": "^0.11.2", - "@tanstack/router-core": "1.171.34", - "isbot": "^5.1.22" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - } - }, - "node_modules/@tanstack/react-router-devtools": { - "version": "1.167.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.167.2.tgz", - "integrity": "sha512-VuoqB7OhDUrBa4WOFSKiAQ8xI8sJpeZdo9sYE1hQa89iMuVFUQu1iWE4iCiQhB+6TYOZDZ9e+iHKxYjop4ZVYw==", - "license": "MIT", - "dependencies": { - "@tanstack/router-devtools-core": "1.168.2" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/react-router": "^1.170.36", - "@tanstack/router-core": "^1.171.30", - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - }, - "peerDependenciesMeta": { - "@tanstack/router-core": { - "optional": true - } - } - }, - "node_modules/@tanstack/react-router/node_modules/@tanstack/router-core": { - "version": "1.171.34", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.34.tgz", - "integrity": "sha512-X+19pGuuLVPvvAvPYw9v/+ktRk5cCll8AtfpBpOhDRmVgUMrfqze0467xtq8YRVVs/mmo5rVtWn/7Tp32RDBKw==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.162.4", - "cookie-es": "^3.0.0", - "seroval": "^1.6.7", - "seroval-plugins": "^1.6.7" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-store": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.11.2.tgz", - "integrity": "sha512-oj5O5DmiMWE+ih+SioX2ayC1kbK7d3fpLx0B75fPJr9nY3zU+hoW010yr64qXsY/9fyiLVE2bn5mGNV3owm8RQ==", - "license": "MIT", - "dependencies": { - "@tanstack/store": "0.11.2", - "use-sync-external-store": "^1.6.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@tanstack/router-core": { - "version": "1.171.32", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.162.4", - "cookie-es": "^3.0.0", - "seroval": "^1.6.2", - "seroval-plugins": "^1.6.2" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/router-devtools-core": { - "version": "1.168.2", - "license": "MIT", - "dependencies": { - "clsx": "^2.1.1", - "goober": "^2.1.16" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/router-core": "^1.171.30", - "csstype": "^3.0.10" - }, - "peerDependenciesMeta": { - "csstype": { - "optional": true - } - } - }, - "node_modules/@tanstack/router-generator": { - "version": "1.167.38", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8", - "@tanstack/router-core": "1.171.32", - "@tanstack/router-utils": "1.162.3", - "@tanstack/virtual-file-routes": "1.162.0", - "jiti": "^2.7.0", - "magic-string": "^0.30.21", - "prettier": "^3.9.6", - "zod": "^4.5.4" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/router-plugin": { - "version": "1.168.40", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "@tanstack/router-core": "1.171.32", - "@tanstack/router-generator": "1.167.38", - "@tanstack/router-utils": "1.162.3", - "chokidar": "^5.0.0", - "unplugin": "^3.3.0", - "zod": "^4.5.4" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@rsbuild/core": ">=1.0.2 || ^2.0.0", - "@tanstack/react-router": "^1.170.38", - "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", - "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", - "webpack": ">=5.92.0" - }, - "peerDependenciesMeta": { - "@rsbuild/core": { - "optional": true - }, - "@tanstack/react-router": { - "optional": true - }, - "vite": { - "optional": true - }, - "vite-plugin-solid": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/@tanstack/router-utils": { - "version": "1.162.3", - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.29.8", - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "ansis": "^4.3.1", - "babel-dead-code-elimination": "^1.0.12", - "diff": "^8.0.4", - "pathe": "^2.0.3", - "tinyglobby": "^0.2.17" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/store": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.11.2.tgz", - "integrity": "sha512-sJ4mjol8uQsHV0gOJzzjwXfh2Fwm+Sz0+8deqiTm4jGbMdjzNSW+xZCFm0kUa870uhd8yi+DpKnZb5Kc4apa0Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/virtual-file-routes": { - "version": "1.162.0", - "license": "MIT", - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/react": { - "version": "16.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/node": { - "version": "22.20.4", - "devOptional": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/react": { - "version": "19.3.0", - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.3.0", - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.3.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.70.1", - "@typescript-eslint/type-utils": "8.70.1", - "@typescript-eslint/utils": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.70.1", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.70.1", - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/typescript-estree": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.70.1", - "@typescript-eslint/types": "^8.70.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/typescript-estree": "8.70.1", - "@typescript-eslint/utils": "8.70.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.70.1", - "@typescript-eslint/tsconfig-utils": "8.70.1", - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.5", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.70.1", - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/typescript-estree": "8.70.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.70.1", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.12.2", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vitejs/plugin-react": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.29.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-rc.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@vitest/mocker": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.3.tgz", - "integrity": "sha512-T8sWAIbkSyAjkwTcaEc3Iu0o9A27X1/kdXrizhZkGuSKScRQtRzclfAMpOTcGdXCsqxeWlpGy3XjqaW8CpLORg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.31", - "@vitest/spy": "5.0.3", - "estree-walker": "^3.0.3", - "magic-string": "^1.2.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/node_modules/magic-string": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.3.tgz", - "integrity": "sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.6.0" - } - }, - "node_modules/@vitest/spy": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.3.tgz", - "integrity": "sha512-XhFysQTB8AZ+P4gMi+Lpo99vg2AZi0qKpaB9yXQl37+CaMEAPO3iH/wGVnSyL5MPERiLezpqTVtrR6UZH5GCXg==", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.18.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansis": { - "version": "4.4.0", - "license": "ISC", - "engines": { - "node": ">=14" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-dead-code-elimination": { - "version": "1.0.12", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.25", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/better-auth": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/better-auth/-/better-auth-1.7.7.tgz", - "integrity": "sha512-Zhgxi/c5ylmfB/sX+nwnBbsFf/j6k0L8DvL6CJXZSrXgxc5pPMC/e7j812zNd4L4B4ELmdURCPw3X8nAOUdcjw==", - "license": "MIT", - "dependencies": { - "@better-auth/core": "1.7.7", - "@better-auth/drizzle-adapter": "1.7.7", - "@better-auth/kysely-adapter": "1.7.7", - "@better-auth/memory-adapter": "1.7.7", - "@better-auth/mongo-adapter": "1.7.7", - "@better-auth/prisma-adapter": "1.7.7", - "@better-auth/telemetry": "1.7.7", - "@better-auth/utils": "0.4.2", - "@better-fetch/fetch": "1.3.2", - "@noble/ciphers": "^2.2.0", - "@noble/hashes": "^2.2.0", - "better-call": "1.4.0", - "defu": "^6.1.4", - "jose": "^6.2.3", - "kysely": "^0.28.17 || ^0.29.0", - "nanostores": "^1.3.0", - "zod": "^4.5.4" - }, - "peerDependencies": { - "@lynx-js/react": "*", - "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", - "@sveltejs/kit": "^2.0.0", - "@tanstack/react-start": "^1.0.0", - "@tanstack/solid-start": "^1.0.0", - "drizzle-kit": ">=0.31.4 || >=1.0.0-beta.1", - "drizzle-orm": "^0.45.2 || >=1.0.0-rc.1 <2.0.0", - "mongodb": "^6.0.0 || ^7.0.0", - "mysql2": "^3.0.0", - "next": "^14.0.0 || ^15.0.0 || ^16.0.0", - "pg": "^8.0.0", - "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0", - "solid-js": "^1.0.0", - "svelte": "^4.0.0 || ^5.0.0", - "vitest": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", - "vue": "^3.0.0" - }, - "peerDependenciesMeta": { - "@lynx-js/react": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@sveltejs/kit": { - "optional": true - }, - "@tanstack/react-start": { - "optional": true - }, - "@tanstack/solid-start": { - "optional": true - }, - "drizzle-kit": { - "optional": true - }, - "drizzle-orm": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "next": { - "optional": true - }, - "pg": { - "optional": true - }, - "prisma": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "solid-js": { - "optional": true - }, - "svelte": { - "optional": true - }, - "vitest": { - "optional": true - }, - "vue": { - "optional": true - } - } - }, - "node_modules/better-call": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/better-call/-/better-call-1.4.0.tgz", - "integrity": "sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA==", - "license": "MIT", - "dependencies": { - "@better-auth/utils": "^0.5.0", - "@better-fetch/fetch": "^1.3.1", - "rou3": "^0.9.1", - "set-cookie-parser": "^3.1.2" - }, - "peerDependencies": { - "zod": "^4.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/better-call/node_modules/@better-auth/utils": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@better-auth/utils/-/utils-0.5.0.tgz", - "integrity": "sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "^2.0.1" - } - }, - "node_modules/bidi-js": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.12", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/browserslist": { - "version": "4.29.1", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.11.25", - "caniuse-lite": "^1.0.30001810", - "electron-to-chromium": "^1.5.438", - "node-releases": "^2.0.57", - "update-browserslist-db": "^1.3.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/cacheable": { - "version": "2.5.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@cacheable/memory": "^2.2.0", - "@cacheable/utils": "^2.5.0", - "hookified": "^1.15.0", - "keyv": "^5.6.0", - "qified": "^0.10.1" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001812", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chai": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", - "integrity": "sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/comment-parser": { - "version": "1.4.9", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/cookie-es": { - "version": "3.1.1", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-tree": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^5.0.1", - "@csstools/css-syntax-patches-for-csstree": "^1.0.28", - "css-tree": "^3.1.0", - "lru-cache": "^11.2.6" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cssstyle/node_modules/lru-cache": { - "version": "11.5.3", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/dayjs": { - "version": "1.11.23", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/defu": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", - "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "8.0.4", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.438", - "license": "ISC" - }, - "node_modules/enhanced-resolve": { - "version": "5.25.1", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "8.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.28.2", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.2", - "@esbuild/android-arm": "0.28.2", - "@esbuild/android-arm64": "0.28.2", - "@esbuild/android-x64": "0.28.2", - "@esbuild/darwin-arm64": "0.28.2", - "@esbuild/darwin-x64": "0.28.2", - "@esbuild/freebsd-arm64": "0.28.2", - "@esbuild/freebsd-x64": "0.28.2", - "@esbuild/linux-arm": "0.28.2", - "@esbuild/linux-arm64": "0.28.2", - "@esbuild/linux-ia32": "0.28.2", - "@esbuild/linux-loong64": "0.28.2", - "@esbuild/linux-mips64el": "0.28.2", - "@esbuild/linux-ppc64": "0.28.2", - "@esbuild/linux-riscv64": "0.28.2", - "@esbuild/linux-s390x": "0.28.2", - "@esbuild/linux-x64": "0.28.2", - "@esbuild/netbsd-arm64": "0.28.2", - "@esbuild/netbsd-x64": "0.28.2", - "@esbuild/openbsd-arm64": "0.28.2", - "@esbuild/openbsd-x64": "0.28.2", - "@esbuild/openharmony-arm64": "0.28.2", - "@esbuild/sunos-x64": "0.28.2", - "@esbuild/win32-arm64": "0.28.2", - "@esbuild/win32-ia32": "0.28.2", - "@esbuild/win32-x64": "0.28.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "10.11.0", - "dev": true, - "license": "MIT", - "peer": true, - "workspaces": [ - "packages/*" - ], - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.7.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.3", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "11.1.5 || >11.1.6 <12", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-compat-utils": { - "version": "0.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-compat-utils/node_modules/semver": { - "version": "7.8.5", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-import-context": { - "version": "0.1.9", - "dev": true, - "license": "MIT", - "dependencies": { - "get-tsconfig": "^4.10.1", - "stable-hash-x": "^0.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-context" - }, - "peerDependencies": { - "unrs-resolver": "^1.0.0" - }, - "peerDependenciesMeta": { - "unrs-resolver": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-es-x": { - "version": "7.8.0", - "dev": true, - "funding": [ - "https://github.com/sponsors/ota-meshi", - "https://opencollective.com/eslint" - ], - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.11.0", - "eslint-compat-utils": "^0.5.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": ">=8" - } - }, - "node_modules/eslint-plugin-import-x": { - "version": "4.17.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "^8.56.0", - "comment-parser": "^1.4.1", - "debug": "^4.4.1", - "eslint-import-context": "^0.1.9", - "is-glob": "^4.0.3", - "minimatch": "^9.0.3 || ^10.1.2", - "semver": "^7.7.2", - "stable-hash-x": "^0.2.0", - "unrs-resolver": "^1.9.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-import-x" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^8.56.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "eslint-import-resolver-node": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/utils": { - "optional": true - }, - "eslint-import-resolver-node": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-import-x/node_modules/semver": { - "version": "7.8.5", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-n": { - "version": "17.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.5.0", - "enhanced-resolve": "^5.17.1", - "eslint-plugin-es-x": "^7.8.0", - "get-tsconfig": "^4.8.1", - "globals": "^15.11.0", - "globrex": "^0.1.2", - "ignore": "^5.3.2", - "semver": "^7.6.3", - "ts-declaration-location": "^1.0.6" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": ">=8.23.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/globals": { - "version": "15.15.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.8.5", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/espree": { - "version": "11.2.0", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect-type": { - "version": "1.4.0", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fdir": { - "version": "6.5.0", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "11.1.5", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flat-cache": "^6.1.23" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "6.1.23", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cacheable": "^2.5.0", - "flatted": "^3.4.2", - "hookified": "^1.15.0" - } - }, - "node_modules/flatted": { - "version": "3.4.4", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-tsconfig": { - "version": "4.14.3", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "17.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/goober": { - "version": "2.1.19", - "license": "MIT", - "peerDependencies": { - "csstype": "^3.0.10" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/hashery": { - "version": "1.5.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hookified": "^1.15.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/hookified": { - "version": "1.15.1", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.6.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/isbot": { - "version": "5.2.2", - "license": "Unlicense", - "engines": { - "node": ">=18" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/jiti": { - "version": "2.7.0", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jose": { - "version": "6.2.12", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.12.tgz", - "integrity": "sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "28.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@acemir/cssom": "^0.9.31", - "@asamuzakjp/dom-selector": "^6.8.1", - "@bramus/specificity": "^2.4.2", - "@exodus/bytes": "^1.11.0", - "cssstyle": "^6.0.1", - "data-urls": "^7.0.0", - "decimal.js": "^10.6.0", - "html-encoding-sniffer": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "parse5": "^8.0.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.0", - "undici": "^7.21.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^8.0.1", - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json5": { - "version": "2.2.3", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@keyv/serialize": "^1.1.1" - } - }, - "node_modules/kysely": { - "version": "0.29.6", - "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.29.6.tgz", - "integrity": "sha512-hHaB8C/rfzDDtr/t8YZwxAuPJTT0zHyaPoVzcXwDYhYNAgH/4sIfVhi/XLLIY+bL/FqaIJnjATDbi8ObSELmxg==", - "license": "MIT", - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/launch-editor": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.2.tgz", - "integrity": "sha512-NHJEb30MGBCkmZXLZwz25t37QR4aY03ZzPYUJXOJaOa92uWwExI9SBQUuIznBYc1xkD7cJNGX7oc3Nl3sq2kQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.545.0", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/minimatch": { - "version": "10.2.6", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.19", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanostores": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/nanostores/-/nanostores-1.5.5.tgz", - "integrity": "sha512-FixtE239Gl6Gz0ZGCK0WzvNwObNCIwVT+L7zQcf1QgcA6AzBxblzqe9OT88qiucNkhsjSOqiogSaF5jVbJiqSA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "engines": { - "node": "^20.0.0 || >=22.0.0" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.57", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/obug": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", - "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", - "devOptional": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT", - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/oxc-parser": { - "version": "0.120.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "^0.120.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-parser/binding-android-arm-eabi": "0.120.0", - "@oxc-parser/binding-android-arm64": "0.120.0", - "@oxc-parser/binding-darwin-arm64": "0.120.0", - "@oxc-parser/binding-darwin-x64": "0.120.0", - "@oxc-parser/binding-freebsd-x64": "0.120.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.120.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.120.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.120.0", - "@oxc-parser/binding-linux-arm64-musl": "0.120.0", - "@oxc-parser/binding-linux-ppc64-gnu": "0.120.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.120.0", - "@oxc-parser/binding-linux-riscv64-musl": "0.120.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.120.0", - "@oxc-parser/binding-linux-x64-gnu": "0.120.0", - "@oxc-parser/binding-linux-x64-musl": "0.120.0", - "@oxc-parser/binding-openharmony-arm64": "0.120.0", - "@oxc-parser/binding-wasm32-wasi": "0.120.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.120.0", - "@oxc-parser/binding-win32-ia32-msvc": "0.120.0", - "@oxc-parser/binding-win32-x64-msvc": "0.120.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^8.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.7", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.28", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.18", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", - "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.9.9", - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qified": { - "version": "0.10.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hookified": "^2.1.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/qified/node_modules/hookified": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/react": { - "version": "19.3.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.3.0", - "license": "MIT", - "dependencies": { - "scheduler": "^0.28.0" - }, - "peerDependencies": { - "react": "^19.3.0" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/react-refresh": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/rollup": { - "version": "4.63.5", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.63.5", - "@rollup/rollup-android-arm64": "4.63.5", - "@rollup/rollup-darwin-arm64": "4.63.5", - "@rollup/rollup-darwin-x64": "4.63.5", - "@rollup/rollup-freebsd-arm64": "4.63.5", - "@rollup/rollup-freebsd-x64": "4.63.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.63.5", - "@rollup/rollup-linux-arm-musleabihf": "4.63.5", - "@rollup/rollup-linux-arm64-gnu": "4.63.5", - "@rollup/rollup-linux-arm64-musl": "4.63.5", - "@rollup/rollup-linux-loong64-gnu": "4.63.5", - "@rollup/rollup-linux-loong64-musl": "4.63.5", - "@rollup/rollup-linux-ppc64-gnu": "4.63.5", - "@rollup/rollup-linux-ppc64-musl": "4.63.5", - "@rollup/rollup-linux-riscv64-gnu": "4.63.5", - "@rollup/rollup-linux-riscv64-musl": "4.63.5", - "@rollup/rollup-linux-s390x-gnu": "4.63.5", - "@rollup/rollup-linux-x64-gnu": "4.63.5", - "@rollup/rollup-linux-x64-musl": "4.63.5", - "@rollup/rollup-openbsd-x64": "4.63.5", - "@rollup/rollup-openharmony-arm64": "4.63.5", - "@rollup/rollup-win32-arm64-msvc": "4.63.5", - "@rollup/rollup-win32-ia32-msvc": "4.63.5", - "@rollup/rollup-win32-x64-gnu": "4.63.5", - "@rollup/rollup-win32-x64-msvc": "4.63.5", - "fsevents": "~2.3.2" - } - }, - "node_modules/rou3": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.9.2.tgz", - "integrity": "sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==", - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.28.0", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/seroval": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.6.9.tgz", - "integrity": "sha512-UeEzHwAK+yl0YLbsvROV1t5yMYEwZZ0CfKYxDvUgS2fO9Vxdf8djqVIB+OuVpuawRNPqw68LE1Du/GMsW2ZPqA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/seroval-plugins": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.6.9.tgz", - "integrity": "sha512-kiDK/Tb8IWZ61WEU8pA2PDmAuw37gKph9Y77OZlD56mg0Y2g0Bg7gZ1HeHhs5d40w+nRoUq/wj08V26ilbez9g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "seroval": "^1.0" - } - }, - "node_modules/set-cookie-parser": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.3.tgz", - "integrity": "sha512-xletSdAI5efyVJjsatBbzDkXl3M/Zmad3xfnQe7ZXuBB0yNwW7C2WFsNGjdRNfZunmNHQuX79xs/ACMTLCdcew==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.12.0.tgz", - "integrity": "sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/solid-js": { - "version": "1.9.17", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.17.tgz", - "integrity": "sha512-4GAmLOWPfNV8H9Jfn2LSFTpNEG6jiOKPiwd5lnLGQtehHaX6l3TOLzJqQ7mqwB/3k1Yy3zyumFVopmc/tm34ow==", - "license": "MIT", - "dependencies": { - "csstype": "^3.1.0", - "seroval": "~1.6.8", - "seroval-plugins": "~1.6.8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", - "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stable-hash-x": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/std-env": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.3.0.tgz", - "integrity": "sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "4.3.3", - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.3", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tinybench": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.2.1.tgz", - "integrity": "sha512-IAbQaPJIIdhVxi0mqy9lez1wEwje0UQf9F1vwtbelEG5Nbgn0nPOxCvU+mNeNS9gyJTAhrHp74CbUaSynQpZcQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/tinyexec": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", - "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tldts": { - "version": "7.4.15", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.4.15" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.4.15", - "dev": true, - "license": "MIT" - }, - "node_modules/tough-cookie": { - "version": "6.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-declaration-location": { - "version": "1.0.7", - "dev": true, - "funding": [ - { - "type": "ko-fi", - "url": "https://ko-fi.com/rebeccastevens" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" - } - ], - "license": "BSD-3-Clause", - "dependencies": { - "picomatch": "^4.0.2" - }, - "peerDependencies": { - "typescript": ">=4.0.0" - } - }, - "node_modules/tsconfck": { - "version": "3.1.6", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.70.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.70.1", - "@typescript-eslint/parser": "8.70.1", - "@typescript-eslint/typescript-estree": "8.70.1", - "@typescript-eslint/utils": "8.70.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/undici": { - "version": "7.29.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "devOptional": true, - "license": "MIT" - }, - "node_modules/unplugin": { - "version": "3.4.0", - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "picomatch": "^4.0.7", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@farmfe/core": "*", - "@rsbuild/core": "*", - "@rspack/core": "*", - "bun-types-no-globals": "*", - "esbuild": "*", - "rolldown": "*", - "rollup": "*", - "unloader": "*", - "vite": "*", - "webpack": "*" - }, - "peerDependenciesMeta": { - "@farmfe/core": { - "optional": true - }, - "@rsbuild/core": { - "optional": true - }, - "@rspack/core": { - "optional": true - }, - "bun-types-no-globals": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "rolldown": { - "optional": true - }, - "rollup": { - "optional": true - }, - "unloader": { - "optional": true - }, - "vite": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/unrs-resolver": { - "version": "1.12.2", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.4" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.12.2", - "@unrs/resolver-binding-android-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-x64": "1.12.2", - "@unrs/resolver-binding-freebsd-x64": "1.12.2", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", - "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", - "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-musl": "1.12.2", - "@unrs/resolver-binding-openharmony-arm64": "1.12.2", - "@unrs/resolver-binding-wasm32-wasi": "1.12.2", - "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", - "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", - "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.3.3", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.7.0.tgz", - "integrity": "sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.7.tgz", - "integrity": "sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0 || ^0.28.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.3.tgz", - "integrity": "sha512-xMw97S3rjdtj5dkVat7jCsqWBpvchs3RlpQctUqwJD0KkERk40vz2fJ77lDwW/Vzh/pk18eItYAzkodhSes3jQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/mocker": "5.0.3", - "chai": "^6.2.2", - "es-module-lexer": "^2.3.2", - "expect-type": "^1.4.0", - "magic-string": "^1.2.3", - "obug": "^2.1.4", - "picomatch": "^4.0.7", - "std-env": "^4.2.0", - "tinybench": "^6.1.4", - "tinyexec": "^1.3.0", - "tinyglobby": "^0.2.17", - "why-is-node-running": "3.2.1" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^22.12.0 || ^24.0.0 || >=26.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "5.0.3", - "@vitest/browser-preview": "5.0.3", - "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", - "@vitest/coverage-istanbul": "5.0.3", - "@vitest/coverage-v8": "5.0.3", - "@vitest/ui": "5.0.3", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/vitest/node_modules/magic-string": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.3.tgz", - "integrity": "sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.6.0" - } - }, - "node_modules/vue-eslint-parser": { - "version": "10.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "eslint-scope": "^8.2.0 || ^9.0.0", - "eslint-visitor-keys": "^4.2.0 || ^5.0.0", - "espree": "^10.3.0 || ^11.0.0", - "esquery": "^1.6.0", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/semver": { - "version": "7.8.5", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "8.0.1", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "license": "MIT" - }, - "node_modules/whatwg-mimetype": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-url": { - "version": "16.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-3.2.1.tgz", - "integrity": "sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==", - "devOptional": true, - "license": "MIT", - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=20.11" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ws": { - "version": "8.21.3", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/yallist": { - "version": "3.1.1", - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.6.5", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/web-interface/package.json b/web-interface/package.json deleted file mode 100644 index a2e274d..0000000 --- a/web-interface/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "web-interface", - "private": true, - "type": "module", - "engines": { - "node": ">=22.16.0" - }, - "imports": { - "#/*": "./src/*" - }, - "scripts": { - "dev": "vite dev --port 3000", - "build": "vite build", - "build:docs": "hugo -s ../docs", - "preview": "vite preview", - "test": "vitest run", - "lint": "eslint", - "fake-backend": "node ../scripts/fake-backend.mjs", - "configure-fake-backend": "node ../scripts/configure-fake-backend.mjs", - "format": "prettier --check .", - "check": "prettier --write . && eslint --fix" - }, - "dependencies": { - "@tailwindcss/vite": "^4.1.18", - "@tanstack/react-devtools": "latest", - "@tanstack/react-router": "latest", - "@tanstack/react-router-devtools": "latest", - "@tanstack/router-plugin": "^1.132.0", - "better-auth": "1.7.7", - "lucide-react": "^0.545.0", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "tailwindcss": "^4.1.18" - }, - "devDependencies": { - "@tailwindcss/typography": "^0.5.16", - "@tanstack/devtools-vite": "latest", - "@tanstack/eslint-config": "latest", - "@testing-library/dom": "^10.4.1", - "@testing-library/react": "^16.3.0", - "@types/node": "^22.10.2", - "@types/react": "^19.2.0", - "@types/react-dom": "^19.2.0", - "@vitejs/plugin-react": "^5.1.4", - "jsdom": "^28.1.0", - "prettier": "^3.8.1", - "typescript": "^5.7.2", - "vite": "^7.3.7", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^5.0.3" - }, - "pnpm": { - "onlyBuiltDependencies": [ - "esbuild", - "lightningcss" - ] - }, - "overrides": { - "postcss-selector-parser": "^7.1.6" - } -} diff --git a/web-interface/pnpm-lock.yaml b/web-interface/pnpm-lock.yaml deleted file mode 100644 index 0e4a31e..0000000 --- a/web-interface/pnpm-lock.yaml +++ /dev/null @@ -1,4599 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@tailwindcss/vite': - specifier: ^4.1.18 - version: 4.3.3(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)) - '@tanstack/react-devtools': - specifier: latest - version: 0.10.13(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(solid-js@1.9.17) - '@tanstack/react-router': - specifier: latest - version: 1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@tanstack/react-router-devtools': - specifier: latest - version: 1.167.2(@tanstack/react-router@1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@tanstack/router-core@1.171.38)(csstype@3.2.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@tanstack/router-plugin': - specifier: ^1.132.0 - version: 1.168.47(@tanstack/react-router@1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(esbuild@0.28.2)(rollup@4.64.7)(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)) - better-auth: - specifier: 1.7.7 - version: 1.7.7(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(solid-js@1.9.17)(vitest@5.0.5(@types/node@22.20.5)(jsdom@28.1.0(@noble/hashes@2.4.0))(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0))) - lucide-react: - specifier: ^0.545.0 - version: 0.545.0(react@19.3.1) - react: - specifier: ^19.2.0 - version: 19.3.1 - react-dom: - specifier: ^19.2.0 - version: 19.3.1(react@19.3.1) - tailwindcss: - specifier: ^4.1.18 - version: 4.3.3 - devDependencies: - '@tailwindcss/typography': - specifier: ^0.5.16 - version: 0.5.20(tailwindcss@4.3.3) - '@tanstack/devtools-vite': - specifier: latest - version: 0.8.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)) - '@tanstack/eslint-config': - specifier: latest - version: 0.4.0(@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - '@testing-library/dom': - specifier: ^10.4.1 - version: 10.4.2 - '@testing-library/react': - specifier: ^16.3.0 - version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@types/node': - specifier: ^22.10.2 - version: 22.20.5 - '@types/react': - specifier: ^19.2.0 - version: 19.3.0 - '@types/react-dom': - specifier: ^19.2.0 - version: 19.3.0(@types/react@19.3.0) - '@vitejs/plugin-react': - specifier: ^5.1.4 - version: 5.2.0(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)) - jsdom: - specifier: ^28.1.0 - version: 28.1.0(@noble/hashes@2.4.0) - prettier: - specifier: ^3.8.1 - version: 3.9.10 - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vite: - specifier: ^7.3.7 - version: 7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0) - vite-tsconfig-paths: - specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)) - vitest: - specifier: ^5.0.3 - version: 5.0.5(@types/node@22.20.5)(jsdom@28.1.0(@noble/hashes@2.4.0))(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)) - -packages: - - '@acemir/cssom@0.9.32': - resolution: {integrity: sha512-OijrAUu7rrJhSIoHNg6LMPS5e344nwUHA+1EFYYjrh64D+GmytUsfBQjci45TjT+rd5Spsp8B5xsZDT+TgyXXQ==} - - '@asamuzakjp/css-color@5.1.11': - resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/dom-selector@6.8.1': - resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} - - '@asamuzakjp/generational-cache@1.0.1': - resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/nwsapi@2.3.9': - resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.29.7': - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.7': - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.29.8': - resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.29.7': - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-globals@7.29.7': - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.29.7': - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.29.7': - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.29.7': - resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.29.7': - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.29.10': - resolution: {integrity: sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.29.9': - resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-transform-react-jsx-self@7.29.7': - resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.29.7': - resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.29.10': - resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.29.7': - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.29.10': - resolution: {integrity: sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.29.8': - resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} - engines: {node: '>=6.9.0'} - - '@better-auth/core@1.7.7': - resolution: {integrity: sha512-srgFzHEjB2WWlokFz1i4BfG41sNhsA105Pukgqu6RrEh5A+LSkzf1mCHydVipkjt9l5qswtBMi7IL6ouHbZL4Q==} - peerDependencies: - '@better-auth/utils': 0.4.2 - '@better-fetch/fetch': 1.3.2 - '@opentelemetry/api': ^1.9.0 - better-call: 1.4.0 - jose: ^6.1.0 - kysely: ^0.28.5 || ^0.29.0 - nanostores: ^1.0.1 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - - '@better-auth/drizzle-adapter@1.7.7': - resolution: {integrity: sha512-qon0U94PR5FQysuyGoAlGVQpIIiNg5dtDpwjE63sN/HjoRWZadZzHPcS9mn7JsJyQZK6iTNhd7LD0AaXt2f78w==} - peerDependencies: - '@better-auth/core': ^1.7.7 - '@better-auth/utils': 0.4.2 - drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 - peerDependenciesMeta: - drizzle-orm: - optional: true - - '@better-auth/kysely-adapter@1.7.7': - resolution: {integrity: sha512-9FONOCgOcrQI9wJ5v1oDGIg9sT7pa9RjZZQ4fsCTudo8R87SrIGNUvUxDFTJhZvUblvFfGaIBR9Vb8LA+8bqLQ==} - peerDependencies: - '@better-auth/core': ^1.7.7 - '@better-auth/utils': 0.4.2 - kysely: ^0.28.17 || ^0.29.0 - peerDependenciesMeta: - kysely: - optional: true - - '@better-auth/memory-adapter@1.7.7': - resolution: {integrity: sha512-FqKFEe+b5tXXV0gRbyirca+qXgMpLOeJ8Wk19yykb/scQKy0WJ4k22WzEV3TTPctQV9DZhwCXPlDtQhnlOv5Gg==} - peerDependencies: - '@better-auth/core': ^1.7.7 - '@better-auth/utils': 0.4.2 - - '@better-auth/mongo-adapter@1.7.7': - resolution: {integrity: sha512-ZnVDuRrXqbf0oHphrEN27oTImNH5NTO26dtWatq5cXyYAsH7goof9QIoTOmxTbBxUQahKBw9T6+9h6n+RtOE+g==} - peerDependencies: - '@better-auth/core': ^1.7.7 - '@better-auth/utils': 0.4.2 - mongodb: ^6.0.0 || ^7.0.0 - peerDependenciesMeta: - mongodb: - optional: true - - '@better-auth/prisma-adapter@1.7.7': - resolution: {integrity: sha512-4YcnrcVdvWiAZw0sZl63tWUClPXg5r3QsLn7C2sG7kKEBY06zOng0ibecyxRBixKq1zE1ceHuEUqez5Rhi+nQA==} - peerDependencies: - '@better-auth/core': ^1.7.7 - '@better-auth/utils': 0.4.2 - '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 - prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 - peerDependenciesMeta: - '@prisma/client': - optional: true - prisma: - optional: true - - '@better-auth/telemetry@1.7.7': - resolution: {integrity: sha512-PaRA6i+kAioVYmza2gHPcdrxP0hAotph4KV9hft2GeNJq+AZXDiBu3FuLM9HxvcmiZeUT74Vufqd9ypmB8veTA==} - peerDependencies: - '@better-auth/core': ^1.7.7 - '@better-auth/utils': 0.4.2 - '@better-fetch/fetch': 1.3.2 - - '@better-auth/utils@0.4.2': - resolution: {integrity: sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A==} - - '@better-auth/utils@0.5.0': - resolution: {integrity: sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==} - - '@better-fetch/fetch@1.3.2': - resolution: {integrity: sha512-Gs7n99b5tqUC6cQAPbV0uED3IraHB6xQbHLQ/C3l7ZFafHScOx9pQ+DYmP5blbLFShVWLqxNUlI9wi4xU/X+ow==} - - '@bramus/specificity@2.4.3': - resolution: {integrity: sha512-0GEz8qJWokkUVYQYRukmkSHIFNoBH8QTreeHrAFbvz1XFYc3Y+puhMs8PQ5x8GNugiC2l5jvDBXKLbBIByeSBw==} - hasBin: true - - '@cacheable/memory@2.2.0': - resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} - - '@cacheable/utils@2.5.0': - resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} - - '@csstools/color-helpers@6.1.2': - resolution: {integrity: sha512-grhRy3OKmniaAEKXMjua5z/EODX0MSqBGjunw8+j/3HQjOnahs2AGhvEOIYVUWcU6ScApbhLhVrQTX8XqrMrow==} - engines: {node: '>=20.19.0'} - - '@csstools/css-calc@3.4.3': - resolution: {integrity: sha512-iex20d8CHVkyvg6B7UKV7uHnI2Bqo9g+EFfT9E0y+GvTvhZ/DwONJ+9aKb1dlqm0ZiGsL5RXjp0fCoJYnkeDjA==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.2 - '@csstools/css-tokenizer': ^4.0.2 - - '@csstools/css-color-parser@4.2.6': - resolution: {integrity: sha512-iiPQ3iRWwnJkeEn6RIu6SJPr7hYrLz6XZ9s/QZl+2/LI5KQVjpl2fdmDSZKuD4xP6GMmMPgHFFXg6k1Wkz0Trg==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.2 - '@csstools/css-tokenizer': ^4.0.2 - - '@csstools/css-parser-algorithms@4.0.2': - resolution: {integrity: sha512-40cSKyMvK+tq4qz6Awrlye2WGuOKt3FwPgtGg6KTfbHOWNw+Rk1rzbAtZnZ6IBhsY491HLRnDXwoyBAijmmILA==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-tokenizer': ^4.0.2 - - '@csstools/css-syntax-patches-for-csstree@1.1.15': - resolution: {integrity: sha512-J0u7HkVl2nzSlhsiTOp4AmwcUQ3D+mGEEKfBy/7To5/y7F2OHwyLrXfrhR0SMgr4p5Lo+eaMVSeai24zUcBIxA==} - peerDependencies: - css-tree: ^3.2.1 - peerDependenciesMeta: - css-tree: - optional: true - - '@csstools/css-tokenizer@4.0.2': - resolution: {integrity: sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==} - engines: {node: '>=20.19.0'} - - '@emnapi/core@1.10.0': - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - - '@esbuild/aix-ppc64@0.28.2': - resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.28.2': - resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.28.2': - resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.28.2': - resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.28.2': - resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.28.2': - resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.28.2': - resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.28.2': - resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.28.2': - resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.28.2': - resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.28.2': - resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.28.2': - resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.28.2': - resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.28.2': - resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.28.2': - resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.28.2': - resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.28.2': - resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.28.2': - resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.28.2': - resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.28.2': - resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.28.2': - resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.28.2': - resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.28.2': - resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.28.2': - resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.28.2': - resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.28.2': - resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.10.1': - resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/config-helpers@0.7.0': - resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/js@10.0.1': - resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: ^10.0.0 - peerDependenciesMeta: - eslint: - optional: true - - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/plugin-kit@0.7.3': - resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@exodus/bytes@1.16.0': - resolution: {integrity: sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - '@noble/hashes': ^1.8.0 || ^2.0.0 - peerDependenciesMeta: - '@noble/hashes': - optional: true - - '@humanfs/core@0.19.2': - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.8': - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} - engines: {node: '>=18.18.0'} - - '@humanfs/types@0.15.0': - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.6.0': - resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@keyv/bigmap@1.3.1': - resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} - engines: {node: '>= 18'} - peerDependencies: - keyv: ^5.6.0 - - '@keyv/serialize@1.1.1': - resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} - engines: {node: ^22.20 || ^24.12 || >=25} - cpu: [x64] - os: [linux] - - '@napi-rs/wasm-runtime@1.2.5': - resolution: {integrity: sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} - peerDependencies: - '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 - '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 - - '@neodrag/core@3.0.0-next.11': - resolution: {integrity: sha512-3WQWxyrbxiaK9zS5JU2wJsW2gpoQlZBXVghduBh61JpqaeE0T0cte8R0qYK2RuJo3J2TYQYqxO19CpG/C1i5eg==} - - '@neodrag/solid@3.0.0-next.11': - resolution: {integrity: sha512-vCBIn/pimjWMQ6vhTS2/O1XNAwzVtc4eUhdbQ91WykbZWWqQ5NocDXt/1OdYrEkeRzJcpCv8wEz5PnMkgKP81Q==} - peerDependencies: - '@neodrag/core': 3.0.0-next.11 - solid-js: ^1.0.0 - - '@noble/ciphers@2.4.0': - resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==} - engines: {node: '>= 20.19.0'} - - '@noble/hashes@2.4.0': - resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==} - engines: {node: '>= 20.19.0'} - - '@opentelemetry/semantic-conventions@1.43.0': - resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} - engines: {node: '>=14'} - - '@oxc-parser/binding-android-arm-eabi@0.120.0': - resolution: {integrity: sha512-WU3qtINx802wOl8RxAF1v0VvmC2O4D9M8Sv486nLeQ7iPHVmncYZrtBhB4SYyX+XZxj2PNnCcN+PW21jHgiOxg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - - '@oxc-parser/binding-android-arm64@0.120.0': - resolution: {integrity: sha512-SEf80EHdhlbjZEgzeWm0ZA/br4GKMenDW3QB/gtyeTV1gStvvZeFi40ioHDZvds2m4Z9J1bUAUL8yn1/+A6iGg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@oxc-parser/binding-darwin-arm64@0.120.0': - resolution: {integrity: sha512-xVrrbCai8R8CUIBu3CjryutQnEYhZqs1maIqDvtUCFZb8vY33H7uh9mHpL3a0JBIKoBUKjPH8+rzyAeXnS2d6A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@oxc-parser/binding-darwin-x64@0.120.0': - resolution: {integrity: sha512-xyHBbnJ6mydnQUH7MAcafOkkrNzQC6T+LXgDH/3InEq2BWl/g424IMRiJVSpVqGjB+p2bd0h0WRR8iIwzjU7rw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@oxc-parser/binding-freebsd-x64@0.120.0': - resolution: {integrity: sha512-UMnVRllquXUYTeNfFKmxTTEdZ/ix1nLl0ducDzMSREoWYGVIHnOOxoKMWlCOvRr9Wk/HZqo2rh1jeumbPGPV9A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@oxc-parser/binding-linux-arm-gnueabihf@0.120.0': - resolution: {integrity: sha512-tkvn2CQ7QdcsMnpfiX3fd3wA3EFsWKYlcQzq9cFw/xc89Al7W6Y4O0FgLVkVQpo0Tnq/qtE1XfkJOnRRA9S/NA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxc-parser/binding-linux-arm-musleabihf@0.120.0': - resolution: {integrity: sha512-WN5y135Ic42gQDk9grbwY9++fDhqf8knN6fnP+0WALlAUh4odY/BDK1nfTJRSfpJD9P3r1BwU0m3pW2DU89whQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxc-parser/binding-linux-arm64-gnu@0.120.0': - resolution: {integrity: sha512-1GgQBCcXvFMw99EPdMy+4NZ3aYyXsxjf9kbUUg8HuAy3ZBXzOry5KfFEzT9nqmgZI1cuetvApkiJBZLAPo8uaw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@oxc-parser/binding-linux-arm64-musl@0.120.0': - resolution: {integrity: sha512-gmMQ70gsPdDBgpcErvJEoWNBr7bJooSLlvOBVBSGfOzlP5NvJ3bFvnUeZZ9d+dPrqSngtonf7nyzWUTUj/U+lw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@oxc-parser/binding-linux-ppc64-gnu@0.120.0': - resolution: {integrity: sha512-T/kZuU0ajop0xhzVMwH5r3srC9Nqup5HaIo+3uFjIN5uPxa0LvSxC1ZqP4aQGJVW5G0z8/nCkjIfSMS91P/wzw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - - '@oxc-parser/binding-linux-riscv64-gnu@0.120.0': - resolution: {integrity: sha512-vn21KXLAXzaI3N5CZWlBr1iWeXLl9QFIMor7S1hUjUGTeUuWCoE6JZB040/ZNDwf+JXPX8Ao9KbmJq9FMC2iGw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - - '@oxc-parser/binding-linux-riscv64-musl@0.120.0': - resolution: {integrity: sha512-SUbUxlar007LTGmSLGIC5x/WJvwhdX+PwNzFJ9f/nOzZOrCFbOT4ikt7pJIRg1tXVsEfzk5mWpGO1NFiSs4PIw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - - '@oxc-parser/binding-linux-s390x-gnu@0.120.0': - resolution: {integrity: sha512-hYiPJTxyfJY2+lMBFk3p2bo0R9GN+TtpPFlRqVchL1qvLG+pznstramHNvJlw9AjaoRUHwp9IKR7UZQnRPGjgQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - - '@oxc-parser/binding-linux-x64-gnu@0.120.0': - resolution: {integrity: sha512-q+5jSVZkprJCIy3dzJpApat0InJaoxQLsJuD6DkX8hrUS61z2lHQ1Fe9L2+TYbKHXCLWbL0zXe7ovkIdopBGMQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-parser/binding-linux-x64-musl@0.120.0': - resolution: {integrity: sha512-D9QDDZNnH24e7X4ftSa6ar/2hCavETfW3uk0zgcMIrZNy459O5deTbWrjGzZiVrSWigGtlQwzs2McBP0QsfV1w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-parser/binding-openharmony-arm64@0.120.0': - resolution: {integrity: sha512-TBU8ZwOUWAOUWVfmI16CYWbvh4uQb9zHnGBHsw5Cp2JUVG044OIY1CSHODLifqzQIMTXvDvLzcL89GGdUIqNrA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@oxc-parser/binding-wasm32-wasi@0.120.0': - resolution: {integrity: sha512-WG/FOZgDJCpJnuF3ToG/K28rcOmSY7FmFmfBKYb2fmLyhDzPpUldFGV7/Fz4ru0Iz/v4KPmf8xVgO8N3lO4KHA==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-parser/binding-win32-arm64-msvc@0.120.0': - resolution: {integrity: sha512-1T0HKGcsz/BKo77t7+89L8Qvu4f9DoleKWHp3C5sJEcbCjDOLx3m9m722bWZTY+hANlUEs+yjlK+lBFsA+vrVQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@oxc-parser/binding-win32-ia32-msvc@0.120.0': - resolution: {integrity: sha512-L7vfLzbOXsjBXV0rv/6Y3Jd9BRjPeCivINZAqrSyAOZN3moCopDN+Psq9ZrGNZtJzP8946MtlRFZ0Als0wBCOw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - - '@oxc-parser/binding-win32-x64-msvc@0.120.0': - resolution: {integrity: sha512-ys+upfqNtSu58huAhJMBKl3XCkGzyVFBlMlGPzHeFKgpFF/OdgNs1MMf8oaJIbgMH8ZxgGF7qfue39eJohmKIg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@oxc-project/types@0.120.0': - resolution: {integrity: sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==} - - '@rolldown/pluginutils@1.0.0-rc.3': - resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} - - '@rollup/rollup-android-arm-eabi@4.64.7': - resolution: {integrity: sha512-GFF2tHk0NqYVObrK0+/ps/LEXsV/v2q6Lyiy7mZr+Ej24fpQScvqK2ziz9NHeEQYnKWKym38Ml7dZbPtC9tuAw==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.64.7': - resolution: {integrity: sha512-BOymcXJFYYXqluDidj6sLelNjXruC3u1BqVxLn2OPCXH9xaPSOTH+MS4uychsGI1NU7tJoiv9KvqijDHFe+hhQ==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.64.7': - resolution: {integrity: sha512-jgVpGweIbls2H5jfBB70tnX52abMd5pJr3xmtoDILx6JdmGl+Un+tMb9R+MbHPVB46tTBpY8emtn7M71SnQhEQ==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.64.7': - resolution: {integrity: sha512-AVMpt94mrXH7WjyWKmd9nT4RC5yM0AN3Lt6A89xVIsuLDi3dDX6dxMytLbW36FlppY9JsoqUoS3LUUpUrYxiMQ==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.64.7': - resolution: {integrity: sha512-Nje29c/MyajxRNFGU05oyeTDS6SWdMg/wWMSlZSBTBju5BKz2NVc0kFiFSQGzRELNiB+CBk/ZvAVsWsENgjGag==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.64.7': - resolution: {integrity: sha512-xxgN5/kMzCNz/NYJ4t49B0/WS6InNlWv6xvgwUQqNnWM9WJMMwMUGWrAxdNEgYWdHL0sMnuh8I87StGrIMTA+w==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.64.7': - resolution: {integrity: sha512-5U/9gVn/X657I8+NHoHO9Wnfyd0lEXwqbslobRoB9TC8SwYzOitcIr6TLE7531Q/NWs3L4mb+YOGzlf3vHIeYw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.64.7': - resolution: {integrity: sha512-hcDS0a/Y8ggM3dcOfzH7UpSaogCViWTtNDSl0EXpWIj8g8/r86ITqptjil2hayTXS0Umzb+Yt3mjgpQVFVf2+A==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.64.7': - resolution: {integrity: sha512-awbAr4N7Qd/yjZAQBEEPzgcPveYG2Gi5L6gq1/Bp+3SMRjn5F68Wv1zKsntzvvoioBR6yKvhLtWqu11am1TsxA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.64.7': - resolution: {integrity: sha512-Ut7xQJfeLhzu2yN3rHzVvL9ccyPJvN4aCdP1V7hJ5lGxX/eCzgB9SiMk/Md3J+rWWZgvoYsDW4BUFggJr32pBA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loong64-gnu@4.64.7': - resolution: {integrity: sha512-trqoni/vHkuM5oo5iQhoKPh6fjjD7E80pMgCXWgGxU8vSRPUlwvG8GeYvEEcB6eJAxNa99WH9iVHPHelgtKiHA==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-loong64-musl@4.64.7': - resolution: {integrity: sha512-gvlUy0XFIwtUWiQmhc+4GT2Knm3KosinpUVhr7CtTFA78gFDnE5NWwMPzHrJsYpKkh2LlY7yvBIboN1FAV6Xeg==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.64.7': - resolution: {integrity: sha512-8yS/kSXTJ/47Z62JW+C2AJ3vd/8zZw016vFjtNpZwmZlwJumLua4s1i78dkYuSSqQ+0aIMxJcBp/4uIwp2ehjA==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-ppc64-musl@4.64.7': - resolution: {integrity: sha512-mxVSKvvty0hOP1AFo/l4Kpv3i3HK0zx4rYUrirZDToYlWhS3xzmIkq3vUJ7rtrM2cPyXveDyDT6M1FfXZ9hTRA==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.64.7': - resolution: {integrity: sha512-lEse1zra1CagM+uHH2bl28GInDsZZ45NJzHei2OMaXQFzZWKBO1hFo07rS0xB6ayV4WU360UrSmPDSyCMpYsUQ==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.64.7': - resolution: {integrity: sha512-d/cqCoiG9WMZ5VuJZ5Qdlv9g97QyoGwnmvHccvGhKSacTy7xFrAS+jMcJSBdMNOw1oacSkl6p7K6O/DRYTKL3g==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.64.7': - resolution: {integrity: sha512-kVEA//CeDOZZP1XCH2JBgqXb9+ALlwuA/4civaazMVdgzaSQC9WM38w65zG/LLk0lA7F9Od19CSBZW7J9mCbNg==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.64.7': - resolution: {integrity: sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.64.7': - resolution: {integrity: sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-openbsd-x64@4.64.7': - resolution: {integrity: sha512-Dm9CZ2SM3u2NgvBj4awW/gGqkOwzH8f6MSYIJE6+bKcKLI+T0+LhpD6vtetTfrIIx+rLXDf5RJqBP6v7V5O+wg==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.64.7': - resolution: {integrity: sha512-oaxsvS2mL6+78741CT2HCORBvy1USg3Wqpt5qvZwy3aMXRMl4zxyDo8maeFRWJkF3dp0Wbi71fKH5Gr9YI3vYA==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.64.7': - resolution: {integrity: sha512-UKZz1Y4mxUqkWh60uH7B1aZn6UcAimPk4ipRktpb3wfZq7JrzZYyAXTwiafkb3T+kd5P3Sf+vzcRdsDks4WtjQ==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.64.7': - resolution: {integrity: sha512-WWkSuC1J+mZJnsDh0mRaCAFSWfQdl6y3fDjZeWElI6zHo8CcOSG5lY3yurKJjEq+FrX0WD60sFrVVpbHqzMmrw==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.64.7': - resolution: {integrity: sha512-u9bp2yXCI3/BUjUxY6uWknAY32pfvvDCPysyUTySotx0dj3ydlFHrRQYfn/b/kZgnfjyEwySMtI7Ga054uiysQ==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.64.7': - resolution: {integrity: sha512-EhX6N3XPMEnVU5cRfNgzPOKcSucsbu3nNNWuoAaEuKIqmddBKHN5b9d4rPe65T1I+FaOT176JKiZNsUBp3rqbA==} - cpu: [x64] - os: [win32] - - '@solid-primitives/event-listener@2.4.6': - resolution: {integrity: sha512-5I0YJcTVYIWoMmgBSROBZGcz+ymhew/pGTg2dHW74BUjFKsV8Li4bOZYl0YAGP4mHw5o4UBd9/BEesqBci3wxw==} - peerDependencies: - solid-js: ^1.6.12 - - '@solid-primitives/keyboard@1.3.7': - resolution: {integrity: sha512-558RPNYnXx4nGh537DSqAn4xMrC8iFipl/5+xzgzWoTNFst4RnUN3BOLmtDjJ0UGGoQXVMALYR3bNOHM0xnt1Q==} - peerDependencies: - solid-js: ^1.6.12 - - '@solid-primitives/resize-observer@2.2.0': - resolution: {integrity: sha512-9Fuu/EWBeGj+atGHRJp70HKhdfalmpjwxY8a32NZixdLNmfCJ45AfhLQNr6uOzETbbiMx4iCKlTrJ8KZCHC2Ww==} - peerDependencies: - solid-js: ^1.6.12 - - '@solid-primitives/rootless@1.5.4': - resolution: {integrity: sha512-TOIZa1VUfVJ+9nkCcRajw3U4t9vBOP1HxX1WHNTbXq32mXwlqTvUnC4CRIilohcryBkT9u2ZkhUDSHRTaGp55g==} - peerDependencies: - solid-js: ^1.6.12 - - '@solid-primitives/static-store@0.1.4': - resolution: {integrity: sha512-LgtVaVBtB7EbmS4+M0b8xY5Iq6pUWXBsIC4VgtrFKDGDdyCaDt88sHk0fUlx1Enxm/XZnZyLXJABRoa39RjJqA==} - peerDependencies: - solid-js: ^1.6.12 - - '@solid-primitives/utils@6.4.1': - resolution: {integrity: sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==} - peerDependencies: - solid-js: ^1.6.12 - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@stylistic/eslint-plugin@5.10.0': - resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^9.0.0 || ^10.0.0 - - '@tailwindcss/node@4.3.3': - resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} - - '@tailwindcss/oxide-android-arm64@4.3.3': - resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.3.3': - resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.3.3': - resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.3.3': - resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': - resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} - engines: {node: '>= 20'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': - resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-musl@4.3.3': - resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-gnu@4.3.3': - resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-musl@4.3.3': - resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-wasm32-wasi@4.3.3': - resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': - resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.3.3': - resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.3.3': - resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} - engines: {node: '>= 20'} - - '@tailwindcss/typography@0.5.20': - resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==} - peerDependencies: - tailwindcss: '>=3.0.0 || >=4.0.0 || insiders' - - '@tailwindcss/vite@4.3.3': - resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 || ^8 - - '@tanstack/devtools-bundler-core@0.1.3': - resolution: {integrity: sha512-F0tlxIyfFqXkZ1mJP1EjtkiSeJA+ztXY2AYOHf7r4goCIEAOp86N9PFJ/yv8vu1TnmxGS6vKsZCS3Kyls9xQQA==} - engines: {node: '>=18'} - - '@tanstack/devtools-client@0.0.8': - resolution: {integrity: sha512-cG3iZkGWCwN330bLBKa8+9r4Of2AXNoz2zUqcsy/4XsD3105ghVBx78cGyvJj9fSclNomPxoqAnDGXXhg1WLvA==} - engines: {node: '>=18'} - - '@tanstack/devtools-event-bus@0.4.3': - resolution: {integrity: sha512-NeegBt5/n2E5q4DbrXHqECBq42+kDi6JBOp8/+RNqkIE+P4hJpbM36kGyjnGQFMWOoku31qhMyX9/48VuTTdmg==} - engines: {node: '>=18'} - - '@tanstack/devtools-event-client@0.5.0': - resolution: {integrity: sha512-H+OH3zC6Vhu/K0NaVfQKknEKawc/+2PT+D3SB3Ox0V8SiMlTo0abbmH2rH0721R2aNYbjdMXA1oENOd8E2UVoA==} - engines: {node: '>=18'} - hasBin: true - - '@tanstack/devtools-ui@0.7.1': - resolution: {integrity: sha512-3xQ/ezZ2qVNszhjpCN2N3jn7uHc2J1PMgcyjHzH4XZBt9xAQyMMcPNoR2cd7rzReyxWoJpZUWiDBmOJiCtLj9A==} - engines: {node: '>=18'} - peerDependencies: - solid-js: '>=1.9.7' - - '@tanstack/devtools-vite@0.8.5': - resolution: {integrity: sha512-xaifCEmiwwzizlbp973oISXNsnmuU/BugLa66gryAZaPJJ/qo1kJd2DxY5X960eHwmyIS3SN0KYrL3/aRhucmA==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@tanstack/devtools@0.15.0': - resolution: {integrity: sha512-KyS7Qi82Eq9yG8C+uae3ikAPb+D5rfzVhvOOjXVAHZ/64s6TWJlDWpREw1FrHIYZaI7paErpsExSSKlF5BKA/A==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - solid-js: '>=1.9.7' - - '@tanstack/eslint-config@0.4.0': - resolution: {integrity: sha512-V+Cd81W/f65dqKJKpytbwTGx9R+IwxKAHsG/uJ3nSLYEh36hlAr54lRpstUhggQB8nf/cP733cIw8DuD2dzQUg==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^9.0.0 || ^10.0.0 - - '@tanstack/history@1.162.5': - resolution: {integrity: sha512-w1+YvwmTkwt5n8yUqEH3IWZ9DsmorCZW/EQ3KYHnqEgIkOZpH54NvW6/Epq3Dzb8H0ifIeYX8PExvrNLIH5FIA==} - engines: {node: '>=20.19'} - - '@tanstack/react-devtools@0.10.13': - resolution: {integrity: sha512-r0cdB/14+st2Vxl/1Bodlyq4VC8pf9SykLQDYbGHDc1+V146WQo5B3KlYLkfyxD9Q/6+9NPRQHZyl8fvZVMdRA==} - engines: {node: '>=18'} - peerDependencies: - '@types/react': '>=16.8' - '@types/react-dom': '>=16.8' - react: '>=16.8' - react-dom: '>=16.8' - - '@tanstack/react-router-devtools@1.167.2': - resolution: {integrity: sha512-VuoqB7OhDUrBa4WOFSKiAQ8xI8sJpeZdo9sYE1hQa89iMuVFUQu1iWE4iCiQhB+6TYOZDZ9e+iHKxYjop4ZVYw==} - engines: {node: '>=20.19'} - peerDependencies: - '@tanstack/react-router': ^1.170.36 - '@tanstack/router-core': ^1.171.30 - react: '>=18.0.0 || >=19.0.0' - react-dom: '>=18.0.0 || >=19.0.0' - peerDependenciesMeta: - '@tanstack/router-core': - optional: true - - '@tanstack/react-router@1.170.45': - resolution: {integrity: sha512-6tuiIAFb82zsk/YxveJRyGjbsm6kIfgUuoH7qCp2R2aSHveW6W0t/6j+Sn4m1iIlA2lLU4cvooqks08/YMOThw==} - engines: {node: '>=20.19'} - peerDependencies: - react: '>=18.0.0 || >=19.0.0' - react-dom: '>=18.0.0 || >=19.0.0' - - '@tanstack/react-store@0.11.2': - resolution: {integrity: sha512-oj5O5DmiMWE+ih+SioX2ayC1kbK7d3fpLx0B75fPJr9nY3zU+hoW010yr64qXsY/9fyiLVE2bn5mGNV3owm8RQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - '@tanstack/router-core@1.171.38': - resolution: {integrity: sha512-XRZVxiO6BIexICmEo3XfPmpoyyLhbjgaMJsONz4gIf5oYys0UiaG1BJGRyj9x8QZPDZcBhvAMuTYN70wSxV0gA==} - engines: {node: '>=20.19'} - - '@tanstack/router-devtools-core@1.168.2': - resolution: {integrity: sha512-pCCdQ5M/NUeWdiAbPmjyfcNdls6G4vaVlIQbPf1IqZk1FLYFr00aQvi578yUuWFBNM2KNS2QcwM1uPucbtGf5Q==} - engines: {node: '>=20.19'} - peerDependencies: - '@tanstack/router-core': ^1.171.30 - csstype: ^3.0.10 - peerDependenciesMeta: - csstype: - optional: true - - '@tanstack/router-generator@1.167.45': - resolution: {integrity: sha512-oCtNqtsMNcBJkPIOu1O7a68jnxt4TkVJj3jHrW3VgiZdBeaj/lBJQh50yvzmNRswRcyIkRg0g30g25bbLRrAGw==} - engines: {node: '>=20.19'} - - '@tanstack/router-plugin@1.168.47': - resolution: {integrity: sha512-1qvMto2Id0Uulux4qd+WttCbOFloIEQ5x82m68T4knt6NmUDQC66P/u/5yzN0FWGSO0u2U2nbDSIQoR6g7HNmQ==} - engines: {node: '>=20.19'} - peerDependencies: - '@rsbuild/core': '>=1.0.2 || ^2.0.0' - '@tanstack/react-router': ^1.170.45 - vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' - vite-plugin-solid: ^2.11.10 || ^3.0.0-0 - webpack: '>=5.92.0' - peerDependenciesMeta: - '@rsbuild/core': - optional: true - '@tanstack/react-router': - optional: true - vite: - optional: true - vite-plugin-solid: - optional: true - webpack: - optional: true - - '@tanstack/router-utils@1.162.4': - resolution: {integrity: sha512-3TSH3rwAQTqQOtTBF8IXMFXmGNJWnjwIm+l87uguyC/of0pSRKcU9GJrozaf0fY9it8dLQvUZJA2MOlfqbW1sA==} - engines: {node: '>=20.19'} - - '@tanstack/store@0.11.2': - resolution: {integrity: sha512-sJ4mjol8uQsHV0gOJzzjwXfh2Fwm+Sz0+8deqiTm4jGbMdjzNSW+xZCFm0kUa870uhd8yi+DpKnZb5Kc4apa0Q==} - - '@tanstack/virtual-file-routes@1.162.0': - resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} - engines: {node: '>=20.19'} - - '@testing-library/dom@10.4.2': - resolution: {integrity: sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==} - engines: {node: '>=18'} - - '@testing-library/react@16.3.3': - resolution: {integrity: sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==} - engines: {node: '>=18'} - peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.0.0 || ^19.0.0 - '@types/react-dom': ^18.0.0 || ^19.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@tybys/wasm-util@0.10.4': - resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/node@22.20.5': - resolution: {integrity: sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==} - - '@types/react-dom@19.3.0': - resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} - peerDependencies: - '@types/react': ^19.3.0 - - '@types/react@19.3.0': - resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} - - '@typescript-eslint/eslint-plugin@8.71.2': - resolution: {integrity: sha512-K72/pvT7qpm8q3k8G5u93NCSN1RcLxX5h7Gw0bQpbMXviBHeY6Nx1WEwmk9wP+eKTSQ8ecxvcgt/ZX/rB938xQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.71.2 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/parser@8.71.2': - resolution: {integrity: sha512-aTtmZjp/x3gsGHkDs04/1I8kNogBJkpQaeGaN0PfiG43NzDEmW2n+OP5im9wfsvyX0yP1UZWBrAGtDBfH9jEVw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.71.2': - resolution: {integrity: sha512-Pd68GsLVh5ZXlcEccFPdhSOvtHZ/2WU0XsA8zmXOS3F158lVlcTLhfQ6qvtL1RzbMie0Kp8xtbVwAg4nejKPHw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/scope-manager@8.71.2': - resolution: {integrity: sha512-YF4wgg5iUX5Obywoac27B56FhozMNFhdJSbh11H5GBAwmBtfyRhmgTQqW9tRNNmHDvsZ2CX6UGzoz+YfYn2Leg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.71.2': - resolution: {integrity: sha512-jz49TAWokm/7yWD9/o837nYax9DyALxIPOImdImvVzo6canBCZYzin8zJyqNR5k1j9K1DE0bVvr0XYB+99uAdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.71.2': - resolution: {integrity: sha512-cC8UaalCViJkb3rH/xLIvidEwoFRtMZMUqDjjJMGEKaTFwYRHYBcoczlEGHuvkHEO8svRDrgZ0yQgOArFmwang==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/types@8.71.2': - resolution: {integrity: sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.71.2': - resolution: {integrity: sha512-DgNOEsl4pdYzwSL+N/Cl33tX1Hlw3FvId73LnKXfq7jnrF2viOEn7X+P7RBkkSWCVm92gnWd28GIC5vJuLREeA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@8.71.2': - resolution: {integrity: sha512-RyKa1G1M9rKHDhrk+HJtiF1MvLD5Ux2JW3TSkzw+02pRALdpJb+QzG1Y5em+LvCgzGwgg8H7mBRFKljNz7ImPw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/visitor-keys@8.71.2': - resolution: {integrity: sha512-zozlN0UA32bSG2zkKAgQyRYSbEISVoyU6vvkKYo2aSny74D8Jh4e+POkJ6Lk0dlezZi5x7TtD+88Xb06IB8nhg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@unrs/resolver-binding-android-arm-eabi@1.12.2': - resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} - cpu: [arm] - os: [android] - - '@unrs/resolver-binding-android-arm64@1.12.2': - resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} - cpu: [arm64] - os: [android] - - '@unrs/resolver-binding-darwin-arm64@1.12.2': - resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} - cpu: [arm64] - os: [darwin] - - '@unrs/resolver-binding-darwin-x64@1.12.2': - resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} - cpu: [x64] - os: [darwin] - - '@unrs/resolver-binding-freebsd-x64@1.12.2': - resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': - resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': - resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': - resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-musl@1.12.2': - resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': - resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} - cpu: [loong64] - os: [linux] - - '@unrs/resolver-binding-linux-loong64-musl@1.12.2': - resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} - cpu: [loong64] - os: [linux] - - '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': - resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} - cpu: [ppc64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': - resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': - resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': - resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} - cpu: [s390x] - os: [linux] - - '@unrs/resolver-binding-linux-x64-gnu@1.12.2': - resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-linux-x64-musl@1.12.2': - resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-openharmony-arm64@1.12.2': - resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} - cpu: [arm64] - os: [openharmony] - - '@unrs/resolver-binding-wasm32-wasi@1.12.2': - resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': - resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} - cpu: [arm64] - os: [win32] - - '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': - resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.12.2': - resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} - cpu: [x64] - os: [win32] - - '@vitejs/plugin-react@5.2.0': - resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==} - engines: {node: ^20.19.0 || >=22.12.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@vitest/mocker@5.0.5': - resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} - peerDependencies: - msw: ^2.4.9 || ^3.0.0 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/spy@5.0.5': - resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.19.0: - resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansis@4.4.0: - resolution: {integrity: sha512-9k3v7xcHwgdO/DruxGIg4HtjvlAZlcnsX/mzqUb1t3NkYnl9kK2UJ+Gq0io+vQf7iT//BD/HB/NBkUR1LWxoeA==} - engines: {node: '>=14'} - - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - babel-dead-code-elimination@1.0.12: - resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} - - balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} - - baseline-browser-mapping@2.11.29: - resolution: {integrity: sha512-YeesxhUmR4h5y5V8KF8iBCqJb8YFrBJ++XBTeGcWIaQOYXGN19JM0FoiOjAhwuDoln8owMgXcWBmgHtYSkky2w==} - engines: {node: '>=6.0.0'} - hasBin: true - - better-auth@1.7.7: - resolution: {integrity: sha512-Zhgxi/c5ylmfB/sX+nwnBbsFf/j6k0L8DvL6CJXZSrXgxc5pPMC/e7j812zNd4L4B4ELmdURCPw3X8nAOUdcjw==} - peerDependencies: - '@lynx-js/react': '*' - '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 - '@sveltejs/kit': ^2.0.0 - '@tanstack/react-start': ^1.0.0 - '@tanstack/solid-start': ^1.0.0 - drizzle-kit: '>=0.31.4 || >=1.0.0-beta.1' - drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 - mongodb: ^6.0.0 || ^7.0.0 - mysql2: ^3.0.0 - next: ^14.0.0 || ^15.0.0 || ^16.0.0 - pg: ^8.0.0 - prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - solid-js: ^1.0.0 - svelte: ^4.0.0 || ^5.0.0 - vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - vue: ^3.0.0 - peerDependenciesMeta: - '@lynx-js/react': - optional: true - '@prisma/client': - optional: true - '@sveltejs/kit': - optional: true - '@tanstack/react-start': - optional: true - '@tanstack/solid-start': - optional: true - drizzle-kit: - optional: true - drizzle-orm: - optional: true - mongodb: - optional: true - mysql2: - optional: true - next: - optional: true - pg: - optional: true - prisma: - optional: true - react: - optional: true - react-dom: - optional: true - solid-js: - optional: true - svelte: - optional: true - vitest: - optional: true - vue: - optional: true - - better-call@1.4.0: - resolution: {integrity: sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA==} - peerDependencies: - zod: ^4.0.0 - peerDependenciesMeta: - zod: - optional: true - - bidi-js@1.1.0: - resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==} - - brace-expansion@5.0.12: - resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} - engines: {node: 20 || >=22} - - browserslist@4.29.3: - resolution: {integrity: sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - cacheable@2.5.0: - resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} - - caniuse-lite@1.0.30001816: - resolution: {integrity: sha512-+8Yx7BXCoqk6IF8yTicjfUR6D/ldJzdlsodlEOiOSPmhK844WIgk67/zIQaGAOxNkZyyvBlrRFnLvqKIoqbAFw==} - - chai@6.3.0: - resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} - engines: {node: '>=18'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chokidar@5.0.0: - resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} - engines: {node: '>= 20.19.0'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - comment-parser@1.4.9: - resolution: {integrity: sha512-+2AvZKjJaNq9GQljm3tr0utwrig5BL+jgJGvz5rDpGKNIp+ojcRXWUwBbh/sGIi1QCprR6PsKFakub+w1v+4hQ==} - engines: {node: '>= 12.0.0'} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-es@3.1.1: - resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - css-tree@3.2.1: - resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - cssstyle@6.2.0: - resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==} - engines: {node: '>=20'} - - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - - data-urls@7.0.0: - resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - dayjs@1.11.23: - resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - defu@6.1.7: - resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - diff@9.0.0: - resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} - engines: {node: '>=0.3.1'} - - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - electron-to-chromium@1.5.458: - resolution: {integrity: sha512-/hIH2gRSmxrf4/X4Nw/t/Wc8PVS22l8/3HnWjWTWsTOM5dsnMUPZF/+u+yr3LqweNuTBJE1rq6qAQzKkZVwMfA==} - - enhanced-resolve@5.26.0: - resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==} - engines: {node: '>=10.13.0'} - - entities@8.1.0: - resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} - engines: {node: '>=20.19.0'} - - es-module-lexer@2.3.2: - resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} - - esbuild@0.28.2: - resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-import-context@0.1.9: - resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - unrs-resolver: ^1.0.0 - peerDependenciesMeta: - unrs-resolver: - optional: true - - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-import-x@4.17.1: - resolution: {integrity: sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/utils': ^8.56.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - eslint-import-resolver-node: '*' - peerDependenciesMeta: - '@typescript-eslint/utils': - optional: true - eslint-import-resolver-node: - optional: true - - eslint-plugin-n@17.24.0: - resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - - eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint@10.13.0: - resolution: {integrity: sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - expect-type@1.4.0: - resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} - engines: {node: '>=12.0.0'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - file-entry-cache@11.1.5: - resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@6.1.23: - resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} - - flatted@3.4.4: - resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-tsconfig@4.14.3: - resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - - globals@17.13.0: - resolution: {integrity: sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==} - engines: {node: '>=18'} - - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - - goober@2.1.19: - resolution: {integrity: sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==} - peerDependencies: - csstype: ^3.0.10 - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - hashery@1.5.1: - resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} - engines: {node: '>=20'} - - hookified@1.15.1: - resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} - - hookified@2.2.0: - resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} - - html-encoding-sniffer@6.0.0: - resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.12: - resolution: {integrity: sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==} - engines: {node: '>= 4'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - - isbot@5.2.2: - resolution: {integrity: sha512-iQcBXcd+Rv/pkubRyGh2utW2j1oPG5hZY6TUhVPpqK4G+o3IbxpJNx04hgksjc/N7GK5pEorUxDeg31cFgEk/w==} - engines: {node: '>=18'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - jiti@2.7.0: - resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} - hasBin: true - - jose@6.2.12: - resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - jsdom@28.1.0: - resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - keyv@5.6.0: - resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - - kysely@0.29.6: - resolution: {integrity: sha512-hHaB8C/rfzDDtr/t8YZwxAuPJTT0zHyaPoVzcXwDYhYNAgH/4sIfVhi/XLLIY+bL/FqaIJnjATDbi8ObSELmxg==} - engines: {node: '>=22.0.0'} - - launch-editor@2.14.2: - resolution: {integrity: sha512-NHJEb30MGBCkmZXLZwz25t37QR4aY03ZzPYUJXOJaOa92uWwExI9SBQUuIznBYc1xkD7cJNGX7oc3Nl3sq2kQQ==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lru-cache@11.5.3: - resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} - engines: {node: 20 || >=22} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lucide-react@0.545.0: - resolution: {integrity: sha512-7r1/yUuflQDSt4f1bpn5ZAocyIxcTyVyBBChSVtBKn5M+392cPmI5YJMWOJKk/HUWGm5wg83chlAZtCcGbEZtw==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - - magic-string@1.4.3: - resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} - - mdn-data@2.27.1: - resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - - minimatch@10.2.6: - resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} - engines: {node: 18 || 20 || >=22} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.20: - resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - nanostores@1.5.5: - resolution: {integrity: sha512-FixtE239Gl6Gz0ZGCK0WzvNwObNCIwVT+L7zQcf1QgcA6AzBxblzqe9OT88qiucNkhsjSOqiogSaF5jVbJiqSA==} - engines: {node: ^20.0.0 || >=22.0.0} - - napi-postinstall@0.3.4: - resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - node-releases@2.0.59: - resolution: {integrity: sha512-5qr2okC4ItAI0hG5SaV0HoYMpnM/Y6+Oqr7AmPYy/2uEoGvS+GbSKLeRxSS1uAdu59yz0ouzcuXievSgg///WA==} - engines: {node: '>=18'} - - obug@3.0.0: - resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} - engines: {node: '>=12.20.0'} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - oxc-parser@0.120.0: - resolution: {integrity: sha512-WyPWZlcIm+Fkte63FGfgFB8mAAk33aH9h5N9lphXVOHSXEBFFsmYdOBedVKly363aWABjZdaj/m9lBfEY4wt+w==} - engines: {node: ^20.19.0 || >=22.12.0} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - parse5@8.0.1: - resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@4.0.7: - resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} - engines: {node: '>=12'} - - postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - - postcss@8.5.30: - resolution: {integrity: sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier@3.9.10: - resolution: {integrity: sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==} - engines: {node: '>=14'} - hasBin: true - - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qified@0.10.1: - resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} - engines: {node: '>=20'} - - react-dom@19.3.1: - resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} - peerDependencies: - react: ^19.3.1 - - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - - react-refresh@0.18.0: - resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} - engines: {node: '>=0.10.0'} - - react@19.3.1: - resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} - engines: {node: '>=0.10.0'} - - readdirp@5.1.1: - resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} - engines: {node: '>= 20.19.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - rollup@4.64.7: - resolution: {integrity: sha512-aCiJONoZp0lNGJ6sYqspLkh6UXaWEey/7Ko2TZyXQ4kgzAhDUxAgbt/oulXKmD+zFHXw1k+RF6ZZWOrjp7DZnQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rou3@0.9.2: - resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==} - - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - scheduler@0.28.0: - resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} - hasBin: true - - seroval-plugins@1.6.9: - resolution: {integrity: sha512-kiDK/Tb8IWZ61WEU8pA2PDmAuw37gKph9Y77OZlD56mg0Y2g0Bg7gZ1HeHhs5d40w+nRoUq/wj08V26ilbez9g==} - engines: {node: '>=10'} - peerDependencies: - seroval: ^1.0 - - seroval@1.6.9: - resolution: {integrity: sha512-UeEzHwAK+yl0YLbsvROV1t5yMYEwZZ0CfKYxDvUgS2fO9Vxdf8djqVIB+OuVpuawRNPqw68LE1Du/GMsW2ZPqA==} - engines: {node: '>=10'} - - set-cookie-parser@3.1.4: - resolution: {integrity: sha512-iEmdEew+Tn1BwMGMP8LzGBEPC7Mf1sySjglCeEPb/Vchm9bnGezePvacYcId+fGprQzIng+TBkzqfJ/qS7AsBg==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-quote@1.12.0: - resolution: {integrity: sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==} - engines: {node: '>= 0.4'} - - solid-js@1.9.17: - resolution: {integrity: sha512-4GAmLOWPfNV8H9Jfn2LSFTpNEG6jiOKPiwd5lnLGQtehHaX6l3TOLzJqQ7mqwB/3k1Yy3zyumFVopmc/tm34ow==} - - source-map-js@1.2.2: - resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} - engines: {node: '>=0.10.0'} - - stable-hash-x@0.2.0: - resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} - engines: {node: '>=12.0.0'} - - std-env@4.3.0: - resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} - - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - tailwindcss@4.3.3: - resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} - - tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} - - tinybench@6.2.2: - resolution: {integrity: sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==} - engines: {node: '>=20.0.0'} - - tinyexec@1.3.1: - resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} - engines: {node: '>=18'} - - tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} - - tldts-core@7.4.18: - resolution: {integrity: sha512-KI2PKvCmvQI/xD6ypPqkU0i7oxNXR/O58RLRaHR4svsgVUQ2JE/XC8BtMbG6PSehD27I8sZJRcC1ASnCy6lp3g==} - - tldts@7.4.18: - resolution: {integrity: sha512-somxA8xKAUzlAxl0TX/jMSYIbRNFIVGnI96pVGJPeMc5BsHmfVXn6mOJT6U++ELnl04eGfzpfcEuZe8WiASkXg==} - hasBin: true - - tough-cookie@6.0.2: - resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} - engines: {node: '>=16'} - - tr46@6.0.0: - resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} - engines: {node: '>=20'} - - ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - ts-declaration-location@1.0.7: - resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} - peerDependencies: - typescript: '>=4.0.0' - - tsconfck@3.1.6: - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} - engines: {node: ^18 || >=20} - deprecated: unmaintained - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - typescript-eslint@8.71.2: - resolution: {integrity: sha512-Rz4effbMy2g9wnvOJZG6SbVavX313Lap1vNEbk1RUochzickvzP8P4HB+bkNg5e50eVz1hQGjh9K1omI1xB4Bw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - undici@7.30.1: - resolution: {integrity: sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==} - engines: {node: '>=20.18.1'} - - unplugin@3.4.0: - resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==} - engines: {node: ^20.19.0 || >=22.12.0} - peerDependencies: - '@farmfe/core': '*' - '@rsbuild/core': '*' - '@rspack/core': '*' - bun-types-no-globals: '*' - esbuild: '*' - rolldown: '*' - rollup: '*' - unloader: '*' - vite: '*' - webpack: '*' - peerDependenciesMeta: - '@farmfe/core': - optional: true - '@rsbuild/core': - optional: true - '@rspack/core': - optional: true - bun-types-no-globals: - optional: true - esbuild: - optional: true - rolldown: - optional: true - rollup: - optional: true - unloader: - optional: true - vite: - optional: true - webpack: - optional: true - - unrs-resolver@1.12.2: - resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} - - update-browserslist-db@1.3.4: - resolution: {integrity: sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - use-sync-external-store@1.7.0: - resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - vite-tsconfig-paths@5.1.4: - resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true - - vite@7.3.7: - resolution: {integrity: sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vitest@5.0.5: - resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} - engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 5.0.5 - '@vitest/browser-preview': 5.0.5 - '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 - '@vitest/coverage-istanbul': 5.0.5 - '@vitest/coverage-v8': 5.0.5 - '@vitest/ui': 5.0.5 - happy-dom: '*' - jsdom: '*' - vite: ^6.4.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/coverage-istanbul': - optional: true - '@vitest/coverage-v8': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - - vue-eslint-parser@10.4.1: - resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - - webidl-conversions@8.0.1: - resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} - engines: {node: '>=20'} - - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - - whatwg-mimetype@5.0.0: - resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} - engines: {node: '>=20'} - - whatwg-url@16.0.1: - resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@3.2.1: - resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} - engines: {node: '>=20.11'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - ws@8.22.0: - resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zod@4.6.7: - resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} - -snapshots: - - '@acemir/cssom@0.9.32': {} - - '@asamuzakjp/css-color@5.1.11': - dependencies: - '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) - '@csstools/css-color-parser': 4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) - '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) - '@csstools/css-tokenizer': 4.0.2 - - '@asamuzakjp/dom-selector@6.8.1': - dependencies: - '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.1.0 - css-tree: 3.2.1 - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.5.3 - - '@asamuzakjp/generational-cache@1.0.1': {} - - '@asamuzakjp/nwsapi@2.3.9': {} - - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.29.7': {} - - '@babel/core@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helpers': 7.29.10 - '@babel/parser': 7.29.9 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.10 - '@babel/types': 7.29.8 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.29.8': - dependencies: - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-compilation-targets@7.29.7': - dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - browserslist: 4.29.3 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-globals@7.29.7': {} - - '@babel/helper-module-imports@7.29.7': - dependencies: - '@babel/traverse': 7.29.10 - '@babel/types': 7.29.8 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.10 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.29.7': {} - - '@babel/helper-string-parser@7.29.7': {} - - '@babel/helper-validator-identifier@7.29.7': {} - - '@babel/helper-validator-option@7.29.7': {} - - '@babel/helpers@7.29.10': - dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 - - '@babel/parser@7.29.9': - dependencies: - '@babel/types': 7.29.8 - - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/runtime@7.29.10': {} - - '@babel/template@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 - - '@babel/traverse@7.29.10': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.29.8': - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - - '@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5)': - dependencies: - '@better-auth/utils': 0.4.2 - '@better-fetch/fetch': 1.3.2 - '@opentelemetry/semantic-conventions': 1.43.0 - '@standard-schema/spec': 1.1.0 - better-call: 1.4.0(zod@4.6.7) - jose: 6.2.12 - kysely: 0.29.6 - nanostores: 1.5.5 - zod: 4.6.7 - - '@better-auth/drizzle-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': - dependencies: - '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) - '@better-auth/utils': 0.4.2 - - '@better-auth/kysely-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(kysely@0.29.6)': - dependencies: - '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) - '@better-auth/utils': 0.4.2 - optionalDependencies: - kysely: 0.29.6 - - '@better-auth/memory-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': - dependencies: - '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) - '@better-auth/utils': 0.4.2 - - '@better-auth/mongo-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': - dependencies: - '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) - '@better-auth/utils': 0.4.2 - - '@better-auth/prisma-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': - dependencies: - '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) - '@better-auth/utils': 0.4.2 - - '@better-auth/telemetry@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)': - dependencies: - '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) - '@better-auth/utils': 0.4.2 - '@better-fetch/fetch': 1.3.2 - - '@better-auth/utils@0.4.2': - dependencies: - '@noble/hashes': 2.4.0 - - '@better-auth/utils@0.5.0': - dependencies: - '@noble/hashes': 2.4.0 - - '@better-fetch/fetch@1.3.2': {} - - '@bramus/specificity@2.4.3': - dependencies: - css-tree: 3.2.1 - - '@cacheable/memory@2.2.0': - dependencies: - '@cacheable/utils': 2.5.0 - '@keyv/bigmap': 1.3.1(keyv@5.6.0) - hookified: 1.15.1 - keyv: 5.6.0 - - '@cacheable/utils@2.5.0': - dependencies: - hashery: 1.5.1 - keyv: 5.6.0 - - '@csstools/color-helpers@6.1.2': {} - - '@csstools/css-calc@3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': - dependencies: - '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) - '@csstools/css-tokenizer': 4.0.2 - - '@csstools/css-color-parser@4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': - dependencies: - '@csstools/color-helpers': 6.1.2 - '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) - '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) - '@csstools/css-tokenizer': 4.0.2 - - '@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2)': - dependencies: - '@csstools/css-tokenizer': 4.0.2 - - '@csstools/css-syntax-patches-for-csstree@1.1.15(css-tree@3.2.1)': - optionalDependencies: - css-tree: 3.2.1 - - '@csstools/css-tokenizer@4.0.2': {} - - '@emnapi/core@1.10.0': - dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.10.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.28.2': - optional: true - - '@esbuild/android-arm64@0.28.2': - optional: true - - '@esbuild/android-arm@0.28.2': - optional: true - - '@esbuild/android-x64@0.28.2': - optional: true - - '@esbuild/darwin-arm64@0.28.2': - optional: true - - '@esbuild/darwin-x64@0.28.2': - optional: true - - '@esbuild/freebsd-arm64@0.28.2': - optional: true - - '@esbuild/freebsd-x64@0.28.2': - optional: true - - '@esbuild/linux-arm64@0.28.2': - optional: true - - '@esbuild/linux-arm@0.28.2': - optional: true - - '@esbuild/linux-ia32@0.28.2': - optional: true - - '@esbuild/linux-loong64@0.28.2': - optional: true - - '@esbuild/linux-mips64el@0.28.2': - optional: true - - '@esbuild/linux-ppc64@0.28.2': - optional: true - - '@esbuild/linux-riscv64@0.28.2': - optional: true - - '@esbuild/linux-s390x@0.28.2': - optional: true - - '@esbuild/linux-x64@0.28.2': - optional: true - - '@esbuild/netbsd-arm64@0.28.2': - optional: true - - '@esbuild/netbsd-x64@0.28.2': - optional: true - - '@esbuild/openbsd-arm64@0.28.2': - optional: true - - '@esbuild/openbsd-x64@0.28.2': - optional: true - - '@esbuild/openharmony-arm64@0.28.2': - optional: true - - '@esbuild/sunos-x64@0.28.2': - optional: true - - '@esbuild/win32-arm64@0.28.2': - optional: true - - '@esbuild/win32-ia32@0.28.2': - optional: true - - '@esbuild/win32-x64@0.28.2': - optional: true - - '@eslint-community/eslint-utils@4.10.1(eslint@10.13.0(jiti@2.7.0))': - dependencies: - eslint: 10.13.0(jiti@2.7.0) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.2': {} - - '@eslint/config-array@0.23.5': - dependencies: - '@eslint/object-schema': 3.0.5 - debug: 4.4.3 - minimatch: 10.2.6 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.7.0': - dependencies: - '@eslint/core': 1.2.1 - - '@eslint/core@1.2.1': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/js@10.0.1(eslint@10.13.0(jiti@2.7.0))': - optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) - - '@eslint/object-schema@3.0.5': {} - - '@eslint/plugin-kit@0.7.3': - dependencies: - '@eslint/core': 1.2.1 - levn: 0.4.1 - - '@exodus/bytes@1.16.0(@noble/hashes@2.4.0)': - optionalDependencies: - '@noble/hashes': 2.4.0 - - '@humanfs/core@0.19.2': - dependencies: - '@humanfs/types': 0.15.0 - - '@humanfs/node@0.16.8': - dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 - '@humanwhocodes/retry': 0.4.3 - - '@humanfs/types@0.15.0': {} - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.4.3': {} - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.6.0': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.6.0 - - '@keyv/bigmap@1.3.1(keyv@5.6.0)': - dependencies: - hashery: 1.5.1 - hookified: 1.15.1 - keyv: 5.6.0 - - '@keyv/serialize@1.1.1': {} - - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - optional: true - - '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.4 - optional: true - - '@neodrag/core@3.0.0-next.11': {} - - '@neodrag/solid@3.0.0-next.11(@neodrag/core@3.0.0-next.11)(solid-js@1.9.17)': - dependencies: - '@neodrag/core': 3.0.0-next.11 - solid-js: 1.9.17 - - '@noble/ciphers@2.4.0': {} - - '@noble/hashes@2.4.0': {} - - '@opentelemetry/semantic-conventions@1.43.0': {} - - '@oxc-parser/binding-android-arm-eabi@0.120.0': - optional: true - - '@oxc-parser/binding-android-arm64@0.120.0': - optional: true - - '@oxc-parser/binding-darwin-arm64@0.120.0': - optional: true - - '@oxc-parser/binding-darwin-x64@0.120.0': - optional: true - - '@oxc-parser/binding-freebsd-x64@0.120.0': - optional: true - - '@oxc-parser/binding-linux-arm-gnueabihf@0.120.0': - optional: true - - '@oxc-parser/binding-linux-arm-musleabihf@0.120.0': - optional: true - - '@oxc-parser/binding-linux-arm64-gnu@0.120.0': - optional: true - - '@oxc-parser/binding-linux-arm64-musl@0.120.0': - optional: true - - '@oxc-parser/binding-linux-ppc64-gnu@0.120.0': - optional: true - - '@oxc-parser/binding-linux-riscv64-gnu@0.120.0': - optional: true - - '@oxc-parser/binding-linux-riscv64-musl@0.120.0': - optional: true - - '@oxc-parser/binding-linux-s390x-gnu@0.120.0': - optional: true - - '@oxc-parser/binding-linux-x64-gnu@0.120.0': - optional: true - - '@oxc-parser/binding-linux-x64-musl@0.120.0': - optional: true - - '@oxc-parser/binding-openharmony-arm64@0.120.0': - optional: true - - '@oxc-parser/binding-wasm32-wasi@0.120.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - optional: true - - '@oxc-parser/binding-win32-arm64-msvc@0.120.0': - optional: true - - '@oxc-parser/binding-win32-ia32-msvc@0.120.0': - optional: true - - '@oxc-parser/binding-win32-x64-msvc@0.120.0': - optional: true - - '@oxc-project/types@0.120.0': {} - - '@rolldown/pluginutils@1.0.0-rc.3': {} - - '@rollup/rollup-android-arm-eabi@4.64.7': - optional: true - - '@rollup/rollup-android-arm64@4.64.7': - optional: true - - '@rollup/rollup-darwin-arm64@4.64.7': - optional: true - - '@rollup/rollup-darwin-x64@4.64.7': - optional: true - - '@rollup/rollup-freebsd-arm64@4.64.7': - optional: true - - '@rollup/rollup-freebsd-x64@4.64.7': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.64.7': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.64.7': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.64.7': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.64.7': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.64.7': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.64.7': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.64.7': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.64.7': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.64.7': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.64.7': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.64.7': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.64.7': - optional: true - - '@rollup/rollup-linux-x64-musl@4.64.7': - optional: true - - '@rollup/rollup-openbsd-x64@4.64.7': - optional: true - - '@rollup/rollup-openharmony-arm64@4.64.7': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.64.7': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.64.7': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.64.7': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.64.7': - optional: true - - '@solid-primitives/event-listener@2.4.6(solid-js@1.9.17)': - dependencies: - '@solid-primitives/utils': 6.4.1(solid-js@1.9.17) - solid-js: 1.9.17 - - '@solid-primitives/keyboard@1.3.7(solid-js@1.9.17)': - dependencies: - '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.17) - '@solid-primitives/rootless': 1.5.4(solid-js@1.9.17) - '@solid-primitives/utils': 6.4.1(solid-js@1.9.17) - solid-js: 1.9.17 - - '@solid-primitives/resize-observer@2.2.0(solid-js@1.9.17)': - dependencies: - '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.17) - '@solid-primitives/rootless': 1.5.4(solid-js@1.9.17) - '@solid-primitives/static-store': 0.1.4(solid-js@1.9.17) - '@solid-primitives/utils': 6.4.1(solid-js@1.9.17) - solid-js: 1.9.17 - - '@solid-primitives/rootless@1.5.4(solid-js@1.9.17)': - dependencies: - '@solid-primitives/utils': 6.4.1(solid-js@1.9.17) - solid-js: 1.9.17 - - '@solid-primitives/static-store@0.1.4(solid-js@1.9.17)': - dependencies: - '@solid-primitives/utils': 6.4.1(solid-js@1.9.17) - solid-js: 1.9.17 - - '@solid-primitives/utils@6.4.1(solid-js@1.9.17)': - dependencies: - solid-js: 1.9.17 - - '@standard-schema/spec@1.1.0': {} - - '@stylistic/eslint-plugin@5.10.0(eslint@10.13.0(jiti@2.7.0))': - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) - '@typescript-eslint/types': 8.71.2 - eslint: 10.13.0(jiti@2.7.0) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.7 - - '@tailwindcss/node@4.3.3': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.26.0 - jiti: 2.7.0 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.2 - tailwindcss: 4.3.3 - - '@tailwindcss/oxide-android-arm64@4.3.3': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.3.3': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.3.3': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.3.3': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.3.3': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.3.3': - optional: true - - '@tailwindcss/oxide@4.3.3': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.3.3 - '@tailwindcss/oxide-darwin-arm64': 4.3.3 - '@tailwindcss/oxide-darwin-x64': 4.3.3 - '@tailwindcss/oxide-freebsd-x64': 4.3.3 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 - '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 - '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 - '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 - '@tailwindcss/oxide-linux-x64-musl': 4.3.3 - '@tailwindcss/oxide-wasm32-wasi': 4.3.3 - '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 - '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - - '@tailwindcss/typography@0.5.20(tailwindcss@4.3.3)': - dependencies: - postcss-selector-parser: 6.0.10 - tailwindcss: 4.3.3 - - '@tailwindcss/vite@4.3.3(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0))': - dependencies: - '@tailwindcss/node': 4.3.3 - '@tailwindcss/oxide': 4.3.3 - tailwindcss: 4.3.3 - vite: 7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0) - - '@tanstack/devtools-bundler-core@0.1.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@tanstack/devtools-client': 0.0.8 - '@tanstack/devtools-event-bus': 0.4.3 - chalk: 5.6.2 - launch-editor: 2.14.2 - magic-string: 0.30.21 - oxc-parser: 0.120.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - picomatch: 4.0.7 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - bufferutil - - utf-8-validate - - '@tanstack/devtools-client@0.0.8': - dependencies: - '@tanstack/devtools-event-client': 0.5.0 - - '@tanstack/devtools-event-bus@0.4.3': - dependencies: - ws: 8.22.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@tanstack/devtools-event-client@0.5.0': {} - - '@tanstack/devtools-ui@0.7.1(csstype@3.2.3)(solid-js@1.9.17)': - dependencies: - clsx: 2.1.1 - dayjs: 1.11.23 - goober: 2.1.19(csstype@3.2.3) - solid-js: 1.9.17 - transitivePeerDependencies: - - csstype - - '@tanstack/devtools-vite@0.8.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0))': - dependencies: - '@tanstack/devtools-bundler-core': 0.1.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - '@tanstack/devtools-client': 0.0.8 - '@tanstack/devtools-event-bus': 0.4.3 - chalk: 5.6.2 - vite: 7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - bufferutil - - utf-8-validate - - '@tanstack/devtools@0.15.0(csstype@3.2.3)(solid-js@1.9.17)': - dependencies: - '@neodrag/core': 3.0.0-next.11 - '@neodrag/solid': 3.0.0-next.11(@neodrag/core@3.0.0-next.11)(solid-js@1.9.17) - '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.17) - '@solid-primitives/keyboard': 1.3.7(solid-js@1.9.17) - '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.17) - '@tanstack/devtools-client': 0.0.8 - '@tanstack/devtools-event-bus': 0.4.3 - '@tanstack/devtools-ui': 0.7.1(csstype@3.2.3)(solid-js@1.9.17) - clsx: 2.1.1 - goober: 2.1.19(csstype@3.2.3) - solid-js: 1.9.17 - transitivePeerDependencies: - - bufferutil - - csstype - - utf-8-validate - - '@tanstack/eslint-config@0.4.0(@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3)': - dependencies: - '@eslint/js': 10.0.1(eslint@10.13.0(jiti@2.7.0)) - '@stylistic/eslint-plugin': 5.10.0(eslint@10.13.0(jiti@2.7.0)) - eslint: 10.13.0(jiti@2.7.0) - eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.13.0(jiti@2.7.0)) - eslint-plugin-n: 17.24.0(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - globals: 17.13.0 - typescript-eslint: 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - vue-eslint-parser: 10.4.1(eslint@10.13.0(jiti@2.7.0)) - transitivePeerDependencies: - - '@typescript-eslint/utils' - - eslint-import-resolver-node - - supports-color - - typescript - - '@tanstack/history@1.162.5': {} - - '@tanstack/react-devtools@0.10.13(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(solid-js@1.9.17)': - dependencies: - '@tanstack/devtools': 0.15.0(csstype@3.2.3)(solid-js@1.9.17) - '@types/react': 19.3.0 - '@types/react-dom': 19.3.0(@types/react@19.3.0) - react: 19.3.1 - react-dom: 19.3.1(react@19.3.1) - transitivePeerDependencies: - - bufferutil - - csstype - - solid-js - - utf-8-validate - - '@tanstack/react-router-devtools@1.167.2(@tanstack/react-router@1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@tanstack/router-core@1.171.38)(csstype@3.2.3)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': - dependencies: - '@tanstack/react-router': 1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@tanstack/router-devtools-core': 1.168.2(@tanstack/router-core@1.171.38)(csstype@3.2.3) - react: 19.3.1 - react-dom: 19.3.1(react@19.3.1) - optionalDependencies: - '@tanstack/router-core': 1.171.38 - transitivePeerDependencies: - - csstype - - '@tanstack/react-router@1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': - dependencies: - '@tanstack/history': 1.162.5 - '@tanstack/react-store': 0.11.2(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@tanstack/router-core': 1.171.38 - isbot: 5.2.2 - react: 19.3.1 - react-dom: 19.3.1(react@19.3.1) - - '@tanstack/react-store@0.11.2(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': - dependencies: - '@tanstack/store': 0.11.2 - react: 19.3.1 - react-dom: 19.3.1(react@19.3.1) - use-sync-external-store: 1.7.0(react@19.3.1) - - '@tanstack/router-core@1.171.38': - dependencies: - '@tanstack/history': 1.162.5 - cookie-es: 3.1.1 - seroval: 1.6.9 - seroval-plugins: 1.6.9(seroval@1.6.9) - - '@tanstack/router-devtools-core@1.168.2(@tanstack/router-core@1.171.38)(csstype@3.2.3)': - dependencies: - '@tanstack/router-core': 1.171.38 - clsx: 2.1.1 - goober: 2.1.19(csstype@3.2.3) - optionalDependencies: - csstype: 3.2.3 - - '@tanstack/router-generator@1.167.45': - dependencies: - '@babel/types': 7.29.8 - '@tanstack/router-core': 1.171.38 - '@tanstack/router-utils': 1.162.4 - '@tanstack/virtual-file-routes': 1.162.0 - jiti: 2.7.0 - magic-string: 0.30.21 - prettier: 3.9.10 - zod: 4.6.7 - transitivePeerDependencies: - - supports-color - - '@tanstack/router-plugin@1.168.47(@tanstack/react-router@1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(esbuild@0.28.2)(rollup@4.64.7)(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0))': - dependencies: - '@babel/core': 7.29.7 - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 - '@tanstack/router-core': 1.171.38 - '@tanstack/router-generator': 1.167.45 - '@tanstack/router-utils': 1.162.4 - chokidar: 5.0.0 - unplugin: 3.4.0(esbuild@0.28.2)(rollup@4.64.7)(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)) - zod: 4.6.7 - optionalDependencies: - '@tanstack/react-router': 1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - vite: 7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0) - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - supports-color - - unloader - - '@tanstack/router-utils@1.162.4': - dependencies: - '@babel/generator': 7.29.8 - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 - ansis: 4.4.0 - babel-dead-code-elimination: 1.0.12 - diff: 9.0.0 - pathe: 2.0.3 - tinyglobby: 0.2.17 - transitivePeerDependencies: - - supports-color - - '@tanstack/store@0.11.2': {} - - '@tanstack/virtual-file-routes@1.162.0': {} - - '@testing-library/dom@10.4.2': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/runtime': 7.29.10 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - picocolors: 1.1.1 - pretty-format: 27.5.1 - - '@testing-library/react@16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': - dependencies: - '@babel/runtime': 7.29.10 - '@testing-library/dom': 10.4.2 - react: 19.3.1 - react-dom: 19.3.1(react@19.3.1) - optionalDependencies: - '@types/react': 19.3.0 - '@types/react-dom': 19.3.0(@types/react@19.3.0) - - '@tybys/wasm-util@0.10.4': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/aria-query@5.0.4': {} - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.29.8 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 - - '@types/babel__traverse@7.28.0': - dependencies: - '@babel/types': 7.29.8 - - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - - '@types/deep-eql@4.0.2': {} - - '@types/esrecurse@4.3.1': {} - - '@types/estree@1.0.9': {} - - '@types/json-schema@7.0.15': {} - - '@types/node@22.20.5': - dependencies: - undici-types: 6.21.0 - - '@types/react-dom@19.3.0(@types/react@19.3.0)': - dependencies: - '@types/react': 19.3.0 - - '@types/react@19.3.0': - dependencies: - csstype: 3.2.3 - - '@typescript-eslint/eslint-plugin@8.71.2(@typescript-eslint/parser@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.71.2 - '@typescript-eslint/type-utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.71.2 - eslint: 10.13.0(jiti@2.7.0) - ignore: 7.0.12 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.71.2 - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/typescript-estree': 8.71.2(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.71.2 - debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.71.2(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.71.2(typescript@5.9.3) - '@typescript-eslint/types': 8.71.2 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.71.2': - dependencies: - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/visitor-keys': 8.71.2 - - '@typescript-eslint/tsconfig-utils@8.71.2(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/typescript-estree': 8.71.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.71.2': {} - - '@typescript-eslint/typescript-estree@8.71.2(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.71.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.71.2(typescript@5.9.3) - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/visitor-keys': 8.71.2 - debug: 4.4.3 - minimatch: 10.2.6 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.71.2 - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/typescript-estree': 8.71.2(typescript@5.9.3) - eslint: 10.13.0(jiti@2.7.0) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.71.2': - dependencies: - '@typescript-eslint/types': 8.71.2 - eslint-visitor-keys: 5.0.1 - - '@unrs/resolver-binding-android-arm-eabi@1.12.2': - optional: true - - '@unrs/resolver-binding-android-arm64@1.12.2': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.12.2': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.12.2': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-arm64-musl@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-loong64-musl@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-x64-gnu@1.12.2': - optional: true - - '@unrs/resolver-binding-linux-x64-musl@1.12.2': - optional: true - - '@unrs/resolver-binding-openharmony-arm64@1.12.2': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.12.2': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.12.2': - optional: true - - '@vitejs/plugin-react@5.2.0(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0))': - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) - '@rolldown/pluginutils': 1.0.0-rc.3 - '@types/babel__core': 7.20.5 - react-refresh: 0.18.0 - vite: 7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0) - transitivePeerDependencies: - - supports-color - - '@vitest/mocker@5.0.5(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0))': - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.5 - estree-walker: 3.0.3 - magic-string: 1.4.3 - optionalDependencies: - vite: 7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0) - - '@vitest/spy@5.0.5': {} - - acorn-jsx@5.3.2(acorn@8.19.0): - dependencies: - acorn: 8.19.0 - - acorn@8.19.0: {} - - agent-base@7.1.4: {} - - ajv@6.15.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ansi-regex@5.0.1: {} - - ansi-styles@5.2.0: {} - - ansis@4.4.0: {} - - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - - assertion-error@2.0.1: {} - - babel-dead-code-elimination@1.0.12: - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/traverse': 7.29.10 - '@babel/types': 7.29.8 - transitivePeerDependencies: - - supports-color - - balanced-match@4.0.4: {} - - baseline-browser-mapping@2.11.29: {} - - better-auth@1.7.7(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(solid-js@1.9.17)(vitest@5.0.5(@types/node@22.20.5)(jsdom@28.1.0(@noble/hashes@2.4.0))(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0))): - dependencies: - '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) - '@better-auth/drizzle-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2) - '@better-auth/kysely-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(kysely@0.29.6) - '@better-auth/memory-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2) - '@better-auth/mongo-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2) - '@better-auth/prisma-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2) - '@better-auth/telemetry': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2) - '@better-auth/utils': 0.4.2 - '@better-fetch/fetch': 1.3.2 - '@noble/ciphers': 2.4.0 - '@noble/hashes': 2.4.0 - better-call: 1.4.0(zod@4.6.7) - defu: 6.1.7 - jose: 6.2.12 - kysely: 0.29.6 - nanostores: 1.5.5 - zod: 4.6.7 - optionalDependencies: - react: 19.3.1 - react-dom: 19.3.1(react@19.3.1) - solid-js: 1.9.17 - vitest: 5.0.5(@types/node@22.20.5)(jsdom@28.1.0(@noble/hashes@2.4.0))(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)) - transitivePeerDependencies: - - '@opentelemetry/api' - - better-call@1.4.0(zod@4.6.7): - dependencies: - '@better-auth/utils': 0.5.0 - '@better-fetch/fetch': 1.3.2 - rou3: 0.9.2 - set-cookie-parser: 3.1.4 - optionalDependencies: - zod: 4.6.7 - - bidi-js@1.1.0: - dependencies: - require-from-string: 2.0.2 - - brace-expansion@5.0.12: - dependencies: - balanced-match: 4.0.4 - - browserslist@4.29.3: - dependencies: - baseline-browser-mapping: 2.11.29 - caniuse-lite: 1.0.30001816 - electron-to-chromium: 1.5.458 - node-releases: 2.0.59 - update-browserslist-db: 1.3.4(browserslist@4.29.3) - - cacheable@2.5.0: - dependencies: - '@cacheable/memory': 2.2.0 - '@cacheable/utils': 2.5.0 - hookified: 1.15.1 - keyv: 5.6.0 - qified: 0.10.1 - - caniuse-lite@1.0.30001816: {} - - chai@6.3.0: {} - - chalk@5.6.2: {} - - chokidar@5.0.0: - dependencies: - readdirp: 5.1.1 - - clsx@2.1.1: {} - - comment-parser@1.4.9: {} - - convert-source-map@2.0.0: {} - - cookie-es@3.1.1: {} - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - css-tree@3.2.1: - dependencies: - mdn-data: 2.27.1 - source-map-js: 1.2.2 - - cssesc@3.0.0: {} - - cssstyle@6.2.0: - dependencies: - '@asamuzakjp/css-color': 5.1.11 - '@csstools/css-syntax-patches-for-csstree': 1.1.15(css-tree@3.2.1) - css-tree: 3.2.1 - lru-cache: 11.5.3 - - csstype@3.2.3: {} - - data-urls@7.0.0(@noble/hashes@2.4.0): - dependencies: - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@2.4.0) - transitivePeerDependencies: - - '@noble/hashes' - - dayjs@1.11.23: {} - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decimal.js@10.6.0: {} - - deep-is@0.1.4: {} - - defu@6.1.7: {} - - dequal@2.0.3: {} - - detect-libc@2.1.2: {} - - diff@9.0.0: {} - - dom-accessibility-api@0.5.16: {} - - electron-to-chromium@1.5.458: {} - - enhanced-resolve@5.26.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.3 - - entities@8.1.0: {} - - es-module-lexer@2.3.2: {} - - esbuild@0.28.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.28.2 - '@esbuild/android-arm': 0.28.2 - '@esbuild/android-arm64': 0.28.2 - '@esbuild/android-x64': 0.28.2 - '@esbuild/darwin-arm64': 0.28.2 - '@esbuild/darwin-x64': 0.28.2 - '@esbuild/freebsd-arm64': 0.28.2 - '@esbuild/freebsd-x64': 0.28.2 - '@esbuild/linux-arm': 0.28.2 - '@esbuild/linux-arm64': 0.28.2 - '@esbuild/linux-ia32': 0.28.2 - '@esbuild/linux-loong64': 0.28.2 - '@esbuild/linux-mips64el': 0.28.2 - '@esbuild/linux-ppc64': 0.28.2 - '@esbuild/linux-riscv64': 0.28.2 - '@esbuild/linux-s390x': 0.28.2 - '@esbuild/linux-x64': 0.28.2 - '@esbuild/netbsd-arm64': 0.28.2 - '@esbuild/netbsd-x64': 0.28.2 - '@esbuild/openbsd-arm64': 0.28.2 - '@esbuild/openbsd-x64': 0.28.2 - '@esbuild/openharmony-arm64': 0.28.2 - '@esbuild/sunos-x64': 0.28.2 - '@esbuild/win32-arm64': 0.28.2 - '@esbuild/win32-ia32': 0.28.2 - '@esbuild/win32-x64': 0.28.2 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eslint-compat-utils@0.5.1(eslint@10.13.0(jiti@2.7.0)): - dependencies: - eslint: 10.13.0(jiti@2.7.0) - semver: 7.8.5 - - eslint-import-context@0.1.9(unrs-resolver@1.12.2): - dependencies: - get-tsconfig: 4.14.3 - stable-hash-x: 0.2.0 - optionalDependencies: - unrs-resolver: 1.12.2 - - eslint-plugin-es-x@7.8.0(eslint@10.13.0(jiti@2.7.0)): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) - '@eslint-community/regexpp': 4.12.2 - eslint: 10.13.0(jiti@2.7.0) - eslint-compat-utils: 0.5.1(eslint@10.13.0(jiti@2.7.0)) - - eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.13.0(jiti@2.7.0)): - dependencies: - '@typescript-eslint/types': 8.71.2 - comment-parser: 1.4.9 - debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) - eslint-import-context: 0.1.9(unrs-resolver@1.12.2) - is-glob: 4.0.3 - minimatch: 10.2.6 - semver: 7.8.5 - stable-hash-x: 0.2.0 - unrs-resolver: 1.12.2 - optionalDependencies: - '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - transitivePeerDependencies: - - supports-color - - eslint-plugin-n@17.24.0(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) - enhanced-resolve: 5.26.0 - eslint: 10.13.0(jiti@2.7.0) - eslint-plugin-es-x: 7.8.0(eslint@10.13.0(jiti@2.7.0)) - get-tsconfig: 4.14.3 - globals: 15.15.0 - globrex: 0.1.2 - ignore: 5.3.2 - semver: 7.8.5 - ts-declaration-location: 1.0.7(typescript@5.9.3) - transitivePeerDependencies: - - typescript - - eslint-scope@9.1.2: - dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.9 - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint-visitor-keys@5.0.1: {} - - eslint@10.13.0(jiti@2.7.0): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.7.0 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.3 - '@humanfs/node': 0.16.8 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.9 - ajv: 6.15.0 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 11.1.5 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.6 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.7.0 - transitivePeerDependencies: - - supports-color - - espree@10.4.0: - dependencies: - acorn: 8.19.0 - acorn-jsx: 5.3.2(acorn@8.19.0) - eslint-visitor-keys: 4.2.1 - - espree@11.2.0: - dependencies: - acorn: 8.19.0 - acorn-jsx: 5.3.2(acorn@8.19.0) - eslint-visitor-keys: 5.0.1 - - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.9 - - esutils@2.0.3: {} - - expect-type@1.4.0: {} - - fast-deep-equal@3.1.3: {} - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fdir@6.5.0(picomatch@4.0.7): - optionalDependencies: - picomatch: 4.0.7 - - file-entry-cache@11.1.5: - dependencies: - flat-cache: 6.1.23 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@6.1.23: - dependencies: - cacheable: 2.5.0 - flatted: 3.4.4 - hookified: 1.15.1 - - flatted@3.4.4: {} - - fsevents@2.3.3: - optional: true - - gensync@1.0.0-beta.2: {} - - get-tsconfig@4.14.3: - dependencies: - resolve-pkg-maps: 1.0.0 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - globals@15.15.0: {} - - globals@17.13.0: {} - - globrex@0.1.2: {} - - goober@2.1.19(csstype@3.2.3): - dependencies: - csstype: 3.2.3 - - graceful-fs@4.2.11: {} - - hashery@1.5.1: - dependencies: - hookified: 1.15.1 - - hookified@1.15.1: {} - - hookified@2.2.0: {} - - html-encoding-sniffer@6.0.0(@noble/hashes@2.4.0): - dependencies: - '@exodus/bytes': 1.16.0(@noble/hashes@2.4.0) - transitivePeerDependencies: - - '@noble/hashes' - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - ignore@5.3.2: {} - - ignore@7.0.12: {} - - imurmurhash@0.1.4: {} - - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-potential-custom-element-name@1.0.1: {} - - isbot@5.2.2: {} - - isexe@2.0.0: {} - - jiti@2.7.0: {} - - jose@6.2.12: {} - - js-tokens@4.0.0: {} - - jsdom@28.1.0(@noble/hashes@2.4.0): - dependencies: - '@acemir/cssom': 0.9.32 - '@asamuzakjp/dom-selector': 6.8.1 - '@bramus/specificity': 2.4.3 - '@exodus/bytes': 1.16.0(@noble/hashes@2.4.0) - cssstyle: 6.2.0 - data-urls: 7.0.0(@noble/hashes@2.4.0) - decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0(@noble/hashes@2.4.0) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - parse5: 8.0.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.2 - undici: 7.30.1 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.1 - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@2.4.0) - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - '@noble/hashes' - - supports-color - - jsesc@3.1.0: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@2.2.3: {} - - keyv@5.6.0: - dependencies: - '@keyv/serialize': 1.1.1 - - kysely@0.29.6: {} - - launch-editor@2.14.2: - dependencies: - picocolors: 1.1.1 - shell-quote: 1.12.0 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lightningcss-android-arm64@1.32.0: - optional: true - - lightningcss-darwin-arm64@1.32.0: - optional: true - - lightningcss-darwin-x64@1.32.0: - optional: true - - lightningcss-freebsd-x64@1.32.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.32.0: - optional: true - - lightningcss-linux-arm64-gnu@1.32.0: - optional: true - - lightningcss-linux-arm64-musl@1.32.0: - optional: true - - lightningcss-linux-x64-gnu@1.32.0: - optional: true - - lightningcss-linux-x64-musl@1.32.0: - optional: true - - lightningcss-win32-arm64-msvc@1.32.0: - optional: true - - lightningcss-win32-x64-msvc@1.32.0: - optional: true - - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lru-cache@11.5.3: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lucide-react@0.545.0(react@19.3.1): - dependencies: - react: 19.3.1 - - lz-string@1.5.0: {} - - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - - magic-string@1.4.3: - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - - mdn-data@2.27.1: {} - - minimatch@10.2.6: - dependencies: - brace-expansion: 5.0.12 - - ms@2.1.3: {} - - nanoid@3.3.20: {} - - nanostores@1.5.5: {} - - napi-postinstall@0.3.4: {} - - natural-compare@1.4.0: {} - - node-releases@2.0.59: {} - - obug@3.0.0: {} - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - oxc-parser@0.120.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): - dependencies: - '@oxc-project/types': 0.120.0 - optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.120.0 - '@oxc-parser/binding-android-arm64': 0.120.0 - '@oxc-parser/binding-darwin-arm64': 0.120.0 - '@oxc-parser/binding-darwin-x64': 0.120.0 - '@oxc-parser/binding-freebsd-x64': 0.120.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.120.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.120.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.120.0 - '@oxc-parser/binding-linux-arm64-musl': 0.120.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.120.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.120.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.120.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.120.0 - '@oxc-parser/binding-linux-x64-gnu': 0.120.0 - '@oxc-parser/binding-linux-x64-musl': 0.120.0 - '@oxc-parser/binding-openharmony-arm64': 0.120.0 - '@oxc-parser/binding-wasm32-wasi': 0.120.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - '@oxc-parser/binding-win32-arm64-msvc': 0.120.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.120.0 - '@oxc-parser/binding-win32-x64-msvc': 0.120.0 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - parse5@8.0.1: - dependencies: - entities: 8.1.0 - - path-exists@4.0.0: {} - - path-key@3.1.1: {} - - pathe@2.0.3: {} - - picocolors@1.1.1: {} - - picomatch@4.0.7: {} - - postcss-selector-parser@6.0.10: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss@8.5.30: - dependencies: - nanoid: 3.3.20 - picocolors: 1.1.1 - source-map-js: 1.2.2 - - prelude-ls@1.2.1: {} - - prettier@3.9.10: {} - - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - - punycode@2.3.1: {} - - qified@0.10.1: - dependencies: - hookified: 2.2.0 - - react-dom@19.3.1(react@19.3.1): - dependencies: - react: 19.3.1 - scheduler: 0.28.0 - - react-is@17.0.2: {} - - react-refresh@0.18.0: {} - - react@19.3.1: {} - - readdirp@5.1.1: {} - - require-from-string@2.0.2: {} - - resolve-pkg-maps@1.0.0: {} - - rollup@4.64.7: - dependencies: - '@types/estree': 1.0.9 - optionalDependencies: - '@napi-rs/lzma-linux-x64-gnu': 1.5.1 - '@rollup/rollup-android-arm-eabi': 4.64.7 - '@rollup/rollup-android-arm64': 4.64.7 - '@rollup/rollup-darwin-arm64': 4.64.7 - '@rollup/rollup-darwin-x64': 4.64.7 - '@rollup/rollup-freebsd-arm64': 4.64.7 - '@rollup/rollup-freebsd-x64': 4.64.7 - '@rollup/rollup-linux-arm-gnueabihf': 4.64.7 - '@rollup/rollup-linux-arm-musleabihf': 4.64.7 - '@rollup/rollup-linux-arm64-gnu': 4.64.7 - '@rollup/rollup-linux-arm64-musl': 4.64.7 - '@rollup/rollup-linux-loong64-gnu': 4.64.7 - '@rollup/rollup-linux-loong64-musl': 4.64.7 - '@rollup/rollup-linux-ppc64-gnu': 4.64.7 - '@rollup/rollup-linux-ppc64-musl': 4.64.7 - '@rollup/rollup-linux-riscv64-gnu': 4.64.7 - '@rollup/rollup-linux-riscv64-musl': 4.64.7 - '@rollup/rollup-linux-s390x-gnu': 4.64.7 - '@rollup/rollup-linux-x64-gnu': 4.64.7 - '@rollup/rollup-linux-x64-musl': 4.64.7 - '@rollup/rollup-openbsd-x64': 4.64.7 - '@rollup/rollup-openharmony-arm64': 4.64.7 - '@rollup/rollup-win32-arm64-msvc': 4.64.7 - '@rollup/rollup-win32-ia32-msvc': 4.64.7 - '@rollup/rollup-win32-x64-gnu': 4.64.7 - '@rollup/rollup-win32-x64-msvc': 4.64.7 - fsevents: 2.3.3 - - rou3@0.9.2: {} - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - - scheduler@0.28.0: {} - - semver@6.3.1: {} - - semver@7.8.5: {} - - seroval-plugins@1.6.9(seroval@1.6.9): - dependencies: - seroval: 1.6.9 - - seroval@1.6.9: {} - - set-cookie-parser@3.1.4: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shell-quote@1.12.0: {} - - solid-js@1.9.17: - dependencies: - csstype: 3.2.3 - seroval: 1.6.9 - seroval-plugins: 1.6.9(seroval@1.6.9) - - source-map-js@1.2.2: {} - - stable-hash-x@0.2.0: {} - - std-env@4.3.0: {} - - symbol-tree@3.2.4: {} - - tailwindcss@4.3.3: {} - - tapable@2.3.3: {} - - tinybench@6.2.2: {} - - tinyexec@1.3.1: {} - - tinyglobby@0.2.17: - dependencies: - fdir: 6.5.0(picomatch@4.0.7) - picomatch: 4.0.7 - - tldts-core@7.4.18: {} - - tldts@7.4.18: - dependencies: - tldts-core: 7.4.18 - - tough-cookie@6.0.2: - dependencies: - tldts: 7.4.18 - - tr46@6.0.0: - dependencies: - punycode: 2.3.1 - - ts-api-utils@2.5.0(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - - ts-declaration-location@1.0.7(typescript@5.9.3): - dependencies: - picomatch: 4.0.7 - typescript: 5.9.3 - - tsconfck@3.1.6(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - - tslib@2.8.1: - optional: true - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - typescript-eslint@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.71.2(@typescript-eslint/parser@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/parser': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.71.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@5.9.3) - eslint: 10.13.0(jiti@2.7.0) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - typescript@5.9.3: {} - - undici-types@6.21.0: {} - - undici@7.30.1: {} - - unplugin@3.4.0(esbuild@0.28.2)(rollup@4.64.7)(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)): - dependencies: - '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.7 - webpack-virtual-modules: 0.6.2 - optionalDependencies: - esbuild: 0.28.2 - rollup: 4.64.7 - vite: 7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0) - - unrs-resolver@1.12.2: - dependencies: - napi-postinstall: 0.3.4 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.12.2 - '@unrs/resolver-binding-android-arm64': 1.12.2 - '@unrs/resolver-binding-darwin-arm64': 1.12.2 - '@unrs/resolver-binding-darwin-x64': 1.12.2 - '@unrs/resolver-binding-freebsd-x64': 1.12.2 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 - '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 - '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 - '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 - '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-x64-musl': 1.12.2 - '@unrs/resolver-binding-openharmony-arm64': 1.12.2 - '@unrs/resolver-binding-wasm32-wasi': 1.12.2 - '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 - '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 - '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 - - update-browserslist-db@1.3.4(browserslist@4.29.3): - dependencies: - browserslist: 4.29.3 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - use-sync-external-store@1.7.0(react@19.3.1): - dependencies: - react: 19.3.1 - - util-deprecate@1.0.2: {} - - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)): - dependencies: - debug: 4.4.3 - globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.3) - optionalDependencies: - vite: 7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0) - transitivePeerDependencies: - - supports-color - - typescript - - vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0): - dependencies: - esbuild: 0.28.2 - fdir: 6.5.0(picomatch@4.0.7) - picomatch: 4.0.7 - postcss: 8.5.30 - rollup: 4.64.7 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 22.20.5 - fsevents: 2.3.3 - jiti: 2.7.0 - lightningcss: 1.32.0 - - vitest@5.0.5(@types/node@22.20.5)(jsdom@28.1.0(@noble/hashes@2.4.0))(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)): - dependencies: - '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.5(vite@7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0)) - chai: 6.3.0 - es-module-lexer: 2.3.2 - expect-type: 1.4.0 - magic-string: 1.4.3 - obug: 3.0.0 - picomatch: 4.0.7 - std-env: 4.3.0 - tinybench: 6.2.2 - tinyexec: 1.3.1 - tinyglobby: 0.2.17 - vite: 7.3.7(@types/node@22.20.5)(jiti@2.7.0)(lightningcss@1.32.0) - why-is-node-running: 3.2.1 - optionalDependencies: - '@types/node': 22.20.5 - jsdom: 28.1.0(@noble/hashes@2.4.0) - transitivePeerDependencies: - - msw - - vue-eslint-parser@10.4.1(eslint@10.13.0(jiti@2.7.0)): - dependencies: - debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - semver: 7.8.5 - transitivePeerDependencies: - - supports-color - - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - - webidl-conversions@8.0.1: {} - - webpack-virtual-modules@0.6.2: {} - - whatwg-mimetype@5.0.0: {} - - whatwg-url@16.0.1(@noble/hashes@2.4.0): - dependencies: - '@exodus/bytes': 1.16.0(@noble/hashes@2.4.0) - tr46: 6.0.0 - webidl-conversions: 8.0.1 - transitivePeerDependencies: - - '@noble/hashes' - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@3.2.1: {} - - word-wrap@1.2.5: {} - - ws@8.22.0: {} - - xml-name-validator@5.0.0: {} - - xmlchars@2.2.0: {} - - yallist@3.1.1: {} - - yocto-queue@0.1.0: {} - - zod@4.6.7: {} diff --git a/web-interface/prettier.config.js b/web-interface/prettier.config.js deleted file mode 100644 index f7279f7..0000000 --- a/web-interface/prettier.config.js +++ /dev/null @@ -1,10 +0,0 @@ -// @ts-check - -/** @type {import('prettier').Config} */ -const config = { - semi: false, - singleQuote: true, - trailingComma: 'all', -} - -export default config diff --git a/web-interface/public/favicon.ico b/web-interface/public/favicon.ico deleted file mode 100644 index bd4829290a12df81098f85c3a9027defd44ee06b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152126 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 diff --git a/web-interface/public/favicon.svg b/web-interface/public/favicon.svg deleted file mode 100644 index a526ef2..0000000 --- a/web-interface/public/favicon.svg +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - M - - diff --git a/web-interface/public/fonts/OFL.txt b/web-interface/public/fonts/OFL.txt deleted file mode 100644 index e271172..0000000 --- a/web-interface/public/fonts/OFL.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2018 The Manrope Project Authors (https://github.com/googlefonts/manrope) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/web-interface/public/fonts/manrope-latin.woff2 b/web-interface/public/fonts/manrope-latin.woff2 deleted file mode 100644 index 71eb731d558046199aa7f985adbf812890a093a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24836 zcmV)0K+eB+Pew8T0RR910AU0G6951J0P*Mm0AQ2=0RR9100000000000000000000 z0000QP#e`;9Fqz^NLE2oi!KIWKT}jeRDl8jgk~>l5eN!_tr&rdT?>RV05E}6CI^aF3;Z;5virLSaNFE(axy*mQqs-!~XM8C3M>^SUN$NvCN@&`+X2=a4zKdC)YC%%Gvb zS|}*`DN1`q!m~IF&dOIh1Ki262sv^>JkPJ`&$;)$_jZ?ESYXj?2vLYSO%|Ha)bgn% zG$kq(C%%t}Ry|fH<|Lmuai>nzDa*sxe)XQ)-4ABwLkLLDhFPNUv3>V%K&4WiG_i^z z;leh;AiV$Ke_Q|i91eIyMARc55fKr|kPsEWp&bYvvY$EjGx|(1)-AK2{T-iRxB33N zKj-iLHIB<$zQ$>M_I-`xm^lsC{4$10NJfT4hXXwPe{R(+z%V)4A#-e`9n46-dXxoO zxSr7m3LXZbn!viZB6nSK|V6zdTRXRbkL@%ZQcgPr@cjH0Lo zB|+E%j4;p)+ln;c^r3Fpz&uW0s@XVU`|%qI$?&E1E$PFYDf5qR_8HnSmp6A_-xo*6 z;^y||vfNHWj44eKDI(IyMZ}0HrEx{dQN&S-lyXQd?)iG1gNLtO@29Fu`MHl)+<*8P^%X1{l;*h#u6*^3pSym$5c zor7W3cPDvCU6UYg83o3VUrX)Hy%4=3DBxeAc5<%jF0NIz6)r$OlTAr&E+yCkqXm@L zs!C7+RYFx|*;rOqmxx+9%T`y)uSM7>fwadS|J0#SY!pF)P?3C()Srw(BcnW4V~;=A zKQk%VSO<@6)X-z}|Gs(-YdM2k^zWu=$X;a|4p|&=M1uHz)xW-n?6>!Z*yo4+=tu7n zO@cWI=bRTD<3Q?=Idgz5pH|vm%b87tBRMj``YZ@7T1pZDohXnAf+T#$ph^-D2tEHL zPN?s*JKR1lAxYO&l-xS(MZ$w1bmC;PzzD2X0chwv?MUd+Y;+)1xWf{;jP;pfKQ#BK{S+AGFT zJ}QDGC|wRv5jDv5Un3?rF_NQnSzg~sK*e))`>E*s@_(V?CdR^4{XwzVL=Um9%)y;! zBepmu`^PwZnXhky1nSZ>F6t#krpMzV*(WW06LI(sH@Qpv4Mv#0M=ZS zr)OZ$Q%duUCaFqKJ>_yqtmw+jYm%M2d7GoL}zJTwAQ@ia|ETTyfUM6krJ;TUVsH ziF}c-##deAc=M)Grev3h$B2Pz`MEZc@>kECXC17Ib zAZ5*pyG6hSp2uQWp|mu~wjH`devi(*sn`;-QzOBOHUFW~feTZ`$P)S&msNPipz> zJfhFdIbx4VuaR-L{$?>?lS&o!iW9=+`R(}A}GtQLuggC7ZS zMD?WfA-s$@FpJ+5A1JYE!Dbp-fK{Zl0+lvQ*7ivW+Udm6Sr|WPnkozPmaV>+5B1SXO7&bAM z&5dKK@k}!DN%c+g5ba@)i1TRUhCJp8eowmDN=;VJRI8WZCmE})kz=iO8rcapvYYAl zFvDJ^+s6$1neG5HR59H_W;n!jhb<#hXs~YsU#Zd5H(*oWvZ3#&e9vS*Fw0MUdnpBk zhvv=Bgg!p;;`&Yy5U;TW$qb?%B+6BvOqS&~(MT?(IgOTK!`%7SU^8u)rtR6j3?e<) zNWwm!R*=VO`{*l9p#*CQ8#yYY0d)gEs;6xXn;Xj(#xccsrkcQ@iI$x;2>eJwK$_Nq zId-$YJgNSnsE;hvM;7WM3n2^TA{d9X{DdDNR_O!o+#1i{@Cmn3-um0#>fhe~ zG%mwM4S7zTp6nWS-cv2$o^cxbKJWXWZ>N6H4x|z})@~G>{+%j&VFRWqCoBn8o*C=BrOUuM_tyQRB2Ept;&w0*sp7WgN8W?pt z8V=c};&iYOx|p7EW^-Tt?BbFz6M!h7d2K;G!O<`KeA+fvf%qsO2oiG?&NX;g1iu6wZs^lL35DfDZ%!6w(Zf&EerS z4|yeg1=2pxbrIi2VQa**PcA5%knmp!fX1F~y9n*obj7@J?g}F=TXk3O4isXk&}Xh* z%%0y?h1HZm(9oA-|Jcw!*)K@14_w#_IEtBlg2TW>#SVqv#ToakqP>7>X-4bcMHvd~ zJls&86`Cl@b4@;sMFm^|T7pC}wlu?Hb9i{K!+>f*wbgSOTy&sViDf8yhIu0(hEior zS2{6TBPHH=~m2aA#X4`?rrs~`M*NRjQ+HWUE1{%LM?K6O4tc!%8 zY~-X$fxJaF#7NnP{}#&f0s9M`fcC?r(eVLja9}(~jkICFW{gnxRR4d7L`oBuMh^}|WS+d7Vw$?_QZ6Uo@zatun zh4VRgv#wgL)?3!$o;P|Bwv5d&-73f*@j`af))W&`2i(u|^<4 zr?NnxFa6B`El_L^3kett_(9BX%r6WUCKrmhTO@5t@%a?SsD!}LN+!xJZn~e&EROU+&FjI>?sK-{;l9@Ep<|yGuwM}4KyhE`*VhYuq zd=GJs7!Y%(uB=mw~hI8gL9Mp#pd}i9kW2dF~2xiY<-yDE7%L2(&XwGpu)xK z{mK8#T>U2B9f}$yg-B!sSb~4zhjQuP7Vj`rUy%*^5vkHcxJhbsnJm)}@L4&gpOWaC1QdGx<7RCBTN25zM4)&Hts&5aNluBGzy>k*he zZWD6Fz&RIXzN!U4X4wapuy|9CjFXI>E*WPUzH-Q8F)p5NCpxR zg4S;ss4+d{;0;aRP2w?o34#*wxmkosypz5N!^OV+oHa}e4-S*Yc#xC@Y|DouX~4?S zm99=-Ch1e}5l^E`#J*vvf_$ce_nP7sDW%+QvcG*937Zd_Xt!g&^4DeT-Jamnvi5T0 z&!@aR&zP*$`KkC0HdfIp%;U63xz;tuN<%|pmd-YpE)-}XFO|hv79V4xMOZ`*ML!0F zP;bnQ3|B`%!}z~2Y&h`13m@X(M*#6iKoE&YLNY=~K`PRajtpd?9>S=PEHpqi8ln*z zqY0X#8FG+|=4gSIXoc2jgSKdg_UM3)=!DMbg0AR>?&yJ@$iofjh2DrD9|gD(eb5($ zxC#AmGj74HxDB_XKmLaz+<`lB7w*PA7=VE&#=RJX`%r?x7=ob~hT#~2kr;*17=y7G zhw+$ziI{}@@cJYK+ycnL4#6}*bq@H*bWn|KRv;~gx)QY^!AtiZc?5AWjxe29pfzIEhm@jWallb2yI+xQI)*j4QZ`Yq*YTe1cE$89v7s_!3{C24CYFe2ee!J$}HC z_z6Gb7yOFf@H_s%pZE)Z;~)HsTKtDP#1Kdz1*u3w24qAgWJXrV8rdNGkp0L3pu8%F!PszB)JTGtBB9pwR!hO*>C3={v#=UZ! z7JAw^Pgo&WzoiLZw8VbbGWNT3f|)i<@wgGXDV+Nd!^}|OzUl)Nj+mh)H2C{r@yOQ| zcv_hmIOzt9O%k0x=tRflaoEpGNTxi6Doj(U(io4pO(Vt(QAXW!iTkwELleQ-CEqKa zu)kqLA^mmvx8ti;c{Kua|3vSXxa>n(U9Q#FN07dEsqZD`%M!n1PqNm5XnQscmML#`IK35m?(1mZeM?bo_Ad`2`UB7c)aSrRv6w$ zRm?_S1(@ru1!Obivf%>^Ar1&rPmi^m3P8L}&2&+qzd-~bK^5pcMOuL_sL=8(Bgwp> z$!~b`K@~TT_6?KHzNavxZ?{n8G38FJ1G|r3l7P0ln;|BW_MTT?P(x}sJ4!`TiBu+4 zNQu6_~aIBew$yc ziK*2p267XB`Gc_O!zX;=1SAMakt$7CeOVgF)<_GjwAMyj?FPw?)x&-}98l|2f_hd^ z=pP!}w#Y!m?%n7%+F0X^H_@bFOXX4gQ}(32MX=95YHakaAARSiUSdmvI81lNzmA7X z3NC+JZbb(D*TR-eTV{rWqoV=%e7Q7*ac+#p`? z{4G^bq{LNUd1t6X<1fHbA)&97S=6mw6tWV1t1m*Oe+d9NExgvQ7~Th!C!>mU{JadcP4#VMsuj ziZ0aX4SMujE-Np6zb&#Bc+B1S0g zkSQQzB2Z`){nYm!C=(Pky_g3D)@jYqhARszn4v`&1(+f7icb|kG5SYlU}!3=noG(d zFQySr2%`YoxE4EP@u44g2FJbBW8^yoeYk138uwt!tT}+741xv(7tEP+a|sA>M`ws+ zW0D=y@P|a&UcXeFLl}e^uFwnUvBN?3t#`ykJW(IZ)D8g$lWMV{W52}%9%D<7C^RSW zQ8j&pvAcrn5XP~BAL@gp?86vw)rB3nJ~x|XSuk=iu?CzB%;)MSajr02yPncYi5#fs zckmUp@r4(zSyKK>?;@~T$5V{l%*%|~ji(Wr4ASe?p|sq=XUVsJFeoy~;l^M@Dr0bZ zn~F3vV1kEac+fHYzmY+{)sxgH9{Ed=b1LLWoV#S(g9@10Cd2ZFDqu@g zJ6@xzb6HO4WOaYi{tXPqb(5!!ey5DAWvAo+1L8?=1bN*ek6d(p^W zuiQ_t)PCb`K#6uy1s{l1&Mc2p>CaoID9(*e`PUVyI3D~jW!Jl|KOWYgiGWl+V4g#f9KFP9R){Y;Zu9NK02njmOa#Qv+#$F@0w3xc7#T=L4=CHE6 z?G_!XY>}H&dR|%L5!!eHXMCe3Xb~(*k0f+f%3YeQ{NEs2lZl#DwSyOpu9VIi@>#-+ zmAV1G(ptm>9Vbhth4Hb}3gcpl(DATxI^vw;DB^S5r)!!KFeW!N6DK$MC=e*Xg&DJy!1yPJn|!1RYI6frL>JuhJ$|HzeTBK>Pf{j z8=N~&I;2|Zys>2x#;l8UXe6d@J0q}_`kV)e-a;ru#sE3Cnkcmvl8t5RDHXP2s!W4B z#Y46(7i8n2wx&J%vJO?Fb0Z=;BiJaNx^)8sguN5bTY;&lK?(uCjkOeMjcxUywO4U| z^XYD5(C!5^bB<^`N+oOXCc7NaQm`x!i0+CU`Rlb3465W+0c?A!b{%%=~fPgYn$SbP7bLVqjP&4{L@{ zT1$?<>+2lUC4>|HHOT=2#_0`NKP&XqdMgAN>x9B&`D_9AC-H|#(iO93U5X|Dx6Cl* z#L(t!+bTuE{KadDwjsl$xiS` zzV4=Zh(A#V^D+%MhP?oq()wmi@MdrglH990dw1|$_LCEX%6$W^6D61NU^AkU#4Lx> zz_s;@5(X@{60uGwv3_w^f+Rh(u#{h%H~T3R3AEGFKceoMgA7>1#7!0=vj*g%1`)5N z5q(SjW3Eof8!JNYGIF8mP9#eF3%?539UPK;Y$vf&aoa^>Y4qdWY5^<_!DXo~HZaBg* zmC0cjrw-Ppy*sB4O*_{eAuC)|gSiGxF(}qT@_T;$&J+%eCrK8%SD&Qz0p{$~Qzd}M zNXRy8H~^{co~>?>XY>!a2mv0~#((V*p)x{LgP^fd@N5=HuU=tpQpQi7g@v&udv)?K zRMWn~@IT~52gWZnxpR;c)Tffs*L~bihK?PlAk8bHlvYB;I7E;|sXj+E-#G9tR-w-+ zmIFU6eG#gwNnj^9lK-mM{okstQ)^4fskMWq8-a*$@Ti%o#jvN(dL8qVJ9PI?`y&fqCjY9VX`h_Mrw+1Ia`}0-i!aNIBwaHp zT5xfiMcUs#MOxoJ@pFbum<7;b(Barsat4F+Es}V(!C%rxDUp^pJ&&}#d*bIm%k1O@ z!DA#mRjs&Oqr0TJ*e$4+BN!jzgIi(dh6X5Mj$?lE<+|uxchGmqm@>6W;;63KQSADj z)s7^$Pt>H><1=rS@&`~TA8BWsJ?6qv{lwap4vMwNyfw9oW5a{uVzTfQV{M5o;*j3m z@U!TM%$RT?lj5*@ey5^sCj_>L4h6OaG%iA9B_Fn6gZTSZ z(p!HU@2E+*Wb!93E)Znjt*Cx^rWvD+hB@%)Ng@86I0PM+^P>c8R&xVd3rp+rsW#r) z$J*(-wVDZ{%H(!_8iI0?1Y0xNXJtdb?%88>@R>a37~(d+CqJu<3Rpj8Ugqch}@o3dpi(@SWKg6!6O_N7cfz5zX@iw11@(N@D0Q^lDd$jI!-VI3`O z35DJu1d8=CIZ68mNU^movC<{8WyHY!+PY}4m|k{g-!HCsm!i4UXDrsP zTW*<0K1RV^fMkQF%qT^`$`mk6q#}2p0<2V^nAw~A!XBCX$?uM;epsXBvq$*zr?SSY zmpUEEDtuTpb^>y4n_N==`tP5=;;{>cj$+{hoZl(c=z)`z z@WW#uyXR=Nov5XGW{i3mCNBE+?ejl7t%FEZJDYaJNSDPU!>F}4)wzop3J?F{lyQ*% zR4oiD-SRX0VAe5+IR~VinOQ>AdR6E&)`_vLdBvE+(i#@xQN^0e7ZUYct#U%Vd0Dif z7tODXZ&OPXX!29rVV!04%mU5vg6?xKdJjrwl|sR5`9lm#3lUOk?sQ@K{-nY*deKCe z4uv0N)B7LP^nbsu5&O@yV|s=7`1X1}AwN{nO(W0-uRNL%?aikUC@bY;0@)o%2*mqX znBF2!g6GP7SAuK8nc%$e*b;0LSOT`H(wtxp9I>k-ye~i3EkBk8TCSGK3Tba>z=;C6 z0v)dFddj(;_V%_RqM*Qx5NZ&Y8x+EZP7Rsh#q17)wzLM*HMssG{}xZ{IqGLOZ-iH* z-KM%rq`a}&E$q858mvD-fe!Z+x1zvRSj9W^inwu@^O^YuG_&7@=it0KK6vwTyzxFd zj?-e`B^%H52qwC@|LC!V7~+nnOvG+Tg)h^6tqva-jud0!}b2AZU;OX{@z)fh!r7YO4RNj9Wm~zpsrKIE2aXZ`IgSG^UbXsh1{Gyw z>!xXoV>(;L+<|@vZNuV7k)qU~%d)89>?!j+gzsU~`>W}m=N3)Bzmog0m#gfGVa9qU zBat0uvr4MQ!~}4{{O*rTMY_cTqe;kxzfbbDXdk+$V+I?8BT6>(J)J!cMZDzKA~IT8owSivm*kGFIv#JHyT=*O9oF5P5 ze1iTkyT=q{oXTx$|NMX(%*8*H8=l4M;hr7ggP&EG{Ib!#-^(P#{``fq+D;q0MK70B0!ArMBPhwmA^B%JpO-lj8(=*qq8I3wuk|g2@XAQ zAli?ljM=Ni%9YVA116F2swvg;97RBXF;clPD|BG?x^?v`+QQ zE>b>9ZtHk0>bz)B#njUg7azXFDaupE3F;VZentb~s?%nk%sDfjQk$9>K2Rq)O8~Y2 zxk?|(p?>NY9Irp}XG6y?<72R~Vek2l{88`7$WiYG=UhW092?u*@@FG(EppZ?sm@W* zwL)RDLFyS^uGru{=Cpyli>vA*S2ayxCFqa#5~O`Li-VQjmnycIorW1wgZrIdATCm4 zs{!J#XS1tmXKNN~(h|Ymvp{4z%M-;Lk3QDss~#X1+Hqs_04Af2*LVZ*+2lxw7BdJpEp`th-X>{_{F(i+5z z_u;$rb&WJe_Wu8Og+$E0`@NZnBS)p5A8PjGZ6Kw{jJo&ns&_UdDNj=u&xcLvy|OtjtqFw;|WOXaGA( z&`Vh7vaGkw4!!^WV3x|*umo{)uxIFQuLMji6|1Zdbuz1!UCwo|pDW8le!7bOycOf8 ztN+C_)TlG3e<*^`2NBQf-i1EUoUfA{{_6M6Z3c z{iODX>G7gpwwi}nYqx&8cl+VbODfAM_x`wh=l&16-ZT=k zQ3npbXp?JRY{7h<+Smwon;rRG`JiDxd-xjwL_>82K92I|Fo5yW#JD_EotG zovgM_4w0sRhOLGDy?mqB?68m|N+Li?AV3nWxutbl>Y(XvMOoA_7o}c>L$#o~1?n0F zHC+Bn5SIb>4Unm(LkHx5j4#Cyq_Jh0Vun0b3$_u0$qYPVWWlyjbSZr#=f3OSf_q%pXQVQQzfi*0pAdIFp)^#;m5 zCOu`-OH75O=@(Px3*+Og@zMQF4U5BvSOWvB&5JJSBQ=pQC)Y78n+BSCvNs!ESGE~e>xiEF9a4>YpwfFUuU z-n~V$muw77P-lPMXVJ*gGf!PB?(Undlm_6U2ZMSY_B$!5VJVU9^tzK#Ma4^0dAmje zOV2R(N^N%|LYc?M`9*dGR9lWZo?=GkF#BFifpC-?U-LNp%<$rd*G`T1epv&Fgm& z%~p0*+hptlR*#2mR^vaPUl?(?#aWT-8m-w8_C&cnfV+$+IkbdmF)nR76HAS+dHX|Va7c6{ zE2^gykaRF4&2rt_yGeU%W57g}whmWScYIM))_SDkMQ#N5d4SEoCz92=hnA}5eEUpFx(2V! z!dWkXL+4-O*Nve>@g}Ccg8D-doV*iK(aEe_*@=_l%>215{9e``m-pN7-7}XP{}GwX zsRebm;SrJZN+*8u*yc06f$xP|*!Sc8L zZ4}}98gH&+W}lQuPG)BtPR-eW%E6ZPAEQsPb=jx41h}DVSJJaD)OL419`tmtF|S)I zDH2be;T9D+?B1fHlB$(j^YS6jzQ^6QITu#bYnWeLog156QVtJ8pB&4EgTHpncXzYfY`_&~gZ}g%r=pi_#WwHnUO@I5I&l&YosRJK%)cZkJE1llXA@b-QZFFvYW8@bk z-0M`oKvH_JzbNR3-)*B?c@Q?m$2T$|qotM3j89b5CMGBpiHQnDf@6U>&8Urytz~2~ z?)Ya0<1ZsUo?TkT$|bj$%_=Kq=bFlZ70U5wIzRq>$fyUYC`8QuLV*>>lT%p24oLLF zCn6y|R#6+pVARCM)WrLmGkqcly0Xe`X&_ZSwNGrpi!(C|&!mt+5<*;%lq@UY@0K1I zt`=4PLRF=)Lh&M#;lRD^DV&Jf>L{R-ctT0@sNs9mPvNaFuyVoRLv< zDK}D3Rl^GoOiS|*Bqsacjj`GN;0<+2U~=+5PH{jaqv3|Hn!#vpVSr1*YGu&dhUj6? z8X^weKfCA_4_{F|RL%cPo2+ND!+VPMKh5~PHw*|=kRwYNiAl}LXm4l=D`NBes|)0P z)%mfol51cf#0r`c8IdIlGBbX!G$lchmCWPGk_8DlDV#erAuZmpQ>c*R^D`EpKAy1P z%cVpGgr%oN_}OMpU9Dze1HgQRAKaj@do1r~q>4u9sU&@*R7(WK$C*}gEiCy| z$xq~n5b%=%Dwv}C5g8l23iuWLV*{LA0M&AJ|4C;^!np~%lW@V7f}j6vbcl#mxVDF3 zGYF9E+^lkG3eVz=;X9066mj9MH9z?5p$Ox;xYQ-;DWG%cYicF zQsSE73YKMtFW0Hr@ZzKoo8i;0>Z*thcdLEbOpFl5b`57xs(x?S$^Nsp`PUk|Wg~kD z9-Q+_!1?g}{Nfr;c|SZChtHUpOrV?U9=d1r73may_6Gi9F5ht9F^eC@k+=mlCGrgBN?w3%m&`Xg&B`rdjakR zPFWdi-i|@f%S1`;35MP5jLnfksdrQ)el`?_?CsMqbRIV;@|HrddSUaH_{d1yyfO;~ zzd}6J*}b??DXPph&wBm9>;lkeiG|w${o4?HzVPpvJS{-7a&()-b;uy$< ztt0XkFcbg+4D#49b-y8PEeG^4|9^hpZ1PVfr^r|>xfSrj=CbBkGp{{PdsIq1w&LJM zPLf}0<=4~IPIHh4>qiQQ#3;OT2RLU4Vkmy+oNNqcG4NlR%=45B(|ZO)5iw4ZOHW7? z*I5fCucM2dP~RZiY`~KfyEqA5=1MmuDSR(3v1R`JelcXZ*-XIU$_#c$LpU*_qoaaT zF7g}Rr3@kilYldQ8tZ)-+bUI+NzwND+r1iR;F(6v`)zIo_c7&yiOI<3 zEBXN z77=DUV(V*d3$vlm+d#;`zoq;9Xf(g|ttT|PoE z`3%&8U^oU(z3S~;Dp=062~-ezN1SJn(;ARpJ*@P z2a^a{OTe?d9jSWhx^~h;G6>0DAie%Qpp)~7E;)HDEzRS^lR1SMQyCpy8508x9OVk~83U)Jr{THXNV}(t%4xQXW4HmV zBMwvH#afw+vnq4a^ZggB!j0kFzZwBS@$jHd?yZ~o1|$2#x-0i~9b33)T5;k5RYj{o z_w3|Cd8#78h|WQinnI%K#bM+!8VoBdCC8JReQYSKW~y~md}f;O-XPxsRk}t$?dPfa z?-K_`{>)Kc;{H(GlJV22Ge2fDr{5&3^s)&}4&DfCHi79voMyBN0+XJ zhDO-o+Eiiy#kptOh3ES-Wbs-h8NykPtCQ5kC$h^1@9P(48fSBGXikRmOJz8at->nk z;ZD5GvfM@FTN(j__?mYuSvPgz(!!ycQ4T9|@JhF795cGmF!)o@Rh`$tX1tm|Hdh;E zD;4wS31BgU$2K`RF4Esu#5gIH8Ya$V6DLfRK<$#80N-MOj^G_5)K!^^Sb8S3TtS<2 zNL)RhE{ct$#UJ#}#l+uJjuSJ)3BsJ}IqyUrK{0BwoKNP)4S4cQ3(*(IGI^#*)HX-4 z@-Pc7#>Xx4tEgs%$dk;+=d^3`SbF+=sif64D7w-sCLxHRkJQEyH}I`y=U55JM#039&Wd(mTVI(Um zp9^`DF8*`O9w3n}oQ|ljj+hoEM;rkLhI&LFK9Veqn8suYn3CCy^w~^F`V4hRCiIM% zLC=`QAL{xZynQ>MniJ^Y9$UjX&WIl`nfR&}^S_mCfO#$Otv&HWw3C^WSv2B%8ga*? zFvKGw`G79WhC2^{@$ZlSp;J#_C_DM%%pbdZjTKtso|p-r*z^4JkD%%E_V8N5`ytE} z;s1k)mnC5wG@TPr@9{{Vi%ag47hb(2jL-IJ2*y5GVIXoo+MUt&n!fkr{TBVX(2eid z))xNflZ;b3e9`Yuz}dE=E%NsT)(+0mjJyQB*Pf$y3=^}}QT>fXjm(5Pr$)euP{%=4 zkkH0q)uOG#MMYi7(QorwU>oe{xIK0Il4fnH!Z`EosiO5c%`q`GakbDh+iw}$oKrP4 z_dYc5;GMriX$u@~ywKb279CL&OYz^2&SlQ!&K1sgo$oo{cYZMNVFx*efNvpmn6y-- zc_?UmDh;|ZRA4_n_5empKfwL^qAI3Q4xQc_JUtM{RmXL$Z?kZFNowac>Y()t$L(Yr z5Dd=avv!^~+a|%%1(g8iyE=z|XhLQpNQfT|N7+DE0EK9vWn_C4!i>q0P^vw`fw=94WH!rS>~L z5!C{Sg-b%H<$zNIcs<=cWVNia$Z?(y>`?VULsm}J9)`JMnUK(0C76-!XOT&nwjgKi z@cl(S==E{g<;DT_06nZUX$Ic-Uy7l1_?tllRsLG~_tWvXug8l7KtKRhs4NBm)eiuq zlh00SMQYuYOr%QD$OZAEO7sO!y62$kP~WS&YFbNKIjmyVT5pqGtN-?@O z>DuWMbjiAHx=VVxdVYGDdWZEM>9h2M^_%p&^w$hf10RDVgTn^j8S)GXh7v>C4uvzq z5|N#J3s>aQC&ePjF{zaYG9NebCko@CD8#lDmuBfNbtNth)>-ve-BovJq(<%NSXX+~ zhra2r_G+H8TC7g3RFBr_Exm1QTie6_t=aM|V9#24>$g?fYH9^q8TOj{n^Vja&Bf*g z=2hnH<_F9_pwy^vR0669HGx_{EuvOX0~TTnTMLqfz~T#wdluss4=sFXW3&aDie{rT z(Aj7?x&mE~Zbf&a2hm@kC(v`~E%X!y#q7k`V}dc^7zQQ*la7&L8Zd2`!xU&_Sm-HK&i9e(ChNCf6Wn0FDA6%CXZ3L%DmK zCh#^&6pKKHBoZAo6Q{l~>hXbDuAqJOMVLZSE9hG2ImsNKR-2x%>WFc-Tne9?t8bdg zajDdR%^lSKvWvt#Ykr=WyCz$5C6|6@8{y3pLgBZSlp8&io>s0)npYU_$kRFc+>XWR z^1xD88}+M+!wsGvYAR5e)S4}AZKhd=tP)*&A-7KW3>L-Zens1@ttzamI!dsQ{?rQS z&j-I3TA8YsiPS?{6qUdsfRxwn9K(!{*{*>xPQ2Jqo|xhQ%HjEV++WAyb z1|kd+c*-g|fERv!3r$+hr(*H>xxznZE~#=2soAV9g@ol~&8cDPbd8@UcBKSO7a7n_ z(yPX*iRZAky*)Oa4x}k0#Dl09MErn9^}h-?WfCvQ6GVk1LMajzxpuw+h2W%p3|tEJ z^H(VN_{m1uYA@v+)B6!PF_jMjdVP@QrTY`%mXt!B0L z%14*977eRf_58S%CG_|o%icK$!JMv~rU5f$I$Gr52quO&4G&F~`!lXq4>wbDwKD#GI_Q@Cu1OOXQ!gmiDNRAg0!m??VDmt+L8kj(}**&02 zO(YkYmT8WkBSmQ{3isR)A0u=MW)z(L!Wa>-I`}zfPeF}}(QQ3qLRomky)h+tMTlAq zH#3DrfuhuyfQ9WIQEd)L%GHUy(n?FcD>I`7%aekZ1LY$cE!MY1g%G0E6wH5@?=XGJ zdLrU8gft;?ons5GbdZC`1Gz$-t_eR#e%Ux5IDCPFf0sp3$e?0Tt0i1WITRnLZQRid z=4YvB5|OY8hQ*iKmR5*8h6`~~&??1<%TH!7oP<$B7_Wc?b(bZnBsfT5;i2ggCkKALsZhtiBiR|++?E>R!zpGRk#u{?B z7-YttSlA_wVT9`HRuudCc*feeK09u;3zVrc3C=_kNR7C+Dq6r|=42DG<)rp-vBbe* zm$3vakcc;AG%;y&n5}2+juh_=+-*4VoJnxpl`Kv7qLv_x&Ciu7- z4}}|4+K7(!&9`)r4Ewwhp6zc%JE9fZ@_{2%VrWzO1*K8_m;e1;oR+v|p&my-FpDT|@&lY&$ge`R8OS^ia>SR|g#bMNmX+uJY%#e{}S* zbcr4de)N7)jZQk4&HvLM_FfcfRm&AvA?*1_%Y8o2Ise}D9}L0H?rvR^U9ak>WzoEM z(!%TB^-NacS(y$P^n~tzGNAAiu_F2itVEi=$g`&n=4vqa+Pr|n6*HU4$6lQ7bksSb@ zNgFMV*0q6okYA!a#>JvX7~H>|VWAot2eF zG*yLBVu_h+i_6trfu?nCYDuor$xyAO?p!Ieo`{>xC?wr#N%iP_1Sqz|WHI@bH4Os4 zdWVU*^!RMWpU$mR5V&fZ+z7v3jYC8YOWiCR2}q)^ zN-Vz~J1FBP@Ax-^&MkWTy@L9MMr`_Ch5t)vYt5?ub8bXhtCGcd9F1V%xD3kB+w-1v z4ysYZxip{1Hkmw->-LjkyRr8p@6mefcnreY~E&M z5-#?WRbN z#h>r_5%CR5g{+ah@swzxz7 zE-NSIVY@kt^Dt(SZrfI*6dtVRJr$>n4Fr5WL;_{k4(}xbpA?-E)&aNvVHd-(d7Up^Q<2LxlH zcYNb-{}jAqsEu*bXL<~;``h;S4$n}fZU4|02e$Le!az5Z+J3B6=61h{PnvzK_+~|e z#zVH4Xst>P0n;EX-_uca1V34>c`iL?7(X4nAJl3;eGQBxCJ*}Nd_kM_@LX>%@&Agh zE$+nh3D|x;{P^K`gd}kI;e4m}Zyk*KWygT4@79lXliYFvn$sfc{LjJ?GO{cEPd?h{ zpWYCao{<^bbj1GkPETue0eWvwevP~FCiWSY870zGg=Xclw#SQeO%+anQhMS~#7fSrZM(_~NF-@HW(%&K{UA%R*n9J!>G`z;>nzOQUVc zahjrHN{SOvn@&4@lcyF}x*87tFwV{U=WpDXwvX<7l&(C~VK7#i6{MLU^9|ne;5p_F zeFk-mQ6IxG_1^R34IJvbQCPxffC-4jGn6SmJKyj8<#J#qu|UI`RPj%ENmRUBB8DHS zareo7`39bKqjONUuJik8hSt?zxOd$BwC;!s>)>D>z)+>~VKBwexmaL{Rl9msle&ee zfBp__pT#FGOZ6FxxB27L+U4_x`o^aXH>sO)qnOjt5cBo?m#$L9=or=Og|c+zY#!Bq zo8>;!+e`HC&RKa;&Rz523;57`y|hQDd1+J+92o=^<qa}{e0VQq$bwR8;K!w zrlMUhmDr!XHEaFGVsBr$6re!&f2pI5jeBr|T`rZ%QE=8!Pub+CyqD2X7!nLok;x5#I09bdZbXDm`6lkK7&_FR^o+uX~5)y=dkF68n#o{fCh4WKjwK7@}b8 zZ!-4$)W84kV_Shidr`k?t##X6qsBUQXQ$rc!T6;GC!&!pf@*1w{BnARx% z|2SGb;IiJTN zIbR0YPuH1N4^JU*^@vkNoCt1OOCo6t?+MzR+uXi6iK7O3!*(9f^KWKNi6-}QUS%aN zC1i?KpU;x8IUwF7bzt(Us^>Bp?_pmCy@dy9Pi-B*t8J|$fnY`XdJ41p{#F?Uju1UD zp-4EkioybUDjROwdE3%tzR?*#N36D#iD_MNL4SvZ5(UN^?IE-2+Cf(GusT|XiI(O> z+hOdHFJ~z-ip~R-bKZrR8aXxUbk|JGwnEhkSLmbPq!SuZOsdl*D--G8kIl$33iLBt zxFFAfk&UVRY1=?&+SsNWtY)fCS@E_+GE1AcuBzcHW7-F{31eDIlp=R!mj=GfGFhk- zWNg;3i9rzhrL$#K=exSy&iFBAg@AWM*! zGigtjZCY3dx>1wOg9@XQ*Y#TYwf0wJZzRO5He^K|S zMu^4u>f=`G`kZ0{1C#n0kkwjg@**WXjB( zf{x;N;#>9J8Qd4)@cWSUhQWocJ|adEfL}Uipr)^^g!S&VwrmZ}Azc|pJYq9TCGS^fG zZd&7LS6x?!-{zk_Z4c!R1ROm95qrcD@=d`(Q|PZ%oo+eOGp^ZI1KZ1oCmJ7o8pM-U zl-s&~zt)tfnd#edbUv`=u|HjLc>9>ro_R;^j_SRqw)?vI{A_Z#Bc&T#{B`N>_e)oo zp7vm1b6@D6D3x2X=i`wi<>(@jAM`ZMKFdA6k1NG`bRHE)bol1ci$ARvT@Oc$hwcY!T78RYwskc^^z# zU`y?rx=a@A;Om?PGwngP6Az@kqcvYnyD9imQbOw~Lv|RNs08=8`3)JWaZtZHA`V8% zZb9qkwRqlITE!12w}7-z>T%~ePp)rvuC5lEYM2%%oDt7@cZ}#2e~?n9ODn+~YEeVZ zweae?4ik(t9)KHoBqNhPYX;e9+x259tavViQ}!YyzLz;3R~5OKXvAJTE_hD1(Gd$h zNBao{N#ujqN{v|m)Xr)>d%@ZHY`V{bC(6@8|8PuPFpf|k?g`KRCp`N1-bts^eJ3a& zR5GUm;kvUC*1r|V`$3XE`>pvm=VK&jGq|Iq)|%`YeFW0%NO#S|lzYlKGv&p&*#Sz7 z1^g`{uU1W9aOB!aPy4j@EnYG`?2 zgxo$)S>l;(^Oo(JYy#!fZ_&I7i zxn`^9D?hSdM-&|e_8(Ub8;@#MQQdaLpp^1m@K2pu&%=*1sun%BygLJ@HfY1eNg!Wh zabLWBFI7FV*^h3rAMB#Qz{yEpUrc}Ctz>obP+fQarkzg}{Wxxn_)280+|BRMJ-#o| zM3YPYIse)aT``?Ytm-Q)$gYxPsUYt2dY>f}JZDv8&Yb4ym5oR`>vdv2O{5XbZPf^8 zXiKtvg~!@W)s^8VXtVY3+z(Zfu&>X1>>_guu^q~Ew9e8~|2T@X_^&s0HjQ|}(W4vV^(gd2j&^#KfA1OU z!1HL%`IN8KgJY{epj2v+DC09@@p}L0QjJU*Ar3O0cVd86RYl3F^absuA++B|9aGjR zr}fpaeJagipPo->RJHV(@wPW6H3FUGV`bze()HO!F>l;ZV!K);yN-k=P){JZ}(4jRE)bkl6?{rRMovtx;@D@C5RtamlwI~FihZn zsO&h)roVsnQ43GpT}CMzcqQWCC^K%~T3>(({cq@I-HZng{-ZoDvF%ll`vW%5j;Unq6J694ZbGAfb=wDt%7>q`%SI z3U$o*X}(;&2W3UZvax=LSYx*yN=_GySl64=dtc81zeuuy5n0*YquVs-v*^p;%$b2_N<<&=Hwg3lK6-}9ty zBhWjIY14-)1dP>mZao-Q1JTEpST{}R+K;z0D*a-q_rhUjt3XmpT0U~#T-zVP1w z6DgKuXk<={;pnk))E5&pZghs}B#C;?oyYfGGwSgK&UpOpp5c1~HMtx!#gfc;Yr>{% zP~;m&pNv?ROFh}O4wGbO8?fW)CiA5F$w-7EH^eZJq-xo^Ty_xueYciz^*Zl^atAi$ zd?w)?n!v+#UC<&9?akh6Ogw1+ut45dBSS5$TFEGfkRDdCqGw?!8}2@ZJ2t7W(_Wm^ zmG@2#5k|ALyf{TB#tX!ZU?Fhb*)&aLR%rMH%zV+73%b14z;7;47EY$I6=4zluR>t% zNBM1;m4ifv`Jw(3=U{nDlLc;RX<8~v5)Q}mdEZnd#(0?<+C?*S5MS!(c_x#haW!rS z!7Yy$Z)Pgf{c4%W!?_&qy&a=hMw=4DJXGWIi5s>ZdM)l%yYrk z_>t#Ue1P_cjyeK|%KL+a&klx<&{X=BT+hjN{q^g%lynW|Or@3KEBWC*Q-W zN$|5B@;mhJ{0C@`-5;0;us-^AQ9_6$JWUO|)^-maa>-e?*f}%|{E%zx;IEF=sVqE9@~B zfOrd{YQ6!;nUbq3QUc*#PnhXXo@mRSa)*_gZWL69^Q?95Y-f?9HJ9`Kq4b0(?H#$P z1Klp5*O(-pi+SAlFXcOq3X)Icw?sizHFzE;oD%A@dCQjiH!vYOr|4 z7);nN=;Nh#ke+_pb!Yy;nV*L4-5LB&oubJi#szcp^V;h*0|U?Gavno@cK5iyj$R-W z**GilzOQGN_TE?Q!RuOoMrq-FG_rZL3OdQ!DZi$Os~hJbyj|(AK_KVtioj}P6Nm`WEiAsCUx7u!i zoqa#aQk5ul+{8pO%TJkocCa^-NV2f5|LXWTEPsua4E0OpN*cOuciXrrbm4WnKZnj$xi^A6_>>Hd7Kh9iP9pFwrQL^{+of?+iz+jF->WxB z78fp8UTH#F9bfOjT86L*uDwZLa?e#){k%Y+3$x(5vHaU`1q}Tm{HyCL>NiK<|L5x# zs!B8o&Pb2lRq;fi8Fi;AS_-Q9@^0p1TuK#>tTyjgWPU*CEX>|Zw=UQCt7Q8QQytrO z6KfPfRr~(&JfcBTA>_?C&r}h7zFb@n6D_Q4jb&9#OuLd2pgwA6&$VwTvl$Eu<9IT~ zo%{D4sv4{)A-c`lSJ^D@Jgde;Lxi_l&Wa8qO^W&riCS@g?lNw=`Qk+4y=rURmn#e; zK?cB0N*;U|0*jEch`zLNb9V){%*umTBEZ886wGO!Izj(k^@$)4ilbP0ZogY+5_n5p z+)*D3cGk$8PG7}Cdi9Xo1CilCZo{0FG5L{RFsDZK@%ud+ynU?;`Rc0nuhs7n*p+NMdp6ZQC223pUZoZ1%!b^m`!zDCj}X?>F;t zxeXltM2!D2=g$<3&>ub~^dAHT9#5{md8={!+KP?-ZEf@2k6SNlf@BoT{@@8%wSVgP z5o>5zuRo6SY^d~^Gtz;OXuTzxlAg5gae~beTtx>bwulpbxl8?I>&cxij)EVUR&=?x zzWHq2)x1+4qEg3Pm7WSy=)(RIAeJUA-cYJ+35cPqqA#stN5d%;-brCOQEW)4cc2_GfS8;_^ZB)&yNm~u5rvht zD4NZDBM;v-Fv-!3H8j2u`kzKvwL_)Jwtly<@XlF!0nIlR^Kx{tz^JhIJ?x8IUP5rW zjf<&;eSxN>XD_8TH3Si15#{xW2&Yp}al&Xzr6Hv-{%xL^{OJN9QYM~j#%`P|T%|}M z>J#w9^eA=?4(_!)20E|F>zsfIRpk;QsBWv(3sstb%zw}Aaqqv3<+fH~tJ2B0y zqFpfAcqgpnDxMz}Z2G}<_k|=oy&*BC`j>*|%gz-Zi8IQG2K-x6h?1IYCIvk{<(~nn zy0*}bU-+fdi!5=Hon`?eZm_rDy2jnVc;b5^|D-;{MQD)x@&tZWY$g<2&OTasE6vV~ z8~(5(m(`cE?Sn=ZK-jyw#v!fE6~T@qb6Ne zDxhTKF*oc8o$*(ya5&-7#Y=2mVY)OHaH zX@NMF4?M&cr|S?hq^a)M5mpS}9V!7aD(p330|k+M}y9SvL9 z!-9ex+i>uyOQPu7jxWdgV)C2JJ;8MNs_N;#pH|qUj$0c`<6w+<$GC_bOw^^4~Txp)npz5HjxQLjj*tOVhvCcjVGr?O{{uMs}~TwK)z=aO6wW>gDddlsc~chZ`rW z=8WZ^cVF}m%t8|Vf7AX!Y<7k7&MomY%}5JY>_|v?Y%t_9f}i%;r+(_<%#6xSg`QJR zdnuNH#$55WDGEo?j?QRBSI%BiadL3X8-gs#33vN2Nxu7|ZaoeKN9`My`P=7%!#6pG z+}NbJM80~fjyv!a(WMWp_GqY_N~68M9#Uw6@iJESUANC+X?`}}my|5mcgt*~QUv)8 z8XTB%V5+0(VI!0xJBH|+=oP5F<;`+T_H0-Zuz5xF9hZAD$hDv#L zp=g`>q*4z`bIwaSf0*OMty}i{lTRZFa>a=}*LE#>0`}~DgsNCqq|utv*~@NH&O-trn-d?ktvfQu~1O6MuUNC(=3-Kypl4L+xd5epDe5Sd2>!xlaW&@6fqGU&}f z1CN;$>?r4eiNQCq$$6{?)8pD^Rgygap7?M|64VV}klw83w3RRz(b!wmTp5`0v44J) zl7AaQ3I0f=VUd~|$wHEhc}K;)?-*9-jFE#$1HRXjmwF-Gt&+| zoB&bCoI@eZjx;5@>R@=-Rz~Tg@c}Fh#(HQ}2BPZ#rlcl63OhE|1yy+e&VayFH{!Xe zo7WI+#{|xBT{)L>e`daA!IaH0+gYYMnUHQyG2ifkrH9u-(i#F4;VBKnD0IuC0O+~+ zEn7Gcn-pJtjI_h$+mfD`)>eHqlep66{xzV4)oYd0T@C^yl*QrzEB*_*_<&$b6>_SF z1grmUbN~oF59xzOGCU1p_YRs(=rx8_&wO}%p{qUX8W%swkN}`lPU}%vJU#ZHT3IJx z&!F3RArtSYe{G%VYvNlr)eFgKfpsbnlgt``w;8&qB=a30rUozx$C7*?mRO_0#;T~u z_-+X`4I#IIuT_UsW_S?pxhr*X_J{CpN)Qs7EY(!F{aJHO=+u)-WKHCW37ll57z~fVJnbdR`Kllth z>^=(tH+{BJcvSk5B=cGh=?7ntsoz&+De^U8Jl`anzi*b#T3O=nhJXyAZ25BJO6MkA z3AubiWI3eLtkz5lb2vB|i4Ec)?TQP@%)n4YQIW>h`4&$s$!ubBW`de7uoP%o-`f5L zj`WT+IG&NqpGR?lRQV)RMeaQA3KVJj=H|#J;vpVIEYs=ffvx5HvU6m^^5zcD)78pV z129F36V))C^>pnV>#T)ZHk8Wmm1BAFw1*!R2uPojM5A?(sile(Nnw(-oM<*+IVLPv zAX6d|YobsJmDDOtmPk#^l2nN_LN`+uWP=lx@x-5_*QZfg0ZzM-#{ntkq?*^wj=eMv zzUC<1bvNDO#F-0Mx7~5qy%D;-`FmvWa^C|YkMvk@49@qw$L{vVJ@$my20#7+1o~Ex zu#Kf<$|f@+97T=@--xv2A4-TEcXPZPk$6A)$rjlfYTyNh7Mef`6^+=HsG=z|*w8dzqc*MD)e-nAU5U{tREMWt zdgi%T#e3D&{Pd!9&GkTSGgS&1F*_t@RT6<=@CU{U&c@J?gA4OenKn zL8o%USmfw47o+ zWbjSgBpERJqHn>}?{`OKK=+5jBj3!8ZaMU{`~=YdsjFWi?j9)Cz<~aStaP~y8qC#f z`lH(JYufg1t~mWb$l6Ix^FeWU+J?dKnVS-+bk>x!XCb4_+RcFB-UJ0}q$Gky^TJod zqmvQT;kt||39qBYdiD-g3x*JvX_c)+wUN;Qp=e&_S_kr?I vHGTYtQeSD*Z7MFz)l}pN#|t4r#9qfVWnOP^;?KG~|Js~im7eo&;4}dMEb^A; diff --git a/web-interface/public/logo192.png b/web-interface/public/logo192.png deleted file mode 100644 index 51ffbf36b4f75a4b32b3f2e619396a3f2a6430c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13841 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 F{{iqwvS|PS diff --git a/web-interface/public/logo512.png b/web-interface/public/logo512.png deleted file mode 100644 index b3bf8bbadf5d03ff07e2dcdba3174999253854df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41025 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

GlY;rU&kOIi~nsbIDAvX(qxtWO8t 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

e%jvzRDq_Ypb2#C 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

    I8cF@^VU)ZOwRP%S2 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 N4OLy03MH$s{{sZ9@b>@! diff --git a/web-interface/src/api.ts b/web-interface/src/api.ts deleted file mode 100644 index ddfeda9..0000000 --- a/web-interface/src/api.ts +++ /dev/null @@ -1,331 +0,0 @@ -import type { Member } from '#/auth.tsx' - -export type Compute = 'cpu' | 'nvidia' | 'tenstorrent' - -export type Job = { - id: string - name: string - created: string - job_state: 'Scheduled' | 'InProgress' | 'Success' | 'Failure' | 'Cancelled' - accelerator: Compute - device_count: number - image: string - cpu: string - memory: string - node?: string - exit_code?: number - message?: string - checkpoint_directory: string - output_directory?: string - working_directory?: string - timeout_seconds?: number - team_id?: string - creator_id?: string - creator_name?: string - storage_scope?: string - can_cancel?: boolean -} - -export type Submission = { - name?: string - dataset_id?: string - type: 'command' | 'training-smoke' - accelerator: Compute - device_count?: number - script?: string - script_name?: string - image?: string - cpu?: string - memory?: string - timeout_seconds?: number - command?: string[] - args?: string[] - env?: Record - working_directory?: string - storage_scope?: string - tt_runtime?: 'host' | 'container' -} - -export type MachineHardware = { - name: string - address: string - ready: boolean - schedulable: boolean - cpu_allocatable: string - memory_allocatable: string -} - -export type AcceleratorPool = { - accelerator: Exclude - node: string - unit: string - total: number - allocated: number - available: number | null - ready: boolean - chips_per_device?: number - message?: string -} - -export type HardwareSnapshot = { - observed_at: string - machines: MachineHardware[] - pools: AcceleratorPool[] -} - -export type ImageCatalog = { - self_service?: boolean - teams_enabled?: boolean - registries?: string[] - images: { reference: string; accelerators: Compute[] }[] - profiles: { - accelerator: Compute - default_image: string - device_unit: string - max_devices: number - note?: string - }[] -} - -const base = (import.meta.env.VITE_API_URL ?? '/api').replace(/\/$/, '') -let activeTeam = '' -export function setActiveTeam(id: string) { - activeTeam = id -} -function teamQuery(): Record { - return activeTeam ? { team_id: activeTeam } : {} -} - -async function request(path: string, options?: RequestInit): Promise { - const requestTeam = activeTeam - const response = await fetch(`${base}${path}`, { - ...options, - headers: { - 'Content-Type': 'application/json', - ...(requestTeam ? { 'X-Mist-Team': requestTeam } : {}), - ...options?.headers, - }, - }) - if (response.status === 401 && path !== '/session') - window.dispatchEvent(new Event('mist:sign-in-required')) - if ( - response.status === 403 && - requestTeam && - (!options?.method || options.method === 'GET') && - !path.startsWith('/teams') - ) - window.dispatchEvent( - new CustomEvent('mist:workspace-access-revoked', { detail: requestTeam }), - ) - let body - try { - body = await response.json() - } catch { - throw new Error( - `Mist API returned HTTP ${response.status}. Check the API connection.`, - ) - } - if (!response.ok) - throw new Error(body.error ?? `Request failed (${response.status})`) - return body as T -} - -export const jobsAPI = { - session: (signal?: AbortSignal) => - request<{ enabled: boolean; user: Member | null }>('/session', { signal }), - list: (signal?: AbortSignal) => - request<{ jobs: Job[]; count: number }>('/jobs', { signal }), - hardware: (signal?: AbortSignal) => - request('/hardware', { signal }), - images: (signal?: AbortSignal) => - request('/images', { signal }), - submit: (submission: Submission) => - request<{ job_id: string; job: Job }>('/jobs', { - method: 'POST', - body: JSON.stringify(submission), - }), - cancel: (id: string) => - request(`/jobs/${encodeURIComponent(id)}/cancel`, { method: 'POST' }), - logs: (id: string, signal?: AbortSignal) => - request<{ logs: string }>(`/jobs/${encodeURIComponent(id)}/logs`, { - signal, - }), -} - -export type Dataset = { - id: string - name: string - filename: string - size: number - files: number - sha256: string - created: string - state: string - team_id?: string - team_name?: string - scope?: string - member_name?: string - shared?: boolean -} -export type ResultFile = { path: string; size: number; modified: string } -export const storageAPI = { - list: (signal?: AbortSignal) => - request<{ datasets: Dataset[]; upload_limit_bytes: number }>('/datasets', { - signal, - }), - info: (signal?: AbortSignal) => - request<{ - enabled: boolean - capacity_bytes: number - available_bytes: number - model_capacity_bytes?: number - model_available_bytes?: number - storage_mode?: 'shared-folders' - storage_limits_enforced?: boolean - dataset_used_bytes?: number - model_used_bytes?: number - usage_observed_at?: string - usage_stale?: boolean - storage_low?: boolean - dataset_allocation_gib?: number - model_allocation_gib?: number - upload_limit_bytes: number - }>('/storage', { signal }), - remove: (id: string) => - request(`/datasets/${encodeURIComponent(id)}`, { method: 'DELETE' }), - files: (id: string, signal?: AbortSignal) => - request<{ files: ResultFile[] }>(`/jobs/${encodeURIComponent(id)}/files`, { - signal, - }), - downloadURL: (id: string, path: string) => - `${base}/jobs/${encodeURIComponent(id)}/files/download?${new URLSearchParams({ path, ...teamQuery() })}`, - datasetFiles: (id: string, signal?: AbortSignal) => - request<{ files: ResultFile[] }>( - `/datasets/${encodeURIComponent(id)}/files`, - { signal }, - ), - datasetDownloadURL: (id: string, path: string) => - `${base}/datasets/${encodeURIComponent(id)}/files/download?${new URLSearchParams({ path, ...teamQuery() })}`, - folders: (signal?: AbortSignal) => - request<{ folders: StorageFolder[] }>('/storage/folders', { signal }), - folderFiles: (folder: StorageFolder, signal?: AbortSignal) => - request<{ files: ResultFile[] }>( - `/storage/files?${new URLSearchParams({ source_team: folder.team_id, scope: folder.scope })}`, - { signal }, - ), - folderDownloadURL: (folder: StorageFolder, path: string) => - `${base}/storage/files?${new URLSearchParams({ source_team: folder.team_id, scope: folder.scope, path, download: 'true', ...teamQuery() })}`, - upload: ( - file: File, - name: string, - zip: boolean, - progress: (value: number) => void, - scope?: string, - signal?: AbortSignal, - ) => - new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest() - const abort = () => xhr.abort() - if (signal?.aborted) { - reject(new Error('Upload cancelled')) - return - } - signal?.addEventListener('abort', abort, { once: true }) - xhr.onloadend = () => signal?.removeEventListener('abort', abort) - xhr.onabort = () => reject(new Error('Upload cancelled')) - xhr.open( - 'POST', - `${base}/datasets?${new URLSearchParams({ filename: file.name, name, ...(scope ? { scope } : {}), ...(zip ? { format: 'zip' } : {}) })}`, - ) - xhr.timeout = 24 * 60 * 60 * 1000 - if (activeTeam) xhr.setRequestHeader('X-Mist-Team', activeTeam) - xhr.upload.onprogress = (e) => { - if (e.lengthComputable) progress(Math.round((100 * e.loaded) / e.total)) - } - xhr.onerror = () => reject(new Error('Upload connection failed')) - xhr.ontimeout = () => reject(new Error('Upload timed out')) - xhr.onload = () => { - if (xhr.status === 401) - window.dispatchEvent(new Event('mist:sign-in-required')) - try { - const body = JSON.parse(xhr.responseText) - if (xhr.status >= 200 && xhr.status < 300) resolve(body) - else reject(new Error(body.error ?? `Upload failed (${xhr.status})`)) - } catch { - reject(new Error('Invalid upload response')) - } - } - xhr.send(file) - }), -} - -export type TeamPolicy = { - cpu: string - memory: string - nvidia: number - tenstorrent: number - concurrent: number - queued: number - storage_gib: number - model_storage_gib: number - runtime_seconds: number - registries: string[] -} -export type TeamMember = { - id: string - name: string - email: string - common_writer: boolean -} -export type StorageGrant = { id: string; target_team: string; scope: string } -export type Team = { - id: string - name: string - disabled: boolean - policy: TeamPolicy - members: TeamMember[] - grants: StorageGrant[] -} -export type StorageFolder = { - team_id: string - team_name: string - scope: string - name: string - shared: boolean - writable: boolean -} -export const teamsAPI = { - list: (signal?: AbortSignal) => - request<{ teams: Team[]; storage_budget_gib: number }>('/teams', { - signal, - }), - create: (name: string, storage_gib = 200, model_storage_gib = 500) => - request('/teams', { - method: 'POST', - body: JSON.stringify({ name, storage_gib, model_storage_gib }), - }), - update: ( - id: string, - change: { name?: string; disabled?: boolean; policy?: TeamPolicy }, - ) => - request(`/teams/${id}`, { - method: 'PATCH', - body: JSON.stringify(change), - }), - enroll: (id: string, user_id: string, common_writer: boolean) => - request(`/teams/${id}/members`, { - method: 'POST', - body: JSON.stringify({ user_id, common_writer }), - }), - removeMember: (id: string, user: string) => - request(`/teams/${id}/members/${encodeURIComponent(user)}`, { - method: 'DELETE', - }), - grant: (id: string, target_team: string, scope: string) => - request(`/teams/${id}/grants`, { - method: 'POST', - body: JSON.stringify({ target_team, scope }), - }), - revoke: (id: string, grant: string) => - request(`/teams/${id}/grants/${grant}`, { method: 'DELETE' }), -} diff --git a/web-interface/src/auth.tsx b/web-interface/src/auth.tsx deleted file mode 100644 index 546b417..0000000 --- a/web-interface/src/auth.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { createContext, useContext, useState, useEffect } from 'react' -import type { ReactNode } from 'react' -import { createAuthClient } from 'better-auth/react' -import { adminClient } from 'better-auth/client/plugins' -import { jobsAPI } from '#/api.ts' -import { errorMessage, usePolling } from '#/hooks/usePolling.ts' -import { BackendConnectionError } from '#/components/BackendConnectionError.tsx' - -export const authClient = createAuthClient({ - basePath: '/auth', - plugins: [adminClient()], -}) -export type Member = { - id: string - name: string - email: string - role: string -} -const AccountContext = createContext<{ - user: Member | null - enabled: boolean - refresh: () => void -}>({ user: null, enabled: false, refresh: () => {} }) -export const useAccount = () => useContext(AccountContext) - -function Login({ refresh }: { refresh: () => void }) { - const [email, setEmail] = useState('') - const [password, setPassword] = useState('') - const [error, setError] = useState('') - const [busy, setBusy] = useState(false) - return ( -

    -

    MIST / RESEARCH COMPUTE

    -

    Sign in to Mist

    -

    - Run jobs on the team’s compute machines. Ask a Mist administrator for an - account. -

    -
    { - e.preventDefault() - setBusy(true) - setError('') - try { - const result = await authClient.signIn.email({ email, password }) - if (result.error) throw new Error(result.error.message) - setPassword('') - refresh() - } catch (err) { - setError(errorMessage(err)) - } finally { - setBusy(false) - } - }} - > -
    - - setEmail(e.target.value)} - /> -
    -
    - - setPassword(e.target.value)} - /> -
    - {error && ( -

    - {error} -

    - )} - -
    -
    - ) -} -export function AccountGate({ children }: { children: ReactNode }) { - const session = usePolling(jobsAPI.session, 60000) - useEffect(() => { - window.addEventListener('mist:sign-in-required', session.refresh) - return () => - window.removeEventListener('mist:sign-in-required', session.refresh) - }, [session.refresh]) - if (session.loading && !session.data) - return ( -

    - Loading account… -

    - ) - if (session.error) - return ( - - ) - if (session.data?.enabled && !session.data.user) - return - return ( - - {children} - - ) -} diff --git a/web-interface/src/components/AccountPage.tsx b/web-interface/src/components/AccountPage.tsx deleted file mode 100644 index 466cdd8..0000000 --- a/web-interface/src/components/AccountPage.tsx +++ /dev/null @@ -1,428 +0,0 @@ -import { Picker } from '#/components/Picker.tsx' -import { Modal } from '#/components/Modal.tsx' -import { Tabs } from '#/components/Tabs.tsx' -import { useState } from 'react' -import { Users, KeyRound, Plus, Search } from 'lucide-react' -import { PanelHeading } from '#/components/Card.tsx' -import { authClient, useAccount } from '#/auth.tsx' -import { errorMessage, usePolling } from '#/hooks/usePolling.ts' - -const field = 'border rounded p-2 w-full' -function PasswordReset({ - users, - initialUserId = '', -}: { - initialUserId?: string - users: { id: string; name: string; email: string }[] -}) { - const [userId, setUserId] = useState(initialUserId) - const [password, setPassword] = useState('') - const [message, setMessage] = useState('') - const [busy, setBusy] = useState(false) - return ( -
    { - e.preventDefault() - setBusy(true) - setMessage('') - try { - const reset = await authClient.admin.setUserPassword({ - userId, - newPassword: password, - }) - if (reset.error) throw new Error(reset.error.message) - const revoke = await authClient.admin.revokeUserSessions({ userId }) - if (revoke.error) - throw new Error( - `Password changed; session revocation needs retry: ${revoke.error.message}`, - ) - setPassword('') - setMessage( - 'Password reset and existing sessions signed out. Share the new password privately.', - ) - } catch (err) { - setMessage(errorMessage(err)) - } finally { - setBusy(false) - } - }} - > -
    - - setUserId(e.target.value)} - > - - {users.map((u) => ( - - ))} - -
    -
    - - setPassword(e.target.value)} - /> -
    - - {message &&

    {message}

    } -
    - ) -} -async function listMembers() { - const result = await authClient.admin.listUsers({ query: { limit: 1000 } }) - if (result.error) throw new Error(result.error.message) - return result.data -} -function Members() { - const members = usePolling(listMembers, 30000) - const [name, setName] = useState(''), - [email, setEmail] = useState(''), - [password, setPassword] = useState(''), - [error, setError] = useState(''), - [busy, setBusy] = useState(false) - const [creating, setCreating] = useState(false) - const [resetUser, setResetUser] = useState(null) - const [search, setSearch] = useState('') - const [page, setPage] = useState(1) - const filtered = (members.data?.users ?? []).filter((member) => - `${member.name} ${member.email}` - .toLowerCase() - .includes(search.toLowerCase()), - ) - const totalPages = Math.max(1, Math.ceil(filtered.length / 10)) - const currentPage = Math.min(page, totalPages) - const visibleMembers = filtered.slice( - (currentPage - 1) * 10, - currentPage * 10, - ) - function closeCreate() { - setCreating(false) - setName('') - setEmail('') - setPassword('') - setError('') - } - return ( -
    - } - action={ - - } - /> - {creating && ( - -
    { - e.preventDefault() - setBusy(true) - setError('') - try { - const result = await authClient.admin.createUser({ - name, - email, - password, - role: 'user', - }) - if (result.error) throw new Error(result.error.message) - setName('') - setEmail('') - setPassword('') - members.refresh() - setCreating(false) - } catch (err) { - setError(errorMessage(err)) - } finally { - setBusy(false) - } - }} - > -
    - - setName(e.target.value)} - /> -
    -
    - - setEmail(e.target.value)} - /> -
    -
    - - setPassword(e.target.value)} - /> -
    - -

    - Share the initial password privately. Members can change it after - signing in. -

    - {error &&

    {error}

    } -
    -
    - )} -
    - - {members.data?.total ?? 0} accounts -
    - {(error || members.error) && ( -

    - {error || members.error} -

    - )} -
      - {visibleMembers.map((member) => ( -
    • -
      - {member.name} - {member.email} -
      - - {member.role === 'admin' ? 'Admin' : 'Member'} - -
      - -
      -
    • - ))} -
    - {!members.loading && !filtered.length && ( -

    - {search ? 'No members match your search.' : 'No members yet.'} -

    - )} - {members.loading && !members.data && ( -

    - Loading members… -

    - )} - {totalPages > 1 && ( -
    - {filtered.length} accounts -
    - - - Page {currentPage} of {totalPages} - - -
    -
    - )} - - {resetUser !== null && ( - setResetUser(null)}> - - - )} -
    - ) -} -export function AccountPage() { - const account = useAccount() - const [tab, setTab] = useState('personal') - const isAdmin = account.user?.role.split(',').includes('admin') - const [current, setCurrent] = useState(''), - [next, setNext] = useState(''), - [message, setMessage] = useState(''), - [busy, setBusy] = useState(false) - if (!account.enabled) - return

    Member login is disabled in this local pilot.

    - return ( -
    -
    -
    -

    - {isAdmin ? 'Administrator & teammate' : 'Your workspace'} -

    -

    Account

    -

    - {account.user?.name} · {account.user?.email} -

    -
    -
    - {isAdmin && ( - - )} - - {isAdmin && ( - - )} -
    - ) -} diff --git a/web-interface/src/components/BackendConnectionError.test.tsx b/web-interface/src/components/BackendConnectionError.test.tsx deleted file mode 100644 index d074456..0000000 --- a/web-interface/src/components/BackendConnectionError.test.tsx +++ /dev/null @@ -1,76 +0,0 @@ -// @vitest-environment jsdom -import { afterEach, expect, test, vi } from 'vitest' -import { cleanup, fireEvent, render, screen } from '@testing-library/react' -import { BackendConnectionError } from './BackendConnectionError' - -afterEach(cleanup) - -test('renders connection error message and status badge', () => { - render( - , - ) - - const heading = screen.getByRole('heading', { level: 1 }) - expect(heading.textContent).toContain('Unable to reach the compute backend') - expect( - screen.getByText('Failed to fetch /api/session: connection refused'), - ).toBeTruthy() - expect(screen.getByText('Backend Offline')).toBeTruthy() -}) - -test('triggers onRetry when Try again button is clicked', () => { - const onRetry = vi.fn() - render( - , - ) - - const retryButton = screen.getByRole('button', { - name: 'Try again to connect to the backend', - }) - expect(retryButton).toBeTruthy() - expect(retryButton.textContent).toContain('Try again') - - fireEvent.click(retryButton) - expect(onRetry).toHaveBeenCalledTimes(1) -}) - -test('disables button and displays loading state when isRetrying is true', () => { - render( - {}} - isRetrying={true} - />, - ) - - const retryButton = screen.getByRole('button', { - name: 'Try again to connect to the backend', - }) - expect(retryButton.hasAttribute('disabled')).toBe(true) - expect(retryButton.textContent).toContain('Checking connection…') -}) - -test('provides links to static documentation and GitHub issues', () => { - render( - {}} - />, - ) - - const docsLink = screen.getByRole('link', { - name: /Documentation.*View documentation/s, - }) - expect(docsLink.getAttribute('href')).toBe('/docs/') - - const githubLink = screen.getByRole('link', { - name: /Report an Issue.*Open GitHub issues/s, - }) - expect(githubLink.getAttribute('href')).toBe( - 'https://github.com/UTMIST/Mist/issues', - ) - expect(githubLink.getAttribute('target')).toBe('_blank') -}) diff --git a/web-interface/src/components/BackendConnectionError.tsx b/web-interface/src/components/BackendConnectionError.tsx deleted file mode 100644 index 347cec4..0000000 --- a/web-interface/src/components/BackendConnectionError.tsx +++ /dev/null @@ -1,241 +0,0 @@ -import { useState } from 'react' -import { - AlertCircle, - BookOpen, - ExternalLink, - Github, - RefreshCw, -} from 'lucide-react' - -export interface BackendConnectionErrorProps { - error?: string - onRetry?: () => void | Promise - isRetrying?: boolean -} - -export function BackendConnectionError({ - error = 'Unable to establish connection to the Mist API service.', - onRetry, - isRetrying: externalRetrying, -}: BackendConnectionErrorProps) { - const [internalRetrying, setInternalRetrying] = useState(false) - const isRetrying = externalRetrying ?? internalRetrying - - async function handleRetry() { - if (isRetrying || !onRetry) return - setInternalRetrying(true) - try { - await onRetry() - } finally { - setInternalRetrying(false) - } - } - - return ( -
    - ) -} diff --git a/web-interface/src/components/Buttons.tsx b/web-interface/src/components/Buttons.tsx deleted file mode 100644 index 07d334b..0000000 --- a/web-interface/src/components/Buttons.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import type { ReactNode } from 'react' - -const variantStyles = { - success: 'bg-green-200 text-green-800 hover:bg-green-300', - warning: 'bg-yellow-200 text-yellow-800 hover:bg-yellow-300', - danger: 'bg-red-200 text-red-800 hover:bg-red-300', - normal: 'bg-gray-100 text-gray-800 hover:bg-gray-200', - disabled: 'bg-gray-200 text-gray-800', -} - -const fontSizeStyles = { - xs: 'text-xs', - sm: 'text-sm', - base: 'text-base', - lg: 'text-lg', - xl: 'text-xl', -} - -type ButtonVariant = keyof typeof variantStyles -type ButtonFontSize = keyof typeof fontSizeStyles - -export function Button({ - children, - onClick, - variant, - fontSize, -}: { - children: ReactNode - onClick: () => void - variant: ButtonVariant - fontSize: ButtonFontSize -}) { - return ( - - ) -} diff --git a/web-interface/src/components/Card.tsx b/web-interface/src/components/Card.tsx deleted file mode 100644 index c5ce615..0000000 --- a/web-interface/src/components/Card.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { Link } from '@tanstack/react-router' -import type { ReactNode } from 'react' - -export function PanelHeading({ - title, - description, - icon, - action, -}: { - title: string - description?: string - icon: ReactNode - action?: ReactNode -}) { - return ( -
    - -
    -

    {title}

    - {description &&

    {description}

    } -
    - {action} -
    - ) -} - -export function CardInfoField({ - label, - value, - link, -}: { - label: string - value: string - link?: string -}) { - return ( -
    -
    {label}
    - {link ? ( - - {value} - - ) : ( -
    {value}
    - )} -
    - ) -} - -export function CardHeader({ - header, - children, -}: { - header: string - children: ReactNode -}) { - return ( -
    -

    {header}

    -
    - {/* Actions */} - {children} -
    -
    - ) -} - -export default function Card({ - children, - className = '', -}: { - children: ReactNode - className?: string -}) { - return ( -
    - {children} -
    - ) -} diff --git a/web-interface/src/components/Controls.test.tsx b/web-interface/src/components/Controls.test.tsx deleted file mode 100644 index c0fca52..0000000 --- a/web-interface/src/components/Controls.test.tsx +++ /dev/null @@ -1,88 +0,0 @@ -// @vitest-environment jsdom -import { afterEach, expect, test, vi } from 'vitest' -import { cleanup, fireEvent, render, screen } from '@testing-library/react' -import { useState } from 'react' -import { Picker } from './Picker' -import { Tabs } from './Tabs' - -afterEach(cleanup) - -test('picker filters a long account list and selects by keyboard', () => { - const change = vi.fn() - render( - - {Array.from({ length: 30 }, (_, i) => ( - - ))} - , - ) - const trigger = screen.getByRole('combobox', { name: 'Account' }) - fireEvent.click(trigger) - const search = screen.getByRole('combobox', { name: 'Search Account' }) - expect(document.activeElement).toBe(search) - fireEvent.change(search, { target: { value: 'Researcher 29' } }) - expect(screen.getAllByRole('option')).toHaveLength(1) - fireEvent.keyDown(search, { key: 'Enter' }) - expect(change).toHaveBeenCalledWith({ target: { value: '29' } }) - expect(screen.queryByRole('listbox')).toBeNull() - expect(document.activeElement).toBe(trigger) -}) - -test('empty search cannot select an unrelated option; Escape returns focus', () => { - const change = vi.fn() - render( - - - , - ) - const trigger = screen.getByRole('combobox', { name: 'Device' }) - fireEvent.click(trigger) - const search = screen.getByRole('combobox', { name: 'Search Device' }) - fireEvent.change(search, { target: { value: 'missing' } }) - fireEvent.keyDown(search, { key: 'ArrowDown' }) - fireEvent.keyDown(search, { key: 'Enter' }) - expect(change).not.toHaveBeenCalled() - expect(screen.getByText('No matches')).toBeTruthy() - fireEvent.keyDown(search, { key: 'Escape' }) - expect(screen.queryByRole('listbox')).toBeNull() - expect(document.activeElement).toBe(trigger) -}) - -test('tab keyboard navigation wraps, focuses the chosen tab and controls the panel', () => { - function Settings() { - const [tab, setTab] = useState('members') - return ( - <> - - - - ) - } - render() - fireEvent.keyDown(screen.getByRole('tab', { name: 'Members' }), { - key: 'ArrowLeft', - }) - const limits = screen.getByRole('tab', { name: 'Limits' }) - expect(limits.getAttribute('aria-selected')).toBe('true') - expect(document.activeElement).toBe(limits) - expect( - document.getElementById(limits.getAttribute('aria-controls')!)?.hidden, - ).toBe(false) - fireEvent.keyDown(limits, { key: 'Home' }) - expect( - screen.getByRole('tab', { name: 'Members' }).getAttribute('tabindex'), - ).toBe('0') -}) diff --git a/web-interface/src/components/DatasetsPage.test.tsx b/web-interface/src/components/DatasetsPage.test.tsx deleted file mode 100644 index 443dd0d..0000000 --- a/web-interface/src/components/DatasetsPage.test.tsx +++ /dev/null @@ -1,58 +0,0 @@ -// @vitest-environment jsdom -import { afterEach, beforeEach, expect, test, vi } from 'vitest' -import { cleanup, render, screen } from '@testing-library/react' -import { DatasetsPage } from './DatasetsPage' -import { storageAPI } from '../api' - -vi.mock('../api', () => ({ storageAPI: { list: vi.fn(), info: vi.fn() } })) -vi.mock('../teams', () => ({ - useTeam: () => ({ - selected: 'team-a', - team: { name: 'Team A', members: [] }, - }), -})) -vi.mock('../auth', () => ({ - useAccount: () => ({ user: { id: 'alice', role: 'user' } }), -})) -vi.mock('./TeamStorageBrowser', () => ({ TeamStorageBrowser: () => null })) - -beforeEach(() => { - vi.resetAllMocks() - vi.mocked(storageAPI.list).mockResolvedValue({ - datasets: [], - upload_limit_bytes: 1024, - }) - vi.mocked(storageAPI.info).mockResolvedValue({ - enabled: true, - capacity_bytes: 100 * 1024 ** 3, - available_bytes: 60 * 1024 ** 3, - upload_limit_bytes: 1024, - storage_mode: 'shared-folders', - storage_limits_enforced: false, - dataset_used_bytes: 2 * 1024 ** 3, - model_used_bytes: 3 * 1024 ** 3, - dataset_allocation_gib: 1, - model_allocation_gib: 5, - usage_stale: true, - storage_low: true, - }) -}) -afterEach(cleanup) - -test('shows team file usage independently of shared disk usage and advisory allowances', async () => { - render() - await screen.findByText(/Shared disk:/) - expect(screen.getByText('2 GiB / 1 GiB')).toBeTruthy() - expect(screen.getByText('3 GiB / 5 GiB')).toBeTruthy() - expect(screen.getByText(/Above advisory allowance/)).toBeTruthy() - expect(screen.getByText(/shared disk space is not reserved/)).toBeTruthy() - expect(screen.getByText(/Shared disk:/).textContent).toContain( - '60 GiB free of 100 GiB', - ) -}) - -test('reports stale usage and shared-disk exhaustion risk separately', async () => { - render() - await screen.findByText(/Storage usage reporting is delayed/) - expect(screen.getByText(/Shared disk space is low/)).toBeTruthy() -}) diff --git a/web-interface/src/components/DatasetsPage.tsx b/web-interface/src/components/DatasetsPage.tsx deleted file mode 100644 index 2118ef0..0000000 --- a/web-interface/src/components/DatasetsPage.tsx +++ /dev/null @@ -1,436 +0,0 @@ -import { Picker } from '#/components/Picker.tsx' -import { Modal } from '#/components/Modal.tsx' -import { formatBytes } from '#/format.ts' -import { useState, useRef, useEffect } from 'react' -import { - UploadCloud, - Database, - Trash2, - FileCheck2, - LoaderCircle, -} from 'lucide-react' -import { PanelHeading } from '#/components/Card.tsx' -import { storageAPI } from '#/api.ts' -import { errorMessage, usePolling } from '#/hooks/usePolling.ts' -import { useTeam } from '#/teams.tsx' -import { useAccount } from '#/auth.tsx' -import { TeamStorageBrowser } from '#/components/TeamStorageBrowser.tsx' - -function StorageMeter({ - label, - capacity, - used, - advisory = false, -}: { - label: string - capacity: number - used: number - advisory?: boolean -}) { - return ( -
    -
    -
    - - - {advisory - ? used > capacity - ? 'Above advisory allowance — writes are still allowed while disk space remains.' - : 'Advisory allowance — shared disk space is not reserved.' - : `${formatBytes(Math.max(0, capacity - used))} available`} - -
    - ) -} - -export function DatasetsPage() { - const { selected, team } = useTeam() - const { user } = useAccount() - const [scope, setScope] = useState(user?.id ?? '') - const commonWriter = - team?.members.find((m) => m.id === user?.id)?.common_writer || - user?.role.split(',').includes('admin') - const datasets = usePolling(storageAPI.list, 10000), - storage = usePolling(storageAPI.info, 15000) - const [file, setFile] = useState(null), - [name, setName] = useState(''), - [zip, setZip] = useState(false), - [progress, setProgress] = useState(0), - [busy, setBusy] = useState(false), - [error, setError] = useState(''), - [message, setMessage] = useState('') - const [uploading, setUploading] = useState(false) - const uploadRequest = useRef(null) - useEffect(() => () => uploadRequest.current?.abort(), []) - const [search, setSearch] = useState('') - const [dragging, setDragging] = useState(false) - function chooseFile(next: File | null) { - setFile(next) - setZip(next?.name.toLowerCase().endsWith('.zip') ?? false) - } - const limit = datasets.data?.upload_limit_bytes ?? 0 - const isPreparing = (value: string) => - value.includes('team storage is being provisioned') || - value.includes('team storage is not ready') - const storagePending = - !!selected && - (datasets.loading || - storage.loading || - isPreparing(datasets.error) || - isPreparing(storage.error)) - const visibleDatasets = - datasets.data?.datasets.filter((ds) => - ds.name.toLowerCase().includes(search.toLowerCase()), - ) ?? [] - async function upload() { - if (!file) return - setBusy(true) - setError('') - setMessage('') - setProgress(0) - try { - if (file.size > limit) throw new Error('Dataset exceeds the upload limit') - uploadRequest.current = new AbortController() - const ds = await storageAPI.upload( - file, - name, - zip, - setProgress, - scope, - uploadRequest.current.signal, - ) - setMessage(`${ds.name} is ready to use.`) - setUploading(false) - datasets.refresh() - storage.refresh() - } catch (err) { - setError(errorMessage(err)) - } finally { - uploadRequest.current = null - setBusy(false) - } - } - async function remove(id: string) { - setBusy(true) - setError('') - try { - await storageAPI.remove(id) - datasets.refresh() - storage.refresh() - } catch (err) { - setError(errorMessage(err)) - } finally { - setBusy(false) - } - } - return ( -
    -
    -
    -

    {team?.name ?? 'Legacy workspace'}

    -

    Datasets

    -

    - A shared home for your team's data and experiment results. -

    -
    - -
    - {storagePending && ( -

    -

    - )} - {storage.data?.enabled && ( -
    -

    - Shared disk: {formatBytes(storage.data.available_bytes)} free of{' '} - {formatBytes(storage.data.capacity_bytes)}. All teams use this disk. -

    - {selected && ( -
    - - -
    - )} - {selected && ( -

    - File usage updates approximately every 30 seconds. -

    - )} - {storage.data.storage_low && ( -

    - Shared disk space is low. Uploads and jobs may run out of space. -

    - )} - {storage.data.usage_stale && ( -

    - Storage usage reporting is delayed. The displayed usage may be out - of date. -

    - )} -
    - )} - {uploading && ( - { - if (!busy) setUploading(false) - }} - > -
    { - e.preventDefault() - void upload() - }} - > - } - /> - {selected && ( -
    - - setScope(e.target.value)} - > - - {commonWriter && ( - - )} - -

    - All teammates can read these files. Other teams need an - explicit sharing grant. -

    -
    - )} -
    - - setName(e.target.value)} - /> -
    -
    { - e.preventDefault() - if (!busy) setDragging(true) - }} - onDragLeave={() => setDragging(false)} - onDrop={(e) => { - e.preventDefault() - setDragging(false) - if (!busy) chooseFile(e.dataTransfer.files.item(0)) - }} - > - {file ? ( -
    - -

    - {storagePending - ? 'Upload will be available when team storage is ready.' - : `Upload limit: ${formatBytes(limit)}. ZIP extraction also needs space for the expanded files.`} -

    - - {error &&

    {error}

    } - {busy && ( - - )} - {busy && ( -
    - -

    - {progress === 100 - ? 'Validating and saving dataset…' - : `${progress}% uploaded`} -

    -
    - )} - -
    - )} - {(error || - (!isPreparing(datasets.error) && datasets.error) || - (!isPreparing(storage.error) && storage.error)) && ( -

    - {error || - (!isPreparing(datasets.error) && datasets.error) || - storage.error} -

    - )} - {message &&

    {message}

    } -
    - } - action={ - - {datasets.data?.datasets.length ?? 0} datasets - - } - /> -
    - setSearch(event.target.value)} - /> -
    -
      - {visibleDatasets.map((ds) => ( -
    • -
      -

      {ds.name}

      - {ds.team_id && ( -

      - {ds.team_name ?? team?.name} /{' '} - {ds.scope === 'common' ? 'Common' : ds.member_name} - {ds.shared ? ' · Shared read-only' : ''} -

      - )} -

      - {ds.files} file(s) · {formatBytes(ds.size)} · {ds.state} -

      -
      - File details - {ds.id} -

      SHA256: {ds.sha256}

      -
      -
      - -
    • - ))} -
    - {!datasets.loading && - !datasets.error && - visibleDatasets.length === 0 && ( -

    - {search - ? 'No datasets match your search.' - : 'No datasets yet. Add your first dataset to get started.'} -

    - )} -
    - {selected ? ( -
    - - Team folders Browse shared files & results - - -
    - ) : ( -

    - Choose a team to upload. These are your preserved account files. -

    - )} -
    - ) -} diff --git a/web-interface/src/components/HardwarePanel.tsx b/web-interface/src/components/HardwarePanel.tsx deleted file mode 100644 index 7efa2b0..0000000 --- a/web-interface/src/components/HardwarePanel.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import Card, { PanelHeading } from '#/components/Card.tsx' -import { Server } from 'lucide-react' -import type { HardwareSnapshot } from '#/api.ts' - -export const computeNames = { - cpu: 'CPU', - nvidia: 'NVIDIA', - tenstorrent: 'Tenstorrent', -} - -function memoryLabel(quantity: string) { - const match = quantity.match(/^(\d+(?:\.\d+)?)(Ki|Mi|Gi|Ti)?$/) - if (!match) return quantity - const powers: Record = { Ki: 1, Mi: 2, Gi: 3, Ti: 4 } - const bytes = Number(match[1]) * 1024 ** (powers[match[2]] ?? 0) - return `${(bytes / 1024 ** 3).toFixed(1)} GiB` -} - -export function HardwarePanel({ - hardware, - error, - loading, -}: { - hardware: HardwareSnapshot | null - error: string - loading: boolean -}) { - return ( - - } - action={Live} - /> - {loading &&

    Loading hardware…

    } - {error && ( -

    - Hardware unavailable: {error} -

    - )} - {hardware && ( - <> -
    - - - - - {[ - 'Hardware', - 'Machine', - 'Total', - 'Allocated', - 'Available', - 'Placement', - ].map((label) => ( - - ))} - - - - {hardware.pools.map((pool) => ( - - - - - - - - - ))} - -
    - Current accelerator allocations -
    - {label} -
    - {computeNames[pool.accelerator]} {pool.unit}s - {pool.node}{pool.total}{pool.allocated} - {error || pool.available === null - ? 'Unknown' - : pool.available} - - {error ? 'Unknown' : pool.ready ? 'Ready' : 'Unavailable'} -
    -
    -
    - {hardware.machines.map((machine) => ( -

    - {machine.name}:{' '} - {machine.ready - ? machine.schedulable - ? 'Ready' - : 'Placement paused' - : 'Offline'} - {machine.ready && ( - <> - {' '} - · {machine.cpu_allocatable} CPU ·{' '} - {memoryLabel(machine.memory_allocatable)} RAM allocatable - - )} -

    - ))} -
    - {hardware.pools - .filter((pool) => pool.message) - .map((pool) => ( -

    - {computeNames[pool.accelerator]}: {pool.message} -

    - ))} -

    - Updated {new Date(hardware.observed_at).toLocaleTimeString()}. - Availability can change before submission. Jobs wait for resources. - One Tenstorrent board contains two chips. -

    - - )} -
    - ) -} diff --git a/web-interface/src/components/JobsPage.test.tsx b/web-interface/src/components/JobsPage.test.tsx deleted file mode 100644 index 3ace18f..0000000 --- a/web-interface/src/components/JobsPage.test.tsx +++ /dev/null @@ -1,286 +0,0 @@ -// @vitest-environment jsdom -import { afterEach, beforeEach, expect, test, vi } from 'vitest' -import { - act, - cleanup, - fireEvent, - render, - screen, - waitFor, -} from '@testing-library/react' -import { JobsPage } from './JobsPage' -import { jobsAPI, storageAPI } from '../api' -import type { Job } from '../api' - -vi.mock('../api', () => ({ - storageAPI: { list: vi.fn(), files: vi.fn() }, - jobsAPI: { - list: vi.fn(), - submit: vi.fn(), - cancel: vi.fn(), - logs: vi.fn(), - hardware: vi.fn(), - images: vi.fn(), - }, -})) - -let jobs: Job[] -beforeEach(() => { - vi.resetAllMocks() - HTMLDialogElement.prototype.showModal = function () { - this.setAttribute('open', '') - } - HTMLDialogElement.prototype.close = function () { - this.removeAttribute('open') - } - vi.mocked(storageAPI.list).mockResolvedValue({ - datasets: [], - upload_limit_bytes: 2147483648, - }) - jobs = [ - { - id: 'real-job', - name: 'Actual training', - created: '2026-10-03T20:00:00Z', - job_state: 'Scheduled', - accelerator: 'tenstorrent', - device_count: 2, - cpu: '4', - memory: '8Gi', - image: 'tt-runtime', - checkpoint_directory: '/checkpoints/real-job', - message: 'Waiting for boards', - }, - ] - vi.mocked(jobsAPI.list).mockImplementation(async () => ({ - jobs, - count: jobs.length, - })) - vi.mocked(jobsAPI.logs).mockResolvedValue({ logs: 'REAL_TRAINING_OUTPUT' }) - vi.mocked(jobsAPI.hardware).mockResolvedValue({ - observed_at: '2026-10-08T12:00:00Z', - machines: [], - pools: [ - { - accelerator: 'nvidia', - node: 'cpu-node', - unit: 'GPU', - total: 2, - allocated: 1, - available: 1, - ready: true, - }, - { - accelerator: 'tenstorrent', - node: 'tt-node', - unit: 'board', - total: 4, - allocated: 2, - available: 2, - ready: true, - chips_per_device: 2, - }, - ], - }) - vi.mocked(jobsAPI.images).mockResolvedValue({ - images: [ - { reference: 'cpu-runtime', accelerators: ['cpu'] }, - { reference: 'nvidia-runtime', accelerators: ['nvidia'] }, - { reference: 'tt-runtime', accelerators: ['tenstorrent'] }, - ], - profiles: [ - { - accelerator: 'cpu', - default_image: 'cpu-runtime', - device_unit: 'none', - max_devices: 0, - }, - { - accelerator: 'nvidia', - default_image: 'nvidia-runtime', - device_unit: 'GPU', - max_devices: 2, - }, - { - accelerator: 'tenstorrent', - default_image: 'tt-runtime', - device_unit: 'board', - max_devices: 4, - }, - ], - }) - vi.mocked(jobsAPI.submit).mockResolvedValue({ - job_id: 'submitted', - job: jobs[0], - }) - vi.mocked(jobsAPI.cancel).mockImplementation(async () => { - jobs = [{ ...jobs[0], job_state: 'Cancelled' }] - return jobs[0] - }) -}) -afterEach(() => { - cleanup() - vi.useRealTimers() -}) - -test('shows real job state, reads logs, and cancels through the API', async () => { - render() - await screen.findByText('Actual training') - fireEvent.click( - screen.getByRole('button', { name: 'Show details for Actual training' }), - ) - expect(screen.getByText('Waiting for boards')).toBeTruthy() - fireEvent.click(screen.getByRole('button', { name: 'Logs' })) - await screen.findByText('REAL_TRAINING_OUTPUT') - fireEvent.click(screen.getByRole('button', { name: 'Cancel' })) - await screen.findByText('Cancelled') - expect(jobsAPI.cancel).toHaveBeenCalledWith('real-job') - await waitFor(() => - expect(screen.queryByRole('button', { name: 'Cancel' })).toBeNull(), - ) -}) - -test('submits the requested Tenstorrent board count', async () => { - render() - fireEvent.click(screen.getByRole('button', { name: 'New job' })) - await screen.findByDisplayValue('cpu-runtime') - fireEvent.click(screen.getByRole('radio', { name: /Tenstorrent/ })) - fireEvent.change(screen.getByLabelText('Boards (two chips each)'), { - target: { value: '2' }, - }) - fireEvent.click(screen.getByRole('radio', { name: 'Training check' })) - fireEvent.click(screen.getByRole('button', { name: 'Submit job' })) - await waitFor(() => - expect(jobsAPI.submit).toHaveBeenCalledWith({ - name: '', - type: 'training-smoke', - accelerator: 'tenstorrent', - device_count: 2, - image: 'tt-runtime', - timeout_seconds: 600, - }), - ) -}) - -test('passes executable and each argument separately, preserving spaces', async () => { - render() - fireEvent.click(screen.getByRole('button', { name: 'New job' })) - await screen.findByDisplayValue('cpu-runtime') - fireEvent.click(screen.getByRole('radio', { name: 'Container' })) - fireEvent.change(screen.getByLabelText('Command executable (optional)'), { - target: { value: 'python' }, - }) - fireEvent.change(screen.getByLabelText('Arguments (one per line)'), { - target: { value: "-c\nprint('two words')" }, - }) - fireEvent.change(screen.getByLabelText('Working directory (optional)'), { - target: { value: '/app' }, - }) - fireEvent.click(screen.getByRole('button', { name: 'Submit job' })) - await waitFor(() => - expect(jobsAPI.submit).toHaveBeenCalledWith( - expect.objectContaining({ - image: 'cpu-runtime', - command: ['python'], - args: ['-c', "print('two words')"], - working_directory: '/app', - }), - ), - ) -}) - -test('rejects unapproved images and invalid board counts before submission', async () => { - render() - fireEvent.click(screen.getByRole('button', { name: 'New job' })) - await screen.findByDisplayValue('cpu-runtime') - fireEvent.change(screen.getByLabelText('Container image'), { - target: { value: 'unapproved/image' }, - }) - expect( - screen.getByRole('button', { name: 'Submit job' }).hasAttribute('disabled'), - ).toBe(true) - fireEvent.click(screen.getByRole('radio', { name: /Tenstorrent/ })) - fireEvent.change(screen.getByLabelText('Boards (two chips each)'), { - target: { value: '5' }, - }) - expect( - screen.getByRole('button', { name: 'Submit job' }).hasAttribute('disabled'), - ).toBe(true) - expect(jobsAPI.submit).not.toHaveBeenCalled() -}) - -test('recovers the job list after a temporary API outage', async () => { - vi.useFakeTimers() - vi.mocked(jobsAPI.list).mockRejectedValueOnce( - new Error('Temporary API outage'), - ) - render() - await act(async () => {}) - expect(screen.getByRole('alert').textContent).toContain( - 'Temporary API outage', - ) - await act(async () => { - await vi.advanceTimersByTimeAsync(3000) - }) - expect(screen.queryByRole('alert')).toBeNull() - expect(screen.getByText('Actual training')).toBeTruthy() -}) - -test('paginates history and searches across all pages', async () => { - jobs = Array.from({ length: 23 }, (_, index) => ({ - ...jobs[0], - id: `job-${index}`, - name: `Experiment ${index + 1}`, - })) - render() - await screen.findByText('Experiment 1') - expect( - screen.getAllByRole('button', { name: /Show details for Experiment/ }), - ).toHaveLength(10) - expect(screen.queryByText('Experiment 11')).toBeNull() - fireEvent.click(screen.getByRole('button', { name: 'Next page' })) - expect(screen.getByText('Experiment 11')).toBeTruthy() - expect(screen.queryByText('Experiment 1')).toBeNull() - fireEvent.click(screen.getByRole('button', { name: 'Next page' })) - expect( - screen.getAllByRole('button', { name: /Show details for Experiment/ }), - ).toHaveLength(3) - expect( - screen.getByRole('button', { name: 'Next page' }).hasAttribute('disabled'), - ).toBe(true) - fireEvent.change(screen.getByLabelText('Search job history'), { - target: { value: 'job-22' }, - }) - expect(screen.getByText('Experiment 23')).toBeTruthy() - expect( - screen.getAllByRole('button', { name: /Show details for Experiment/ }), - ).toHaveLength(1) - expect( - screen - .getByRole('button', { name: 'Previous page' }) - .hasAttribute('disabled'), - ).toBe(true) -}) - -test('keeps a cleared image blank while editing and uses the image startup defaults', async () => { - render() - fireEvent.click(screen.getByRole('button', { name: 'New job' })) - await screen.findByDisplayValue('cpu-runtime') - fireEvent.click(screen.getByRole('radio', { name: 'Container' })) - const image = screen.getByLabelText('Container image') - fireEvent.change(image, { target: { value: '' } }) - expect(image.value).toBe('') - expect( - screen.getByRole('button', { name: 'Submit job' }).hasAttribute('disabled'), - ).toBe(true) - fireEvent.change(image, { target: { value: 'cpu' } }) - expect(image.value).toBe('cpu') - fireEvent.change(image, { target: { value: 'cpu-runtime' } }) - fireEvent.click(screen.getByRole('button', { name: 'Submit job' })) - await waitFor(() => expect(jobsAPI.submit).toHaveBeenCalled()) - const submission = vi.mocked(jobsAPI.submit).mock.calls[0][0] - expect(submission.image).toBe('cpu-runtime') - expect(submission.command).toBeUndefined() - expect(submission.args).toBeUndefined() - expect(submission.script).toBeUndefined() -}) diff --git a/web-interface/src/components/JobsPage.tsx b/web-interface/src/components/JobsPage.tsx deleted file mode 100644 index 7db3a3c..0000000 --- a/web-interface/src/components/JobsPage.tsx +++ /dev/null @@ -1,336 +0,0 @@ -import { Picker } from '#/components/Picker.tsx' -import { useState } from 'react' -import { - History, - Search, - ChevronLeft, - ChevronRight, - CheckCircle2, - Clock3, - Activity, - Plus, -} from 'lucide-react' -import { Modal } from '#/components/Modal.tsx' -import { PanelHeading } from '#/components/Card.tsx' -import { jobsAPI, storageAPI } from '#/api.ts' -import type { Submission } from '#/api.ts' -import { HardwarePanel } from '#/components/HardwarePanel.tsx' -import { JobSubmissionForm } from '#/components/jobs/JobSubmissionForm.tsx' -import { JobCard } from '#/components/jobs/JobCard.tsx' -import { JobLogs } from '#/components/jobs/JobLogs.tsx' -import { errorMessage, usePolling } from '#/hooks/usePolling.ts' -import { useTeam } from '#/teams.tsx' - -export function JobsPage() { - const { team } = useTeam() - const jobs = usePolling(jobsAPI.list, 3000) - const hardware = usePolling(jobsAPI.hardware) - const datasets = usePolling(storageAPI.list, 15000) - const images = usePolling(jobsAPI.images, 15000) - const [selectedLogs, setSelectedLogs] = useState(null) - const [cancelling, setCancelling] = useState(null) - const [actionError, setActionError] = useState('') - const [composing, setComposing] = useState(false) - const [submitted, setSubmitted] = useState('') - const [search, setSearch] = useState('') - const [status, setStatus] = useState('all') - const [page, setPage] = useState(1) - const [pageSize, setPageSize] = useState(10) - const filtered = (jobs.data?.jobs ?? []).filter( - (job) => - (status === 'all' || job.job_state === status) && - `${job.name} ${job.id} ${job.creator_name ?? ''}` - .toLowerCase() - .includes(search.trim().toLowerCase()), - ) - const pageCount = Math.max(1, Math.ceil(filtered.length / pageSize)) - const currentPage = Math.min(page, pageCount) - const start = (currentPage - 1) * pageSize - const visibleJobs = filtered.slice(start, start + pageSize) - function filterStatus(next: string) { - setStatus(next) - setPage(1) - setSelectedLogs(null) - } - function changePage(next: number) { - setPage(next) - setSelectedLogs(null) - } - - async function submit(submission: Submission) { - const response = await jobsAPI.submit(submission) - setSubmitted(response.job_id) - setComposing(false) - setPage(1) - setSearch('') - setStatus('all') - setActionError('') - jobs.refresh() - hardware.refresh() - } - async function cancel(id: string) { - setCancelling(id) - setActionError('') - try { - await jobsAPI.cancel(id) - jobs.refresh() - hardware.refresh() - } catch (err) { - setActionError(errorMessage(err)) - } finally { - setCancelling(null) - } - } - - return ( -
    -
    -
    -

    {team?.name ?? 'Legacy workspace'}

    -

    Jobs

    -

    - From an experiment to a result. Run your code on the right hardware. -

    -
    - -
    -
    - {( - [ - [ - 'Running', - jobs.data?.jobs.filter((j) => j.job_state === 'InProgress') - .length, - 'InProgress', - Activity, - Plus, - ], - [ - 'In queue', - jobs.data?.jobs.filter((j) => j.job_state === 'Scheduled').length, - 'Scheduled', - Clock3, - ], - [ - 'Completed', - jobs.data?.jobs.filter((j) => j.job_state === 'Success').length, - 'Success', - CheckCircle2, - ], - ] as const - ).map(([label, count, state, Icon]) => ( - - ))} -
    -
    - - Connected compute - - {hardware.data?.pools - .map( - (pool) => - `${pool.available ?? '—'} ${pool.accelerator === 'nvidia' ? 'GPUs' : 'TT boards'}`, - ) - .join(' · ') ?? 'Checking availability…'} - - - -
    - {images.error && ( -

    - Image catalog unavailable: {images.error} -

    - )} - {composing && ( - setComposing(false)}> - - - )} - {submitted && ( -

    - Job submitted. Track it in the history below. -

    - )} -
    -
    - {(actionError || jobs.error) && ( -

    - {actionError || jobs.error} -

    - )} - {jobs.loading &&

    Loading jobs…

    } - {selectedLogs && ( - setSelectedLogs(null)} - /> - )} -
    - } - action={ - - {jobs.data?.count ?? '—'} jobs - - } - /> -
    -
    -
    - filterStatus(e.target.value)} - > - - - - - - - -
    -
    - - Job / submitted by - Status - Compute - Created -
    - {visibleJobs.map((job) => ( - setSelectedLogs(job.id)} - onCancel={() => { - void cancel(job.id) - }} - /> - ))} - {!jobs.loading && !jobs.error && filtered.length === 0 && ( -
    -
    - )} - -
    -
    -
    -
    - ) -} diff --git a/web-interface/src/components/MachinesPage.tsx b/web-interface/src/components/MachinesPage.tsx deleted file mode 100644 index 55a7f4e..0000000 --- a/web-interface/src/components/MachinesPage.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { jobsAPI } from '#/api.ts' -import { HardwarePanel } from '#/components/HardwarePanel.tsx' -import { usePolling } from '#/hooks/usePolling.ts' - -export function MachinesPage() { - const hardware = usePolling(jobsAPI.hardware) - return ( -
    -

    Machines

    - -

    - CPU and RAM figures are allocatable scheduling capacity, not live - utilization. Jobs reserve whole NVIDIA GPUs or whole Tenstorrent boards. -

    -
    - ) -} diff --git a/web-interface/src/components/Modal.tsx b/web-interface/src/components/Modal.tsx deleted file mode 100644 index 64dfabe..0000000 --- a/web-interface/src/components/Modal.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { useEffect, useRef } from 'react' -import { createPortal } from 'react-dom' -import { X } from 'lucide-react' -import type { ReactNode } from 'react' - -/** Native dialog provides focus trapping, focus return and the modal top layer. */ -export function Modal({ - title, - onClose, - children, - closeDisabled = false, -}: { - title: string - onClose: () => void - children: ReactNode - closeDisabled?: boolean -}) { - const dialog = useRef(null) - useEffect(() => { - const current = dialog.current - current?.showModal() - const previous = document.body.style.overflow - document.body.style.overflow = 'hidden' - return () => { - current?.close() - document.body.style.overflow = previous - } - }, []) - return createPortal( - { - event.preventDefault() - if (!closeDisabled) onClose() - }} - onClick={(event) => { - if (!closeDisabled && event.target === event.currentTarget) onClose() - }} - > -
    - {title} - -
    -
    {children}
    -
    , - document.body, - ) -} diff --git a/web-interface/src/components/Navbar.tsx b/web-interface/src/components/Navbar.tsx deleted file mode 100644 index 3b50311..0000000 --- a/web-interface/src/components/Navbar.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import { Link } from '@tanstack/react-router' -import { authClient, useAccount } from '#/auth.tsx' -import { useState } from 'react' -import { - LayoutDashboard, - Play, - Database, - Server, - Users, - BookOpen, -} from 'lucide-react' -import { WorkspaceSelector } from '#/teams.tsx' - -export default function Navbar() { - const account = useAccount() - const [error, setError] = useState('') - return ( -
    - - - - MistResearch compute - - -

    WORKSPACE

    - -
    - - - - - {account.user?.name ?? 'Local pilot'} - Account settings - - - {account.enabled && ( - - )} - {error &&

    {error}

    } -
    -
    - ) -} diff --git a/web-interface/src/components/Picker.tsx b/web-interface/src/components/Picker.tsx deleted file mode 100644 index 644e5e3..0000000 --- a/web-interface/src/components/Picker.tsx +++ /dev/null @@ -1,215 +0,0 @@ -import { - Children, - isValidElement, - useEffect, - useId, - useRef, - useState, -} from 'react' -import { Check, ChevronDown, Search } from 'lucide-react' -import type { ReactNode } from 'react' - -type Props = { - id?: string - value: string | number - onChange: (event: { target: { value: string } }) => void - children: ReactNode - disabled?: boolean - required?: boolean - className?: string - 'aria-label'?: string -} -function text(node: ReactNode): string { - return Children.toArray(node) - .map((child) => - isValidElement<{ children?: ReactNode }>(child) - ? text(child.props.children) - : String(child), - ) - .join('') -} - -/** Searchable, keyboard-operable single selection shared across the portal. */ -export function Picker({ - id, - value, - onChange, - children, - disabled, - required, - className = '', - 'aria-label': ariaLabel, -}: Props) { - const options = Children.toArray(children) - .filter(isValidElement<{ value: string | number; children: ReactNode }>) - .map((option) => ({ - value: String(option.props.value), - label: text(option.props.children), - })) - const selected = options.find((option) => option.value === String(value)) - const [open, setOpen] = useState(false) - const [above, setAbove] = useState(false) - const [query, setQuery] = useState('') - const [active, setActive] = useState(0) - const root = useRef(null) - const trigger = useRef(null) - const search = useRef(null) - const uniqueId = useId() - const filtered = options.filter((option) => - option.label.toLowerCase().includes(query.toLowerCase()), - ) - const listId = `${id ?? uniqueId}-options` - useEffect(() => { - if (!open) return - const list = document.getElementById(listId) - const option = document.getElementById(`${listId}-${active}`) - if (!list || !option) return - const bounds = list.getBoundingClientRect() - const item = option.getBoundingClientRect() - if (item.top < bounds.top) list.scrollTop -= bounds.top - item.top - else if (item.bottom > bounds.bottom) - list.scrollTop += item.bottom - bounds.bottom - }, [open, active, listId, query]) - useEffect(() => { - if (!open) return - function place() { - const rect = root.current?.getBoundingClientRect() - if (!rect) return - const bound = Math.min( - window.innerHeight, - root.current?.closest('dialog')?.getBoundingClientRect().bottom ?? - window.innerHeight, - ) - setAbove(bound - rect.bottom < 260 && rect.top > bound - rect.bottom) - } - place() - search.current?.focus() - function outside(event: PointerEvent) { - if (!root.current?.contains(event.target as Node)) setOpen(false) - } - document.addEventListener('pointerdown', outside) - const outsideFocus = (event: FocusEvent) => { - if (!root.current?.contains(event.target as Node)) setOpen(false) - } - document.addEventListener('focusin', outsideFocus) - window.addEventListener('resize', place) - document.addEventListener('scroll', place, true) - return () => { - document.removeEventListener('pointerdown', outside) - document.removeEventListener('focusin', outsideFocus) - window.removeEventListener('resize', place) - document.removeEventListener('scroll', place, true) - } - }, [open]) - function choose(next: string) { - onChange({ target: { value: next } }) - setOpen(false) - trigger.current?.focus() - } - return ( -
    - - {open && ( -
    { - if (event.key === 'Escape') { - event.preventDefault() - event.stopPropagation() - setOpen(false) - trigger.current?.focus() - } - if (event.key === 'ArrowDown') { - event.preventDefault() - setActive((index) => - Math.max(0, Math.min(index + 1, filtered.length - 1)), - ) - } - if (event.key === 'ArrowUp') { - event.preventDefault() - setActive((index) => Math.max(index - 1, 0)) - } - if (event.key === 'Enter' && filtered[active]) { - event.preventDefault() - choose(filtered[active].value) - } - }} - > -
    -
    -
    - {filtered.map((option, index) => ( - - ))} - {!filtered.length && ( -

    No matches

    - )} -
    -
    - )} -
    - ) -} diff --git a/web-interface/src/components/Tabs.tsx b/web-interface/src/components/Tabs.tsx deleted file mode 100644 index 3ab0569..0000000 --- a/web-interface/src/components/Tabs.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/** Shared tab navigation, with arrow keys, Home/End and a single tab stop. */ -export function Tabs({ - id, - label, - value, - onChange, - items, -}: { - id: string - label: string - value: string - onChange: (value: string) => void - items: readonly (readonly [string, string])[] -}) { - return ( -
    - {items.map(([key, title], index) => ( - - ))} -
    - ) -} diff --git a/web-interface/src/components/TeamStorageBrowser.tsx b/web-interface/src/components/TeamStorageBrowser.tsx deleted file mode 100644 index 49cc3a9..0000000 --- a/web-interface/src/components/TeamStorageBrowser.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { formatBytes } from '#/format.ts' -import { Picker } from '#/components/Picker.tsx' -import { useCallback, useState } from 'react' -import { storageAPI } from '#/api.ts' -import type { StorageFolder } from '#/api.ts' -import { usePolling } from '#/hooks/usePolling.ts' -import { FolderOpen, Folder, ArrowDownToLine, Users } from 'lucide-react' -import { PanelHeading } from '#/components/Card.tsx' - -function FolderFiles({ folder }: { folder: StorageFolder }) { - const load = useCallback( - (signal: AbortSignal) => storageAPI.folderFiles(folder, signal), - [folder.team_id, folder.scope], - ) - const files = usePolling(load, 10000) - return ( -
    -

    - {folder.team_name} / {folder.name} - {folder.shared ? ' · Shared read-only' : ''} -

    - {files.loading &&

    Loading files…

    } - {files.error &&

    {files.error}

    } - {files.data?.files.length === 0 &&

    No files in this folder yet.

    } -
      - {files.data?.files.map((file) => ( -
    • - - {file.path} · {formatBytes(file.size)} - - - -
    • - ))} -
    -
    - ) -} -export function TeamStorageBrowser() { - const folders = usePolling(storageAPI.folders, 15000) - const [selected, setSelected] = useState('') - const folder = folders.data?.folders.find( - (f) => `${f.team_id}:${f.scope}` === selected, - ) - return ( -
    - } - /> -
    - {folders.data?.folders.map((f) => { - const id = `${f.team_id}:${f.scope}` - return ( - - ) - })} -
    - - setSelected(e.target.value)} - > - - {folders.data?.folders.map((f) => ( - - ))} - - {folders.error &&

    {folders.error}

    } - {folder && } -
    - ) -} diff --git a/web-interface/src/components/TeamsPage.tsx b/web-interface/src/components/TeamsPage.tsx deleted file mode 100644 index 0b5ca00..0000000 --- a/web-interface/src/components/TeamsPage.tsx +++ /dev/null @@ -1,583 +0,0 @@ -import { Picker } from '#/components/Picker.tsx' -import { useState, useEffect } from 'react' -import { Modal } from '#/components/Modal.tsx' -import { Tabs } from '#/components/Tabs.tsx' -import { Users, Settings2, ArrowUpRight, Plus, UserMinus } from 'lucide-react' -import { PanelHeading } from '#/components/Card.tsx' -import type { Team, TeamPolicy } from '#/api.ts' -import { teamsAPI } from '#/api.ts' -import { authClient, useAccount } from '#/auth.tsx' -import { useTeam } from '#/teams.tsx' -import { errorMessage, usePolling } from '#/hooks/usePolling.ts' - -const field = 'border rounded p-2 w-full' -async function loadAccounts() { - const result = await authClient.admin.listUsers({ query: { limit: 1000 } }) - if (result.error) throw new Error(result.error.message) - return result.data.users -} - -function PolicyForm({ - team, - save, -}: { - team: Team - save: (policy: TeamPolicy) => Promise -}) { - const [policy, setPolicyState] = useState(team.policy) - const [editing, setEditing] = useState(false) - const signature = JSON.stringify(team.policy) - useEffect(() => { - if (!editing) setPolicyState(JSON.parse(signature) as TeamPolicy) - }, [signature, editing]) - function setPolicy(next: TeamPolicy) { - setEditing(true) - setPolicyState(next) - } - const [busy, setBusy] = useState(false) - const [message, setMessage] = useState('') - const numbers = [ - ['nvidia', 'NVIDIA GPUs', 0, 2], - ['tenstorrent', 'Tenstorrent boards (two chips each)', 0, 4], - ['concurrent', 'Simultaneous jobs', 1, 16], - ['queued', 'Queued jobs', 1, 200], - ['storage_gib', 'Dataset allowance (GiB, advisory)', 1, 1048576], - ['model_storage_gib', 'Model allowance (GiB, advisory)', 1, 1048576], - ['runtime_seconds', 'Maximum job runtime (seconds)', 10, 86400], - ] as const - return ( -
    { - e.preventDefault() - setBusy(true) - setMessage('') - try { - await save(policy) - setEditing(false) - setMessage('Team limits saved.') - } catch (err) { - setMessage(errorMessage(err)) - } finally { - setBusy(false) - } - }} - > -

    Team limits

    -
    -
    - - setPolicy({ ...policy, cpu: e.target.value })} - /> -
    -
    - - setPolicy({ ...policy, memory: e.target.value })} - /> -
    - {numbers.map(([key, name, min, max]) => ( -
    - - - setPolicy({ ...policy, [key]: Number(e.target.value) }) - } - /> - {!key.includes('storage') && ( - - setPolicy({ ...policy, [key]: Number(e.target.value) }) - } - className="mist-range w-full mt-3" - /> - )} -
    - ))} -
    -
    - -
    -
    - {/* Brand header & status badge */} -
    -
    - -
    - - Mist - - Research Compute -
    -
    - -
    -
    -
    - - {/* Primary Message */} -
    -

    SYSTEM STATUS / API DISCONNECTED

    -

    - Unable to reach the compute backend -

    -

    - The web portal is running, but cannot communicate with the Mist API - or account service. The backend server may be restarting, undergoing - maintenance, or temporarily unreachable over the private network. -

    -
    - - {/* Error diagnostics banner */} -
    -
    -
    -
    - - {/* Action button */} -
    - - - Automatic retries happen in the background. - -
    - - {/* Informational Cards: Docs & GitHub */} -
    - {/* Static Documentation link */} - -
    -
    - - - Static & Active - -
    -

    - Documentation - -

    -

    - The static documentation site remains unaffected and fully - accessible even when the compute backend is down. Browse - operating guides, architecture, and setup manuals. -

    -
    -
    - View documentation - -
    -
    - - {/* GitHub Repository Issue link */} - -
    -
    - - - GitHub - -
    -

    - Report an Issue -

    -

    - Notice an unexpected service outage or API bug? Submit a report - or check active incidents on the UTMIST GitHub repository. -

    -
    -
    - Open GitHub issues -
    -
    -
    - - {/* Troubleshooting checklist */} -
    -

    - Troubleshooting checklist -

    -
      -
    • - Private mesh: Verify that your Tailscale client - is connected to the UTMIST tailnet. -
    • -
    • - Local dev: Ensure backend server is active at{' '} - - http://127.0.0.1:3000 - - . -
    • -
    • - Cluster admin: Check service logs with{' '} - - kubectl -n mist-system get pods - - . -
    • -
    -
    -
    -

mCh0ng)f!s(WoQV8zVaion(5g>UowmwEf!o+6dh{9t54vqUy_RJ z7L0+$R>nuArq*1!*;p~2iJKG^kmmZ)imf%1|MvnIC0%pc@x&@j26m$E#CNXs?_}R> z7bGX~{UE(|g&KpyM%!wW)q;cR`#kB~^E)Jk6d44w?Oy*nze2?+{K8Ln^9iAiu>vh; zQ3fO)V4}yrj83zY_*uJda{=h77EKB#Su(%xC?{1&BZJf(7_uqAB| ztrHOL2$5(I?XPXip~?e4l%nAz+RLqa1<)%nXv;H4`u~%pw~4`>SRvwLm z2L;6W3_v0WhiEbl^aTK-3($W&8XCF2YkV9RouwXwY_UavSx8%PBc)?`B1blTd5ThU$d!t3*!U-dLpzy-xu+-%HFcq%lKNQ&k;567hlM zKW&Nwf>#fYD|9z2e0;})+dI#1!5JubDV#fcLc)5T{##*dFRs^`nI*BSooUZ1FxI0Q zZe@&v`WEjIf71f1+}#GuF1javG%KZ31F2j>c?}Q+Rm4|sQ`btJ|Il?~ZU2)FcaBY; z;wF?${3gq=Ao!JY3vPM^WW~Wrq{uxuczQ-EWb5)WVuE3(a;6AMjcNTD{^q0zoodN6 z45g#X+gL5^JB~}>v#EU5i3eg;r^0PsW94JfNEEeTS9_GfK^$iduKM@Iq1c+k z%rsW!D|^FJr=nPUCwC91xJGZA70bTjA*1J{0)*Cb=0F^mFh;!>3kKUIBUTWi)LQ^j z_$7!CiIo9!NJ)}b8}mTgSKY0!rH&g;@j=K`Q;?^vV>l$Ky>Z84@aB*b>vcTya}uSA zud1vY|7a2as9|>CU1Rh;4ilh#3?6>SA&3#%EWm(V5t}|fmgDaJBtZ+IjbQ0tAOmEZ z1~LE&84~w(+Wfbi{ie^VEEeCvQWDatNLBrYHdH?h3Uj_KsD zToJOi1Ui|tcQmq2lo^iIsw#7O*_)sr1Q9T$q>zeuY-%K4`D2RD(Ld2eg77*qxXKhggZ<>LF@Lf}{H~g8`DW`QxYM;M)x6&g5D?5CWBVJ4gbi;q} zQ>qd4LCdwO)-7curR80PzMYz(A%*K^|7gZp^iww!V#5($ZkhB+D!%7n3uQQXCw44bB7=@g9}!wpK;q zdG|pZ2MI;ZFF+2>A#v2u!~4Ds7d3m(%e%x7Z8874oB^lqttyWVj_|ms=8(V~9iE;+ z4Cfs~VyD+rjBhoq;+b!x3*Wjk(T=YFivZ;z5HSQcjBj1B7oUU6&OV*aoRkL%xkzsC z9$|Uf^1`e%S;*$Ke#PE8k2=2=p#NJl`gAnQ1`{2YcanB)`1;Sp+3Dls$xJxc9S0&@ zCe5mIFMBa_3Przy$4?X$XNJz4~p(dYL1&K{Z_+J z{8``Q0vTwgZ(zh}&p@r?*Zu9yql63Y$&zoJ(|wOa?Y>0aRIaWjxA8R4IS*j?1%1=? zZ2ZIYNOL6LDkoTgYbja(As(LB5%+6JMOi(PQZs8lulCd?Z%o^dR(z;wrfx3}(k(bD zoE%jZbTbHATfuJJub6FA4bdwL#+Qa0~3hrU`r?mz7z z-h5&~tB+6%X%TbjWUE@dzOW<-IeAcXRzQV?2|4u(HikLI8A=};wakd<4}-hOR6=Ypot&678>3|9|7>^Kgd`G#(XDhfbKFL zej=rZ>=5hI_0oml%`H)?9g1Tks+0H8h&OGwCcRm8>GE{$@do~2aba=?^5MXCD@o%P zPN(kaZAyoX(pK#9OBOdbBE*}iPX*Axj%Ok|J0!MpO+PfPP4R_#OVdn%RG2r!regN4 zsC^u0G}$7??P#Sy&niz>ZA+BFMYvUr@(WbdyN@}yut*AakQ1-Iwudi_>UY}}`p=K# z(V_xl7HNJOa8PZTUI4Y!7hy!{+fo63wc!tIhm`yRaM-l@E~yb~n7Aayqk|&tta3>P zV3%p;&^6>On(6B8wdvz@TzQQ^HBv8pylKFsF}W_>vj9JK|IJWjki>Ma+BaP`K+)Ho z_}KjC{2VCxWppzmHYeJcX5Noqq$N0PD_B!t>jC6A!wfnHoy;DG?uv#WQ3g-;iv%we z;9pMZkHgnmA|V95J%5i8`Hw7R(GXGYIa0sEG^Ye?iRuE7unMH8hP=WH}II;Hj_5hF8WXl+OsFsLmUUB;`)odwtEoY`DE#)#T5bc~% ziY*x{N`U}CiaC(QLQA2UoS%-FtB3bsG7+#GODZ(7vUD5e($BI;(+1tZtK)!U?=)UB z^#FyNsdy~W;XVa;V zexTsa2IGXVJd(;hD)^E4#gJKm97Ubksv5FIAT`y)V@a(3@I{9od*kaL-OpgB=lg`B z0XdAcxx}^MlclJ9D)-O0{@d2>CT^F@ug7M9OmNcMm;XX2I+!}Tq@uLCz+d9Rnlt|w zd9!CZ{fR?`tRT64{3u(vw{J$lJ=Z}?D-U_WI43G+OUl;T2^~dCqMgNz%8GptdjED1 zWBg7~e(hZHXS(v`!ONW_2m*E-@)^vXZYYekp2qsQkurgcWl1HsrlMNqS2w*_jx)?K z9P?dc0QlW;D+%S$+0%z_!(oJf^(-?Fzwk!&!EbJ&5Mn0O8^(q>KL}(ga;y^CyFm+! zLVwT2^MjwR7Xlc}I1sFX*}e)W2wCGNkm=*j)`~wm!TL)C^0Xm9MbxmtZIyJ}Nr;=^ zw2`9o)&+2MJ4O0}e4F20?^sF0(cc0d3=zPhRb5ljcot;vOo_g>vg8#K!d3PynnNi@ z{0vH3Zg!o6KJA}dVci!iIHWfJvV~abn`V%q!3Qj;GYU;c{Ch&f$RC&`3}`YCc3ol> z;yRzsr#4sFMRk9+Ag=hM6kkGo4#qAx3(B-ecf$~ra$2;PJmSS-qQxmW1kv#3qEq1( zrW@fl0O8*y^*WRAeIDHRp*xcY442!BTYaw}Uhnmbq<#q&xrY6_Y4;D-d0r+Pu3^vS zcn#6Av}jAPY@HWj8Bxdd zk9!hdX_n7=WNX)RiZSk)-N#kAiEuI1eb}20kr4E>)%yggNT>-YR43Us*5pmu3wxvP zZh#94^YBHSbx8EDP(6D!5|2&M=c1SHtj5~7sED0VN>>HXrc0epSGVNhz z-LIj}{&POp5p@0H>y)=yR6thWd>BB0$F>w#smOv+ss+6sK4{zDofjaS-hoI*OIj#c zi6ASyc^v=AdVl`o)lCtOLG?Ft-@^r{zpfv0oPjk*uJNT6UGQU)U{?aikQFWXtBc*- z+rT0JzOn4=8jf=LHwjvXZQ0m}dcmg?6GnfQbonZheIFT%{L&W6!|swRDurbSD(pS= zn=?O($G{!=`x{{z=O0Jb8m3rE6@-|fLOAnYozpw{$cV;#aL6+B{Pox9>sK^wSEydM zlzZJt{@y?oGJPfAS3r0r5-JLVUL12hYRE|#Wl%ox@UMy$P>Z#f?Bw>i6BU2Co;wjU z-y548wNCgX7F_KP`&h=bMoHnSN{ek~Q9q0>vt$VPQtjf1yyj=UDB1Fk%40D}X(ECT zdtlsm-%}6-R7$xA2f|g`YtNcD!!l~mt(o|52n{pmy>iTql~AE$9j z5_C_klaztV_iJO0?3bC?Hq>O7{@D_JG{$~Y@&0N&zV&69)B=c3zC?;Ta03~oZTg@) zahf!9ijg>rSar`M_RE*n*Q^3Ywk#PXHgI)sR{~*Q1Gg=X&VFH}2!obQN>E9%Xk1QM z*O+%A+`p#5)>J4^Gq5Z7bVaGv_~J_0>gqclk@ z+3q(1>QAJF6%44=|lfU{!uI?JMNKDD0OUu`V2-0E@rzpo zvoac~kGFIh!TBixE7Q~z>BY|$T(%pQ2to$gcqc#VJ@J98jJwe5vYljrtQY+E5uX}m z2&*jmPDJyNrpcsE76*uBhrdj!q6f2e$pN$@`sEG?WNK*AH1k{OSuK^-$B z+pCH%zmT+}K?zm(_wr!4q_e5&*O-A+EYW6@Y+So56WUZ_s zzVV@h+1Iay6&dhd66KV+gon4`OFCH{2`! zyR*@o-~w6=Ax2%(xdnlW!=`E4i1>pqA1;N_G1R$#2EDmiS333niB4*mx#hnyw)kPx zQ*?LZ`4|!S^bn)!I4&J0yo?O8&YKE2H9`|fniy+1OBAdI>?w@PuPAOvglRB4;ks%| zhJdBmeq-k5@mlJ3=eiM~xvMA1xERvJ6>0@Wdf>k>hB0e2VChr!_ zqbl~2u=*zZ@~F1re80m+)CBm*TfK2O@ELyz_3%rv3z;m4rNEVLRqJYUnRfLn!GpEiJf>jymBPrljJ-X`5^s!ppBb#I`l$Ef|XrZ!{k`Zwz??Hfly&-5rT4 z_QPXRKAXnx^uJ-R3^vecQF#@ULsiwezy8S0!~k5c3l*hTMQ)^?GQ|v?gT>Pk*m9Yn zNykOYW~1S?VjnhKy2)){uo7X$$kX5fq6O_NA<<&@Ae0i|3SJV)QZzb;jRx1I?L?{e z(Zl%sCCxqp^S6 zWKG?7Lr5PL$3<>GoD6>Jz-*A2ZmYJEO*vqzp;cOz_%*oEdGIbbMGG7zuN1S;EaC}o z0eoDXe+Ul+YPX5st4nRQS|&756GjAcUt+SCOJc&pP&;k|=~6Zab!mM=iC@}F=$Zm5 za{jaM-hC1xzo6jkYGwd99)au61<^Em*|%{fQe{>fOp?`HgKip`JBPJwM`z?|^qPv& zsy8(gtdNS^G6v4^dI1X(WzwRGnX}--{E`T13{syxaiD86kMAB>vKze|?pbu-&9+M9 z1P^*)N!jvH=}C$|^BzbR6c#}9qduIWuP;Ws*F1{-?hi#4#B&L4&FpS4WY+^!!kU`0 z!|u)?LM0eIFh&EUjTPuLMIxq64^H37C)XhbbYkrW_&izlH{^w4M zE`vFK%G=-R;zgI7Sk=y34cGwLGr!C}On;DH`hh(5PsEt#vRf>98+O?XV!ke@MDhko z$XAvti&?2o52bM2&C-D6*O(k%=#x5LuXy_&p2D~C<@`TuusV1Wsb_dK#R;H#`Mq0e zkd?d@Nw~qEnY=IRVl*TA?oT%P6XB~5(evNnyM9H1T^&OkEqO8cHtG0F84FuY&8T4# z_>2ORQ28&3u;OY=c2KeA$68B^`cgLX%s56bqBRbnlV+FRc3&l`+|Xo227lRs z?jwoADd;CC{I{LQ_==bVBB zs*H?mODH=$FDHSmQh%XHa)+r>nEDhYA5^ueA(MDlZ1B`>Ob6wFbdvXX)aZfI!49lD z&;mp_+H1spdJt>M+~?G$W~cN3nS_z~ZD%Fzg1PpoWc6UB@PU!mvnPAk7=5`eaood; z5U?zA4pMXdPEV%gIpsfnjPmHY`@=uDOJ2WrFrrF}xMPP1g3VD}SIIWY?Tj!(sTZ@U zPzdf8bHD2>TwR6Boqxg>-fJFfGRyi#{Kl@86i}<{c7Ip zrwitf?)rD96q=sve4YdM|25qT{NxW7XJytyR>(cMsr`7nY%xfFjs>O&7nKHE(L118 z4K##!N}QBN2N93h?XB#wJn5Tx2}fbG9p(LqU!vqE#qz5@BM^sISxAB0mtJ0*3Xq-L z-S)U}r7Q!+)TO6R@Rz0rLKI>FBWEYazYWAOrl*gMh``4s{r;f)u~E;lkGivZ9RHag z+2hJF{R)AhTrVISD@kd7d^tg_q~p3uot&CnvT8?Ut z*!3O@6+7~Ko#0uz_dn#MM2K%3D!V$aEgv?w%bqu@8v3btFSVakOH63AW0f+~loI}F z2yp-bmvn)IgBv>38ZKSD@Fyfv8DHs=yUQSVn~1%U@qcGSIhMnI14TP9$chIogX~cz z>-cxX4tZ1&;#bMd_h1)eq%G&S+Cl0sBSusK~2}*&^^IPe8O;t z?g3djx4VQ*CAWLHXPHNZwUoGHfh7k*b&%wiNKHVCB0C!DR^br{)=`56cKv>UF;0!< zLIomdpa=xy+rPh&_ZO1+&q;?Nj~`8hhWbygsqMqkZkETN%(8^h;YPn|Dp-{Ndvj+n z{U=z+z53JH#&ep~)0w*7JYxfI)r%Y*7Q&qP?P#7I>5>4aceE%Ug>=QnDeqxPQ))v2 zZ(UcafZ~U5Re$+6d$*7_r}Jz;1Th?N!cB(-VWGI5|nJ)L%u9f}+_ zVyH0BU$+FPFR@=(xZxu~tcwF*MzxHxd&zs=EY5|983{rmYV*R=Gc&ilQ|iEm_vCbK z&OOaLM=Hw(qIy{LPH1G@+1dYel0mU&-5Ox(gWk20QTj-bHc5kz$XG_ZBp|0YC31Ud zkF2W+IK_dUJn`v- zX(qo~_#yVR$Yoqsp_va(A#-Z;vBEpj;5^m7z4@2!&izJZ=@4Mpwv7se^ivT=n(_;&x`zuIE44Mw)U;C{5{U*+(p0K1IFGYR{{u8JTtqn(y$=a*17}S-CxItV#FszfW zWPG5tmi~nv#|JFzKrT%{h}~lGVAbzsF2WuXURZ38bP}U1LkhDum521ih!8L zz9HAG*ifPD;h{r|VzS1%MD1wG0K^%i1Z>)AJQDZ%Hx~nshzRKR?+fBG@%XPe;Yo*D zQNxAPLni@9L)3RiRPzj-6ZSVX6Jwo`cbu%#k`WSEwboRy%Un>8C zQ#N(~wN(LR$AogdWI82a>A0SIKck@S~#`C_+qtp;UIuF8k2d;O=Y8L69p_xg6k zS)jw)GNuRMK&2w4BCyO4(WutKUvluu87EpH)@xbT2+(6|vdehTzeWp^pZ9iJ_$}D3 z9HyBiE%DtD10kX~aeG5u0EVe6C#!_UuuW>Je}!q`HP2(a{wjUaiZ=FEq`Qp7nWmS; zR%D?a_ZpM8x8dB3AN7uGVR0*vi7}h0L?BxmcMq(U=5p-}BuR!Whpe7I`IiOXRE;er zTe=mD4W;Y|vpj-?xZcHkfg9K|+!~aCbt~=S7tA|GXmZ#58T(ieTCZ*xZU7hU2$NU>jbm=)uJh=1D&Ke5QN-65QK<5e&tHjejmZ)L1VhSd_C$c6r)r9-1TM$6^mAO zfn@(PbGU}5qz1VP0Y&|_<~2=p0e-qM_S!JVMo0J&@|Mx0Z@n#mz9cv6%UOX_54Pin zx|UdT^OkXGdM}$9)|vlv;q99Q-YeX|o*xH(5bphUE!No*B)C1p+*K3jccUpEyg~rT zx~0aTUJnqKax2D2;*wL@r)G^tWmd6buX>rw2o*_D>*}Vg4`g+DjM;(ju`j)meDs`T z_}wQLC66*N0rrI;#lZ9`Ts?ZJX$zi9NCA(q)8MV#Vu*V2AqBMFfOF};SjHVpDEPr^ z?6!k%au@SJd?4`d>&C#tx5i5I8^4drOnfyhr7Z&MqBhZKle1au*tS>)tX;_D0*~25 zn~{cgrXkDER`@oa{GiLwP?*%cET~PxMmePxn}cy$tSPa( zZvQWu6Z@6`3hqdXwJ+z~`>p$+1k)I^L=x$n_e-3zl1jj3!WaQIJ!x{ZBP259!TcF( zcU#>v80is(DSD}TEMQ*#i7ju;`eg)cQkcYT`Uk&&t*)jZ5!}FpTQP-JqLv{3|GfZS z3nHMr4Ab>rzKEpA}CS|9a?Z?L4uR^|N6 z!%CL<&DC$dN>O@YmLB{K(ugZiAp274%D3>j6!D#o;KLh(Anr>MI%nngHWhR+RM0#T9r_o&g1r@vDnHKh$4Bvqg1Z>x{V zL5HV7kVx?HOb{>Jv%=c1=hVNt^_ws8fd#;+3D(y z#P`8sG75vJNtu0}sp&MMcE$9#bmKc@E$;O{$2)>A4tv^@;5FjCCULODij%Gk+YUl0vE-jSR42g*3EEz$hl?`;yA>s^!HUY>lGLv}e| z?sId#w=%I73EccZbU^!w4nQmJKr?b(S#wyJ>&}IMc;pF~_x( zRg0h2o)?P}maoaNVbsVv^{z5op;HTzex<3N{#Yv)Aki68vb#CSOxI$0ebAdshL z+-2NWC|{pgkD!=@n1sZd>HMOusp+*D8*q%6Y#HeI#9qo*Uik$E_ysLVk|8e!4PRMQ z9R0eSDJ-?$o|zdq!YX5?C`tI~A!CON7N7W@l}X!MbrKN%r;Z_JE{GN(k``O-Q;kf< zQ3m=VRo2P)PuwIpmck?01oGAUs7VSx{(R3X-wB|b`l`~okG*m+z)jawumLXZ{&JGm z)G9zTMNwSE$UVvT?jU(@vPEc>4mi6kK53>GGpy|Z`-}8JgGxeVco)v-q`PvD`CR>x zRlovLv;wLIEzlsOr>Cb(cX}bfWM`rUe-EV`Tht+5U_ng{6sAjd&;|zSQw+Rroclum z8*}yC#9r-%-|>z9SYO8DOkYic4{q;;t?3 z1b25YQoIDGK=DFw_aKvRX3hWncsTi}P^$1ce5%nj z#JiOW6*dS8j?s+5!YRWqmNa}twzQZuHd*1_)a;3>{W!5e6RAqftXgcbWxuuRuwi9w1u875?FFXUo1uc?FUU6$dLJUNXXleb=MC9y=CJi*KX&@QCl`ho)0cMs zESqb{=h}_}rTX|eN)Rgx`!0*;iwcwrP~QH{+8h4%G`01PF^2R`SXUQ+Y`fGyY!b$(0FSbwQH4BM6l zRyoe7K{Fo%5B4C*fp5M)Cw910O-sl?&fMlM0psz5gyK$TSMGvV%4Aw)S7I6m1pD+Q zSqJ!jp$jnS=#Am<>H0Ecfi8vpeBF}-!cB*x5*VtNR@RaQn0DTUJJ_W7Rk*!~c)W&@ zkzDkxEe#BMzb6aoS%96K1Dwo(3$u$}yw1EB1rkK&Rf*YMlL32k+*`sA`M*!r9&)FP zKEp|AtJ5n!JbzyFp!4681SJZJKGVNHW4*_6P`%IR$P*~(Oy@gdAa0zCTFW~$MqI( z)+jn{Mc&`u22y1ZVUcopaA~t`=asN3Lnrq!v!usI@50vys>kQ2Peqjqy*A2By~OB# zTz~eK%yTot+1gtfaUxSbr~)UHn?*`krz)!(2FqEN^}`gOaf>=a=BL!)?Mny}+vpX; zI3kN3n5(0DYpbF{4TZF<8)bGzB#1(1Nl=_u!l@Dw|KmlG6X_l$kYT{0gGlr*#5dg) zAwC9<5?M+q=lAMvAb|x?U_gI%%bxVpO7M$%V9+~LAW=OrtQ@=(;8T7{X78>Tyh==w zt6_t{02&{rVa70j!+@Mw+ux{m1$Uw^jon?1AFEv@P0kED5BM9ib-_ zn(H#Ie7r_O3w_WzlyJ|QWZ_P_R$YBZX!uKY^<{lIvvPls=)vJ(Oz^|Sn;t!L&UTa1 z-Vgnj=j(%>QB_giT*j-1e8R@=cRrZ8NbpIot?ii)Q6A{n+t!`V=WAmchPALBC|LX5 zRU0FsVC;9!=$KTRA@2}U>$z4LKC&At0rKG9$1zXd{e?00-uE*$h|4DTvwwnjD4X>v zMQQKarX>@}Fb=D{YN3s-AXdRQ?X38hsoStv-Q=M2~k#cRTmg z53^;-wM7btvSPz9t*rKAjTHU%c^CteFf1Ke#SB?nxo)EpT(t2nQh{VP!ToaBl}y?6 zpsBZuT|f8Vt$fs0DW#uZKP=p+-j0SBxL5@G(+58d2OnH+42&qM#t1p%;+vuw!jmmZ znVLZStt^7J00=qId ziaWUq5RFvm_i%twxcP1S^b)y>RLf~qm94?2;L4$MDoN?jTm~Bldb&BRAQQF-U{zxo zqwGOPY`azp3s(VGM_3})&Q))I9o0FUdR~sE@-TrDaibpz$2i0gcpqvAizy99KPeMB zFy%Z{t`$WF4d6^0bih;QM-^Pr5a8SF$x5j<1jp*CYj?B<|Y*So5+^RJ#WeHUH% zulyP39zDvuofW>L6>hzI+)7X@ocJe8iOp$HXR=_#JEuG9dCgx$tMxhoAltohC|htB zqSglP{G@K~{?Pqf<<+E7>-M*Zefy-3+cnB4Z$YVXx0+!R@+iX$=7^Y-Mg zp6m79Cy2||&DF3NQ?waZBBu@uC~EzswQcOAPSljq2pztis}wdC`7z`H!&;k%&3$Gv z!Cw2v9!jh%2JSSqY^_`xb}0Zd0G_(}gF@?c#}bK(>clo`mlj*b*~d(ZqSH^~_|Y_i zE$m3D2H#g)Z`bTl%O+Hh=lN z9Ib;X!p{AAm+TH|J4{3pU7;;Z+HZKj?g$LLN%qxL(4XbOPK=486^0LEwR=~x<& z4p{nb%av}$oqc(_%A-H7m!JL%_nTz{Nc*20O}>CHKh;{qc@c#=XivfhKnOedi#Zgk zl|0!YN*bVqu495hqPiD)y(VCB^j=`QPhm5?5CbnQV+PQlew03r)cJ{PaT_M6gH5`k z!N(=jkDO$VkB+N=t`-j11{4;!u1{+b&zkcZj%iKzqjXa1&}bm3?~^&yT@|B5*!}#W z_OKl_<~s9@Psx%`A7hOfmJ)1&uY5~+RX`o~!|rd&rDbw}A!X*^K$Sd@cQf7M^b&`{ z5A#lY%%z3@FLyyHDJWVDBrV>=uhwna9TP;vzC(pNJ=jT0xE1UU@V&P_8$ zUZQAya%Adt#n=P5AgHffSjMKuYirVG{sW-?dOY7VHP}D?-Az;N@9B-wF27B9WB)DW z2ICiqfxiq2!8g-@l;su@=IH6*lcU=Mf!T%6lVZKBW*i>FsJ%X&h-=b>`ZIx z;u51lB~G9@=O1X0nMYVe-e?bVp5SD*+Na}Ysk5(iv{_am9sr}ypMfr4XsvY%qnGmL zF*>x*{WG>qjM@z8Ppct)f8ojvyeq2EM!LFBX6>=3MO|({g&pQwX_npoub?Fr1CgY* zGn3wdbxvwyUd_JhqO#<`F2{PqYWC)3%3@~FsaWNQL4gQ4=EJ$-TKYJ2csT>UYm^M zWOcsAccvs^>H-1J=~OV|Z?0IVJWGqTi3(KwSCnGA+4on(Unw91FR!OQN>y10?ZjeR zZ^2J|4S0bh&oDAne+6bxyi8KTLaV&hCOwR!?!=awjImGOMfIqSzqohISdc9$eNl;P zV`z&V(y-R_@b@2umMhlaa(fX)iws>0ESj+WA~&k2nk5APi>nL21R2%zLsI7)39$*1 z`~tVfrHM z1X=C9G$0}hzpAEU7&jN|>qpDm7}aq4@!4&QzlQepkJ7Mr_W8a6a~9I_5H|>^MxGMmp}3?zxTluf%`iX9hj9^N>u@s z4r89&JC~O+!|F)A!I03@VY+fNb&WRLPl|pSm{0bO@!%tVj(IlkuS&(#1e}-&5&Uad z_=q^jrj_BghUr#bij<@ycBif(q~%$XaRS{d!#$R1TEuvKh`5gS_?_Dg>Gp0XC*Bl911W8F)lGtA zSyYitTlvMeH%_}Sp%auX-NoCpdhgT1I~vc$mk$KRe~Sopust0~E=`Mn`TyGO6|DS? zj(mN%^4yVh6GZ3--N(f|6;>X*GXIA+iuc$Qyd6M8%Uos|iDp?P9qJ+VLk}7T&697V z16a!N?hQa_8q3gLb=!)++YFh#$a&>dhV~P=V$_Ur)IrKr57Whp<`6v7u{h-~@12Tpb+fZpe^RK-$^Ny%-&PZNV z2LEmtNVDrrL2hx|sG+g~u1sm7h#j-B3PaT|Z6weK*1O`%6_-Y9OO3w4uqnkO@2SBAH%ve4tpzX)m%glyV87u zUzwgx#9xtG9X?$}=sOx>%b>}LC?VyA#LzYIm$M(*NyJ1&bk>!C_Bwi;sR8u4?( zw+Y4y59swfxm+CIFGnS-q9r*Vlzs*`EqfB0$wZ6_L7Vzj-jaH<4+-tWbzF?)A)at% z*j>B>FZJ%#4U-R;TV@K%eVpg|MZb?`{kziIgcii?HA#!?Vx`*q zr+=`=6X9~QhgW#!Mev=ena}&fhHj9jYNYDk!mdY?!(VQ>@MO9AdB5^hltOWe>z!ew z%>h5q&X_uW1&Jb_Zvp1h2J}lgU0e-et}bPSuAoc*RFG&xe4TOSjQ>Z&u9iPC`zY+I zw6#sJI0%w?MWG%6RKwdtem%a%qvv4tHTWaf-n*DY&$i_bE`JXcDf{Z6RG0!_Sh~mL zqikTS_xj5m8+%V`kW*62KXAiWLYP#sls0E59q^vgu2SL-Q-a@LTNRfw$_GznLm<)X zxIX0vF%sHRU9o(7o#K;pUJf3Qvq?7WG@t7%*Cpqxk$=CeQ8M28pmk8l+ze`NyBQF< z+Ux=|-ZGXKpsfbqa9mGOz3t6kv^v+#88!;vx2=V=RiF7-mPHZ+I4?RErI@^zP<~lV z4r`Z@8B1TbREE=npn{WLX8RoGtdcf4$Mt?*r6UG9DbNOX*vP#zuOU;&Xtcx+B9#gf z14=rqKxF2Pt$4_R{EEtvU$18wvE{p%%ed+uG@0`MPy>0)&EVb3J*M&sI$W%t3F?e5 ze}hJAJfm$V2tR-PqRgupG9ryjNQWs5+yA?W!&p_92*17@HPjrP9_6DVwC3C6#d(b7 z#-k&NZpl>y0PA2ZIb+LcG&=R`-3$pA2lsHoa-N>|-d&!$Kb2`1%AdiNSsdHPl!^X| zT>e8zhmn@yVpw}GA~N|xXZ^Mx3+fMWmZI{T^MROZ<;sGiVu6o8d$u;++*9m@7-)q-f<&S3viZZf3W6f*eV>>E>EIHI1_#53ET1PprQQcq6P zV(P4KF3Yv95_dcYk<4|Lt}`Q-c;+p@M0}vZ&Wpxg&$O3*+o&^+jg&TBtw!{JM=WU^fjk$~k7msQyHX{HfrNi>BoO$)~%R zmE%ngte~1GPfIPSOS`&DHK;#ug5Hvwg}K>=-`4@ZN_E#yu@*+7L60Thn=4rE=fN z$x^NLQ_ONfbfkyq*l?+?y6=9}W;c_3o!YtXB8o1itmyEzJMs7k2E%(kV zNP6;rO#crwy4}Gu!%DI%C$Q%{T}vyB4tQ}sApxb*fYKQ5%)Nd-hd3A4hq59cOWGx? zb6QkNsl+<=+NSJV0aRHi71{g)Le%iW+M8&l1Dt6T)-PJ`zH@MSl77!(Rq*f6!*j&&OMZAjr)Yx6rHajM@62g4b?T z(d$46s@r@`H#6LTt`kj=&>K7JV%)O0C%qNEVgds@!!ZRu!GgUce_iECNQ{)Datb{$ z*#bfL-{Ar>+Gj%(ptClS=ci(wMFQIjy8fWoNvo8-ys<7D>ks|8yvzkm(m@@NJiTzIf?OC- zt2H)0+|m)*bQ?zNv^GLpD=2Sd5(O8(4K2+}+EfpJw=zBM<9iiDmhNoj(&x_jyypTh z8=P#X?ClZE*=1}Q&Cj6LY8F!UBMQvO%q;RX68K`wp$?U^m9dXY4iv;|s@YicIXPe#?Ee%stQ=DS+%Br8Fv#E`v9&V5 z-<9Sy4COP&8f4cFY#a(bM1)K>w@(_LDcBP^{C*yXmx; zfS9bGr~r1c$6O(K**3qSerCSN{)QJcJL3O8<{5F2IXq*TyT=KD})a&Y&xPg)WS zl7p^|=ByG9I|+v_9n^~(^rr*5PvMX_6q^nUni@<8@~Ezs%BA=3O>|064yX%D2wv|B-2BkatPsH!(BAuZpX1cDB48i!HT;6Y11I%~E8vr+ zOMXdZZh%6rX?XHdQBFC{qrOGA3$1!?xtO#y;sqHOM!Ec}--Bda+=t`BFQW8u{Lru==g<{OHm&|Zg~{gDWVA(;x9^It)E zgGC*HbOG4+9rnWt{MTm;h~2sonAf-_VB@t9@(a!=qG9Do*HPT(_%E0Qd--B(-}vFC zV{lifuE4C*CcsGa4S<1k_w(EZ#2ruixrUUNNR|RVHp&|etILpP{mYJbX9^5D9e|9_ zRehd;VeFfcW+{P3+Kjc#=WxFSmOOuv^ z$csRf%MG_dVj~Hu5`5L;?_!rdm+d91ZNUbai@n^-LkWw=2QqOcT4Wx*!`{*~ zWQA6d=yR~+A0k2w6dt#GZ-E;IcYzP}4&=2jfjdDL{yW}-SHE=<^+XyRHw{#glbUO@ z)ozI2Om%!O3~w2nw_89^o@7Kfik0fG*6HjF zgf5SWFG^6A@<_2tSZlX%d{lVBg|cn!^0LJ|ydI&B>hIQR5+b3yb4m;t&8A6$Ag=4} z1G~DtH?P1Ztsq{g;h_mO6SYtNP`+qdT!{Rg{B?AOhRzEPX_jgy@i1KOwgl|P5OWuK% zCf~s=x2K+!20mw0JA==!fQtm|3*O}$lF?MMlw`W9)w$)|K(MjydHYetQ_sG}Z@up{ zIafGF-VxMG&FrLzXoM~eM3>ql-)q5H^_3EvV7bW~asKiZcO4@2cJtN4!LOLXL5w8a zZ~Q7}RMJO(L$huv-Ar`gzT24dX{!=37>-@pqx;b1Q*#`eMxMT&O*O;z z10+BBz5gK?(2bCD+=@vk0%5)VT&zmYBYT-R9AGyYb#;^#4vK!cUw1hjcppDJOw$m) zKc$u<|0)g!Ly3&z2ny>}%s6`ZG$g#@pisibIA-0ylp6YnEEa^r#*uVDlu?cDoEH0; z(s5>E={?aD;#FV zesTtiy6L?NNbq&o`C1U%vRhU!2Ip&XIH}KX(+Fv6m!R}>08657T~s=1X>8Flc5j9K zfv$V_5V3MrtmmfMus%7JK`p7f?d#BW+w=XxqZ);tkIRw+{OMUjYNowTjPK+roho07 z)#Xd*{i3Lk>_zYMAaUWhbb;Wv2CF>|y|)>u!3zFv2|AMz$wOLf3z@LYPR{#EKYCa$ z+#U9qbj&+AGc98kJA(L{>KuUntz!HbjaSxNMK~kX!bu1rh&)F>CnFNf36V=Hzmhr=v0nPVlGN*L7g2dw z$Ot4T=9_mc5=Cy+(y!wh{m#fTDibXwv8I)qG%t|0sfl;Fg`Mu3z8WzfC$pZ_PYoOy z;Vu!wURwmPy@u_|(>BtNkqe!!jH3 zEjsjP><=Jjq$9%0K3N784Jp!Hf{j)2h)e_-TU0RlvK^QO)m0O5VTuKs84T%;#Sb)1 z`ee#{rX9!9pbcPKPWp_>0Yw?@g-zBtf8X6jWe6l87b!elqayt&B1R9EQs$ZvF%<8_= z<`4S6&EuMhZXuQ7>*iLrmF$VsUM1NBMsE?eGt6KH4Z{Q*E0pkzof>Ket9w!C#O*olw1J3}Xeq95^9!IkQkZ{gXtu zjN6Tkn=NDguU|*r`5POQfZy3v`q!dznU0&B6*mxQPYwWR5+Yb@@Ab*+OuMx%TO`W1 z#=_ZeiHakq>1K@-u>Pak7@kbQmzW6IXKg3iTnn4Y7h?(=TV6#aMO6K`ECTUd#GYxV(=g_(mv0 zAtnjEjth{^JnA^x#?eKw9M`O3k1%0fe6t_2PKPENxPsUmI;Gs6sM zuy@*(@AT?X%3PhUlPklMc+_65~|z>JB>kouq|f010nhlgdWYzngqd)HWrJfBL`iUdB*laxU5R$#4mH$XJBKyXh5f3at>IW){}^NaGU+vL zQsHBx%J#KTRqd44B6|m=t?vMaRPOyqipxOGQtwbJn&<8Er~JN>}R6yL{B#^KaA z%n{i5#kZ_u?tCNqgd-R(aDEXqUulc#^l`SxR-on2AOlK!CB{EpuVrnfy#I_X<7Jy9 zHI8|jUa(ioNY?>`W0~m8NZBtijc$}N-QJ3bb%XzM#B5Vi6<+-ZX7~Gzfz=BIg+z); z)fGv1mRvKpE<}<61W}*SHNVCtnObQQqh$TeaWf`NAab80)$}CyFp`#|h_DCn)T5Ty z7vo+o7th0|uj!_(h)lZORm~@o7*N3!MI0(Pig!Y{ zM=n(|l$1#(B#>W2upG3gF?ldJJFX7&6&El?7R)SYV$_kZbxFXQT z+iPj_b*RA!Yl|r#Vm*xeYl8dK8PFtqv>-B**HZQ)umT#V^ z3_qAl1*e*f@w+6q;#@)VK~(k~i-5Aj&D?V6?%!s6LXZ9YWSaOd1_v(8f3cYNtw*>83&bbmojp496(rW7`jQGXMuF z&P*Q9Mi1-2*fHwV0N$10h3n>69GYZ?7Hq(mVW^^1KAUQGabdIdCgO+=tAJUS|A+Yd z&by6g@4zjjEpIb@EPzcX=vNE%E_f6cM`lb$1t;82vQ7F2O~&oj8KzWEObWFEb}J$D za>z8i&8m&#VLLba%?E$56gynDwSI_Wa%Wo49_GB-0=+@#ftvVUsu^RP4|A&#UkyX- z5RV9#8TH9Zu%z@(q#V;8)s~6~S`B~0xCE!To?p1+Ml%)==$=26Ph-_BuKBP_vk-U* zq?y-R|NP(JH)Gc&_{9VWs-OrOEqW`|zc=qgfYWw%nGw^n3-(QLN#Pd`9R zFUVMkD0mRe-tFS>r409>ZQd+m>CN&Ewn0tyV*FE^XPLnVLUXY<6Ok7!9rNkT6#k!HcK ziQ%tsj7$|8LIn)crl()892$pt(l1qv+It%l83{Ox*nSefoNngXG8b+Xa<1SUv&%kE zh5+}7Me5MXt!J2%2?%=;UHB$AX-Ww#c`LKbwnU8_?2SI1`4-I&m#v(HCSqYFs;)3q z`VmWF+w-yDTcE3&XhrEu4l7F34k}VJC$^(3I`_Ss#-alH<749I+@LK)6Y%FJ3J8R{ zlDZN|{3i`QS^f*QN=&zCK7YDGLKEH+i{dZ=kvFc zs}H>#%r_ukz1XJk&4gR{qYZv_?2G)~r<3>X!-c{Nh=y~1^c-K%=Xv(yJ}l@$DgOKv z)e3y;P>(B@asv7J$>KH>y`KJLxCLrForoWr276JK=n){ov3%dl0K5&Np#i5)S?wUSe%yhp!i9~ zND8}}G0vQDW@laYy(7aujWaneK`y)tZwOet?P0{N6KG^z#K&nohP-ui>-IaQS&+WA zD(^uA0Sb09jrW+n{fstyJMYIT0ps>Q=m37Lu9Dc=Lczr~O_(mNL0>;IhZNp;uAqibKh(4p=tR$TuSd<)bO+FoWP5HZ0|j^x@WX zpb&>IlaBSUXO4%zx17n!YiTt&8qD%wjf+nMe_efWGKYgyDCTw9Q>h=o*~lDU}td^U6zrB9?_jp`+c{`L5bY!hKugL{6> z8X{3sl?ima)m8oKVn07wM*qcK&PL&W$EOkw60@0}hX*HpBhm7{g{`332eF7Uv1-8j`#=2&aYG$P7!}gP&>sl>&JFW%AqLX zA9B`Ax^L`f@e60f-G(yyl1uH7e!TdP%S4Qp#K1juMT-W;6idgiNKJ_Z_kn}5kBqVe z`|TVxmc!2h%mt4pArq4qS028Wkdc==wKoGTYsQfY2LrD zClPu^JugAF$%Q^%J;`O)x5sf*-I&&Himfy-Dne0OyXk%y~>MId;sbVcMERG_A7yF3M9!IprAw@AnURlzm+n(nkg~@CN=u7bO}N89Y#Nw;B_^ z-&{HC2ts9>O@`5*NalMHm0q+6>^7_fMHndNK4&*_b;VM_1pOITu9c{ePUp+g!c7c{ z(};;abHlnUMGSo4hK7|8lYB+s+ih&gaKpcn1RZqoGg0u}CZ+hrIh3PqbYz9YVGX;d zM5(VMTwDfeexXqp{TnCZx=-3nYn!5;eL&KNX^v6al%j4csIOws>9D8?dSEKYw43K; zXhJ!JS6^%!pGxUu^>$&nGCF}evRo9ZPuEX8kPC6nXMd?6 zemQ{xlh50C_t2MfdPTdjo2|Brn}{NXyLLSiPe4Fe@cL6~ZQS}{C(O2iM*`kFMV&;| zW7JPEe5eT9agJZMRnA_Om7M$&4{L_ssbA-GF;)U%>UM}Qyb={1mPjaYT7{F#^Cse# zn_Q$HL@TuY*qgPfuA9HgLUD(%N5h{#hI$i}#N@zf9KGrDR05Uur3v>z3vCyI|K1>- z?fY5be)9WkaPDj1#%$A4-mzE1a2S7s)>)}kiB3${(>x~YbnqHmvaCaq5AS#Hc$gO zOpR3yw#0t4lR&xlll-MbrcouE(pYTGlIE>l!8ZrOH)}=nlU_Q%XT->TNVD!ke(t`; zOhVAa1a-b5lx22s_(E;p6qLH-R)Q!2 zd0lEed@8nDCF|;b2WDiF)%2_{zUh4uGJfz|#h=MPq<278SVWke+$K}M3}pogi3o1L zuKNV~zh`hjqAR<1o?ORI26=)y+NMtOMGLYcOk#Iq);=e&CfK5-FrjK}pm@5FC3;K+ zKNMq^Vb@GtCsf;KWe7#q*drf$hHO$=AfniO2eu;AUEy-b^=3FMH*+|suk_7`5;d)= zv@AwCM$SRGnaM9sQYJ#x<>gA+q#T{PC$z+gV_#%ui?Qv;;O1I{{!}~Z;n*yZ@VYsd zF|;?&xMJU7{bVKp`=YHM9t3O*q6e~? zP|9@E=S#5n>yN*je#WGo5Vw0{cEiREIbW+x!}-42*iCA%h@U1`{y|<|0&{#$R@W?x zxp;d0L-URANARO-S9{ZAT;a+*2e!d%EetYDTywcIDPsv&G!jza%jJ*ci_IIa_Yene zn@V(0^yl79ztQ+J6K}6c?8G~m6RAZ(WFL=j(kIsU$YnlOs>6aDPy%LNfESq_(Ftm& znv|0b(hty;HuKw&v}_%1wM=Y_0s_4Ynw_EZ&PQM4%NBk&zM)@oKN0E|yam3U7f)h} zK1`Wx#X~P~lSByFTMTq|p=4RTRe9T|dZV-E>b{WfBI;JW+=Z8Kz)$WJy%`ZQT06vX z5N|gZJanL2fesRDih)RB$j4rz8UQ=&3b5n|2NbDAO{KuIox$s=S z`t+nZj<94rVMmR&ayJZF)9+xR1=t~~P9S3!R^ggtpACf%n!AgyF~wVn>u_qgK2{%>%v`{L zkMOtr_x;bIpzqqKdoDXX^r3QW@rPkl{|r^pXE-n3;AgW}19Pcr26*SBm(q1YZ^X_glQ*J4u2 z7QQpCW82>}vcOfcYc6+wY2aKcDUpj9>QUzU&xpjR!iX1UR!|?+CpO?pm{(MuHvwhdO4xHtvgnzb0?Z^};-&}&he6j^wCQ?17lnFE+P=kb~} z&k%oPkq0azuTl3EBs$GhPv$o(FTKIGwNQDQ!vYA3i7+j?#TkDMBy3?t}6wZH510>tpbyQ^mOaJ^v?RbmEKapNw^9~P&KxK(%XB4wGgop#(uWjVu^nhg! zxy(7e1nehoSf%hGY$<9*Tq$H??c%gJO~!?UQK89ZD^3++^j%wvHB&ux{>=%#xJxrDIS?71N_`y z2t$ExG#Ut?)>^@diiDaJ`-NHkL@m-(Obve7g#38AYJ{r|XNdxU=^;`Y1e)F#_nRj} zNr!meQ^6I+iOow}+h6|Z8|z9;F>J!T@6vIs!cXQtU=!X^vBvDjI6vG6JmESlr^e+J zdX(Xv?_uSl1;naHy~BP2F5)eF8;ga`vvvl)K|NhF#V|!K1(_}OFJ@qf>1?;KWbUBP zhArsqKXi;6^FH{;zzgVo@4tBscBTagQX=_cN2(40{4-F?0P6tABT5E;Qg=`*EZn@# z8ScVQjd16V+R4ywp3qi|Lv6UzN;=-eNW`)Nknll`02y{N`UzUSmH6OduA^cc zhx0|`Z;GG-qoQf7%E{DzE>Z61^hvti)7$u$>x%clt>`PD{zqq~DU4@bMmeJ8ngQe6 zdLCNhI!$7FN|5bQ!e{Loo#i2z&URj<5%Xp*^K^4;BY$41bZHh>D8(OeQ8G8UD~?uw{aFm5;Gd z+#@|10!dH#gE0exx#)8 zWK}-y9{jBCiYb-by|6V?ef5yiXJBI~>c<4AZMFN?%Uv=6f)p-QT_k+zZ*!26Beveof?Y4) z3TI8g137dX?hE95OCpe^vq?8pAdmSQtr(D*Zci#X$KEzOC1=XjxE@dM+L+ zP=+lX9rbYa{=?#ANUN}j*I3Q+;_2P#1DdVJ9riW*vv~%SuOG$fxm_r80TJws(6xwV zjdR^StMq=qxO0@YZkG<*JAAJMYO{ zMnkToj%G3Je|-QH$xsc~XMgQLyko%vG9s~q8(7?vg1&O6gH+SdOEboryCs49-{($Tc-U<J8nnxd{V$JftRI$j!BK z5g#eBrNTm5_Z2(?v~gSE^8;LSQ;dwuQ$XBlMwGcek3t{p|f);UQ*xe7f4dp$Fj= z7A7nx?5!RVmbVUv9v$9}vqY2QFxqr$S=6Pk@N&x6BW$H>3sxIKD^J%Omyoj|1;_!Tv`Ue<>a& zZ3q55isTEPAJqh(MWKJ#M6qds_0t8ivi|W<*ZnM#)IdQCOM}3pRFsNSi}i2t?ham0 z4=>FC!B&)dk@Ru4PCHo4x(f;2S4?E!pC5_v83!*qPJ-GOHcS58ox@9Frf7M=mlp&* zCfiCI1})u3o7U(H@B6FYc0?B`IHT0x_a(@YB}{?4sBRQ$J||3psspP`cn#MOw$g<^2bP6B@JKC%w-aS1n^8q>rfY=u4pG zxvb2Gk<%@wJOtBy*Z3CXF^cVfE#^dxvdK94f@~ec&nwpOVfd@{l$)D3^8jQiIB40j zzg7C#2v+m(k1Tw89cR9ZtA|Ip2xzA_SNU&j)XAG1kfjzrdqg7Z2bhGtp54vQFEsZE zJ+f{$qwm1y$UL6Emon)~F{insX249Xzf%ZvQbWB@LI^d`X5Kn2lm_+(jJ}37gEPB} zlnpdH#?3DXGnc@(LH^O%hbs8$jqK&=P5!jPG6DF7nA23kocMrqQ0j4=9sI3uO)gfz z%oj6Qb~|EckY;qlzzPs)0QiX--Udqo$D{N`P7xXK=lh_A9hNDUf}z|^MIlw)KWFO2HR;cE#vKo~ZcRYOb#+({!6ZROAQ_iB`sAH;uPf%_UTFkti zKRpaXIs|-p$WB8Zmih8?YR4P?r*@b^Xc}VGrJi)rfqf`?o?o3+z~ECQcOJJve+V;!~N13f9P zT2bn@*K9`c34>os^!>J%jPnDMea_x{O<8l{@r}Z(AP|OFCMpsO3gctz(R#yyw4}+|c+SY9 z!(dlo_EBX$5yT&;zVZR4!q^9~x}W8Kk-z*-i_6MeQ07Y0bm;EJ_(Ec}@x0lEoU)_t zBx`(d;yLMN-m1NP!X5L^NqqqevE>YMjy7woK#ly}XoUCts6LZuY-_Xje2C@^)3obV zKG9XzhIaP1tgAawRg-UUwMQ=|&$~8ruS*CkE&)%AkcHO}gSWe?TSp+jzQ;R9dyoUe z(m0uXLt1yGxG5y2x5BIeP~T&K6s*3Fn1Gq!a1Pw3d)76S3kmA~ zxMO^ph0|bN1V?-)PfV?mq?7S<>oNBV^5YKgl9=c&^&%cM_CrlZ4f;OFmStgJHC)CW z&V?L?3$KWABY;SPQ7)xNFm{zz_%rZrgOrk`8lraieE%ton#Jl7N0Yj6D?=I-%I|`p zM{icVB@0^wCYI-=F0&6p=rvUsK+;QJ9)rQq0EX*fdMgU}g>j1q9$BF4h2JQBzO1P}Ki~ zsNynJ9)yDdxL>>nO^7nz7$S?jkrnTTmuS5RTd@=oh_qQe4&k~3#TQ|niLC=gpr05p zl4Oi<`|3q6@c!ie+sPSKeZ6yayvPuB!AQbI{EycI256HEQ!L!v5&FlEABXEmeqphW z4iaM@nfKfcO2kUUa*>`%qzeiccmOB5JD^ir`@NKFIf%FZT`b2`dca6nOEEo(r=~og*0(>iyVGb#eXb ze0g>*=9z-i0HY~rXHINx$E1EEfII}Ex(CkOIhvV?>APduzV=j3JFlmZDGB`vlKTxmiVQ=Su8_#C3%cQYYuWW(tE z+a+!-ZJMB$=I-{!sa_q=E8v0qwHGXBF4{vYGQu4?*+`f^zht@!^bL2o!N63en9cHS zPDnCGTzaEB@`6Z;D_uN%B2JFbeN1`{HZH}mlc^agYH$pf&oNryb8N4q;M9fd72@12 z)rU1VDay+F{yrjNic@Xwj^S`%s&NUnhd0IFLpK1V6Y@Y#M@dacXT*v{2_)yZ%Q_)I zue7Ry)0+I?MNl`|r-*DR@A|A+FD;)5v7f; zW@q9?Fq&Db=SN;bc*R@6F*W!V9lnd>D|dj2BVfWPe>}10G?KK@n%IWjFjD;WE!Xwt zNO!`o4NP}0r~?VBrIK9^7`|mySLeb;XlBAdl!Ys%d*T}Z4jZHF-oj7K?MelZ`bSbx z3QBBAcrrSS-}cbx@SoPf>L9dqIarMX-&!O+1Ix;OGIq2My6!0&9dv#X*L0mLV}agI z5hD{Au_B;-930#fDZP+NFNapGb3nCpzw2Jo@HChXyM&Nnc2k#0Z_!;0K%@>MTW`w9#y$kp>u z-}ZI0iAm=&csB!_`s6e8Oo?>%_glWV$70&0&!F-Y-%^Q*U#!V%_J@vpvg3`bn{V0d z+x+-$D^te%u%R=gIRwAwP@vCbf||?25f1|+V_seV$7iaGGjFVogpIA$Y|+!`!31ng z9J}O50lN*aA3lPFD8c7Q?5Ji(3=_*}9_#hU2yjCZdx-UQJs#=i`y#)a!dI4~Na?5T z;q2BL&~Sy(6NpsrNq-GAeI>512KQYDLc3O~XgJW$%;!vT!g+`3F47`&%2cG5h>{Op{-Y|d5R z1aD*;+4y_d*;;e_)I3{OKYjR$Tzik2b~+ViW-~gH_j@&riwGvmW*iZ47yK2bo>Q8FS^T@xoe~RWqkEu63 z>lPyP7S>OS%{%4nS;wz%Q}iRt$~KE9Ma(69FND3%^gP}h7PwYqc4VZq^^Hu7x30F~ zpa&#VEcy7qiaW=wFpn%466ACOHYi2pzS4WBskG zE8L-|sE3ywH32b^zMCu3%#g%($VFg7+S{DMoL%X(oA;ewyQ7DMGhz{Qf) zQZQ`KnuufUDeIku#G5v;iB z%LL28$>H+NJ$y<$pzrAChkw6JgF7~jg$8p29spEx6di^5AJkLyLpmDpk){@d8W{um z1f7-(OVf}RB;#Rc@wu2&`LR*WwfS7ttF^Gag-aoSl0s+kH6@@KMrNI1w;bMn!O~KL z?3CP?#5Jg=X!wsPyH&Nt@Hq%!2fc)wL*g&ENa8Qx!Lz3f>>OMA8gYRilcT7Au(1{s z){MI}Ni6HOz)B(r!8_DPPP7#}f(vZ-48M&W%lgnvQ2vp$+;iqfLtgW!vf5cbee5B| zaA1$-1&RJ@9Jb;4m6Nk`e8m8w_w8lkBTgKw-LbV36^X4zxqfp95KpH=`GwU*tgRhl z98rJG1N|h-g|cX;Hq5=8i6#Z3z3HCJQ$~Lq-Hu--`0RhY9ed@sos-$kUv=&?zJH&7 zt$Y^qZ{B_gc(k#UXnON*qq^Q$eeJtF4(R^FUzz!|?)Rfrz58iu1pHJH7%RE1KDh6f ztOp2T2=yM^`%9pjIOX#2h%ARR1htJJreXT+82?w8zYIJ(*D{i}uTT?6)P~W(!(-m7 z(52c=Fe`9s<<%aRDqOdjuyKhtlK#14vg3fMaJxWd>P#$>j5zrk`KPfInFic9iOitV zE8}4gtEnR6>!wTi)DF8E|8{*&6RfGu)~lq5#{_gC36lv`fP4*g_VTRF{cTn$Rlbd& z<+obl7irh}6ffIz+Iwm^D%d!)V+O2OYmOj2-tja~St$}1Gd<;ms8w;C1by|1k%Ij5 z%Y~=J0&6a!?VLW;znts7`|NmfN|TEaw%p&J^*!rka$%(w4_I-7Z*Tc*meEfU2Z`wz zB4$Rug=N4x17r{iG2$`T3AMFpvL;+y0~5yLlmsA~6(YCC{(rGR(uK=sPY zG_bISfZIU>8T=&}4?Zm+uK{Hp3HQ~#Nk3m;Qv-Xv!sE~(6*VKLLVAy!#a2TQjS(HN zp%5^gLyeh_27eyzl1ReM49_cZ>F$ZEU z-p&NE`0{uS!0DnbDG;trJvwx64x@SB0V}qOm4wYmwA=$s?q5eCRuP&Ma=HhF;CPI-_Y?^=uCMNGv zkfyfB`9WJ(k?ywNjWFFc$}bmcl1}f`b&JeBNe^|x8gv0fx)=a1Jhr3`HWHZb!Z8@S zC?A95LU?Ad=^ZmwsV+if_xR+I>Thjk_|f1YZ$Rl+q-eFSz? z%beWssYb3NMBZ&8UhYu6ksQbc>9wnv+PnzGz`I+$_uhW&av+QD41rZyoylB|Vnfr1 zX6Hsiah>IdV;VA@g`7zjhaO9dHBr+CkH5$t@E6^22rNDZ^cLOm(=rKNkgr#lSPYM7tk96JvWS$G&D8 zLjmt8gYiHJVdOq&koTOGA;7;QsyvQ(! z7_h8}P}uMJN7(O%ln77v-|;B!jxyN4!H-NV9AqOY|kvg%an zVoYY5?eE=pLhNgnT|8c?Yu-COdn44h8+tUyt76^nqCdz<)s>L<0^6jD$r?!;M>q7) zq9thL@3U_~)`*jn92bvKY634uJXhsphqGJ8+=Em1Vw*eORL{cC-X(a%oYR!k*x2v} ztVu3z73XfpF6P>RQgb{ z;O@Cvk9uK7wL)zJ=s;?4VzvgrZB33Y=|)D})Ozi+EH*2hAX{Z+=Z$jGtv!00$(zDR zCtksU){RD~f}WevayeC%O@-TJB%kZgk0%UaKO!V}k#DbFqeE#Ajoq3B$>Zz9s^QrA zW0ZfD%g@?>xR68y`6K@J&%oP+uAu#S#}0@N;?-J;bL58{zDEe)EO&F^P=NrqAO`sM~Y!^Vhe!Pt_FACiF80v)bB z0g~K|M5zo+m0PmC(!IW)_TY|o^EYX-h5kzVg)pABl615CS%lRcIDX#+bYP|~1Ak4J z3L;($0Yxr3gQHZd`YD>$#Dj}MId>n=lgEC{0GJ?R!$k@`> zG59qzf{Q?>Q#%(HzKLj6ksJXVBpORQ^!G2llarIn#SxDxW|x_-4@MceSiIL|edqnd z^0}Ws&x&jxj6R?i%N&jSUbAJw>|G%yjCgP#lx!Fk!!DJMNK37dH-wU^K%za~-dk^U@KY9RXhw_xx&5JxB?X%^n!Z-?$Oj&>wp2Qn+||^bo|HAT;vF*FS_R z_=j2l#Kfej0zyj|v?=}GWAT?F9DeKx#uoIrXZGq4bXdmUYsP>2K%5e}t(ePLL0?*p!nq_?+&Lzii!>)p5I9?N@)&^$!GcVTXl`$ zb?0+A`Mi|+uDUr@=zz$Pn#dExPw(qe2S?(UGW&`+*1*=0`d()ti_Z5I?3pQDjZOhB zcv%zkZvkP2YDfZ4M?6(ioIuT<^K*{Cu4kN$_;vF{+<1y4)DHv^sRRxEJn4@lhg}EK zmfxOuZ`+p3u{&_NkQaEWY)Gnp^Njl=mLT}1ekzpttBl(D71Q{zn*Vdq^OjG5HkX04 z3^-m>-CCj$f074!PB&U^^@D-nK5$L2j0AER(BQ{J(RnurOk7n*P|@hJF8RpSg|;J^ zpfA5rD9(SD*v-#ptMZK7eBxZC!1rlhO>uV(H;xj>Y5Kc4np-%s+{R+IGX&F*0e#GH z3IWpj^6(rald;j^u91V!TKvm&ip zo)-HA9OUOCV(0^58sI=5RK{>kibgd-GMtr(Iu$`pyB=mCGs)5L4fzO2O`wjXW&my7 z&Rt?W2vGyABpCq=D*2z`?Lw`iI#8L(SZ%jtNsFac@6D9To`Ye%LTh9*vLzxxQ?}qd z5pM?nx3@)sx1+_WZxtmvR1GuUlx&$W)%?3Y@Er9gn*kTXOjrMbx#4=;QxZiIJ4Xov zxsOf}7=59z&M+R7j>TH)lzM39k{b9>n{i89JTsZ-6h?JwXsF~xD<#*aM?Os))zYN1 zj!x;qJ8UI$TOV3ksQ|Rf?C*sZn{WQX%eNSsNF5um!T&LyQJ0wOM+hHuJiQayvOdTqBaH_KR4A1D7iReHHR zd;mtjC`RwQAKy*dh^LVB3F<}PmDhJG1b?O6qo0t+mi6Ou|cDb6p zKtquY5vw1(h-mXEnJBzh*~XHrp;*Ug>-ZS3jwaBeKR|_^Lk!=95%BTuOj6E+D;qi< z8ea}6NxPL4GT&l4#nK>A+0OelafPv?ImqG*`k zfJx8OAAS>GfETQ#>v0ji%m(=SaV14PHV4VW&dM=UfE~@MN#=;11y)4k!0S4K^8Chp zEIPd8^X|Vcm1RQh>EJWT460t8lzbZzc)(sS9$1jI`)%MI!xk-%0A6{9mAb-;t^5Qy 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

=H^GD#`Af zJT$m9cocvV!TO>)?{I=RO)-V?`qAo28BRuDh`RLX);_iJH|wHe6T?ho_S-~>6Ko9K z2o1NXfTKpzXb*HahN(E#W$wKd#8u7u?cT`mZ16Z-n|GX-0J21G@nxgN+pS-2SYz(@ONs6*Sy*Y>%rrE#A=l4g3sKj@NqAiKhsPY4G z5_&>Zvfs1P`csPhkFR6wWTwX2iGqDA(#Q9f0-~FiOa{M30wBw;sMTTCBW+e1`;AX0 zx_cEbQ5u@ByP9}ju1J1=%;K~9`KMnBllNv?DB0&|7*Oi8RU(V#xt^#+m+HDsloE@^ zZEJJC1+*^XGKG5qsAMw3YLji3thxOPAjNaCq9wOD0^left|h2e|LGM^>^G}@WryB4 zJz*x&C`su}ILwL6jA=4G?nRuFz;B8~#%RzB!I}z; z>RLw0@T6BVdDXx-MF@{Ln#;QvQx|1E?lRuG-iQ6kw2yb)gQt%#WNLUWqcFsQXD`=T z?6}T9H+GD@0N1W}H+*?U=k9XHIL>T2AA=0we6n0`YFg@|Jx&WC0pKB@$*%q2SnBQK zcZRO6{R}|G=KA|AA}-^6xsROAi9cqRM&s8509LrOvx~S7%C^n&hST%f04M}iyTfq7KUKf*x=!1T*{0X1AjOOg%U6-a-Uzu5|9lyWF1KiNTra>3_2p z{}PN~EhVNviTeE}vX3}sCS_0^Gy*_~40h-5RgRoJGyBFAOlL?#r7e*tjgVtPGU!}Y=K#St9%V*Ch`;n7vAA4B(Dau?`b#V-}JOhr#z z^7dJ&0`!uu4^@a24Z_b>)O`Box-J3Q*yJ1f=kW}1^JY=J{XrA_-&t)D5tcT=m@>WZI48GUb(sNu zpPwIY9LyMz0i+;_bik_TUIU=%^87&21p?$wv2k!Zo%;J-K(2eHRG$eS@Z4e+^XkJGv_4+ zt*7(E52CFBX{380fUNB6%6=f`;7xYyWG;o#{Kb`y%7JaE8v=} zcCv2QN-9l%?;<=kl(d|?_&m%2(iNRIfwpX{Y$3yI?zh)w=Odlo_j{nr0;S!o%3 z3~T=7Pz3&W89w>nU6Q(3eMqWAOr;Gb3Lq9S)|!_qabkL#8YW@@TMF(jP>@j9>`>H9 zT8-2elBweHLPnI*lm@d1%=uK%vtx*+rH9uSt26^J#>`i8FWB&3;=R-$B z12Q;_wWdzV(wmt0bXMA^|NFuJ=`Hd%9(MNVxpvnBvCWu}i_FBt&-%;xrFe;<)UVR5 zRemE(eOib8SWH%=K-K-==$y>uoUIqw@?oMi@~BT#LE-!u%OO+iZnUN@daHES%`_vc zy=({v#jd+jZ|#k?xn}#5q3(u|9M7MZT$eTPv$1f#$C>TK;KTdd4DfPI-Jvb$kpMYR zwkz4}yr(C(!{dnI<(CLBJBTzE4h%GUYyUMiLgbg9l6OcSRNpGkzd`!^ZoG&5O$F~> zQyD=Ye#(Jzt`3~X-z`+e0OX_yQp&tWDdS-CC2HhnNljr1vcTaVJB>7KFeeIH!-xSi z2Caz0w5-~R(@sXo0cm8gWv<#L+SkR$UT(k9K&CJdB(5IzNQWQ7JB`4xB z)S3B7h;Equh4CneSf~s%byMw|Qx*cMT~Nb_f3Km0*7>r)y0q^kcCUJQRDmzSWmQ#= z8|WY^N=h@Og-}BZ-uq)i05(m@a73fn?CfylV|#yq-bG1CX=P>wP;C$Y`n7S;R^}4^ zMX^tBLEdWH$n;D~n{&<*8yj0wQ?q%x-{t7=7HO>~yz62$DfxN>XJ%#w5U_w%p}}r_ zD7CDu+d-(T&sSFSIDBI9zBr=E^4zTffT9$4-MfZuX_7)|0Oh3HePnW@idDmsPFX_V_~n>Rv-Us`tu-$&-HcknaB2Nm7e3!{N&c* z;gR>t5&_vm^WT@k|H$~6Rxsrwzx1_LEAm}wZ|fI;X(W_axq}#}+TbtDds`m7sYFGh zMBS@#&o|@O#8yBwZix`fDY8$?o!eHKuD+}0mmrdVmZOU+G<}kY;!Nh9(dtMVmBjpK zid-+Lz7U~Dd?MsoVjsni#OT;51G^4ObZL^uB7VR`0=e{&=w!nz_fEgtMU;ETxeqc{ z4}5B|dOYrPafBkYBN5A4xBC&F;|g&Od^6^vYiVJz*ywd61AYL}=Utur_L;p}_~>NQ ze&3q5cnD0~FV7-p`x6IL%!Z57$t}@5_k?S@t)AzHpUdtB_5r0E{>wk{h-_?ZJPqsT z0LizZ`{%8c^z`&(T@OD~diq1B-nExL?!su={YH%Zu4U?V0cy+opa!fFufA^SsyM= zqHs5x`^dC=FSrln9r`u&H}hAMtjGJ0;aDTVgm2~giq)D)mS>Ee7jRT2Jfo+}<5N~* zvx?@FlFf0L8>mCs5K(_Kjy8{B>G?Koxvs?)l(|jij%JSz3M=*K{yO+Wc*;PlUG21l z@p5@>>yvusz2Tt8Wxh&Pf;s+c_++Tt>OQKka$M+mpr905I|ML7n_u=|% z1^0G z%&uuI-YZfAI7WJ%^AicwLOY#^GD8XKwN^UakB`emT|X0REp4Ax7`(5RNc(AAtbG2Q zKaO|)nQm`?0wRIv=VsVvr`M7W09o&sJ)pUW7M@~Q_UkxEpYhA-703THxut2o$9N%; z`Q1(JK&Pfk*7Pf1Qq>R_4t79sug1eu^~2w?V}yMbL23CNn3Jpcjp=@*$vc}aBWet7e8?%7i#7^b9z() z4#S>o^>&;*q3M{-b~-ULJL1WjRpIqb0AbUGrPcvA=M)Xvm_H}^NObUJrm+9{5uV7p z=<8mReQ(^gpHCeS!0g(ZPKQheLMGYttjz)C5JB+xX<5l~iy{EGaZu!uSS0RqqOH%% z^nH=uda&PGy_=Ad1F-xyj7!$(vS0D_epf$|xx0Xw+4-F51Kz80fw65P)sd;mQRVzG zPNeAxEbs?pa0a3?QsUzccc%%Gu`~z(sMvRPK+pT}jF$PNI<&E{v8b(>$=q0kH+z;8 zv*4knKV`cXU((9Z)>2Ux*TAGrv@7CWce%4J(s1`jT0GHA15WMH{wrBg0QkHVK*s z?>hAzq_kyk88tN1P2R~2NfbbXO%PLAKi?pMod+VYr4~oV!1q%9H`aUU-luvm_Pu~+ zSf1GME6_bw@;ugC_>z*L{pr}=VK?eGiFl72w>RrKIJi0cf56r2uR8 zsq7psmU*VS5lrI-reE`rgoZg&Nr?;C7({*%WET=cL4~CeeQwy;O3~du*p7YE)!VTC zt3f1>`x3mBb7bVS{VCdHvBC&N_10?I!4(?P*z`l?YndZimgc&x?qC%-$s}L&R;r-` znMrGEka|lgNgk0D$4TWro^w51PF9wp)DLFtyl&D^y{aqRd~3AtaY`v_%ga;KCU44G zN*KFRa7jfG2s-{GVpi&2#b4BR>fJB*13pvYV+tNOO>%|y!%29T)ZZxx!il{a zt11;b^;Wf=E>3+UM%;rM4&#B2l{eL-4QcT=MI&TV3)RDh__%;EE%|#|VhkzxboP?z z(ruT#$e$@;{BjM~_Jphtwh}+x5>f@VH0f#{u1>pJzUt^|ENRbM9F+zm^2kHAIy(SG ziRT1yst-2@;Ga5j|1u*G{DrUE5%2@k)gd1#DMfHfI0AF|3$*R8FqtBfXs@X`%5iZ@ z;I-+A`R}>nn2{Z{lg+uQ>F`ol{UvFBm&&8<@L|PUU?`l=ZXph!u{u`#2%MiK3i<9OqPt7AcZ#dLqI{bU^Q#HD*sz%LKDfPK@vubL4SkMlvcYB9vnL6TYQqx)lkXnD~i|^g(U&PiggvSa)YSZ6*EG% z&}{8)?6AJtUd4?c%JG}YJ4aYI5z=+O{X=8FaF$&-{$&J#>iT!D`@ZkB28i`N@*!p| zK1+NoqzqN~jV93~85&C(SskbRDJc&H&oGpEh}B{*tW>Dd?kxU;T2$iNM0>qM4o>~H z<{)jf47D~)302^v9RqO&*_7;9)&FFbd?8-X537XA+*fXw#5Oa}$4!4S@kvYOXA4t9 zRNsUn<8%646=R=AmjRi`%xwJ4`0^Z8(-0{HH~Oc5LZas#y<#T z8GT$OTH#(VgL0>axp|<9cB7hYXrHR3rM5CZKQTT1v*{IZ9mB~nJv1~lHa2v$QWmjU z0vuEHbBZ6b2f7y5DBv8ynDv)ZOsoxiY|;ZfgcKWlsv?<5Bbw#!B?ZHh|36nsQT&6K zQ(I{nK&DWaUY_o6FepGO3|t~L;AnDce!9BFz{}0NE7#v3&gMz0+LJbKc7-!XM|Ilf zd;O}UmizSVI{*=mAeCUHyT*+CdUQ5wP{saQ zs174lAzrqC0-5$DRH`3CA_3&KdnMmhRcUjU+4DsFdUi)RSh%pmn^_Z1S^cz=>W@zt z>8sy4;42^?tbf>{=v$DmsqLDp|Lxq6k#JK-kw62Hz#x%U0v+Klg9>yBkqSwLNy)f1 z=`-=?VdK-vL+W|mHxRAlqX7Bh+i9`0i_p}J85PKTk%Nff#GCjU8Fc(FM|VbP+;_NId z;H{q&ADFUC2=kq zsuTmPv-;c%$_cmJ=FMx}#V6*FHrJ2?Sv4GyLj~FY%q6Vhz?z0z$}WVAwjVw=OoY0~ z{vZdx@H1}2h&G>q%q!%dkk$6gV zS#N-87owF^{uR{XXc+*B5g{b-xNiCpqv}0`uj;<@oH!3Fp!Aqc{G@WL>H1o?5c1}h z%Z_mU3Fv24Buq(L-vt@^)YnjS?i=|Ef?tUk@SRkcQPUrOzL!wGH>h}e>t|GT;$8vb zZ8OOLM=YT47HK7{PZfatpVzr^HOs|IIwXF#z8?1nM_SnBkqf|>#7t7&mwHeg0cQi6 zZYBHeTNl?vrvZZOz-BxJ*k9MDFlt>;H^78Pzcg-e`BfDXl(&VdCmJw=m+ES=`U}y&3ws}QYf`_25-%F z>3R>T0Htm3jR;MB?q3B_#uCOe9t))CTX_^-Dwf!N9*#^qUDvc)THLI87s)Z`+`vIv zmCtidU^46AXQ+qP}nwrw}In#NAvz59HB@BWv3 z?%ka|b7tnuHRoK{{n;Gv0P7u4_W5^*v7lp&Bs>jeqS4?{7+H;k7zvjTKBuPU^3U@H z2Aj@wN|9%6b+*k+Ec`c*lborfcsMLNwp+2-Eb*7G?N^+<#NYKFCltLbEX+WfAC~v) zcEDeIahgAS9+TZYep#!K3-4 zT4QJGVCevGMkHFMX*;|02xh%vNn4wkHQ(p7Ig0^eU8+Tygcdd%uJ;XsVZ6mvRkYO9 zoR<&sL9m#ewsTKK+Rp9u`CReH24rDLUh!#3_J33lIU}1oCob&|uEUI8H(X<{n%~r-05MuTx2K#5b=C$ZR#+Uiy?W#+yLB{Op9agd#O1id3MXyt`Uj5<8CBC2QPOlC zgK3$KY2N_pC>)+tasAE5LHI9h#W)UDxlK&VOb)o=*m&QtBQ1PKy3Gi{9_uJzKl%t$e#>d;87_jFQl-guLb>YUH*M9!`tKA{fY8wh>G|&z z)rw#Lu!^oq?2~@e53HO)^H0xXXE8n1)zJ80m|~PoXs=>~YY)d}yhJ_dpJoLCiey7W zK~vFV!0BrYR`dqjd9w`1&_RMzu~nW)W1j%E=Ht#4ao>7Td2L80pY-0AU=TnCN&2 zOG20?R_!vil>IT&!OGiMVRw39nO6C_0(<{}sXSvdNnVc8p_0otw$?^F6 z{c((Wha!IOs8%uT!u{`JS(np<-@Ch6|Fo>p0ide)dfnyqyiLq|7;#5I^LXfG9a^Eg z(2DBSa{FZMdCA!x$WQvs^L*12Sv%47Y`y6|sOxzn;85$+tyuI^1{Uwbu^cZ^ZG|?V zBhILaV`P2Td;x<7RBaGYwMe^STPuM5k_Nm(+ill+!12BF6+XkxS;|pLO6qQOVeIK1 zTct(+IUhOzi0F*dC2mQ$bt1%kK6H(3_9?#-50m!D+nljMp*N5V)K^ zAUN>JfTVIQHX{L5()zwhTWj&Ky^godU`5#4!XqI}6__K&^J zO9KNTW9%o#Ti^!5_0frGS>JP~G}8ACZvQB{o=?5EZxxVQYd-Y=!!igC3vJZ#j{MNJ zI0KD-D{*(yByLM|7KAQsWvzcY^4v2NhzPF8yjU84|Q%{UD%2q4gp)4Z*bH4rkSEVXd(?Tlu^T%y| zq59`F?b?^!qAWM}gB$iaINm29WdIsCf?SFmaNA%0!*o{T{by$uF~}#1$|SV3QDw^R zyDdpsod8w~9rrbDKUtIj4Zyeu$RzSdb9-_5tGoj)R9=Yj@fW_ZQ=vA* zQlE>zryGd!g&|*uCX)eLTx|Ko8i3{@qpfUo?5VMtdZz=d&woGy9|}p-EG2G_RMgVY z#P|Hpkg&v1{1p>Yno~37;Yf*zO#s=Dv0K?)W*W~ecLCq+=-yYD0E__+Z9THBT2?=7 zm3P~ni6rXjxU&B4oBY$))dzBj6?sa*ZXbL-K(VSq%eGL8-5oe3!lTvvbrjzx5E_@z zVg24obo&*X!D8+pB0+KO@$NZnW4m_A+tcsMkrobvshPuh<Y-IRDY?vsq zO4GGBJ&uOseMi?Xs7j?S90wzANXq3suPLcY>!kJ1brqNSH;!LB^YCb0b&h>zo=5NN zFKxWn+dK^f9NSQpeq&v6U5edPDMkxnqFcHVHOu@%7*-3wbN9 z7kBm9^tw*Y974_O?g&cSB-`VtjzDPitDK6nUjqxe)Y@OC53|C#);--1aBi`L_#l{! zNyVAgPBHHUo%yc(>u0u#LA9~z1X1xI^$H@hbXfM%Fc}3ECbPX{OH}n{iSGb-%ksKS z`p0eeTv-s|o-9u&JcYsZB;$U4_4jXpHN}1BvM4nsmhaxXEd4P3tt2R`{k?%zd#CLs zjAwVR&h4INpSQ&8`Jko0V7Bc~*LhacdVEG4qwD-~;z8mbE(VXq9(~=x+r7_PT52jZ zOqdkU_Afx7j`1+-bpp@xvDZ3lOmSG>2xn<|nGeo8WiFE4^DbobVOtQ;EaYf}Sey|a z=ka(W?Q|Uoh>!&Gu%5MFJIwXW*(^qZ^T-{iuG>7?i?yyK@fzNzy9LqF#Kib@=ZOhG z$OMLU-SH!>peq-XPlbY=UzrkPQy)QC_ZxJ6up@b%fVoO1IT`GJXhQi;J9Nn#HATJ= zYPR1rUKOu~{*T|u`B`q#wL||$%@DIBclmRFK#^>*$FLFRjk<1GG9-P9kf`~7*)Hx_ zu{-v+g$ej81#wVcR5{*Sm0zYz3XxeRBRdNt zc~Y>#O5L8AAtL}eisLExKQwo)(SdlN;L`)w<5}K-U=^(mv6D@&?;qBa zUZ3w36_ij8&~HvzyVKt-Hk-8DiW~tzcIyYf$*A%IK)Hg;Sqk|TLxl6@=Wk{k&7?8k z*QZ}uT_vR%Yh{i~l31((g(Lorj?xpEPpi~xEU$Ni+FVx`5C=H`D^sJz8kcMT@}4C# zGi$|Wv*TIuC9uUEbMz>6R5CC={36-XSn0Z)ElY%3{=52Ny@_`kFY>7%lXaqh>pOE` zIza|R%0f5ejmc2BFjoS*&3P^Su`$LjCCpVSv$H6wSlMB@nwh^!9zmyPx?#W^63(XWhgy1Esa0G09y-epK|oG=l(kdQULxH3dM2;eQrbz5lV$Q<_}4M7O3ssN%$%=}E)e=ck>(AV>1XM- zd8GAK7E^&F&Rn5hMqjbNnvXLA6$W}qgGKMejC8r~n6?U&fSGcozra$2Y zuuY0ccVRnV@k7Gy^8(;aE6W^w)`%AXKGh>)xmH^&&AHFB#}{7ounCyuszueZK#wWS z2ixn-?S_NIv8F4s@iPQe(0z>C)IpYF zLseZUY0y*h@hKd~VOw^{7V~{F!aaZ!SNR8YWk}3ZWC+b7??)L)4J6PdaD^}kILW(9 z_o$r?(kcmR-TEc1OQ+EVr3yuG77qmqHHEdUSf3n)$OHeq+qFl53pQ`w^i)&yB=z z2b~&uYA(Z)%p5vVX`Qk?`?P*!A#r5GL>06G9yfy%W=->8+(mkN&4fxpQqkb?Evq^_z4lO!) z4jC2u0JP+cfY6y)isiWBzBp4a0ch|obk7-ou((l;8jy3hk8L1TZ>;J9{&RLSF82)sPb>(%$ zkq#(G855~Q&$)9fIDwD(hpSpAVdCzz7}%a9WzRQ4&7n5;xP3L19b6~Mm7^ExZAGoC zsLOXipJOEzsz<_*YfDZj=G6t@lfl1Z8uIq?S~Q=iri~s_{MLxTGJG-Uhldm{pcd?r zw{{_W-Gh8=+>ziZdatlHJOjfMj-**rJ|rq+h~x^!oROZ235xOhQnG_UI!8M0pq_Z79W|^(xtw5ye*eG$drkq3;eDn6 za{mA(s+Gdd2|ACoS+th%Ke%CW(Pti59{#Ya#h-ENrbh?Nf87iEb06B>9zGPn4-~5px#OD0&8(J%O zL8N-Ekn=^J+8$a~JRhMjvpi7veR*(t`{#iS0S4?Jb+HaRWD^xnO$BvL z!9U+u#VGBTLVuU{yZg6ehsj3$9~OYfz)0VGNzPAFmrsdpTng_AMn!T%#hkINCeQb# zsqFPVytU`E{&=W~tmth(?Dvc#XGI?tVmMg>>XrV?2Z`i6~Q6SraWnkC&<@6hzKe`Qs<@f)T*sn=*D16jnjX>XRXT z?VPV~x}@(nQTfjzkr)(TXJg$(ZK}*}Hm0RQhHK4p} z9x3(~{HfX0-;<3E@cE;A=~lYJ#Gg!QSYkTb1o9Q0k{lD!l6K{oda;b)1IR5i!Y=j+ zo7?@u`FdAVb2b|-t+Y52n1HFNsg;RI@tX2bQD%C1c{g}j0feJF*sm`VLEX{vE0uE9 z597tPJ+b^BySy3fVhiOOJ5XTaNnUkmb9CW<>MzCi-JmgkE50@V?UwE1y8rh_AR))W z18wDQiSkc&y+G@2AN^wG1EPi#(mA|XM|ROFbp0j>X(+H?lo(JbSP9w0h%TGcgThKA zrZ&XXMa6f$gbY>f=7{uTNVCWbagdFmli+>M&xfgau6a6z~~n_a&I@ry7a< zc($6>&GA8;VxwrrqwC8Kqucd>Xwp1jsDm#oP)vtNbe$Uo4@*H)i9b;K+hgf#_N?ctrgDsAB?v{*t)jb!f?Oh8aW1m+FLM=2%onJ5N4Q6PZqa+)HJ@Qn-hRSZTVaCL#A@QY9$P)&fSUsH)+ z3aJXCT*b8_;y-Wm;?-VE2+4Xu3_EE}&J03|q8;O-pypJH~5m_F+uCi~QNts|)igG%RfJI%*9=gy3e0@m4 zGnt%yrGjyjM5P&t0V!oM8qa@zFS*JM!cj(|E8x2%Gm0~s5FDoU(B*;MUeV|;5h^`5 zxYAIQqs+7oU7Rk~#H72jiZYsUT7rLGqK^nn$I|hC2L+hcm3gNv5sbDYt+{iyj{(=Y zCqEa~Z2$m1-NO7_i;x#YZ|guqF_qDAkuk|}TLT3kqdh3TC;7NHTbQsGQ-2RppsQAq z3ios=dZGL>!p`%%Pe)=^amzfA{2E@g{Q#pZx)gPzC3rI}4y$(d1C#z0@^#boNB{I^ z_@AIkprPJ!STq%Fh$JbJz9?)O#{<~j#%{R;dXG9JCk6+I#nLF~0SpnPlb;oeBC+xK z=ZC&;L`OqPei&m?u6QB329$=_nSBl7v-=m* z`mDk)7p^)X(8fA@{2;5A$8!?b91cRpFN)ZOfa z4vrndHuO1JbP0HjsF)Oi(_abd%qCSj$Cy*+GFeeN!g4I6(bO6^0{lj-gZJFokZHzV z0=ouV&AhW%4ZrAL1Ttl-FrdQ>ym&QNB;?8k31IIM8_fQ#PAOYJTk*C*u{DTsJC)R$ zqW3Yn|1(bbU@ODDLC78i6#dtF6*5`eFBX~OzV*zKWZQ16p@ojLFjFbXwK?gm1iJi; z2?-D(<&qJN$Zy%&(b@{~O>H#*hqNwU7CRvjKk^-H$&iwgveL44X+QD>X96sDR7T?Z zyicQ_HB-MsyDVEyPj{6=-pp0wm>`rEP?{+r7n>Yt)T>6(YCtJ}5oQy_uoX*=NvVlk ziY3@ZO11e+1Ui0L59One4HUV$qMj!~lAtHU6*Eez4PA^MSC5j>Np`=qB8JN?qf66B#;NaSN>Xeg2Yn=C@&Q(dl)!C-i>`aD#LmH@NZ!Xd(OUg%)Kd3-?z7UAmY z##x{z>*7_o(ol)+4lzFi^nMh^2domsf_k($N3#R^eG&8_5o-lF^``k^pqYtZ-u671T;0exWp^;czFGydToPBzM{Dgl z{}i(|^VjW!$NGjc({1sU2om&dFeP$`s8O21ifSDMofl2w$-5;#6gVazo=_VMvCWPo z7(^0Ly4uxn2w+=8Uit;YAW%_NkI#e+vM z3U?O8c|A(qBqvf!YOm!gqiLXWJ!Hj;;<&$GG3H-cS$DDC%2pHQegg&lU|^p=n(=%R z9~f2t8t;OYfR2;_{~0GK030I_mGr#&a6sblQL{lR&W>$fHzyoiuU^MQMF_6uCYF_B zTl%sxozlpRgpDlkGp?LTo*n9!j!^Of+?U_f=V0;J;v#(n974)vgap|jc8aC|v#^qC z<)+;*wKv7A(zaMfMEF1GgYyAdAtT-48(d*kx-ECDb(f9&^QlmXdax0N!ZAG8dOruQ zoKbS&!`e4Z@~Gy&5-a_sJ=v7eI9Qh?XZ}UsVA#os8=D#GQ2RhH?8Z7e-s7>z+N$UC z1Fax2OZNy_Uny2A0SMTD%i9l{S;_V4mhz%TwO=+NYBroAipzY2PtgYxJgix$8rk-H zps)BK^{h+yc zikZ9MWB;W*1pQ5p^W~-AsrigqZ=U8-HFJ&pgHF@Fl7E!>XOrE_b3$La%1I*|GNpbA zOT?*tEG2W?#gBGG{t-j6FV zg%Z6l(xdpRin1J>wOjgyh`i#If4OG@RleTS{QJP^0EE7e^oOV1*Bn2Kt`Z4QklW~2 z8VEl!DkC}Fa2$v^i7gUHqR54%)GC%E6yo59pw-~?eG!-ZJ=g6NHCvymKcf?>Miu-g zN9Fhs|9ip}Z__AAwd=Tht>})a1LFHQ?M&RVcr9U9>Po7n@!yljTmZ+l?ZbrPa6pnN;aXpMmKuioh zBG7-NsEXL4KIT&)!f=#5QXT>Mq*EWlO@al#VzGd3n&5y(Al92ZLz`p25{>`ef(Dz7 zyk3bilr>u`c4PPe6+N{mdm&Z6gsgB^M*jq2fe-*m;P-fZr+d|V3eHuH}FlL~Svu7dN_ok!L z>!E%40P#WA*So*6tCi9zHFMoCCB*|TF(dPjm?qO;uS1hYwnxJC#2A6nUF?v~8%H{#6`LcBPLkxi!Gyha$=8-lCEYX~| zv^Pj{P~3nsLsGWb_c5eeL-DFB#Ox1-345dRVygE|1oEPg+8`497h7c>IfIg|AHKHd zu!lMv81aCI5z?Y1ZHm~EAUZ(TPYo_c-7M>-4gt*Pbl}%q`%q+z@&|Ca3Oq&vEb6q) z$=&hzjC7g_1@^?5pcMtUn4>~EV_@>jG!TRY*bJ&wHiN4V_5^TitZ`zmOB$^;67PMJyl@s?_+PoMFNmj&Mj*=(=B53)=A;hPsKyPksLi zi6u6`4^?7cqTCBpvp~7TM=3H{A6`IPGv2UQn;K1E5aT{kl-bxctCtu!V1!TKm!9{T zo|HZ!(P*GVPb%l__@G=4(-!8-#^J9$r_x_PiiGrwi0x)%2*{NFwL9Bnnia*BTjP^6 z>_J21IcnGefvZ>UUjc&aO*R-}BuUG}7-X@WZN~2uN^Q;CBO`0L`;N6AvK7P~TETa} zA$8i9XuX!ZgKD8$dg^PU>{0WtdYlE=b<7pVBny>Dd&AK0Y=ltLhnm86M=A|X;7Dz2N?!y96syckQr;Kn z)Yz+%-v^7*NiI~L#g3n?s+}+gkSL;Qqtv`$T_I8Gn-Y`fY6+s}P<{?u5fjIS^&Gp> zq%b1|_RVCpSN;k`vt^N{DFK5Th2$ZB#0%6=%JOSXMSScisSLJi4T@eu@}Buu@=7&5 z3;yF;^oA8#z7s1|fk6L>>_ANY{)yaVV+Y6)GO7`ue7vJWN?AbvDRL#2+GI?3zWUvt zm#I*DMaWdT24oc^L1D;w3}P`$Vp@C^N`I!iXfBPfcHs_*+cQ;m6M2f*5GFr|5dRaz z!t5?5M{xM_)`yH3d&AQwkr&+}LR{X!M@@=_Rhmr;GiI?9PmF0VZ>+;VUShg~U9yM@ z3x#A5^E=hj0GN(GSCnKV)PJ$#kx=^ zqJvb>o6fEGo+*T^j1b1J4XNoGb_hka>iZbm6<5WmY@#-GYfy=uWoj#FZ>$w)fP>q zQZ4!jra$&-$XQQuMh#{jT(1+M=EK}>XP;aX67s4q+Q1J~(WLKj{1{2RAiw*O{)2>^ zDv{dmf60bsP$6paz4|XIJ0BlI9c0@Vqvy}>NL9nE?m;~nD&w_4+Z9Mm*4R_1kp3kP zieg(SdBB{`S`XBec_KwT-!dnJp?EL_LMC0~Ts&Pfp=uuypy;O~OE3})ObjXY2@Na= z0_O1jE}e1X-6nLye(Kc;M7jQ7*fWo2a*}g{4IP+;^)hmYzsPV+2@ae{h$a8!|DvxX z^)pDcb4(XDy5mE+Tu^Lm4F!?@AN)iOaPf)cPF`zjMcsu`ZQj?HxUqNp6&6EAVcW`7*VRi?oe|s-t4>yjkP@I&qV;kuAD4+!eO(#F zMQ?j8l`$0g+j{lJ6sWRYMoV*IKild%T`U>1e|lCxgC?{7>FCIE5XDpj)m`85+ zGq2z?@}p22=UE2RT_6D>%wHI-Scl)UDUu(%v=ht3vL%7Hb8^ z8ZB2PUA!20Zx%VNrLx#xeK<)QO*Ue?xDWR7GCj6a^5A(BL0t&u9r0C?`{yqF^l}>% zn#V_6!@ij5z8X%m<9|F&t6-3+;R@EmsQOJ=&cDe4;g!1zr**0g7SrDbw^!^sk`xTeTVz6mW`tdwu+ueU= zm~N$5cb7ym_2sa(>_2*9GN@7_cfNLT!4Cizv&@Tu+bqRAWpo5?(?!$$H$tPS6hU8O zM5{*AqV>Q(lZvInnaLP&skR>|xePHGOpdNlDKp({kv21VuG21u@b2D%{%Bek2|!dy2daBO$HRnbO}(N$qys>+Pdu@0&GtF=h9fsdsqYEu9TI zOlN!gnTQQSlnud$rJ-L%Q}bKkVhx@MR(9Jal?BVZdsY{<)ZkzNV~P!Vz=K^;SYO zr3Qf)6V^D#v_Q7b(&IZpVF8ap(n&mD#Sp@?x`Lqs@i7uv-A2h-@7R=?;=88f(Ta_ z8`VtatK}CgYcajs_KSZs-Tn==-^EV|8XbOYdmq8fNEcq3@P69~8J5d|1Ac^!sqera z;t``~h(%fRb+7DzZcV*R^A&B+hy1!r3z zLg)ywepD&8%#sPPWuyP4UV;t#VxthBof3W}6TAL~40=VF4OK_5oD|{nn9r5t_i`a% z#sw}5DrnqD7%^$egtC)ca4<7G{ITGp9Hcl9QH)G|{Aqf=8c})paT$&J014TA8lC3W zXfg)qMrJ?mPeZNnB#$U3uQNz;vxnR$oWx(&9Sfzg^)6)T=fJWx$k)28fJJ+rjOz6} z<5X78Q$WHJ1ljX(e!juV9Ydmf^uFjIL9X05eqwUiKmr~|o-Y!p`PoL*L0j>El}$e~ zkEJt+*97bh-2k-Z!Enn~>8@nrwM}{j`oSP7)7+n~L}fr4?tfP{U-EMq)i8kV)At}X z{%@fJ^KOqnl_Uo8ILPDxRO^2~E&gQa!U?eG1M4b;`BH^utHovQ{@7xl_Zi@btC=p*{m261qwnJ_@O1w{D#*v_Eb#TP!#8uSuRRm4VhB?^)y9 z)P=5cmBG)=k>{*_fk5Z6JUPZ9+1II_I3G=mn76{GHMi47@#&@0fX;jC&e{#fp{Xd)m$lc35|&XTj8R0tPN9rR^hjb-#PL0 zT>1>L)T*dOOa+3>lWy{vsx3a<^>F>Y!O2&13^3bpfPwUk^S+9UCRhcBX^%qH_A)Bv z2Gm0b#82kyu3Q=7t~reE|J?$yfg3_-C!4M|ue3vKDi?V}n4#tzYvjavYQHO=4=hVWnpO&kjT?#54bp=YVT(@f2U8_5m;%X z3??dIz%mPFkV8c5KKQF`A`#<>G4efJ#7Eq!|In}?-{4vC$Yf&ShB#5-pRFxt^+U%FoTfa{48j*Nr|U16lVUZ$XVm$Q1VRt{EtzBC?|>fZaWf& z6NCkhqIwh=BRE9Oh>N&n@Etn09;d}H$y0k{(T~T%2u>=UeTcu+!I~gvnODbZEuGhLF4UNXP5&!Z@5%>b_|K}@Y&Au#cH%)H zI{y9rh7k`R1PJvNq0C;<13up=|Lp1oCok>*eX&4wcyWS0&Rn7LqW3p*i2{$$em*QR zHvL}W)S(eme~NW|=JyeW*K3ido0Wt=Q5k(Lx%q(wSjZWM%FNU#0gUzB=z(w2C5tO zo@r0ee<-#DHKxC>ej@hUkVhB^cPb+#Lp-+<}$oUnwX1#|d{ zA=ah1aquATUk_yR8R!fyMG`%fz4$;w7Zkm~|Ln3i>{6v#u6Vte>>!uH-(|0?*RasZ z8KQWaJ~=+k201Ljq~bSmDO!*;w(o0#+Ot|s*NJ2elv=|BbGhG4f~OZ<47D zM@2*QO*Bq1gjm!1n;DEQ^h=1h6ooNhL~^R`nj#|H7!LYQ;jtB3)80lz$)wSuom4wOU1 z78)dQMG_m=h+jsQrgwvtB%qAu-U-Ct5EGFWNVuq-#Re7lBvYxqEfcmA%a^Px ziC^<4a|hrT3b{mPiXb{GbHMy^wXJZxJgw^DdD!Y-sXP3eWjfc{vK^SV;o$^bLQ?;5 zweGYTM*wJp5>N3wYq+NBAy>0#EP1?K&WpzBx$e$M^R~UeeO{{6Y_r=RZM%5e498>? z`OEFH7bASpyi1cA2AT-45z+3ICQonR4g#&18KubOk~054Uw|$mwaJRT9_^aN+z%1u z(WkJH)So=zVDoxFR05V;J&bKMPjadBYUDaM8zm9@a(m<(vY46Nrko&gW~r2bsF4y# z`f{{b6CWqDo?F0EMp}+S+@C8LCTCIjkh=5oc)bK{73EBqtGB0f_#dXext)3Lgdl5q zJ|--bDX$Tit2a$bO*urg*dLxSsbVo&{m!{l&$QU?4Va0dc>VPdGM)x-hDiCsTle@v zP%4#wDR=~8?mXiB8-CY_W0d$L7(U+j7kgspnl>77cp}u~`9pkXUu7+q+hM{Xc${X+ zcQKq_(;uojpEx$BC{F+jZ}s?r!gU#iWof8fBVny1ZbGLNa{7>Q7JYk;I+LHdP&uj} zbU->I-r_H0n4f;tdWs6a=)}<*aU%&@hAhX%uM&2->SeWFqLQnmcf{ge$#GF8r!=24 z$h41K9+w;s>MpRS@jh7U>`1rMb7q{Z%*n2P0=g|s!%$M$8`4E;beZ>PAHAV z@@~yqVy;l~{8N_u)o~bY=X|*;BTdH5*^2%~J62aWo?i1*Lz-*ncRV$ zfiS1vwn6KT*ppol$fP`6=8I>NEGzzH`0j_9ZhvA5=##WuAMxHFyvCAfy^eB%*6K~U z-R^KIy_l_jKWzEITP&0+ZXh`is#~>K0z<|9&^G|aY15L8)@Mvkqi4nC@Qpw4>w#&Z zWZGRX4DCXNdJ?JCdh2a6eV+3e|7-PeA#RrMTr z_0yx(A#?3UixuFH)1@k}?hntG8{!oHte!jl!fK5c^j>eiJ$|3>j^~7(G&jD9 zP|!6_;koS1K)|3~al@d$E$8sNU9!jWne1jUST{Pa6^JL{c{WE~nBxAOY4W6sle?Zp~LGezK1gy30N*>`6f#!=g{&8?7s4*5}AInBkwG_oMC{ZnK_ z5?EoZKwf?IJ?M{4JY28P>TCjDw+5HF3@IF>YAUjRM|5iOD&5pOEVQl}KUaBl^VHYy z$ooR*j-XWA%}ggY-K7DsM3IsCk6J%tF&jt`6tJVAdL|@rlT$1Zi1SSYA_K8ikZb~c z$8dtaxza76Km0!JgXeWUZ&(tJz$!tuX)&11KO~W0lN#pNs1PBKfT652nm}5!?zokT z`nKLO*&7fJjPjSgIBAR7e5fVKKdq;k6Rex%vUx&diLZ8dD_y&Iyh}V*U9XdGuSs?j zWF7P@b%*1}>uu<~qw+lWzpt&^FAtV$^sh4E4wJM!+20=YIUUc~-0sfSE}BoP`QiU8 zl%XrzRCe4woi}YphFL}Nz5&4v&OiXR7PxYGrsvbj$AuG zx)adEyX+qyvpgK-s3+I+Ii`;PmKLs-s}VnR8rZkQFjvCMY$pSK6+ zKKbDK&oAB|@7^DFORf*6@aXld+t6r(xy>)OLowo{Wk5w_q0od>q8?(jOOUkwC5Pgt zAaydsaI(iODI`7tlV0=jChePQ-s0^^H5U%u|DC zhasyvbf?~IMXp#m9oOl%j}yt#n;i7EZ;X}k5AJ9M9g8f`j*mE^###>UlS1-k*`_O+ zxltoKx7)9SK0DeP(pocDQ)!9?jrq|6<+qFf&{Ln*tM{KbSXz5L=OE z!+BF37PHxW zqh;Fun6h)`&=~vOavtx~(XQK{mZl$mkgreY^$SWKS1f~pNkR)dB%23UGKq8eK5}_Y zloS*E#OwhjaRe-RqZb2v-SCplLxu*=A-yegxnAOtGM%Sf8l@&^V zCIV_vuKBUVEEqE%yM8ekT%OA_%NavZ5a@&;-Pqpx^U;6!>st&lJ2idDJwFF${)P|1 zO+r!s?W2AMY0Ut~F^#DHRQB)|){s$}1IL#4t31+p7O!@fX6rBVk@3Pbt0y3Y@Oa!$ z0^FAUvL8zC>2_XTIxMe3tzi`y_zzQOD|K1UJ0)XEy0mDU7A z2FZt-*XWMH=+>l6CtxwDYQI|T*8I$MJ)Tb($)@oO*E&S1Td-T(^HGqg+%AJ8_}qsI zLQXt1GGNT+h3aPQ_5;eB-@j>qB3E#jSc;&5@?cFiq$NM{d%g4WcQO$u3W(y}q z6RDx9OQEQgosUKwm)yw48xBj{8UfpDX_k$cysc&nrR@_5|=YMKg(!=V8LA+w-<_U=gnwA*s-EJvOYlF3R#cFw0&(@K~$S9|AyU z<&L?Z+%h5HElL9m_0yA(uvj(`S3nOUTW@;3`(<*w>0ALvS=nqktJ>Xm1axsqdXFE~ zkOjo}=LVpiDAW;IuftQiIOJs*mkQXGI~W+y0_9~WeIU@lzN1l$m-&CjSEQ7A!lxY7 zNbTQ<812bQ?z?M*XAJRWu9Pt_Zb;upJ2oKIZKE+HHI#D|X#H?P5CWXJs}9O42`X62 zAwOuQYS0r*B|*zm=}9#CE|xLE_4AmfDnZ+a2}NL?cfBu@X1TWlHqa)!yPbT1%yf0XsCeOmG5@S%yIq(awlj#;i$FPiN3X@ef(qxl%q zjca|mGr)OXPq=wdijbsJ*>cc|My+OZp6777h|BS7%OiO{xim|P3Ll$b!+S6S`x*%d zJfSMP{ssc2rjBRJGep(mwa@s@(Azs=^T`Dbz_MwS!GYTLhr`?YqT^nxX~XrIb<@4? z8NjDn<4C1b81_9j&Oi^h>Go8#;In{N$mOei>UjPWpJv_Z5Jt^$T7+N+$8iL<5eMAQ zqfFuQIW!XljfTQ-2h|&O*;S?I%I%bkGH{njWFZyJi^!+xOXoMh;1dsY(Lr|y2JpNb zt$*^4?f3kW@lDy{8eM#q3@f?LG(bDI-}5G9wJt`gd)Dwv%};@md#XJBbWD$m?ZrK# zrx$(*F&HbO5YfA^3?Gh$8X5dXm>l%USmEwk%`XcsXbFTyZaN6xQA*& zZLY^&B{G^eTCQncT^%=46+UZEJh+clddx;>14ismCcJn4KK5Rq&Cr37fp zyN(ttDdlh_(q32E;x_A)w#u2=I^>1-6fROacunHtl2=+L1bW2u@5&T8o)PL!7aEYv zS@a|6kXU~YNr1_bK&(_4j*V6-P4%C-XwNfFuaB}(R(`tUhLdHK5a-`a((ax-RXhcSUKH!HH3!1UptY%=RFIco(*xR^{5(feS#^T%bim~gGC^S zUVl;&6J(GKou&7)PRY@gkzmP(2Uil0&dMbO@9mE`<+9H&dqdeXzZMdi;PUM_zdfQu z!hf63;s4zEx?-H=bTplb@@0v(Kkv^^i`L`9nqzsaxR}zU@81M4e7#0<@k*NpeXm&H ziuLeSiz~tBKE8vN>;b9Ina7!D{WsKo>S zppzVCD*905HQY#g<&vTi!~ReeqXIdUqHo7YnV5TX9<>qMe;8DM0|Hh2yNOF@E@5iE z3Gen&dK7-%v9)PxOcu*PgnjX6!F^@%VF=ifOW*eDcMt-~BcB5c^C{CSA& z0p@o}_uaGl@G7}ja2azTnFdUx``bXsIk<2gj|T0)=*pS?YGT9I0r9YYsY=ZnRd@(> zYSVOiLfu1qZk-CTREaYtm$S^pMn@v8_C}uYeIzbtVnP?+akrsBe>5mCWcfayxq18; zd2XMbId0h&Z51qv=iv1L3>*}|$L8QC48o0QSvpu?_!am&P^)Eo3&zc=ZiGmzISSv@ zFr?Zkw7FrCp&*in1J44}=|kN8jF9;*cW*f{ai4AIqxKJAr2w`xsG~FS?H;kGe=$y7 zf<+-gzvd&C(?s4f`yej{1|s_h!z{k@sZ&TSrKo7rE&UI-nbqO=%ohXHN`Zkf#0gGO zloJ2ba|LcDg8`xWzv-ynQ0SR%sX@;Ju6ersw)p=`YWepc6nfBs-|`pUK{zAs1@VRF zIWFcD6uz9>-p?T6iDeZc9%~vGW7nPd8*+$1$HH-91`@)RSi`J(om6N(#9osd(Nse_ zYf!mX#8*WtU#c4&&d1P@ACht%9hw4JnjNjT%2lfC0JsgZW<0vP_ii6fiIj=&pLil6 z)Oa>=_WY;4^7atM59yTupD!R$<~AP88;hX1!N8UBfwEw{^^!^x_?~LS7&T|-l?mkv zU-7Ss7ktU_e~(>ir|bKf7CJ|9az}!8#PVWxk~35~bYqZ8Ba9?dUu*R+0lWkZY=7tq zbu5*|RHzjG1pY?BGHq#E3Tr0k_iGLk(%dP3jXV!lDn3aQyLc@?J`S(QK@65XxOIYB z5Dzhn3ha6aCNqRY-!6fO8;lt`;!k#smLF3xhpYq)U&C~}>KGtUNc-fn4R9y^+tZ`{ z{Sg6gNvT9*JyT8$^c2GPKLmcn_rvEz5vuC6IoMJFH--$6NSKsMP7N(33YHS8$O#u( z8i|mO1fhYGAk3&np1vS(4#C;DX)#heV1MYV%>#&{n4nNYn6{Gn*^-tn#@YWm^M z1yp*0ajK)Q`xu6CXZlQb}gH6iRxOY`rDN1Br5BRt60_!uxX zzfgCSx@vsUPnriQmy)5N_H#$q05T33VH&<7P;ak4fk)=$lF%t=m;j=en0mT;GN{n? zC8Noy2W!}{#sN_vk0OJz_*l-xqS(JKJ?B`csyCC&(jR}EA1p1c1B_ms-aE05oPOva zVjAOo0U+_HTgX3f$2YAd^bWtj9=QGA#m7RH&|?~WLt>C<)?n-LvlJTWV-^~wogfS9 z=N4L>KKTyK2zbyj2brMB{OITt?&|*zc>@d@4=0nu4a5^Y;QUtLzyyP>O#~Mhms6H^ zWlFtTfMK>gEMqw+x(j#mDLZu-<6{|gKz~u_*bbF9SykVx7AnXVVz^kBYk8Hb?nI-C zCL=L}=YXaz1XwYq%29$!5~+|V`DeQzZwNlwtxp`;32K5LYZPkkp+~<-jw9U_fxUuc z`<9ypigcN3dC5JPY|+HasZ3*$1U7rYV7%2L-QWp+YRlp-b;N_xu4?eJ1VsqOJhIik zuzSUc-P#ay4WBb5OgDh+Aj3HA9*bhTIcO$1T?L?P@IxK^0ydamR7nOhED13W&r7s?h@(lE@^4$X6Wwjc@Ez9{jBx8 zpWgFD*J94BbN1|g?W_L3{r~W$6sA4`Gx{SY{W_N{`t|=l^d%DLB!!87Z=?|=H2lAN zE7xAEYe*+fLGsgI1n=LmrPSFpN}#U`iBER3b}6;z^37|afzn1*X_Ok55r!yLcJNj6 z_{2Q_sY%1YsJ`ICK1L`S1h8VZHn@cCRKGnba-*h098jsB!BX;9&m&nIG<5pK$E}`! zZWSnJ&6dZb*t95VOM!~J6)!A&71-QmZCdAy_1~wACwj4oC_g-Uy@-MbTqBy^imRA` z{Cb2_7IH3v6#5NO0%1 zVMzFp)(zDON*`1I_qz+d|LtP>MW6`x2n|@ZkEIgagW&8bS5l+^`o38Hw<+x6Qn7iz zJY>Us6LOf9` z&Cn?xdAUSSgs(9Xvp{S-OFyxcrm{QBinp2+?_h%Q*DYLG=jnRitwjrX_sG9mv9vjJ0O(~*=q(H(|s!gkjv8-5AD z;nXJvTlbxjmQNJwZ5~(LVD5)uW$$K)3(~6aw3vu{a@mEr*NiF)-rcVC6Z1gR5rdG4brnc&`0PNUqPw3$jLiC~!)2c5959SL6wV?9t?zuxsy3s=0J8G_%DS$KqR(QM#iLQV>vH*$|orzeL zDqe-YUw+4Sgz|=nAQw961F2vFwTfDU_|Xb&jH1`$CVDDCd1Qkw(tDu3cB#9oqU7Uq zUt3F)cq;iiHtN{@Yx7rwxUKO@#uSw2G=L~6yRT5n!d50T$gG8AM#WCS27L zsZ?Gd?f!2Ls`gzJ*tX#a#c(V~p3kcn%(U2kay^n(cY8IPFxGat6ifpCYaGt#c~pOs zPsGch`^W}r2|^+~pUN%3VbuI=c!U1hh4^-r{AMhjBaZ9t+S6vacvkJnb-{SlwFUri z+ySj2gnw;+3wTCuE+m$-)W2zmlv|!Gi#r`w?#1SX1AypIMRGC0>q{fycPK{-d1=cI zile?6uHKuWp=qxBd@h?lllk(V>nZ*9bFD)L??`kT+y#Y8N59v;`C%5914zH zfMlB@a6C`_yv3r~(Z4>gFX#n(o3rkRP1g6{bBiuCF%e=jQwr3!2_xjD5v@&g10Dla zbc3Xh?GcPi4u1lPSguz;KULA&78)m$*CLgCb7{Y@!Q=*$Oe)KQcCR=7$$QdJQC^M(e?fsV>&OC}0mRw^r` zKfpF~qLLnwO8R$oalYS9u2n((?+Mvivb3-f8+SCNqrSrHImQ6iFNybdS6m#QUroRA zdrP$uard?VnvkW{bf-+x*{-{6R@TS%oQP{F@8%T21kB|bKGLwNnrVMs)IqPeVjJv3 z;(b2u4+ms<_Y*lRXVRUv1AzR2BV5>!Fq_F}<8udB$4zHToUT`5gWIZar}poK;xW!( zLg&@(49=64vIn|~j)^wQ8?eqfM70DIDd3h>Qr=i^@I7c8gU7a>yTWoUN)Tnqcr^)N z!aTK}*mgY2G16w(^_?+j)dCsmy&_DxMf(SzR(CqEPSFteTEvDXyKU1X3UAx>wq+TY z`AAFIO=6p__eR1~KcO4Y>;x*+Mz?+|*aBZb(l1{I`SH||c|DD*=Pj_di;2pAT4{D< zy;w^QtR7#(g~KrcFWX}L=g5Itei}PUzOP8H>OlEM@e3y*p4wuR%x7;@zPu5NP;GFg zZvJS-51ywXO_u+b#tV2_>Ox;>q+zuTt4NS#t7+7E-0OST^S-q;9+*hB)EP*MUx8R0 zmdaL2cY-Ws&8U>?`lbljmd9oz?>eMe!0*o}n&2(6BaCe{-@`8>RP7#Vte`MZ>I1HY zU9^BL>r%q$hxkS@bv2~Y^o}ije8rN_>mZ5WhSy&#KvszAKcHDs7SbSM+zJPuQ|jVO zzryt_0{kB=n2KQ$=LoIB#WM?2L-c=T8_LLe$D| z4BI1A&w^toA{Kn_0|ltrMU=ehb?S4ydBuy?NYdUjT>(9OBk3F$oh`)X3%Pp>&X!Sv zSIG~QE1s*#-`!q6pET?MU2o~OcJO<7AidQOe{1*jKq@MPo;_!L8%#rB?&m`IhsXuN zq>?%BUE&VGo6@|YM4*RL4}{KOFm$Z--~K>{uVGZ5|Jxo2ObYvKr>PJY@gKZAMNi;| zi(aj(6_10J#mAjyux#rNOSy~vn)%>EoG8P%i5L4-Hyk1ujjEUT`VS@w>geT&*^xMj z5B)zEwyZz(HS2@-?R3{1zH#MZ*e8>LQ1V{x3uP$`47LVNjhu);blf0LukwMd`66;_ zL$y4Skx(P)kM=x?Q)zhNs;PLPmJ*+9Jd=6eU48HPivOawaroH#sbTe?jsuTIo=+am z5x284pd4#gq5W|^*z=c^WEgIqRUX8J)Cu>e)m`ZPhd4e|(yRA-gBQId9fn2$d3|3<)nH9(&UL7AB89LyC(U( z7P#{&{ybIVDUTtcv)tm6#RayZHj3+$RjbhDf4;Rx1jkcU=(P0VRQ{rvD$z>1>4byc zhJS8$+FNhBXvbajM1p+(G}*56u}Q$_mKvj^NzWh1jgU5vC$jpiSN2eirqS0Y0$j{UjW6Ca{z;H7&lkf$vf zNaH@IRVWzlOcP>WcyO@f*N=)V^ZKb9$mfH`B&!p7G;iKv;9x#`3~oxLM%_)IDL-s=zYWyW`-w7-97k^BcE(^ucr~v ziTmm?B$ z(oZq-p+ych$lGH91IZ;SvXjC)1d5^RoAJq`c#A?pwcTaOYHaSARZ8)D-1(S;HJDOq zbct1s3xqWClB!>Mv}$tJhqDb5;JIO8s5K7PIQOXHtHZGO^^~?9&S0lSQ>+F+L;gd_ z4w8|5ai~1CN@2(e+K&@*5&3A(Ts3?ala|6 zJD3^GxOp;$wg-Uz7H?6$cEzuCny=mg_8}^*O1o#kEoAvNn=QFDRRXfzZeUAff(F`x zxm-t0(p(m-caOa|Pyb+I*03A>`I$WgDs?;VmGttwAGYly0na^<$dS$)(0{Nbug3@c zkV?0Kb<<4GQ~&|LWeRj_*L|>fsl9x;Gvt01LPHdD!Qn~Vtox{UGAz^fS9?=dwwnLBV~stWa=nv4tr}gm z<8-y!HmHM7N+azaxUA;uJkrD_^)wPnPar#muk zW7$<|TLzp`_Pw2+f}$Iz*WBWOh=;cw{AyA5UW%iA%@;C$VYwu_McME$i89 zyvcCP_qiq0`ToSc-vw~8<~#1XksEZtcVNb?f$Mok2n+emgUihDoWnI<{cLzeEAw@w z;=3RGZkGZ%C*a#>;V6MhjY$)&t5GbgcIz}3@cnWV2;wxo1#SA2RD#!Z^C!b)mx;cz z8tt=fkf-JDPlIt2tC^w;bE-`HBUzA+`_&fU5R_sjyY|k=0izECgG65~Qc_mcHOa>R z`UlPT&vE)6;xc(got5~>&t}8|dO*3wz$`m%Wp@>-yf|f6PuO3%3?7Ae;%AjO0Jr<4LXInw9+!e?_5Upr6_#wGvu}_ z(uB4Uq?+mRizE)cE;+W!>AQ${8YRmtWvZe90ruuq?R2f_8-^?NJE-Fnk31AUq$^ON zQDmR?k#k4nkP)hV3r^^*FmE$+Ikg@3c~F~Geh>Gk{0NvP_q^q1m)Z6JSlzvdlu4k- z??@e@$}{An(U(`Q%kPOBAMSb{VOwCkU@#eELqIF5#5Pl|#cO$8YNOLkqPq<+A;2pYL4-Z zY$c>&U-E5T>fZ_NBLk)+x^lmCmzt~b7>?#uK)srR4v2=MrbhMrv7S-z_tW>!f_M{bz4aZo=O^4@ zY;QJpjYy80coThgyQo=9`E?{?&mJacF}YiqVy~y~FgmOaJE3Nv&QjldVJ3>651`&0 z0y_U|<(v$bj)Kr->uD)bQBfeA3+L}4m?D4QsEam|$|+6D47c)bx#jxfw73=9^VwK< zD!Vz4SyHDf1iZ844sku0@P0l068ZT$d>K_w!H|jf=%s(hhk>Kl^$UY#M#?@lydDkX zK}MUt?sSN-t*<;BkAWkf*6@{+OSX?3$zo0&U5Uo1~sGG>&s3!|&FKCzmB z(z-rGaZd;%_Pw^H%bY`I$?Jtw5E|u-k{a1GciZ})dov;F#6W@f1)LcKMLNW6f+~;{ zLoM{BJspE8w+OS%4%bSl%wTUbrF@~2Ir<{f_Vp8Ow5k^qy}+@%U$SU2f3%YIzOkmL z;c!Jr{ckcG54yBbDgGOpfEm_Uj0y*fz`*xxwA_P=l%J^3D`G<%BO{7ql#uLM;wpRD)Ic<_I90}E)0!A+$swx2n$Hx^J@Hvmqqt73tK32hXF^3FsX+{i z&>4J8x(0)K$y6It38C{gHg)C!RY%JV^$rYkCOii|Cjlg#48@UOM27G#>t(p<^hicAQ&zLEySq!;7~Y2+D4j}X>m*x?_mro4&+)UsAq|nq4DTtmuIxF zgqK8+j1i*Gla(z<5zI!VTw;&cu2(2A`PBNs77~8zxUX-Lfhqlmo2Aa=&AuxBOWi@K zuhbaLB+=F%x2~2P#3k`8&6W3Kx>7B|LCW(CSA~yuq~aUv(K4~a+fQO@;k6n&vbdGQ zUyPCE%CD40r;fFPSvb}w^^-69Wpj>V2wA$)G~qF=|Ju_Q*8e2y{7n^42Z^Sg+t?ET zr6$#uVvOw~zcr|fr9^6QaJUz`><$kNf&WN&-V2|Sf&$eb@j}Xc&-WjBj|CQY3yvRo zPpMq6x@!McYQf(qAia{Az>C->|5PpONsIVpy9V(PYoDz>c&@5IP6{md=SNWE3H}gUiC%Kc>hW0gQ{w$Z zs_{_%L})MqYYVh&+RhN()K4D=PnQM!fygO~3TLfIn}G5s5|G3FlJc9rQzA05i@9Od z_+9olMPoWFx7df3iyp8){6(oE)h1Xx1Dhbn2)zaV3^q~Mla*?Her8h2YQi2*lv!-! zH}yLzHiU}?;)HzD8MEQ3O0y4R$=EPTb=*{8@Cc{=uRi02mGv_G;^nowMAc1c`IKn1 zFA@O#7? zM!yZY)|4m?(SX9kcT{1{xxy|OF06M!Xv~(V-L3CwMku7+q+cAx<(PLR5W}EmG;Nl12P4mrL4ToPnq0iM|1FspR@B z%858-La>SW9McPtkat}-D?NnzGoeyd(we^{J-H~`-WF-(#r5g4U*dBIS^7LQu~RLi z(dp;^doh^e5LN<&e2;zcKN`d*L17Ui!7a3pttS+6wn5$%Dh${C zD?jPIvipbyGkk-pb8xcDP*0aYxKhd8uoGpKk21EVNJeeDxqSgrh~xeyg|t*ObiszPR8lyw+|2bo&BUlhml zY^X>tkbgi@6_hH$hEM1p7QE-qEiabxXR9!@I~R^dysuh%@`t|xoM@l=ET(KRrLR)x z#JWtObGA7-+xTiXI!{Ep2t5U(M<1MnD_W0;$8Y%p*DNPLNKk;R6vB)=549*c%3B@95S<<^2ViFU_hYMdPQ>@h>ANZm>zvy;t3 zm2;knnxXG46$bO7Q!#olDy}!MUU9-sE6DFhel*)+D@e%^su@z;u!%Y2d>;?vT z1MPfme$tO(9AHAH|0GzS1}(Zi<8ueN^TnVP;qUn3#YY*QYU9Ep?!G z{sk>PBYB#gp>m$Q!{;;tQ>54Zf4KnqCe16la@~Lpx!m6tkegf%oopW=td#d8f(y3W*|*D zTz$OC*P>uSpy3Kq&Z=;qm^u#8GIv4IRL4wuE8TU??wb)Pk`2DgO1-y`1^56j0hYScH%mejxT zmHJv#f_H}_ISl?$O9IESBl-H{&}|quj(R6uRUJCpG;#sek34iz6WKUCQ(;T@gdQnI zmlXR+^WsP55F_lo#Cqeu3`88dbA0GmFjP8h!0A&Aedw0QBZoY)&V2?k`*D;LTAk_n z%M|(Z*WArv*~|Rd?X~-=oTkq-J3^fL$#6;k7NTU~1&rQS@^Pt7q0pX4qPFvsJ9qkToUR*w+WXBJ|`he;2F&y&tdci)(Jk01>XDwmj;EO5vw`wlYJxG47bFvIEAcAtq7%Hhx;{t?tMI1^dgc_!bGfukNUm2NdvM< zEQ-dX4+@h@4cEnNg&NsH zj-G&ybG|d_>54wMwh2SpT#taN;JIi6#cyvAL-hwG6_LtWwJF##{US7qlkF}Mv*7F0 zimXy1B+1R|u0?8#;_)+5w11o*R;oDMN!-Lc=R4@59QGw&(HnLwPlbmlXIgYH!L!a5 zM|?v1n_xV$Fnvl0tSg1Y(^n{KL|?J(XMzH+IvgsMQBWep-q2WZx5b2T8p}Im7^@T* zw*1D5r2G*dFnXycj+LFAXL8YF%?)Ro{g_W_LWoeRswN)jfH2GE&IK3uN?yJ3j9uHj z5cP`IPNw~oTT}W_p?-EMb!3`L7|s_k)n7y2udydG<7=p^Ah7d>MW)3R=~Y%!Z3}GDT$wx8X`C zZ{)I!oS74Co1TX5R$LsRx(K2}QuYX9ouz%4{`E@op+STK9?CMhA_@b3c!2EhpSlUi zFI$CsI!i#Ht6H0rX$mD-F|#F?Di2oGhs}LGQd}V%Dbdg^dTKRyf3g(a3#GvyEYTCq zsjRkY-03xFMS&4mtSFdUfBN61@mRTs6|s|ry8pGGh-PX-bv|J!xJefn=f!v26#C~% zDAXv-c6|NAD^gm{8q3)`!y41``R!jm>{RQ%b8{s)4CRI#i>kT3wgmc*XCkqSQX5eg zJHg3^>^4;6du&Tff8B(+3PD?MfX<=8;DDH4KQU@al@x#zo2ZdOzLl0}k4~h85OA_+ z6UOwZbb{|@>hR(m-|W}wagV3TUNN1{lgl7COqnT?)y*SCcN5jjW-h5xOD*-ol~7d` zYJ{DKPRU{#ZyuQ9izr#sHF$Zeh%U1p=qa`4`~|vJfQys(y2hh)zRc%VUa0&JJzocn zs?c_>lan!P)tc{q#U?9F^kaB(+{LN2_(Sa!jKl$jvEVgBIG8gV^un2 zlDz$>;F_!Qjh#Lgtv#c;3f6&}<*oTno5J!G23VwyJGDk86Ta$G!S6qkh!)Lc^YmgG zPM>ns77agfS&R0CCxoV7m%P`xXP>@Ls73`D!*T52QY@sPxLuV#o}AmH zCWGc$oR%#&>1YT+^p13ESEEW?XdKP8pqyBjt`{@&>cPtEdasb5{x;za-duG`!Q5@z zfCDQGj;)7&$~G=NxuIg>cT${}$Nk-x-&g8p(e<8W9fjKdr4Qm$e6zI7x&gI7llEwj zAZ~Vlw|h>aoJ%1c?`|A|uIQ44avxBZ_!MTC=bMLB`ehOQ)l6QH=zGQH=t&PffyuQQ zc#iQ-5jHbwtfa&xdM&1TddxaqQDOZ-nLz=%e7fwemY6@kVGZLjc<)@qb)ld)XBkBBD)PrwM?cOBjIW(w{gr^}A|(i0DI~}qJx3fS z^{lit6mmwa92sX5C^KisGR`sRByF4on+QphY5G?D@mNK?sGt5{cPTJFpI#=^nM4B@ zqs|uJcFSZa)wX*;Z-HEo>4PbTt{3;B>MD7pZ+=sqHER12qMP;@8si zF`q-tY1roZ@>eu96A_k+=nNKG!ayu? zT~$F=fQZdeqSww#p78G5o*WUjgYZeILT``Zf=zJ*JFk<&qoAtb_=RdPt;04};k}~P zcDz3*GkKvPS5x;ZCv7+m!>=ZfN3Qwk^oxGSn|W8KuNpwzx#J1t36MFsw-t=3c@Mlb z`i`SZy%(9nW-8Y&%L~ZGqSlX8K{}4h&RimKL|%Uy0a0AK6<#cD?`QsGR zOk^S*Kwr#c0ey`^nc}{em*i>FgiV9;?9mCKOt*{m@w}RzbvYStk)F*og|4LoDuH>L znyfuQ)H_}Q^_{WiA>_2-JK?W#3?_OIe7?mT?^!P?0bk-q%=)ZL7Sx(ARzXKwUc}3W zJAls9m})!A%0qglRKsz&s{cah7XN93BnbnUHb0gAb;qrmsgofj#{4jJ&InV9r2b`! zpV5a=Lu-ZJ4~fN|h;|a)A{HMF3+73?j-pSV2ryZMCkh;u!%`-SESgFzFJ$N$SlHs# zx>~2wqtkvb&$o6f&2;DaRpUhy2=wtE0qTeKBcMqi*y&|BkqBx}g$5RrAz9v|wqtxb zvIOo_cLN1keUxcDSD4kE62 ztq7GAKmfEgwgbHi8?uyuEA+T=sM_#-jmmvIXJq32fDDb>`7i^>XKtStZ96XR32d78 zJD~UH;qtfdyt_gRa+4hA8p&NC*0<^NY>XX;vG7#seBfuVhux-~3`ngxrV@@!>g5tc z!-@;k`=*umZUm6~-nTyxS4NreDVG~Z39j#6j6Q8#+O{7q)E(p{>BMAaf}O9%0^s|R zNd#mL1))s1b`+Q0s4H!E`2^*Uv*7mUd&_pmfmonM<2<>SME}gvcG~fH)uji1O29q8 zHA0p5x{XnX1Ee-Ee_nXIzOU;tDR#p_+%(_dwdl!7DQGy)8VAhUYtIu9V!~)Ur5+W2 z1yVK9ExcvGnx_x}I~=$Cd`|{8Q#r>7rjEod-c-EPowZV36&#DX?GQ$ep5F}BpqRlT z@wpwZT=PUCWOq9Bd8g~PCMr(oUMp}pr95`I-zHly(wzPj?07kftLtX}yZn1vgIQaD zCONUsEqYsr_?Uog`yEb4lf`U1re0i@fVYQK9!SR-S$?uj{6z41kIz$ZtnMZx<`;kV zA}7XD?Ac=F5Mx5>ETAUpp1rv9F0F+9d|qhO0IhEXuyp%mHJy&?^X9<)M6PGNE}2%lmCJPd?4P&iHm*|66Oo8n(;F^g z#EG$aNj%Kf+sXU2?bbv+kL%>K%I+QDsBDd#;@td9Gu?ySS`L1bzNmK03!q}TI|#6l zCa*h(_9sBfVpVf=?PXLm(h{q3Z_}`G;sbrR5&?d`(0k0i-FXpn(JT{a(ZCOXakFh$ z$X$-kZkg9hb`r`0`V{$+T$cgaH8n!VUcS}@UF22-=x%vx+>l?*LaF$1g9juJlUlWcP>5QANh{ei5eA-gBIgEFXj6%8 z_1oYm)8}hf%h__-;&|J~?ctgiGlW6{&fR_Uj2ko2wwE9Vi21g(TX_NPuU4%Yi_0Ni zruY3NzLy}#z@~lgp8tBTO|?YrA!1I;t0ngKa&l~YOz*TnFryoB-WB347P&CnF3@^4 zvk0u&Y4i=$g1cO(GJ(&*|8fDqy+qEJRjqM%S#v`btri^TxGP7Gmkp3?k`sin3z8gr zpf`&K5JXntASQ6N1Ucl*TcLg&Hw5xf&UO7edCq65ypFB z_1{Do7Jt=}P_c~MeI1fSj-;lLtqtC$llU6o^37*66y3eYx;Q%i5NSL}BP?ES z%?bEU8@IyLKl91ON9&ddKCXkdK@g9NI_UGxAn$SOVmp(^-c}M7|HGzZT;{f`P1ox{ zh#0Z=@YxRZZs}xum~U$n6P3XA4X%yIdRfCt7=&uJOzS3mtl*sE?s&PSK;=FSl0G`Q zRw%dR_(-@ve|#z(CrL-M7t+C3F^Kxo;0p5kH-Nr#YA@YuTDv?0v5B zalJn4C+e2JSPMmMeH!I`EN9KLV-zKFJPdd^ZcF1jAKQ5fJ&*-jH#Z(yoc6kgc9ePx zW5{uzZo7x^^$u*@p--rdayJc#&}NsBL0+31?6?Fv&^a6b?(f%b*kgQ8Jp%>l0@e%c z<3fzEC?uShfje1k_r+jG4Zj;nDWf+4P+(_E&tm`r{DP!s^m_4R_l>smR#y)Nv@!Xc zFE~Zd?Kwr9*yj|mf*T*qq@H$iAk6YZ}?Nz4QGie3voqof$>?%6ZI1&RQOS9UNISc(ICDX@ z9R^AeA1Cj+p-*R7AZ^a4G$yX)+6@Tf`POXw*ku5wJU*w>pM#1vukNc^KImh3GhusS zrD3lWBXHnn0}ZZLou1uS)4_)V<8YjUOqaJH<|Z{8PaA>rU87kY&#PdP)*;a&I_OoF zf|w8gWA}WA!gXAZEYa7l^xQ8h5Y;XJ z%m3UH*8p+3sI3s($zsKAbm!d}N$Z#Q(<2p41r(?j%Ot?&P5u4_q=OgGDiq))noDQk z{3H^X8m+YXiLxm`i4{Z@w>>PsatZIDPBF%{O~0OoUYt7hURy7jb&J0}bF85O5b!GI zT-QZ8_ywITS(FGYTGd>YRJ4!YEV)8oKOFNK0^X!KV5k6h^mJef71$N%F}N&e;={>t zbx(19zDv;tRzA!DhV9Wc7=;Lh&kh<)DNq{abJmNi?RvYx4gRBrV!K&XkiPUw6mcb| zpV)EA`-Z>LWaNXr8N~a#h=kd0_SFJxc!Af(NQ1z`p`(wb$AfjlE}Ims*XAE@w}w+| zpNHjk?-pF$XxB^zt@O+*>aFp_Zrb~oTu%GNnp46W$O)b+mQ8P^5}wZ z=TKX$w|4itfk1zL?op-9jI}+iU$n!(dx-X0@;ErEFVW%Xk~alpuNRYRLaI9>T(~Ub zO3hpd9iGr{`@w+7*ARf3+%<$-zPh*J3p~tn&OT*Z=h`gOYS`8@fBp)+%>j#{3b5M` zCo6hC*bFt?%o(}*gg-A>Ruo`4JUP!Uc}*g}DA4WuiEfwOnyU=5?eL9HSHA*cTXz6> zus>DQ%_Tw(r!7-UBs#f9<9_Y;+I35>l1qo-^We{~E%lbOKWq;ol!gS&m=lGr#juJw+0zX9WAKu6X-CqS1}2p2TZaS9g5w3FUCvbWxhA zjSq{Jd*TnA3+m|+iBEKun;YsOkA9MZhrxKCXn+D@6Kg_AA=8I}lNHn9bbJfau|Kvo zlLW%Bpq6l`PpC^>2_djZb%4M#oWv)p_{MQBjO+VB>@WUb{lJV)L}Y9=+tGPDQvzw! zd64^bN=0_}=UD^SLo5>3IwlJd3cJg;p0x)cP%6lk#xCzT^Xz<3I{+sz)P6g$IiOsdW2UQFB53-|F!J!_t%1F;zaa9OtvY;cbH)YW zKpxgVtUQK${2_fe|3KolnjI%6aFmBj1rMo>-+nqDV$yzhw-^XswrOeChQ|gmly?lL za%gF}1xn3Cj<@G&zn=sfF2Kv}(r8(?W!%CN3a*K)ZT{gl=sMGmUnAgxI4lA*pQiS7 zhx}GmKHG|w#Zw^^?n}F;&R(BLbEe066*~F#wqBXC9JhHeQ9XE%0(|GEhvc3@#)R7x@OO+i z{RRoD#e0{F+5ZE-&F##veBmFm%WfY?iAe;C1z_zpD!_$OR3M_4F zEkB97BSI{KJzA*KY5beK^Vn#HULj|7;i>5J;PH6YZ$eYx{on$A8p`UAA`!3dbmm!$ zzX9~zBtT$aak-llB_la};&-(eh=}X5`&SpBmihhlSrICK@;-CtxE ztREnlC-NS)kK%j$`F^Io`^S@HUM0m8pr+rPj&NK5&3~kHL`{o;9^9k#9BgH}R_u4X zxCv1w#mCY#R~m|=mEFHC$nx246@+fpYuRGV1g1(eHXWvzQnj7k4`uK;OO?d|)+^F7 z@bP5#@#3k_9rSzvX?qRsdpHKKhEip2`p3u(h^nsr25jQ4LH9Rj&F~%np^3bqp8EEM zkkLDv(P1;T#&6v%-V3$nFOi`vmu`|zev+O&#cZ;`u!itqHv7`>`>~&BxX(IBCnGR?e2o9*@u(ps z!~}@OjU&z~5J1(3fSub)@=BAoB1=is03Pf25Ek!UYJba#9PkYtzZ|yCfH;=-YAQ~0 z^*gz~w z0^Zvxl6!loyq9R1CVfZ{zO_JHT|yo!S8tNEF8q!=>xSdIoE;<*frzAQbu_cRmXmhR z&6xf^lH-z3C7=qND4mkR!uQ5&4L=^`P99D=sJ`MkS6zgh1?#y!A+MuELpU<-79n{m z%>cGd7=@@Gj0qK}AGyEEtQQDjc>F7jvb{`U_2YJAWlWH1#j=85(hmur)eRVcF8p8! z$@5kPu3XBwu1Dfr-+NFC;RUFN}QT6O&(UrHaJ1gd+QIr>ykScd_4Ly7w@;zpHeDP>&;wk6J`yLYkRN z9PQx@5K#mk|KyAb-pG`COuM!aMe*DC`|tv&B<-0y2=th|^EKLvkLNj%wmCZjcJm4! zoE0$iqT=bApoD|yIk=P{XK3CyDTBoAl+-6Am+mKL{|vFXwwyX#c*xcvdV zj+T^y!h4AJjJr^2&<)riIYH$W!9|-EWbjbJPhi5^UG0m^YL4?gGhmpqTh5dM$rVWw z9>7xv>3AO%tCrm2hT0xh_1o;3O0D}hUW8M1bcHY-C4in=Y$4W7yOb#Ww|_-^?prY% zsX0I28ombte(!ehZ{Lio%tQvQ;|54_2ecc!Nzrk83hN3Pu^k4iXH$RX!<+43;toUb z<#<22__45mcz0RD@+ce=R1q~v$A0EyblZU{Nqda%BI3ZdG3Jdyt4+toD8!_m>?Or* z^|D8QvEG@GetsUViE~->X7Z^)KR*tw9^ur2xc8TdlQ=#CDGI*5%}F2$@b+Pwnf%_| zgDS&oKUZ=r)Y|8u*Y=ST2t%i5wYjWriQkd19xqrvFIGV0_@2N}&nw23OWY_O#7TA;S$k#jI%x{FflL{1b>th7~* z*h$0uwoWiANii>J{V9>l-1Cf<4d3S9?k2aJF*+#!-h2V=+FqY+P?q<0Xv@hRe4@&$d!|fn6QbuFLL=0hn?hxGm_Rlt=_TD(aMdY6}3dWa9^~$?8u7 z&nUbB4hY-m=OceaCJ*3&Vn-#Y5g%VDeEc`97l9B82&6zhi~nXR$1@7p&ikD=XUen+ zK7$-I7zPwCq0gre<3`scK$`mD1Z>w6(k4Q>ely3CBhP;nvEp67rAJKKj-^ucvEI{& zPIkS#_t8FalNJwo-9p8wl0xl?L6n_oxK!Z#RCVxoi_XKRU`= z+P3?D2K?B@08oKVw}95wmYxm~0)WjgUu)hhe;rH+Y$&aXo!=w5*gFJHQP1X#ehfZ@ zbSukq-*vvDIv0$z4<>Pc&Kld&EO=6wrG5!m%8}171&?nrqxc+JZH8$I(rbaCI7KZ7 zGT*?~xiuiMX4ktP3)UX)m|)PV^M1$}xF0}$>`t|NtlD|HW6~x|=R5)u7WS#5tfr%` z+Ll1ld*sNW(T>xoZ&)p@cG2=Ark~I|w~;T?uIub2d}=vzU56l)3kf{Wb$4kd>Jj!u z5ci75>9#ej(Ge~bpRI>89!|D!K~YW*enS`^585A&gSN+j5x8UV%s^S7`D(7Ui{KzEp0>9C<1k4>u8V5N9M$N45 z_zW>L07j}Om`VTut@)c~c^~V6bYGMlz6)XM0ZO)p7$O_y)w!={))Zm}hMXkd8LpdG z3snO!b@*$tritpo&50Kcp5fQID`rh8jL+1lC_uo1DtK?!uzYiWHLDlJyQuVSwZ=7 z>!~Dbr&Qe#LXtw;5pZ^3@vqV}1CipLlL@Nr)$g`kGGmzq5>H9Ot^?w^LI z*vdBj3UmYh`I+M4hb(;M!XfY(`0G!s?3l0VnjONtlJz|_d&<=TF8MMH|K-7S>({^j zg1*j!I&pqRDFR?iIT=~l@IE~DJN@r_zfe@#&?;YEV!Xythq3x*7V)XPoUK;dia$Km zVsA_eE0zm!D6!N5&>n&TsygyM*GJ&aFYcZ1J_`)T?2}hKsp1IJr+U;n1nYz0VE(}7 ztjjAybd%F$?XxtR0p|yJjknYte?IAnGjkQPSj+`R_vS?`YpAAjm|p{}VK2o_n0S&Q z5WOY9Pbrf7<)A=;#qdII6Ie1^ zO7`+J8o%Fh2-KFTH?@k^Bmz6$7s9Th;KW{U$`{-`ZDD0!b;i4)4b7VIpJ%-4nz4`l zLV8163}24`0Y*p!Ic84O2tV{05A66HD~v)5~v@p zJnZ8eDDdUzoy;UwQOU>uL)Tk|RnrbG zcXuh>-FX(i-*@6V=d2(6;M%q3nla{>loc`RH z4%EsO^HJ1)ji;OwC~zytFZ=lVQZ68_()qPW0a6B_5u-+;gz@IAfEd9uM5s>bqlUe> z4K`pC&~i45!H`r#+AYpp_j23@T=J}cXn-+@O@A58JZjKV=iM@=&UF2GRE~7=G=46< z>-8Dcs@*nKqm(Or-U%C@Km<4?HNu&Kzgq?Ezaoc7kw7Z``n`#egr`uD1v0E(BQ_PP_ zVKV5QB0ewIE5tA+U*DK+#XlHr;{Y1gp;UqGK)6*->#=&PZ9*VYS_|@du;@5A22wI} z^>*2LC7RX~)spAkQkcUjtS!Ltt`5KfD3(Oj*#g+Sx5qM?H5N^h_vT6RTmUp_d%9*m zhd_YM?5GZC@u5w7w?Rn@H@3|IJ++5Q&v^i{ba!!}RrU?w+j;ND>&3M`c372Y)$Y#M zjQ%9@Nnmv`-B-17cDEJRDVgpw~T{#8c8;@SJ2k$Mp1B zU9WTC3i3fubK9(d6Bt>)Pv)?wFg@He)AfeDv7eB#PwDC2 zw+f}`r)TM&2BgOfI+SwloVc9UXfo&wW=|34n2*i!8;{;kDL?_Ey@};Wv&QZwc?~ZI zg+PG2(>{mo!deH_@r~2;0ANl5YzDpauaa#iDu;)-CR@{P-DXGl+R~qw>1^d*rZ(X6 zU4sE;W?yVrKe|mlvxavpg9ZI{jc4p9+OpUN@OZ_azS66(gw0Dj7BEyPVSA#gBrjy_ z#YW2q42AK?xt_-w#35{TD^I!En0Du6#=&=%cB(08a2v(hVW|94=|VuHWcXb`FIFw8 z5gephV#a*5*p_Kp*uxJGMC z>PkdJt6I}Z!tEQaS6W;mY;JlskXPU5YLuIM7o>br9FVkht5)$e+SgrlSg&Sd z%&4glw@)z!xv@0jjUQVVs-@e42>YwcPejeG8LN?&tfeN z*gIpB2?9Ut791|OYx)Oo(`ri= z9&aWe!hhh*MhGw+OaX;39Lc4cHTF#<_vd^L+oKjU)o#^u=1JyU49T`EURSeT?$(3X z^y(LWpF;ez%PI5s0uB}3CQW8ENZDRbiCW9#1zINf;SB0M5HO}yhCx4i zZV2}u;boVPcFEn?xZ1kxC$2E11f_m+;nZ_1>yM2v%3L<$RpZd4UK%t*jV~IoaVqQ| zd8tfzYT)9&HDb;yTRRW>MOt!-)$}@(K!lb|lyd#MIa~1A6*gagWCSN1_kJ%^eO)|~ z+K9B<<}rv_BAL50nSIi)B7^mCTD`k; z(eu3bn+58DTGnPaJ&*~|8K{ydHIdYc`5*VP^Yy%|zomAe(n{&TPYgC++w!0li)mG3yN97q&Ib<18T>07ufX^WGiDDD#*#S;Cm<5b-K`57e;r2m%- zz^>sP^k)v|m?aSv-`TSv{X&DqwMQ$&?!0LNnm6DcYp7%VRJ_dcyV6j96Z{FXk&l84 z^A#4eYE6Cq9saAq(`O~guM@G~F|+q@zURQmzm}DU!q>thd>mP2W~pjGBgT z(nJNAtmm6mL`7474nW;O9T5Ty=738P-=+mXR?E2hY;$Es)XF(MBp*83#z*0xdH}oa z^1`d>Nne%@m3AkkgwxcJN9BWOHh?ewI^x)88Sm7ti!#XJA}uM#I?7*_Pw!pKMO?KS zsK>At8k@DLLTcBjk2(GeZDI#E=Iaz?fDQ32E)El|f|NzJ-MsMe0YA-LC-aQu;F2*p zrWT(5l}A1DttgBgvmP2}pQBg}hsU$|DfA_hciuFmQ zMWtIO(np3XCp*%aOkUKaGZ$V{BYyWu7}99TZ^p>|npZi7kW+{c&7j{NzvSA&D=ony zSx&TW99!WXT_k2Mr>ZEoC;Dg74vx zod^v1do*x192Vj)lbyU35J~2#G9K!Y%hF_#OIio#nHiQ$_FKs{FF!-W!ZyMszvd>; zNI!J*Dwjc%hPFOr=czSDm-k_yWlk+=T#LyYsYi#X3>4Fc=I&Y<6!4o5&x_J1r}~Uh zK96LpTB>ip%mJX}<|2yN&lx7}_(prZG2D@#$0pM3T1_{(NT9GA=4Kwd(4R7X7Us)c z!OENezYr740FtrH`jxE+pp@TpF5_e$af+nLz`h=dsTGbP);nN;OW~6t+9F-?8BO3C z_N6h_jmjCO$Ao6+DF=Go`F;4C9xLtIERlZaAKRw-exkt%Jz+^7<_!9(ZQHEn%bpVW zkW1s>=7zZ)zb(|`{M!H&2(3-g*>u@TtAXj5;EM7M=`;=NjfI2UB*GFFH23qr{S6HO zRqTDA&My}+rOF%Nh(x%C!EuOP_@z*)60WhB`|U?5J2E`fT9ZamK}U2ZECwzSi!<20`joS)ya*0|@_QH9^@w0|{ubfdm4>^B z?GVTg73#t6GG=&y@LOfM-ui-#{G8yw$owSKb7H&puz)oJ`TUup1 zg4;8y6_TLQ8zG7Ui)^}5MukapF2Rs@$SmiQu32m(@j=%^N`w)Gn_NDjn=-MjZ_b(@ zsYnoROA9QP3vDoYpa+geQ-Fa9a9Mw-M)$4xJAV&m&98ajXV4i)V`x&8qvorr)PzMf zvilh(6Rf#K9u=hmOY|zq2-H)ls$~-p&h;B|-bKN>Y4(k*oB1$J;?hE45jUg@$8FxM z(>N|8h@3Jcmc|-CuTjCmsUwL4;~Gh^bAr{=Tz&J^OUH>Vckf>N#a(kIh%jD0C7%%w zKtBjkzcQ&sR{LgeU~`cNh80TlblMnM5=dC8YYJ6XV!vk0do8%LIszm1RkSHtIv%C>a^NF%zsYVEubfdr~5wrazU4A8pp?-@WN~c3QXj$xBSjEB>Qu)Z42`yW?V( zt5*)AlAK~d_rMHv3Ix(>UEvr{2;Q_+NYeDXp!5uG%IwAf)2(pd?j>i1CPmZ009H*x zqYBu#YT4{57LY@6XR$-}75u{SWmVdPl4)zFSorM`(hojNNRjGnY-fsGq*(@7*ZdEfL{y+3}kcj7VKMago=4ydAr*Uz)}DV?=@i>#eZz z0X)WRM}=ag=??=6(Ku0wFaPisgGppX^h0P>zh$NnyQiRF>>>u!{F-#f4LLf$?RRdb zQJQHGZkcRM1+*%9LJpY_ji!8-x*Eu5Xrp4+ z50MRB=(w04`3zq{xL?v82E{_*^oeSOxHLiq)`uRpG-n3zKRqd%I}Ui*f75WDN7wrqmny>LM0yN(!kCb zLkI=p2NJqMZEqvK6~AAQ3v=#yNTYPF`!`ki;tJwW(#(rM)jEEyOBRepkpQ~kTXErm zkXrPAYzhKVvNnlNS{Tgkm=#;wo@mER8E4<<_VcPj2TnBf8b}i=q-xE@LWFRz?UrWd& z?zvEN^Gz0_Ua#T7{@~x~ITG(r>)IO3Jr&_a_$Gb;YCNDGkG7`TIpiK$72J6NlyhCE za-_z(A1S@B>5oP&gOJ3qWJeq6=(}!4Xr{R$WrVKu8Q(BG*P$gHpvEm=s#j{6xQ-B0 z$LfAmdaD(RGaar-)_Y4iD1^++^jY)V2Qj;r*za>wWpTMkU$x;g9Hbi7&Oj7-01d zD}9>cYAQ?2A=qT|y#yJz33rehMOai&=ddd+(^va@q|NRiG;hzoMoICbmV_Ck^DL}I)#CME@k`zexLZzLlU(qo8PqV~Oo&NLj+M&2Iy*_suvzhXr3K9LG!u@OFvsR*^0R>4=eW`Pe}D<>CUKG-TScJfYCNRUp&VopX8{YC;D!fad!wUMW#Vr4h4wsZxGw z889k)pNvipic{0NzwT%MLgI77;F!sd<6I!uNBkD>fOa3e?b-W>Vu$ff3KXpk`<}fW>yEi2 zYg-c#Wo47YPHEv`vIHwJ2TR9`$i`}E)w-A9r$HOxnxpqQ5i=@xN=7*2u&>aGGS{H{ zMj}bnFosbvk(bPZpMn>@x*}oHot1zSv6WOhHg}+ZL`A3&Wh@qDy%bTjC4jC3Qx z1U?W`0GBVWm^oP-XGY2@)FQ1$AE%#2sUBASJy~8CmEoaXbC=4#>SH#e|3K{WeRG3xJ{ePyIC1tpK`B0 zjUSyEE6@E^l7>R&L9j4lPwBg#+L$V!WM_p8cUT#bLRsjI>hOPHr@p522K=ZmiilWC0}Srcc4tH8Kl7Kibe)cNKegHfFJu4qH#|$g_dia z4CU~nRMe`@j)G1>=0X%3+K(0^eBu6~$N|p1Jo;|Cgk%@=Pe^^&pqsKZs{@y17PH0Q zo~Vk0iRx^9b@A~Ea$^PekIEzUHer4J=JDjA(5cW#-Gbb%H-XXj1!i}tZ!k&W4`gbF22(PSiJv$2?vB)4gWqZ>$ z`0o%2zlYV2#d~QMlLGwBoXFn?eZNTN^A)=+slQ=Np$(aDcC(la8mmQD)pq(>*o$5{ z3V}5iAR(G((UA=~C>T7y6-O<2=D=hUEiWy6ALnfyWI==0Keaxi)MO1G-uEdr)HXENyyY!T)sI1TgWhv!ekOP3X|C zxT~r8ds%okSMH1*YqW1~YtpB7$~NCFsLV|=dxnc3s&nlJYEl|xG`~Q3c1dh3bm068 zMe$ljixKDX62}#?mBA96p4p#aV`Y@U<_=&r42THIO?N~~6|J`!=4~4&(UByX~=SA%~ z0$BdzpHEdw=Ud(V6{vM3((OUB_umn3lAEMJV#G8=_PGbt z6qp)*|xu@8^=)>7yFE&>~?7n)>N@;Y@(4yXz)wrzn|AftNetC>UD^ zt65R+kZDhhwDb)2=0=P{_Ep}cQ6OVdI_5L-C#?QGX_AEgFLH-r_hlO}v#;F^Oh0*m zL3=u{3$XrL&5SaBha3cup@7|!A}9>A++Wu;gpE72Fm}a)f}|8|T39`)?ySBBztYpf zq@6+KPu7%pv@6d}As4?fw8rI>LuR?PP)XLAz%l>W4!&nf8s@k`LyN2J$r4jiVj%ku zy#!D8@q3u7i2!3)t0I=ZcQ@pWESHXwC}bP%`2t4RiQRoEa$i+MB~8ASeUBL}UthuI z1I0%Ol#mq)i4BeJQG8SUC&*hl>@NZ!ilru)6R zzyAig8&(G5?4l~)fDrRaEBz8tBjYj|dCme?VP@2Bj=QM+)FnRt?YE zWi`r%6B^m#cQuPngGQP^4O%DLwnM%UR?X`CZaq3efM`|gNXRP;fe)Y z&c3R;t1f~mG;kK__TBn`$>ra;N21Y%vy_q*Cm)9MIHZ;~1>{ARYjDL07c32ug*sKZCSNvBE#HO$Vr#xYT$rD_$koKpb#C17HqFg^4GD*b$PWLZeEsahksN z#brM!kcB1Y^ye5EZI&rn-o6z@!_f_4amZtdcWgbkPIukX)DCfwz$lkcZqJJ2=$`sA zOs^-PQ7lWYRrIk8j9Ohi&<9qoz$VM%>oWgQYmuC551iY-++_iLN{zuSgdC$c$RZ-J zoLH0~Cbt|wHn=WBOLZ!A^n(@A#X-VmcXDLmA*$Ym>#_|RK@4=Le7!Z7ESPBJ;HV+t z>(}-ya>G-+6UuAOS-D%g@Lz&>M8$bnvoNNL?BQN^3c*uap}&L==se8-W}{q!7Ifhk z$tc506Ii+tyrHyHFhVu#F_XB4ZGD_+Ry(3unCdeUR>>~#QQ^THG>?EElyOdJ0&C`s zzu+jz#=368MEB6w=K|+rBT5;O_K9VN;uY!r01=AA?AW(d9DJ4ya&K|?0IoU1%E1T? z8l{|f9Z={7xZ+8G-YoxFvvsq$wCVRk7tH)aRw_BR2=fVJk4DmRgeH#151OLM9A^rE z#MXu?2!?-wB{LI#E=+cpv&Yg$LN|AQ9+W9gEZm_x)o@HZFH2yS`iXt0+z2X&)jJg~ z5w`glA~MZAj-+D5yM_6CY2eEf#vTP!cdx)HJoMdwAO0&C2+I)$SG{G3Qv?XA7H-Q$ zHb5!Sul9o`Zl;pgCMDPNLvCW6r_qPHp>gaPahF7VY0LtDHk-FwyX|MRsimBXR7zo# zd*Yi)+a?Et#!i17f&y;@3g66=CyE}UZzj=p#l_YjJE z1#u!ymm_UOZlHwfG^@is+nlDbm4MIm88Brer4XvP+y=@7IToAgXx#aqT=#58ctbwP zuE^yqKuaU)C-Sv*j1L<3?hpVqM7W;9?eS0hU4iGY6&=Z`2Tl~8p$3iOeAr(ILz^2)7xq!<@~JbK)Xt3Oq?iFlc#@JAIra5RDuR4Aa9rP#{b1Z_~C=E=GTPNHEBjUo01= z4gnh)Ry!@9*QtlYB%GC{+K)e?0iIG0Y_@;gF_D%mlA$z@EAXeb3q!$pPK_G7{e}1; z%~67M+4!2Y%9&-WF945l^!({Oy{IRQ=c0D;XlJ2@ZdD!d!3C@=0d-=(%|i9OOFF8@ zVNJe-+qB9oKA-~wJQLUP0*SommR+8Y4_zpa%O9Nq6(p!gwZ!!&Q`^HCpfS6<+qXDe zti$8Co-+s}FjRvm7gHvA0j0prr3`fkZqKig&zz4~4Z8{y?se^VH+hFMel!72uF#LT zY<-IMD@t2BPk^Ok+r=3j;KI7Ca?ba_<~9JZua`WIADLPn>;bLbH6D*?cQ6K@yW{bE zm08b01p!)<(gnk@nC{eiguv+;T^XZx{r8>m8{RYn zW}LMv?nMVgkLrNN2b*^p#jMxdo4w+ZBfjZ=a zSzD^87mw{Umd!`N(M)gGmKdhym8Dy$#yRi#m)#rfC>#8jkMobq2H6^XEyMTKZO?fEO$i9V}tlgjxjt~>9(O;g4|j~O#YNVl!0 zs*&Q4)e)2_D`cgJLl^jXJ^J?7Dz|;^db=Oerpqqy^Z$4N^4_V%<7S6HukNpRm+xPM z^wCm`=rm;wS9j??Pl>DCFWSZfK0|WbE!6d1ud`jV`*8d!_e)FfqPA__`-G^I5h$D#thuiCIyKsO?pN-QR)GTYb6ubt`Mh)@N`kP%idZ_ImbG-X zy=Kl8$3Z}nRe1LCO~zHmw!3KrMlso4jCT94d%MS1R#`m{0#I(vO_r?^<}GyCO$1<) zg&{FN0i$H4&0_7)a&h5r@Ct;R=xcWwYi2O8jM0kWbdI04azu`LTB^-Aax@Ua`w=~ zALZ;vuZL!TEz;PhppL&O+LmV$GNCO`kGIqR3^papPg;RN$Jn~_yU}U?tPW7(6SNWB zO{R}jOqOZZ?EOZ3s$BIpy1jb!?x1bBb`kJZM+97A|6bc}r{0UB2G=X)%WMzb%9{0S z9n`Ik1P_lK=Mj4TSwSLr@K|{9E5=h(cv00fIURRB5Lun*KkgIvKuDsORzO+F(2e&R8jiNT6yhdIUs2vrLAk01AIxM(7-|ofaH}1=ro0R4*V>S{C8lW-VR*mw@-4@M?G+8ZF+bXj3=t@VsTR%VcK3x^Bp3}Xy z{XFUfScLkVJZ?Is^0_z|Fn!k{4Lf&@r~ z1rQF{HBkD3m=}FgxtTsZ z&aq9~I5lMXHph)x&9TAiETotw4N3NtOCGknKf7knnVK$$j+aws!Q+9f z-G(l~4fsjG(S109*@0+P%_JfsMgt&Y|5q3A#B=O^CP@{J-+=66l|QOw4fuzPRh?^r zp0vO$Db6;FrHIxPUx4*Zufd)o-hzeW%O(Wyvh4)qj-EhG{e$?yUl-qFSvT9;GmO`7 z4@kfL{St=9NyzW1es%CbDc~;F+(FZFF+f*#irdXlpj+rz!?xGQ}6l3!^1B4L)ZiC-;fCdmPzJO!dQK_^; zWsnFKCc_=dMM2%{EnR8E0D4`H`ch08DQ~H&Ur;R?jr^{EQ~Ke2E`NQzAUB3!Zvg2o z=cgJf=LF>9DtjPJO2bL=l@yKok6JR=VyTZIC|Qmq`IoJpd7UMQcr=C!J0i^bLn(w+ z)-A?W(o^nsNkj2z)D>98386P5(yFv?c)5m@ay{XCRq7e@Lgy1g6LY&e1ZPOug<~jX zx_b7ei+V%(G5}k1FZXLgUh}aX1u{AA+iLSWZl|I4aX{kUdN6vu_4ff92d}`@*4ERW_>T#8WB)OZrIT#OUq^C+NfNIPKOih=l6{fos<6kbyihn(Q4lF2B)v8ZGoIKFr zoKe7K!Xz`;`s_+BSHRBu5D_j92u}!U9zYWZkzj3Vq+=%BqwL@smP zK5hPp>em7%#H*AlH*a6|d3adBnK;ZlP(g5fY0HhLQ6@fmQXGQbQNGE-9xaV?%nWph z@N$fgCqRc!!CCz`-`EZH9t9Ef*4#icL}4aItH85tu^aL~EU9vL(mXJ+6I|v|6`al> zol0vc_A&GHmtEC9e+Eo+oowkkWoH`w+m?QaR35^btP|ueNq5Elpn~eg{od<(g>2=l z<}MTmSWkJ(MpATK2-y_-D3vEZgywR8 z7V91WSBN7#?A+$#HwvrXg~VU{pN~cozH4{e207>hLV&jlLJK~HSK{TOaGS6s-^o_8 zZFd~muc&uK^?;xriT@sX`{5ix;7R$eW}I?LXBT)%gpPk+N%C`!ysOuy}#Q6sOQhwmh6N*e8YiNiG!uZWZrdDRV-L=JuKUOoA~* z;Q$Nn?V>`#d@%|0Px}sgh7C1@P^xpDAr@@YU%k|S^e4oupUx- zT+Ok91Y~rLfXKhB?Mdu3PL0!UjVwRS9u0~VjUdN8oO3>)%hE5dh#{H23kcGupi1Iu zUA9#`HZvyUS)w_D2#+r@c*`Io&-1o`TF?bDADi6(FFRLXtt6m2Rcy@Ao+ z*)W2-if)qIRJfXTH`pB3hi09+_ada=Mx6x%eK=lD2rR0Bj|J(;eR>^fCh60-a#lZC8#_rLDaIW0IFF)PA+3WraCz+&hlH6-M<}UCJ zhmhpG68{$=W2#xl$RDZ?E5$L!P7;!X2cGg^L9RUw4BLa@424VQ@S75S; z*7NX17TqOb0O_R?%D2$quni&P+1ep{zN!m(zKa*w=4-n6_HxL>!T7(Wfp>P_g|Eku z%d+oK=CNr7b=N$%z~=0z$llX-8ACWT`sbmzIbVr|sB^W=|EQd{YAAB8(niY9Zi{mY&05;+^!Mo0N{UI%hwa z#?9#A6s276m9%zivb!DIvOzCWBylSZC{}1bWYm9eheK6_JM&)Cu71(I8TE#f{OFzG zIhF>@(@GqzvoGu`eG-8%<02>$bSVdF+k6C{Q&R8PmS>cKD4rT8o5Gd%=sqpJhKp5d z2+>*z9nX&4sQ`Jtwt78j>T~tiLuuH$18Laekm8CwK+#N9M05`3p1>|*FynQjpa+~> zX$Du|LH_XEVQ}fI;0*Z0JTsd9N-Z`l%li*71+N^Xbxy?snMgvrR)S;4(wX1T%Qp(P zFUWtvjdRFl-IFC(a;IY`qU)KMqEku$*NK9WLQL2r8h$I-*KmW~n|&!d)ivZu*fJ;i zVl)xdK~+Zd);--KZ1e4bpMsh zz?7rD*u#Q_1We>YRHtvGo52U4s!Gk#sDez`lG}~W7DvF6q)8?X+r_z!!_uX6S1l+V zOMXJ;r4p?86-al}Vw<*DPfk;PUI3oPt<`J&kVDn%1Y8$pljjU*}t=)0aMx=cmUTZffZkc|Z8p`dwn!ZcEg!CAvrS?wMdjiG ze9Zr9%p_odcV_4pmNH@(bd5?BGqiAOIdjHYn&6_SbpQKs;Ln?l|Md=j`H$$oTp=wi zCySUUG5O_KQzc7x{}FY3G>Z|5bLDqT%qELy(IPNc*Kdk0Q#o2z2%YCA!T{in?LC72 zaPlu&!cNrk|Fncb>z-$Ch;hSxF`@}z<5+}s_dl2Qr`-pl+sEbQU<5e z8(FyXSkhy-fGIW&X9lQ4pkRz>S2BmG@m{|3i*;a_NANXTP8SmL-FtGHnO=3jwvW6>es!M*pEmA)I3@EYiMN^qM#>EKz(FYeA_N8<5lDm`Ww#Ip0k6h4CQgQTu zaWP+d87Q<6xnr6K{52mI=9BNIg6h!jtVR{6<%^JR4xE6&|2J9swFez8wMHDgY(t{H z%GZIyeKmT$IC@JJF;O~-mKL9{dul)&H;1WZUGaFeczOs#a4TNd&)(1XRTr5fsXWK! zomZh1`DyNVx$%050zOYC2Ax1svKk1ec{@}9vSt@*V4dZ(C9u?8uXsF5F|{pKnhZYn zglkk7ibfDFyH)Uh9Q{4$2?%(3tlO3?@>74K>p2WN5dlDx$7=_s#+_r{4h^%^`5eiZ z|7VhNT?OBH?w{g~nxjyMiMF7fb_S^e5vE<_JFZ<(zxKzFJ~ho~Tufk?2fuQ#%lr|E zk)Rt;#=7}x5I=>N!lXy|z!*nra`Bse+;=d=R;3sM9k|I^2)uago@;hoKu@oIv(7py z+X!$PZ?1sUq}vtI2-ivbW55-VoO-;i5GPv0Lzn$x0nGmZ^QJoU>)TcLMFJpkbAEp; zGqPzvtL^dFdLRBLX{w@EM!nK__ofp-$g5og1g=z;&6fSLrX;LN^YN?}@lf6~@Tqtx z5fFDGAM)4_S(UX;0dn}X?Uv`KcYg1X*8*mX)FKdd0UF^kb1%Nr9u3uS;`uThmTtA@ z?HN3JIN3|rWsdTBAO6P5?62Rro5nt?p=&=;pH1!TE};48 zTo+@00F!Iupvs5SX^-l`{CK6M?QXB=9Z|{`qdPSq-q`fGTC}xZJ#_X2$XLChI1Heh zqo(6D_q{}}Dl<0Qm6Wz+vvgFziBA|`v&M2d0P7*Z?C;_`{PJgx#c#j{fhiOKF3sxs z*Z>@>a)Ym;l@^n&8g1T>0PU>8p!3&*O}=chJx&O4w=kk&JtT88+3MAy4>jbN*j$?6 zIXLpAFB$)v3xI)nCB3YtY0t@8tCmY+{1=e%S<@$+TQ0)%>+OyE!zd>r5pX*mE^J=T zuKvlIh}ZM(zNBO{I(?MmznyxzzyCc6DCOsXMIBhp&j8BOxihRKb~y54(B<_SY^~}Z59pLa{d7@y2cir_7cW(6tcwt`a}?iZ+-(1 zfUS7nr*7-H+O<6*TaIOPgmG%m)*aWrL|xRB>Rlv}+;zU(ItQlKK{(gBM166XR_QP> zRG~qe{5#}=C@wI9xnry!_m0pfFmg>e(EGi)1Jb?>mQ!7!(0zVIc57vfGl2!EFMN5@ zK;BsgP=$|+6ZEeVI*z>pp8R?W*Xl?7dODw`Zp>7NhNau>^!!OC?Rxoobc9BiW9Liu z*#$V+)VqH5O?_;{+>!cv=fedqhpmIgeV8YQ4!zN~gGxHar+W%yK3AfbDKIz${1bx^ zV&t-LpG}dIGwMO@3_@wVl}_jAT7e4h!)EZ><-i_ z>ccevA7OFaL1|@np8_~|>k~lc4?fZ2|F)Gvll#B6QjS+ZUdk=aWn9!pukPFO-R1uO zZl_v$fXw3mYJ)tj~i~Z-h;ma*g<6e@5ct~;q@C6gUM_b z0PrBiVdStEKJ6ecO#iAp5llIq7-_ z?FD!l9N(5Q7j0I{fPBhqvBqSEkl%i3OE4ABEo9Q$p=Vc|$cy~H=mka@!;1{(*i1Ur zIQNa$&3F?$32HZE|1p@Txbyp z%0g!5Nep8TV{?cxuT)ozHlfeVfB;oya9s2jgSj|FrLll<+t)QP%y1Uvgi;SZg0FN|B}^i3vA>J^`5^Yi$6@ z+}H|9{EI>T`u{t`1jtA)AN+EO`n5(GZ=n|U#8u^B(7(Lhk@};RdN_{ixUNnxD<*M? z{ZC71ZU%j~fqQIvo6gNFK&bROYS_NL0>*vQ;J`lK4 zFci!+%-S6@U3y{w6`{f4Z0@yRra|usdoT@5?vP z7Sxy!3VgN1J*3wO2Ok-;HTN!q7XG#`8CPcvjm-o1>YL>+7Kgrh4!7>ijW;9ZnqPy# zCql*wj|-)s5n|Kmff|7-4`Sqa1Ip|5E0SvLmKszCvo)c2=;Ca0+V zZD^NJZ{Z6#47h6Iax(1eWvC5aRD*^=NqQA?oB`o5^OIG-ktzDrkB~HZEAjq&>9i~Z zM;qxK67gNe@x(Ev8OZUWp+-7eI6r>< zS0yxn@b<8fgM|M`^NL&^xDS|QOSLk~r|2X?o)F5m|6Y^925ol77?wbkPG>ekMGK2j z=~P)%F2s3oD3kdYT7go*@g6FS2GdYon_@Z(cV$Mf>VMy^8pZZX*5@-?P>^q0Tb6lG zQYM<>C#kvcT-;IW^Yem~uk`_^F9ZvV=*k`-7?GS<@J;h$yHR`nd7Iw+?MFnv|GELS zllreW)$R1or4PuiSr)ylyiPPN&Bf(?3@|nRnPc8OYH`tsKUHf}K%R;Mta7ONMK0n%V`SZ9l}S5T4kpB>UN-os^TZm?JQkVm{DjvnAAVbyv#gmU7qmp7w>Hn z6ka1oa59nYiET->{k_zS*W1L8ASt>k&cuaJG#jyl5u0XuelbkH$UWJbnldZx?LX0j zs;x!*IL78^Vhx`>~1N16MAJN z=5B?mkiwseCh62{dayBlUR|#481x)JTEvca>=Z8zB{2e}vhLync6d;W@C|3zo8Jh{ z9sbnT!=$o6s1a=gs40T|`tVnZdRs%X_6^T^nqH^?#!ky zwD}mxEdZ~=k{yb-rgm^;`UIk&Ie^(_2?fQ%zGO9ExyB?e2Uah5GYQ>v^${?3)P)qiqR^e?6%~Ua z1)_8y=z^-O&yR<%-2zS(c{86WrdSoIYy)Si3ur^W&j)X~4*LHxp^SA^qO4 zBO`8`ln#q23(Jx(L4qcPi>nJw;pZ>7_j#B99+j_%HS~RzBLflHbU85^_yX<&RBbQ5 zzciOFY84*bEz&Wb*LAE&V_}Ueg^NxbVRHdEhNur6fz@>w?|kVSs^uiILb5-%W_3W{ z5n$E7wv3^-+@MusCj*HqUE3(9{vW)(WmuHK`!>8-s3-^uh@^pZ3rM3VNTYO1mvlE4 zARyh1bS~YnN_Tfl*Y47_Ec?#l@ArQ{J;(7pU;gs}cJIAo=AM~r&a2K*wT#T(!%C0E z_GoB1Qin#H0jGPvuylleF};<6Xsz7jmgeVymMA8vsJqb;r;UkhVGKwSW8M}g@&gJS zS!S;j#Mefrw{|*m@vv2Y_q%;eobMmuGj<+K)-6W6S%@=fZT^!l{`#k!FO8MXsw>Gq z^uHY{y2H82GMpxpc-}MdR#Hz=HTzEJ2j(B!Puo!Jk^vw16^c#ezVd`6)+56hRff=z zvY7`fo*ISwk4N)#PHk&mX8KVLM{JLvRvqkCuiw3C!agPQIL7xx9HvsA`0T$i-ThB?2Fy0hq=ordJI4Qh3p||mEsxG8cRC&-YuJY#7JU$g>r_pD|yiG^S<&QF# zg4Mlfna>{cm+Hf7_puA`tzQ&J%bR}q5}B%sBX&N!RZfFfq8-SON12KQ!bGk2=n5JiX7X+tB?u*p)6pa{8OP-pZDJ|%PA~w;Y}0jIu9@%zd<6I|2mk9hyy)% zBRg;|A=AHYfGVhE^fk4p7@S#SNEZr&>|-cwa-xbY{E zQqt^S?IE@=!+#VG#(q6r8$QjtDB>4u*0}q_Laa&WQBkY{v4Pb5lN{U=LONEf?cPvr ziRC0C_tpa6cj^J``5a1HnnORrd=Y8|2@KH#dZntbOUZFMfmt(kxtNNEer{cL14`9^ z;9%MBcDDQZnXkPt-F8$1^L2jp^t%_c%VBW*YzxmB%glK|o?DA#e#CH;zw9LbBv;t^ zzd=7Dd=Oq~>AWIZnCm9vL?S0E(?ZA1tx83iTN1DK2iM<>?`aP|?wV6uLrtfOIrHkA zRMO2+9QE=lD(T)7+-R133rA!1?(cHdV^;vRkkpTbn#$K*G4IFU9yp3P@bA_q9%#|^ z?fG<&QTnu8z1jNP;09&9-F1>J{8uZlqLgR}3aY+%@UgHGDzeM6a5t+5-XCBhdaV1# z#O230@?Q;eEHkz!-{;eq7xMW%V=#JmfZ0yM^_giIZJ*zstx0s}t^UgK(T#&rhNIyd zB+L2Awbw}6Z*n&!-@U#`yZm*){Z>QloIBS<^|4ML9N}TKHf)|Tm?K>`HGPCREl8m3 zttZ<+WW>Sd$T_;3C97X{j#{c$cNqK}X^n8$x2*`#SiShY9iVysUWBfl@JHmFbIn0* z>CIxT>#Y{ydan5FBvq=v7^{xyMCG65sFGo$wGU#)RrVVm#67fV?v(U4OZ7=0ps$t? ztRZ7JoqR!^lyOJQ&cKzQL0-*}x5wO#;7&yVr$uGL=N%Bl$tG)Hz~`@OoRHODw0oPt ze(-JcR#1V}e~|faQbp0yt+`_5qKdvf?!IztHWK|eG-o7xRQRW+ zQ^r7+RnoUN_qvQbhYEYf9~zUWa*Qe4COyc<3ucX@G86Z?c}j6t(clhoNstk=OZgsF z0rGknc8XBmub}bWjO1+cQ8y+OYYU3OnVPYX6nB`m4y@ZFO%Brtfv11lvw>EZHn;UkSP7 z!Gnml5>kk-?fm@E^ypxv?Ji5#nrksf3(pFZWrVt*wy-v@CE4BGR9je{4Mzo3(503} z;zC6vQ^hdaUuZV8{jIUdhpZgKZ$9iMt|${D#@DM69^u&>>l}>=(Ad3rrta^exkj~* zb6%%4GeYS*@vwj$qBt)4fGvICDukg`vDVE<>msrWGdWXSz;2%Ph+FrqX`Wt_W0x50 z!xRt97Tx>3)+19Sh21J(F`flo`@#3I@~7K=bs_T})J3*xW5W-|x$xh%e~JF5!Z6;q zsNUwQetya+RA)jM<_x)Brc+M$g88|Q25TPEnOfvym?r7spz-ZIeM1?QjG)#I$7heT z-mKkKmdnjXe2`1;z7_Zhr9{@n>(~|V20AaX#wF9= zqKhzdC{Fd}UgYCBd#eUWbOC)G&DYI{D_IgxH#vUTNjhcf#SO7l2oBd4>2(^{>^*yH zuHRE%_mZto5YJL_-T0U09?2ScI0$G0MfC0B;X}>V@b~^oY>b{MH6#9Y0cpyFPZewT z1`1=P18zGJE`H`BsmqT}G*{EEn2FZ^-9xO=v0nTL-|SR8Y{TKXGyS}w$q4f>;qRHh z!?m#^)%}95$}i+o>=+rlH@a?IB1JCd8JpKqM$w70%1rp- z$1#gHk@sHjx!I(esT04y45fQG`;cihYTyHC1OeUH;ZZO&xu8GH2|DvCK#!->?{+mP~d_Q=pN{Icj zdzbk)T(y53PpLB>5jgfP*Pm8@4&rbKjW&e-dP>asJf(a(&o8#D{x`*BBSC7^q;Gih zr`ix{V$PthJBV{Daq6z9jqmRh#31|Zh~2oz4)HzOKrUnfazAYwyP9r%WTvO*W?mx0 zi6aoIuJ@Z@J?k@J)8Qp%GS#}RUetcK@3#$6pK@X@ucW%XCyhSu;=#3}&l1GR)iJ(C z9)2j|%lDTf6FcnOo_~!@_yazip@Y7Y_Lr7>1Ma+Vvv-@2#T);zVhxj{#h%khP1grd z7ZqFX#~~f>)Ml5=?Y*?$ClnvE?A#0zXISpp4~Wj6!A7NLuyZpDSqiSR&&n4%ro9{7 zxAb~%<$m;2gT3eOc>UsZFBh9)DX%e%KKx~?=YBQQxR*D60Of&;9MOA*OPvdnTCLz$ zdZe6t<#z3n;b0#6DxRBo@09{}yG}L1a_v>_`Qm(4L`@J^&!7uYzp}v0Mh~%|?8juq z!1ZDZDfTr)z(6Hd`kJfZT}b}vs@J7gWns9V+lulY|Yf-Y+TGjN6*a#q>%t|y*ZH|Tg z65fY5bfjfjju8!dcE*wB=rEvK&a|Z8=YDT zsc4Osr^J-hr|n$^gjVhV>oS?TE|cE75qXD0pU>45s=g7yYX4|_tY4EeUwX}olK&uA zO8I)^C)ujX%E}&{7nUE9kKxnf|D1^QI`v7#GJ0)C9h1M0vVITX*t7pI)0+(LP8xic z)?JhEh$M~xox~X}PpwSuiJb_LiZbQ*%lcNrhfxjpHkxcZ28s^}7^!3N0tC_>ZhP zorTvf8rv(I*NV?yi?EO$OEYhaBPpPgX#MRSnHAB_*GHkbx5AWi0iObl(4UK8_ zET}nQG6)8P6-Y?v{RXQ@Z5*Y6*4aNp#CUa12sw_8nHtm(ap2enxBulh73D}TST$5E z3mUam@32FhuFD5s*RO1;&ty`LFNIbTyBXgWbX0Jox@WDZw@;2WG7(2pljT3OVeU{< zCq;Y2`l|=g+E$#1jzQ@suy}hN&oXNH1X-a%hR^fvS-qropePNwxCgZZ5 z-%=EQxY7M`+*jSA|J0xE>$q&Fv%IhRW%ak|x-({}5%4xD%6PeN){uuh%%v4ZFQ#i^ zyoOa0tjk)nG<)NCw`K{zwm9yqJet8%mf5ocqfTyrS3qoaQYNwc!G@nN0eK_3QlO^$ zUBdiN%#puXF#q;K2}>ahNC$yWrpL@w=o`&;Ti3gET=+HawFPQgbC|d6+$A69X*~Wr zt?P{$U3evSG-1^Lc?*9mz!No48ip*_Y=j=xpi0TR_8C4JXl@9un>v~RB&`~>2fv(Y|wtGXe8Pyd$4d-;&DF#H8 z*^PR=t*R-Lude##u-(&Wv7CwWfaCp=_RRRO|HmE{o^UcXeMt{jG!X z6H1Ni^5zSGqj^`ankbIyZQ^v&=jpuruR^G9Bb-+x7Jd*V8Bu(QHatpH=S6SSzMtMM zZeMSpH#s}hHu=+Z8lU5E{+|gLyAbr&^^+DcuGLMdZ)ane1mK?pMG8 zHRp`c*|E071R1AIhsBc4;DaK~qEp4$F5-DFOq7bYrD-?VA82dDUeXzLX0-RM&KlES zi^jF<>#tr|b{2NAIB|RWf^T~P?Nu@CREMaaE&5Qk*F0Ed-H2gSam3CqpI@J2iVc(( ztD|cf?|-4=j!p*&Q!#kh)t{#4IH0LjbFZ2Z-V=D#q$nt*Vkq0?Nv9|em9aOWglf-J zk*KPyEV3^3Fr}c58LbZxv(7!qD4E!keYo?CQ!{s!g4K%`BhIGtC6$$mp6K}Det}%8 zR=cqInUQ6BG6mzk5#1Muo3YIy-k7E1qT1cPt4G4?nY=mBCjA4ICfWz& zH5O+D8-7$SCr;DbHq#Se|RffC0^7Ey+Lg-`cbN zzh?QkJSWj&W~YWI7+>qOUsYxfmw3&9^~nGFvNc4^bk;3Nh#xGdKlO?pNUMjat#tB7 z@mR6I^ z^3M4X%+c47`MT|?K#&XOx^v;js`dh^IZlPzuEB)9YS!`Gr&TZ2mhCN=&ZIilo6I#_c9>K(pP7}liVm4qw_ZO>5^y|i7xGSm z+02pV;tzryxc=D!biJKsHVn2lqp6)b!k+RznjD!afEVWFx&0ko1Jb_nXskPaY_&N3 zs8>7bQrJt~3TA_bdH)fJ$X>FedKx2nn_2VA@2kLcC#Gd|@cWNUXqwv1{GKAA({@|4 zwPeX9u45Si&K1@w2AH<-TjbuK@6!u(!ult^P}t$7nMu+_jdV4BqhO`B|W;!-R1heyvD`d(&1dT7U z{H~w#mufqO*Lg(0$Wd1Un>jV_v|%7?QeETuYM}lg6K;e1VZ%;=G-iLNp*_VmW6V#; zY1#s1>1=LhM)vaKK&E%KXe8fp5LneWoccCMP4~vCkLT2?Fu!Ga=6dub;L~w*n7;Se zSD-|M(6lk_pdskJ2@RK355mW}nXZMAa@mn%B~@l+n<(oSk%2@$lc_&d`t*| zKuVl1{fywm@NsaH8h!q!CyOr2nMqfq#9uUhzh(+;`clAwQ0tX?Pq4x|n%DcKR!#kR zYfnHHt=VVWm58tpcz6lZ$m(AI#|a;ZWRis%t)V!G^XRc?21PmoU27Ld$DbyxZvhNr zr+1=ODb(S!IO-v6=FQ8^?JSa+4Ojs)bbY+a8`HS;f}1z<1CYq6bgW#)vdHo56o2|> z=xwy1ZM~C&Q0*~=ppAb=qL7KPy>z#m*myR(U_OAlIoF=|QeaNAb-Pz6VmTffjN!(0 z_Wp$!%&5ms-wq7(sd)44w3MnFQl{}PWmObzj4d>2 ze6EoFDILxBaKc(m*3spJ>fe>A>kO8M0ry_t6qS5Wl|1*O;0tky2ZBl0m1N<;+>;Om zVU@pHX7fc$sTW&pxti5>y?YL+zEM)jqm{@P)$?ZxQ0$0))>`?JSRW06y#Gje99=Yj z4XDDme^{trhqV?%-uXC+9D}xl0oXUBAJH`cS>Jw+@qIgIaIeHq z?@xhgi-5e886t_Yq|%uiQHP7Yy!8uDSNK&H$Cj0jW#Q8{x|r+EC&BhHCYpwNuH9KmaL1^TQa|F5;`ia4fTff9iM~!z!{l}UKfe@$#&3w3uedL?iY2wfm zKQ-~fCJ*LoE|RUYw1uZpCWM^Wa|hbk$KkOIni9|7GEpc9r{1pdCGmR0EIt_Umip(% znJc0tigMnW*malx+~|@w2wO{<#J&5mSSI?6XQjdaVobs4yPa0w@C1AG%5Oe_S9T(C zlPs-NRoXex;0n<+n`@}n+k`<6O&(4K)RA1di31^)3&7s&KZRZ&>+t?>@%e>y!~IX8 zH~-)KQS^JMaqp%>ZB)Py<$Tpk%bpJ&R&fD^xa+V==NO7YWc>PzqJ{||%F|<5bfqqT zbNWvum%%ntBw9A7HB;ltK)PPfr*KoC3%qokx%HmWAh&!(ed3Fn~kp_LiZFd z!sw{owl^dgZk@{r?KefBf+u0B{c{g+M>X;oGbQDc%qDq+R zaZSt3{c+jC2YCQ~iq;GdD0u%_S##W)IxH4z>(hLR%w0=4U)<`)IBiiX$>eaUS^8=z zD?6^V!U*V7MtaD6DwqAm+KYz0eWEA465wogtKsi8t$FRzWsQ52Pgm=#A%Ia)=IOM`^AHJBbVGFj#p)5xH2KinM=V#JS zeM24|&uI#|9n5$muln63TP>~}jh^lh+b=7g?yCc*bOWVv${LDxn(;Cz%vdXVS2<^w z07A_?k5=gF;PnERy%Gyx0C0h(@a?a%YBnCkcSD6f&R_MmU)+dEbl#{xwU1%de0?Uf zCqgjme0W#2@q8+nLM)E6>d>H+@60|)-X21NMO;{Hmk8} z-SeaNR!GPa-swOOXUWrg5^b^O%9dF-pjVlob?0GpRG&V50z~*@-qa1ck6aCAwlr`~ z-}i)q2+3dS_fCU1gVTpK#?RR8#}2&FsFd+JyI!E&$^ci^^e1lf^t-%XsD`Ss5h&kQ z6Bq1awL4kJZN?rmORDSmia*Ke!4Y$r&ES{$d6&^4BWctj{CFm?AH6>(@PhaxJfF?u zpwq8HKgDx*V`DA3(scJV3|}UhUmX=O@6sHW(cP}mx~AiiC6An=_S*YHwwBCeg4kYh z?5=|ixCJq1ol==x%z2WuyLBS ze#OP7YP_(qe9nhxsItN=iKrB6xMG^+;pNS&8lR6v+^lEntdktJJJ)pVj()WUI?w5u zSgM@&;K_^F9Dnsh9Sq+tPti$XN7;lhb|55g+Oo{E9iOs7 za_@e>a3dIHKP2~NG1b-+p?cRuZMi-s;n=VBk1i(+%boY8;iCDY@}?{fVgsSIHmzO6 z5>!qH84NHbW#uHhbF&OsY`?a+qJOzak$s<_bw_F%fXvXN_LJRgYS}oRl}_B0jk!WU zuu#n>pG;{&lO47h@)&*?zfx@cc05d%;#u$mq(vWS#q?>%YXV|F)N*@@>-LUV@PN~- z(~|BD{D&E|to4iaV8ATy;XywXc78Mz!J8V?cKWlD?mQ_bo#=(gjsNI8^0&P@BvTA^ zWIlg(tZTB;MSRJ>mI^lP!A=V+?K;dwsfZwIkt;^q{zsM}oWqUH@+e2vO~|Cr9U;7` zdyH00NDqG4_}87fvFtb*b*zXRd>ePJq*muzn+{x12{>=ogUPuhCm`-7&CM$i)}gShlm#O=VVf0P7$yUw%$+VYI|ch6_krc6{efXYt&}d8vDH$ zxY!v!)~E%07{6{9dRPKTO})?l^v9-rmuda`wA_+0>QUp|jw{}(8&#m#Z>f?8YyaAg z&7_7fet}ECb38|RM_{OnX?fw}7V;$>_q{(RLMGt=cMeE3qA#lF8r(4K7bqsy+RX}H z-CN1TA(I9{?_^T=dbK}9)KUy@r+8h2Jy}Z5bSJTw3BTpDm<5CawDEM0moE9@j|5U^ zZ@HN?#eHL4+bMKQ1KfPBj9pH_wLqu{W=Yq2hzLwXf*It3$ozq-Y*jqJWofKrve#am z^#w8si~?(QuN0vpSL9dcdDPDAPhN`2Z0Gr@;G~uUH4h=oiL|P=-A{8}IR&(o`S3Po zZht2@-RW#0;uw0;Ov}v;AKECtBb)~%aHai~UTZ?;7~V4s=FHykw-neZVhf1U^)nHj ze93pX)I0f;_9k~9vD@?yx^sy4H=G19PXc*kHk@6g(;y}79z7UD;kh@#eRv2qx;_B5 zopO-ZJL^Q&;MN<@+tyG7PvW%Pv(2VNkMioil#%qkLlwVjwp-hu2+7%UFBje=(}Ac2Z>~kkM!6;veh0%TfFEzl;@opYxG17)@=)$ z%*~|B@t^nXdkv>~;;P&AAW%JtLi?%`)DGjG&Ti3U6}?VC#0jAj6_5B$55O}$X2RN! z;ls$Tz@l2@ANPvHGS-*&BV*~6vu*-@3}(70rfI7LxUT1xGD`!3|0*jVa>yM4)692S zBx{G4Y*G19xa80ujn!EP^SK-kgRSSsG%eFRExpFBFu&Xp(CL)F-^Qj>Z_^HU`sZN0 zezd($a34err}s=z%3NxV#6m&ZZQcqpI~`l`*CK;VpD70MTccCA(EZWdd^ysp3Ke{BIri%SH8v??Ybog7wwF_zyid?r$o(~F{RMD=^m zmw23(D&=kd_9UoZa3;ko<1&#IIoysgV(Aa>?Ue-!Wf~6y@paahs3(?>&XKqX*S*R1 zijb?gcM!vM{Xm@*SUFK7cvOd>^uCB0ivS4aEWm=z($Z4sT-88cz3@Bv5V4VxAjS1 z-y3kE!3qoB+s%59$4cI@*6y8yRjm4Cru(MPYj(5MlYWs?jiP&Wje%jbe4I6W6d!}~ zPvfk$f?o#7i#LWz{Q73(qh3h=^j>Rx^Ow)uU-ZT%TC{s2eDn!fS{MO3tN}4ik*xQM zrHF2-Dbe6a7XuLSHjvcp_IpMnmj&@SzHZjHiNtl%ZgOQNy~&e9L#1=YhYWZ6Hz7VV zgCl>_#C((8S5FbzAAS?QsQ zgd^1+)mX$7X@06SimaWYaXfJgQ^~ZA89Cr|X8MYIH_g;V1sAg1cc?n6ps6YS_Ulp1 z#X4I4cDwu~lpy{uvX?UP&NXe&+k&C@P$R3N4OorWhfb}9^76FHKM%NpD)c`^^gU?n z|9pe|KmDjEdwF5%U3HDB>c*1BlH8Jtiti8zM{ZsoVxUOO(hvBzjvDc1|W#d$>JVkf4Mo{=?9;hrzH?TELE%n*L zh17%wZuw>D^y&(lC}92o+wOe`jpmD$sxnqU7Bpct_lxi98U8ntI}k_|mc9{^^I+i& zM-;KVc$S97dEIb@=G9b{#XRh|wv41l&3fSmSmsh^{;4B4S|X5l-wL!vqQ_XqmJQBv zu7onj`;InP^k+Is7gJ${o{$T6J3FOoWvl%IREh?BcSJwD8xQec*&^SXR<3#q5gju1 zRzLh{0R*KecJKh)Kwa$x2_?wbl89{jDf^Rh%8};ZSyS_*0Cm$lWA!Z2)2rhIki9n! z;~`^XB+P=iqQV0gr8^qH1DA8H_{OEUwLt?V`S;r-lvn46)!#W3@^mr3 zAAQu9%q7j8jCU*k(noO<%diKEXvqNZ00FISW^YZ?urJZoo`hNB-fUC(#&GmF%kebo zT)H17jBu3ta!vM9@%Z-PKLf~geWJu^qm;HEjht-ua;%PrWqI|ITQ^+v9?u7>d7pTp zw&$zlMQZW^bWqiCcU@f8t(t;B%hRLs3eDrukeE#Lk(A%v$9OrSrN|Gc(&Au)kwlFw8E>Cm>%1TDv#J z1k~L6+~KThtY&b;3lkVkqNZ5CCTi5=KdPjv>)JVbJm-!4@_paPi+|Q_aD}vf|3V<$ znXJL^bcm~u&+~N8NI&L?*B#Ni=C#+FUAJA`T}R!xe^{j(R^*gqzsr}aG#Wd5?6#l8 zTU4`qjHndsHXZ+*U{&YZ{FfZTZjK_=b=?)gphLzEuE!){CSy|IWovVIG0gl+Gh8YK zIZq+sAKMF^+%bW+x|oyPp3_Y~d65(SnIlcaYituKU9h$bc2m<&Cz}auy6*dd8Z01~BuDLf@*eA1nyJ~(rAy3OfofF@X&WCUP6GGB zKs?}$n z*5Q3tlP!+queDC`LVBJc=u*6!)HVmRsrYQ>uL?LL7D-p$2!EDCtUoK9Kv8=Y?~0Rq z1BYTP)mOpyi6zpB)xOauvt(38>8QKRLW~@$rW@aV;^X8h#MwOH1(@J7QCigGUxm->Zk5z$-b z78bk@g%_#48^t_?&>dWB7e|6uX!u^Vns0xm<0&c}ue`K}o?z2nAU;10f(4I&3VDA+ zBE@5QN0(AZS-F)DE?_(lz)P0Z+f}$RG{oJYC)r(9)nvxSdEPN3jNH0(<9R}|Ta#JD zb9pP%PxVV|m>Ku}1~&e+#a`a&#TwF-h-jnK;YNca)D}w>0h!>pHy@S6nhSYnYQZ=I zx^bzVn6LR6>4ud$ueSSsT=qpYq=Vpz(?&Df+=Y{eF$)h_UB-%{EzOl%BA7icIgd3; z=ZlMWWIIMsr(3t&?;CCSRj#e;h5jC`2Arz^i8gf0)tP@8 z0d^$@OY_=^y_GhB+d|zQzwXdY zrj`^+FbfFbNQ5(;j*6hSCl~+$_r8HGMIpr;ZZWeMF6Gjqom>_^q z4jFW>KWejxZ#q1xTPkYU<9D9*p{LusKHD4-j$Ma5hQY zKaC;tlttOUL>BB9H6pqI@d-f9>%Y+iLoamS8+Rg8i7g|`99iN z1l3g5Uw1Gwny+HXYmNdgApa&{p_&GwOvJS-gTs9ru5MgsS>?Xm=_h~EdkZ**#saiG zE;6y&?#AHwjEn5Nu;*Ao?z~+fi^QkmwB`{)7!_7_Lm;PEvo!>Awd4ffU^}Nd#A`8* z?#5jT7cj>yUWYT=OgsjA%9U)j+v9X0aLQUm1SA|#}`=r&f#VzKYGH*E%#Ofmki(bb7E@I2+(n96%`fo zNa3$Hj0N?N$jXqhLdVIRj-}6|JDs^-%3Lm;%fvDu#~$)>(z&OR%ec?QU?u?=S2E&Z z7sZDHj+;P3!tj4gK?^b6c*7SapBka-Km@TAztzf``9T?&4Q+B%zr@GK1JkN#o@xek zu(8!x)4WT`=T$#vyhnkNRl^F;>xS^Sr#uq_`?BfScL=eBTrPnx2aTH~DBMoK>OR|D zPF+6##~U*a2V=g>c_6k$7Bt&p$=U zufL6TNre7+%hq3eX0pL|Sr6@1^j?j{My;xt6#+&OrF!}0*f7si-%nDK?6zm}&%1igSX9lPtod+mIOLl|Mx@r%OcJhVs7ea_ ziU6^8PcA%ZPfTt?Y(f|2$1~!VL@>)1u6{)GtsUVMaWnOS9BrfLJ-n=vIESyv@ROZ-Xnqpksn{}}|MfXyfC&)S$!NPAHmGQySR zD%ETJHF+5=r30653j$fVVS!yw{k!&7x}VF%v%AF%{`YlQ-n@L3Z!#r9l7Wkq@v=t& zeww}l0y_SuD2xDS4fb1yfU@!^3rp`c$h${yHfa><2{^cd{~ttMKb)rR*On!I1@i3Y zQA{S<698u)J6r;$%Ny;<0TABHA`7mK&sxorqvZehGu1zg=$fs1JlCztsySUA4S{r) zROXggjqWASx&!kFxXC|-U(Ey8N088BH|Z4`__p~89+5yK({feuV*04-`xHPG6>w<2 z-NQoOk`uYL%}1anQU$Hf=6M!34#-|w{0Ty6yI1C0Wh)o7>C!@W2frD><)OJXxmKfg zvJH7{w-MkDWD9m+Jg*Rt%;V6=w`hAvC>D&7SN|ERr3JMcHeM(!WVr_MmsAFhMa-Df zcKO`zzgPsX{|^t#LlF(xy>VL8Y4#{5_$^52J^kGz=B$CK6hpSAaG}dL!SVYMXtM(0 z$6ZQD`1L^K<-u~=OB-we1bh#@2^xw$no9F=1fcAwE7;077oS|lv5LOBd{oqRaPaa{ zNF;?C)^7ga@_*2rXplYe+!jdBBT`*bZI6wrc`u2Y-Er6j9I$nyeKIpOeF^6^xkmc( zuzZ-|mT^xkhxf&~mJ~>C*E*=Axm4doIW7&65C{!&WPIFWv3pciJIxbbg%mbP^6X0w z5iWHn{rF#7fE*vYYgc4#Eq_-uz){e~GyYUj5E$X*zDgE(4RB(uTRPxh?+4elC;fvVenY+WOEyW3}l!9ukIui3C%7|Gq%k_X%kNhK%p#g}N{= zKQK~w#HqC^fnP<4vULzG28)7wBf!M`Wh@koQ`JY_sR8=h}z+5DwN z*6$;B+bQ#-201JAO9NCElHHN_H#UZ|G04`KH|;<;BWjN4HJZw5qh0qHV6GS6F_ezW z6Maeia2_|PQFpW~_!On88xgJRj=swxaX-QL4q5%58_mwMjxivw{)cul?z;Miok0m| zBw*n@-HLKrh|zL8Wfeer^bATgT(l)r&AE|d$8u^1Ho6WJ(F9Jw-PFwr`!H-(egIel z>Nm0y&QB{fD-Is}Q51AaLhJW7lid-!DJaCCa6r#p@t}IRyf>C~vTD|8YYU3{8tuC9 z8Q0@}z@F#L~Jwzt29-VtC$@;<)mpQJFH#~?}_6=Hm=P-S>w%4;&}4?5ZV;``I!m*;UN$*8?R`57T+ z)$xp9@XBeGwndSzzR}Jz=}j6;;{;h%77MAh-zQ+CFcz3Z7eKxbflC7Vt;L3un@{ z5NUkb+%)ganwr^w@xgxuvW>pU1cXZ(7K5|){hRr!nt8)}D~=js@n>b`ql|Ity1Meh zE>x-1)LsXJ6HoE`Eub$H*Ane3j}GBg^Rq6)EYzOoyH}4fewY0s^YQL~3`RyLJAV_b zYCD0eCq0vZf87TVBACIaDl{~vslc2BoV)wmlV$DO71;yfAmM*rR#sL+f8O)B5%U@M zyDv8&kuXVi?Xx`nef8LTBQxfE#dSQA8G9s*06qFR4L!)8&TWgn%lqRnP3~;Q*T9k+LdnxlyH>NdD{>!88#n#kxST zWFxSPLu(EF{KCrmy@2l3eqB*)OXxX4+zj@^z?hcpX=Xd6_fVJw700KE;y~8=k0C_gk#n!;%NfTt)QwbpZw#$&814-C)%8X^DrMuh6tuvG-U6y|K3vcx#Ig`!8yfJ5I zXMiBR)zazfU7nNKNt2&*o=`voBa?X2-Abxm+>AdhpZKux*RUC2I$TkPQK!Q;*q#6? zCy~Q)t`~&nfY}h2(qUnJu+A)wciy4-6)wi@w~u2*gF)LigH$l3`^jGkio+uTq>fwX zTNI)$B-$R(sMitr#Mt2Ba;E-$`{m7A|`7j^F}- zIkxJJKm-=<_&o6uLY+5X6P0YDzt8`>#W!qMo`9a+i460K5W%bt$I@Jx9sgx6KVjBX45T7ssdCfW_eFOOBoII z?523{Roqb^{ts%Tz-RyeQKRNSzA%09Hd$RP-!^+-&KL#BodUu;Wo^$9`pMTG1e!ip zkpwXApMeDec@UeImseOh^`UoTtZ>?@4!+5n%b=Au6*{d!Pap!kIxtwkBA4CrJBhx9 zJAaAM`0RwGTgo9+Lf_gi#dH9ctpQtzdjYmI>4_~_iPi-83u}S9^xFZE{%d0}y?tEQ zlPbSUoZRx+T#lO30~09roY0$>woL3tZ28}fO8H-XW)|382@)v)LLg|shg6S^={gax z-qBn9GrfM*`v(jmsTr?sKK@rT?BDB{&!yLv(uEY)zHT$yr57&%^|A0wXNN+bpTK6}gSioqzYpAVew*jsjfww0u}^ zK;GSMd$<;t|0uB#TMwGfo|i$6SJ{uj-L-x^{@AG=mnpQNPIWrP9p9Z_Asf6%s6|x3 zDa@!A>`&EcwPbY#(m`^A_ws2iIQF0_9pO1wNUDh3!tEbJjD)9*nDb*FKOpRvdeSxG zHxaw z&9iVHqx;z}jovWLUX@-~Z5ta%I6xY&r#vxGf20yg|Jp8Bn{%9LgRz+sT2=AM?rHV= zt$SQr^$%ZwV0i+HXHZKdjX zp8{PoJZ^JV(Cil*befQjGA>Dksb@)dseNb$I?q*RYphuJ`QqaW97ZmL`z+s{s43(q zlkG~)XB-l|p0s0y^*uBgy2>PVGmU%|>9jIb9cw~tM8`Ei#Gu_K71k&olcx9Q7M@R+ zuj=c>RHs>;67$ok)wZnFiVX)Q?2F43V^kh3%JM|T7Ru)oR`FXn=+!@&|*q*&=Z!NJV^m?U)H7 zx*L{F%%L(4)zYZSu~?%@GOu%hB9xVt--4%!ZVXIKP0f^60td}%eQtyM!Isu^RQQd+ z55P}hOEi2{x>`3=G6u?w1M=2-MoT*C5nSCHKMIsfI{bS}wp3@zgwl)evRx0HB$?6= zE`F`}<~}CwxmHQf)r80*Ju+#1qk3qnA&$b22Xk9p4p)D!$Ha5zj}@p57rV`RiD4ZW z^s;%JBTlCB+Wd~1wH|3sxZ^~T@;#^0pR;d;j)DQK_1jKntA+gLA@qf9LJ)0q>jxvc z?yG?ut9t>ZKUC}pPj<{Q_BVSIAAcE>D3vy2m<&^5%ybkgyQdP+T`_B`2!sJ!{+8+( zZ^7nh`X#HD(Pt;c;THuDq#g6%uR#sEl41j^HDklR85XUvjysGW*Is8{)7TQ{Fzb6^ zKHo}A$2@-s4SL=qAJ9xXd7ZiI8-CV@ruWQGb^i8#g(y+9?&$pCv8l96)lP~TWBGyv zR#qQQvEkxX*4X#cCHCY3^u*2S*37}zAvrIat}_dj(?-}7sT#eLTO9qSRjV8KC{pc_ zw%CkpdFP|0tXJJZ+9lzH{(I@Feu=MRpM2b4BYUC2DZC{_Gx*a%BL*6~E*vpucxFh1 z54d~IKm6Y62~h5?b=Z`{cIM<@g>*=*a<`iU{OxxLBY=hFWE_IUpOC*l8eadZ8SsG1 zk;z1RcCd2*TJ5n!?HnCO=nrxjb^1cHW6LyqA~RZ~RP(MGGux)a+P`*+Q=si>aUd&V zuSjYc&o?!m%l2AW5MmiXQz>$Di*lj5vaPRP&5`@Blz>&~^|oq1XUUsducV%9%SJrR zQC%J!VWleZ`o>c(*Hg*nW7I{p5sJ6F^?9mSkhEMQ7cYl4ug{QazDs5kd-hTnN1^e7 zj4)$Sch}Tv1@|cYa%c#c=S^Ew@iDUAesRY~2t9f`snd3{Ga8@b6P*U zM~Y>*d(TT4e5K zFlhYO7T~W5f|&nPMBfuh{w|%tX_;D&{}d%>RGzQIUv@*~c?VlkU(T!e%?vjgGRIF@ zN=SwcC5xLn@hVZAqfCpr<)x8zQ)INp14D(8AsM%|D=8R0k`YB`eu^8#fdE@}!9dqf zALEyrm*VP5S+Aa5C2&;I;Frw3j{UK7KT!F707w)ZFCEs3_l_o(csXKp3po$q1}z za)vn4&b;@S^o$m7x&}D>lq8KisL1bdh$-Drwc-lEM2WIM*?t+tet66BfsxM>8f!F3 ztHI~2&Q#MqPOSkIb#MY=-{G5wJRfB8Hn=stfn7}6jtnIP^7==kf89Y&_@ih-uWWzW zXW6Ee);(rjKNT9QmxO$?o)~kbpXpo=RFQJ;Yc1<|ZhZatE<|B)M~n5Y0(O1%33%eC zDI$Isy!>~G_g)Ww{XJ03oN`TZR-V%CE?;-2dJyVG*!O|R0)PJmA|ft2 zEiIjypZduv^_(>>t!W#ZA5V2`p*r+bDsxr$p;|Fa(X}=thzAg#H=^Y<*jv$usWyUt z3jTB-!(tP{MzZfr`X$7yZGYX3eUX!|vgqh1b7sg_D_UCqK}bKMhpBI%>yKhc{oljp zYcxzmYBIAi%)M=JqDv&UlS0)P8^U7cf^HI<^cD%)a+*Vu6h4(*9klI~xa2X!pBGZ_m?Lf5$Dpg|^`td$WvX zSH@1}S6&i&#XT~3ti*GfGuxq&AA3u{su}MyIx|!Laj@Rk*DY*vYKVyDGYsub+owLq!*%F;+5u62X z0E(PG!^P<)X>K2p53*BxkmUOOl{!t#%co*JrO~bWZNiW)|99yVi&_Wh0d$C+3Gn5u zEi`yH%#H~tdQ?t*QbHzsLQ&mD-CNOz>vM|Tr>pI3?eZr@R;{HVDP_(PB?NLL$2fr} z@bHfbvPbh}wsedYd7+4173DF}C^vdbqHISlUECQyW4W?Pyfo*1=+l4?A4p55-=Cwi zKHM7iPXC)=x}W0dB(n3hf6j=x0+Wnuab=NL#EZjg@fc)36^eXnPO6-h^_^OIq(f?Sh=g=^N!RFZX=&+(=l1>i{$9^N`~};%cU@;3=W!e-kA+uh zy7&2l$+FAMtBL-+@ok0H+uuEUEp{-K%8lF~0t%6hBtB1DZx7h_6D%i?{Gp*Igs7|I zMg`yM<(cUvghecF%FA~jIvw`X^8i_2@3OhSoY4KTKc|(tMTobX@SlxZ-9!N!(N>{d z^E}Pl--a%i5pH_Pkh=sx+%epIT&J#-l5oDa6b3jq2f@0V%O-PwgsT4v-NX1Q1w@(k zulOcW+6B@rgx|KaPq9r83}vOn9 z^CR$5DK0ASwGH1s`Q|qhRaSX6DO$DA4iEz z-F^w6JT0B9ii+Il7dk!lW^Fx7Rli)xdvIE&cC!=&NVHodhb>fg85M~<(~;t2Z#?6W8Vr`FSL&zp{Ev%#bi+NG<%)d26YA!_kt z;)cQjp`B{+l2lrnifU0?Cu2s7P6TxrWxErpa^5EXXsk!UGFAGF9pSbA=KvyFj zY%N%pn8Wj7g=L^9%CK~h0_5|PyE7aja=VaJ-yiRQH;igd+{iJL?Q+&52!xA{5E@sW zi+y3m!M+tVgPyy#dy?O3IXMlOY-!8zo*Zo*o*&HS*&X_TV5RO4u?|G3h^}7T6sxOw zz(hKpJMH2=Z;k71Lo^*?uXc;_?xraAXl7?p;YOnvu5r<3W|!g6j%eTi^VdJJerFS_ z+xzbv5RfQF)HBk(hxxA12t6 z)O=dZf7<&gl0v{f@%(7KRLK2zi08%pt2t&*hpm55p?uH9ENE74$q0om}z0 z;Hi_SO>dP=v!D6g1E3G?-*pD*#d0^6j*Xa{^y#w$>QYGckbOn|{4XDJ{EH zp$Ja|G&7Rw=*V{)J=yqe6V4(8iXUg3SPWi+URR|2v7W9<<&iBA?JGU^}F zqLyE8w>=Kz;w)`mZ>XG}C{-WWYv>@Sr#PF}=dWEdVAPwFTSegwjlTf|r7fI`d=6s@ zj%k<4JIRdW^bt!As2Z(<%O2lbgQ&C~^RcL4zj3iFRVLbv0$_4oJLff@;d4a^|25|@ zVN2}x8}(vUSQR#D-8@@E)oPV+keo_`5m&89V|reariys_`V&_ozppwlZv)tAcJ+NzRC?owfq(iFIuBK!3-;P5R@O{z&U>E^ zN+kQ8t#uw&O>KNfkT-7Sn?dRAKpig1mv|e-(ace@VgZj6zEo)Zrnnh3|$g| znksw~x%tq1A1-M{Eh>j+w_M_n6gntVdG-oi=4bMnPL&Pi45TJG{b8Yp4_#f(t;*h| z;h7)G{S$W#9{c$X_^$ql{H_bsZZl%39qe7p3jKMj7vJjD*cEBS^hO2hjK%mx8C|9g z@1NQP#=B*P>gfR6nG-5qc~7LOQ7F~!_m#B_Cui%f{I-IIy}5Bu*f-_LM||N-@gYZa zNW&}d5Go*Xf3rKi`Jj-;{&2N`F&^}C#xF)60M7Khu5s9>>R&ITcq1=|ioHrUK^Qj6 zog!*|ziXIKmcjFd^`ZIp$8%kbt2ZzF!=S#~l)6#R(adF5J@wf(_^Agjq;L6J}et za)uHAKk7iRl=dqyr;j2{l5<;(73nP2jY21!1UmMl3U`GLZ^XCX>ci{U6vsC0XEJ(! zrS-0*>-0l-L{HL(pO*(@&h*~DTHN9$Zuy5lib%blKVh05kO z!dE_dskri{UcEn*@g7|DL)25zGpfE-q|9QAeW|zNv$kJ$p_+%!g`T(9{#iUuoErEF zNb|_ib5zMMr?q(8Q}o^gua2fqA9z@eZu=XUq$|9%(%*Imedy<3dn^XFEq-FxgjxF= zW^Lsz+pEStvz*vkdd8yLMt6s_p0$bGt2jv{CDvvfA|*V1OdxDw zvJHA^2U4tGr`LS#uLr!#dsh55FQ9s2N=SVIzAE^bG9N!d4cMXca^s!%UtdemOo>5u zO%XEBJ!0Ct1ZkS+B24LX*5XUi%+B=`oP1?+iJ@-FuVzsO;2ZfNfsGq)IDsL_Yt$(&@J22Hsck+M)#4;v=ush2NOCYDRaYcVT(b&@hmKN={}b#Qc*+i%sPsZ^^q zvebQ0KWkwFjSuFK!(eGF2q2GQj%aH4-M0i}i3Dd6E z>iO@OiHxq2dpc#@qLJVS{ia=EGX@B*beLFhJHCk?;~MIP!f1(-Is2;{ZIKR5pO)JN?v6F|4pv*JP-S|;jCvqLGw?=7bXv0yOq$aqqUB#{>G-@`h4xZ><2iS#G1p z#oi~I@Ea5L=$axylPhUBN!!~9 z`S%La4}xOzk0H~|IjxDg*!OeU^*kuXuHBBxC(WDGoPSk-g%UGNShcJd*&@XV*&5AF ztE!lSES$?GN1F);G-t&6fP4BszkotR*i8nn&Nae{V2kw!MlMt~*TFU91)&YihR`_u z;H86^v$RY;KAH25|KB$BuJFUxAEu)X%EQ51%!!`&6h6}v3p2^KCHeV;Jy!SihGEP# zGlpR{eby@ZsxB@BTg4GpfN-*d7occn8dBD#v@ALe;FZDjnXojF2uQN)7;LK;@tXm#Kgc^6Ph8*jNnqsDcu7G1T5Qe5XkNoXe%rH8r5zIcWoQ3s`psc0Mngi5 zHY%Ug)MAF2fp6ZgJxh+0&-KskpEQMRWwp2`v8Is^$CY-ZKxl+#O_B0{IMG>G5B&Qp z=7$I8a(Yi{V^I!Q-1m^3u?@nqx_O}smhB+DzB)tVPEIrtt(ZO8?g{cbMTRRJ{Q@1-UK7_N`PO|Ad-C7G*f#T1Ds4owRnzzP+1lPCnI_jY&>XjQIH>kuQU- zRo(PAojBW2JVaUttv{@{bxNQr%jiksUg+B>fjq&&5ps==-50AnFm9S&IMT5W;?tc{|;v+(Necn80}3kbVpD-UQ4XBntlFus@BdfSoF>pVu;qpW6` zJn!}vQPb#ms=wOs49^T1M&!_SBWiAybg)e_B*mHQ+%{*mKr{FZ6xx`u^Si5l{A1rv z@}Km-Fltl1#{=3$GGJnp^q11*s>$vI1F2Q0NPL1(>X!~es2LGk@`n2&Nj>lM6#Bpp ztQYH#Ini0FjN=Sln+7B_v;?boqq<5-eQ6PJ^4-Ra7NA&FQPKHv5n=Fu$9mS9{AMu}etsi66d(Qd=vl)NChwt>PzI55SDcst)o zZB`sutYw@|R7`oj%AIu1g}`RsXmoRr2W&SQSJ9>=jS1M86xz>XRWeOC+GKZ0bRd5Y z#2?hmHEunsJ(HbUuc6wsA{ozeh{3FQQnC8klkRZ^8iU@#Zatrn2MhYLI4V)_2a_5t zOMi9%ha+u-*E%)DRWECsSL!3Abh$-ku2RZM^B2!w_p;8PMC$OJwH}Km+&cYx6@vNZS_PAs92jaf?9Tn3& z4e8C;xuKo_=cps+t&}qCRQ%WmIW4ybe2sl#ah4!ks5%sCSDO%XU4L8?TfrB!D36bdf=><(oRf*FQ)7^N;S|W83wyt5na%3 zZKQ%4#lFm^5EW+UK@1g5F`ZQkW6taE8$8ml-h7)$?2gcl9^M{SoUeh~+W6I3CIJ<#_l(Y5&khiN_#Z-X?<$URNeQA89dC!=)Re7)Hr zx`T@MjkJ?8*o59>ZlHKKR3cWc-8b=f7TM7(K^!3~#6#jKZHafDB5lVM7or~@qgAo> zJ%@)D#3-?MhMfjn;3;6X`HRWVedDbwSc4b5jF!WtQf`U93MrIQ;VO52L#as|sVUkA z@$89smufPVBRvpRLzmcWq;6!ZA$L`jxO#4An?J;-ju;C^e!Y$zyQ^0Y3`%s~h`E== zXi@v{=_eJNaj*FoNSq?0@uo(kW`QUs)4QX>(cF$fQiHZAUGIyXAC{c{H?^TykXN`glnshf(Cu@zTbDe-46Hm;)7l{MGI4zqAeHZsa&JrfbDCC-K6L z@psAKt(&n^=~i?F(8yp*aRrP7V3LI>Z-)oQ6W+t-nrSyei+_wrB?o=$>LZpje`hRu zSNUPeexLNLV$AxU_{a%7k~j?8|%Yaq)Hn*jld_45)a47(^mU}?HCnz*{PEgHzLfgtH2~= zm_`>MuohR+@r86RUjmyV?&ONwfY}?--p|NeucKQ~LKZ(+Aq0M%p zjfVY!>o)m$?W!g(h`5f0M@!4?<^RP4d?2VEf2!IlUC1jbBDHx>>RX5U>-82*5wT9A zznz6af3h9aFfd~29;&Pji-KSvexnBClCqWqtYhMA+Xo~{dxD-1*C7UQ0ts^$Dq)|L6`$Y3vrIX|9w>bD-#DXZ_kU;0_j1m58V9x zal&c0%^8b>*aV4u=_P7D~)KEL3t6mAA8KNv}n!->0UGwjoMC^fX z&l}m@b#vLt@>GVT^(&LYKPZ`ca6XyLRibgluw|{>cIel;_j9)(Oaat$7c4)XP7>>* zk#NZyVv|L4NvJrB4M+;Esa@L@tS7~PJWbMcA3n=Y?y>oOoK?_!2bKR&cTZuK;Vy5} zquF{Kd28h3f+~jHTkL%{a+|fC4jZn!ES+9h%8}u2Jx+FZIYYEAyZc8!0tOe$_LqTx z>T_%?kHWJXAT#@>Zvd9=QV6Pd;aeX=?$mAAk0#fYL?6hixOF4_EN=)PIdW zvUMefM7*fh0O|UsOF6&Y?ppdY51GNE&oA!(x_9YBh~@x52*d#c%u?H(199s3O}yQ| z&_VW94x?KI*s&(7)B>+!9c|GZPwPNGZgQ=YzC7(=tm)ciN4P@M6?Mn-R-dEvhy)Ex zV_Z%)`U(9yC9ONVn{5haBb!T*h>@+Py8|bdbXZVcl7^4m-A*G#!*073E8Mr&<6_Zu zIdSnEvv@w=Xsi4g*%dGYq3|6lH`8{#KD2A}_{H})>Ta_9`~LZ#IU|1q>V>P0r#K{K zL+_&xrW+3d%s5w>QE4+&tHgb4t+w9rk;DAM*4=~GpQLA#w{4G~TDeX@zS!zCM8WOE z;!gbkWfvXUZ3u7H)D)8B!Dp>AzjeWRcCaG|JIab)&we=DEji^O>#L<&EC*>QS_s(fPyGs{a55Q>2ZqaAg z(vis81pYJD$(;kwTn`{ zIoYzhuPCy;qBv}V${g11%jW?*1{;Wjz{!GkQ>_$N7q!CPAfMOte0+Zg&6I`-{!8K? z$2XkCk^@~9^-7z!kAbCTtH?sTX6eQou~M0k)fJx&GU3Do+%Fsh?}2?zeraGr2bdUm zEH=sW>DqOwjJ8vKiS7|q{ib6^^-LJ4?voe#j&JD~-s-(<>w+Y&zudWP`t%!3o!N zOtN=$Aza5iT%x@4h^w2eTtCv}bEb!>8#}M-jUIXmm*eGHZJrm398Yx>}nz^n?@z+bZQ;HasfscCA=3CPQ$|cw}-yhy6dc^ zT0R40+<@;~WDl9^ZF?6M>tzSx@wBSDN7w(u0?3?~EVd|W9t_-s{wf%(WS=PToLnwP z&RI4tYkL(~#!h6g0t<>Snl4c?rl|Cz;hRHqTU)-ZI44%Y-7ytbNI@O{$OxQbTbmN7 zp(TkpbQ%N?mm4!&8A}RW<;BI?=1Uvz3WRle?-P!2Z8pD322wAUEml%(KHm+-tYStJ zF^M^&I=Hs!h@;3h!clO#(``RvD6cxIAIa9yqy5+r-V%PeN)$M-jK}Vw`0zEl6^2$t zYjeck(@{CM30uBx#8U7?>glvzXS`bAJ@BtRpZ9L{Yp7kk+q%iPY~27M4;yb*L4)B}&cvAWw1$+288PR54KPfe|@ z6EpoOc>5Zf2=;KYtomxF>D-Z~H(x#;Vx%x`ry=3^611-Hd(kY&RVjz@ci^A4QK&XZMXfFLxUjVmBQgc>~bpsaiFD-zXJUf5GTe9q zfagC+E1px*obaK#aOh9Swdf|EuT`)RDt>(X_OCdFIXqVW4)!%Ht{Nlr8$$*D#d9u{ z%TMhx22qFR%~Y%ilq~;=lqFpHe(A>r@7Yh4O;%0&6&E7eB(|>Mp{2$Hr%g;?(tk(G zzBL5bY2EZKZ7sXcG)S>&f~u&*nwIG;yZ9t=Nr9GsXuX02?4lgbfl2k|LXzga-~Hq2 zC>bO(SJZOZ;U8h*yDFJw-8)K^NzEEVjZk2=MatzprONC(((vgt5E+^QU0(7AhM3j_QvH0&cg%^zaGFKV9h;qKlAAx(4)Ucc^z@ zP2!QKcS#|-Q=VN(-%s+^8eDyPhSPZ0(3<8r!FVBjB_iIOEJT}mJ1y)3I5m6B&L$iP zSeotQUMK2YEE%Mv{X;nND|1VL__>Np@47qZJs!b5?{+G*<3QoktCVKN@3sf`TqunK zoV_+Kgndi3g|fZX%9UL}1$OZ9W~*A<-3WNzGGEC(iNw)S0!69Ly!*M7*(+im>mMs5 zX|AYz7f^!l(f(F@?`RO|Vt$Pi;0xOGj_i`<`s$+)@OW<9w-WAg)nICRzDF)|XBsM{ zK1tUy+Wa9M_!pqkr|#x~sFxaOSU^*5TygS?s^dnwm2P1E`S^p=?x-L!u{QE?{IdiS z&yq6*=Ah*_ifHbHQHt?=ZM$tfVN}i>(cp%{qU$N9*5V_#zMm>Kc`8wSF3W=Fo@hZ+*)7OK@7zMrtEx+*R$Li4>zMX@80d&HSTgTpB(uLw$xbc zUxo<3B<4{~=Pv$Ee}I5=Da$0V-pzaaj=$TP%1Lo}=R9zI^&7%`+{Im-ap-frM0rDc ze6joR-NM*tn5X^Rlm&0_c>iMYKE+7BbvMdQX_GksFhV;~kQ*)!RDpH=R1^AOGjY-ZBYchhGt-3SQHN9LuzX|z_< zOx3fS?3uh&(Y|BAL&;in*UtJ3{Ij8r(k3fXT}C8<2__uRC4G0{z8E#N&>^;L$j59M-Q%%Az-N8xkdqM;JGx8do0INGZ4 z5E4r-Rz<<~aBlUGYoW}&>=296v+MmE*d2(#+T!bXo96#ua2x`U=V&AgTl~0Qr6TjuYm5ET`T@7a5{ z&;xMmu?+%JFeWQA+T4;TV<-dqf z>)?YR9R+M4oGM}&EN?UK_)U^eUNHY{*$s^3acr72x&+qFe{g(V_9PWVgpi;58n+Vj zqUmqb#+n;O6|O8MhkmsG%UkLGuSWiI8lKcuNZ})4_Ws)9OOh(@(|QSt?-F~UP2@}s z5Zht52mQd*SfTYk8~-Nif9L9yc_T>j#}nQwgXq;~cOHe(M!0fck$|cdLT&a4#|0FS7mwDFU_O-51NcmQV3xGk$3WW;7+=yPED&(Aj2M^>O33#spZ+= z>vl9W+K=jXl&Ahqy8}XOj|rl#Kn6FokKRB1N~YOmDLBPiJ6}<>G&U9^U#lz{eAIk7 zP&rm)eF9Jbu1u_TJ(a>+0-&Wdu)R_0gwpuzy0*f zY40NHA!<2g{gRCt`uqgORuR^6=f-{iVHnc27+9x_LTb*>WPj{yV^=8XdwcN@83YRO zYm3xJ(YXQUmbRMnnac?3Iz0{ISqqV&cLJe|8MwgxQ+dN*fiDLm3 z%Re6D&(X3m*!;A!wzbF&P?Wg(4{4N4ka}k(qCgLok#X|&{$aZia$~yBp7~d?MU?1Q z|4VoIM`%nqfU3jK@%@7l&y6Ayv3`{>W!34{u30G_TQ;Sr{F9C7|6WPro!Kv0dQl@4 zBX4i-g9F${GRGv$;%NSV=;g*EKou+kr4DlbPA#!{lg;U_nAnV`ewRF1NTRMR`e)74 zH1ZNCPyV5ADI7y0hC8U8>juukX?vKD_5~=zTgat-f|eXGW(7vh|IBv?F!MT(La0ue z^sN@BF$=%@?1vJ#037EIkp6L3s}Fslu|!C~Wm`W|%V~XjpmV${D@CsJJwV99{O54Ol-8>h&~o!b0{0sG z5?FCjHH?E}1*m_j^+yHzBfdWliXpZTy(R>n5KzS(ORiy?Zv%NQb791`n%!*3(p=K_;!p_ldGeBg2Rid?5MU_(Cn%x>VT3W!sNS)AK$5#Z!u_oJ749Gm*w>AlH&P{KAc6j)=fHAskACID}Rd#W(1!2bTB{ z>||^_8#bg^ef9_~9`oNhYSRxVaKz3IfAPbu!;=`CG2*9Kh^r?tv#|LokYW0H$S76dXe`1Kovk!u$Hk( zZaf$Fxzd+>BrfD1v=>N``U3h{!WJOWJ`1b!AHx8Cq#8sYQx)6ew#0dM#+MZ}*R)w$ zd2ElFoJABWPiiLfIscJl+Xl9crt?Q34#(XP$=tOZg=uVN=>K<1;0-ZR4K+qK!{p6} z*K5s!4Q3|=u?-CyVY`H~mnQAu+m&O?#S1PcChA3*4X+y;rjrKKCO2$N^W}veKPBu@ z2qox!3{wA>KuG_e%iEJ8NE;jZV2-`D3hD>T3CKE!?54zqkSbok1@sCHpA@LyCZ4x7aaY<7qw4)|}09$`u=CxQ_m+%qm)uXUy@fZKBH8QQu!+4{%@CU#2$=McP&h(fN`t`Sw z>3xG5kgtRq7ZwUdO$N~4`3vrRY(|4zOn#e9Efagh!ra@ejZJ#?D&i~x=L{$GI+xt9 z>5qqJM3QM50B;eVSpHIrkZi&0Pa->C3%(qOM3^ByM&($e10f~Gzb8e#r6A7aI`^fK0IfWj+6OvX*A9X+I|c>Pg8E`Y18Ld6CJE}>92j7k8MV6x>p zT!P-g=+9Z&yjd#6L8+n>Ad2nK<6_-e?bHc%0dh_R#;ZA|&erix_jPgL$sg0`^Jas{ zS9VYnXGU<5=TU{GuV^p_e_*L9zzk>k0q+J11zTLF@#|M3E@ z5?g8N!02ewU*8gOPrE?Q)0puOd>Og4OGKMXetz2_xZ(|~UnupOC^SESu^1`+W^=53 zHU{V~sw8!P9cyg!tgkfWYj2Yrgj2dDR#uT@bbGz)bBQ!e$;Qw)(Ou=;HT?nGGKDvJ zChV2+5nyEEODT3ZCcdb#ULI)1x{=Wnu-@Atmi)6c(D#CdrcrFef~6u58d{X=``o^Z z$`PcYL|PG^W?-wa?o_h+{GsmGBeedQChY}7;teH2)le!O-s%GT?a&J4(mi!+K0Ny2 zRr$8Qd;EU?Os%F1=DDLk4DE~&>O6#XFyLQ|q`?4p9Z8QSqYj5su~D~n>f>A1qTQ>Z zlAVjlQ^LBdwy9j-2X~ePi-e1WI^RIG0S7`l**d!dAHwjE+`G!3zxwWZf}PCanb_s| z%($47Nc=S=@C~nlgB7Qn9X)vS1&y=T``W-R_J>|tfv$-%>t@F|nu`#ZGtL>xFfShl zrB1LL-uXWbXXpE{QN2H}`2uZC)a|FvmMqv~V-Mqf8dc~2s+K0o6dk`J=kVMxXj{q< zG5jgXc8D0s1CqOhAv$s*5oHl`-L|Epb&au{$_vRiPJ$qhMOh2cVcCVU$pfxDU$v*x z4scL63|R}L;kE!ZF5L~2+>|jB&FHg9YE;mvfKiQQyaAH26US2P^sllEQ?uCWB}Lf6E#Zy{7yEvQ zCF8{D4zCiQV7}dQ;fN4{?~V=5Nl(4x<_Gw$yNe3?1+^IhWS?tX6Vsgt142JA)gLum zbkYiew6fc|qqv{g?4ulD7dCKcrU7rid%YoUv{^#APolZv*z0<)u2{mM)sY_orAld}0171% z%;)g2M(F~kTxS!XxQC_!$O#2(OADnORbp_f@VhCk}f{x$zi~nuNLhAvA7V0{9CcUQ&_H;&RH5*olsvp2C@xYk?hZ^l!{R{X4 z@`E!4CC7FK&I3dAIpi1i=P;A>TXw6}9}R}H^W!d{BVn7L@P&!ex|}RVoM5{Gn$Gn# z-_5_THy3sacOtrqhvgkmGBz(%1GAa6K+4Wea3j~xgSlD6l`yl$P%-*55E4?uIF2E6 zF|c}_%^kS+6yOp%loxV|L}fUg%CEBPftTRe~!jJHoVEBYxrSplJA$BBTpQz+woD1p)pwW8g# z!kMx7AIMT?Xvj=Du7Ep=X!z`N6YJ}udy1JuZtPo z=N$jWllQ7*trKVKz4ug{RMI#YlsaM_T*wwceAa)yoa*F|GP9n~#iO+5`~(jP-~#N^W=+{R|?Ihcz$4$Nz?by zQF_TeZW^~+YjANAy*}WBFiu$TguSQ&P8hz!ppD!MWuLId*w%1pbUfHm&gb?NJZlie zHyTjPV6Tl0u&Mons&E0_X*EO4w&Y;+^79E-P{@uuw7w9AVk>ez<65}u*Sg25z?0X7 zGB9YP`6<)TKMK>@i9Z_smOu(pjYhdqsaw*oyvTm`GBjZ$Nd^cb!+d zfH%7CkgKdsR9>~9$^^COR#`}FULC>+{nAvRbaee|k0K2c=TsV5`257a-BBZ$M3SNZ z?-LGi)`-2RvN4!_zX?AYIM3gu2@zo$_yuNH>jj{D48^~C9{}a)bsw4B9p^tXrGkW7wJh~>d5Kqqf8|~H+Z|a*ZmKRavbjsL2Tv5Qa#-R6nG_avS za|}LXD!!|<_^2(-{j_`VBZ5&^TwBTkF^p@8+|KQk8)kugc^bhg(>X?s*({ihI+wjD z49_wOhDZ9xv}hZjbgYv1*gS`ZgD0h~4$U+2pOwz2b%7yJkf#^*$yl*AWf1vfS37L( z0w36-iI*a8LYJQ(-jTv)&?ODee9Q0@2Smt%Gl1nw53X&l883?)Zd(bcU@!Sv-pg#H zBt{#i{psG^1F3|(#k@VktnXiW^Bl0Sa)0T07qUx)U&r2H3$@+ux1r2hBdGrFu|XGl z6K^EZ7xM9+1zwlPOJELt6Te~I)wM4H?1{Z&8dSpxtCP!T(|!%v)swno!do>phu83j z66Bam!jnp?mi%6q*Aa{ViA!mE0=9|eQU&iucFXBVMTk2$NY9QmnwNZJ%}o%`OA-)I zd6!52C2l}<7chdZ&2T%LDo}O7f+q#H#ku+@UvF=s%*nYa6^&_13`~r^d4|g)0;0X+ z;>$?8_5g0*RO(_>rUCBk>JtK-Fa}GW@0!XH3^cyPVN?tnV!G*yxT%#z759yf*OOAm z7l0X2Xk4nek4A|4=QBeY*m|k%thA#UTMr&7?f!RNOf2a~uj+!xhRNqF+0@>ieD3MR zp>in41l)`=C3}^Bt)3rh^Sxo*i7(Ml5>o1R(;{$UcDS2r=ll*;fpOf0O5w*acJ=ZLwDh@d18kI^ZZ&M=#;(%gOAjJe=Mih2}k&mkF9I6SX~6jE5gpB7X82}2!x zFbP&T*Ft)_c+M{*XgzcZjJxg)A(&xN^4Xnzc#GrNg8KnGN=bp3;!Cwwz@lO=EZy(t zKlly0aA=$pl-NZ%z-;}eV`ZsRdn*BA`0tb?#lAxbuRt33GN@zrl}{|NN*dn?pr6dB z8trBNqS+=&Q=AES9<}B@(Fk65hhqMO-7^7uLbJ<$e_T!pwF&?Dxvom!xiY}Lr>x~H z>+E&}Ljq_%b*vVs#BGq~XtzXEPka?tOooJo)fK%k0hiCt*XTqrgmCX*BC$a+sauw7;18s20A4$U!+ zwmL<5zlf&qvrGV3vIJ731pZLv>MyPZ6mOzS7#^MVn?w|v#OYrCx}5~W%8L%P5pNql z0R~ucEVD1*T+iMcF||#i2?*8=cb>(=p{SFEisO6JzZ}`7W-O+ zO0K>ECLZ{_yaRaUPa+ldsLuTLsxmY3!DOWj4IW+AChZfT1B3o0wdH4AD+jQJJQ3|? z%xiqK%~)Josv<;3mSq+sqJc=*R& z^!MmK@6=x-NAP7jl(9Rf%Or)AKJ0>ADxABhj?Z%(I|*WfVxVn?gkQI1T7KOAsle|( z0{Hx&T%{%O6~H}Pbqxf#CWr3O7MU6quATTfdE+ytdqh_UP$CD5s*}Tku3;Exf60A?)?4pDf1iFsaQ=}V976v zHa*~m2=T|7Ynmp-&t!js`Gb|32km+kPwnjcgfGzbiGkapR9|7Top^}VdbT`6d=STZ zcXoiu3;10AkVSC<44CY<(gHUJ- z1nCz4o;K`D7x*~2R_w|F+Ui3~VGM|iyW}dUn|iwi`Z0FZ6zin;Y`V`5e6+ID!Z4-#PxB|+0IEjwCA@SMS<;Ri`kS6jT zDWKB`F&myy=WtcH@qiv*JGF+^{odeY2@&P6;p>cTHuH%+>CyZ@7%_@kA#> z$8*Ahl{7x9+%!>sf3p8w3-^SFWzG1T1d(bQOU{kHNdS1QF&z9Pb3LR`VZ%^38BbmD z{r3!$YYOedNtc{!BvaRN)3>|EF3jEbym|0lS(uK-x~MA8-i(7N$xy` zus4|4Z^odk6b|OBU-~@CEF2q@1zh+#0>2%E- zoyEd91Y3tclb9@y6KNHRBT4MI>nD%>;p4Oeb6l(1vs@q$V`xcQB{&iALi78a#r@UN zm=Yr~>*D6wn`>BDi2*`e2DO{WtAFMIw3sPp-^zPSj2X$Z*7uqnHA3E-Ce_?wHp{k+ z0^iA(K19=&mT;CiRLL2XA^JTMwvLV_nE*&<*g0oyvI8xqny_p*4I3J+U<- zaaY9Rfhr2ObA{1c733x!+s9B1DD>M#wkttFC*aweO*3Ve<_b4jeVX^ps7^-%#(Yzy zxFK{!I%8t!AB+p)WN{oC?1?gX9L6G}NC$+&MF9r3ojU>==;H_m=Z&X4#>CBGVAJ~Z zhVm}70)*HaZm_ao7+ogd!4Vn?$nUX| zpGi(rvsD^C-Q>rJAo+}K5`F)%Und0NP2I?1Tr|saXsYeDV%T7ZY*zmr{lQIo)+$ua z)UH`4hv8D!hEd=6r+dN2d^2dx)~EvEaodV*u2*)Q%_GI4^#<8^icmPgvMBO%0RB&d z*%wZq4r(x^#UJDEgc9gPg;NekJJD ztj&@fBe*JnnchUk2s}DtQva)uKc{~Nl2ii5PVcQ=fird??3=0!$;KhH9U7qwa*U>- zvPoo+TxKVKNzC$rhB_wn*qINW^MT~X{UWJ`yKFucO5Js{GKIC9pF>`;ILI}x%pRIb z|NN%7+$rH^ovqBc^O>gut@*ZHl{QS&nIFyX;}FOIft1wj$eID_u99HU7t!Sl1UB{S z#l}ic*ap<*6GjZ&qMra#JCV_tU?1Gkz|y={g}Xmv1ia121t^e~wWQ{Ka*p;ULEK6U zrBvzw8R!Ll(reMpV?Tle#r6j#D0omgb&T;-3mXT~iHke2!+6KuyDSZjONH| zva%D%J8)wZzuD~tnQ0B@x3z(6s3{;wvZ}{9AK{a18R|vbv#xFAnMLPiV~Eg3d)rf; zl)aV%+Kq^sv_RT9`#`)HoroCn@{;Qo2q6Z8#yZF}Iw~D11k0}T!0)~WN7Bxc^9m>0@TfRILi_0hVtX9z8pH|Zg4NeKf5JaMYXCpY@R{f`S% z+&<{3<Z*?7rk%0y&-P$V8_0qHe{ZC(BOnd{zR| zyF+>r(T>Ft(1K5d(W^1Jq(L{A=x&W>jNfCB8T$+(f6>uY(Gg_F&=&;3AWbFg1duTG z%fVg;ry7Kb#ztSIm%v%5sOPFo1vhOlAS&qx+`hv4JR`E!|4@WaPJRu~8GNhEh?F-w zc(Uy*ox$x;qH5TUF%5qK%JKSe&!`I>dUm1x9HzYk>n54)V_doXBhk-+su3eV;8O?j z(Cs4PYY;)a9AL*(whk-N7HIUmhb?CtS=t9ZuZ;Y5)Y)e9)I=!96o7fHPNlE%16QOB zv|4WgH%{o+IZ)c!prHY(*j`xoKPXo0kq_*AQJrKZ205Gbr2FdaJTTl7GsGtUp`&HA ztBwzAP!{h!IQ|IK0ol4&MCStzu{wY%>LaICnRySkn z>M%s6aENmV%8h@o(?vCK*WdJopR}AO$-%#yE6t%BLQ7o@_k%#!Yv*an9L&hn%pGff zx&@#1CCPPA1>u?o+;2s^L9%!dz_d}k|!bqmC~_w(F2ZdwZCqe+Jq`9F${M&1^5 zI=6@7N=nXJ!0~^F(iVPmi%*0Qn*1=v#kdxPeyg&!`5GNO1Wa^IWJ{tr*Peq~OgfxF zRQ);)RNL+wMTP_Rry!y;X|^?`#oBLH66xx#{hIjx$xqQ3xPY=IEhLdZCxyy|z>#rC zQ98o~^8yq#P?4od{5hZvKOONX=?Fm$P(@Ty#JO0B2{bSiIB}GvEd5Iyo zi-BwFvl|`4Y%$#JKhE56J$iPx9utkbIvSb1bL}kTPbshx+b0Ime|}Z}5|ieR9$1-_ zP)&?o2*owb!35PlZS9KUKTeeVd%MS?T@<3IMTJrv4<44=wq!rfOxoen{|xhW_Hg~T zoS9sn%m7A}mwS1{!t!V@LZdUI*chJqYQp~Ve)b-=ezJbBM}ujIJ?`zpZgXhE8>9T% zh51O$;-^6b^5n^h*Ly;sj_qPeKFJYlXukF}?Nyo8k#}6ubNAYyorS+Yh(c}#eNGZ& z&6WALos5BH|I@hO8&;QsS5$Pe(etswl%B;=9D^4w8 z>aJ?xOV0df$TKiu`Uu4WxTdf7h6lIA0b*A{%JjbfG*F7aas2eNzKj1LP!#78{;AB1 zVa}LW51AXs4zZ7Az4ZwTdF@(z(}~iY@=aUQpjYzD97(Ja-*Jw%PmN|Z_u)pCJMqPr zy_Ny!Ps72a0Z@)PWXY5?2!dLDNYCD2{_4?FZ4nQYnKIPmh&px{BXRSsD zOi9`Y3EZ!->l21JO_Xvyx8tT+n|V^6-ZuG$oZ47apKfm!WB=E0jvDMt;`02!LE;u% z**ns^ha=G{)zreT>3QA_yZ2=c=s1h${h0ERbbH!uC09R^H5~d~@+1tB$@h6X+sq_q zTl5$`sT+(Dp^vXzuq`|_Hok+|nT>PBw*HuSdAahK=}WqpEf(BH+dN^nvtAL~c!kmq zqrE?a$5;5QwfoZILK5|XeA$BTDK?yEt*oGwS~iT z9;a+zD#<}70>jFT1NS+lxE2qaT{KfjUf7Sq9BrY;UW#$w=Okk6YjnCaM}K7OYQ?h{ zWkK@^-Nw>83x6FCOxOpX?ro_By?o?&6-LrXaDxtqV8}Yz9p+Myx4*2PJ2KH(za>O3 z8^=HfXF7}`jy~mNRFPf;oSEED-U+Zq=B;{|qLyc!wL(9;7V%CV| z!g_;etgU&#`42zPpKT9a{jB(>$+PJn)ZAu#$n$J&x#aUI>x9i;WwJrK^Muv7 znH{J9YHTRlqRymyIrwnBYP1YajdyNm3Yb6h#Q}R*UR)k&qNx0OCX)urh+zTcu~i3 zA9>VD9QN&n)`rX!`Db!e^K%(_Gf7*m=Do>2UFYYZV_XV+(1Fjf&||t|=TRq!$fLt! zygH^&y%VUiS&;3*{Vcbqs!-+fwJ<#JrlU6P9LiO4@xE^J4mqo?mCCAb+D_iS`%Sa$ zn-QQ`mI$Dqko$0~U3LK~v>FaV_Mr8jA6s8Fq^0bf53~DM5OCsWx>Ip&T}e4P*ty|= zd|O0t?16uXW+l=g>}}UeeDuyrc<#SF-15G^PmX%=80qlX>X04bpX%i=qL2qjEtz4h zRJV*$dHY^Ogm-;DbC!Wu+(oqWk>CEsMVaYEfag1FcRCmRa#ci}n0Q}@&H)MnBmnlQ zLzO4P?bo7^tT6nSVr-eJy0_k&utBpJV(mFU{ze6;bm789YWQUq&JG@Ro8LL49vE}N z_3EqCYpsECV|R2H7bDWz6KK^-y1(z4jDGKVwDV19msI7k(=Xk+=!Ub{+z4(G;vE5g z))t{M3#+K|=bM&{NkK5|>aLc6?Z>z~Z_OLx^u6kLs=(X6Y3xyEYLn3A?VndDm8uQ4 zrZ2rJ5}aG-IEov+QVjQR@3N{6ii2&!n~M}U&aZC|xmj_Ur0Cqj>2x3?wRZlAKoEFI z&#TVsUchJj&Vi9z$Sc$hD&9#d$_d%Z6WdcfBtAH>Cr$ejBM7$#@7gb47{@jsb6bKJ zzD|7IZbB{%Z$`EEJpARzZ@nu=fb(0-u7BLC?^RoD#jXS?9DrFF$lK5%kx{y@qziERFejEM`@ts$YWk+70Q<^(_*EnydRore zqE&k${I2}l?7`<6Cclyar1L*rfQ@-azCH)3L5kYd9M)~F7`YaW2ryb=6sN+dASW8b zPEJ`&WH28n)`ul9!6tv%H&&N)j8>jf@|O0Nf$!Fb^GFS7ixEWbZM;7VB%QLM)4oTM zZnnS??6#Lt`dG;*3&0m9eyxteZfi8Z9)%Ar@oBqIYgzS6uAZceP!iV{-URE6#}~H- zWLoi|HE?=l;E?%{YjvKj@}rO*_)H2Q#tNqc z&G*zW&ZkVujlrKmwuS2Uwfc^z(cYh(O2IYDEpccKrtYyJ9B*S@a$%xf#tE2l&WUW|oo@T(Nq$MCjJjxx-i z+&%=<2gcm!s=rJRA4K5!92Y(2#wzZut@F|04zV>6GN|L}@teZ0QB6-wI?#+u{>%>fSKoG2|6$itQJ6C&(Rb=k)EYMUTFNO#-sZ z!sVbS$+R0W0*Oc!g(ctFnRO0pYUrO^5dh+R>d`RGoLx$Rb)&1Opf|7?hnd`5fEMjg5qNH-MS?f&S)+dy>lnJqZZJ3N@SYO4Qt z)W@hG20$5>NSekcl~0c}8(f?%t+CMOHE91O2K{U&f?z_=`0whIuz7quOWpQFg^Z|_ zwg*m~w!_IzWW|jHQmNXYwy!;-6r)N~C%gfw-6t*ralr&dgb>_cj2?DPtK2NnGCh7t zyaY>d>Nw-Kyb&+~< za{~YLPpz9k&7c;eu3@v`UDudH)qE^q1lW=16%6dsl4M-9|8plE!e$QH@@)e@U@ib9 zbO^{iZQOb==!#CDT(U_JQ9pqF=JtnCErG?o+(TlJ_<(|N51aJpNTr$)&B$!-O1aP7 zdm!+bnSYmW>Quo|3#3pYo(q_}Z8-=YaSYFeONAu?D?6Lpk&Ad$3{s(6GCZ8(knoVir47&&?C`Ce5^Al2GH$7jsQ zM~#T{)Z7#7?OHfsA%r(gA<1IGIet4nhwd?YR)@Zhg-Z-k{>0H}cdHMCk{bpcMmWc% zgJZ^49&IDNVr|m62xyt4x4Z-U3x~qgOOFd)!5ELB+a`B7MO2d0AW~Z(E)3xcxTEWX zDy%_7LU*Q^s0)yR#Pn9n6=DN=Qpe$AV$H`qEzFRt*>hyd4DdFNizO2ghEDVCD!nD> z=MzIXr5c_qi#w}w>AN_<4p>TcCT(2|y}KZ&aJ+1$Fk$C;l9Iidj2j~MBjODH1hD5U zAEj;nF+ei8^wnlftQHM49MCqeEwB9c?Q%{|TRef!RC05)Yv<6(wFUoxJ(t@jUR@vs z`Ozuk5^yBTaIANAJ4BXg37(pVg(nYFQc5!Z#I@6i8OPXdcT&GU%nCSHh_qP&L%mfk z*!EfLrFpp}vXLD&R{9i{Q!0Fos3W4H?7;7G-zYxbWYiZ^>D(QSrd~55=(8;M>=hT2 z2a-}B`-fr76+|GBO@Jpesq=<9Gm1+%d~BqtS1~XJN9B(%zHiJG?Gj{NHZ?1(TVn z6vb(k@b^?O{q2gj{+?;w0ghvs7nfut?HJX6iumL71Bu=7D=2N#3biZ!bRH*9pM6Iz z^*}`s@oE6cBDkQk#QovisGQY5VB20VcTOtur(_0L*kwv-Ixkc{H={{ z-X|AxT3}U^>1?fz(h4NHJ6BEi;i>@YFZWR}HU~9^0;0xc%cnAXUxUCjQg&j20@xe# zft#$ZJCvWl2mG#uKmUc;F#Z0lWyNf1G^&0|b0kKVul06BzUiB&V{CAmtX1iYNL;g! zuNrMgkGt|hAy_jhXp@d~JiRPl1x_pbV6B(utjq)uevne*sUw2eX}SHk#!Wr-93_E* zb-Ib~GQlklr|qZ;Feeb(5#=CmpGJ(g$f`IK+-EQk4PH|$pCQIilKYK=WBl?TQI+%4 zA~XtIWDxW8BIvQL9i?_9AMH>4amGY^XCKgWjMJMj2L!YMv`phRy<&e5@`>ATzY6kgvU13NkCQV^&h z@7KlNu1Zot{soeoH)~iW6f*!E$=0BbuBO>MjCkuI@LI#pRp{t-R`odY5|8JuP`lqdh|8|ylvCHh^vnTnD-i|crBn}Y(dSJ@xu*@ zl?cjJTO(ix$p3rY8R!XV$|M(=zl#V8$sq%z@I&7D!%FhO+^T$K-+n2q!K%jlTgfNg zZUVL=-Nfq46((b$!Gpc2|BIh$JhXUP1ui&zRVt?*UAHuugS#s=e99=5e*x!d&p0l5 zT?qmS!teA>?2r$gh&3^P-^_6S-_Oe0eHUea(Le00c!C*uhUM?r+4{xzkxWif{TqE+ zE?3bZ9cy#sEH>nw*eW!Bs0281)Ju_6YGz&fK*S(tJ{xE2*{n%Fuv|XYr7}PRLdnTx zNz)khe^dxh-jUk2rwUDH_k8CjxPb&R@G$nPO#GxvYu=Q-gXTAh@zvz2k<*GwWtJts z=o7Ii(#8-qk%q|1p{x|t6}Nq8P4Jy&l%aDzs_)k&OW$hg07 z^^ZLgNIh2$s;1pK-v!?r3>zv7pUbXC??5qG(ZeemQBhYjEI{Ds1jW`O0k=pbkh4>L z4sR8MWMic|lU=IKX(mL#M1;Iajx9Oew%n^fUg5f6>)QM@_dbET`=My?asis35A$5q zXXzCPO8W>NrQ2;rd_bWNqGDnSK4vlH)jd08c@R-u_ZD?qYvFki?I{xM#xK*Udv;A> za!EqM&myWpv96Ed7E4H4(F^p(-X_#XnPuG~lyo5uL*1!_l!owHT;PgIs+mQgVV!*lD>n+!g=<*&JywhDHs zS!?zNV(^umk{!9M+}DhIP4GrOrSzcSardBWoupC(1alklq^`Us2*FSVn^LsP7 zKRgC3UxsRZSP~JRZ!}&*KP4^fOV@|GBx|XWk}?03tUOSa{_AM4F7g}pH!7k3hWJsD zVfj0*>`zE7yv?K<|13OMf67TBSjQ7rct+$H(h!spNoH*WAzKdTrDH$B8O4;BZA=&a z^iEiy&xAjlqC{?D5K-z3LOaLk(0MRpNpQvxjK^NN44}*lSZ9%y4-ZN1*w@Jg{Vx2i zS8pS%uDD7s!t>fFow~;-&MHt<;Q4>NMw+g!DMBn#1^()lUZ)z&_oNHLoRF5|d^))v zlQKgVRSFQc@}{>{@t*lY%RB|I(co4Z@R33Ah;f*v6)1gXkiCmkzFEn&Ail&}ZheiA zW>|+y#SQ3c&}wo~8k_Sur@@NLouoWpkk0tEPD%FGno68oJaDZEz6T&JXdhM=nWoXI z=+Q(dJ|Q&D8PaVvmuR|zu%G@*`XtRz@eTXUI)N3qPafSv-}33&E)6@i8t^cB$NTsL zE-n>YR-uq-O=n;t3ant({jN9QCi`V)hEh(>11w4`*53NC`;uwEqjighsuXDe5A>CM z{A^6c;LN2o_{1b&7rRe@{Gl01-i8A}_~VAy)C+ol=TC*|?HLtNM5oGO+d{|hJUc#VocF3vmmawfB{Ck#_g z8Y9~lsTYk7X#czfbQ#M?UrYOX42i|b;gi-u)rBX$r`nhjnhPlw8^Fc;L95UH^eSe$CEHh$|2q~` zmRue3-QDL7BMo@j*g@BGA!@*m4_2k%?d>r5*$lyhvrAP8_Y!5TV!&!aH%?Pg5rw)J zml)y0fFs`v>TO~Q0kEmq4z!C9FbBfpa}h(7tqJUVJ^O_Y*!*&|28I}e>JAf%;o{9R zZABa;$R4023+uEDQ~v2~h7NZxf|z@6Xgx1H5-dgQeE1ISL#xOMjiDcFmw=Hi4}WO~ zqVjkSsuq~&kCsQ}w^Hi|!%V_%ic||rpHfA%i<^qEJ=cH-5?*722z+}v8-o;g9|8%t z_bR{uG9=R89DKQOF{uM&&9cBhLu8w-9CMqkvETzv0%FNeg@`YKb$YoS;Sa=LX?{|NzH`twd>DM}QlI_M0a6I;TD+L>>(j*# z_u+;j7ZH;U;Jfakf|e9B;h6~+6LxntKR%cH`|jaLS+I*B*$M)cfz85S-Vo-}kb6xf zSomH4#oc{ih>#My3ESnv!k6~{xAQ`){rNT(HN~g_igGNFn8nW)(%q4E;LONEg_Dvj zywWSB`ms6U*(Z^GNI+deLaqGqH$|Jb3Wv`5uL~!Fh*oAof0GW65)Ivj|I+4S&N{-Y z3*(Tv*0{&}KJxjD8<7{_BU&|O1 z`)6g_fbTa);DQd5QOCjCt!A|f)? z=ZZQ+M8r>th^|IozYKhm5Pq$ai0C$vs^T*}-?Y`KYp)pfXWO3tU6!otEOfWXe02l(LLwqhCHH?9L}iv&jV?YSDs%k*U;V$i25JS4 z-2D6+sv6WEE}flpSyf;d@?kLQq=ee~`d{9716|#n?ss6Ng|aM#fP;1ROBcJ+BX)z&Tt>>^?0;xyUpbAMFUTBEJYc)AWuJ z*`XKqy?=@3;(qT|osBjN8YT%haS^t#KVh$`i?#>7k=X+;0y^`U({(T$HqGPr=~Ov zECes7W2Mz~Xp2VhdpJ-B-IzTuMj&9Wm2l*L;{EnkQ5Uh%&k+kjJMJc9q>YA4aK;cZ zHI$l;4x}ANsi~=X=VJ7-0M@pSo^Jn{y(K*dm?;O2jM!NNsyFz@Se|k@jn~8@vqVqO z;qFbCGF&+2cQ0x`f8_i$vnk|TPsVGn1tNT3T(e3H^V&qdR*wHxUGUa|VKk4rx_W7f zg!a6Nr^;1*F#1S2 zN7ba-spEHN1;SnuY;C>37AuWezRO?!6HC}^&X8$X3OX*hT2-^+;QZ`0imRPE@>|F& zn9f+4&h)_8s5>-O@8xMbs{`oaaN#HsrAFU3p0=~6 ztf4=amzKa&&LXQ8*Kb|N*a^e=^xC_-C_933lAJeG@(1+|4gLK6#nK9OibAg_IK?}G zUwW=D;D+t46&4m&4eOr=U&>C4gSv<&JH;pP=s$mHHyBLs%vEleZoY(@u?_;6nl5|0 zoc!I+<;yF-kj9AT0!g1ZLL*8QKj`_y=$MUKmK$|>3HCr6+>t-*Zj&UrCkNtISZpo4 zEc40B=5@jc9g5^mm*-42YAtJ?hwiUZUfa^qQ(OD7|9aAG!g&_73t1T|P>+&D zry2}5GGt(jVG9;s>z5TMOZY*Jb~|Bv9@rq;-S)U_4iWyKA3oTi(;p-a)!=}9*$^sO zUxLim!1145UemPV)!$|TK6$oznW~a!-4qrHh6!TDcVpS*_vlMl9`l2(r@!jMGO^~h* zw&FEm_Q9KU0~!ZJ&XbTVq((z zbd6(2q>`i=-1(aK>R7eaQFcAy@~{u94L0Ca@43Q>;sYtpB5k>D7p})6?><=I@P<00 zNQjTMb=_ab@U7@kYPX6OV?TZ`ub!n5FT_*{D|uB8h4JQ_Gm_wL9p`Y8M|HD$*)aJN zCqBOfIkz4TXMyPHY~$MrZ*+tAy2W@QM@KVq(w=+zgA=^uX;1vNM=T(0?%xH`pv_W9 zqeBt4&e8DAn{2L0zqT|lJVv#9N<#>6h0+b;QoX2iNyqM{OIQ5&R{ikKK8GhK4Yjpu zP1d*RC`Ft$uWO4#edVRY$myrcDsroga+O|Z&8T*KWDTtI9~a54unjDY&(~TVZ?OE` z?xr30xT8RI+FZ8IPvSiIoExXwul<Hw9&{$z+fXwRsY&s9cV|F~{O>5SpZR{=O_`6w$kk3NTR|tCDpd@y?t z>-0F^Ca-;=!eayjdN@JtZD<7&==dV^rPZdKd`rMflgWn|v-O^e;&di!*Yl?eKT0Qai^#u(U?Nsm&{5(D)oq1^^G+=9$GMXt^FqJM*f|i2`zO7wd*&? z^||iSCENe?j3Fg$Z@75{sh=fsrQmx(G3McMYKf_8D#E4%}f3NF- zg+PW=M3$VBUFF}KLcYp+tysp&t}HBYo7GxqJXEJ z|L$f#Tej;+nv@C73iF!|8%zk&*B{Pif!vJ^2_Y(1i|5ez6!|G3qzgFdO1XwM@dde6 ziZBC_;=3PK(~9GomDTqY#3iH}gwy&>(G~^;LyP{&V{~lc(UOUO%+0kkQc|Q{ek(p6 z?&`ArHI$4?#$g4Gzqz@7mGuj&tgO`YDGd!(RrPwS=jmB9qo7<}^^!qfW~)>o>-K|S zvoc3Gx-Xc%=ZW7>VF-c91ZiNhuzZNukW<=T@L#V|i8CQv5i=4tubiRXvS3RtMqEe1 z$gD-&R_8Zp1#1_=CfNU)lv&h*X@n&MOW_YcRl_%9{#)NZ5EW7TBZK>ATX)c>+wa0^ z?`V%;)+W~L@Ffi3+GlVBby{^s8?1L1oF#C#e|!&5*!*+l?c2AQR0`r_k{2oBSx`D8 z5}CwjTqOS0ZjT8Ry~v)|#ZI<=X_mQ-vMIHBR8 zIM&=OBrR;3KSE7I{XSeNf}WOkWIOVSNuH%JJ^o9sf7XN7z=H6z5LI?sbhgpo0&IC+N1jp?0v+|>{Alvw_013$_$ zVX3G+G6TKDhT63548^O7>G5>bbZmEu5~?23+9v7RYDON+^x-jnem-F;U_YX>VLgQ{DRU_r$gj+W95J*zvL=U9HLPk;pRUtFkB+YG zpby>qW98JE79I|`C7-UIw+=Q7u}brlm^5Dhbo1tl%ftx!AY@IdW;_f#f$~r<&9DuJ zM1EYUwr*Q&-?Y@5F?}=Uz$59BqoNk%}**!^oKZW&;f=t1GgKf6BAv z)-!P1sQ+66^-w&{cYRgT^Y%f^()_&V99gB(O4UlzaB^~T_OFqVgF@Wk#I%B)-Et_! zq#(1ZY6rxBG5P1upTmxrNzZ1oJAKnmNkhr}i(8hQA}Nw@mcKhURR2aTazF?nF8$>@ zsN;ux52exfM@B{##mhoO% ze5#DwX@W8-b)H7uc-utH*ay+#yY>k=p*eNu5A*VPvHQWscmA+&eG%UxZf^dm!BMGJ zz$o-8?Yo@Y_ULy?OQbXs-c8Op>G&kMrL$^CiGBEaFx(;*L~0t9r< z^t~#0E6rCf5 z_fR^{PFRT*DRdXZE0CX`A8L1&G&A_rt(RHG7|cx{VUxYpI`yuMy=KZkbx$%U6LdN*$>D`;8 zq%3~BTQfPzQ7YQnaew!oh$tAmq#ROTwr#-znfbtJZWnO!xv5Od!r$?*X{P#EqH?40 zBria~v#xr(GFDd1Z7A1f;(fScq_v;FuUX5<%Bp~6$R5siM@L7;SukMl?#z%1BdN9)o{~{tp*WnHJ?bZZ1&7CCD%6 z7!W{05Vc6QYPPO(ive)BqN+3UHc7B>&KOE4&<-nu}4g>+39@NOgbj8679 zAhU#XuA3uf0o@7|vVRsAT~c$04Iq1aBiOUe&>ydE3+nR>!^NH@B&R7AgBm|uRS;UchmG^UbCmD~%FJ@jFi@QI2H!Y|YmRY3zN)`IYZHHzIH zv1dwIFHh&v4b9Tc@?$bFQYD54E|_CyysnULY04v{jtL^DSM>3Q^T@O}*UV;t5a$qm zxRh-#2<7efTKnyHwEbfDNA8a*cgTTAt;r$>9~m1H%eBt)jQt2XYZa3PZMtpLPA@S9~kZwUga1-cxu z%p%)^ewl*CjfViDG_UZ)WoG*2fiq<>1wVc~yMU9R7)F_6?1+Vyss>d@KfGqroq#+r z+IV>V?@JN&c~=}?&FAlZi@Fp$y;G~>C;H$9=}oF$g8w-dlcb#Udi}KS=z|~s!OM}= z<&QZG)uoWtj5e0w^#}M*mSNFkq&Lt6+(~34sZzX_1;MHFYk|puQ{7RD$>qQ+VPuRM z(D<=ZLr8z~H`!2fPDastWEI47`q50Xq7S)tQTglK+`L|W;*Eq}3YW&?FlxMEgeoKe z4=$kV$ev0SM0#~6IBKR#_)Q;hc?BmuZn~p*x;sA?+nwgN#{h2hT5g{SXZG{_dFZAk zyLyzCH zg7*Yq@=0aSHnA*I0bNK8^G}7Jtxmmi`?PpHFHHQKXs#FiTNMf_eZ{J>sE2&&qnn5QfW11P6kz6 zeCu}U0b$tpVF8W5I4yYxPZ7^F;mta!7V2wyDl|DBq-$bkrhC?AcwVY47eKyF_t?(L z({~p#P0&(&KHn___V#d_DEA3yu7tICz)LW#W3BrFj7*G<4i1W-f|uVDctW2Ec9xWs zWP?nm3xhvH=Ge0*_=!M19Xyv)aqaEN>R+BM^ zMTT?zCTy!;xLVAv+HY2yyOj{pjh)bNa@7l~By#o^xbek`)+n(j1LAdQC&MJW%8}3m zZ>S+A35&3w@CH*A4F2vAQVQxF&9FG#D2fYJiQGmt2l%(_zj&d_$16Ay^vaMheMK`v zLcaj+@KyNZc1)0zX}X!siwyS8tY=xk0UHmptKsTeh?J;Yir{e5EEX^T59ej33B?(}6f3pVanAlwM& zXBmDg1?>^n3xaPSz`7Cvm)jWGc@qrY;A9SPdP=}L-}d=;5i zU481OGAWI~+8!RmN!ui%P`0cl)CK}kt9`K-&6^CkiU|CL2 zSQnj-`Qp3$J@IiF>Dv1GW54Pak&nS=`+HdaGtGpBCrYukhY3|fE5^>vqS~+f7ogUy z?5)nLx}{=#XRDkDV>W!%+-tLGqAng0{a++7o~o1@LR9< ze7G7;t4q$$LazN?+t0xauhL0fdonnO|I{J;A#xDy9{zS`%Mw980VK5#e&l&fgx{Y2(5I%T&GI{_*S`}Q@!flM(hEpHy6euo9X(-#IMlh#4>4>o z?@b_BkZHAF1OuYl>w7-f%IV^b$+N>;55r-Eai+y*$g{PH^69p&1Du?6(CSb*zf?^X zm|*r)CGD+s4iKaFkCx>4Ou0le(df+fLPgkf#P$y9yu06-Na%sFF8`l*uEZA{?NbL= z;zYHAVktJ<>Su!iYI9NgXj6ILA1ftX#VjpT2F)U&wTl1I`UTHIV0t_~=@32I`7{RS zGt;A+MPi=kL`7@@51ew>BYz%DJ9__Tc_H3g__ISR+fuHC9&=kCc8rfVS|P+*#H({& zn@vS+iP(+g!b0r?_X@h}JmP-uEwO`o(sMk4JN?~p2W;8A1HAui7$rR^!@rknq2eKD z=yDinJ(SvQQ~oShbKOVk3f{fFv(pr@XzSzSvo*#A?L-9~dqsVWmwa#J>90KAPMHJ4 zn#?8-K70E^KtSLhr)tQY{DOv#-cNkyTjP0fAg1zj$*L_k4`2OGOtAGZ>@wejCr=y( z-gE0rF;Ns5oHp`_a}9OiIwd=JCD=Qry3>hB|IW+R`i`o`#(I$Zb_J>W&0LSU6oS9` zm(|tfMMF(wO_C4x5OvkayK`)eo$J0h`o7>3R)>S>^n5BUUZ~m!dD)=OVE~MO-EfwJ76A#=iQ!8+F_hy!HUyVth z&>7T8;DL=~E8odGejrA4<7Zwzh6u|2oR&Ig8EEAo=4y*XN2FC;PIN^?ko5`jr zqDMShTBXIszX1>_DK2iHudk@|Yk9AJ_RF2EwG{DScYp%U2x_>c9D2Bz+?~ixm4AGE zoGuQ1sjdCksok|7ZC+|o5!lZ!Hhn(WX)WO=!Oq^w16|2uaB<$vo1Bt)c(Gsg0+fU8 z^V`YsB_ITj)-lDBssD5}WDy->7YrLBy;-+ictfbg1~)`!05JcGdGYD-GIoDHzkAm> zIXO82PG)mY8yZT0Pt>${M^P1EM*HU!E1jjP@6slHeG#VYtQ^b8_9idc(1L9|;vU!I zt%UZk?mHD5bvv>!9rj~B0fG9tYN=K^VoK?Sg#~|q-^InnNs%Sk*-3Uyht-BLarrB zDTdC@&T5#5PP(3HbffUeLM3L1#idJU#K$Kj!a;MGnk#=_{wXa7t#-8h`HB$Xv3qhp*P=u5g!g*64s&CmA z%RN>@N|E5%G&vJYLbxKsTJjOIJOqkI|5$*Gvj~&pw?RSxUaA8K7NAGUalY^ zF?MwAn#^24Lo)!@H-yL!2uod^+jJ$Lj9 zhD_z{ESxM~omCuj)-?*43MXr1WSD0?$iffK+HHc=ulB^$Z|FAnOm3MZF8v3Je^DZ`Qpd>e3`*c=BfLcsPzy``NPxZLv%@iqNmh zs;cHaXSqW=?1mWLSk46oodPD+*{POV-H+P~CAmde8I@ud;C*~_B(f@f|IzcRjj^00 zu6)~E`=Ua?)=iA#^P=$%F_~~~u68QyLr2WM$r8$F4_o%>lU}@if_xSqAK&LLtD7Hw zHc!osZsqLdyL9O2=sHz?6oiQ|IUeW9D>VPlW;lki54PV`YyG4ulpmex@;HhB%H>s< zdS$p>&;L!QAmJvo{kCL)KfBiqQCC;jL`T2sRptJ;{%c2mQAvEB-rh90-l2{`CMKql zVw3dLOx}S^9%udM&%Yk>F(9;g^ovH$z9d6Iu;F@fDX|r49#)>mTk`-LdV5V>Ez;Ih zqzI_ez(nlFN2jLdUd-BS&&|we>zRrJ)R}VSkVWBfD#Q?hsAr)G+E`nF#wSU6|Mu0U zx_x_j314G177OHd$~oE(qyo+jW0_?}iY?Yw=RF6>YDE42+c`sG&{+qIdz~rcpVaQf zdbTxQj;6w>qLp72r3?pZ23r5oG1N`39wk7b$H(XXtonX_$%l+nrc)*kx}bd4M~}Y4 zw2Vtfk_;1$jt^Cx`>Nc6H0nxYH~f~mJ3FPJzV5S!s!B>9_KFVh#}WE>9hYWj#|IiU zu)axpAogmje|gALDnm`r;g=)raHo<4q9WZ&Vk1mBvagu;K@$%b*Yn=zHHjqT_eLkJ z^J#Owf9De6A2w$0gM=KumH!9pdOXL}uQ%L@R$jxcKbYyP4r;45v^WVzGzPS}L@To) z!p$0dkh`7gnC%$&M0#4<1yM`1dh3z_=N~*?kolh-H&GV^mHZo#h)96yGT(*UB^nj^ z|F~krCQtnj7XbVnh`IIGE5{n`2Y+P-n*(&6wyBOW2sDGk0l&lil8eW98wz^i@6qYS z#+CjHy>bgyOLwVh8KQ~7;7lSp0=I6SsSuuCMWrp#1_)1P4K7pXXD5J3Zg21K+eAU0 zKDAP82?@T!@gn8kGRyr7B;;Cty)2~UPs>LtExD5yE-sqQowKudww|l0-AUFvsI3*V zfCzDM)j~C&R92jyu4W275u!JUlx>~si&J0;KAn*}-(Okow@m4&_3vIGG@e_;y%s5c zp`k$;3t$+O&_O!MI^@rE!v;_q__sQ=G3wXfYJv~erw(L%Epm1X<8<@2ux=wvtiK&# z-E6TklUzuL@7dY2v04QC=CHl!6>QMP)Dq!15V-e2=#R}G;VjaJ;UwznCQko+I@@mXhMh;nr4ShVd+@s#<*;&U`vEv2k{K znzB}yn_H6n^#Ikdu{Kg_@$#kX>(@VUEiGX5$$rz1D{sDZSoxoSK%d^DrKP{)kiO8~ z&$fe31M>&?`c4BZdyaBUdi|K=u;Bl^#=l%hEPE%94m zi8YJ!@)m(Q1_EYSdcHPHXV_b&fiPb;G%`B;UD+Fvt6IoXup$UK>&njzsu`on0@>7daw>)w zG4GW$?AJ^9U_sj24;+Hc_qswUr0>zt2>hGNgWC7Ems=9~KyMnBH{PDG*nKr0J3Kz_ zIq@_{qt1#2DHtWoJVttK0(Q2y0}mh@;{!!u%mKUQZkBDJu7HCzM8;=!D_d(5(j1j& z2jJO=+Lb!n%o^k*GN9%H3p8Duy~X#9$^_vJMcmgZJXx7Ink?@?7M zP6=`G=NCT3l&`1hvLvsw1_HjizV1D}&&?kO4;%~)A?LyI5_fFLEYGF+)R6qh;r^Qdb6`x|E+42e8@FVgPs`8YIhLm$Zx_>Uw^z) zvqv*JFS1cpGIN~RnV!6E;m;q}6XzO!i;C5WQuJB#705C(?TBm1O3KQIC>k>v{K}PZ z^8Y3%ewpvvPF#o809cUWw~Nc}u5v}Chm*C199mhIm)`XA=$C;39h0%PksABZ!^6Yy z^UXdVQj|r#Z%0n7w50Wbl~!*hr!#KvnAZHzu`;yn;>7n!0;767O69Mvkk9(O!kTNL z@O`pza%cZ@{E1`8!qT94u$r1?g%Kb8;PY4CafAIm7v~{(L`3_^29h90INuPIgIAC- zXC`H$U(XT$XHSa2o0CJy1c(y4@aGG^T7T8o*Bd)xN-eO*t3Y`JC?!=V1{|!w^+Zu` z6*M%uXL7<#aL-yy8V)knvTS=ZGy?1rLqnTMA%6Y-onKv#ce(%1fk!_8fZ=!vP4Me- zu4&xD;JZbiYiJ;76z#0LLxt(P6FPL^&^D?V@MKjv^qiK@=w-0W=w89nqJz~rtwq&9 zbF6wWAHU2*^Dg%woHXdXv={4lke>4^M(z1?J9}j+KY zp0hZBg0Qu<6-h~nPihEm9`h*nKUi@tLeEuCIN8c0w|?P2e*D<&jdC0*5kwsi7#kGm z>E>%VR*zLXn?TI>)GOnkJQ-LD-b5i*XJ_4q^$kD1i>=vM5h;pglFJ)*z@EHvQJ*tm zlJ@NL9&E0yUH{L~M-Y*gk@`%!HXQ|zvbpOUNV zSXo(Fg61DPN{GpUd!{^S1Wq5wp_?%Gd3o`n6mq`vTPlh*n3R0NVM1(;k9yJ8K$qZo z*(OPR$57dJQ`QvN05w+jO^RD|HwJab2%;m`k0M6LPlsfh3HCIZtna> z>G{-tg-@^ff75$zV35LjDc$rRk1^D7c7i6*%)}vzbqbGnah82}tqj@W&EI*io5PTV z^%KnFvf|%1JG>CcLOxVZWVLg6SVWpnT7rFyCICdnEPNOrD{F7WW)p~mCMiB>!paHC zVU6j4Fq_DH@9x7{&VJSAt}C`ZU-u3S&us#d&^>YVPXd1(*flhkEt50clNVPY<_%z?0N&R@$9|9R_jNmxIfNlyHN9<;@4> z%aPlW^ky2auFvhBKljwD%E`(37t+}8H_03Jwf>jC_1&K9|CiD=l>l+#;`0B^D{fd9 zp9H^zB&+e=Dr0ADx7WT#@41#17V7Kjq$DJuh6zgxODnsQT0Xs>|GZ3oVUu1|o6E%} zl;d)i&{^v;HSB;u=oGxHZwUDMBCln><#5zj+mD00T+L)*W}S}yPPSg5akANSRdsJ4 zkAwZ~a(ITgh|n=d}@^3#*JBVPj5X6+yZOwZ0Y>76r0zZ{E7)>F#-x z{N_5=Hl*Lq#e2WAu>LAPC#RG&pM3t{gnLPRzUC)J*+Q3VX=cZJIIJrIUKtgh&-tIG zvS|ZXL1J|2(%Wkvj##UJAe8lb1~is@bj|Pl{9GsKbbjs(KOD%)Q}~?=EF9p4sIJW& zZ5+J?mw}a$(u``%QB9x$fI7Wvsp&lM8R|l z=tZsGbKRw(S)XjM94hONiHRYzrTs7i(ClN~HoAV+ejvYs&|i=F*+f{SD{wdM5XMU$ zsvteZ+~=MD;4jhXwB)S7dlc$iC5Gt+89CMK#4*0%Aw3h1?7q)s2}2JZ87Ln@p-FzV z0i%n+TnMNuVH8Z<*<2>D_?*FSZxy^($88?n%dK}LqT=D@U7?-9&n@J@S)7VyR%c%$ zM;}RXc8ztg3(A#N73bFHjY|eJQ{UbiOJqv@2hfN{le>b66K~TnCi*T`iBxUx?7;!m zB1T0?d1I``5&IUY2CHanEbiyhGbj-#8DCi$AEzfF!58S$(Av_*y>`adc@0H8ew{@* z;qAP&vnMFXt6P{LD~sZXD;O(}Z$4-irYF(%R@dlkSBs7LR1Oc(Zn34dRv;lSN62~3 zzmz|7-9X6(UpXQB^3QNLrQ)E_MO8E}a{Ak_f%&cxjw8OHtgLCOxp~X!r`KcNmmqyW zUCAHc@z7IqmTGtJM&iYTPYriZNQ|0bY)$`?N>Y5p?|Z`E0HB z4HH@)@ChN+z*JV>RU0?>jvd(J3aV8!oTELJI)AGr3B)RdAC#IR8`t*sEk`n#F!K1K z@nw^$z=bcF!5|JVV0@TdY27Lds2R>*y_Vu7r@of82lnM9b=V&Sw^8H2!vBitO&Krq zHJOXsF}B5~TLt(A990cfe7ld%%d6Lhby#)wbW~*2SeF}ZZ+ie7M@ssXljzdC4MTL8 z@*V;q0vx(G<^|W3l&)zcP24HxU}smN?eAc!nY84sS(uY7Hrgje|lM z0@-&kt#eXMz}p>?fftw%U6F`|sPRt8G@p{4bE?{J>BPW$^xcGAZ8F!_GvG5nPS0H6$d` z#4?XP{oA$0FnX7JWb z!i~Yx)61x%bJBi@we^P|b}x&D#Y_XDmK$N3DX2CG`siRO!@qzZTnHmi4U&pV3eGhA zZ2M>#by$D@{(aZ+c{)rDrV2F{J$WqZw7}-*&92m0w%G<2su)o0ZEaOLJHBI_#ilr_&$ZHJ%UuQ?5Nc++CTlCR-c!FBS_VwU0k6YsiuQ|+ ziYh9p7Ug=ByC-Pdyw*2>PQhRUa^Ny=M( zKOYin_+}t`mS|8s23d_Z$Qy&#yYFp({`NUIh&Xb4J2NRl!)JIXIXm!A-}Jkmr#M}k zY8WtC0btLYt~~%w$A^Ba=NjtOiLIBa^TU(4=I3qNT7OyibZh9GNodHORqU2btRL*` z(B5cI*^?_hwC+f+nc^Hy@5(`*#E{6pQvfumsB@R|RY#WHk!EDUVhYQceUKc&8pq~E}l+>vu%&hb+r908$3H&h>-i(957K}K3j%KF~1Q?Lf*yOPDQ7| zn=Tv}ONKblGscze)eP1fh`Qq^`ttf!Fso|ywY3qeua+{L-!uUHf%NvDcz{dS3HUxd z>@;36eSEl`+FR&Ys8l$rc7myawu=B2{#GgKh4}=b>1o-Xo*rN$G(=7)Ibj^bd%BtC zH-Ho^Q~0&9dU}3t+Q*nxn}!na!?GQx*Qo}WeR(t|&v5CQO6)ybXUH_Q9d0c@?_sOr z*>McLsGavS+WI&ALD~!@FVs!+8=2xXqRNassqfvMpIhVo@)C$gsY(2zHYWZqT{eHy zPJ!#TuP*KX9By4(m!J?X^z`<;6Ar;tT$eI6Gj)y!BCjpyQfHx>+aXUpfnK?5VHP@T z3K9^xN7eSGyx6?v3BSy6NB`K!NNHikfR$*Jze;qDGdFA2_oKD%FWyjI``~90cvb-a z)z;N!C(H%qK^O}K@4jbA5)7Pw%jqOjD{Q1%e)$bMV!Sg^(tekj!Qo5;G4L7>&iCSX zwgL-ABl2L*c7vO1RaIYDOX_WVu8@$gpBy(F#gLP;F5;&u!8y^d`WRXi>WyqF3%-5- zGcCn(H?;_w(c1tgzID%i^ABpXubr)pd=EEl;owJws7SDpn~jXD2s=xIJ7w(@uJFVi zkF7X!Qde&;I3X3bN*96E)g(t(`?z_R|7X}H{wn|;%vP@vX9Cg zAv|T=BD?{Ea|G0Fvg0*?27w>Ydvm0Ti+bg`K@Y8h#w8^d)NGbWdlVvY05(F4sNTTbF2YvR6D!(}L z)5^(Jf$kJhXEQ-^N)dXE9GgUJhWqg5P;APIgQ20AqlUh|zK%oo5b;#@98mXln)3h@ z>aMs*CCv7$HTD2M2wBN3l0i0(IGb9-?}q=Fy**+)?ej`2#NwOsT%Q`JbN{Y}nPT`& zC{U%T*gM{FnI|0&)Owa{8X97^QC?0mxVy9T-@__;X~vm6bz5`5pQN2{Yq_@2H@ zDNqbulPT+Z)mH;sN^D=)mX$d<+nf`d%C^)mtbbYv)9}nvFWBJh5N#Pq*+V;F5inQ} z8=GZ|4Ihs{mFP6WwgKTfUHXiHFf3feZ*r229_2^osGG8+RtIXEfWm9PuIJyON=r*) zVq|Qo)XBP&>E!gnlpz4s0@(l->Zxwp+iRZm0K^_Kl?lLUMF~5QI3qCrmZdx0R`$Nz z%BD`I`(~+zCC2OD`V$hMw^qdz9j>??`mcQ&1A?DkmY)5P1M-Kf;n}@WAW#8pY))7# z^+Hj8&#~t@2~dtFCMM>+8#xtFy)o4=$O`(TJh$oyc7er5=^W$rI)oD@(XZjZMvl3y*?&uJ*$sN;t!&j zs5mG47;Izewf2RYR7vh8>}N+mZt=0t_u&;ADIX6nD&Ebt0}BA0m2&bE6_L~6f7 zL~KPS$JxT7?W?<$Amt25whq>h5OJN4uVJsn1B`{-Upg%A=M)KXsL`4-T~ z7FOxc{s9Sqx8}PeJ0k_rN2^=m1U-Fy>qpDdGDyMfcyEiMsJ>2RRD|>Bs#>JxEn;N5 zi+pIaGiN6N%V_UXzrXq+L#(IvCGC`lpVCnhscgXPOg{avSi?twH{3v04WJ~}ZE^4t zO%%JBVB1KWAxuYXWxmlORQ}Cnfy;>A^p1JMN4RuXypcePRS_tOuJTVZy!MwP3K1$>4HqZx z?dT#WBaiQ6|JuD+oc5{g^Yt4^&(5g5p*&DYajx8%vkR4tuzU#c#6RIkh`^_3f3Xel z^J?V!fAH%6$yLI@LjK@zUT*%%onVDVH0fFK&ps$}K7w)CdyaoYLe-$D_>*tOZTin)*x-w{@S>?eU@oMBc1t~mDg}V9)97JPsq6db=vkf z<#%bQ??wM2B0Q}-eUhP@m=Q;F@AkuYq8Fqg5fKxN?Q-#W3O&#}!A+HCY_UFCnFBO9p;zRU$(iiofcVMJ3t>?Ibi&(dtlA?rRGF>AN?#w^OiTep_fG4`avFi7nGA^o z07+c5SO5ZbE?}BwvgqO?3HF8G3I{T)3k&?_1_lNK=GB`GN~A7mzZg$C=^aS#|2$xX zwhaNeri`?dgtSDfqK_LGnwbohC?njDYIWb%lYg^K=WK0lrS}3L34jzuaRI|*0Fu@!Q7KExz ztu_L$LfH$5ce=gZ`DVT+6&F^M-qCYQG`%qd(tt;na!H*go8puLlpuKnDaF=pWNF`t#Pgx-k5GEswkAd zOT&NmdbnOc7!@3Jyes7;ITP>4VzlzL#uXYlHzEQbUnrp~*^aMWMse zIuiyIlPQe~o*Vx%a0lNd;%LYX{giegTO)FPEXmsRrNf#y=P~+z@A3BnczKLA>~mL; zbkOC~Q#gf>4@L3|%)U!kXBW^Fk%9>b@JoUw?XC1n$q2#oWWfNpsS?YwHe&lU_}TeK zsv8v3JADyZYyk(W9=&NN8a6v09UQ5X$zAPWJN( z#Z;go+tT)nMJCuN!Na|>)guIbaj<}}NIF89beovuYNn|`z~n-mcIKLxK&oY zd$6a~+ZnMjt&lKR-wNVQO&`Jdd3zgFrtbnB8N%wS8sua*czFcs@%s%)d=}C!yYHzu zsr*|GK3^P9B3Et6hfOzc)&>7sEi6>StCNtB_|()(f3K=~$aTNgCs5GwEJj93O)YYQ z`ITR7Lw;VqC>&_g+~53;M?=t;@M5J@4~77La=f=D=-^45-fwr8E*@T1LT%#!5^9~CwWP9kNnzQu_Pcblx_)H{M`dUsqJF`}5H%^`zCD}t@<+m* z9^LDg=@wSRUU z5+*r&t9ZNO35CxAXs`r3zR4oO6(SL)VFn znBrcAa~no=jss-Txv(wel2Q3;=5icw0kkl(uoLL&R#s9Lletm^>=D1$n{;~G5hPHw z6EKW$H?sSxobxd@D(OE%DgW0GRBcOGKh16oyJP@T!VSmUo;I%AQi#RIDX19ZlS+-5 z|18OQ{&|GE4B|`tnSD8@{~pl(f<({w*%uXUZ*K!74hHjJ->h*MRaMmg^`9*;xe+Jk z#9KnE9oBwT`aIw(;@jEVr@F>T(ze>jXM(J*ALzin`4tH$3W8DRw8B7VkGiMcCr^7| zsDCr8Dq-ts8o)W|4(RSJ{cGOGym>anEK(Dw7{>{~NH@?*CW+>_P2Dh#BxEpOgXRm2mPco63Jh^>5aIKq%`a zcY@m1>YqPcUi?>$LZ-^Uc0-{sdKFGvTUw|N`~K5AM4rqNAMBr@D1j^Y)ovnBWt;ep zSHjD?2rVr1<+XYZmch#U5wD;504(glHzIKeCV#3~?nu_^o zLDks2ZhU%sZIm)p8!U{w5-P7+da*jR8U=dSu7%UJKF-q?^t!R;L7b>mu?(~&joCe6 z;HQbYTBXJj&podOGX*4ORyrdRSzC8NzZVN52SS?u#f=d4#hID(`1JJ!roL+>>`viA zWw(?StiAl;S-fs4)ka_P?1M=c0RGdKK)nD^PXK|(F1{afJO%T zS08t?j184sK18vhBxX+(!q}G`92wIXsnx<@7uD`623W;<%zH_*=%EfXoe=Btua3LM zH)@4vO{@T)!kgM}#OG3gK-_Paco^pLv~rwCmx^vmg)C{ z|K5I0v*6`DDFRgM?_J&LvQ44se;TZw(A776^S@Z00Jiw9)(82(_YKgo0IH13<5#fk zl}Bpmh>O~(YqIBCg&y^rW%p{XuYK6~S5LL;fKC4|+bjP6Hg6KZ3B0Gx&8uGgvvo!7 zL!nk6iwcR#e}UO9G={WnF?h?|&AzxvQBr7K*Lu$U4Rf#?Mo)l8?OgvN)m1^v}nf@ zA23yTc7K5tC9O-B;TMy|R6Z!FuDvGw01BBbJY0OMlq_;K^ITvscp~>S`{xF&zze{k zMn*6S`Fp;6^$j5_B;+ymiwq<&Rw5uEQ{SeQA+9R0L=(Ndd-LXw+)iU19uN+fJR-%=!OPcwE3Az^t~=f=_OBA;9UL5_8PjsPNQBq>{8<5Gv#`) z{J=8!5EovzgAJHPak9#@!qkNbc)=vN5hWdSzYOZ6BGZ7+v~f9I3=0%cDmBdz{$9^r zU7cRkuy-Z#oA1v7Vh}odMjaEAoe?y$xZf^}g3j1TZ@1qzbCLG$q~8hCoxTqC3<>rO zEzWe-rptYPK(rGuJ~jiy6rZ0p|5RW*4LsW+-5DIzJzyRUlElpel;`&LZX8k5`qMbd7X}BGMotARwIs44p$scjwUE-8pkE z;CbHnfA-lQ&R%QpwP*2xwI=Vn?(6y`0s^eM4A(p=SJHo14@^EvtWAt{+A=PJxbCz| zEcgD3h{!oRj_{prL~jOiQXn?J*iSfoU{YaFJ6J7MIX~HR+=Qd~kB4W`=Zn=02F4Ao zVTmlv)o^V8w zDzLX-o1oLo@9ov?iS9A_fpO+$wZlrpaGI6=LVJZznz|2H(2WF-^yEm`os`|h%)@;u z3cDI)1q6|E%l03g-g2ovQtwGkLAJF@X}d4R;dx}IV6Als3D>d{d*}Yx;@If;R-1U1 zBFN~p=*fvXtsbg6p7sY=sKk0&Vb)y7A!=OG)6@Gm{Q(UzN4)JJO*OxkPGwf99C^LRuPD;KC zl`it8ATpx)srdM-K&#{c0ND>b{`wZAHV|hOXl-Ggo1`TI3^p_1l0ZHWJQp-E&~nu>uk;;3WmM2+)c zX`&q2+S@x*7I(IJoTdffCo>+UjMGeu^`2R8Tc?<#TlwjwTaf@Kzh(plf{U?S+GzV6 z&4T$f*eAmihZBi|4l|B*-qORM=uH!2qsQ`sj%S6Ngzl`CYxrtd?q;g&<)-;E<_Ii2 z=ID(*5yz$t_#K?}%wAwhp@i8`$m61LvKR@8jmLKwLPDtw=5*ICm zBkfh4f3sO+=!F!HNXk#-nXZ1Rvvnq6mdgR8#&>TqAO4B_FhLL!u`s`Q^NyF8sK_R7 zu6R3_Q~faT^!vgDvsIVC`c^|>Zh4yBv9|E{Br0s!=5YUD46STTUy#o_Xm&LJrJUm7 zwpu|s*JxFL-MH}eZi5($xC7_qc-CA7nZ~~?Q31eLh;Ax(mwU(Ow%)%Q>%MlpwDovd z2wdMp_=J!)#0cb}kgt$~(Rem1Eo}>g870JTxuYnenr@!mXDB) z-_$^Jx3L;sc{I8?Ti%odDGm$}_o`2WPQG3jh8RC0#n)vc7Fl@_BPUg!TDS zhW3CXu?CP%s`eIPN(8fFG7d*oO+e$_$J*D>|It%CYt-i8aT)@`YjQL!$bSH!y2G%{ z2+p$)aOC(91;wfLyU)Y@zAC;RTFELM#Sc$=fldQ*m@-rO4ueT#aU|_ri)ZD2)}*8~ z_j#S1AbtcP?z*7O!kikDEK{$S^Zq0{3qCN;Zz${L=4RqF;xk<*s_$~RVL6U)tzNog zNMu+!k!x^1GIlmrzHr7vdYV5^FLd40d4KJAyq3ahXUC%Km{8vFOr%!I9X;AS{oJB# zT1-%I5?~bW?v!#i%8_cz+HSmZH&tbWIuF|&-}L)nm<}MqX5^?iIfD~tzKTj!6S*UqA&|NIwD%tYJnTFe3_u-IiI5af+`GB@P z-a{>WZ+mz2Uko%x-gCe8L03R()k8xQd)xZb3|+?6(m#m>jg}dzYq`Y&NwBTM#JEa< zd3_Zd1KU@@MGvVSwFBeo2pr7ZEEOkzVck4&ttty-PiT|SS0OalY4#Q&PVDFm?jiry zjvxxPQoSN}hjh3ajXk8vJkS*0#ecpgg?4CwFl$ZlFLq7~dm|U{j{DU&D?c%6vwm6_ zmQNB*fNl!lPS~Sy{RsuCOw$~m5E7nrpW{ltS$yGkr+l~gl)<3jC_y?Q{ZzQAu1@MK z(u(@H9R%)hLMNA2RybUD?w1KYgB17sLf}=~BkH0b&llK1gpXv3Bva_9*w-B6SMk#4 zxyrUQ2vgD(RDNEuadCc_8Uwc5VQ8Cr`Q5vJsqmH$7RF7jcM4L2V&+$7n2?;z%yBEk z@S{@@B(T<@^e0Axykb#)HCOo>>dTB8Df>Xbva_R8TuDi|olM8Z*Qm+mmKS#{r5`&T z1htHpH~N`Y0k8&p)`iBD=B&a_(m_)BGpqGDlw)Y5q2fn6Y1yCn7 z<3lSK2A`dOFBVX4a0K4BXprQ}M)HgHZ96c_ad3WxfQ|-9YZ@kUwl@lxn(%g!) zl9ZXX_mULt#f#hGI0gR20s?mYtW;Ennz!z%LsjIW1}}%rpAbBFpsK7DrTt@Zljt*| z(p>@T-hE`Hy||r)^7}Vi+o9`@Qe+s|>_?;N*7tL!7FU^3r%VTY(;q{MCG&_(hN)>d z)eE^dmsQ|Kc0~Pavdk*?N6MVR8J^v|cepl5<>q;R z54W{h+SE~V1*gVO%CBMO>vd22HDsy+tYIUw0+k^Kn;(xjQY%ChBf>b&xbJ8b%9hBT zR@#hFeG8sAUJ5$r#kXq6y;eusbsps83*1vtWKZ9VKq{RM%#5?Qau>wq33%t5ecs($ z^3zR3fJv+?xLNlYA>uvL$+!7A%`|CHq)%8)geE7>1tZZ_N9AeuT>=W_D};Ug+3IIR zlP)W3bCjX>{p0dq=;bWlD$BYp^uLZ-fIi<=ADa47SG+dNM#GkfoUE*;a8b9nAP2)v z${F3@8q+&cC64iB-#z!UC0}i~(@2oj5NIeJZTpt-T44lJE~hD*#fjsgfkpNPr>6aC zZOWuMvP!REjKNV`ipvH;DIQWhYga5 z+P?*X6#n6^(DH{S1-$%u;*2jD(ghn%hi2Q0OMqN{czPl$wU~#Kv#F&8ImsOVv7hQ| z^2|@lRj+}?u<%%g>Lh0YX2Gt>F5pq-EGb@`bY&lHL@=AT>5pUZsLI+QO5~ys@a+6q z$vo)43MJgf3T$qctgbgz{pu;iB<=*(NZ_cVvR!%o{IP~CG#)+dEc=1ciPvORGU4EC zpnPJe?e@}6SJ(d8z$P0I1qhzc2tOnl=Q}NylFPXXq>icL8XX&Z_2lfYo~HM_)f`p7 zUdmF`HqqWw1KViTNBdLIg9&IpJW`r@I5A+rdz`^vo>2>?gEo*~E9&LV=Pdu`du{4C5pQ!!~6G~AC)w;IS zug4O}HH2j|Ght&AUpHMWKye4@)gA>p8_;+`;o#A8z!PH{cIkA>)^%eWjKm8;OiT5=g`J zQ1%^@e5OJ-FA03)vvi7=AJm<3P_`f4{1kANftSz`21a3lROPpSp|k(r@Wp?_9KXOy zj)|RdUs^%;?Z+=AC34a>(j`k40K}4A>&CFTcH0vL>_bn~o;X!9F|bttKT2mO@H@vV z-Bf*}Vz;zaQ!?q!OV3;IF{L^VJ&VgPpga8X9tIDtoe>5CBdO=8rvleqt5PAY4@oy~ z)o_$Ii{9)J+!y0BIVlp}f~_O$qDe6tdF@(G(xd`@uOO^ky;@MYQ4NsbicQd}!bOMAgY z=$`6H4E1wBxx~32mj$%%aZVg>wsoOpu4Axyza9IMz1%b}sH~_gBHqA<-qSX};|%mu zEACEbFfD%Pp%s&A&C)m5G0K~8u-_29*U~!ZW2P6G_Vtbf2B&-5mfL98{p!SA{n2o+ zdc23x4OE5krX!{LNe)%JgWQ;2i9IhOrR}=b4}EGup2iD|T<6Q9<{eB9{Prl+wGY&? z<~;1h>VMb=M%+IGHpB?$8e#V>fD?~ZXn;juC3y#j&n7u@EZEm3rl#NnK3#mklS=1< zNH(|pcN5Vu#DsX%u>jwo!gyo-7&z9xUTT#?Uvd?FW+u6FM?6eY|J7qjNhxrPqr%8l zxp+JFC-LA%!OFz_{b^e)62MIsC443FtSTdINOE>6{vq0QndkGx>z78XtO_QNx5(s6XT!Mx2n5bX zZZdowCF4xlSb-32#rF_pN|vnep(0N6%hU6ls}vMOn=^Bi7u4wAuxE_?`$(cVI1Cmm zpnsxSGRb%i1JeEQnzGj0iIEP|F^w_Gy5~vH6O~ND#LnUr^j{I%+;%-j+t3=*ru~$a zjeFJ6G%9y-;d*3mH0Ra1JI;fMT4HwHy$^DHKy3~ge0XgzA?Xg4Kb!T6v{zz7!@ke@ z@%T^ZAqDp<^I992dAmWMR8EzSGfV-dTW%XCFi(eTAFR9p6rm%|I-9nvIT0fR`YRXg z?wg20%eF>z#XhrV&8tr*0fGVt_;nc=Z&m@(W@TlA-z5k?rlqEA92gh?*(N?j%)(l(EWG5q@C@=b;kF&(Y>%ZXm_sGVi|viC4P1HqUMw-G7e@53+~ zYChdjH<_KEruxblVj@8#CGv^0t7_j_(pdFAkNX1=)qPcdeJr1 zBHG!mH5mp@6>J`(2lgon+@Dq$Dr?>=C~MH;J=a`EmOn57V+~maU&R33z>ZQ|iq!Ma z7AKov!O%Z1uV-x%y1{$6_Lh+)83>d0?*nQ`wMR{InArD-?kOr;*eUASoI_~qtqT|% zwCm#B_hHRxKnSh|QAT{6b&_W_+u9P9a&K;LB^9vwW~#SWb;J2!ee%5ixx3kjxm1DF z8}WPC_hckxc_JOG3WK42FdA8EA45THcbW5h0T?=6!wJ`xSoWOGvE0$CD9_V+rqxa6 z3OXG17Z`6wZA3iuvuQ9XQ!ux%jq)NJ%<_JNpPrvvpDdEpvb0I^%DhzxQ&dxg0Ppe6 z`3zK)fqfaO zpV$j`{n%E&BOlANrX*2g|tl@gAsa_f=ru@-c*Uy4uI9(QhR z+J68tY{|CvcIaNV6XC9|p{h`Td7}Jl(r;c+aD!|aBr}A=HNt;JQM%1LAECVKgzDh? z+-1nPcJzyBy|2-kqx%J=>lhxg9$;)|dP>i`3+^I}K^Lg*v%FIyL2lgSKxxqawA~iStFR;DqymC42Sk$EjZ2H5GA^bB=Oxk71$OFcrUu^^> zW1rO_Vk^t_AGDc%=P10)sXn+J^VX1!_=7^Id4Ye~SK+8*s9Zt8om;oTiSW?d8trgg zBv`%G4iYmOlCkain>d1kbo1*fb5a z*y*R|EW;qKr;LW^x*rY;Hc|zJ{k?iDV7%~qC&iZvbkmk?-?5_yv7fL35<@2TXqC$! zJUQ5QkHpySfV*Uz@fz7X(y0!#5vrV`s@!ok6`&Ws-bHTpx$<%XJKrvEo-sGU84(j> zD@_1M=T$&D6JR!My{+@cCRG;X>W3bTvy_bujjG%fj^OesZ~h5XG_{jmf=tDyA)my} zh!_V42hEUG5)4fv?JYfd$%Vb~&#_89f~fLcXMt>a{bu)BfN3?-w2h z@6(7->Pz~Q$)D+SbIWU19U^?pFr?X)gT_c@M(0CB$eRVV2lKhc+G*qK|1^xx4X2!O~Pcv7UZNEc){LWJd9{SxJ6D*4;Po@<;O8= zXz*k0SYNG0MkL<46>|;$;t{;Cp@1=!)4t1ZN8yUbl>(xtwS^5v9FCOEU|@EAP8TMY z{eD3&&6@Gq#V1cC`g%%Q8o?Az6zPiksccT(R(LRp>8WZ>Tmx_;4i1h@A0oT7es@f$D-u^O-3LKq&J|M-UfU;nMfzs?1wDxm#VhtAF| z&8@6lr51o53vf>?a;nStn)tQ2aBp`zn!^(D&uZz9HS$K*&wRWPt^G~bzg?px`{B15 zZg~fh)6vrJ?`&Ni3k(mZ2>!nrK&)%^iiJUeIu!7IfJOi#A`&TjQ*~efa(W+V?R&4^ z_}XuBDe(idL7aX|&r+fY{Frxq&x$AtkbAY0vCIr+3p4ea&h{PWN1DsEPwt<%SE7Oq zXc#qighj6+&cQo_Y>_t@$~35B840CS-yQAwsucAq6y_B{%R5Fn*w+o4g5V0y&I{<+ zeeOx6t3!`rWFK*kCq%(47%5%6IYkc5*-aJ{rSeKl2`-82H?S(B!9C)qYtuuS0@eM^xaOZ3r)kr3+*zZr+=QLdvZvo zv;GS75&W&;za{DgG$1`auXVNlA;rz@fCEz@Q|XbI%zM}XkYd6G!Ok;+DZ@s_N~D=W zvB~*tPN7{TBgNLMKGR8hy~z8kLfHn8qRQ!YOA56gs zp5H6?CrH55&&tLIk2&;bm(QY4?v}7OuFuyVy}d*1-yHLFUP8~bzTfbOET}Dl1$?0@y9bUaT%{0%K~5zWzUB-$)kFOM-ZCz@bL1L=8rB z^KgrKiE0}4gT#aG>P?TBa(ih~LA8o8#HY5S*Rzbav&I8~=_&uSIhOCqufn;hzYk2E zsG9ZiftvZp${kChuHv@)qOK0Adh(W*NnRZ0@6|JR|DA8W0O^u@Spi2I{E114i*9Ed z-EV~fJr@wX`s_-KIwhoWAa!^Dc3mo2G|1EL8dWGnR#+G8TU8WuM=J!9a~o`;_?;>R zIGNM3Dx~K`iU|`-x)$6kJ`HhH$`U;!q~hSPK-W|Pz~hrxKnVNe8vcK$M%G!(kGlR86J9?%w_iv0 zbS(d4U8=3MMY;MF(DPLLIKVgDG=w!wTV}Oy$gyO+MZ~XD#)i&@NYgDt2x#AF7jE z43CJ2QKyh#DqkBVz1#)y^vgg{mj!OQ&K#wsIj$hH==SZKUf$n1D@x^-#tVk3&dUYQ z^s*sIOfMP!aJvr5Wh%eh|1z>((jIv@p9X~P2L}frR;t=$L>efcRv)Vpy|r;@>aZqc z(8#rIQZ7=M{?JqiMmSUpCHv`RxAQDCus@rduZl(o$(Dk$e$ zb;yM_N@HU3b$NY3a;uRPoBw`on+k-3{cis;fw8ndG~$xT88S4`e`k9f5f>dD-A@ks zJ3wIbgw_N(d2DfO#Tg&GI76OlKZpM`)bAS}Fbck4wJW%eMQmYIe3ocJ{h; zAo=B|Vr0J@dx(4WuU+8PCt+aN!99W7>hoKh6XHsFL$+mXu}Y+F_~om(D9WT06f(jv z!^Gy}mAT((-UU+td%8?1#-F0_UM}9U^e_{zukL9VFZS4FjSO(|l!f*W5og$bhp5ot z!ZN4+KF($K(&x75+^}GZy}I;?gc9EK_<7GUw9YG~+)6>Z#nvc9{C%wILH3ZB2#PCs z6?OQR%F2FwZ+nZLp(_M&^I}4vs2G7Lci=Mla|KW`MJ9O`WQIEH+eY>ugN?R(YnUGP z0&7w0@^FoWl>4V4b$f@%tn4g+_)YVH^P?ikD{FmsHk(Oc=R1#E@%)cvoUVcf-jsi! zXBSI)yE0db^-PE8zE~v$cC`M)J@7?>q{+|r(wWT=*!nW)iqjFSKb3_Z^P98)dz}+pVx}thZv`jLkwXH5Ka6JO9 z)nD#Bx#Xj|Y;To7fB)iF9bJeNV@7Lnt9=h}%nnnQX5NnHD!%qDH-(3nb*toWDE zt`Ku7ebL0V^<`dz<`$g!$=|=N*$v*48jx!a+>0Y(_<5N^mevslMF{r&UCl$ z*iUY~i&lA?0fVC~8Ws=7j)0!5V30xmv@)G7GC-doMRz$d6?zs=K7LZD$c!nYGTS?_ zViKNxyfLVDD9PoG0m7z&V)%ZA#GH&2K-IK^h*>&^M$vUSldiidWix^pU_l_mI~XG= z@Q{q0)vaD{o8r4)#!jejlcwevhuKAV8joq~zJQinhqB*<2otq|VC0_%j|R=hnpte%${KIJ z^QDX*>3@d(9&20H#XJ{h?wwr}A;7^N)cy?`G~ z$eLMa5gdJ~oNuOSW0bLNbdnq!8m{Msqn+x(ICYOz-z?f4)z^GH7w5?G^$&7CNvQVO zlRV?vDk+Jj&tV|pbV)o4n@Zt~9auJ@r)#TL-COPn^=`Z$^OV?MvL_2Ex!u+%IOz<_ zP1b4uVHq|MmQ%T#I1&G7Kc`~fMO4XasX$r#bO_C7&Jv9fZ8&u}y?t^EfQi76fLsfh zd4?Du+57Z8NKTr+a`ms>C?@Bqp%gv3M`bfSEF$O$3+jFCmxxK1!M-|cBlJUUrV}(})92;VVyPoX-494=?1(E&-(371e z+-j|pymV&99Nq+J(q#tik}ZGHP5(xzK^OX71h_f~R*BB@9a{z~S4BJnc~v^J_fREm zi*O`j=IcaT7%?qaOFL zMxIgyF9bRL?S>ZlL}mHmqy2JR3n)+0UEjo7U5oMqrqux2WkWMl`oRL@IPYKzBfEKU zyUvNVF&{T$S)R(P9Q=@p>5m2C!`J$fsx$phlk5elBH9`lKnT3Ly*Z$ZO%Od`-#@<{ zcsWvPkYB5+MkT~XMdGhf7%=*)WjSHHAn zG5cMHK>y)=f(Sx2<`dJoX5Vvu#J>E?U*dA)KAVH;DT<(DrC!=P+xb0A5xmG^__$3* zWim|r*K@b$)uso+Gu>45oUXH->;-9)Ov=MUqnlAJoW5#yWWz2j$G;=W?Pc8>&p8F3 zEf93j6@^_4KEI=WILs}t6aaxwX*K!BEJ9KfMy)<%&t1j{&OIj2Tfs%vrKj>!NLo$m8>xM8$)M(}as1G0zDd+AM6j-D(!%!C-+ z$STgd3{{-k;dL;x*By}vIa1Yzyzs9;6*9mC+D9s!&BKbV-fw;c0~uxOarU0IJoMGl zX+8D>_rel<9j{xWv62E+cB68ri7$00!Sb1G#W;uLNXw47=#&%Zk7NR6lRV9ewUN(X zKOASK`s;T$FpoUe#|DN#wCb_MO7Id8A?utrRNv{8sy@k+e%Oe;#J%^qwkqpv@2s{$ zE6dBbXm* z*>H>8pVi?FP8{n64PhmDK1$&+^s)Sb#i_-E9GYi#&kW>Y{p>~T#gf9-L$^7~YcK9s zOeJvVAtJ)X@mJ?Kqnq7YGJ9^~|<;pw8JESrM*G>1Pd1=c4`b*zY{DG6*s`Fm|mnaB)Uq7W-LyvR% z+3OAYC8w* z*g8HSe75+kxQ6PRE`Rg^Ejc`=;s|#l=Xjt@n??k8(|tSKAv>LcqTBFu&W5Y#JbY+u zKj%9%4&mPsA(ks-#b3{uiQgLtFP5^Q}*-=Qv1k`qv<}8n(+ba8K2B5$c`_U z^ebW+eS!v7nu&BSP~G=D(QPm}TG?D}Wp0MC4MVbRF6)#;iA6iH!*heNwYYj!X3(q6RVyych{MLfHfOIit6tXq<)ing##l7 z5u+!V7a--517P(_p0@SXjdnC7F|JFsVv>>l0e{5G;Yz=NC!6Eo^D+aW^+(Gual!6& zSeOkD->d1vaw4kXsS4^^YDy2mz;F@znU-2SqSFo1=2a)8+?kilB(7Abp}dTK&CFZnI=V1PePqJ2gUG%8{;{@TTey;+v|Mi<$T@Ob>KyfdUGEL(#=h zwkT<^-qN3+->}#K%XJWZG-Ca^%eVf~r|-er2Rk7b0~VO5Os0?H!Jh2)*dj*e3g_C_?nC9EuVK0Aucq~c zez^ZoKnfU-B&G;vK}uS?hH~WM+|p!eTv#@5n6e#=*X96a?&;pz?B-&%UEKNqxkq3DgaA$j|PvBN$usxk`1D(`b07NJq`sA3)e*q z_hSB|u$Kt`^HP_o0kzD74`-2fCVHqkeIe#kF_SFYZPmgfP*g&b^@vUPT z*%y5Kb8#SAyP*w;II8&%J08&lH#Ibzp5B&@whG&)Yxwc^$0m_GujLt1zQm$hKd3yq zT+tquG^m@uw}KS^l|-31>2g?2c?O`}hh2}FWE3)2I~#XC+cPuL|6{`eKZohBpKrju zJ*;;6_DmSe(%u?t3ri8EC>dt8^fw`|#}c@SVQ?n{5QGCNCu`fLfI9db+4C2 zL5?Q&#Hz+6Ovv%Pi1X$xyA9`wnu%t8%+Qwf_clv{5|^h%1Pu_|F4=Zy_&K@92Ay(x#r^DYLM;6U_ZuZSW|mT-QG-zUWq^{?74R^C~f43mI2LH zsIAa4lR!j#?&pO)H9{ci3F#bD-W0td|5BWgi99*^1W#tG4Ji5J9eab4J zk^nd*K)f@=^gl5(sD(ZxA|ftrK$(5*!9h}f#@J9=U$CUInkLer=edZ~lpTzE_{1Z!9W5^e!hE=OXnPLvt2SD7tk; zp`am4-n3sb5RxMQ+4S*n>Zn6%RSox9uslZ&e#Fd_z^OMqP#yd1iS?pSarJvCy((VSIe0CDnbUZCkv zHM`HaPB`gb>uX0(4=o=9LRkfjDTv1OR`7EwK?PjOycf!?=IWx3kS5g$|3zpQC?5s} zo${x6+dHiY`aAznqQ2Eo9W_x)BCdNEn~gQV4k?1vg?V0Vt%n`3&m}9vGEIvVXv95k zouNd4N@hiA%;dqv)7=xl096~mxkmHx0v)X}V#^pH{^zQt`e#%HPgGYUSaYTS3kB^1 z0*wCUuD>%sss1wk?l1tF*2~juB${h@?K&sr+7O6J2k&Rf4OKrDMyX@f&1Kw=)2kmZ&kNdU^of!sh*IKnr|Ng{PMDKj9%Vvchr1D<>^6qcsM9su?GpxU#@+T zaprQ|nL`Aw%DworwR;%NWpOr~H=DJeQ+?bB!rd3Dc4NWx0%?XiD2E1<@+)X*J;cLv z>1a1SIaohk+wB5b3@;$rleyc{3Yya$=&Fs?)uC1h|9<-ikncLAZ9kq!L9{r(U>h6= zoH;{M?yj$?sT&d9dwYdM+K!Ix={<*&_E*UnMk*IN-}gzNmxs(oG*_A_6E>iw>tVY$ z+;d7^s+~CiT1ZIlpAZP1?;W2VPr95Jv8QLGr#mbl4MjM9MMs0!?vt+S-{|wNP+=h< zl7n23)s5t}^Ra0eAOEyk4EHBujuqV8O%VPrSzY;UD?yxmqUuw5d9<^U>e2>(c{O_4 z`ywElC{I}&bO6RUEJQ=AUO&dxU1@*9I^l}0^ztVFEe zJ}+e$#+#b#kvsZbeCLI#*ZdpuZICS5+SNTtO_$L+2vW-jiVE_INjYF{p&%a8Mi4|y z1Lf2nm?x!AEdXK>1W?uIC~K~;yP7Bepf@!w>ZRhcI(i2}c&BPSp%v3&rXBqDldR}A zX1h(Krjins7GV4Q_9XFv)Dg8artJnfF8Hme`C)x-NpDpI^rfA)7f|xy&70;_9#EiN z7@tjxB;7J*Bkmc1^`)VXH{E@u>8hL$&z%pnfR(>XVApWfSBG)}@$q0SSO8_z5mm&R zUFEdc8KXOKhr(eC4|;kRjGljSmiO4p8q}CNEn;!BC>4M5_}y&_p#Grz*6D}bl0HIR zg{C%-u$uq?S~&i)^}MHkRq=+2Jt-t zJx-k*`{B_RcwJKAOfYAyDn-7@&*%FWw-1kOQE2x(zM-SzQHD}fkaSM+32SaYT~SFI z)WR~gCOsnC?565pf`oXkYGZwQiH{au!&n6#NmPqlyJd zCnU1@u^97n{UZH3)>1qy$+K$1IC zL>t!5u1Fw6a|l#So-0ZY44RMn`(e7exQKRyJQx4@GqkSm`Pun-L)&aq5ZHaU?s)s` z_&%cf`9Y!n1v4}A^7WLoG}p7`G*HwXEO?@7qqsM2KhAG9w>3AX2SX(@!kDr%3fToV zA?&uZYsk@JsPmd{)4tRB{*VUE#T^0MW%dSQafn=A^;Y3y0!T~nnsINnITxJZ z*&H;?&OOYNhKmMv{sAPt?y8^PfF{A#)(*)Q=?R2$-*%rkwBjTjVBZS7$a42hKLUD5 zsW!^z&%u~+N1j!8`1AJK#sVmEv|a$Mxb3DnF&ws%qM{9m{Z-NPN5TAVc3y$soj0n{ zpyZ{;q)6Lk-z(j53w0+MYjJ(Oz+gQJJV2$H<)=pYXs#@SX?OfvT?HGPaed!aPBVwY z^FzI#Yn|NI;K<1Yl5kFpj`BWdtwSP#9}cLD!P&$lPReGx73L{JJLeZf$~PeZHcrLw zQ(6!yx8=Je<*rCqIgqYozJKn7gWtt_2-Pk&*lwDvKySs!i2xFDeR`fqi-kB4G^V$K zCQv?perVNls_}<3H5&fyqet@u1YqbyeVi78pDPJJY>mD4+ zpiNP5JhvTkKS8Fc$W*u1OiNNITne(7C@z*Iz*ZloG+!l9qp+w4i_rc}@R0DiW>&!1 z3wuC3rIPboE=8wk`%#sZI|8YEUEg>cu{@*dNs0z__5KL=ph4L!Zm9c-HnZHO-~`$* z5YpE=(@O7OcYPF5Oh7<@5ig`>EziSyCIEALCZ@m0Y`KJo&LCMCeXqew6y|WJ0;Q5BkY%( z!RiLK+}Nq%y$k)r(g_f}Q&i06ac~6P4Fv9KB?aY~`EA}wqdF8-tOO~WQFm5k!R7Qy zCDya)@c8tmfP?e6YaHsdXHxEu#1hG*c1HP$s2@&nkye(9BE(^*-O{t>!6e);UVFTo z3b3tR(=nin1%SpsJYLC%hDBJ?9e>M-aNjJg08-_`1BmgNm~I`O9v7<@U9$(eJs($w{$ z@PatZ&Z)>>dskcIGvyNkXeS`{e^Tx`Imjt+G8A7WOcNY6vn)?kpRP!^o%KHBa$o#C z2Ic~2gnNR#>C7i5_NciHWtxHTb;~rgrJ$TdmpAmOd&TpMtv<@F~Zzy%zafDc)fuVALPy{ zoG)j&O`uG|AeS?IkV#*0Gz*>BKfLF#bIz* zBTk)8gUMN@mtev?o+voz+R9Vq8?R`*AN^iKq10x-_Bjo%l5!aCIK|Vb^N+7?>`vq~z1i+2u>m2jRTFNBjgy>P4K(P;u!!aL>Di^JmkGCkuTX>5qI4x3 zqPbqaJ27T$q|yfi7pemkHOf=zcA&&5b@3e@{**Z7gxP0};{)S%@(KP0(d?D^fM6Wl zYo&hi^w(a7EyyI*pcVRBi~8J@gr(wkILj=!##_Nl$w0^Us@;qO;QJ{C$$AT^z#b0v zG2^o@z?%RbQ@Y^7WOFtkWV&^Y@bfKSoXvxN&o1~lV&!N#N!=crKj7@_6ig=Yac9Xm zU>xV-E!d#CvjF)bc64~+?d&Vtwfiv5NG82o2)gSGQ>~Pg8BZSNJj9jn>}>nlHvh%# z?d8|RgWPhOq?UA)<}NVDEG1k1%r?8&^s=uvgx+07G{qB4SX3#EU@qG$T{HnK&}bqr z&UDNIO^7am1A7ZLHjb&?iX(3!Rp_oJ+=t0LJzwH zdEW0wqWCKK04{Ae2=z;Ro|0&Iuo!zq`Sjq`} zHZNZ3O?f;El$GVST=~6}=4>Xn+6K|=K;3W#5VP=Cp*z@*L075W(NfJ;?p--tW>XbV zse|)`t-_c!j~e*n2HCf_cR;n=HkZBjs5!97Kjr`!58Eg@@7r@g;(!_o-3-~B(K6@N zscXU?`abBhEUVVagXY+0H@ux3ODph&|HT4M*m$9JUO^=MuUY9e_ddaau2TFFj@NB( z;Jmk(tl@8gNeJJ;-XtU&k`(Ne?R3W70Dd@PR;vnC$Gj2a7xT0jE}Is7 z*PoPKH%o&Wdf-}ANDKO0_Crk&-KqTQhOn%R;R5%F;RR4*!oUb^PbK3R*DX%rJkx+c zE@t;k6yU_1B4C(4tkbT1qcRn5S*+Tw;GL_=fJ4OV5?_osS!AcTTbm$!Nc>FKKX{=- ziGBcBG5p>R0~;_@izaHBrn`_8xu@LD)?2jT8n zjvy@~^F_p_t@(aMjsRFlvlk6eHs^A1fnr#n+fn8R(d@4u+pUj(j7b4qJk$M_rcMKE z0X1)*`A49i;$ikooi=Fm@|G(P^)smDZ5_2FfvB0j^Z^QYl$&kQK?N4UrfJug@j>%^ zy#`z*C4&ElySEIAI_&#LF;Nr{DV0)CK~h9OT3YE|SW=KK=>`>%5)g1f8fkV}mX0Mw zI;Fc=x|gL{{ukcQJ#)^xb6!1X4$e3Zv%CKG%5Qw)%#&2uXK|nG_S3u#wr`iX!Z1nXfAJ`tHrW%ojK7N{1RJ(`UIsa1= z!8=}Q8)KHucXElh$|5PhY-MSD&-$U+xjTM>)i!gv05mPqJ+@YekAVPrdJAc242IHl zjW1u&XEB4t{C$?GnYp%?MTu0QmZDIhPikG>*|QhyXv3{ba~t*})n%gxgY8*&l61v# zWp3Gy6_?ih+?n@q0(S2oYp?JW^+zz%T3VU_GpK8aKRnx&ZJjZ3s5;^}WQCZ3vl`oHjjfVpgK3 zmc=o2d)c>tSxMX7F7&@}MJVn9JOmqS#u4u z?R^fs%98=J01beOcvZ>RlQHsUjw}No?)Ez%IUMCl`5;yEmBQ8)VsOb{VqjmMXTyLkNPxVjB(?sE?L)iCoH+v&)P*t@g>zB*O+muC<{b>%0eey(_ zvzznEF|it}=3Lm)(h}cEZKLe;y7}Y>8b0W9T!wm>r)c?P`1Nbol@pvxT}+FLd329B zdDja@{m2x>+OxL)k?->fKy{0Hc4aX-DdlM_n?`#F@7hFz6P<*^AcQK_G?Fq zK+}gY1X||k01o;acHf%O>Sh4TB`N7kw~4j~Yp7BJo|6YZ_3a%#m_GYn935(F<@?S+ z&Z>_Yy96~1p#@z_%`caIMSXKu+U#)Imp#0Wz$si{$rE{LbVv$0f!-Z(7!Tc> z-3d&w%JfscquL7?<@@W?xRw^YO%laj3bU$jZ0wJP1vqlGP}V-bh=D+Z)3r?7Z_iHXawSLbfT`?`w3e^IlN|} zN2TYr?5u;pQ6>xBra;9kD@(>>J6_r3NfHYCSqO=!?Pu<>7(g4QTmoEoic8{k$L^V< zW}rt)Y(MtO=5K3?76+yLO`_XW8@gM-bw`j_M0!5;t-SIIRlh!*;dTdKDd_cgj>H7; znHIh&`;^Acf%0FLy-Hgao2DE(%2>+E%nv+E0n@9ZtZha2ki;aj0kU)uGHihyHUCFgBqWO8xC)tSt$seR1>mXlRvpjzYXk^IoYO~jM;$`h-<`nYhuDuWw zS*41TeL}4~sFs21)4`-_r>AufhsSJsYV|LqicEiXf#Ef3H@2K_AJ5T*!&l*E%&-_r zE`xplH??_O%1@H-IH;^8@e7q^lIEeRZO=Ns(!tj5p}TmOkE zova#6BB5d!cDhj3GO=Ch0-{Xce>z)X%W!IwI*z}{o0anO@@&B6>mbChXVIUG#5ol1 z03o?zyO^TgsOW6+j2N+&uXJS&p`|5yU_eu?=Rx9+*m1^^5%!d#tw780vCg9Wy$OBJ zXoSXtu(98&^8=gd*0{}4w9EHl!A&l2P!pUi3iCtNGjPyaPhkS zeWmrrg((Xhz~gqcYk^JE-Y0)z%O{)RCqH6hstAK=l`(=a*C(O8PsY&>Y~f3H%@Q`Gf{a@FS8D(H#c@k|Z=QPyLmr92^{aX>R{|G>f$9{5KW6KC)>=v*v&wO5ptV zg3<~EL0A#(K0bnL#EKla-CMgL$gYXgrrs{ksc1puyi&b1s(b%)(ZLi=JAIN0`ru7JPITj4 zknLUQRbtFRX^N-ErjFaQ13i4tKE21kWw5{s)vnVD$IKf2|-> z$?E?l{sbSznf@c!K|tUy^WTo-^)Lde|GfG3gG>Ko4Sw(C<^Q0k{x?6+jP=s<+re!+ z|58+foG%1aMl6Ym6aNY|1e;}R!|9nPwB`S4y%N;_?|sSm+^eZ(ZLM-$Jw041loZs| zZ!dqOLd?0x?V{=|*jq$L3Ogy!ya>BGIoLP1>GC4MB=O3ss;YV$ z=S9~Pr`HtU%U4i5B)mxFg@ZyuLK}a$zWc?x>G>l&(0)+tLD1(po`B+-P?&#dWy9wl zigVbmn@TP#dr%b_W@WL1<`I}`tJ`EXa&nck^PA>oS~_lCt=QbmFqb1`3At)SF*7&&W$o9*j~3rb?aBRm z&g^-y++N>dAnv4G1U#jkn+~;8pUS(qMAh%qym(2(<3vi0vJNh+O)mE%wC1CqBN@1Q zUnf^-zgy~G1;HZ9L_2(6>Aud&u~SG7Mfb(;Z+{PZCon27y-%07b1@L&zP`0_&)i5Z zR%^~1Z-wW)nhQ%yD?Kr&PG(Qj0tLk`z%$Gsqydx8EB*;yKQZyo)&8R#dnX5xhTNG4 z5z(zqO7E=aDpZRxt1A(v)8scUGsKRNEheHj7yHz_r#A&S6oi{M{tnLtvS;Ffzqqe19cfr*Qj($^Yf zIt+%};gQ{^o1~<@(^ot%Ii$t+pH=-ekbr8NAUHHa2W=*ftVb)8cxut*ht$xQzB^fM zLM#gNy#JP)J8H}J_U+rs4?7Z`o?l^^0kN@e78W_q2k%Wy^=rK=E&H>e!56N7 zi;IiUTQZ5k7UNmSJwrBj_K8w2NO}HbhM$5yYy@pPULHyzf9n=CHMO6g81M@E_sI13 zgsCr=CSmXRe=Ek zNg{6hrvbP6Cc$9*NKVeTwmtL2DF6XBN(Fhv=-U#O#>P?3ZWDQOHc9Z*RFC2;;s9G*%?3GW5U}kFSOr=AQ1?MuE8wVf08RwTw zNJ^1kf0>>FlFns@c^{;$iP6-G0cIO+P22tw1b$OQwOC++@BnBV(~E zK2(jGQ}50*yL?P$9ulK9H;+mYaqDiFs8&sHE-Ncr9g2>MqN7VvP*7-0Wg%*w4vG~r zF?A`P8Ei#B^7RUfixJe&o~bE=3@KSz{Yp>GOxC^Kz1yUu{Cs%b0fWs5?Hm=kwM7j( z4Tu9T64&ZHm^CFpiH1MtKiJuU#e!a43`%>JVFso12#m}&O2B*XgNDYyN|3s;*ilKC z;^_UV8Z$D7#b%15l#;B2A=7^Ryu3(F zL`)Ft#(16b0)!RjwZAUlBG>@5uzx^tE%4J*Z?bV#c6QJPseBXJZU)V7YHkYn@+Al} z4Z$1e>E+p-O&nnvv)_I$Ug{ZNrgDH**xI3SIFBGL2s2oxoW6@N})`sqZU?oj&P+0Jv!#mx$la1n71z zvM16x?3c9Op`m7qnLb&l0T9>@1|rsl;3}$pm^HY6| zQlp*fj0Gtq-FLjc{BXAry+eUS+8do(yH8(MXNcHm#3PfUO-)P@*2u8Zq{Adw(#l-M z)~p<(0#;=jJc~$?(~^=s7Z-&8;5u$C^d=Qx>hEuih2H)x{yU(G2;gGCl%t(j7!5)i z>+9>U-J&kD9#>)y{o5(&a}xjar(Ui1=Z2Dx57*RGGh2y{ zOcuMhtsvj;81X9;W*VS2#5V-v&n_v^uug}C4kO&Kzl@-6p*NORMz7+!Bkg2uAX-{k zSHWPPt^xZJx2?&uv)JkJ(Xq{`a)evNl;;cPr%z6|5Ir&^G|#%*V%c@0fD+sKLSCHs zm&E2eQG8?|q08C;uE)i1U8Lfmm{bg<(uO-+TjN7|9R3Q##8&NZ5Fx0auI8#>u|1;a z?Fn1}<0Cq-_DiybB+S=g@6>RS?bZ*t~kLbpSL23R^N!0+S~6)9B_X=xH3$Qu)_m*T&DyG^Q0>QY*2Jsd;5{&Mrav!iQ! zTX*i?Peq?M%ZWl-2g1J4Fdl=he^%{=()&C9dhYHOH=sz}I)eR2IVQi9UL+xPN}&9S;4?;_e@hr8Z>awwmD()S;!wIa{igse}oT>HyolI($j0b+tSDsSJmnfQOT zSQKzSe649URcx;efCpUazTA9#D}VD%yiYsE-E0qVJIL>f$8H{8hs3MAdk10ijYUE4 zf|m!oC3Wf7gd{TLb4V^<93vxj`?KUHQR?LSNt0}-nh%(7r7&bdXdqrLNx5|8NnkexA}fK`kHmFV6|7Rt=g*e~eyD3}JF}^3#<0Mxw3VbrN$5oH`Z3jdm2Xm7 zA@t;asc1|kk~1r56sqFnk+|h)urMo;hlht*iU}8}n)*7s;i*YR;m1@HlM~j2!&Bvc z_7Qf1DVgIX4#mGCg!y*+;$UqLk~1?l(GD{9N<#Xpj#GU`^kxoCS3+2Tq?V z1B+abl`VN`O;jxoo+zGpZWvm}mpc9WjP8*7(1TE9%xh$ehKfPJ=OLGvEIWA(`pUn% z^U(eH+R?B<70wL?Pi=tTie(Bz!3`UxX38( zJ&rLkFud>w0% zWBy+uoQAb}8hYy+8~+I2=lM}lb2Wtf_%iRev7$+hJx8HSZkv<2%ymCC=!LfnQ|c1- z_qNUV=_XEkml!l#3*KSBKIw?LP5Mh6anP zt9L0W2TSE+Gcp?Ifz2iD^Vj+b7S0_*$hmU#k2iVM0*tB`M9C*i@pBl=WU=gM=6lAgd?t(E3Qd~x^~*V5mgK)M^q6lBvztU;WD4~)4ts~HLb_Fh z9Yd{Lz=Ja7-jTbw_^15S6OwiPYUf_%Y5YX0fxkE@DRg^HBKP#MUgGtR`)X>@2`}yX z@)b|OHEzll3%_NxxO0G2mQxaT+WeNY0B*3GnDR?n`ISBi`^8H=A+Njy^L#5_iTT;i zA-Ezu1UN*Hj)Zt}(PaF*O!c!_rTeBC=i>){m)-PTm9h|_<<5Sr9I-#WyT*lHqt!vs z_4Vpt|M{TH>UHH5A%}&%-z9tRcN#`Uv}t98N>?JkQ`C73$8T<&ytMjzTBdn%(Y((H zC2Q*17@7<+t|lv_l$B*x?@x$y;Qkg|5Q<1hXizYJFUN^lSkQx+i*e}Ip8l%!!7#sF zVFe>+Wo?caO;gLI5U{nem6m$zyfUz&&Jkb!9TNPrx7O$67`Fzg)WCG*PUIxd9k2C5 zX}~~!hzL@qrDp26M)+m9&53v4c(VSuZ$kk;%O>m9vLq9(mR)^#TmhT`N~|Z#wo*mM zhqox4%6C6kYjtkbzMO3WB_?1@*8$Cz4Naj`La zZKUMt8oJ2AZv(CK?%kRz{%V#iOGrW`o^wr}>gu)Ya1B;|$bnf{0&Z)(&ao?@+%8_w z8lHdv+K2|}U&9P&&e1=eQHhFZQvD!7nssW%$y|`gPU`!7Ykzydd|5l^<_#lF=8rDw zpXB0_BNrFv>}i}{Qs1Yc;lFL2!R()eOv2xOVb7HUA7H<`Hb7Eo%QxW$(z}XG zk958$@uKo_zu6<|jH<4-wv`k;F&t^=KV2<&ko}{J00TVy|C=(!YegetV>Jzp#~0YM z*H7mDd_HV_c)Tadn z1sb_T|B4DZ8L29!mhUpfA}Zqo)S5CXKHaqsbN2@c=fw*@l(;GN$ZQ2cT2TshH_G1K^KgnUJ3Yxs zMhkk0`rUncQ*mDz*LeS==shDI7{S1etgI}MRuA7brrSuQFeAFylbu?3|1F2+|zzixM}>1(`ESy7{5OP9%?dP z)%hNow7H@+c;|grGbe%716eQgHiL_#{Nw7~Pj|&o^?U5x&yt}ktr>@YS?pIWwdg%sude=_d>sUy+q|C@49NBTlD z{Qr$Q(*M2s27k2a+4A+8rx_UR--e$b?-Dt|KVH^C}LR`9I+9H`kEPUY-UOID$ zQ`%;#(sd=}mh1X>R7@n}8QWptN3R*qb8g51N&_oJ@llH4*6Y#*>V-`6j8&+vw%*Sl zF&WwJ3VJ`{a^o}<%aLU-)XDp^W;rmJ{-p@R@M;z=!w~d`#fDt?aCA&^n#SVv#bW?R zdaPES&fMziRNZj8B2Af~&t}D8B;NOG#y%7%?%W}GDPErQEH6vCWi zaGvZBg3cIx;mmQ^tCgvFhRd7iDtwFHWSv?UxhlcuwsHHqN0$x+VDS2}b|rKQX3=zX zWQs81dweqEW$jY`)euutar{nyAV3JkM#gO}&t$0lT*55LH0yEm@=m&0KqSc~h{OG`_P zl@r#HDV>Ws>+!m10S6P?WdG!eR3m_x?L&X+hIIeDc=dPi{nq)V5+nl{ounxvetQGI8W=UrT(e#o zk|8pRB4VLsN_!Ix;Ln7_W`RX_f7kfP&&o>#gXAf9Vk48LGWC_gL7__{#K2YO6X=Fv z!w$$k52y@4mfBi*?naUmhR4#S5>4uhJZ^h~Wntc>prX48ofe8N|6~B$)~K~Fvvqj2<^5-{^H%Bl@&+*~ zq@=KlizohP(+~f{4uu{$A+OmVD7TM?kJXMMHp&96_5Cu@N>ZQvIGLHpo5#9y5}p0# z)TurSsp{!fyEjcFR!N+jL;t|Z34r-pu&l)MLf z0hks`tr@#ouP|T%WV)#*jnWAy<~{hr_f5INcXn5&3lG`+3NP4RUiq`yRq2iU92^X2 zB7+OFi?FB|Mp3dht|U7B6z@HqE~cMhFxyXZl@>>|JUr5qg2dg1qQx!;*H^Y=1tMkF zR7-Y$YhB(9%lXOXVm;iiK-N1Vdo0Q+%5Ev*^j9oCwA3`V{?un-@L1Mhmf`czBZJFu z$sUH{!ww3cG`8wZm;&`2Wsb&Q$Y2qj~6QE zKh=s44V9gFk-T{Ef-2bKNWh#k(WbW|Oz$xdkN#;{Nr4)un#GyfT9Q+ZwGIpnwDfZc z@a6(lUTY^9f_N8&S)Aj9*gd|lAB@&6*Ye3deFll-hCCRuW~8Rbeh|qW+oU1+(eS%_ zTvTLUXHRr&lfb9YVy|)%pT;7VDofef%+_0(PoB`{(9;|N3q+eGw=fYR2 zC)hPNH#7IpBB}dSE`MC*;V-{8VZS`(FT}S2U0PdN+FTsXd)GlETi|VK(8EdE)`I>% zF3b#C>422t2FIW|x^K+0T}`t3oSe{!$zU#^jczM_WKwTum`A4KPO zN=SBat6$!}hOHc#P)XghZvFG8sU&kqjBh8~Yy1z6E-~ox!;jZyltA0o)58;C2wboA ztH{`tBx@$Bn{=`gmob~QhkF59nh*@ z&v{7q5FCp`tAStit3B~?%m&{HX2Jn$n0T2dqom}e=+5z{KUGmtXdfbeS(ehuU(eGx29cB zS_s`N#TN!!tk{wcyM16J`ba?a(dtf0-oiBpbX=_4+Wzaz7s~ITuG6*fg4anuQJt~m zrVhg<5^FCHy?kVh`!r7{-h7+(vhV^2*&k0uO}H*E1>R*UHG8bc0H!!TwVI~EO9U4C zjAv3u_UAzo`f**A4+svx+^^KK=6?{#JC6492M6v?ZgrNdQUltCdqSUzDc626N z$Nwz#;{RlIpJhoT2RSi!8-%!L^xSdCdB(vJ_rl2$;d|zA-F%4p^Q(SS)!oXu;a7Px;4-Irrh3=hl%bP-sCch!9&P)*P zv&SS#QkS-GvlEn;dn}DzhN-c?H#61N9SsT?6L&#L8Ah4Q7CRLwCki}JL#%UO>UB_U z%MCUb&l4nbc>JoM3>`)DcKC|7KQAKeTdnuZGJWC9%I091N6SPtEkDF9QW2jf32vU! zLv4ZVWUG!z!4)KJ?F%0D12^+ixLumSSMz?2M+WWv{ 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 NL`q4rSp4;e{{zP@9=HGi diff --git a/deploy/k3s/evidence/department-2026-10-09/final-jobs-mobile.png b/deploy/k3s/evidence/department-2026-10-09/final-jobs-mobile.png deleted file mode 100644 index 2e771b27f6e7a08cd8867791ef32e966c176b622..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55278 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 LDE9`}tGE6I_HOY- diff --git a/deploy/k3s/evidence/department-2026-10-09/final-overview.png b/deploy/k3s/evidence/department-2026-10-09/final-overview.png deleted file mode 100644 index a9a5d9b6167d6a47a061e7788e7347e4d1192010..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96399 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 p8cc)hYgcYd7jS@nvv=M>^VYT@_~bMB:78 - Initial ttnn.CONFIG: -Config{cache_path=/root/.cache/ttnn,model_cache_path=/root/.cache/ttnn/models,tmp_dir=/tmp/ttnn,enable_model_cache=false,enable_fast_runtime_mode=true,validate_program_args=false,throw_exception_on_fallback=false,enable_logging=false,enable_graph_report=false,enable_graph_python_stack_traces=false,enable_detailed_buffer_report=false,enable_detailed_tensor_report=false,enable_comparison_mode=false,comparison_mode_should_raise_exception=false,comparison_mode_pcc=0.9999,root_report_path=generated/ttnn/reports,report_name=std::nullopt,std::nullopt} -2026-10-09 05:50:26.248 | info | Device | Opening user mode device driver (tt_cluster.cpp:228) -2026-10-09 05:50:26.248 | info | UMD | Cluster constructor started. (cluster.cpp:389) -2026-10-09 05:50:26.249 | info | UMD | Creating TopologyDiscovery for architecture: wormhole_b0 (topology_discovery.cpp:96) -2026-10-09 05:50:26.249 | info | UMD | Starting topology discovery. (topology_discovery.cpp:115) -2026-10-09 05:50:26.250 | info | UMD | Established firmware bundle version: 19.4.2 (topology_discovery.cpp:575) -2026-10-09 05:50:26.258 | info | UMD | Completed topology discovery. (topology_discovery.cpp:119) -2026-10-09 05:50:26.302 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 1 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 134777867474752) (cpuset_lib.cpp:440) -2026-10-09 05:50:26.302 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 1 ch: 0). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-09 05:50:26.302 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 1 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 134777867474752) (cpuset_lib.cpp:440) -2026-10-09 05:50:26.302 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 1 ch: 1). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-09 05:50:26.305 | info | UMD | Opening local chip ids/PCIe ids: {0}/[1] and remote chip ids {1} (cluster.cpp:173) -2026-10-09 05:50:26.305 | info | UMD | IOMMU: disabled (cluster.cpp:147) -2026-10-09 05:50:26.305 | info | UMD | KMD version: 2.5.0 (cluster.cpp:150) -2026-10-09 05:50:26.305 | info | UMD | Cluster constructor completed. (cluster.cpp:648) -2026-10-09 05:50:26.306 | info | UMD | Starting devices in cluster (cluster.cpp:1188) -2026-10-09 05:50:26.310 | info | UMD | Starting devices in cluster completed. (cluster.cpp:1196) -Tenstorrent devices=2; torch used for data/metrics=2.11.0+cpu -Opening Tenstorrent device 0 -2026-10-09 05:50:26.386 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-09 05:50:26.386 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-09 05:50:26.386 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-09 05:50:26.386 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -tt:0 step=0 mse=0.18213829 -tt:0 step=20 mse=0.00123700 -tt:0 step=40 mse=0.00011524 -tt:0 step=60 mse=0.00006454 -tt:0 step=80 mse=0.00006277 -{"backend": "tenstorrent", "device_id": 0, "initial_mse": 0.3193739652633667, "final_mse": 6.238709465833381e-05, "validation_mse": 0.00017507212760392576, "max_weight_change": 0.3046875, "checkpoint": "/checkpoints/mist-28ba381f47c609714d91aafb/tenstorrent-0.pt"} -Opening Tenstorrent device 1 -2026-10-09 05:50:40.978 | info | Metal | Fabric config changed from FabricConfig::DISABLED to FabricConfig::FABRIC_1D, reinitializing control plane (metal_env.cpp:337) -2026-10-09 05:50:40.978 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-09 05:50:40.978 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-09 05:50:40.978 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-09 05:50:40.978 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -2026-10-09 05:50:40.979 | info | Metal | Enabling FabricConfig::FABRIC_1D only for dispatch. If your workload requires fabric, please set the fabric config accordingly. (device_manager.cpp:291) -2026-10-09 05:50:40.979 | info | Metal | Dispatch on FabricConfig::FABRIC_1D with 1 Command Queues - (device_manager.cpp:299) -2026-10-09 05:50:40.980 | info | Metal | Initializing Fabric (fabric_firmware_initializer.cpp:296) -2026-10-09 05:50:42.982 | info | Metal | Fabric initialized on 2 devices (fabric_firmware_initializer.cpp:444) -2026-10-09 05:50:42.982 | info | Metal | Fabric Initialized with config FabricConfig::FABRIC_1D (fabric_firmware_initializer.cpp:313) -tt:1 step=0 mse=0.18213829 -tt:1 step=20 mse=0.00123700 -tt:1 step=40 mse=0.00011524 -tt:1 step=60 mse=0.00006454 -tt:1 step=80 mse=0.00006277 -{"backend": "tenstorrent", "device_id": 1, "initial_mse": 0.3193739652633667, "final_mse": 6.238709465833381e-05, "validation_mse": 0.00017507212760392576, "max_weight_change": 0.3046875, "checkpoint": "/checkpoints/mist-28ba381f47c609714d91aafb/tenstorrent-1.pt"} -TRAINING_PASSED backend=tenstorrent devices=2 -2026-10-09 05:50:56.847 | info | BuildKernels | JIT cache stats: 0/58 hits (0.0%) [0 cached, 10 build-once dedup, 0 merged artifacts, 0 merged genfiles] (build_cache_telemetry.cpp:207) -2026-10-09 05:50:56.847 | info | BuildKernels | JIT telemetry: 2 registered TelemetryTokens (build_cache_telemetry.cpp:230) -2026-10-09 05:50:56.852 | info | Device | Closing user mode device drivers (tt_cluster.cpp:513) -2026-10-09 05:50:56.852 | info | UMD | Closing devices in cluster (cluster.cpp:1201) -2026-10-09 05:50:56.860 | info | UMD | Closing devices in cluster completed. (cluster.cpp:1210) -2026-10-09 05:50:56.860 | info | UMD | Cluster destructor started. (cluster.cpp:916) -2026-10-09 05:50:56.860 | info | UMD | Cluster destructor completed. (cluster.cpp:919) diff --git a/deploy/k3s/evidence/department-2026-10-09/mist-8644eccafaf0b42c3d4add05.log b/deploy/k3s/evidence/department-2026-10-09/mist-8644eccafaf0b42c3d4add05.log deleted file mode 100644 index 3886ab9..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/mist-8644eccafaf0b42c3d4add05.log +++ /dev/null @@ -1,18 +0,0 @@ -CUDA devices=2; torch=2.5.1+cu124 -Training on cuda:0: NVIDIA RTX A4000 -DATASET_LOADED file=/inputs/regression.json -cuda:0 step=0 mse=0.08051129 -cuda:0 step=20 mse=0.00135718 -cuda:0 step=40 mse=0.00003812 -cuda:0 step=60 mse=0.00000139 -cuda:0 step=80 mse=0.00000006 -{"backend": "nvidia", "device_id": 0, "initial_mse": 0.08051128685474396, "final_mse": 2.4448332247573035e-09, "validation_mse": 5.969065242084071e-09, "max_weight_change": 0.09999077022075653, "checkpoint": "/outputs/nvidia-0.pt"} -Training on cuda:1: NVIDIA RTX A4000 -DATASET_LOADED file=/inputs/regression.json -cuda:1 step=0 mse=0.08051129 -cuda:1 step=20 mse=0.00135718 -cuda:1 step=40 mse=0.00003812 -cuda:1 step=60 mse=0.00000139 -cuda:1 step=80 mse=0.00000006 -{"backend": "nvidia", "device_id": 1, "initial_mse": 0.08051128685474396, "final_mse": 2.4448332247573035e-09, "validation_mse": 5.969065242084071e-09, "max_weight_change": 0.09999077022075653, "checkpoint": "/outputs/nvidia-1.pt"} -TRAINING_PASSED backend=nvidia devices=2 diff --git a/deploy/k3s/evidence/department-2026-10-09/mist-aeba50ca436d70aa879381ce.log b/deploy/k3s/evidence/department-2026-10-09/mist-aeba50ca436d70aa879381ce.log deleted file mode 100644 index 13c62c2..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/mist-aeba50ca436d70aa879381ce.log +++ /dev/null @@ -1,56 +0,0 @@ -2026-10-09 05:50:26.124 | DEBUG | ttnn::78 - Initial ttnn.CONFIG: -Config{cache_path=/root/.cache/ttnn,model_cache_path=/root/.cache/ttnn/models,tmp_dir=/tmp/ttnn,enable_model_cache=false,enable_fast_runtime_mode=true,validate_program_args=false,throw_exception_on_fallback=false,enable_logging=false,enable_graph_report=false,enable_graph_python_stack_traces=false,enable_detailed_buffer_report=false,enable_detailed_tensor_report=false,enable_comparison_mode=false,comparison_mode_should_raise_exception=false,comparison_mode_pcc=0.9999,root_report_path=generated/ttnn/reports,report_name=std::nullopt,std::nullopt} -2026-10-09 05:50:26.323 | info | Device | Opening user mode device driver (tt_cluster.cpp:228) -2026-10-09 05:50:26.323 | info | UMD | Cluster constructor started. (cluster.cpp:389) -2026-10-09 05:50:26.324 | info | UMD | Creating TopologyDiscovery for architecture: wormhole_b0 (topology_discovery.cpp:96) -2026-10-09 05:50:26.324 | info | UMD | Starting topology discovery. (topology_discovery.cpp:115) -2026-10-09 05:50:26.325 | info | UMD | Established firmware bundle version: 19.4.2 (topology_discovery.cpp:575) -2026-10-09 05:50:26.333 | info | UMD | Completed topology discovery. (topology_discovery.cpp:119) -2026-10-09 05:50:26.366 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 2 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 125262848497472) (cpuset_lib.cpp:440) -2026-10-09 05:50:26.366 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 2 ch: 0). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-09 05:50:26.366 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 2 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 125262848497472) (cpuset_lib.cpp:440) -2026-10-09 05:50:26.366 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 2 ch: 1). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-09 05:50:26.369 | info | UMD | Opening local chip ids/PCIe ids: {0}/[2] and remote chip ids {1} (cluster.cpp:173) -2026-10-09 05:50:26.369 | info | UMD | IOMMU: disabled (cluster.cpp:147) -2026-10-09 05:50:26.369 | info | UMD | KMD version: 2.5.0 (cluster.cpp:150) -2026-10-09 05:50:26.369 | info | UMD | Cluster constructor completed. (cluster.cpp:648) -2026-10-09 05:50:26.371 | info | UMD | Starting devices in cluster (cluster.cpp:1188) -2026-10-09 05:50:26.374 | info | UMD | Starting devices in cluster completed. (cluster.cpp:1196) -Tenstorrent devices=2; torch used for data/metrics=2.11.0+cpu -Opening Tenstorrent device 0 -2026-10-09 05:50:26.449 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-09 05:50:26.449 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-09 05:50:26.449 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-09 05:50:26.449 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -tt:0 step=0 mse=0.18213829 -tt:0 step=20 mse=0.00123700 -tt:0 step=40 mse=0.00011524 -tt:0 step=60 mse=0.00006454 -tt:0 step=80 mse=0.00006277 -{"backend": "tenstorrent", "device_id": 0, "initial_mse": 0.3193739652633667, "final_mse": 6.238709465833381e-05, "validation_mse": 0.00017507212760392576, "max_weight_change": 0.3046875, "checkpoint": "/checkpoints/mist-aeba50ca436d70aa879381ce/tenstorrent-0.pt"} -Opening Tenstorrent device 1 -2026-10-09 05:50:40.352 | info | Metal | Fabric config changed from FabricConfig::DISABLED to FabricConfig::FABRIC_1D, reinitializing control plane (metal_env.cpp:337) -2026-10-09 05:50:40.352 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-09 05:50:40.352 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-09 05:50:40.352 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-09 05:50:40.352 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -2026-10-09 05:50:40.353 | info | Metal | Enabling FabricConfig::FABRIC_1D only for dispatch. If your workload requires fabric, please set the fabric config accordingly. (device_manager.cpp:291) -2026-10-09 05:50:40.353 | info | Metal | Dispatch on FabricConfig::FABRIC_1D with 1 Command Queues - (device_manager.cpp:299) -2026-10-09 05:50:40.354 | info | Metal | Initializing Fabric (fabric_firmware_initializer.cpp:296) -2026-10-09 05:50:42.326 | info | Metal | Fabric initialized on 2 devices (fabric_firmware_initializer.cpp:444) -2026-10-09 05:50:42.326 | info | Metal | Fabric Initialized with config FabricConfig::FABRIC_1D (fabric_firmware_initializer.cpp:313) -tt:1 step=0 mse=0.18213829 -tt:1 step=20 mse=0.00123700 -tt:1 step=40 mse=0.00011524 -tt:1 step=60 mse=0.00006454 -tt:1 step=80 mse=0.00006277 -{"backend": "tenstorrent", "device_id": 1, "initial_mse": 0.3193739652633667, "final_mse": 6.238709465833381e-05, "validation_mse": 0.00017507212760392576, "max_weight_change": 0.3046875, "checkpoint": "/checkpoints/mist-aeba50ca436d70aa879381ce/tenstorrent-1.pt"} -TRAINING_PASSED backend=tenstorrent devices=2 -2026-10-09 05:50:56.182 | info | BuildKernels | JIT cache stats: 0/58 hits (0.0%) [0 cached, 10 build-once dedup, 0 merged artifacts, 0 merged genfiles] (build_cache_telemetry.cpp:207) -2026-10-09 05:50:56.182 | info | BuildKernels | JIT telemetry: 2 registered TelemetryTokens (build_cache_telemetry.cpp:230) -2026-10-09 05:50:56.187 | info | Device | Closing user mode device drivers (tt_cluster.cpp:513) -2026-10-09 05:50:56.187 | info | UMD | Closing devices in cluster (cluster.cpp:1201) -2026-10-09 05:50:56.196 | info | UMD | Closing devices in cluster completed. (cluster.cpp:1210) -2026-10-09 05:50:56.196 | info | UMD | Cluster destructor started. (cluster.cpp:916) -2026-10-09 05:50:56.196 | info | UMD | Cluster destructor completed. (cluster.cpp:919) diff --git a/deploy/k3s/evidence/department-2026-10-09/mist-b46534ddeb9f18852b75f645.log b/deploy/k3s/evidence/department-2026-10-09/mist-b46534ddeb9f18852b75f645.log deleted file mode 100644 index 74e595e..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/mist-b46534ddeb9f18852b75f645.log +++ /dev/null @@ -1 +0,0 @@ -ISOLATION_PASSED diff --git a/deploy/k3s/evidence/department-2026-10-09/mist-e5c04ea2cc126a786d6fe783.log b/deploy/k3s/evidence/department-2026-10-09/mist-e5c04ea2cc126a786d6fe783.log deleted file mode 100644 index aaeffb1..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/mist-e5c04ea2cc126a786d6fe783.log +++ /dev/null @@ -1,58 +0,0 @@ -2026-10-09 05:24:57.648 | DEBUG | ttnn::78 - Initial ttnn.CONFIG: -Config{cache_path=/root/.cache/ttnn,model_cache_path=/root/.cache/ttnn/models,tmp_dir=/tmp/ttnn,enable_model_cache=false,enable_fast_runtime_mode=true,validate_program_args=false,throw_exception_on_fallback=false,enable_logging=false,enable_graph_report=false,enable_graph_python_stack_traces=false,enable_detailed_buffer_report=false,enable_detailed_tensor_report=false,enable_comparison_mode=false,comparison_mode_should_raise_exception=false,comparison_mode_pcc=0.9999,root_report_path=generated/ttnn/reports,report_name=std::nullopt,std::nullopt} -2026-10-09 05:24:57.853 | info | Device | Opening user mode device driver (tt_cluster.cpp:228) -2026-10-09 05:24:57.853 | info | UMD | Cluster constructor started. (cluster.cpp:389) -2026-10-09 05:24:57.854 | info | UMD | Creating TopologyDiscovery for architecture: wormhole_b0 (topology_discovery.cpp:96) -2026-10-09 05:24:57.854 | info | UMD | Starting topology discovery. (topology_discovery.cpp:115) -2026-10-09 05:24:57.856 | info | UMD | Established firmware bundle version: 19.4.2 (topology_discovery.cpp:575) -2026-10-09 05:24:57.863 | info | UMD | Completed topology discovery. (topology_discovery.cpp:119) -2026-10-09 05:24:57.900 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 1 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 136277795993408) (cpuset_lib.cpp:440) -2026-10-09 05:24:57.900 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 1 ch: 0). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-09 05:24:57.900 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 1 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 136277795993408) (cpuset_lib.cpp:440) -2026-10-09 05:24:57.900 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 1 ch: 1). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-09 05:24:57.903 | info | UMD | Opening local chip ids/PCIe ids: {0}/[1] and remote chip ids {1} (cluster.cpp:173) -2026-10-09 05:24:57.903 | info | UMD | IOMMU: disabled (cluster.cpp:147) -2026-10-09 05:24:57.903 | info | UMD | KMD version: 2.5.0 (cluster.cpp:150) -2026-10-09 05:24:57.903 | info | UMD | Cluster constructor completed. (cluster.cpp:648) -2026-10-09 05:24:57.904 | info | UMD | Starting devices in cluster (cluster.cpp:1188) -2026-10-09 05:24:57.908 | info | UMD | Starting devices in cluster completed. (cluster.cpp:1196) -Tenstorrent devices=2; torch used for data/metrics=2.11.0+cpu -Opening Tenstorrent device 0 -2026-10-09 05:24:57.985 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-09 05:24:57.985 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-09 05:24:57.986 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-09 05:24:57.986 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -DATASET_LOADED file=/inputs/regression.json -tt:0 step=0 mse=0.06471165 -tt:0 step=20 mse=0.00108452 -tt:0 step=40 mse=0.00004048 -tt:0 step=60 mse=0.00003227 -tt:0 step=80 mse=0.00003213 -{"backend": "tenstorrent", "device_id": 0, "initial_mse": 0.08051129430532455, "final_mse": 3.2111081964103505e-05, "validation_mse": 5.255065480014309e-05, "max_weight_change": 0.0986328125, "checkpoint": "/outputs/tenstorrent-0.pt"} -Opening Tenstorrent device 1 -2026-10-09 05:25:13.424 | info | Metal | Fabric config changed from FabricConfig::DISABLED to FabricConfig::FABRIC_1D, reinitializing control plane (metal_env.cpp:337) -2026-10-09 05:25:13.424 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-09 05:25:13.424 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-09 05:25:13.424 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-09 05:25:13.424 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -2026-10-09 05:25:13.425 | info | Metal | Enabling FabricConfig::FABRIC_1D only for dispatch. If your workload requires fabric, please set the fabric config accordingly. (device_manager.cpp:291) -2026-10-09 05:25:13.425 | info | Metal | Dispatch on FabricConfig::FABRIC_1D with 1 Command Queues - (device_manager.cpp:299) -2026-10-09 05:25:13.427 | info | Metal | Initializing Fabric (fabric_firmware_initializer.cpp:296) -2026-10-09 05:25:15.409 | info | Metal | Fabric initialized on 2 devices (fabric_firmware_initializer.cpp:444) -2026-10-09 05:25:15.409 | info | Metal | Fabric Initialized with config FabricConfig::FABRIC_1D (fabric_firmware_initializer.cpp:313) -DATASET_LOADED file=/inputs/regression.json -tt:1 step=0 mse=0.06471165 -tt:1 step=20 mse=0.00108452 -tt:1 step=40 mse=0.00004048 -tt:1 step=60 mse=0.00003227 -tt:1 step=80 mse=0.00003213 -{"backend": "tenstorrent", "device_id": 1, "initial_mse": 0.08051129430532455, "final_mse": 3.2111081964103505e-05, "validation_mse": 5.255065480014309e-05, "max_weight_change": 0.0986328125, "checkpoint": "/outputs/tenstorrent-1.pt"} -TRAINING_PASSED backend=tenstorrent devices=2 -2026-10-09 05:25:29.422 | info | BuildKernels | JIT cache stats: 0/58 hits (0.0%) [0 cached, 10 build-once dedup, 0 merged artifacts, 0 merged genfiles] (build_cache_telemetry.cpp:207) -2026-10-09 05:25:29.422 | info | BuildKernels | JIT telemetry: 2 registered TelemetryTokens (build_cache_telemetry.cpp:230) -2026-10-09 05:25:29.427 | info | Device | Closing user mode device drivers (tt_cluster.cpp:513) -2026-10-09 05:25:29.427 | info | UMD | Closing devices in cluster (cluster.cpp:1201) -2026-10-09 05:25:29.436 | info | UMD | Closing devices in cluster completed. (cluster.cpp:1210) -2026-10-09 05:25:29.436 | info | UMD | Cluster destructor started. (cluster.cpp:916) -2026-10-09 05:25:29.436 | info | UMD | Cluster destructor completed. (cluster.cpp:919) diff --git a/deploy/k3s/evidence/department-2026-10-09/nvidia-allocation.json b/deploy/k3s/evidence/department-2026-10-09/nvidia-allocation.json deleted file mode 100644 index d428085..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/nvidia-allocation.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "device_nodes": [ - "/dev/nvidia0", - "/dev/nvidia1" - ], - "gpu_count": 2 -} diff --git a/deploy/k3s/evidence/department-2026-10-09/nvidia-results.json b/deploy/k3s/evidence/department-2026-10-09/nvidia-results.json deleted file mode 100644 index c301509..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/nvidia-results.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "backend": "nvidia", - "device_id": 0, - "initial_mse": 0.08051128685474396, - "final_mse": 2.4448332247573035e-09, - "validation_mse": 5.969065242084071e-09, - "max_weight_change": 0.09999077022075653, - "checkpoint": "/outputs/nvidia-0.pt", - "checkpoint_reload_mse": 5.969065242084071e-09, - "device_name": "NVIDIA RTX A4000", - "started_at": "2026-10-09T05:24:44.711442+00:00", - "finished_at": "2026-10-09T05:24:45.079501+00:00", - "device_nodes": [ - "/dev/nvidia0", - "/dev/nvidia1" - ] - }, - { - "backend": "nvidia", - "device_id": 1, - "initial_mse": 0.08051128685474396, - "final_mse": 2.4448332247573035e-09, - "validation_mse": 5.969065242084071e-09, - "max_weight_change": 0.09999077022075653, - "checkpoint": "/outputs/nvidia-1.pt", - "checkpoint_reload_mse": 5.969065242084071e-09, - "device_name": "NVIDIA RTX A4000", - "started_at": "2026-10-09T05:24:45.310209+00:00", - "finished_at": "2026-10-09T05:24:45.517661+00:00", - "device_nodes": [ - "/dev/nvidia0", - "/dev/nvidia1" - ] - } -] diff --git a/deploy/k3s/evidence/department-2026-10-09/portal-firewall.log b/deploy/k3s/evidence/department-2026-10-09/portal-firewall.log deleted file mode 100644 index 1ad75d5..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/portal-firewall.log +++ /dev/null @@ -1,5 +0,0 @@ -PASS untrusted source reaches portal -PASS untrusted source denied 100.73.139.66:22 -PASS untrusted source denied 100.73.139.66:6443 -PASS untrusted source denied 100.73.139.66:30491 -PASS untrusted source denied 10.43.1.116:3000 diff --git a/deploy/k3s/evidence/department-2026-10-09/release-validation.json b/deploy/k3s/evidence/department-2026-10-09/release-validation.json deleted file mode 100644 index bee973b..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/release-validation.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "recorded_at": "2026-10-09T07:59:10.227717+00:00", - "source_branch": "feat/local-job-foundation", - "suites": { - "backend": { - "passed": true, - "test_count": 33, - "skipped": 0, - "tests": [ - "TestContainerJobCPU", - "TestRunContainerCPUIntegration", - "TestHardwareCountsExternalScheduledPodsAndDRAReservations", - "TestHardwareDoesNotAdvertiseOfflineOrIncompleteInventory", - "TestGPURequestIncludesInitPeakAndSidecars", - "TestHardwarePermissionFailureIsAnError", - "TestCustomImagePreservesEntrypointAndWorkingDirectory", - "TestTenstorrentCustomImageRestrictionIsInCatalogAndValidation", - "TestIntegration", - "TestDummySupervisors", - "TestStatusRegistry_BasicOperations", - "TestJobEnqueueAndSupervisor", - "TestKubernetesRejectInvalidSubmission", - "TestKubernetesReportsActualExitBeforeControllerCompletion", - "TestKubernetesReportsCurrentWaitingReasonAfterPlacement", - "TestKubernetesCancellationPersistsAcrossExecutorRestart", - "TestKubernetesDoesNotExposeUnmanagedJobs", - "TestKubernetesHTTPRejectsUnknownAndMultipleObjects", - "TestSharedDatasetAtomicLimitsAndOwnership", - "TestSharedDatasetConfiguredCeilingAndMissingStorage", - "TestSharedZipRejectsTraversalSymlinksAndExpansion", - "TestSharedJobMountAndEscapingOutput", - "TestMemberAuthIsolationAndFailureClosed", - "TestDepartmentTeamPermissionsAndScopedSharing", - "TestDepartmentPolicyAndStorageBudget", - "TestDepartmentDurableFairAdmission", - "TestDepartmentAgedHeadDrainsCapacityWithoutStarvation", - "TestDepartmentDemotionRevokesAdministratorWritePrivilege", - "TestMemberProxyAddressCannotBeSpoofed", - "TestDepartmentPendingPodClaimDoesNotDoubleReserveBoards", - "TestDepartmentSplitDatasetAndModelPaths", - "TestDepartmentMissingModelMountCannotBorrowDatasetCapacity", - "TestDepartmentDefaultPoolsAndLegacyPolicy" - ] - }, - "docker_module": { - "passed": true, - "test_count": 10, - "skipped": 0, - "tests": [ - "TestCreateDeleteVolume", - "TestCreateVolumeTwice", - "TestRemoveNonexistentVolume", - "TestRunContainerCPU", - "TestRemoveVolumeInUse", - "TestAttachNonexistentVolume", - "TestTwoContainersSameVolume", - "TestTwoContainersSameVolumeConcurrent", - "TestVolumeLimit", - "TestContainerLimit" - ] - } - }, - "other_checks": { - "cli_go_tests": "passed", - "logger_go_tests": "passed", - "react_tests": { - "passed": true, - "test_count": 10 - }, - "typescript": "passed", - "full_frontend_eslint": "passed", - "production_frontend_build": "passed", - "migration_tests": { - "passed": true, - "test_count": 6 - }, - "live_browser": { - "passed": true, - "check_count": 11, - "browser_errors": [] - }, - "live_cluster": { - "nodes_ready": 2, - "api_available_replicas": 1, - "auth_available_replicas": 1 - } - }, - "legacy_test_isolation": "Dedicated Redis container with no published ports; preview Redis and data preserved. Existing CPU Docker fixtures ran against host Docker; test containers and volumes removed.", - "live_accelerator_evidence": [ - "split-storage-results.json", - "runtime-results.json", - "container-mode-result.json" - ], - "large_upload_or_exhaustion_repeated": false, - "limitations": [ - "No 200/500 GiB transfer stress or exhaustive edge-case claim", - "Custom CUDA demonstration image preloaded locally; no registry push tested in that demonstration", - "Arbitrary research model compatibility, high availability and disk-failure recovery not verified", - "Features explicitly excluded by the user are outside this release" - ] -} diff --git a/deploy/k3s/evidence/department-2026-10-09/remote-cli-job.log b/deploy/k3s/evidence/department-2026-10-09/remote-cli-job.log deleted file mode 100644 index 6a0ac8c..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/remote-cli-job.log +++ /dev/null @@ -1 +0,0 @@ -REMOTE_CLI_NVIDIA_PASSED devices=1 diff --git a/deploy/k3s/evidence/department-2026-10-09/remote-cli-results.json b/deploy/k3s/evidence/department-2026-10-09/remote-cli-results.json deleted file mode 100644 index bdcdcd4..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/remote-cli-results.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "origin_node": "utmist-tt", - "destination_node": "utmist-z1opa08", - "team_id": "team-db3933031a6c2437", - "login": true, - "team_selection": true, - "job_id": "mist-7d426bc89696c01e19474c00", - "job_succeeded": true -} diff --git a/deploy/k3s/evidence/department-2026-10-09/remote-cli-status.txt b/deploy/k3s/evidence/department-2026-10-09/remote-cli-status.txt deleted file mode 100644 index b87a496..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/remote-cli-status.txt +++ /dev/null @@ -1,3 +0,0 @@ -Job ID Name Status Compute Devices Node Created -mist-7d426bc89696c01e19474c00 remote-cli-nvidia Success nvidia 1 utmist-z1opa08 2026-10-09T05:39:46Z -Exit code: 0 diff --git a/deploy/k3s/evidence/department-2026-10-09/results.json b/deploy/k3s/evidence/department-2026-10-09/results.json deleted file mode 100644 index fa86627..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/results.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "started": "2026-10-09T05:22:29.799Z", - "site": "http://100.73.139.66:8088", - "checks": { - "team_filesystems_ready": true, - "team_read_write_and_cross_team_denial": true, - "scoped_readonly_sharing_and_running_job_revocation": true, - "durable_fifo_team_concurrency_fair_turns_and_cancel": true, - "policy_limits_and_legacy_bypass_denied": true, - "live_container_private_network_and_credentials_denied": true, - "training_writes_obey_filesystem_capacity": true, - "nvidia_real_training_uploaded_data_and_downloaded_weights": true, - "tenstorrent_real_training_uploaded_data_and_downloaded_weights": true, - "account_deactivation_stops_running_jobs": true, - "browser_rows_expand_and_saved_files_open": true, - "browser_admin_workspace_and_shared_folders": true, - "online_team_storage_growth": true, - "legacy_history_preserved": true - }, - "jobs": [ - { - "id": "mist-75fac1f6c8220c1a3cf11109", - "name": "Read-only shared input", - "team": "team-1416c881530c4ea5" - }, - { - "id": "mist-53ad27bd38ebb05d81fd6035", - "name": "Revoke shared input", - "team": "team-1416c881530c4ea5" - }, - { - "id": "mist-29df16c58727bed96f5d4ed5", - "name": "Queue holds capacity", - "team": "team-db3933031a6c2437" - }, - { - "id": "mist-f27e6e3cc96da7e8541a6752", - "name": "Queue survives restart", - "team": "team-db3933031a6c2437" - }, - { - "id": "mist-835e04d572467f624e6724e6", - "name": "Other team gets a turn", - "team": "team-1416c881530c4ea5" - }, - { - "id": "mist-b46534ddeb9f18852b75f645", - "name": "Workload network isolation", - "team": "team-db3933031a6c2437" - }, - { - "id": "mist-1c4a852d366b9d2349e1cf7c", - "name": "Filesystem capacity enforcement", - "team": "team-1416c881530c4ea5" - }, - { - "id": "mist-8644eccafaf0b42c3d4add05", - "name": "Department training nvidia", - "team": "team-db3933031a6c2437", - "node": "utmist-z1opa08" - }, - { - "id": "mist-e5c04ea2cc126a786d6fe783", - "name": "Department training tenstorrent", - "team": "team-db3933031a6c2437", - "node": "utmist-tt" - }, - { - "id": "mist-5aa3c1f395918b993de4e076", - "name": "Account deactivation releases job", - "team": "team-1416c881530c4ea5" - } - ], - "teams": [ - "team-db3933031a6c2437", - "team-1416c881530c4ea5" - ], - "legacy_job_count_before": 47, - "storage": { - "available_bytes": 994050048, - "capacity_bytes": 1021313024, - "enabled": true, - "upload_limit_bytes": 2147483648 - }, - "browser_errors": [], - "finished": "2026-10-09T05:25:50.157Z" -} \ No newline at end of file diff --git a/deploy/k3s/evidence/department-2026-10-09/runtime-results.json b/deploy/k3s/evidence/department-2026-10-09/runtime-results.json deleted file mode 100644 index 4d5b421..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/runtime-results.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "checks": { - "concurrent_tt_jobs_distinct_boards_real_training": true, - "nonzero_exit_visible_no_retry": true, - "execution_deadline_failure_visible": true - }, - "jobs": [ - { - "id": "mist-28ba381f47c609714d91aafb", - "name": "Concurrent TT board A" - }, - { - "id": "mist-aeba50ca436d70aa879381ce", - "name": "Concurrent TT board B" - }, - { - "id": "mist-613d2049819ee13de76a57f1", - "name": "Intentional failure" - }, - { - "id": "mist-34416e68372f1bb5048f40b9", - "name": "Execution deadline" - } - ], - "allocations": { - "mist-28ba381f47c609714d91aafb": [ - { - "driver": "tenstorrent.com", - "pool": "utmist-tt", - "device": "tt-0" - } - ], - "mist-aeba50ca436d70aa879381ce": [ - { - "driver": "tenstorrent.com", - "pool": "utmist-tt", - "device": "tt-1" - } - ] - } -} diff --git a/deploy/k3s/evidence/department-2026-10-09/split-nvidia.log b/deploy/k3s/evidence/department-2026-10-09/split-nvidia.log deleted file mode 100644 index 3886ab9..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/split-nvidia.log +++ /dev/null @@ -1,18 +0,0 @@ -CUDA devices=2; torch=2.5.1+cu124 -Training on cuda:0: NVIDIA RTX A4000 -DATASET_LOADED file=/inputs/regression.json -cuda:0 step=0 mse=0.08051129 -cuda:0 step=20 mse=0.00135718 -cuda:0 step=40 mse=0.00003812 -cuda:0 step=60 mse=0.00000139 -cuda:0 step=80 mse=0.00000006 -{"backend": "nvidia", "device_id": 0, "initial_mse": 0.08051128685474396, "final_mse": 2.4448332247573035e-09, "validation_mse": 5.969065242084071e-09, "max_weight_change": 0.09999077022075653, "checkpoint": "/outputs/nvidia-0.pt"} -Training on cuda:1: NVIDIA RTX A4000 -DATASET_LOADED file=/inputs/regression.json -cuda:1 step=0 mse=0.08051129 -cuda:1 step=20 mse=0.00135718 -cuda:1 step=40 mse=0.00003812 -cuda:1 step=60 mse=0.00000139 -cuda:1 step=80 mse=0.00000006 -{"backend": "nvidia", "device_id": 1, "initial_mse": 0.08051128685474396, "final_mse": 2.4448332247573035e-09, "validation_mse": 5.969065242084071e-09, "max_weight_change": 0.09999077022075653, "checkpoint": "/outputs/nvidia-1.pt"} -TRAINING_PASSED backend=nvidia devices=2 diff --git a/deploy/k3s/evidence/department-2026-10-09/split-storage-results.json b/deploy/k3s/evidence/department-2026-10-09/split-storage-results.json deleted file mode 100644 index 4958668..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/split-storage-results.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "checks": { - "both_pools_ready_with_independent_capacities": true, - "both_shrinks_and_combined_overcommit_rejected_without_mutation": true, - "old_accelerator_checkpoints_preserved_byte_for_byte": true, - "small_dataset_uploaded_with_verified_checksum": true, - "nvidia_uploaded_input_readonly_and_models_saved_in_separate_pvc": true, - "tenstorrent_uploaded_input_readonly_and_models_saved_in_separate_pvc": true, - "own_small_probe_removed_after_terminal_jobs": true - }, - "jobs": [ - { - "id": "mist-976551958cfdf6a5ad42427c", - "backend": "nvidia", - "node": "utmist-z1opa08" - }, - { - "id": "mist-68ba775f5254308450de267c", - "backend": "tenstorrent", - "node": "utmist-tt" - } - ], - "bulk_testing": false, - "storage": { - "available_bytes": 2049966080, - "capacity_bytes": 2077229056, - "dataset_allocation_gib": 2, - "enabled": true, - "max_dataset_bytes": 1125899906842624, - "model_allocation_gib": 2, - "model_available_bytes": 2002780160, - "model_capacity_bytes": 2040528896, - "upload_limit_bytes": 1982857216 - }, - "preserved_checkpoint_files": 8, - "dataset_bytes": 260729 -} diff --git a/deploy/k3s/evidence/department-2026-10-09/split-tenstorrent.log b/deploy/k3s/evidence/department-2026-10-09/split-tenstorrent.log deleted file mode 100644 index 6272129..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/split-tenstorrent.log +++ /dev/null @@ -1,58 +0,0 @@ -2026-10-09 07:05:33.186 | DEBUG | ttnn::78 - Initial ttnn.CONFIG: -Config{cache_path=/root/.cache/ttnn,model_cache_path=/root/.cache/ttnn/models,tmp_dir=/tmp/ttnn,enable_model_cache=false,enable_fast_runtime_mode=true,validate_program_args=false,throw_exception_on_fallback=false,enable_logging=false,enable_graph_report=false,enable_graph_python_stack_traces=false,enable_detailed_buffer_report=false,enable_detailed_tensor_report=false,enable_comparison_mode=false,comparison_mode_should_raise_exception=false,comparison_mode_pcc=0.9999,root_report_path=generated/ttnn/reports,report_name=std::nullopt,std::nullopt} -2026-10-09 07:05:33.388 | info | Device | Opening user mode device driver (tt_cluster.cpp:228) -2026-10-09 07:05:33.388 | info | UMD | Cluster constructor started. (cluster.cpp:389) -2026-10-09 07:05:33.388 | info | UMD | Creating TopologyDiscovery for architecture: wormhole_b0 (topology_discovery.cpp:96) -2026-10-09 07:05:33.388 | info | UMD | Starting topology discovery. (topology_discovery.cpp:115) -2026-10-09 07:05:33.389 | info | UMD | Established firmware bundle version: 19.4.2 (topology_discovery.cpp:575) -2026-10-09 07:05:33.397 | info | UMD | Completed topology discovery. (topology_discovery.cpp:119) -2026-10-09 07:05:33.433 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 1 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 130452827985728) (cpuset_lib.cpp:440) -2026-10-09 07:05:33.433 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 1 ch: 0). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-09 07:05:33.433 | warning | UMD | hwloc_set_area_membind(): failed for physical_device_id: 1 on NodeSet: [0] with errno: Operation not permitted (pid: 1 tid: 130452827985728) (cpuset_lib.cpp:440) -2026-10-09 07:05:33.433 | warning | UMD | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 1 ch: 1). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (silicon_sysmem_manager.cpp:271) -2026-10-09 07:05:33.436 | info | UMD | Opening local chip ids/PCIe ids: {0}/[1] and remote chip ids {1} (cluster.cpp:173) -2026-10-09 07:05:33.436 | info | UMD | IOMMU: disabled (cluster.cpp:147) -2026-10-09 07:05:33.436 | info | UMD | KMD version: 2.5.0 (cluster.cpp:150) -2026-10-09 07:05:33.436 | info | UMD | Cluster constructor completed. (cluster.cpp:648) -2026-10-09 07:05:33.438 | info | UMD | Starting devices in cluster (cluster.cpp:1188) -2026-10-09 07:05:33.441 | info | UMD | Starting devices in cluster completed. (cluster.cpp:1196) -Tenstorrent devices=2; torch used for data/metrics=2.11.0+cpu -Opening Tenstorrent device 0 -2026-10-09 07:05:33.515 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-09 07:05:33.515 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-09 07:05:33.516 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-09 07:05:33.516 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -DATASET_LOADED file=/inputs/regression.json -tt:0 step=0 mse=0.06471165 -tt:0 step=20 mse=0.00108452 -tt:0 step=40 mse=0.00004048 -tt:0 step=60 mse=0.00003227 -tt:0 step=80 mse=0.00003213 -{"backend": "tenstorrent", "device_id": 0, "initial_mse": 0.08051129430532455, "final_mse": 3.2111081964103505e-05, "validation_mse": 5.255065480014309e-05, "max_weight_change": 0.0986328125, "checkpoint": "/outputs/tenstorrent-0.pt"} -Opening Tenstorrent device 1 -2026-10-09 07:05:48.403 | info | Metal | Fabric config changed from FabricConfig::DISABLED to FabricConfig::FABRIC_1D, reinitializing control plane (metal_env.cpp:337) -2026-10-09 07:05:48.403 | info | Distributed | Using auto discovery to generate mesh graph. (metal_env.cpp:437) -2026-10-09 07:05:48.403 | info | Distributed | Constructing control plane using auto-discovery (no mesh graph descriptor). (metal_env.cpp:499) -2026-10-09 07:05:48.404 | info | Fabric | Logical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3329) -2026-10-09 07:05:48.404 | info | Fabric | Physical multi-mesh adjacency: intermesh degree histogram {0:1}; intra-mesh degree histograms mesh0 {1:2} (topology_mapper_utils.cpp:3337) -2026-10-09 07:05:48.405 | info | Metal | Enabling FabricConfig::FABRIC_1D only for dispatch. If your workload requires fabric, please set the fabric config accordingly. (device_manager.cpp:291) -2026-10-09 07:05:48.405 | info | Metal | Dispatch on FabricConfig::FABRIC_1D with 1 Command Queues - (device_manager.cpp:299) -2026-10-09 07:05:48.406 | info | Metal | Initializing Fabric (fabric_firmware_initializer.cpp:296) -2026-10-09 07:05:50.399 | info | Metal | Fabric initialized on 2 devices (fabric_firmware_initializer.cpp:444) -2026-10-09 07:05:50.399 | info | Metal | Fabric Initialized with config FabricConfig::FABRIC_1D (fabric_firmware_initializer.cpp:313) -DATASET_LOADED file=/inputs/regression.json -tt:1 step=0 mse=0.06471165 -tt:1 step=20 mse=0.00108452 -tt:1 step=40 mse=0.00004048 -tt:1 step=60 mse=0.00003227 -tt:1 step=80 mse=0.00003213 -{"backend": "tenstorrent", "device_id": 1, "initial_mse": 0.08051129430532455, "final_mse": 3.2111081964103505e-05, "validation_mse": 5.255065480014309e-05, "max_weight_change": 0.0986328125, "checkpoint": "/outputs/tenstorrent-1.pt"} -TRAINING_PASSED backend=tenstorrent devices=2 -2026-10-09 07:06:04.775 | info | BuildKernels | JIT cache stats: 0/58 hits (0.0%) [0 cached, 10 build-once dedup, 0 merged artifacts, 0 merged genfiles] (build_cache_telemetry.cpp:207) -2026-10-09 07:06:04.775 | info | BuildKernels | JIT telemetry: 2 registered TelemetryTokens (build_cache_telemetry.cpp:230) -2026-10-09 07:06:04.779 | info | Device | Closing user mode device drivers (tt_cluster.cpp:513) -2026-10-09 07:06:04.779 | info | UMD | Closing devices in cluster (cluster.cpp:1201) -2026-10-09 07:06:04.788 | info | UMD | Closing devices in cluster completed. (cluster.cpp:1210) -2026-10-09 07:06:04.788 | info | UMD | Cluster destructor started. (cluster.cpp:916) -2026-10-09 07:06:04.788 | info | UMD | Cluster destructor completed. (cluster.cpp:919) diff --git a/deploy/k3s/evidence/department-2026-10-09/tenstorrent-allocation.json b/deploy/k3s/evidence/department-2026-10-09/tenstorrent-allocation.json deleted file mode 100644 index 591a9ba..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/tenstorrent-allocation.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "device_nodes": [ - "/dev/tenstorrent/1" - ], - "chip_count": 2 -} diff --git a/deploy/k3s/evidence/department-2026-10-09/tenstorrent-results.json b/deploy/k3s/evidence/department-2026-10-09/tenstorrent-results.json deleted file mode 100644 index 6dfc9ed..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/tenstorrent-results.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "backend": "tenstorrent", - "device_id": 0, - "initial_mse": 0.08051129430532455, - "final_mse": 3.2111081964103505e-05, - "validation_mse": 5.255065480014309e-05, - "max_weight_change": 0.0986328125, - "checkpoint": "/outputs/tenstorrent-0.pt", - "checkpoint_reload_mse": 5.255065480014309e-05, - "started_at": "2026-10-09T05:25:02.341652+00:00", - "finished_at": "2026-10-09T05:25:13.379742+00:00", - "device_nodes": [ - "/dev/tenstorrent/1" - ] - }, - { - "backend": "tenstorrent", - "device_id": 1, - "initial_mse": 0.08051129430532455, - "final_mse": 3.2111081964103505e-05, - "validation_mse": 5.255065480014309e-05, - "max_weight_change": 0.0986328125, - "checkpoint": "/outputs/tenstorrent-1.pt", - "checkpoint_reload_mse": 5.255065480014309e-05, - "started_at": "2026-10-09T05:25:25.167206+00:00", - "finished_at": "2026-10-09T05:25:28.814332+00:00", - "device_nodes": [ - "/dev/tenstorrent/1" - ] - } -] diff --git a/deploy/k3s/evidence/department-2026-10-09/web-audit.json b/deploy/k3s/evidence/department-2026-10-09/web-audit.json deleted file mode 100644 index 65a3f25..0000000 --- a/deploy/k3s/evidence/department-2026-10-09/web-audit.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "auditReportVersion": 2, - "vulnerabilities": {}, - "metadata": { - "vulnerabilities": { - "info": 0, - "low": 0, - "moderate": 0, - "high": 0, - "critical": 0, - "total": 0 - }, - "dependencies": { - "prod": 156, - "dev": 195, - "optional": 6, - "peer": 57, - "peerOptional": 0, - "total": 355 - } - } -} diff --git a/deploy/k3s/evidence/storage-2026-10-21/README.md b/deploy/k3s/evidence/storage-2026-10-21/README.md deleted file mode 100644 index 4868077..0000000 --- a/deploy/k3s/evidence/storage-2026-10-21/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# Shared-folder storage release verification - -Verified on the real two-machine installation October 21, 2026 (America/New_York). -Source branch: `feat/simple-storage-ethernet-20261021`, based on main `ba2bb86`. - -## Evidence - -- [Validation summary](validation.json): source checks, small Ethernet sample, - authentication prerequisites and operating boundaries. -- [Live API/training results](results.json): eight checks including regular-member - access, upload checksum/download, ZIP traversal rejection, team isolation, - active-dataset deletion protection, both accelerators and sampled usage. -- [Actual workload mounts](workload-volumes.json): direct Ethernet NFS exports, - selected read-only inputs, scoped outputs and disabled service-account tokens. -- [Deployed API artifact](deployed-api.json): image identity and binary checksum, - matched to the built candidate. -- [QuietBox audit](host-storage.json): ordinary ext4 directories, zero image files - in the new root, service state, shared capacity and persistent Ethernet profile. -- [Browser checks](browser-results.json), [dataset screen](datasets-browser.png), - [job screen](jobs-browser.png): real regular-member login, advisory display, - an actual browser upload and visible completed jobs; no JavaScript errors. -- Training logs: [NVIDIA](nvidia.log), [Tenstorrent](tenstorrent.log). - -Training uploaded **255,854 bytes**, requested **one NVIDIA GPU** and **one n300 -board (two chips)**, read `/inputs/regression.json`, trained actual accelerator -operations and saved/reloaded/downloaded checkpoints from `/outputs`. Loss and -held-out validation checks passed. The browser added an 8-byte CSV afterward. - -All **43 API + 6 CLI Go tests** pass with race detection, alongside vet, -**16 React tests**, TypeScript, lint/build and **6 Python folder tests**. The CLI -entry package has no test files; no actual test was skipped. Vite/launch-editor -were patched within the existing major version and npm reports zero vulnerabilities. - -The host is now configured with the new API/web release and local folder service. -The separate old auth deployment remains scaled to zero for rollback. Existing -auth credentials and deactivated-account state were preserved. No physical disk -was formatted, old storage data deleted, large quota allocated, or bulk upload run. - -## Failures resolved during verification - -- Go-auth main previously accepted user-ID cookies, could not verify existing - Better Auth password hashes, omitted an old schema's required `emailVerified` - value, and did not honor old deactivated accounts. Targeted fixes and regression - tests were required to deploy latest main safely. -- The first dynamic team bindings retained the old export prefix. Verification - caught the mount failure; the new test jobs were cancelled, only the new wrong - bindings were replaced, and the correct Ethernet/folder exports were tested. - The successful results linked above are from the final rerun. -- NFS 4.2 reused an existing transport to the old LAN alias. New bindings use a - separate NFS 4.1 connection, verified on the Ethernet path. - -Private credentials, sessions, database backups and rollback manifests are kept -outside Git in `/home/utmist/mist-storage-validation-20261021`. The reusable -[live verifier](../../verify_storage_folders.py) creates its own test account and -workspaces; never publish its `member-private.json` file. - -Operations and rollback: [storage guide](../../storage/README.md). diff --git a/deploy/k3s/evidence/storage-2026-10-21/browser-results.json b/deploy/k3s/evidence/storage-2026-10-21/browser-results.json deleted file mode 100644 index 5a600f2..0000000 --- a/deploy/k3s/evidence/storage-2026-10-21/browser-results.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "checks": [ - "regular_member_login_and_advisory_storage_display", - "real_browser_upload_with_verified_checksum", - "both_real_training_jobs_visible_in_member_history", - "no_browser_javascript_errors" - ], - "browser_errors": [] -} \ No newline at end of file diff --git a/deploy/k3s/evidence/storage-2026-10-21/datasets-browser.png b/deploy/k3s/evidence/storage-2026-10-21/datasets-browser.png deleted file mode 100644 index 45ace932c22f400cab79e251b4bf6f6655384c36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92495 zcmeFZRZv`g@GVM00!gq0cXxO91b24{?iSn=EChEQ2oeZ7!QI_uaCdhf^z6v@Kj%K) zy0_}S+iUwY$7%)y;t=ordWo0^&RI3}m?$fdF?Zt1UW)sIddbYq|7EV^p)S>d7+6_5$DaQpWW|g^5G5*4~sVP9Ul#sn<6Ek`v=6);R@vX zq67aAcr6qp|2x6>2fX)({rfHqKH+oxf5(-Rw=4gSFd-o@@c+)-{4cow9a~pPTA%$p zBcnV+{&#e6f93G+=-=`Ge>4ot{{w??x_DVySoAVc6NhemhQ&b)erOL03Uax;93CEy zdH0SsVQ*TkC1!B7Bbb7`Q{|u4SGetJV0wPYB~K$^8GHXdgP348wAT~^vImO7WY9t2}bMs7o7pu;bRrMAQY{ZuPvm%ekqN4r2^&aZK z_u)WIUa6#~b2;rND8WLLvqb!sJ5=urwkYPF!ymVd%+5l~s4^S9q2Da$s4_k0;+LvD;#6sW{JpRhOfnE(lm62(GT6d==)DL97E6~hp|@FCatpdL@6rQt+Ae7 zL|9m0$ExCCwdi|LsSBNZ^+Q2RnRf58vw^)3XPRwMu5v+fK?$q9azm9g6L`{6%6Q`q z&qIPHJqt&9eSLrEh?}EpR&iOq>2JU~GAUWNJJ9YiQRZz*4CIo8oAk67-RDUflg!r< z(p4a9c@O0ch?K)gk-f@W#5+o@!+wVB72m&==?C4s=CH2RW`Mene8ae=*K#`UPZ0fx z!VhbteMy(d;C20QtpE}PrKI2x5ZLN(g=G4Xw4kA``84@R`gb^4AJ#v@AiQo4$LDDu zn!L2qo=fGhjskHjDQZ^kT`#xX-hVnfOkp$6d>Am0Tst2T#Nj3meZIpyUbk53qNi#S zjyAH}8sh_@8gcj(mzbCk?T4;5nIKCEdB3;2vGL(L1%-(3r)qydK>Ii=xbmkegmQ$m z$yxd4zUx!7pl_~le+pVoNE8y{t86+U$6HNb-y^iB`_Lm9v>thUJLTR0*!PSEO(x8^ zX0j<_Rn2fa;z%zn{XP8GZ~Ag7@<%q$b)M8>729LhLlPOa?Oafc7z#>?`uc~HxqZJu zYo0gzJKx9|#H5q;Ak(HMw26?+)@hNyV78vaCmiW>qA4!LIrp?F$!-d974m#S)3w`o z0`a<8bw_RI6Z zo}?{H7uoIjvz`nl1DPXfLSfy{+^-WV8U{sUR*6ehjf>hplBV}6T`pZP)G%^oU2HL4 z=Y-=51`i(9xU|$aNa<*+@-wACm|Xr80xnv5Z1GDyQ<2XY93G|&_0lL_sIez9J>(Dt z;C!P-lDg4)^*OJ(qLY)i?t;L8y1R!*=!ao+;cIlvO^HAWBs~5vxdG3=C=cfjrt^Aj z{2JR>4+`7vO?V2Nv5r#T+%mOh-_wF@$2jZCdW);y_OVfQN8&07#tNRFkdPHrH^555 ztaCvM=m^Oj=%c2HdeR_~+udMzXc6?OQar1jG z@KF2nl$@x1lqL*GY*L1GY0(9kb2xLe{5T@z@3py_q>ew>Fr>xQ<<-4yzNqf8*j)qy z0E22(XMMC-od`U+n0I3_wnfeziB+d8CC5KX3rn3aWOnj=?;uH2bMw9fzw^?m1avl{^^pSpQm&pdkb_|DXl&Cb%m!+^yT{#)Qjk2Dn%d7dVF(kBD zsb7&@xD zGo^@WLo5$nmWK~;!QJ9L`KEb#V3L8x;LosdX+mB`GR`J8^7@>h;r<~~3}phtrP#Fo zz7Z*DNlqVf$In>-A@kaA_zsFm{aRo!!_;(@Ev&UO;vknVS{55RC#+nwyVX$KMyj2| ziaHa9-CSI(EiJPk9kPzxk?WVNdDTAo--{A z>nzWZFF^yW=+754Ms00F{24ix9edZ2JUoxxG*R5w{QOcJR;wny3+dT|micbD0WUjkRtC@u5yCVU+qujP&;FsIguO<*8e{B;PuqjgtGi><@@^pYoD$jJgEsW) zy`gKHGUSfS{a%NvtZu^x%j#ftYV>_h8)BiQrKMb{I4XrVNUyVCJinx+IbT)sh*5|Y zO_z}R9N?&!Aq0sQQAiPKQlqDAW6wQ$qrD7*=Ay}?nr{Bc369EQlR9>D7=O#ebSwbx z8Y^^x2&Yn@`ZaLcj*r*f-M~XEB|m9;B9!gt)Mt05jjd{NmiBg1aYO=BK`eQ^Gq8V` zQS7VI-Cc~LI8EEoP|H{vwEVc>lryQ09SK7Va@IBPhb!uVAKz^%D!zS{TF)!iZ?W3V z-b_Rb4h{qfdMWo}{i<6~F_#Yv`jE^NDFO!D|J-)qaWy+!TVu7pU69dG4wDYclS}>R z=fR*?>&{5yOYCBMn$p=tS71`*?(VLIc{IWMI}z2s#|FC%%dJZ!F9!HKUyqwv&nPX- z!GwtCXw~>Wpa?zWs&cw{)1toN@w}gby>>2& z?CA;d_4pQ*biE;kb||}Zbkyv)I2RCtY&%!ZK}T0qULH&T9C~_omd<0`O@<<{;b0FN z?AyDz7;sNcg#^UdLY4hpHdLk<6D>3yFU=$`qeVX7Sf9vGgwzq~%_|@eb5u==d~Q>n z|AYw*sw2&!W}^zQ^5Ul8r&lI^+nqtOmUG9t5PpD=KAp77&ZVAsW? zmi^qpn}PJ0UTq6q1xX`ueq%u9DzU*s4`B7`HtGDOgjZ8);CkIJgy=Emx=kpzcO>FV z+D__wbE%UyU~Q~@Mp8p;KJm5eBBXd>@awPM&~?hVi$V^exSiJ@zI9=+u30p;(}AcB8%ICZeo71%Z3P4Va9?i&W!%(99YrnsG+bRTOa7!F=l*JABX(Hgk1P9uR7Y+XZ+ufT&!*`_JNo1^rPVQymvwbeo-rlID;e$TT(VeH zI6|4av0o5#l|8&YTZSM4SM_%c%*4r7KJR2xHY;T*jW52I0U<(tNx6C2FXTq!l zi^@2>R)5ROTT$AqPHN{9NX|yrRGfY3BTJs!ZZ_LE*0ERl!PQP(Q!(C_ zFZgeJJ2t4exQ>~a8WmMkD!fKA8n76$Vd_6Bj<2X$`w3=xPL1?{8?$Z30}HC9Jv}_) zUUj(%`4Q|8sjBI%uC8+Uwtjat6-UPNIoOD4*jfZ-IGSGcI@(Pyr+YrO<230jP%_c? zKb_4hbaap*mXN)`K`Xs}l0#8>3&|gjt@ldSkjcjIrfSYQqQFH{h1I?_G>B2R5rJe|AS?jN0KK ziFX86>(EN7NR@%SYATZH$xIOuknBO={OL%6dDwecse7Y^ozwWkuFCYpT6Z3o;Mp0v zcUkYqWg(+8-)+?2+1N`b=?FcdW-Q;oqazhEVi~bPTXnAxWbOH0Mlg-a_FXM;I?gieH`={f_ zhX8n_+YLV=4tDmzbhacDL7+$Z_DzPBm2GixLD2nJ@4P?r9s()AVhRopF21e1R7yf9 zC{Pf1K$L1cKlY2j<4gR~Os2u^DfvJRZ%og?WLhz^RMNq|u#rU-(59%Sw|hi+c=lc= zLaw~KTb#(=;M_vYPZ+bLyb!2#hx$SlT;3;XC|P=hc6Lo({leUb>J89{#S)1xiu+Z<)42J8y=Q?hLXIsao52BxA>ZkC`6%k`OpB5Pn z=o7<<1O+)+)k`hvV?8c6>d>pyZS(Iz>0s4DPM?MdU1aBYC0x5h0{qV_5qmem7;u@pr!zGbP7Phqy zfo&^b1ZPLuzdR>Vvb5o(8Ws8p8>gKzg{t*p;GOL68(YbnI}))VI1YD)AepV3YHvw| z^fX?!>+qMVc&OpjHL_b?#G9Tc`8}SSV}bLu8SINP_$ZdgF1pER$yHCUrww#!9abft z?hLf+n`&CSySfFh4=PR_%T%MZT}R3<@wj#`ZzlAR-AX`3fZqf5j>wVc!C}*XZA4-9~%lVlAbO<-3QC( z`&G-_$EOraEOhR{q_oij`&8Kd$mYxBW zzn=pP%tiH-JWq#vleHaPllN+WWpSmOpjSg_bK-Ck2WKO6RcQRvIFaU=u#E|RgUk2p zv}rb{-d^IT?>i^SZLn}U3}^>LK^lMSnZl_%Ht^Je|_L@-~_dV%sq{3q9ODI(-NcdR!0S8rBn>KAIPP`tD}nqe1<) z>Zgu;I?rR*NM?=2gsatE&$)f`&?-}N^ z_oy2=H1#6iN|tM5WJM|CrGEgAT--p6>t}V1U)}=+9?c;QR8UX`$WE*IXQf5oy4#44;V@rjQ{3CQo0)Gt2NNA`sL`zX zDhi-FcQeH`V&2Sw)#isYzV+a!qLLy40h7v1xBcW(e9mocvxh3#+sIcsn;Rw^|6JV zzD&s7uAHOvnjoPEoIbz{MbESbDxpbjy&n-$WU@A7#a{L~2`C^e+SH=onzOa$I?@DB z?gyjbU)^RdN7vVb=PGI0nPu%q{m$p7bHmd*tMqW(G~E1%gx~^BFAKrvZ=7P+;J<;o zj6Jvgz$lYblhFmu9>?tH-%4gjmT-WKej=HLV@Ys{i3WX=j;RCJX zmZy(9DwwPORygc(cWLcgJ~_ScJpIC zcw%H=Dkv@`771DAdXnFEm`NXbdbOkpo3LoXqQUW= z-thU(ij8QHx;`BAC`dMTXi>8!I6I+6KNU?fkY@F&qNMc4S8My8&Cr~i4?dYqPTxfl zg};vS-A;H?#2kr|#o?N?N#clF|SM;6od zGy%{M(dKw`4+Y3=47|45)o*tSa(YJaxv&wvsUGjZO;{U5 z@tzzUmwQ2@t)p)Gk5R3mL>ol+(>;&U{pbmp+9l=_(MmR)=3_ZwW~Iq2)|=ryPglte zMP9NW4t6IX!=y=2$aWlS04khVh(z2O6;rzFySl+N&Zu1Y@sw%%tY6woBLm>_dZ+0& zJ@J5#SGlu!o8uN$BEFxE%tK39(ZuC%pz8)=&sV{CeoYP(Y6qk|u6x*8-8?E=(QnpB z*M0AI%*UN#r!1?U`F=*lnocXF+nXyPL=L_jm+|{y_sqax8Rp5KPNOtkL2j|$r9rqg zD)QUfX>CUc5{TPT)K^5r&TgsgeMn!FasfU!^KQWPQktMGZPEaV*L=5Jn!YErDlCby zuA!mjVl6C3A|e~+VBBIt^fSVrY7NE>wMoClZ2#B>v*-}{Wp`CRk4?VH@DJ)VjE`-r zkRAoU)l8=D489Ud<{uu3z)C1C4VE}y&k8n}RAD*>5ph6K7)SAqqpZLWSi z2^4}MGsi2U`Ft*Hb$U(T<;80hY5ZJ>AD56M;Mu$5g-Nf| z?C>%);l3Gqt%4;#HL!QA=Y0JBnxEfeFc*R)U$Ru6I;a7j9!h2RIz8w*LcN9*o4(?qc5qeOCdCgFHRbbHar&*zdl&J?laGfnY_4AQIG?%rVO(a znOq!og|YNfJHOROL-_4%4*4uil!*hYid;UM1y##n{_}5Rl1&f0Ee*^ioAw!TD(;Hz z;&yParIOD)bn{Q5Pr?rn1C;zAXLhA_t8J?q72~OC3DsLhRfutIxasU)yG$mhrnfe> zN1=$6WSpecKZ`Z9qTOsm*|kfIn<%fQ;J7Vb1_d2AJ&Ejfg^}9|_Wo3!m91*xNVLK; zi6_ho$c0Ci^<0H+zyA_I;~y#VcQm*nZ%nwt9Kq7|9oz5Tmg#9TUngYs{+jA(&k)MT zu)O*lzvha8mL0Y5<{qN3qr)lrYW+ihAI3mZiEeW`vhB~wJp*68%YFNnm_Supj+U%{ z^TyWZ>Kfn52%?Xku&)+nTC^T_Csb_7p6kfSXg|uK^T#a)6|M|g1^{Z4 zCyKC2P2?07ruLas3&fof6I{aVpf9xjnL`4mTx@ImSfO*wZK&&a_j+6)e#*+l{lg}u zcBUqDC17GAEDxVQ?)hTi-*ILus2hF7utID4n9t(yJ7h#_bVQ%Hg%8TxL>TpR;ln-} zU8c8@OSIBoQ1BnFe>77e3vfIP#n_wsgxP!S+1#-k00VD3H$ii8XK*U}d%6p}oV9f9 z?{9tJgRAe}g-;*L3Hx%L(MWXU-Xg!YC9eNBG1a4d*MK{(7;jlQwr_d9+q=*FNfaj5t-8eu)l}9~+1y>_@H={5 zE;gU=E;QZkXo)dy@>8v@V3d&0TybjZURV;7(+vG*MQ*c+S~QxTH*d~o@vBAb(^)-m zQ*w%xs*R^P6AHB^vr~C&s~Z|7CX!u)1ab+f6hOo=uPEcX43#1IgU&84bPNnU8BP;@ zpkRh`?h<&J|gH3>~q@cj^X7pXIZ-jUS zz?uFCOR}GDu4^oBY;KP1SY2q^$#6xWz?Au08u`yZ-}Pck9^{GJKIE;8JNf}3Gu6kV zKJS)H={JHct-(}@{%B?qS651a08&j9a5zRXXRQ2> z3wUqC88V@zq0wM8+q7Zu?zOC{x_Yg&E*)+Eu@00tls-N&A)WV=(^NQ*vkW}~9@6dH zT&gvXDTPENL57eU35}Fh9-7e8ZAbFhdUsS>yhgMe$))ZG_ju(3-D>BTG>RG;Zacl7 z#So6G>nA>$jVxE0OE`@aGcnl@yv)b?JN#d{Y9)WL$2`wuy1z?s(=Se%tU-$Kcpwa{ z9_Cxr;QA4>9OE795LerB+1}DyPhp+xgkPiMA8@fTUHSwfM|bL~bwmpkUHvgoU=jcl z{1nTmsH7!m*^Z9-YsSw3oFB6Ni-fFJ*RH>B{jgt>yi^JnPQN}@TVG#YO^*NzP2vm~ zfJlA)Ozw2&O52_-rHO1LJdmV{y*m=o!iEB$kycrs?q+?2RG~%5}(`FDE`$$wAuzbdq_(3 z>8(8imG}1LwZ3{`{Ls)4qS^es@QxDCNkd1Aj>gZiUbi(q1kkeQ>T)S#DLyh*)XxhF z2sS>So4qls&U-n}fThVvhE^ee#<$pS$=|-(8q6?I(E%kT-QA@cY>((!Xi<>Z!*M=jslOlN^CXDwe+cp#O-)%Qd$6Ff1z zYXH!oTLL9n&<;0bX!FdSo)Y0%r0>U@(HO7mW8~M!mzS3s^RP5XNS9i(DcVi) z`D5bZ;vSL$X{o6ui?IXyLLxrej)LiYhSmP%l)nz_ZHlE!kQg_+mnJ@fNDkd9C5TS$OH zgBKLpRqOgBX=AgH@z4+vr@DsDIA6b_Y&LM|E{% zLz~6>e{>(LMU{3+aa+fFcLa7s1Z(-EZhBXBf3FS)^yX%6t`s*SuS{x-iJr4p1J50>XWmB2!s;l!#Jh zuEOy1H};~ubfYbi_i7%>B7yI~R zcICpfilps)Whfb>7gWHVdK!_3^v+EQQdc{hBxKV4Gv(~5vGzqxs} zFaPOcAgZOdq2XUDcOW=gf!Uen7Z4z7d}^C)0poBwV}n$blpcp0?ElGV4B-Gp6a32B z+8H!Iv!|zp)`}%JKa^sNtwtCTA=<>gnOw&+qZne87lR zt7GbLo|TpLP1u{)j7fAZZYYR|smveS`F4I zEOOZVmOvWw6QSbQTy@jk6^PG`vxT^&ys+Pb+0(---kKOz8ZZ`S6?!P@LKfh z4Pc-&c)VRRkeS!Nu~HNDZofNjKHlAxa&f7vhw%S-t~*q}O-ZIzcQ2@NJ2(r;b2iR7 zi0L6*YW@^bG777=#pL%e05BUr8Fz>21s^xolMH-j)o=Vqt*SEpPN6wb0&}A$A*}iG zAkUN4kb@6gU+FZ!3)ihprlwc@Gt-+}e-Kjm=`$bqimSsmFwq>$;0ie!L?PtANn>is zV#~aNppjz==Zle!JzOsenN1{r|4tkvs->dRRjM!Z1>MEP#d$cR z$&1TIR{>Qt>!gL~zGm?NjvRT#sZK9h%uty40T2esTno7iff6NklNg%JFMf`ZkdWje zb#-;!T^;K+*y&XirZ6&FcMm?@ZMW<=%gYa!Ck)7*#*gLn$fmIKu#(0ORsvVRMrS-Q zRgwf23PHuht#`ewZ_jQYX4FVZ`eyC0RjezP%sl?UhuiDzn8LH28J)=mp@vzG8U) zaK9TUJ7vg@E46kq*5QmC$^ppHo>D|nwgBN2u2a*t-|ZkyVO%|1Sot_BFN@iQ#retS z*P&RA7d1(8M7xsxTMTJoVPQM?s4C1+cFD{sgCT_O78_qQj>VB^4i(ff{FE$o~8&E4H{!`jlF`jWZ1sJ%UrigszV z3TR?etFya%H1vFXq~)StW^>at5v_dIMi~l3_Y=i7sKM9=>M;f|j}9`cIeh8&j>nh_ROk!ifNslKnTrIw|ZmZg*w&2D8kZ4!8*M_f^REbs_hN_{`BS5MpCv*Vfj!Z6ZxKlbG~ae{_g; z*iB*fk1T^(nqtV$&d&?v_e9VCMDBMYQGeLhHg?WFS<5m_qenGM%iU6e24sBh=md~y zODto!+SsPniCBKYpN8$5W-Oo72QOUVFIkCzWF*mer zoHGeg390tl>LrZWQpkDwZJhjMt|QQkHU&!g`Lc zXF>SqHZI-+idAmZfVOB)mIQeTG4Zj`?!4}vOmBX+{cZ*fBP>ThR#s~a1Y-m|P{aWOHD8#^&%5-4fYQ^i*L4R(uL3_1W0cP;`8 zU#7)Hh!`3k?u^N!La@HR4*X?)s>DBJ0-8vFG9Je@ZUOBVEJim~(>cwTeoyR|-S8AB zo{u9V086bYPj|d$`%Zu_ESWP(=*s=$$F|1+c&GA;kqn{v(b3xlB(2J6eJ_{&EnDR% zJT7Veo7VS`JlP+fG7_mhtA>Vu)Vcn?@PH*H%0EKHRXh)7ST@{zMIPG%;CIr2IBk6F zx2|4#(pJ@!bm?PA6?1Ut?LZNfMP*=MU~0KNTO|vTsxL3xYi)xC)Ejw57#J9;2EQPU zyO6xU8FO@Gg`*4xdHtZSLL!nd3u4?8iFATO92z#AsYxOdvYmMs2B5j)?Vx256tTN1 zaLnSD_V>GrUn6~eyHy(c=DPM0>gs0Bs+Ims--QS*!{}!;)YNQKJRqBUPXFWLfF{`i z5y-9kettt2r=b#=-_hipUV@?}J4s`Dr#4bjQUI2_{1zjr;|Cg0wW}jIn`3G~N}KQZ z2CkRH}C zw8&dtg%8Rl6%7pK{B`&zfDmbY28dUgbef9`Z|8j8pa`5OIymT1p5^t7+v ztn?~@c(lE}T2~NMpTl0v$*tU|(lDSnr^x!|*K&TGzJOoYF)#`GA6SEd7jAKY_9s+q z52rq*^LUw^Z^;4bn@53xBu1_3-0Z?wMjprZ&ioATe)iSqw)eX)b~jq?+8R8Yn)QZq zx1UzXP_QsDnNwsr=lg&00cj-fV&A?o!ytOORM^dI_3)6xbHakx=k}rip3rxty$j)x z5~zy(_A~8M1Svba;+D(G%C48)gj{Slb@dxBj>5wc&kH1tkqP-vRyt4;HT3avjoZEi zNx{bQHtQ~0{tGoOM6LG}FIQGJzKNq05N%qx9xYw&S%aOeV&9R8d*3XD$ji%br7$&} zjRQ$`$Jx+u^rmb*J3Ge%UtV9tS6cepZduH4tUsTUb8)#OZ*rT~M?pbRK~fO9yEsMb zks~rTGTI?w?jPuHzI%ixVmdw=%&yJ7X@);a>cf@2ln@sW4haTI=W@+rN)Je4iH<5Q z#>1o@0#?&if046xK4kH(wQ0){36O=kxfP^!CKxFK12>8v6nWr0xs=;2p{2D`_buzK zy#M_uTE4)*FCZTU!h|$5%x7kL`A&tWBpT45f7`q+rDkL-XM@6C3!F^EDafVqOj`Np zWEVO?zj^H>WmVg6MCy^h9Uaozz}gVH84ZY#i-^|)y6=acuB_m&zZkt?g}Lq7kegA1@b3 z7Zw)E49FmQ!p8MoTqB&EogK7kQ780IgcTqmA<0F^(N^`3j0m+ZX9iN;ct6VJGtkrb z_6^zo1lz}R1-%Ff3=W2af9ZDb`{r(7^5I{QECcDu4*tJ&goV`;W}ZJ`3B}V`D6>b_XT@mdBZdK9D3~kM%r1vrnqBVS7 zT+Gb_rsJcQF28}=8?q4?7AB)9$^Ezcf`NIMVQ2}+DXk8EK`fbFTYO_RXUfaQ#@Epo zN|nS#Am|xAf)xlCl#rN^A?Vi6uIA$-5Z85ab(Z+G3qIsNMSYU)}5(8edj4k@XG z>`=M>aiuV~H9CYVC+DY3bW9YXdwaARp=r`TSg{e&1NuzLS<6|)Be2nSh^SFR#S!re ztn8*N*z;a5l9viDH9vb4A@2mb`CZw7HusI2tev0O01^~3h_0@$ldT}!dq2QYQtms$ z6~zr;l)OtkJ1hU*YFMRh{4K!5Brgh=rM~K!sFL!U@VOZzE{;e;~M?-=VpVxvqt}mO-INNxjU-}Dd0FN!jtj+LA7MWCbULNJB$!+Uhn2prfuo*VYbPOJjC;eF8hKOT*PgyKG6lJM=z_><%I9 ztbh+zYvg5+hj>oedYq-@G8mfpRb(hkyJ+$wy}Y23ou#Tmah|6OSBpA7GsLIP!9{)ts=%6q zan+}=)VW!+1uKdlViP4}e00&SXBVMMnZHTBR$G8q@fResj^*gX%ONvntALbXD$-)) z7J=1kDhKQ>l>jiQ-bchk3_knD3X+$ZRnyTaQRb)_$jzVJzjURnyUafPab1a~=m3keJC!4xNZm-?4>jo@J ziMedfD6Ov>qg8xj1LlWqMipudv;}F-j|*K!SS%@5(*0E3NKEvmzw@np3WVhLFv?mR&((mnvYhffNuGb&^Tq zOB7A|p08u6P|06kTs*p5Mwv7_dBmybZ#vb5Z81@>RjGw;=6P%f)aZLY9_uZg+A!p8 zzRATZ33w_menhLTYDt;WX-JVz;~&^t{?lXqdh^@sK5-nf?n+CM+s(V$QBM0py+7~L zIbqaGE!|9;8<6O={aJ{6l%AStH7W1qIN$j><56);x|mPkRZYm_>d@BM&{wI!#wc{V zqLP~=>1iSKc+0Ts=-~y8ZC8q6$%UD8_3&O#ba7*9q+%yemz5Ev1v;T*KCh3)D(e}r zd_?ufj@Q+Z`@wQW4D*&QdAaSjd|Zn)2Okv_m||PZpCU{6xRx3YND42%RGd9xMBUuI z1ol6k&hAj$h8p-dDL?C;JY9sL#K9x4{+d+uE(>~JvoIAth&5^g z(D}IvlJMM;(2GGjl;x*fkhD#iHZ=RCj0#f*T@ihnfKLXf%E~%y#(>R{<@FC!ip2TF zi}c8n2vZl=!&Iv(Srhk45blm%uM=e1IkT)vI~WB=>!6PbQ8R^|Q+d0?k>)Ne^CiMMcflpD+7DE+i?R(VbIU}( zgXlW}Kmv_&X&-l+D{hFg#Px-L`&t+4+IO!LBl)2|h9*BM<|s2R4iXn7D06Majepep z(OB|}vwJUx)%X*MB`S``R_Hd!y)irX`FM#Fu>D~1lL|_YnZ_u)v0?i120m60Ti|eI zBWu<}iyV}hiH3E!t;*>D?+zNn)j`46ZE`lVqWGR7k-~3 z9LdVT>x>rZpev%2GGCIXsOFSQa^o)wvy_l{G@V_JCzv2h_-(8O9tU`M;bmaoux-Ah z;X89wuAZJAWE_l0z~6qsu-nc5>nsN7TVoN%ys4*+j8K8 zkqMi9rW3uAgiLT%CskVwnW=SPsfVlSl$7+w+uq29%^q5n*ho{As+eDM@!kC)_A3J< zRAFv~rL!eWGEkvWGef(x=cL}*{6+fK1RCZsYos2fnrYF_Hh%Oa}cGkwTsUQ!PL#_fcq-IMt*#n!k%QTHR zJ)gM^tx~(AJLIEmHmR?HA2fF^X3z7R1bp22^M{Y94xRmaavp1++m@-7Ov=s1JPdi~ zfo}Q!ctULe>~|D^ghj^#8D^jn@fpq!%jHOf=LiMA2m#3mocCc7ebpm(3R)P_+uL8K zsu`R9_AQ*p_l&uY{HSw%a$pah0;!6g?CmQcX2S-*bZwo~>PD!08O*;;V;p8wp&Gik zy;NXiG>VWnzKp=m%j9xyp;QwsXcBi%dHw4{pm@6Ar?sMEL8Lc`8G@$Olcu}9m}Rn z%H)YN$_?iQ9hE|5ehwc~ap^Vb{rt69U9H`%UZu`uDsjbio)UX$F{`iE-L{r&98$7>QmEJi=Oe54K(WoG6rvgUXTF+O=@X|+;I7ZC8W;6tYY`kNs2 zB3BoeV^Ipw_&Ua1!PH*f!NKFyY0IA=aN~aQd$`j8$NhaEGLt`B$(k}UQ&i;1?2W_U zeecBp7H*goPUqeJuFtTsf5*$U#w*CkwFJNqW^+J{IS>Z>5J0nYec|cjVXEbCK>Vlw z7!`Qs(0T~-@9Pcx`S1yq{!|ozq5j|bT7AIX(kzf+Te+ zuOsfmY3D9lc^+J>g`MT;`4tg|4LYdBbUJa%jABv>P_6JJIt_;QoHy__}g*#Lt(^pY3 z9;`~+HN58UFMM0Hms%J*9t+UycoE&$wgjtvSLQMz-9LZ@MS7tw% zFDx!{7%05!?MR-xJY?!uyXJ>Luhj?&MunuTSwWUOQ&1kLsQ-xG+ zKz!ezbW~_~o%bcFRFXz~%<_`H{(ru?fZKHX^;>3*fx6vP#(OVWo&Y#R(w33jjK1L^ zRwf>+nVnxN%!M5`FF#1ef9_Znm*~{3_q4o;en)<^vc5_7PKGfz!_DPW5x~3%IZH92 zfV0Qfl6N#?0Rk+Wtwi3su(7y!!ivJN>~*fDuZX_CpP{YZq0hkaa;@pZ4GS8CZQRJ% z=x=ZX+m)uC6s@cKEe=7df2DKRiq5-&^ znB>vx~fQEt~2#i|@SjytJ;%ZB49N0Uw-|M zyE_yS0qKqxq@}x4y8ETO8zn^gEd2C4_niCZ-f{2!arYmGW4!EGd#z_bYd&+%r#QG+ zT9TBK(iUnbNEdsuk^OzcSjYONPnjmn(Zk;0**`R;R@Uyz_o$?ldY_Rg{-9r@g1i^U zTt2H9P#Z8^MB$LN0ejD+^24xVAs|L*W8%CZK*Nx(=5J$t#bPn^i6bgXQQpSQ?9E3B z$NB{zV%$B!oyEPsJ>x(1Vv(iK<0w}Sjz~bg1d!GXA}o2d@-YXnaR>|fyf-;R`ga14 zYBoE-OJvDXz6{-#Pgn4>_QBY^+81lE*s9V55$1BQkqIJ3T5u>I@_XhZ2r$Wr&!vbw z4?4&C)~P0llVrC-DCpFSb;Z_DbYAC4kq~njshCS9ZW0naypMv9cduz_8vqlx?_HEL zsK-b2ga(KFL$X%XjC%2C^R*Ao>XlWi;Qg zB*nj>@c}~+HZf)3A3Q|4+4kz|EnX9u`12l>CIE3>eINQd|SW%aIuNwYI@PRm^3estC>qRy6HXk zAo;`kXqUUopgY4fzq`Hss#F!q01}Lb!KAXpp{+<+Rwh=7W??ETOZx=($W+*J(c9)n zJDM@LHoSFeYX{=EG}SdGGi?qItB++dqcwH1t_dI*+6VLELY| zJvx#J1wCba@>^axI2;?;RYGpotjjCktgTt5%@!%;=0ZH(`zkTIxO`pjyS`Kgpo>S} z1Wu^Eo#Ls@b=ELoUzD&hFVbzk^*R+2GPF3_P;}Z&^Fy^%FOCQzCPZjR^(e{C9OY}s zn6Pjoo^7%o?jX%@$`Z+a`#Py*Z`d(upto6;R0p>{!L}ih`{}Nc+4LR3O4)LI$)TO@ zlFUPLV?xBE`&F`VF>g2}lh5Gt!qYm8s_%@+7grdr)nl077l?7YouK6xCg_ze zd)mu27k%nk<>p4%metWw)%GPhWDn}XLQL&JP4`{95gzB?vgZP%+h3hs*>rV+CcO2I z!`mlMA1O9oYWbS%rCL=d6Lb1fIye-TFkHl5F{C-Hm%NYeZx5j1jUV>?+~dM(A|BWs zvurV&zje-r^E_b8-IxX0bAG?=s>>TYiY~zDEk^#wo80iUS#6DYeX7E9=ZoM7*^1Vc zcy4D1`DCfHJ8KPXj7j|3I=kT?GjQhJ=xP8#+;NlT6(HCJL9cov#I^b6%_?**Vz1B zrVb||l_-!UHfrCGIY=N%LOIIxKH{*4#+-K5c6ovQ&L>gyQN>rMU z;gwt?O;}2&CO?Jjjnipvr@B9?*xDr$kjtBNp!RW z7w6Ak6(+FfRu%Lv)Ag#^AmtU$xEdU;bSerE`Nmrr+>GYOHzI1Pzw?k9uC==7bohPN zm$kKlWt!UT-M&m!x42bPsmXAGTp?dnVsnZWeP~iIIG-P5D|B(8^rxD0r1Ai(hgleJ z$q@(yI6o?V2cb%sO&Ij_e+PH@DQfAJ)RU_x$AT?ksirK zln9?kjkPy0vSXHX`!743A)9exO65VjKSL7B+)wWe6{SjwOSQIl@WmTC8zXFg#b14q zO>5gck?u!|rR@su*vFF9C0VJ}lWBGP9uuo;DJPTFWN2_;|31b)8>!zBofKY)@D)bg zldDfvl)p2p7A9fGL?w$lD-t13YX>vX$y*Oi(Z%PrkY}BoL&N5&sfiWtudxJjpq8%> z?s6E5=5!siI+(1Aw7KsQGK9#j3YJ|BhWei>yd|87+U)ObL_?34L@QqnPO48he8M%T z$yf^2?K;1*p)WCVbDN%06p@?^c!EODSqt&d#1e2dO@~%5hJ#6*C(qM*?e!;-TPOz= zlby%er*_OZlKPzV)X6uIR%6^^Nu=*T`@YQ?swU#9U-I2sdpVwf^aFt*pWa-tP?8c< z!CImCXGcb;4M=iNE(5XRHWzmq@$Z?H$xN!wF`;vhv7-l$p)PUUPb~y(u8e+u@shgS zGOgDV{gxk2LqCLkhAbD3FFtOBT^oxO1l-YHAf)cjYxEvth0*3Q^RsxCnXvF8>Aj7f zVBEg?fQRe}$%hlABa7(+d|{Lze1aE>N_ysq_RNX0f~Btv=hxBDusKnJ@~qXKJtf?e zS$3}fBL29qsJN6b$#cely%#eqMq=nlawy)aZLh=#QfQR1zEnbV?4?6T-gyOH|LgZclhk%!Cy>Lc+lTcP zr}xiIRJ**>+I(3C9%hfsl_%Ug%xv*^=&l%OM*tDyY+!>{szapbzxt_ccJt7L0#|mka-HN z+U`n3aP1aqMQVyRw{lyfxf-jB8>S#1V>8$okmj{OEUX$)d;H&zCKAY!&R`vre3pZ4 zmWwW_*_l5$k1yzC+wjkO4@7T#xChH5gbooynwx((r~bzZ&bS5efa1+)t1l=qn))cF zcO;g33;lcmar!^s#F1m87t74oWi4HEQPO(ib!s8nYbV+S9^OWA5yE}!G% z7Nd!@Wz+E1{kz7ycPfnT*^|UPTxR*5h%$L7OSzn&@ugBC zV?{qMP{;>NTAMaMOmrwEZjVxQe8`jvy1Xb}mhL>NK958Hq)prvb2j5fprs(q<8X;) zHZ9cpVnT%b=Wle0;kgPw(lp{Z^4Ke$o<*yNNtXJOpZ zQOhq0A#)}6*EA-+Y3~ntyePGbb6d)Xy_*J2waXAo{2lOJT|5&b`4y*% z8AEyLezm;!l9&N|fi*}R6#R1G95LZ)S%J(krEE^&lvz?Dc5h zK~U~iuu-f%n5hkT!z1}&uST`duipM=Q?XsO){vE5i|k*}sm-Rq4i5MH=Sh;Fld$93 z*UaelA>P-yW_kEw;{V74Uu8V)o`<_8%9?u1dYjwt)Q6gl)|9^+Y9|23*s}WSI=$7fVutKf*vTmpm%aUcekIkv4ZJ;j zvokz=fZ?$=z)m!kO-tu1YMLqrMfZeVR6#{8u4;hk?vg@4UkLEgsC>_Fu@g#kWIxNi zA_nC!Ox%}ZXe?t6z$+m?f$<3(9KgY(!1l4UIPP;7GAr)?e29djl`_G0aTmGsVISUV z9!PBhDij&m>i7!W0e&+UE>TiKf+!k279HO~cc=xhlmU$XCO$quixs%tTSupgfO1au zyy*%jcpd#0ErOAlFf+Cv)zZ=$*5w1jZ9oA@<1tK52*QRUTUICctS4>%aF;*R*5V>y zjOkn5k`242Y6Ti(czTs@S zzno_?Q;2#JtPIFL9-i(1O0P&9j8*R0eFVyfySNr)K@quvwzK7$&~Z;r2{qR(P*v`e z3IKw>*56yoXurQAG2>vwjP+!d{2d}8?6Yw~0&Ca(FOynfIwXQ_KXs%u%To%k2Vbsd zA1M_Sc83w&57-G33c57aYjVHxg}F8F>o>XZyO`hvk~XYofk2@YioI}nv{eGN{P-v% zv~qy=_&$9`Y~htvBAamuz#uloy1FQQPrB}#nwp$>2!n<+nJ*astq}rb(W$pm=OKq) zwR9MAp3U!{@WN3bqo5+>HONs~eJd<=a&$a7J?AuuwikDhVvz#%4DwV%y_Tw?H^pk9 zT}JuWVQ$qbYO1txh-mN`#HO$kIvRM;93LWCr8@>Ag#^VE2HM@vmUdulw^G5AAA|;gcKZhU?gG+mLzdKtcemj z)+;>d)re7VL6E)us8>3%Gl^HMRcvF(tigD5q!;}CC7_uX?foQ^*WYc1fp05buY(QW z>sG?fcth`;1+H#wr83D$i{C^JtD?U88KC8aW4C1T#O;a6Fh04`YNVK6t2*c~Ft*b4 zj;E3CF|VFNDIV@m2;SxN^F-}K@`W!qbZ!(ymrey-ieY&C30QTWMCWe76~x$g!ov8= z@1DHO8v)3}DE#Cc7MV#~96R8WU^uD{3GH&s#fK|=AOqxMXJPDcu3OlL?TAp8GWXd| zCk)J}x;sIdR^Fbw2Y~}93tRDcb?&16$@a9GKMkxtOnpe_CRbE|WY56*!=39+%#z9b z`A-MHp1~H&cbKd@gB#}w>)HB0{p4ZC$&7POk9Btr3nP>l)dA1_*|~`?90dGP4ha9+ z8NBlG8u@H1{p2LB&k7oTDpt}ce+JU-sa98B@PTk*VZ^V8O}ezQv1>>h66qk*O9%tSZA+U*o#v*k8_eomPK;{^H&qOzf{R57&d~0sC$L zfY}DWuFi8kUrpX@8}n?0kDdiI;tFMZ|r=WLOdo@Hw z;9hMZM0{%pJQWsQO+9m)rOW3Nqp-%0eMG;d%z9bNsF-_4>L+fh;}u_B*eoyA{-EKF zp-b6p47a8)reAY(Kc!?kKSjy(O!i>2PkaosL&yJOWpuBKHVn-Hd55c_cIQm%Bx|br zN4*H|bYNR_Wp9__ccMFEe~ z@&~#0ra}%8$+o5OC)wPF;sMp1T!=urYxIy2(o@FMJo?SD`eW~NORLY-Lz%mD9RWs& z1CFR^3w`gHrC!-=)iv@hHqWb)s=xNF+{)@Xx(tmxw(h5=9pLqJUGBe(h;bIS7#{Ax zKi2(GCts@Fe0xn5-z?N}>vQeq+y|4s;vkwE9U18X!JZhwP~RAV00rG`%r|a#OLfb+ zB#8t*i5d*uuQe^S6z6Z{d^iHe<_vMz+$$0$^D^>F0?r@9oCSk{O>K7eUKq82HT7Gt z+@p(tET+GRlXVet(G4sX{34!}k=-WW+y(4 z;&g~Yj6E)&-WVSLS|{;TrNj(lGRM4Sy&RFlQdNJ{-2jE$xZFO8nT%ov zf-~@cI=Z!6lKf1xK^mEX~*t%u5}cjuOIpo_1BTnD3Zpi@gbiQ(d|qew9i3eG5jFnB?XR=`1RT>taMeV)8-&#S*E82$#&CqjQhAx&V;wHh#%_e;MPfn)B`s@u_{| zem+@vp+>{@%vR8`?{IA8ap!CGa$X3fORf%A>a=IsGYejgy68blv5uck@O|l9d4SP!0&*-b_P}|6FoR^J5rj=6n-dn#LC$*|gZUH!1TuNU` zD-}X0K5fr^T2vd9J~JD4H?!H1dbyeJ!OP@nW4+@0U=D_U1EX^HE|U^}t2-2ON#i2MuKIacle5UsvDERpX>AbX52e11z_JVmTyEi3p!gE%U^fr-8(wb;r=SoT-5q{y=E|-Z{exg|v>m`aH$M&4KB=NY%7n|;wWAgXMP^%!2}br%{m5KnpU(9w;OBx}S%SV|1@RpD&% zWzg8%`MLUQy541eo}e2CM*62E+6QHD^ax5FV@!4+rV&Rho$_|$USIh7F=|WIWJAxAGp=~+(*1W7F%Klk4=ho@ zUKLe7y!X8l%<$Kdj2%pGicNjQn#6fm6cy^ivq&tDsG!e7go!6nVh(AHMkB{0O3DN z>z)tg(r3PwW*ZgZX(kBS9x(~yNn$3KD)YLJe9x0i39(+(pSR()#2CCg zc{2X9B)^dTURj}GU!mANxXUOevf1SJQA?R_H82YpHmcz@a=l?T8x9_bKn%OLUF_L_ zQD-WwH~S@eh&cIL1;XVwD!1lvwAWWInmd}r6%PyJOxKpdwnOcoCiIJf@hKtc%SP-3 z?3?S*ghSLz@sj%b;6+~5O6e@pZBmhzO7w_U&uh00@-L~U7K4o8Ng533glQUzx>sEV z_mO2H^GgX7K58($_SIbW$?N-FoolbUTjo|8wm(-MRc(%%Isp2*}^!l0>`7u*s1 z&MdbF0}=O)3~ggPE#hUfI~f_UQ63bUXl9(JgON3Ym2n&<@j-F!ds_Y-Q?NNr4I4AF zw^66EDKWK3`#k7sNJ&lEJI7?if-ssf?QUaC8`(gG*r@v zi7++~kKFdg$8MsnkM~J@lP973IX!oBs8zz5_b0JY#1RORvZWjP^>WHwiX|zFkMR5a+?l1LBGNn|h#26+ zL1t>bt}~G;G{M0zUhCD|$gAT^Pi^1AG=uy7k+KUVhpB(oh#PwA#&1)|9Bghqci~kj zUG6;fctZsJk_7wnPAM8`%mu-6^ouBKcCUrtsxT8*=uhdXrzk02G^cz}PxO%JC%mR% zt@~P_vhiMs-K#xwxyE{|_0`aZrD>j@(OgCzV^brdDH%%y&NbqZ~4iU zp_KE=4-FvIjVY|!lME{J>C)iCbmhsS4IkScy-?Si4U-;8rPfquIiQ|$QEbb}{3OQX zFbjGW>5;Lq|+DNKXc|jg(^t# zdygEz_em{YRw=in!5)@ypigaf%5O1>Y14;A;=Z_A|H;$Pb! z|GhTtMirLYwT&RDeknb5`5l3*FI{<{1MzY|VcK}#e~sdt+vVr8+pk0YmkQoz9olEY zozc)Mlao)b&?^u4sK+4F3=B$%C=g3hPnDZ9)l&co;?|o-fF>X^wm^=?r9Ks(0@t03 zYL;}V?ij+lC0jRdz#OZJNu^JG6#K~-7iOW)^FbUsO4ZA4VlG4uMc#zwoQ2hawMzo~ z5|z>SQ#O1z^7Y1c?Pfn^b#7oPw?`H7jMQ^!oS)ER;&)rRX*?jNvqq7W2Pqs&-R@yJ zZn<&Lxm-3$@GUd}N94;@xBC?bj}TKaXAQn!+p5A49nXi4%9LI|myG<0h{z@_ggT zu;z}@-7f)|4YZy1{DG;%yLy{Wu6*g7CaXC_P&2*B9#y*q+j-%O2rgib&Cl$bs59H^ zhL+6Qob78IBzw0q-x^aUBIg7BxH;-(!}puZ|f>u}{qSW?Ij85ekDaCjjFi zh=fNF)I>fW-=AMD_onZE>h^3wPw&JFPv>QxTN~O@+Xp4ks>1j;#HI>5H@Cj0Vi#K%sOhFRdan&_3seYh z%;VpC+3xtWI8gzc(DSj-S)s&_}vBFzhIHV>s2es3*ffO}pLcJ&E ztmT$oZmM=!7SHueEaxA__X)B_BQEOlA4*Vof+QElEm@w>;p*`duCJ{^{#gMb{U-uf zs|;@HOrE`*u*TLSzZZR0MN$ui+dQ08vCf~o&y)f z*zYU!ju|`_;~#_9d%`((kn={;1c1h?(9iES>q5ZZt@h%ZjE`ss^vtkr1Hs$NdgK&N z!K+bGa*5dm@87+vXM@j+)v#BNTMdr*q9m(qdVWm~B=pwqbK0yq)&n&y;u&h0R&*>4 z4b80E47m~)zu3*=JWpo`!Jr; zOvtR#JU2{yKaD~ga;h?`q{gyUXjK?!ThR5XG3r0--1yvp*JI~*Wmn+k?c*JT2A9g~ z7ms4!biI0gd3o9K>A8*Kz-!xC9TlCMITGtVW$o+D+GQ10 z_2owIr!@B+OoBE`4ICtl0&UB76H^T2AAhd;Emamx$s_+Au+aeUS`2~d@TV#4yclY6 zcl)|xqpSU{hK`<|>-HR#=uz`3mZ-5%EP8UoXD1HpTXKT;H3gbE$!u1yLx%+XR@*b5 zBE2CsLYR@DsN9j^x7uQJT^YYqMBmdP<}wD8?uEU zB@Ad*xc>|c&2KH$jY&y=a1da}1FE4mqu&bJ6t~_!0goO58?=GcRBHu=j!b{((&dfKb-)+A=bq}pbWr~K z`ue+;JMyt2rRJ-P=>a;rc2QAa`p#u7FJ*xctfL`sR7f7wae1L_cev1eJy?IrdvO3- z2&AhmR9gRRZ&YDmcvo=K{vo6vu>nqySYKbCcp%vZD)jflLJ@m8!s0n4M62IlUPl}Q zahxWWz2h2c2yv{*;6eMVtSv`Jr%ETMBmMH|Y=v}gIinZE%@@9s_RlVVU(az+DWqqH zj&*n^8xht>@10+Lf}3rsKRwc`(kO(s+)br4{yHF84PI#zDmd?pjcF1sbfrkneqs>(FPzjt`F>*~B#^r~SI9T_WHx z+87rL<>%+uQlVvHQivud#FX<@E7c{#Km^>z`qS-N>*ZgAKsukyT&_D5*d?ZB^>;e> zr$J?4QSgF|KEi!c;@^{=Qw7G)q#5R5E;*SEZT)oLSpU4*fxfnu?zbxz{p;k1M$1`R zY3qG>+PkyfD6^4tU~zW=ERgPg-5}LSqex16pJfD17inLg^(}DLKq_j=<8bq2AQ|xSZ43Vet{ve&a!}Q<{!if;^A&dcmjhF?B9Ym2K^nw^$ z!sV-@_J0>y#12?wk$$6vex5G(!H>aHK=@263hNr}{?Xq3d0)irVIJ9zQ#i%nTzB~i zo~~3XEZ$R{rkfFahHo&XHRFsS!}$A_6jf|Amo60*6qnr;h!ty9UwRdSedQkK!Btp8 zm#ot+WOfm;%jBuV2*Fp+a7dWZRsZlF=^xz-kx zxYkDPJL_+`ZeD>$8?|C}EPWHy6Sb_Tlpd}?;o#6{)y;}{mE&9I;#nhAADD!OtsXTR z_y{KG1KIE)yad6{)8;?5UkOus`k_|0RWiYnd&`?2`OZ`C(HkXm(MP1(u*bMTSzP{$ z{I3fH^4&xD*B}KQc3UInDo;rjGIvQ%pYoFnzugES;5O7{k4aTx4o~NgRZi?PV#R&F zbs&YL)1~ByOT}?ZkkW;Qm>Ng>G@qf3>hom0=lK`$LfqH(>{9#4S2ow2lLMA@1VqbH z%x2@dYTDMCmo<;~!Av=%IHxotF=I+^GCO*lJ+o&cIFwxH&pzJN-k*FDy1V@aBgfLh zR*hy`PICkBstW8J`{+ukQ#!VAo?qdvZ+q2w<)rearloYRmTAgPf&1y3MT5dlO~FxE z6)jiTK`sdx5@Oj0t9-jr(~Y>@2EvStE-~xfO}zGXl(iJSUztqvI~{F1dc=2y3?M4x z5=~fgh-Zx%un*#JjwtWh%v!VBz^g+RDOtYNAo-|qhHY*w)p@yis7l$0A_ooW3fv2O zYVlerP`}U|F4s+>^vKGGW4&25SSueVmcl2NyxO99OxDtNa(p$|4O)m~*4BOw^Y@HT;*nCgPSV*kiM>nrBl$2iG-~o z(KlXTaj>_M$8K-YSyk?Vo4b8e6S1))&-nA{Wo@fySwZeX#mSGaJ5B9_Qxij(^wr|U zQ&r5=pMV|1Zq*^JGiGCgT0EcQ$i&9kXIbC1g{XREtQa1veXAXwzF-*-RT^$5+Cti9 zzn{hcXiAkK6sY#QI~SibtA8!o?j7DULYTy9Qob1-{V8b*)k2}M9#tC0v|iC%tu_Jj zi}_gy>3|or$;Da{U2kqJ)H+bfcUd#3@i!Q$5D5u4+vhGWj=%xu60jDkKn$#$$)xHXyjp(M|Y;1_}csSksj zLjAUm#h-MzNx0kh6UcgLroa9+%(pO;p$jdrq+KV2*Lcm<$UFf?d!?6SUOtR~Pj8AG z{{0b%AsegRUBk(RQC5j2@m(4pCOS5zI!Q&OtT#^%0@v&>ii*9 zF>2rCFd6LWw`H~7S=nGD(0mx&sym)RDU_L;Dzn-Ts>)kjSk%pl#}71h@tU3Gq1cqp zDe&mY2;0b(Yr~$iaFrC|S|oDhnJH4*Ip-NLb@PVKT14;CU8i(g>l?krIw)$+H#XHg z$~^3koR9-8(!9L>%wH}QMzjXzP%YHZE>@Fn zG4gB^eM>ct9x?J{RwpDjP>~|$HrMf2u(uF13~lJrN-0(uHgwt@c(pMO&&|snSrMwE zfdAV53lve4enK%?m`Q)1zZ|alQs>N*pF9288FH>*^eHNjaJr&mjb;gQbl>ZgEC>Zh zG4Vis%s|@I>;CHQ`KyqMa+la4$FSV{bkm!J?an$Ws+@oO@jqJ zCufYsrt`$`TxDt&R6O}G{qW+Kyv<9PGDHai0*3>3{6GKf=R7db{YA;(CwoT|F_DP$ z1n$4bArYaRpfWJho&EeVG^mhQ>Tj}@lY|&^+77~7AMU5n%Fd?frp%(j1$G6uQpJFt zYtKtg_Ni;nD--N@qswa0*i&~t%F5gKG%P%qmcKR^NUtpWI4Cg1I-(?Qs+P^d`m$saQ>Y`tADa)@&5wJXBL7+Ku8gv(-(gxhP!6fJD&9%)vs8 z1uHtg<(FMPa`ct+CF+1#d#|9jaR?;CK5c3Lnx& zHFzBHRn=$a#uD&g3^_X12lp97ll?r__Or)qj6qLEn3jlU>shs@U_^t9ky_4_lKCvX z>;E|E3NrI+9EKWyH-EX<6Xjq=dl=kE2S>D{RA_i#!ikjrK6jtga4I0<<>&d}% zPtN?Nid>`fDPl2^?Si>}O?2$HgvRx+`->n2b9Nf;_RfvUr)~fU+f+3{myoZXJ76s08Sqf7nVnleP<$*! zk!>Z6dTHu+_!IK`a7$7iG9O1WjXgwX0Wu={Q1-&uR@+yuZFQ6 z*bozbkK|BM(#^3}1VvuNuk$nX;iLKcWVii))QbHMD(o0=UJ^<$wNF)LKwA|o-bUB5 zrlS0`RFh_T-d_SJ$#<|sqe4sBalG?IR zqv8%TkA!+jH|NV&=-}&`CvGkrT4P+#7m^)Xs29~0`KL>~3eNn*m^KHYv z1N!-*El;A2CNL{r^(WXdz+)Rt?YQ@CPCT zx#RCw@KNCjJr7ivhTKYt)H|Tp^cQF|bmHLQcpzd(SwfNt-tg!VNq|VblRQlH2h@SN zf=TIvnmaTg0HR6mSdF~~gln<$e?Q4OS3U>r1G^$-G8u~~W%=jHA9~ER^RLen#1FD_ zcz3|-{%)x<`9N49q*R_{NwQ|_$zP9I`NLTm1xw%09}rTO?O)b$aBvn(NkkgAXGr4;aY`l=-SIUnKV5Sje) zgNlg;2A=8<=jcTL)!3wt-Pbd|aP)-rPUBMz`qvLn{mWONTE2L!<{JltEM?=h`uHDu zNTKJ==LvOtgU36@jE^`uE|oKt^C!=>Al(L&4?ISUu6Jcz){H@2nD!8_4I1-5B#{Cl z!L>6?;E;4hRG--Gw9!fiXe!iy*e&xo-7Eijxj+y*E#qe2yD2wRV0vxx#QS|^<=@5- z53c~=O*1|Q>Mk}e64IX1{CNt=50sZbhjTXrs{Q1^o|Ln(fl)OsASn&^gy6OZ!Waq3ENJ2xyX*XcDd~nhFU=xRdC`R5kwor7C4jZ1iCIb48fi{W% zHqn9;UIAaGpwoaPsm$MFFxvWSYk-48jmVeVV{0Q%-$&LZO|8)5y7|8H3JP?r$s1w+ z-TDgF^0j?`$J%QLT%dM{*^S3#c`2lDl`q42y$>Qy_^IRxay;jdMsDRiEAzl2`*VC% zSU8bT$+k^<4!3>~IB{gl8H_SHH60nP7BwQx%z!WBQ~~bpPmFhm&F@&Yxt%0J2yA?6ng{{`+*x6 zj>n?)>P7S*XbSiok81|_C~EYVzYp$n`ANT!7W|SN6zlO;{UFpy}zK~6kA?> zdWtJFwWGbguj;=K`Aypw9yE1H;_@U78YnI(sk-mjbd-`}44PPNz?FqF?u|6;xp!~v zE|1M3llWr#cG`%bwe&XUTQ)TdVmeSNC5#f5QUDJi*(m z=I;hy=N^$R-=1*CQE{q%R;OJskc-P<+_%ij(o1HE-3*eqWXre_}kG zx!Jd$fwxH;Y#&XYJaFg^^yc$i>-|`c{-t=`qbhvoyJ@-EP@=MiiiV1khNh~bzJ8us zp_H$$VOn~GAmQRGU{zaWQJG&OEZ%1~VN6dhNX?vGQ&O@h%YXzPKzDJWz^b4Z^)@ac z2(;UCkaf1!FrTSTqM-VR1%Ua^XZ@oL^yN(art#mQoMZ5NBbEgv;&J#^(6Ez&gUJ%5Bj;LfR|^66)namQr7d!dtXs(@=9`w5 zJ6~F{=k7eexeki9-RNSKzgFSYt}|#DoJ$NSyenT{P{vd{k5vSo9w|{{3Kn0jPB7i6 z>nV!=TdENan{M`#Q>wuIDIYzzo~v<&X_nk>p~=ZfPPe+WmKcf)T92}_?kxneb>(y! zON5&whA}6{JH&NtGU@{@bRr~1jH;=*Nj^=$P%l`AF)y8Q7mqU-Kj}DDYGO|H+XD#} z4o#ax5VXeTa^GlsFM6%U*qHwBjiosa9Ir6r>?E|ZhDsy49nBl&kpqHm+;LHPRyVN% zx0;d`E3-wU2MG5n)NyA!84L^sWId>gHUSZEPoGr&hZ1YVT|aw#cVUyG1Zc`{+{qIL z_|qJ1>L$J%d;yFGJs?{aHoU`L_MV%eZd@V?>8sn^|7!!bB0qr-c*EI8L=L8?5oh$M z`9Tr2c5j6uFFU|@SLbHdDX-=Cl`><5wyrXpS@(iXV~vsxY{I6Dy6=Bzv94|jYU=7k zsR9zz7-Pov&anCRUD0ucQzbl}Yt#ut7D~MmVK|t0XyPp)p)xlcq4yph9=pywC@GZ& zN4o!w2h@MsOvde*oX=lar|`K}l#a*|@zKyR@!KD?9auOmklU(^u;4rwqX>j+7T#mT z45ir8w_s0>9ycoB5Lnw?TN62dVp5q|Q8B(aq)Y0+VWRfHlMQiA8Vz``{j}Ilv;NPB z`_K1*c>cl*<)EaX`SMkk%6y7Mu3V}-taEh7Q?8JKQ+2!hr89@4jhrQ=^jjKUEV)+o zDV175lWjn}qk+%g!BQbJ!;vTGc7Zi<%MF;{hiEc;P%b-b9% z{;SKp?3$GrJ}?A5OR&s_Hz-Jjr+bL@Sg)@^9sp2@=`+w}ae`7VVIT!Ws9&K7PejZV ziBl~fp9OdBe4pqU<{a4-X`L$vs;p3m?zNM@=-S#+b@8Ym_E1kp1PZCnFrT`TqGTpM zgC%sV(hDfPgxav~YLXeeCVP_v-CSL@y_-MmzG zzLM;zi5$`4_o#jqEK(IkvD-8CLS=x z>~kQ(l#fbdP@wke#TWyS@EmTntdCxu?5*)=as&-gG#|OLVV*$dtJ8^4XDZSP<{SrJ zYuMoQHAT86cK|}<@OqGfps%Z+ydqo-fWdGoDH&bSWt15SSn-}`!6}fkX|-N&0|ING zWk&6zq+h*B&GLLLI#nZ(XHBVMeU<3faUU!y|ugvC5`0_5^ZCyO=XH1|*fKSfETauf| z_Eb53wt(S(7d+x&g#u^KGjeB6=nz!2#M<-sk(tzR+`;4kt{E>ccEjuilXvvc77)n9 z9R1|4B&IE)E-R{$8XL7e0`kLGKIh+qv%L9k=*{p5@s>+&l{gg&&+DYJ<88|3n4>lS zqsatX<(|Dy1@Kt6!Ds1G0jSvr8hq<5QGMuBM>pk}4OJC2g9D44GlHoflVoM2b4g7k z*XFD5Q@FgZfW+4kiEUUsE7f=!$78wAh5>kEEx#snS+DFGb09#2)crOdN>Gi+eRj z%9q-3PP~*_x0Ed`=WESu=rkDBF40gD)pYquCUYlCDnNePSs#!srFMZnkTgC|_^{}{ zB0VI&`2AbCYbTGQU-9!4!iJ}QaE1$ra=c@{1>J~x#gR*?fTd?!9OTJ6!;AJ^DBPKhS?$7K)upRt>QwB zIoqRO*fx7R9`T2@su3pm)+W)3Pa#rUAS@~@6AC?o^$NGO*k54Vl5O&uSW+cGnLd$1 zp0455oSR!YI@%LPBd-zh+=A$`PpIGN3BxP9T2@)cX>}P@22LLvm8HJ>9_xjYwqU`I zSAkd}9z?0ZAo_?PH>XmSZFPOuZ@E3MN^9uTV(VleV7!3o*)x1##W|7M{sq5qj5GEo zl66Xr9`gWSJQLq0>HD=p)e@DFi(q-f@}F?&jQqf!?~vK!blt(=eR>Ah+&Duv%K7mQ zX9HWBDp5A~y-rZ8-Y5BIm+e5{4WQC3jO^R0U8Hec&|{4U5IlC-0m&#{1*__ts(8Qq z`jMZp`j(M^p?30QPnnjDt)X~hy|OFzP{l0}E2f-lRDD+iI?9G6#;gp64Pmw_R@S84 zPi$YrL&n~lkxBA{F*vm|?uZ$8WPDv1>+n*_mCEqrZwZXpjp*U~jWH){RVytXZH|=4 zXY%$!Z=^gj8dIoTd@5^<>k;V9v{d5F*q3pwi)N;3%4OlP;hHUqj;LyC{&+YEVKdXf z>?8nc0+1^9s(PNRuhG*KQ)i!24BOi5P6-(4DN;hDfDfEHpjt~Hr)_Lwj*e=m|F2p{ z0UEHQO-S;KOJim`md4%^!HC@)<&;o?szt)UhIUnG6>lyeV8!Hf?i3AAR@}Pom0JfC z%cAR#_!oU(=h4+v-s)Uu(N3Raw&ksJZU3C4NKy`Xm>JeAcyfx>b6Wr6PIAesaF!L{W^#bpiYGjm4|s{%&XA2ctx%74%#8teQY zHHpqGrRx59K_h^*-SC;52NK`%MS*7?)Gms?(UR!e*H_Sta!zVeFFCmDI*7d&p}|Jb zURJ;$!f@i)UW>pNpu+Amk#jjie*#HH8p~9>ZP>KR&#q4Av*;Xjg@PF^J|FfXcr0Lk z2=Y0CsOoeSjzqu8dnxPCl-7Q&)=H2+80twsZ$LLe4yY$*C4S3S#cvMuwDq|Se?O1* zI2-h3B_l=^JgGDsDJ3UZVT{tU{X9ifzk7rto`*fuM9UaN;+cK|>ccKBdhu z7cWeU^1j3J;CD#%f&w-E-xyi>U|p2w+O zm-PL>(z66z4VxG%H9n(&lDI@$_bMB@gp_4z4h1tByeLA`4$70V~Xu z9WSIGDYpu_aP0fTeW?wRKS8(md4Y_M6>4I|uVMRWAjz@*P~Esky=c={WOn91Qxg&h z#72-0IvvERT$bAz$QuP$%iFWX0R@9Kvn0_wCm%TC@`ZK4) zA4Pm?J6w6~`%i$w^XR{|#s8NqwI1;JKga)lFWtX?Xz%|2p=FA70d~HY3TS*z8z&7+ z(D&DSj4A--Sy)lnUE_(=0|@iy07(dJIB2ma+Jm}x=80`)rfHltBgW^_&K@Y@aMiwh zc5qfs*4@x3^-sg+KWzM9ZlhQ3yU$~0mJpmp1+4f?Djh-7`uBIjWI^Et`NiC>C*R)C zr*XMD=F#4)_#MCQ#iKtZ_E;$g=Gcfw=iixm=2`1m>zDVs?=u6< zG)!EEOpPihquX12UI`wtk zg3ygbA^VHKXG6kddgNIN?>0I+#9_TK>8=%$5%Nw5=iFc8gRSk;_S>0TL>7R&~>dj=Z)*Nr|AN~;+ z7w_s8y*RJwgZFptnz+BAej^$ncDR2y>8y1Evd(N!hH;zw%Io`s$lu@3+QDY7Sa%4m z!G##>MR+&|BOR~Vc3W9m!2h5ElH}Y${Da!@y8t;h2j>BYivauIr$-B+M~43l-a&?^ z$#sd@KBQYQbg~E@SZ?8eV<5Q&sZPA^_#-L7^=~a;#d1-15x~Tbi6?d`j_}#OaExH) zTWCmh3r?_NrKWC!{dPVdjy{xSyym;k9lK#OYA%z80DZ$Z z_UN+tL4&UYopeFrLmm}=Q-#UkyX>%T)4LFz!(sn?jzp=SFY+PnU%~j3M@iZPq=w7_Nl@-v@ zd+6B&`^`+tvNcr5N5u9;N!(UVT#oiZKQBs887OW8*aG5O_x-3S*oYZw4$b`#*goKV z2lf4HEFa|G-8KSurRBb`jM#uPHIkVyh7RTxK=^fj_Q!-kDJe+F0OxiQP;U56q?qM|L$E6H*g>zcle3o zlRG~kK=2orKAtA`wJaNr1klO*-8w-*N>0kgC0P)>J6%D>N14#_vf7cxH?}2km=VDP z_Ct-{!QQ_93+F#|klyaz&J8W^Xa2XRejj4s{O5wlpFx~;)IiB?TFdm?;Ub+=ut9SN zMr2Xb0S};W(93X|m4#$<4H+rf%lElM@^X=x8WOBP6RB-scMTlfIy?6{e+vpeGtbe9 zI(b__aRXrQMxB_7nMch|U0Vk)UOdZqpG|(C!xa5bc|=Z_?9Bu3v)r+Kr}OV?Ejq{} z_%X>p12pjCu+0@8rV^$4-!6rB4T4;>X;bex!vX)kVJN%8s2r*Y5k4mR&<>5erh9r0 zCk+D)ADi}Y|3EM4S}vaAk&n6E<;P2%|89*#pK-k}f%~X+EYaF=dLt%=lX=yAs;rC* z8yx8Uq9mZEwn(LU*$0D(We!=5$33vwP5C<;NJ(>Aw-jOD-K4sv;Robq6_C=fh%iTB zaj~I_p^aWZnAGkh(g-ud(a}kECc{(#NO4xzREd#~5#49}Ph}BRlK|HU`3TYU=Gyn` zkXykMvOxb(&Dfo7{EvStUWbYiD6Ppd!cLuSK$8K8z?b*>n7Ins);A?l-9hEbAAx5j zyu$Kpet+{vlz<5uob)Ltx3Ulerq>M&x`}zdPyz(w}U%40UdJ;#0-GkivbaO~d&Wv#dy< z!d1tdf=peO`aScUOqGv?nEO)-UvIAdxT$}j8>zY84Qogg<+U2piB~teeUz&vI(O(3 zB-^1~Vhf!jC30zHS^m3(+^FW!yheN@H+fg4xq2Bg>9n++sppc3?2VCqH@n<94I33S zw_CXp6|^h}eJXsVteb;DOF5M71&Zp489uk^<@J&?Xml<4NU-1sE-zlLF&Qu2!U_?#LmNigr9{qhDpSvcZ-m&s0&z!Y* zFmFda!=9~64+kR7pwc04}~R4^6pKI zCgvJb!-E>kuR~xfAR@AGJA4A|NqFlf`Q=kf%y#ZE(Tqs_)p919`^=?hgF|Ch(^9WG z*VW`BhS1(}Ft=oZ$f%F4tQW(~A!iG}ILT#`Wr8`GUIZZjros+iZ8+N71WY5IHp2wA zCgnGid!6}gVDlE$wRhk{i8u{S?cG)z_-=fgl6Fm>nvLkDne&JoZpScu3@71Y8FktD zT+z0oXAz6I2?q>lwe%9ltjNW9l~(E`zWM8+J!KL=llrm z#{O~(-FhJ5(5~}=&7eBOVWm5`Mf(lz54xY_l}X!oypR$bQ;P2baJsxwDo6(t( z)QsfnwA$0d*0997qx=@ZL4~QTwOOadtyWo2OyB6f(wFDoAarl+KglVHe>N;t$zA2% z!%TVDe+C!_3db1YOTLu`o3E8v@BvD;+QLjt;nnepPG1zliGn+nM}bG~YPzXzv!`{% z%AHGlT&z&Pe#6|O$EW!fFm6d6Dp-Vqx}s6lbd4l z{p^Nk-!3NdMj`OzI}0~gI}oVBjI64r1SziO^``K-Idr*_B&g1XK_q~PXD1V7Ze&>A zvC=st$XDtmA-id)(T_;gp3zxWw^Q;i`dl#slQ$i0e@%Mz9ncKEHeU#+QSKh4;*P-z ztU6%sXJZv!xWJcf~Dtb9Cyyme&Z*eC#DaIB%vr1T0GA@d`DhJTEK06^3wHg$TItUChuX9Z((2(smjaF<{9st5_0oZ0R?20W4!}bp`7a70^h9i7owT^$pc1t zqaWtxf9YRX;1FM6teZ*lTLKtepH;+99KQ z-BqHK`Z28El?A-pL+(RcV>qn4c2c<&>AxgZrJu>PdACPFBqsC?c2l;%$^(fTVh`J5 zf;8z${rxhMQ?N8C8|gyl7*QOrQ9WjmRGGbUVc_dzncTQIK;MBJcV9H(8~Mk={pl6i zKnaw4i=iS?GL%t3z@txt>uP=`NXE={1_C+M(Kny;K0L5+-=p;HakXAyHa3Gw7E1Kh z>*Ub&Q!%o<{w8_Q<5R?F@T6uM3+lMUfEKirHnPdh+TJT^E^kv(JcGYENxMN{ygeMI z7#>E*{*$Qr_jy2G{!Oq4;{j7fYsJXJe1(I;zH9!wc+0w`0@M9z3z`Mz;l@)m>jWa= zaSz76VS%Ll3w&lRs;7>9WqROik>^=C?$_cPhk+O3K4)Z{0v~kmjilGzG8QGlK+(~X z9K!%P>URXqimk`*mOhyKShCqFr=C28#?CDHTieDzH!f!kfF#rlUACir;hyj|S8-i^ z5q-wCPQ7GdZg%bu)F3iQT1}1iSPbiwV#wyU_`@L{EfSMZ5jApq4JTtDa^lT1!&Ad7 ztQt0D^v=VgzxTJhlCFN3tqu;HQ!#(^LqpGrce{q`+5x+}(#6p|vjuW7g|QnksmnT9 zGY