diff --git a/backend/cmd/server/embed/_app/env.js b/backend/cmd/server/embed/_app/env.js
deleted file mode 100644
index f5427da..0000000
--- a/backend/cmd/server/embed/_app/env.js
+++ /dev/null
@@ -1 +0,0 @@
-export const env={}
\ No newline at end of file
diff --git a/backend/cmd/server/embed/_app/immutable/assets/0.DkgBtk4_.css b/backend/cmd/server/embed/_app/immutable/assets/0.DkgBtk4_.css
deleted file mode 100644
index 792fc3f..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/0.DkgBtk4_.css
+++ /dev/null
@@ -1 +0,0 @@
-.loading.svelte-12qhfyh{min-height:100vh;display:flex;align-items:center;justify-content:center;font-size:1.2rem;color:#666}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,sans-serif;background:#f5f5f5}.app.svelte-12qhfyh{min-height:100vh}header.svelte-12qhfyh{background:#2c3e50;color:#fff;padding:.75rem 2rem;display:flex;align-items:center;gap:2rem;flex-wrap:wrap}h1.svelte-12qhfyh{margin:0;font-size:1.25rem}nav.svelte-12qhfyh{display:flex;gap:.5rem;flex:1}nav.svelte-12qhfyh a:where(.svelte-12qhfyh){color:#ecf0f1;text-decoration:none;padding:.5rem 1rem;border-radius:4px;font-size:.9rem;transition:background .2s}nav.svelte-12qhfyh a:where(.svelte-12qhfyh):hover{background:#34495e}main.svelte-12qhfyh{padding:2rem;max-width:1400px;margin:0 auto}.user-menu.svelte-12qhfyh{display:flex;align-items:center;gap:1rem;font-size:.9rem}.user-menu.svelte-12qhfyh span:where(.svelte-12qhfyh){color:#ecf0f1}.user-menu.svelte-12qhfyh a:where(.svelte-12qhfyh){color:#ecf0f1;text-decoration:none;padding:.375rem .75rem;border:1px solid #7f8c8d;border-radius:4px;font-size:.85rem}.user-menu.svelte-12qhfyh a:where(.svelte-12qhfyh):hover{background:#34495e}.user-menu.svelte-12qhfyh button:where(.svelte-12qhfyh){background:transparent;border:1px solid #7f8c8d;color:#ecf0f1;padding:.375rem .75rem;border-radius:4px;cursor:pointer;font-size:.85rem}.user-menu.svelte-12qhfyh button:where(.svelte-12qhfyh):hover{background:#34495e}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/10.Qar-kS8x.css b/backend/cmd/server/embed/_app/immutable/assets/10.Qar-kS8x.css
deleted file mode 100644
index bbde314..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/10.Qar-kS8x.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-15uyvzd{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;gap:1rem}.back.svelte-15uyvzd{color:#3498db;text-decoration:none;font-size:.9rem}.back.svelte-15uyvzd:hover{text-decoration:underline}.header.svelte-15uyvzd h2:where(.svelte-15uyvzd){flex:1;margin:0}table.svelte-15uyvzd{width:100%;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}th.svelte-15uyvzd,td.svelte-15uyvzd{padding:1rem;text-align:left;border-bottom:1px solid #eee}th.svelte-15uyvzd{background:#f8f9fa;font-weight:600}button.svelte-15uyvzd{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff}button.danger.svelte-15uyvzd{background:#e74c3c}.modal-backdrop.svelte-15uyvzd{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;border:none;cursor:pointer;z-index:100}.modal.svelte-15uyvzd{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;padding:2rem;border-radius:8px;min-width:400px;z-index:101}.modal.svelte-15uyvzd h3:where(.svelte-15uyvzd){margin-top:0}.modal.svelte-15uyvzd form:where(.svelte-15uyvzd){display:flex;flex-direction:column;gap:1rem}.modal.svelte-15uyvzd label:where(.svelte-15uyvzd){display:flex;flex-direction:column;gap:.5rem}.modal.svelte-15uyvzd input:where(.svelte-15uyvzd){padding:.5rem;border:1px solid #ddd;border-radius:4px}.actions.svelte-15uyvzd{display:flex;gap:1rem;justify-content:flex-end}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/11.D38O3Xxc.css b/backend/cmd/server/embed/_app/immutable/assets/11.D38O3Xxc.css
deleted file mode 100644
index 14eb981..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/11.D38O3Xxc.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-oa5z6t{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;gap:1rem}.back.svelte-oa5z6t{color:#3498db;text-decoration:none;font-size:.9rem}.back.svelte-oa5z6t:hover{text-decoration:underline}.header.svelte-oa5z6t h2:where(.svelte-oa5z6t){flex:1;margin:0}table.svelte-oa5z6t{width:100%;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}th.svelte-oa5z6t,td.svelte-oa5z6t{padding:1rem;text-align:left;border-bottom:1px solid #eee}th.svelte-oa5z6t{background:#f8f9fa;font-weight:600}button.svelte-oa5z6t{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff}button.danger.svelte-oa5z6t{background:#e74c3c}.modal-backdrop.svelte-oa5z6t{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;border:none;cursor:pointer;z-index:100}.modal.svelte-oa5z6t{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;padding:2rem;border-radius:8px;min-width:400px;z-index:101}.modal.svelte-oa5z6t h3:where(.svelte-oa5z6t){margin-top:0}.modal.svelte-oa5z6t form:where(.svelte-oa5z6t){display:flex;flex-direction:column;gap:1rem}.modal.svelte-oa5z6t label:where(.svelte-oa5z6t){display:flex;flex-direction:column;gap:.5rem}.modal.svelte-oa5z6t input:where(.svelte-oa5z6t){padding:.5rem;border:1px solid #ddd;border-radius:4px}.actions.svelte-oa5z6t{display:flex;gap:1rem;justify-content:flex-end}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/12.DQdHIvb_.css b/backend/cmd/server/embed/_app/immutable/assets/12.DQdHIvb_.css
deleted file mode 100644
index 3f6263d..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/12.DQdHIvb_.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-1lsf4ps{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;flex-wrap:wrap;gap:1rem}.controls.svelte-1lsf4ps{display:flex;gap:1rem;align-items:center}.controls.svelte-1lsf4ps label:where(.svelte-1lsf4ps){display:flex;align-items:center;gap:.5rem}.controls.svelte-1lsf4ps select:where(.svelte-1lsf4ps),.controls.svelte-1lsf4ps input:where(.svelte-1lsf4ps){padding:.5rem;border:1px solid #ddd;border-radius:4px}button.svelte-1lsf4ps{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff}.log-container.svelte-1lsf4ps{background:#1a1a2e;color:#eee;padding:1rem;border-radius:8px;max-height:600px;overflow-y:auto;font-family:monospace;font-size:.85rem}.log-entry.svelte-1lsf4ps{padding:.25rem 0;border-bottom:1px solid #333}.log-entry.svelte-1lsf4ps:last-child{border-bottom:none}.timestamp.svelte-1lsf4ps{color:#888;margin-right:.5rem}.priority.svelte-1lsf4ps{margin-right:.5rem;font-weight:700}.log-entry.error.svelte-1lsf4ps .priority:where(.svelte-1lsf4ps){color:#e74c3c}.log-entry.warning.svelte-1lsf4ps .priority:where(.svelte-1lsf4ps){color:#f39c12}.log-entry.info.svelte-1lsf4ps .priority:where(.svelte-1lsf4ps){color:#3498db}.error.svelte-1lsf4ps{color:#e74c3c}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/13.DnP_H9DZ.css b/backend/cmd/server/embed/_app/immutable/assets/13.DnP_H9DZ.css
deleted file mode 100644
index 5caa7e3..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/13.DnP_H9DZ.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-qegr5c{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem}table.svelte-qegr5c{width:100%;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}th.svelte-qegr5c,td.svelte-qegr5c{padding:.75rem;text-align:left;border-bottom:1px solid #eee;font-size:.9rem}th.svelte-qegr5c{background:#f8f9fa;font-weight:600}.id.svelte-qegr5c{font-family:monospace;font-size:.8rem}.reason.svelte-qegr5c{color:#e74c3c}button.svelte-qegr5c{padding:.25rem .5rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff;font-size:.8rem;margin-right:.25rem}button.danger.svelte-qegr5c{background:#e74c3c}.error.svelte-qegr5c{color:#e74c3c}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/2.By2d6Bxb.css b/backend/cmd/server/embed/_app/immutable/assets/2.By2d6Bxb.css
deleted file mode 100644
index f2098ff..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/2.By2d6Bxb.css
+++ /dev/null
@@ -1 +0,0 @@
-.stats-grid.svelte-1uha8ag{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1.5rem;margin-top:2rem}.stat-card.svelte-1uha8ag{background:#fff;padding:1.5rem;border-radius:8px;box-shadow:0 2px 4px #0000001a;text-align:center}.stat-card.warning.svelte-1uha8ag{border:2px solid #e74c3c}.stat-card.svelte-1uha8ag h3:where(.svelte-1uha8ag){font-size:2.5rem;margin:0;color:#2c3e50}.stat-card.svelte-1uha8ag p:where(.svelte-1uha8ag){margin:.5rem 0 0;color:#7f8c8d}.warning.svelte-1uha8ag h3:where(.svelte-1uha8ag){color:#e74c3c}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/4.CG2X--Z8.css b/backend/cmd/server/embed/_app/immutable/assets/4.CG2X--Z8.css
deleted file mode 100644
index ea80681..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/4.CG2X--Z8.css
+++ /dev/null
@@ -1 +0,0 @@
-.page-container.svelte-imhhoo{min-height:100vh;background:#f5f7fa}.header.svelte-imhhoo{background:#fff;padding:1rem 2rem;box-shadow:0 2px 4px #0000001a}.header-content.svelte-imhhoo{max-width:800px;margin:0 auto;display:flex;justify-content:space-between;align-items:center}.header.svelte-imhhoo h1:where(.svelte-imhhoo){margin:0;font-size:1.5rem;color:#2c3e50}.user-info.svelte-imhhoo{display:flex;align-items:center;gap:1rem}.logout.svelte-imhhoo{padding:.5rem 1rem;background:#e74c3c;color:#fff;border:none;border-radius:4px;cursor:pointer}.content.svelte-imhhoo{max-width:500px;margin:2rem auto;padding:2rem;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a}.error.svelte-imhhoo{background:#fee;color:#c00;padding:.75rem;border-radius:4px;margin-bottom:1rem}.success.svelte-imhhoo{background:#efe;color:#060;padding:.75rem;border-radius:4px;margin-bottom:1rem}form.svelte-imhhoo{display:flex;flex-direction:column;gap:1rem}label.svelte-imhhoo{display:flex;flex-direction:column;gap:.5rem;font-weight:500;color:#555}input.svelte-imhhoo{padding:.75rem;border:1px solid #ddd;border-radius:6px;font-size:1rem}input.svelte-imhhoo:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}button.svelte-imhhoo{padding:.75rem;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:6px;font-size:1rem;font-weight:500;cursor:pointer;margin-top:.5rem}button.svelte-imhhoo:hover:not(:disabled){opacity:.9}button.svelte-imhhoo:disabled{opacity:.6;cursor:not-allowed}.links.svelte-imhhoo{margin-top:1.5rem;text-align:center}.links.svelte-imhhoo a:where(.svelte-imhhoo){color:#667eea;text-decoration:none}.links.svelte-imhhoo a:where(.svelte-imhhoo):hover{text-decoration:underline}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/5.YbbfqdJp.css b/backend/cmd/server/embed/_app/immutable/assets/5.YbbfqdJp.css
deleted file mode 100644
index 47f5e83..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/5.YbbfqdJp.css
+++ /dev/null
@@ -1 +0,0 @@
-.page-container.svelte-1s1ktxm{min-height:100vh;background:#f5f7fa}.header.svelte-1s1ktxm{background:#fff;padding:1rem 2rem;box-shadow:0 2px 4px #0000001a;display:flex;justify-content:space-between;align-items:center}.header.svelte-1s1ktxm h1:where(.svelte-1s1ktxm){margin:0;font-size:1.5rem;color:#2c3e50}.user-info.svelte-1s1ktxm{display:flex;align-items:center;gap:1rem}.logout.svelte-1s1ktxm{padding:.5rem 1rem;background:#e74c3c;color:#fff;border:none;border-radius:4px;cursor:pointer}.content.svelte-1s1ktxm{max-width:800px;margin:2rem auto;padding:0 1rem}.card.svelte-1s1ktxm{background:#fff;padding:1.5rem;border-radius:12px;box-shadow:0 2px 8px #0000001a;margin-bottom:1.5rem}.card.svelte-1s1ktxm h2:where(.svelte-1s1ktxm){margin:0 0 1rem;color:#2c3e50;font-size:1.2rem}.info-row.svelte-1s1ktxm{display:flex;padding:.75rem 0;border-bottom:1px solid #eee}.info-row.svelte-1s1ktxm:last-child{border-bottom:none}.label.svelte-1s1ktxm{font-weight:500;color:#666;width:120px}.value.svelte-1s1ktxm{color:#2c3e50}.actions.svelte-1s1ktxm{display:flex;gap:1rem;flex-wrap:wrap}.action-btn.svelte-1s1ktxm{padding:.75rem 1.5rem;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;text-decoration:none;border-radius:6px;font-weight:500;transition:opacity .2s}.action-btn.svelte-1s1ktxm:hover{opacity:.9}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/6.w_qTFDpy.css b/backend/cmd/server/embed/_app/immutable/assets/6.w_qTFDpy.css
deleted file mode 100644
index 4f2c471..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/6.w_qTFDpy.css
+++ /dev/null
@@ -1 +0,0 @@
-.login-container.svelte-15sczaz{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#667eea,#764ba2);padding:1rem}.login-card.svelte-15sczaz{background:#fff;padding:2rem;border-radius:12px;box-shadow:0 10px 40px #0003;width:100%;max-width:400px}h1.svelte-15sczaz{text-align:center;margin:0 0 1rem;color:#2c3e50}.info.svelte-15sczaz{color:#666;text-align:center;margin-bottom:1.5rem;font-size:.9rem}.error.svelte-15sczaz{background:#fee;color:#c00;padding:.75rem;border-radius:4px;margin-bottom:1rem;font-size:.9rem}.success.svelte-15sczaz{background:#efe;color:#060;padding:1rem;border-radius:4px;margin-bottom:1rem;text-align:center}.success.svelte-15sczaz p:where(.svelte-15sczaz){margin:.5rem 0}form.svelte-15sczaz{display:flex;flex-direction:column;gap:1rem}label.svelte-15sczaz{display:flex;flex-direction:column;gap:.5rem;font-weight:500;color:#555}input.svelte-15sczaz{padding:.75rem;border:1px solid #ddd;border-radius:6px;font-size:1rem}input.svelte-15sczaz:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}button.svelte-15sczaz{padding:.75rem;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:6px;font-size:1rem;font-weight:500;cursor:pointer;transition:opacity .2s}button.svelte-15sczaz:hover:not(:disabled){opacity:.9}button.svelte-15sczaz:disabled{opacity:.6;cursor:not-allowed}.links.svelte-15sczaz{margin-top:1.5rem;text-align:center;padding-top:1rem;border-top:1px solid #eee}.links.svelte-15sczaz a:where(.svelte-15sczaz){color:#667eea;text-decoration:none;font-size:.9rem}.links.svelte-15sczaz a:where(.svelte-15sczaz):hover{text-decoration:underline}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/7.Bq7myTre.css b/backend/cmd/server/embed/_app/immutable/assets/7.Bq7myTre.css
deleted file mode 100644
index 5e0a5f3..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/7.Bq7myTre.css
+++ /dev/null
@@ -1 +0,0 @@
-.login-container.svelte-1i2smtp{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#2c3e50,#34495e)}.login-card.svelte-1i2smtp{background:#fff;padding:3rem;border-radius:12px;box-shadow:0 10px 40px #0003;width:100%;max-width:400px}h1.svelte-1i2smtp{margin:0;text-align:center;color:#2c3e50;font-size:2rem}.subtitle.svelte-1i2smtp{text-align:center;color:#7f8c8d;margin:.5rem 0 2rem}.error.svelte-1i2smtp{background:#fee;border:1px solid #fcc;color:#c00;padding:.75rem;border-radius:4px;margin-bottom:1rem;font-size:.9rem}form.svelte-1i2smtp{display:flex;flex-direction:column;gap:1.25rem}label.svelte-1i2smtp{display:flex;flex-direction:column;gap:.5rem;font-weight:500;color:#2c3e50}input.svelte-1i2smtp{padding:.75rem;border:1px solid #ddd;border-radius:6px;font-size:1rem;transition:border-color .2s}input.svelte-1i2smtp:focus{outline:none;border-color:#3498db}.forgot.svelte-1i2smtp{text-align:right;margin-top:-.5rem}.forgot.svelte-1i2smtp a:where(.svelte-1i2smtp){color:#3498db;text-decoration:none;font-size:.9rem}.forgot.svelte-1i2smtp a:where(.svelte-1i2smtp):hover{text-decoration:underline}button.svelte-1i2smtp{padding:.875rem;background:#3498db;color:#fff;border:none;border-radius:6px;font-size:1rem;font-weight:600;cursor:pointer;transition:background .2s;margin-top:.5rem}button.svelte-1i2smtp:hover:not(:disabled){background:#2980b9}button.svelte-1i2smtp:disabled{opacity:.7;cursor:not-allowed}
diff --git a/backend/cmd/server/embed/_app/immutable/assets/9.Ci0QlAaW.css b/backend/cmd/server/embed/_app/immutable/assets/9.Ci0QlAaW.css
deleted file mode 100644
index 6ef841b..0000000
--- a/backend/cmd/server/embed/_app/immutable/assets/9.Ci0QlAaW.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-lb8x40{margin-bottom:2rem}.back.svelte-lb8x40{display:inline-block;margin-bottom:1rem;color:#3498db;text-decoration:none}.back.svelte-lb8x40:hover{text-decoration:underline}.error.svelte-lb8x40{color:#e74c3c}.cards-grid.svelte-lb8x40{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1.5rem}.card.svelte-lb8x40{background:#fff;padding:2rem;border-radius:8px;box-shadow:0 2px 4px #0000001a;text-align:center;text-decoration:none;color:inherit;transition:transform .2s,box-shadow .2s}.card.svelte-lb8x40:hover{transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.card.svelte-lb8x40 h3:where(.svelte-lb8x40){font-size:3rem;margin:0;color:#3498db}.card.svelte-lb8x40 p:where(.svelte-lb8x40){margin:.5rem 0 0;color:#7f8c8d;font-size:1.1rem}
diff --git a/backend/cmd/server/embed/_app/version.json b/backend/cmd/server/embed/_app/version.json
deleted file mode 100644
index f1bcdd4..0000000
--- a/backend/cmd/server/embed/_app/version.json
+++ /dev/null
@@ -1 +0,0 @@
-{"version":"1774133205006"}
\ No newline at end of file
diff --git a/backend/cmd/server/embed/favicon.png b/backend/cmd/server/embed/favicon.png
deleted file mode 100644
index 47ce666..0000000
--- a/backend/cmd/server/embed/favicon.png
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/backend/cmd/server/embed/index.html b/backend/cmd/server/embed/index.html
deleted file mode 100644
index 968c4ad..0000000
--- a/backend/cmd/server/embed/index.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/.svelte-kit/ambient.d.ts b/frontend/.svelte-kit/ambient.d.ts
deleted file mode 100644
index dff2444..0000000
--- a/frontend/.svelte-kit/ambient.d.ts
+++ /dev/null
@@ -1,336 +0,0 @@
-
-// this file is generated — do not edit it
-
-
-///
-
-/**
- * This module provides access to environment variables that are injected _statically_ into your bundle at build time and are limited to _private_ access.
- *
- * | | Runtime | Build time |
- * | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
- * | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) |
- * | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) |
- *
- * Static environment variables are [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env` at build time and then statically injected into your bundle at build time, enabling optimisations like dead code elimination.
- *
- * **_Private_ access:**
- *
- * - This module cannot be imported into client-side code
- * - This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured)
- *
- * For example, given the following build time environment:
- *
- * ```env
- * ENVIRONMENT=production
- * PUBLIC_BASE_URL=http://site.com
- * ```
- *
- * With the default `publicPrefix` and `privatePrefix`:
- *
- * ```ts
- * import { ENVIRONMENT, PUBLIC_BASE_URL } from '$env/static/private';
- *
- * console.log(ENVIRONMENT); // => "production"
- * console.log(PUBLIC_BASE_URL); // => throws error during build
- * ```
- *
- * The above values will be the same _even if_ different values for `ENVIRONMENT` or `PUBLIC_BASE_URL` are set at runtime, as they are statically replaced in your code with their build time values.
- */
-declare module '$env/static/private' {
- export const SHELL: string;
- export const npm_command: string;
- export const LSCOLORS: string;
- export const SESSION_MANAGER: string;
- export const QT_ACCESSIBILITY: string;
- export const COLORTERM: string;
- export const XDG_CONFIG_DIRS: string;
- export const LESS: string;
- export const XDG_SESSION_PATH: string;
- export const GNOME_DESKTOP_SESSION_ID: string;
- export const GTK_IM_MODULE: string;
- export const QT_IM_MODULES: string;
- export const GNOME_KEYRING_CONTROL: string;
- export const LANGUAGE: string;
- export const NODE: string;
- export const SSH_AUTH_SOCK: string;
- export const AGENT: string;
- export const npm_config_local_prefix: string;
- export const XMODIFIERS: string;
- export const DESKTOP_SESSION: string;
- export const GTK_MODULES: string;
- export const XDG_SEAT: string;
- export const PWD: string;
- export const XDG_SESSION_DESKTOP: string;
- export const LOGNAME: string;
- export const XDG_SESSION_TYPE: string;
- export const GPG_AGENT_INFO: string;
- export const _: string;
- export const XAUTHORITY: string;
- export const XDG_GREETER_DATA_DIR: string;
- export const GDM_LANG: string;
- export const HOME: string;
- export const OPENCODE: string;
- export const LANG: string;
- export const LS_COLORS: string;
- export const XDG_CURRENT_DESKTOP: string;
- export const npm_package_version: string;
- export const VTE_VERSION: string;
- export const DEBEMAIL: string;
- export const XDG_SEAT_PATH: string;
- export const GNOME_TERMINAL_SCREEN: string;
- export const CLUTTER_IM_MODULE: string;
- export const MFLAGS: string;
- export const npm_lifecycle_script: string;
- export const XDG_SESSION_CLASS: string;
- export const MAKEFLAGS: string;
- export const TERM: string;
- export const npm_package_name: string;
- export const ZSH: string;
- export const GTK_OVERLAY_SCROLLING: string;
- export const LIBVIRT_DEFAULT_URI: string;
- export const USER: string;
- export const GNOME_TERMINAL_SERVICE: string;
- export const DISPLAY: string;
- export const npm_lifecycle_event: string;
- export const SHLVL: string;
- export const PAGER: string;
- export const MAKELEVEL: string;
- export const QT_IM_MODULE: string;
- export const XDG_VTNR: string;
- export const XDG_SESSION_ID: string;
- export const npm_config_user_agent: string;
- export const npm_execpath: string;
- export const XDG_RUNTIME_DIR: string;
- export const npm_package_json: string;
- export const BUN_INSTALL: string;
- export const EMAIL: string;
- export const GTK3_MODULES: string;
- export const XDG_DATA_DIRS: string;
- export const PATH: string;
- export const GDMSESSION: string;
- export const DBUS_SESSION_BUS_ADDRESS: string;
- export const THOR_MERGE: string;
- export const npm_node_execpath: string;
- export const OLDPWD: string;
- export const NODE_ENV: string;
-}
-
-/**
- * This module provides access to environment variables that are injected _statically_ into your bundle at build time and are _publicly_ accessible.
- *
- * | | Runtime | Build time |
- * | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
- * | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) |
- * | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) |
- *
- * Static environment variables are [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env` at build time and then statically injected into your bundle at build time, enabling optimisations like dead code elimination.
- *
- * **_Public_ access:**
- *
- * - This module _can_ be imported into client-side code
- * - **Only** variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`) are included
- *
- * For example, given the following build time environment:
- *
- * ```env
- * ENVIRONMENT=production
- * PUBLIC_BASE_URL=http://site.com
- * ```
- *
- * With the default `publicPrefix` and `privatePrefix`:
- *
- * ```ts
- * import { ENVIRONMENT, PUBLIC_BASE_URL } from '$env/static/public';
- *
- * console.log(ENVIRONMENT); // => throws error during build
- * console.log(PUBLIC_BASE_URL); // => "http://site.com"
- * ```
- *
- * The above values will be the same _even if_ different values for `ENVIRONMENT` or `PUBLIC_BASE_URL` are set at runtime, as they are statically replaced in your code with their build time values.
- */
-declare module '$env/static/public' {
-
-}
-
-/**
- * This module provides access to environment variables set _dynamically_ at runtime and that are limited to _private_ access.
- *
- * | | Runtime | Build time |
- * | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
- * | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) |
- * | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) |
- *
- * Dynamic environment variables are defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) (or running [`vite preview`](https://svelte.dev/docs/kit/cli)), this is equivalent to `process.env`.
- *
- * **_Private_ access:**
- *
- * - This module cannot be imported into client-side code
- * - This module includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured)
- *
- * > [!NOTE] In `dev`, `$env/dynamic` includes environment variables from `.env`. In `prod`, this behavior will depend on your adapter.
- *
- * > [!NOTE] To get correct types, environment variables referenced in your code should be declared (for example in an `.env` file), even if they don't have a value until the app is deployed:
- * >
- * > ```env
- * > MY_FEATURE_FLAG=
- * > ```
- * >
- * > You can override `.env` values from the command line like so:
- * >
- * > ```sh
- * > MY_FEATURE_FLAG="enabled" npm run dev
- * > ```
- *
- * For example, given the following runtime environment:
- *
- * ```env
- * ENVIRONMENT=production
- * PUBLIC_BASE_URL=http://site.com
- * ```
- *
- * With the default `publicPrefix` and `privatePrefix`:
- *
- * ```ts
- * import { env } from '$env/dynamic/private';
- *
- * console.log(env.ENVIRONMENT); // => "production"
- * console.log(env.PUBLIC_BASE_URL); // => undefined
- * ```
- */
-declare module '$env/dynamic/private' {
- export const env: {
- SHELL: string;
- npm_command: string;
- LSCOLORS: string;
- SESSION_MANAGER: string;
- QT_ACCESSIBILITY: string;
- COLORTERM: string;
- XDG_CONFIG_DIRS: string;
- LESS: string;
- XDG_SESSION_PATH: string;
- GNOME_DESKTOP_SESSION_ID: string;
- GTK_IM_MODULE: string;
- QT_IM_MODULES: string;
- GNOME_KEYRING_CONTROL: string;
- LANGUAGE: string;
- NODE: string;
- SSH_AUTH_SOCK: string;
- AGENT: string;
- npm_config_local_prefix: string;
- XMODIFIERS: string;
- DESKTOP_SESSION: string;
- GTK_MODULES: string;
- XDG_SEAT: string;
- PWD: string;
- XDG_SESSION_DESKTOP: string;
- LOGNAME: string;
- XDG_SESSION_TYPE: string;
- GPG_AGENT_INFO: string;
- _: string;
- XAUTHORITY: string;
- XDG_GREETER_DATA_DIR: string;
- GDM_LANG: string;
- HOME: string;
- OPENCODE: string;
- LANG: string;
- LS_COLORS: string;
- XDG_CURRENT_DESKTOP: string;
- npm_package_version: string;
- VTE_VERSION: string;
- DEBEMAIL: string;
- XDG_SEAT_PATH: string;
- GNOME_TERMINAL_SCREEN: string;
- CLUTTER_IM_MODULE: string;
- MFLAGS: string;
- npm_lifecycle_script: string;
- XDG_SESSION_CLASS: string;
- MAKEFLAGS: string;
- TERM: string;
- npm_package_name: string;
- ZSH: string;
- GTK_OVERLAY_SCROLLING: string;
- LIBVIRT_DEFAULT_URI: string;
- USER: string;
- GNOME_TERMINAL_SERVICE: string;
- DISPLAY: string;
- npm_lifecycle_event: string;
- SHLVL: string;
- PAGER: string;
- MAKELEVEL: string;
- QT_IM_MODULE: string;
- XDG_VTNR: string;
- XDG_SESSION_ID: string;
- npm_config_user_agent: string;
- npm_execpath: string;
- XDG_RUNTIME_DIR: string;
- npm_package_json: string;
- BUN_INSTALL: string;
- EMAIL: string;
- GTK3_MODULES: string;
- XDG_DATA_DIRS: string;
- PATH: string;
- GDMSESSION: string;
- DBUS_SESSION_BUS_ADDRESS: string;
- THOR_MERGE: string;
- npm_node_execpath: string;
- OLDPWD: string;
- NODE_ENV: string;
- [key: `PUBLIC_${string}`]: undefined;
- [key: `${string}`]: string | undefined;
- }
-}
-
-/**
- * This module provides access to environment variables set _dynamically_ at runtime and that are _publicly_ accessible.
- *
- * | | Runtime | Build time |
- * | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
- * | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) |
- * | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) |
- *
- * Dynamic environment variables are defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) (or running [`vite preview`](https://svelte.dev/docs/kit/cli)), this is equivalent to `process.env`.
- *
- * **_Public_ access:**
- *
- * - This module _can_ be imported into client-side code
- * - **Only** variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`) are included
- *
- * > [!NOTE] In `dev`, `$env/dynamic` includes environment variables from `.env`. In `prod`, this behavior will depend on your adapter.
- *
- * > [!NOTE] To get correct types, environment variables referenced in your code should be declared (for example in an `.env` file), even if they don't have a value until the app is deployed:
- * >
- * > ```env
- * > MY_FEATURE_FLAG=
- * > ```
- * >
- * > You can override `.env` values from the command line like so:
- * >
- * > ```sh
- * > MY_FEATURE_FLAG="enabled" npm run dev
- * > ```
- *
- * For example, given the following runtime environment:
- *
- * ```env
- * ENVIRONMENT=production
- * PUBLIC_BASE_URL=http://example.com
- * ```
- *
- * With the default `publicPrefix` and `privatePrefix`:
- *
- * ```ts
- * import { env } from '$env/dynamic/public';
- * console.log(env.ENVIRONMENT); // => undefined, not public
- * console.log(env.PUBLIC_BASE_URL); // => "http://example.com"
- * ```
- *
- * ```
- *
- * ```
- */
-declare module '$env/dynamic/public' {
- export const env: {
- [key: `PUBLIC_${string}`]: string | undefined;
- }
-}
diff --git a/frontend/.svelte-kit/generated/client-optimized/app.js b/frontend/.svelte-kit/generated/client-optimized/app.js
deleted file mode 100644
index 77fc2a6..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/app.js
+++ /dev/null
@@ -1,53 +0,0 @@
-export { matchers } from './matchers.js';
-
-export const nodes = [
- () => import('./nodes/0'),
- () => import('./nodes/1'),
- () => import('./nodes/2'),
- () => import('./nodes/3'),
- () => import('./nodes/4'),
- () => import('./nodes/5'),
- () => import('./nodes/6'),
- () => import('./nodes/7'),
- () => import('./nodes/8'),
- () => import('./nodes/9'),
- () => import('./nodes/10'),
- () => import('./nodes/11'),
- () => import('./nodes/12'),
- () => import('./nodes/13'),
- () => import('./nodes/14')
-];
-
-export const server_loads = [];
-
-export const dictionary = {
- "/": [2],
- "/aliases": [3],
- "/auth/change-password": [4],
- "/auth/dashboard": [5],
- "/auth/forgot": [6],
- "/auth/login": [7],
- "/domains": [8],
- "/domains/[name]": [9],
- "/domains/[name]/aliases": [10],
- "/domains/[name]/users": [11],
- "/logs": [12],
- "/queue": [13],
- "/users": [14]
- };
-
-export const hooks = {
- handleError: (({ error }) => { console.error(error) }),
-
- reroute: (() => {}),
- transport: {}
-};
-
-export const decoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.decode]));
-export const encoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.encode]));
-
-export const hash = false;
-
-export const decode = (type, value) => decoders[type](value);
-
-export { default as root } from '../root.js';
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/matchers.js b/frontend/.svelte-kit/generated/client-optimized/matchers.js
deleted file mode 100644
index f6bd30a..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/matchers.js
+++ /dev/null
@@ -1 +0,0 @@
-export const matchers = {};
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/0.js b/frontend/.svelte-kit/generated/client-optimized/nodes/0.js
deleted file mode 100644
index fed1375..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/0.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/+layout.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/1.js b/frontend/.svelte-kit/generated/client-optimized/nodes/1.js
deleted file mode 100644
index bf58bad..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/1.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/10.js b/frontend/.svelte-kit/generated/client-optimized/nodes/10.js
deleted file mode 100644
index 6e3e843..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/10.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/domains/[name]/aliases/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/11.js b/frontend/.svelte-kit/generated/client-optimized/nodes/11.js
deleted file mode 100644
index 5d78636..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/11.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/domains/[name]/users/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/12.js b/frontend/.svelte-kit/generated/client-optimized/nodes/12.js
deleted file mode 100644
index 74546b8..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/12.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/logs/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/13.js b/frontend/.svelte-kit/generated/client-optimized/nodes/13.js
deleted file mode 100644
index 2c7481c..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/13.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/queue/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/14.js b/frontend/.svelte-kit/generated/client-optimized/nodes/14.js
deleted file mode 100644
index 81499df..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/14.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/users/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/2.js b/frontend/.svelte-kit/generated/client-optimized/nodes/2.js
deleted file mode 100644
index 1cb4f85..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/2.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/3.js b/frontend/.svelte-kit/generated/client-optimized/nodes/3.js
deleted file mode 100644
index 282cdf9..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/3.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/aliases/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/4.js b/frontend/.svelte-kit/generated/client-optimized/nodes/4.js
deleted file mode 100644
index 38113d5..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/4.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/auth/change-password/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/5.js b/frontend/.svelte-kit/generated/client-optimized/nodes/5.js
deleted file mode 100644
index 8fbcc40..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/5.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/auth/dashboard/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/6.js b/frontend/.svelte-kit/generated/client-optimized/nodes/6.js
deleted file mode 100644
index c3e6677..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/6.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/auth/forgot/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/7.js b/frontend/.svelte-kit/generated/client-optimized/nodes/7.js
deleted file mode 100644
index 3e6b791..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/7.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/auth/login/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/8.js b/frontend/.svelte-kit/generated/client-optimized/nodes/8.js
deleted file mode 100644
index 7ddef3d..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/8.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/domains/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client-optimized/nodes/9.js b/frontend/.svelte-kit/generated/client-optimized/nodes/9.js
deleted file mode 100644
index 8c3dbb9..0000000
--- a/frontend/.svelte-kit/generated/client-optimized/nodes/9.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/domains/[name]/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/app.js b/frontend/.svelte-kit/generated/client/app.js
deleted file mode 100644
index 77fc2a6..0000000
--- a/frontend/.svelte-kit/generated/client/app.js
+++ /dev/null
@@ -1,53 +0,0 @@
-export { matchers } from './matchers.js';
-
-export const nodes = [
- () => import('./nodes/0'),
- () => import('./nodes/1'),
- () => import('./nodes/2'),
- () => import('./nodes/3'),
- () => import('./nodes/4'),
- () => import('./nodes/5'),
- () => import('./nodes/6'),
- () => import('./nodes/7'),
- () => import('./nodes/8'),
- () => import('./nodes/9'),
- () => import('./nodes/10'),
- () => import('./nodes/11'),
- () => import('./nodes/12'),
- () => import('./nodes/13'),
- () => import('./nodes/14')
-];
-
-export const server_loads = [];
-
-export const dictionary = {
- "/": [2],
- "/aliases": [3],
- "/auth/change-password": [4],
- "/auth/dashboard": [5],
- "/auth/forgot": [6],
- "/auth/login": [7],
- "/domains": [8],
- "/domains/[name]": [9],
- "/domains/[name]/aliases": [10],
- "/domains/[name]/users": [11],
- "/logs": [12],
- "/queue": [13],
- "/users": [14]
- };
-
-export const hooks = {
- handleError: (({ error }) => { console.error(error) }),
-
- reroute: (() => {}),
- transport: {}
-};
-
-export const decoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.decode]));
-export const encoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.encode]));
-
-export const hash = false;
-
-export const decode = (type, value) => decoders[type](value);
-
-export { default as root } from '../root.js';
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/matchers.js b/frontend/.svelte-kit/generated/client/matchers.js
deleted file mode 100644
index f6bd30a..0000000
--- a/frontend/.svelte-kit/generated/client/matchers.js
+++ /dev/null
@@ -1 +0,0 @@
-export const matchers = {};
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/0.js b/frontend/.svelte-kit/generated/client/nodes/0.js
deleted file mode 100644
index fed1375..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/0.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/+layout.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/1.js b/frontend/.svelte-kit/generated/client/nodes/1.js
deleted file mode 100644
index bf58bad..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/1.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/10.js b/frontend/.svelte-kit/generated/client/nodes/10.js
deleted file mode 100644
index 6e3e843..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/10.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/domains/[name]/aliases/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/11.js b/frontend/.svelte-kit/generated/client/nodes/11.js
deleted file mode 100644
index 5d78636..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/11.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/domains/[name]/users/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/12.js b/frontend/.svelte-kit/generated/client/nodes/12.js
deleted file mode 100644
index 74546b8..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/12.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/logs/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/13.js b/frontend/.svelte-kit/generated/client/nodes/13.js
deleted file mode 100644
index 2c7481c..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/13.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/queue/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/14.js b/frontend/.svelte-kit/generated/client/nodes/14.js
deleted file mode 100644
index 81499df..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/14.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/users/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/2.js b/frontend/.svelte-kit/generated/client/nodes/2.js
deleted file mode 100644
index 1cb4f85..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/2.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/3.js b/frontend/.svelte-kit/generated/client/nodes/3.js
deleted file mode 100644
index 282cdf9..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/3.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/aliases/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/4.js b/frontend/.svelte-kit/generated/client/nodes/4.js
deleted file mode 100644
index 38113d5..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/4.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/auth/change-password/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/5.js b/frontend/.svelte-kit/generated/client/nodes/5.js
deleted file mode 100644
index 8fbcc40..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/5.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/auth/dashboard/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/6.js b/frontend/.svelte-kit/generated/client/nodes/6.js
deleted file mode 100644
index c3e6677..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/6.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/auth/forgot/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/7.js b/frontend/.svelte-kit/generated/client/nodes/7.js
deleted file mode 100644
index 3e6b791..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/7.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/auth/login/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/8.js b/frontend/.svelte-kit/generated/client/nodes/8.js
deleted file mode 100644
index 7ddef3d..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/8.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/domains/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/client/nodes/9.js b/frontend/.svelte-kit/generated/client/nodes/9.js
deleted file mode 100644
index 8c3dbb9..0000000
--- a/frontend/.svelte-kit/generated/client/nodes/9.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as component } from "../../../../src/routes/domains/[name]/+page.svelte";
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/root.js b/frontend/.svelte-kit/generated/root.js
deleted file mode 100644
index 4d1e892..0000000
--- a/frontend/.svelte-kit/generated/root.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import { asClassComponent } from 'svelte/legacy';
-import Root from './root.svelte';
-export default asClassComponent(Root);
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/root.svelte b/frontend/.svelte-kit/generated/root.svelte
deleted file mode 100644
index 0795183..0000000
--- a/frontend/.svelte-kit/generated/root.svelte
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-{#if constructors[1]}
- {@const Pyramid_0 = constructors[0]}
-
-
-
-
-
-
-{:else}
- {@const Pyramid_0 = constructors[0]}
-
-
-
-{/if}
-
-{#if mounted}
-
- {#if navigated}
- {title}
- {/if}
-
-{/if}
\ No newline at end of file
diff --git a/frontend/.svelte-kit/generated/server/internal.js b/frontend/.svelte-kit/generated/server/internal.js
deleted file mode 100644
index c7c1e81..0000000
--- a/frontend/.svelte-kit/generated/server/internal.js
+++ /dev/null
@@ -1,54 +0,0 @@
-
-import root from '../root.js';
-import { set_building, set_prerendering } from '__sveltekit/environment';
-import { set_assets } from '$app/paths/internal/server';
-import { set_manifest, set_read_implementation } from '__sveltekit/server';
-import { set_private_env, set_public_env } from '../../../node_modules/@sveltejs/kit/src/runtime/shared-server.js';
-
-export const options = {
- app_template_contains_nonce: false,
- async: false,
- csp: {"mode":"auto","directives":{"upgrade-insecure-requests":false,"block-all-mixed-content":false},"reportOnly":{"upgrade-insecure-requests":false,"block-all-mixed-content":false}},
- csrf_check_origin: true,
- csrf_trusted_origins: [],
- embedded: false,
- env_public_prefix: 'PUBLIC_',
- env_private_prefix: '',
- hash_routing: false,
- hooks: null, // added lazily, via `get_hooks`
- preload_strategy: "modulepreload",
- root,
- service_worker: false,
- service_worker_options: undefined,
- server_error_boundaries: false,
- templates: {
- app: ({ head, body, assets, nonce, env }) => "\n\n \n \n \n \n " + head + "\n \n \n " + body + "
\n \n\n",
- error: ({ status, message }) => "\n\n\t\n\t\t\n\t\t" + message + "\n\n\t\t\n\t\n\t\n\t\t\n\t\t\t
" + status + "\n\t\t\t
\n\t\t\t\t
" + message + "
\n\t\t\t\n\t\t
\n\t\n\n"
- },
- version_hash: "1iiqrg0"
-};
-
-export async function get_hooks() {
- let handle;
- let handleFetch;
- let handleError;
- let handleValidationError;
- let init;
-
-
- let reroute;
- let transport;
-
-
- return {
- handle,
- handleFetch,
- handleError,
- handleValidationError,
- init,
- reroute,
- transport
- };
-}
-
-export { set_assets, set_building, set_manifest, set_prerendering, set_private_env, set_public_env, set_read_implementation };
diff --git a/frontend/.svelte-kit/non-ambient.d.ts b/frontend/.svelte-kit/non-ambient.d.ts
deleted file mode 100644
index 7a0a5ab..0000000
--- a/frontend/.svelte-kit/non-ambient.d.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-
-// this file is generated — do not edit it
-
-
-declare module "svelte/elements" {
- export interface HTMLAttributes {
- 'data-sveltekit-keepfocus'?: true | '' | 'off' | undefined | null;
- 'data-sveltekit-noscroll'?: true | '' | 'off' | undefined | null;
- 'data-sveltekit-preload-code'?:
- | true
- | ''
- | 'eager'
- | 'viewport'
- | 'hover'
- | 'tap'
- | 'off'
- | undefined
- | null;
- 'data-sveltekit-preload-data'?: true | '' | 'hover' | 'tap' | 'off' | undefined | null;
- 'data-sveltekit-reload'?: true | '' | 'off' | undefined | null;
- 'data-sveltekit-replacestate'?: true | '' | 'off' | undefined | null;
- }
-}
-
-export {};
-
-
-declare module "$app/types" {
- type MatcherParam = M extends (param : string) => param is (infer U extends string) ? U : string;
-
- export interface AppTypes {
- RouteId(): "/" | "/aliases" | "/auth" | "/auth/change-password" | "/auth/dashboard" | "/auth/forgot" | "/auth/login" | "/domains" | "/domains/[name]" | "/domains/[name]/aliases" | "/domains/[name]/users" | "/logs" | "/queue" | "/users";
- RouteParams(): {
- "/domains/[name]": { name: string };
- "/domains/[name]/aliases": { name: string };
- "/domains/[name]/users": { name: string }
- };
- LayoutParams(): {
- "/": { name?: string };
- "/aliases": Record;
- "/auth": Record;
- "/auth/change-password": Record;
- "/auth/dashboard": Record;
- "/auth/forgot": Record;
- "/auth/login": Record;
- "/domains": { name?: string };
- "/domains/[name]": { name: string };
- "/domains/[name]/aliases": { name: string };
- "/domains/[name]/users": { name: string };
- "/logs": Record;
- "/queue": Record;
- "/users": Record
- };
- Pathname(): "/" | "/aliases" | "/auth/change-password" | "/auth/dashboard" | "/auth/forgot" | "/auth/login" | "/domains" | `/domains/${string}` & {} | `/domains/${string}/aliases` & {} | `/domains/${string}/users` & {} | "/logs" | "/queue" | "/users";
- ResolvedPathname(): `${"" | `/${string}`}${ReturnType}`;
- Asset(): "/favicon.png" | string & {};
- }
-}
\ No newline at end of file
diff --git a/frontend/.svelte-kit/output/client/.vite/manifest.json b/frontend/.svelte-kit/output/client/.vite/manifest.json
deleted file mode 100644
index 413b3cf..0000000
--- a/frontend/.svelte-kit/output/client/.vite/manifest.json
+++ /dev/null
@@ -1,426 +0,0 @@
-{
- ".svelte-kit/generated/client-optimized/app.js": {
- "file": "_app/immutable/entry/app.BbYYniZ5.js",
- "name": "entry/app",
- "src": ".svelte-kit/generated/client-optimized/app.js",
- "isEntry": true,
- "imports": [
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_9f3gAZ9b.js",
- "_DbjAFM6h.js",
- "_BoxOjSrq.js",
- "_Br6rEF7I.js"
- ],
- "dynamicImports": [
- ".svelte-kit/generated/client-optimized/nodes/0.js",
- ".svelte-kit/generated/client-optimized/nodes/1.js",
- ".svelte-kit/generated/client-optimized/nodes/2.js",
- ".svelte-kit/generated/client-optimized/nodes/3.js",
- ".svelte-kit/generated/client-optimized/nodes/4.js",
- ".svelte-kit/generated/client-optimized/nodes/5.js",
- ".svelte-kit/generated/client-optimized/nodes/6.js",
- ".svelte-kit/generated/client-optimized/nodes/7.js",
- ".svelte-kit/generated/client-optimized/nodes/8.js",
- ".svelte-kit/generated/client-optimized/nodes/9.js",
- ".svelte-kit/generated/client-optimized/nodes/10.js",
- ".svelte-kit/generated/client-optimized/nodes/11.js",
- ".svelte-kit/generated/client-optimized/nodes/12.js",
- ".svelte-kit/generated/client-optimized/nodes/13.js",
- ".svelte-kit/generated/client-optimized/nodes/14.js"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/0.js": {
- "file": "_app/immutable/nodes/0.D1NfsGdh.js",
- "name": "nodes/0",
- "src": ".svelte-kit/generated/client-optimized/nodes/0.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_DbjAFM6h.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_Br6rEF7I.js",
- "_BoxOjSrq.js",
- "_BUMTB73N.js",
- "_D36G5VVl.js",
- "_Cp0_Ivrq.js"
- ],
- "css": [
- "_app/immutable/assets/0.DkgBtk4_.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/1.js": {
- "file": "_app/immutable/nodes/1.Dmg4gFpE.js",
- "name": "nodes/1",
- "src": ".svelte-kit/generated/client-optimized/nodes/1.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_B-VrhDce.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_DHtUr0jS.js",
- "_Cp0_Ivrq.js"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/10.js": {
- "file": "_app/immutable/nodes/10.Cr7c3Mev.js",
- "name": "nodes/10",
- "src": ".svelte-kit/generated/client-optimized/nodes/10.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_Duj8aI35.js",
- "_Br6rEF7I.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_CJwRMJo_.js",
- "_BUMTB73N.js",
- "_ChOwRET-.js",
- "_D36G5VVl.js"
- ],
- "css": [
- "_app/immutable/assets/10.Qar-kS8x.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/11.js": {
- "file": "_app/immutable/nodes/11.C28K4OC2.js",
- "name": "nodes/11",
- "src": ".svelte-kit/generated/client-optimized/nodes/11.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_Duj8aI35.js",
- "_Br6rEF7I.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_CJwRMJo_.js",
- "_BUMTB73N.js",
- "_ChOwRET-.js",
- "_D36G5VVl.js"
- ],
- "css": [
- "_app/immutable/assets/11.D38O3Xxc.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/12.js": {
- "file": "_app/immutable/nodes/12.C871LYi0.js",
- "name": "nodes/12",
- "src": ".svelte-kit/generated/client-optimized/nodes/12.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_CJwRMJo_.js",
- "_BUMTB73N.js",
- "_D0tQPCXt.js",
- "_ChOwRET-.js"
- ],
- "css": [
- "_app/immutable/assets/12.DQdHIvb_.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/13.js": {
- "file": "_app/immutable/nodes/13.tek3MBH5.js",
- "name": "nodes/13",
- "src": ".svelte-kit/generated/client-optimized/nodes/13.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_CJwRMJo_.js"
- ],
- "css": [
- "_app/immutable/assets/13.DnP_H9DZ.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/14.js": {
- "file": "_app/immutable/nodes/14.GvC8CYlf.js",
- "name": "nodes/14",
- "src": ".svelte-kit/generated/client-optimized/nodes/14.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_B-VrhDce.js",
- "_DbjAFM6h.js",
- "_Duj8aI35.js",
- "_Cp0_Ivrq.js"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/2.js": {
- "file": "_app/immutable/nodes/2.BPLTuoks.js",
- "name": "nodes/2",
- "src": ".svelte-kit/generated/client-optimized/nodes/2.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_DbjAFM6h.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_D0tQPCXt.js"
- ],
- "css": [
- "_app/immutable/assets/2.By2d6Bxb.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/3.js": {
- "file": "_app/immutable/nodes/3.GvC8CYlf.js",
- "name": "nodes/3",
- "src": ".svelte-kit/generated/client-optimized/nodes/3.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_B-VrhDce.js",
- "_DbjAFM6h.js",
- "_Duj8aI35.js",
- "_Cp0_Ivrq.js"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/4.js": {
- "file": "_app/immutable/nodes/4.BncKIMeC.js",
- "name": "nodes/4",
- "src": ".svelte-kit/generated/client-optimized/nodes/4.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_DbjAFM6h.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_BUMTB73N.js",
- "_ChOwRET-.js",
- "_Cp0_Ivrq.js"
- ],
- "css": [
- "_app/immutable/assets/4.CG2X--Z8.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/5.js": {
- "file": "_app/immutable/nodes/5.B3bpZmnK.js",
- "name": "nodes/5",
- "src": ".svelte-kit/generated/client-optimized/nodes/5.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_DbjAFM6h.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_Cp0_Ivrq.js"
- ],
- "css": [
- "_app/immutable/assets/5.YbbfqdJp.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/6.js": {
- "file": "_app/immutable/nodes/6.IyjeEy8s.js",
- "name": "nodes/6",
- "src": ".svelte-kit/generated/client-optimized/nodes/6.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_BUMTB73N.js",
- "_ChOwRET-.js",
- "_DHtUr0jS.js"
- ],
- "css": [
- "_app/immutable/assets/6.w_qTFDpy.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/7.js": {
- "file": "_app/immutable/nodes/7.D5gWFBO_.js",
- "name": "nodes/7",
- "src": ".svelte-kit/generated/client-optimized/nodes/7.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_BUMTB73N.js",
- "_ChOwRET-.js",
- "_Cp0_Ivrq.js"
- ],
- "css": [
- "_app/immutable/assets/7.Bq7myTre.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/8.js": {
- "file": "_app/immutable/nodes/8.CQe8jM2W.js",
- "name": "nodes/8",
- "src": ".svelte-kit/generated/client-optimized/nodes/8.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_Duj8aI35.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_CJwRMJo_.js",
- "_BUMTB73N.js",
- "_ChOwRET-.js"
- ],
- "css": [
- "_app/immutable/assets/8.DoJEUEyy.css"
- ]
- },
- ".svelte-kit/generated/client-optimized/nodes/9.js": {
- "file": "_app/immutable/nodes/9.aj9Oq8-x.js",
- "name": "nodes/9",
- "src": ".svelte-kit/generated/client-optimized/nodes/9.js",
- "isEntry": true,
- "isDynamicEntry": true,
- "imports": [
- "_9f3gAZ9b.js",
- "_Duj8aI35.js",
- "_Br6rEF7I.js",
- "_CLjomene.js",
- "_BoxOjSrq.js",
- "_BUMTB73N.js",
- "_D36G5VVl.js"
- ],
- "css": [
- "_app/immutable/assets/9.Ci0QlAaW.css"
- ]
- },
- "_9f3gAZ9b.js": {
- "file": "_app/immutable/chunks/9f3gAZ9b.js",
- "name": "disclose-version",
- "imports": [
- "_Duj8aI35.js"
- ]
- },
- "_B-VrhDce.js": {
- "file": "_app/immutable/chunks/B-VrhDce.js",
- "name": "legacy",
- "imports": [
- "_Duj8aI35.js"
- ]
- },
- "_BUMTB73N.js": {
- "file": "_app/immutable/chunks/BUMTB73N.js",
- "name": "attributes",
- "imports": [
- "_Duj8aI35.js"
- ]
- },
- "_B_j05Fed.js": {
- "file": "_app/immutable/chunks/B_j05Fed.js",
- "name": "index",
- "imports": [
- "_Duj8aI35.js"
- ]
- },
- "_BoxOjSrq.js": {
- "file": "_app/immutable/chunks/BoxOjSrq.js",
- "name": "if",
- "imports": [
- "_Duj8aI35.js"
- ]
- },
- "_Br6rEF7I.js": {
- "file": "_app/immutable/chunks/Br6rEF7I.js",
- "name": "store",
- "imports": [
- "_B_j05Fed.js",
- "_Duj8aI35.js"
- ]
- },
- "_CJwRMJo_.js": {
- "file": "_app/immutable/chunks/CJwRMJo_.js",
- "name": "each",
- "imports": [
- "_Duj8aI35.js"
- ]
- },
- "_CLjomene.js": {
- "file": "_app/immutable/chunks/CLjomene.js",
- "name": "render",
- "imports": [
- "_Duj8aI35.js",
- "_9f3gAZ9b.js"
- ]
- },
- "_ChOwRET-.js": {
- "file": "_app/immutable/chunks/ChOwRET-.js",
- "name": "input",
- "imports": [
- "_Duj8aI35.js"
- ]
- },
- "_Cp0_Ivrq.js": {
- "file": "_app/immutable/chunks/Cp0_Ivrq.js",
- "name": "entry",
- "imports": [
- "_Duj8aI35.js",
- "_B_j05Fed.js",
- "_DHtUr0jS.js"
- ]
- },
- "_D0tQPCXt.js": {
- "file": "_app/immutable/chunks/D0tQPCXt.js",
- "name": "class",
- "imports": [
- "_Duj8aI35.js"
- ]
- },
- "_D36G5VVl.js": {
- "file": "_app/immutable/chunks/D36G5VVl.js",
- "name": "stores",
- "imports": [
- "_Cp0_Ivrq.js"
- ]
- },
- "_DHtUr0jS.js": {
- "file": "_app/immutable/chunks/DHtUr0jS.js",
- "name": "state.svelte",
- "imports": [
- "_DbjAFM6h.js",
- "_Duj8aI35.js",
- "_B_j05Fed.js"
- ]
- },
- "_DbjAFM6h.js": {
- "file": "_app/immutable/chunks/DbjAFM6h.js",
- "name": "index-client",
- "imports": [
- "_Duj8aI35.js"
- ]
- },
- "_Duj8aI35.js": {
- "file": "_app/immutable/chunks/Duj8aI35.js",
- "name": "runtime"
- },
- "node_modules/@sveltejs/kit/src/runtime/client/entry.js": {
- "file": "_app/immutable/entry/start.CoQRAp_d.js",
- "name": "entry/start",
- "src": "node_modules/@sveltejs/kit/src/runtime/client/entry.js",
- "isEntry": true,
- "imports": [
- "_Cp0_Ivrq.js",
- "_DHtUr0jS.js"
- ]
- }
-}
\ No newline at end of file
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/0.DkgBtk4_.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/0.DkgBtk4_.css
deleted file mode 100644
index 792fc3f..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/0.DkgBtk4_.css
+++ /dev/null
@@ -1 +0,0 @@
-.loading.svelte-12qhfyh{min-height:100vh;display:flex;align-items:center;justify-content:center;font-size:1.2rem;color:#666}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,sans-serif;background:#f5f5f5}.app.svelte-12qhfyh{min-height:100vh}header.svelte-12qhfyh{background:#2c3e50;color:#fff;padding:.75rem 2rem;display:flex;align-items:center;gap:2rem;flex-wrap:wrap}h1.svelte-12qhfyh{margin:0;font-size:1.25rem}nav.svelte-12qhfyh{display:flex;gap:.5rem;flex:1}nav.svelte-12qhfyh a:where(.svelte-12qhfyh){color:#ecf0f1;text-decoration:none;padding:.5rem 1rem;border-radius:4px;font-size:.9rem;transition:background .2s}nav.svelte-12qhfyh a:where(.svelte-12qhfyh):hover{background:#34495e}main.svelte-12qhfyh{padding:2rem;max-width:1400px;margin:0 auto}.user-menu.svelte-12qhfyh{display:flex;align-items:center;gap:1rem;font-size:.9rem}.user-menu.svelte-12qhfyh span:where(.svelte-12qhfyh){color:#ecf0f1}.user-menu.svelte-12qhfyh a:where(.svelte-12qhfyh){color:#ecf0f1;text-decoration:none;padding:.375rem .75rem;border:1px solid #7f8c8d;border-radius:4px;font-size:.85rem}.user-menu.svelte-12qhfyh a:where(.svelte-12qhfyh):hover{background:#34495e}.user-menu.svelte-12qhfyh button:where(.svelte-12qhfyh){background:transparent;border:1px solid #7f8c8d;color:#ecf0f1;padding:.375rem .75rem;border-radius:4px;cursor:pointer;font-size:.85rem}.user-menu.svelte-12qhfyh button:where(.svelte-12qhfyh):hover{background:#34495e}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/10.Qar-kS8x.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/10.Qar-kS8x.css
deleted file mode 100644
index bbde314..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/10.Qar-kS8x.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-15uyvzd{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;gap:1rem}.back.svelte-15uyvzd{color:#3498db;text-decoration:none;font-size:.9rem}.back.svelte-15uyvzd:hover{text-decoration:underline}.header.svelte-15uyvzd h2:where(.svelte-15uyvzd){flex:1;margin:0}table.svelte-15uyvzd{width:100%;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}th.svelte-15uyvzd,td.svelte-15uyvzd{padding:1rem;text-align:left;border-bottom:1px solid #eee}th.svelte-15uyvzd{background:#f8f9fa;font-weight:600}button.svelte-15uyvzd{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff}button.danger.svelte-15uyvzd{background:#e74c3c}.modal-backdrop.svelte-15uyvzd{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;border:none;cursor:pointer;z-index:100}.modal.svelte-15uyvzd{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;padding:2rem;border-radius:8px;min-width:400px;z-index:101}.modal.svelte-15uyvzd h3:where(.svelte-15uyvzd){margin-top:0}.modal.svelte-15uyvzd form:where(.svelte-15uyvzd){display:flex;flex-direction:column;gap:1rem}.modal.svelte-15uyvzd label:where(.svelte-15uyvzd){display:flex;flex-direction:column;gap:.5rem}.modal.svelte-15uyvzd input:where(.svelte-15uyvzd){padding:.5rem;border:1px solid #ddd;border-radius:4px}.actions.svelte-15uyvzd{display:flex;gap:1rem;justify-content:flex-end}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/11.D38O3Xxc.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/11.D38O3Xxc.css
deleted file mode 100644
index 14eb981..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/11.D38O3Xxc.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-oa5z6t{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;gap:1rem}.back.svelte-oa5z6t{color:#3498db;text-decoration:none;font-size:.9rem}.back.svelte-oa5z6t:hover{text-decoration:underline}.header.svelte-oa5z6t h2:where(.svelte-oa5z6t){flex:1;margin:0}table.svelte-oa5z6t{width:100%;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}th.svelte-oa5z6t,td.svelte-oa5z6t{padding:1rem;text-align:left;border-bottom:1px solid #eee}th.svelte-oa5z6t{background:#f8f9fa;font-weight:600}button.svelte-oa5z6t{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff}button.danger.svelte-oa5z6t{background:#e74c3c}.modal-backdrop.svelte-oa5z6t{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;border:none;cursor:pointer;z-index:100}.modal.svelte-oa5z6t{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;padding:2rem;border-radius:8px;min-width:400px;z-index:101}.modal.svelte-oa5z6t h3:where(.svelte-oa5z6t){margin-top:0}.modal.svelte-oa5z6t form:where(.svelte-oa5z6t){display:flex;flex-direction:column;gap:1rem}.modal.svelte-oa5z6t label:where(.svelte-oa5z6t){display:flex;flex-direction:column;gap:.5rem}.modal.svelte-oa5z6t input:where(.svelte-oa5z6t){padding:.5rem;border:1px solid #ddd;border-radius:4px}.actions.svelte-oa5z6t{display:flex;gap:1rem;justify-content:flex-end}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/12.DQdHIvb_.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/12.DQdHIvb_.css
deleted file mode 100644
index 3f6263d..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/12.DQdHIvb_.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-1lsf4ps{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;flex-wrap:wrap;gap:1rem}.controls.svelte-1lsf4ps{display:flex;gap:1rem;align-items:center}.controls.svelte-1lsf4ps label:where(.svelte-1lsf4ps){display:flex;align-items:center;gap:.5rem}.controls.svelte-1lsf4ps select:where(.svelte-1lsf4ps),.controls.svelte-1lsf4ps input:where(.svelte-1lsf4ps){padding:.5rem;border:1px solid #ddd;border-radius:4px}button.svelte-1lsf4ps{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff}.log-container.svelte-1lsf4ps{background:#1a1a2e;color:#eee;padding:1rem;border-radius:8px;max-height:600px;overflow-y:auto;font-family:monospace;font-size:.85rem}.log-entry.svelte-1lsf4ps{padding:.25rem 0;border-bottom:1px solid #333}.log-entry.svelte-1lsf4ps:last-child{border-bottom:none}.timestamp.svelte-1lsf4ps{color:#888;margin-right:.5rem}.priority.svelte-1lsf4ps{margin-right:.5rem;font-weight:700}.log-entry.error.svelte-1lsf4ps .priority:where(.svelte-1lsf4ps){color:#e74c3c}.log-entry.warning.svelte-1lsf4ps .priority:where(.svelte-1lsf4ps){color:#f39c12}.log-entry.info.svelte-1lsf4ps .priority:where(.svelte-1lsf4ps){color:#3498db}.error.svelte-1lsf4ps{color:#e74c3c}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/13.DnP_H9DZ.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/13.DnP_H9DZ.css
deleted file mode 100644
index 5caa7e3..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/13.DnP_H9DZ.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-qegr5c{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem}table.svelte-qegr5c{width:100%;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}th.svelte-qegr5c,td.svelte-qegr5c{padding:.75rem;text-align:left;border-bottom:1px solid #eee;font-size:.9rem}th.svelte-qegr5c{background:#f8f9fa;font-weight:600}.id.svelte-qegr5c{font-family:monospace;font-size:.8rem}.reason.svelte-qegr5c{color:#e74c3c}button.svelte-qegr5c{padding:.25rem .5rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff;font-size:.8rem;margin-right:.25rem}button.danger.svelte-qegr5c{background:#e74c3c}.error.svelte-qegr5c{color:#e74c3c}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/2.By2d6Bxb.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/2.By2d6Bxb.css
deleted file mode 100644
index f2098ff..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/2.By2d6Bxb.css
+++ /dev/null
@@ -1 +0,0 @@
-.stats-grid.svelte-1uha8ag{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1.5rem;margin-top:2rem}.stat-card.svelte-1uha8ag{background:#fff;padding:1.5rem;border-radius:8px;box-shadow:0 2px 4px #0000001a;text-align:center}.stat-card.warning.svelte-1uha8ag{border:2px solid #e74c3c}.stat-card.svelte-1uha8ag h3:where(.svelte-1uha8ag){font-size:2.5rem;margin:0;color:#2c3e50}.stat-card.svelte-1uha8ag p:where(.svelte-1uha8ag){margin:.5rem 0 0;color:#7f8c8d}.warning.svelte-1uha8ag h3:where(.svelte-1uha8ag){color:#e74c3c}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/4.CG2X--Z8.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/4.CG2X--Z8.css
deleted file mode 100644
index ea80681..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/4.CG2X--Z8.css
+++ /dev/null
@@ -1 +0,0 @@
-.page-container.svelte-imhhoo{min-height:100vh;background:#f5f7fa}.header.svelte-imhhoo{background:#fff;padding:1rem 2rem;box-shadow:0 2px 4px #0000001a}.header-content.svelte-imhhoo{max-width:800px;margin:0 auto;display:flex;justify-content:space-between;align-items:center}.header.svelte-imhhoo h1:where(.svelte-imhhoo){margin:0;font-size:1.5rem;color:#2c3e50}.user-info.svelte-imhhoo{display:flex;align-items:center;gap:1rem}.logout.svelte-imhhoo{padding:.5rem 1rem;background:#e74c3c;color:#fff;border:none;border-radius:4px;cursor:pointer}.content.svelte-imhhoo{max-width:500px;margin:2rem auto;padding:2rem;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a}.error.svelte-imhhoo{background:#fee;color:#c00;padding:.75rem;border-radius:4px;margin-bottom:1rem}.success.svelte-imhhoo{background:#efe;color:#060;padding:.75rem;border-radius:4px;margin-bottom:1rem}form.svelte-imhhoo{display:flex;flex-direction:column;gap:1rem}label.svelte-imhhoo{display:flex;flex-direction:column;gap:.5rem;font-weight:500;color:#555}input.svelte-imhhoo{padding:.75rem;border:1px solid #ddd;border-radius:6px;font-size:1rem}input.svelte-imhhoo:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}button.svelte-imhhoo{padding:.75rem;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:6px;font-size:1rem;font-weight:500;cursor:pointer;margin-top:.5rem}button.svelte-imhhoo:hover:not(:disabled){opacity:.9}button.svelte-imhhoo:disabled{opacity:.6;cursor:not-allowed}.links.svelte-imhhoo{margin-top:1.5rem;text-align:center}.links.svelte-imhhoo a:where(.svelte-imhhoo){color:#667eea;text-decoration:none}.links.svelte-imhhoo a:where(.svelte-imhhoo):hover{text-decoration:underline}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/5.YbbfqdJp.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/5.YbbfqdJp.css
deleted file mode 100644
index 47f5e83..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/5.YbbfqdJp.css
+++ /dev/null
@@ -1 +0,0 @@
-.page-container.svelte-1s1ktxm{min-height:100vh;background:#f5f7fa}.header.svelte-1s1ktxm{background:#fff;padding:1rem 2rem;box-shadow:0 2px 4px #0000001a;display:flex;justify-content:space-between;align-items:center}.header.svelte-1s1ktxm h1:where(.svelte-1s1ktxm){margin:0;font-size:1.5rem;color:#2c3e50}.user-info.svelte-1s1ktxm{display:flex;align-items:center;gap:1rem}.logout.svelte-1s1ktxm{padding:.5rem 1rem;background:#e74c3c;color:#fff;border:none;border-radius:4px;cursor:pointer}.content.svelte-1s1ktxm{max-width:800px;margin:2rem auto;padding:0 1rem}.card.svelte-1s1ktxm{background:#fff;padding:1.5rem;border-radius:12px;box-shadow:0 2px 8px #0000001a;margin-bottom:1.5rem}.card.svelte-1s1ktxm h2:where(.svelte-1s1ktxm){margin:0 0 1rem;color:#2c3e50;font-size:1.2rem}.info-row.svelte-1s1ktxm{display:flex;padding:.75rem 0;border-bottom:1px solid #eee}.info-row.svelte-1s1ktxm:last-child{border-bottom:none}.label.svelte-1s1ktxm{font-weight:500;color:#666;width:120px}.value.svelte-1s1ktxm{color:#2c3e50}.actions.svelte-1s1ktxm{display:flex;gap:1rem;flex-wrap:wrap}.action-btn.svelte-1s1ktxm{padding:.75rem 1.5rem;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;text-decoration:none;border-radius:6px;font-weight:500;transition:opacity .2s}.action-btn.svelte-1s1ktxm:hover{opacity:.9}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/6.w_qTFDpy.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/6.w_qTFDpy.css
deleted file mode 100644
index 4f2c471..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/6.w_qTFDpy.css
+++ /dev/null
@@ -1 +0,0 @@
-.login-container.svelte-15sczaz{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#667eea,#764ba2);padding:1rem}.login-card.svelte-15sczaz{background:#fff;padding:2rem;border-radius:12px;box-shadow:0 10px 40px #0003;width:100%;max-width:400px}h1.svelte-15sczaz{text-align:center;margin:0 0 1rem;color:#2c3e50}.info.svelte-15sczaz{color:#666;text-align:center;margin-bottom:1.5rem;font-size:.9rem}.error.svelte-15sczaz{background:#fee;color:#c00;padding:.75rem;border-radius:4px;margin-bottom:1rem;font-size:.9rem}.success.svelte-15sczaz{background:#efe;color:#060;padding:1rem;border-radius:4px;margin-bottom:1rem;text-align:center}.success.svelte-15sczaz p:where(.svelte-15sczaz){margin:.5rem 0}form.svelte-15sczaz{display:flex;flex-direction:column;gap:1rem}label.svelte-15sczaz{display:flex;flex-direction:column;gap:.5rem;font-weight:500;color:#555}input.svelte-15sczaz{padding:.75rem;border:1px solid #ddd;border-radius:6px;font-size:1rem}input.svelte-15sczaz:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}button.svelte-15sczaz{padding:.75rem;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:6px;font-size:1rem;font-weight:500;cursor:pointer;transition:opacity .2s}button.svelte-15sczaz:hover:not(:disabled){opacity:.9}button.svelte-15sczaz:disabled{opacity:.6;cursor:not-allowed}.links.svelte-15sczaz{margin-top:1.5rem;text-align:center;padding-top:1rem;border-top:1px solid #eee}.links.svelte-15sczaz a:where(.svelte-15sczaz){color:#667eea;text-decoration:none;font-size:.9rem}.links.svelte-15sczaz a:where(.svelte-15sczaz):hover{text-decoration:underline}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/7.Bq7myTre.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/7.Bq7myTre.css
deleted file mode 100644
index 5e0a5f3..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/7.Bq7myTre.css
+++ /dev/null
@@ -1 +0,0 @@
-.login-container.svelte-1i2smtp{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#2c3e50,#34495e)}.login-card.svelte-1i2smtp{background:#fff;padding:3rem;border-radius:12px;box-shadow:0 10px 40px #0003;width:100%;max-width:400px}h1.svelte-1i2smtp{margin:0;text-align:center;color:#2c3e50;font-size:2rem}.subtitle.svelte-1i2smtp{text-align:center;color:#7f8c8d;margin:.5rem 0 2rem}.error.svelte-1i2smtp{background:#fee;border:1px solid #fcc;color:#c00;padding:.75rem;border-radius:4px;margin-bottom:1rem;font-size:.9rem}form.svelte-1i2smtp{display:flex;flex-direction:column;gap:1.25rem}label.svelte-1i2smtp{display:flex;flex-direction:column;gap:.5rem;font-weight:500;color:#2c3e50}input.svelte-1i2smtp{padding:.75rem;border:1px solid #ddd;border-radius:6px;font-size:1rem;transition:border-color .2s}input.svelte-1i2smtp:focus{outline:none;border-color:#3498db}.forgot.svelte-1i2smtp{text-align:right;margin-top:-.5rem}.forgot.svelte-1i2smtp a:where(.svelte-1i2smtp){color:#3498db;text-decoration:none;font-size:.9rem}.forgot.svelte-1i2smtp a:where(.svelte-1i2smtp):hover{text-decoration:underline}button.svelte-1i2smtp{padding:.875rem;background:#3498db;color:#fff;border:none;border-radius:6px;font-size:1rem;font-weight:600;cursor:pointer;transition:background .2s;margin-top:.5rem}button.svelte-1i2smtp:hover:not(:disabled){background:#2980b9}button.svelte-1i2smtp:disabled{opacity:.7;cursor:not-allowed}
diff --git a/frontend/.svelte-kit/output/client/_app/immutable/assets/9.Ci0QlAaW.css b/frontend/.svelte-kit/output/client/_app/immutable/assets/9.Ci0QlAaW.css
deleted file mode 100644
index 6ef841b..0000000
--- a/frontend/.svelte-kit/output/client/_app/immutable/assets/9.Ci0QlAaW.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-lb8x40{margin-bottom:2rem}.back.svelte-lb8x40{display:inline-block;margin-bottom:1rem;color:#3498db;text-decoration:none}.back.svelte-lb8x40:hover{text-decoration:underline}.error.svelte-lb8x40{color:#e74c3c}.cards-grid.svelte-lb8x40{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1.5rem}.card.svelte-lb8x40{background:#fff;padding:2rem;border-radius:8px;box-shadow:0 2px 4px #0000001a;text-align:center;text-decoration:none;color:inherit;transition:transform .2s,box-shadow .2s}.card.svelte-lb8x40:hover{transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.card.svelte-lb8x40 h3:where(.svelte-lb8x40){font-size:3rem;margin:0;color:#3498db}.card.svelte-lb8x40 p:where(.svelte-lb8x40){margin:.5rem 0 0;color:#7f8c8d;font-size:1.1rem}
diff --git a/frontend/.svelte-kit/output/client/_app/version.json b/frontend/.svelte-kit/output/client/_app/version.json
deleted file mode 100644
index f1bcdd4..0000000
--- a/frontend/.svelte-kit/output/client/_app/version.json
+++ /dev/null
@@ -1 +0,0 @@
-{"version":"1774133205006"}
\ No newline at end of file
diff --git a/frontend/.svelte-kit/output/client/favicon.png b/frontend/.svelte-kit/output/client/favicon.png
deleted file mode 100644
index 47ce666..0000000
--- a/frontend/.svelte-kit/output/client/favicon.png
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/frontend/.svelte-kit/output/prerendered/dependencies/_app/env.js b/frontend/.svelte-kit/output/prerendered/dependencies/_app/env.js
deleted file mode 100644
index f5427da..0000000
--- a/frontend/.svelte-kit/output/prerendered/dependencies/_app/env.js
+++ /dev/null
@@ -1 +0,0 @@
-export const env={}
\ No newline at end of file
diff --git a/frontend/.svelte-kit/output/server/.vite/manifest.json b/frontend/.svelte-kit/output/server/.vite/manifest.json
deleted file mode 100644
index f53fdc9..0000000
--- a/frontend/.svelte-kit/output/server/.vite/manifest.json
+++ /dev/null
@@ -1,301 +0,0 @@
-{
- ".svelte-kit/generated/server/internal.js": {
- "file": "internal.js",
- "name": "internal",
- "src": ".svelte-kit/generated/server/internal.js",
- "isEntry": true,
- "imports": [
- "_root.js",
- "_environment.js",
- "_internal.js"
- ]
- },
- "_environment.js": {
- "file": "chunks/environment.js",
- "name": "environment"
- },
- "_exports.js": {
- "file": "chunks/exports.js",
- "name": "exports"
- },
- "_false.js": {
- "file": "chunks/false.js",
- "name": "false"
- },
- "_index.js": {
- "file": "chunks/index.js",
- "name": "index",
- "imports": [
- "_index2.js",
- "_root.js"
- ]
- },
- "_index2.js": {
- "file": "chunks/index2.js",
- "name": "index"
- },
- "_internal.js": {
- "file": "chunks/internal.js",
- "name": "internal",
- "imports": [
- "_root.js",
- "_environment.js"
- ]
- },
- "_root.js": {
- "file": "chunks/root.js",
- "name": "root",
- "imports": [
- "_index2.js",
- "_false.js"
- ]
- },
- "_shared.js": {
- "file": "chunks/shared.js",
- "name": "shared",
- "imports": [
- "_utils.js"
- ]
- },
- "_state.svelte.js": {
- "file": "chunks/state.svelte.js",
- "name": "state.svelte",
- "imports": [
- "_index2.js",
- "_exports.js",
- "_root.js"
- ]
- },
- "_utils.js": {
- "file": "chunks/utils.js",
- "name": "utils"
- },
- "node_modules/@sveltejs/kit/src/runtime/app/server/remote/index.js": {
- "file": "remote-entry.js",
- "name": "remote-entry",
- "src": "node_modules/@sveltejs/kit/src/runtime/app/server/remote/index.js",
- "isEntry": true,
- "imports": [
- "_shared.js",
- "_false.js",
- "_environment.js"
- ]
- },
- "node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte": {
- "file": "entries/fallbacks/error.svelte.js",
- "name": "entries/fallbacks/error.svelte",
- "src": "node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte",
- "isEntry": true,
- "imports": [
- "_index2.js",
- "_state.svelte.js",
- "_exports.js",
- "_utils.js",
- "_index.js",
- "_root.js"
- ]
- },
- "node_modules/@sveltejs/kit/src/runtime/server/index.js": {
- "file": "index.js",
- "name": "index",
- "src": "node_modules/@sveltejs/kit/src/runtime/server/index.js",
- "isEntry": true,
- "imports": [
- "_false.js",
- "_environment.js",
- "_shared.js",
- "_exports.js",
- "_utils.js",
- "_index.js",
- "_internal.js"
- ]
- },
- "src/routes/+layout.svelte": {
- "file": "entries/pages/_layout.svelte.js",
- "name": "entries/pages/_layout.svelte",
- "src": "src/routes/+layout.svelte",
- "isEntry": true,
- "imports": [
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ],
- "css": [
- "_app/immutable/assets/_layout.DkgBtk4_.css"
- ]
- },
- "src/routes/+page.svelte": {
- "file": "entries/pages/_page.svelte.js",
- "name": "entries/pages/_page.svelte",
- "src": "src/routes/+page.svelte",
- "isEntry": true,
- "css": [
- "_app/immutable/assets/_page.By2d6Bxb.css"
- ]
- },
- "src/routes/aliases/+page.svelte": {
- "file": "entries/pages/aliases/_page.svelte.js",
- "name": "entries/pages/aliases/_page.svelte",
- "src": "src/routes/aliases/+page.svelte",
- "isEntry": true,
- "imports": [
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ]
- },
- "src/routes/auth/change-password/+page.svelte": {
- "file": "entries/pages/auth/change-password/_page.svelte.js",
- "name": "entries/pages/auth/change-password/_page.svelte",
- "src": "src/routes/auth/change-password/+page.svelte",
- "isEntry": true,
- "imports": [
- "_index2.js",
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ],
- "css": [
- "_app/immutable/assets/_page.CG2X--Z8.css"
- ]
- },
- "src/routes/auth/dashboard/+page.svelte": {
- "file": "entries/pages/auth/dashboard/_page.svelte.js",
- "name": "entries/pages/auth/dashboard/_page.svelte",
- "src": "src/routes/auth/dashboard/+page.svelte",
- "isEntry": true,
- "imports": [
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ],
- "css": [
- "_app/immutable/assets/_page.YbbfqdJp.css"
- ]
- },
- "src/routes/auth/forgot/+page.svelte": {
- "file": "entries/pages/auth/forgot/_page.svelte.js",
- "name": "entries/pages/auth/forgot/_page.svelte",
- "src": "src/routes/auth/forgot/+page.svelte",
- "isEntry": true,
- "imports": [
- "_index2.js",
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ],
- "css": [
- "_app/immutable/assets/_page.w_qTFDpy.css"
- ]
- },
- "src/routes/auth/login/+page.svelte": {
- "file": "entries/pages/auth/login/_page.svelte.js",
- "name": "entries/pages/auth/login/_page.svelte",
- "src": "src/routes/auth/login/+page.svelte",
- "isEntry": true,
- "imports": [
- "_index2.js",
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ],
- "css": [
- "_app/immutable/assets/_page.Bq7myTre.css"
- ]
- },
- "src/routes/domains/+page.svelte": {
- "file": "entries/pages/domains/_page.svelte.js",
- "name": "entries/pages/domains/_page.svelte",
- "src": "src/routes/domains/+page.svelte",
- "isEntry": true,
- "css": [
- "_app/immutable/assets/_page.CEZIoQaL.css"
- ]
- },
- "src/routes/domains/[name]/+page.svelte": {
- "file": "entries/pages/domains/_name_/_page.svelte.js",
- "name": "entries/pages/domains/_name_/_page.svelte",
- "src": "src/routes/domains/[name]/+page.svelte",
- "isEntry": true,
- "imports": [
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ],
- "css": [
- "_app/immutable/assets/_page.Ci0QlAaW.css"
- ]
- },
- "src/routes/domains/[name]/aliases/+page.svelte": {
- "file": "entries/pages/domains/_name_/aliases/_page.svelte.js",
- "name": "entries/pages/domains/_name_/aliases/_page.svelte",
- "src": "src/routes/domains/[name]/aliases/+page.svelte",
- "isEntry": true,
- "imports": [
- "_index2.js",
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ],
- "css": [
- "_app/immutable/assets/_page.CvxoqpCi.css"
- ]
- },
- "src/routes/domains/[name]/users/+page.svelte": {
- "file": "entries/pages/domains/_name_/users/_page.svelte.js",
- "name": "entries/pages/domains/_name_/users/_page.svelte",
- "src": "src/routes/domains/[name]/users/+page.svelte",
- "isEntry": true,
- "imports": [
- "_index2.js",
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ],
- "css": [
- "_app/immutable/assets/_page.Bmr1F0Zh.css"
- ]
- },
- "src/routes/logs/+page.svelte": {
- "file": "entries/pages/logs/_page.svelte.js",
- "name": "entries/pages/logs/_page.svelte",
- "src": "src/routes/logs/+page.svelte",
- "isEntry": true,
- "imports": [
- "_index2.js"
- ],
- "css": [
- "_app/immutable/assets/_page.DQdHIvb_.css"
- ]
- },
- "src/routes/queue/+page.svelte": {
- "file": "entries/pages/queue/_page.svelte.js",
- "name": "entries/pages/queue/_page.svelte",
- "src": "src/routes/queue/+page.svelte",
- "isEntry": true,
- "css": [
- "_app/immutable/assets/_page.DnP_H9DZ.css"
- ]
- },
- "src/routes/users/+page.svelte": {
- "file": "entries/pages/users/_page.svelte.js",
- "name": "entries/pages/users/_page.svelte",
- "src": "src/routes/users/+page.svelte",
- "isEntry": true,
- "imports": [
- "_exports.js",
- "_utils.js",
- "_root.js",
- "_state.svelte.js"
- ]
- }
-}
\ No newline at end of file
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.DkgBtk4_.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.DkgBtk4_.css
deleted file mode 100644
index 792fc3f..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.DkgBtk4_.css
+++ /dev/null
@@ -1 +0,0 @@
-.loading.svelte-12qhfyh{min-height:100vh;display:flex;align-items:center;justify-content:center;font-size:1.2rem;color:#666}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,sans-serif;background:#f5f5f5}.app.svelte-12qhfyh{min-height:100vh}header.svelte-12qhfyh{background:#2c3e50;color:#fff;padding:.75rem 2rem;display:flex;align-items:center;gap:2rem;flex-wrap:wrap}h1.svelte-12qhfyh{margin:0;font-size:1.25rem}nav.svelte-12qhfyh{display:flex;gap:.5rem;flex:1}nav.svelte-12qhfyh a:where(.svelte-12qhfyh){color:#ecf0f1;text-decoration:none;padding:.5rem 1rem;border-radius:4px;font-size:.9rem;transition:background .2s}nav.svelte-12qhfyh a:where(.svelte-12qhfyh):hover{background:#34495e}main.svelte-12qhfyh{padding:2rem;max-width:1400px;margin:0 auto}.user-menu.svelte-12qhfyh{display:flex;align-items:center;gap:1rem;font-size:.9rem}.user-menu.svelte-12qhfyh span:where(.svelte-12qhfyh){color:#ecf0f1}.user-menu.svelte-12qhfyh a:where(.svelte-12qhfyh){color:#ecf0f1;text-decoration:none;padding:.375rem .75rem;border:1px solid #7f8c8d;border-radius:4px;font-size:.85rem}.user-menu.svelte-12qhfyh a:where(.svelte-12qhfyh):hover{background:#34495e}.user-menu.svelte-12qhfyh button:where(.svelte-12qhfyh){background:transparent;border:1px solid #7f8c8d;color:#ecf0f1;padding:.375rem .75rem;border-radius:4px;cursor:pointer;font-size:.85rem}.user-menu.svelte-12qhfyh button:where(.svelte-12qhfyh):hover{background:#34495e}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bmr1F0Zh.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bmr1F0Zh.css
deleted file mode 100644
index a5fa7a6..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bmr1F0Zh.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-oa5z6t{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;gap:1rem}.back.svelte-oa5z6t{color:#3498db;text-decoration:none;font-size:.9rem}.back.svelte-oa5z6t:hover{text-decoration:underline}.header.svelte-oa5z6t h2:where(.svelte-oa5z6t){flex:1;margin:0}table.svelte-oa5z6t{width:100%;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}th.svelte-oa5z6t,td.svelte-oa5z6t{padding:1rem;text-align:left;border-bottom:1px solid #eee}th.svelte-oa5z6t{background:#f8f9fa;font-weight:600}button.svelte-oa5z6t{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff}button.danger.svelte-oa5z6t{background:#e74c3c}.modal-backdrop.svelte-oa5z6t{position:fixed;inset:0;background:#00000080;border:none;cursor:pointer;z-index:100}.modal.svelte-oa5z6t{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;padding:2rem;border-radius:8px;min-width:400px;z-index:101}.modal.svelte-oa5z6t h3:where(.svelte-oa5z6t){margin-top:0}.modal.svelte-oa5z6t form:where(.svelte-oa5z6t){display:flex;flex-direction:column;gap:1rem}.modal.svelte-oa5z6t label:where(.svelte-oa5z6t){display:flex;flex-direction:column;gap:.5rem}.modal.svelte-oa5z6t input:where(.svelte-oa5z6t){padding:.5rem;border:1px solid #ddd;border-radius:4px}.actions.svelte-oa5z6t{display:flex;gap:1rem;justify-content:flex-end}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bq7myTre.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bq7myTre.css
deleted file mode 100644
index 5e0a5f3..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bq7myTre.css
+++ /dev/null
@@ -1 +0,0 @@
-.login-container.svelte-1i2smtp{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#2c3e50,#34495e)}.login-card.svelte-1i2smtp{background:#fff;padding:3rem;border-radius:12px;box-shadow:0 10px 40px #0003;width:100%;max-width:400px}h1.svelte-1i2smtp{margin:0;text-align:center;color:#2c3e50;font-size:2rem}.subtitle.svelte-1i2smtp{text-align:center;color:#7f8c8d;margin:.5rem 0 2rem}.error.svelte-1i2smtp{background:#fee;border:1px solid #fcc;color:#c00;padding:.75rem;border-radius:4px;margin-bottom:1rem;font-size:.9rem}form.svelte-1i2smtp{display:flex;flex-direction:column;gap:1.25rem}label.svelte-1i2smtp{display:flex;flex-direction:column;gap:.5rem;font-weight:500;color:#2c3e50}input.svelte-1i2smtp{padding:.75rem;border:1px solid #ddd;border-radius:6px;font-size:1rem;transition:border-color .2s}input.svelte-1i2smtp:focus{outline:none;border-color:#3498db}.forgot.svelte-1i2smtp{text-align:right;margin-top:-.5rem}.forgot.svelte-1i2smtp a:where(.svelte-1i2smtp){color:#3498db;text-decoration:none;font-size:.9rem}.forgot.svelte-1i2smtp a:where(.svelte-1i2smtp):hover{text-decoration:underline}button.svelte-1i2smtp{padding:.875rem;background:#3498db;color:#fff;border:none;border-radius:6px;font-size:1rem;font-weight:600;cursor:pointer;transition:background .2s;margin-top:.5rem}button.svelte-1i2smtp:hover:not(:disabled){background:#2980b9}button.svelte-1i2smtp:disabled{opacity:.7;cursor:not-allowed}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.By2d6Bxb.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.By2d6Bxb.css
deleted file mode 100644
index f2098ff..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.By2d6Bxb.css
+++ /dev/null
@@ -1 +0,0 @@
-.stats-grid.svelte-1uha8ag{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1.5rem;margin-top:2rem}.stat-card.svelte-1uha8ag{background:#fff;padding:1.5rem;border-radius:8px;box-shadow:0 2px 4px #0000001a;text-align:center}.stat-card.warning.svelte-1uha8ag{border:2px solid #e74c3c}.stat-card.svelte-1uha8ag h3:where(.svelte-1uha8ag){font-size:2.5rem;margin:0;color:#2c3e50}.stat-card.svelte-1uha8ag p:where(.svelte-1uha8ag){margin:.5rem 0 0;color:#7f8c8d}.warning.svelte-1uha8ag h3:where(.svelte-1uha8ag){color:#e74c3c}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CG2X--Z8.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CG2X--Z8.css
deleted file mode 100644
index ea80681..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CG2X--Z8.css
+++ /dev/null
@@ -1 +0,0 @@
-.page-container.svelte-imhhoo{min-height:100vh;background:#f5f7fa}.header.svelte-imhhoo{background:#fff;padding:1rem 2rem;box-shadow:0 2px 4px #0000001a}.header-content.svelte-imhhoo{max-width:800px;margin:0 auto;display:flex;justify-content:space-between;align-items:center}.header.svelte-imhhoo h1:where(.svelte-imhhoo){margin:0;font-size:1.5rem;color:#2c3e50}.user-info.svelte-imhhoo{display:flex;align-items:center;gap:1rem}.logout.svelte-imhhoo{padding:.5rem 1rem;background:#e74c3c;color:#fff;border:none;border-radius:4px;cursor:pointer}.content.svelte-imhhoo{max-width:500px;margin:2rem auto;padding:2rem;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a}.error.svelte-imhhoo{background:#fee;color:#c00;padding:.75rem;border-radius:4px;margin-bottom:1rem}.success.svelte-imhhoo{background:#efe;color:#060;padding:.75rem;border-radius:4px;margin-bottom:1rem}form.svelte-imhhoo{display:flex;flex-direction:column;gap:1rem}label.svelte-imhhoo{display:flex;flex-direction:column;gap:.5rem;font-weight:500;color:#555}input.svelte-imhhoo{padding:.75rem;border:1px solid #ddd;border-radius:6px;font-size:1rem}input.svelte-imhhoo:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}button.svelte-imhhoo{padding:.75rem;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:6px;font-size:1rem;font-weight:500;cursor:pointer;margin-top:.5rem}button.svelte-imhhoo:hover:not(:disabled){opacity:.9}button.svelte-imhhoo:disabled{opacity:.6;cursor:not-allowed}.links.svelte-imhhoo{margin-top:1.5rem;text-align:center}.links.svelte-imhhoo a:where(.svelte-imhhoo){color:#667eea;text-decoration:none}.links.svelte-imhhoo a:where(.svelte-imhhoo):hover{text-decoration:underline}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Ci0QlAaW.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Ci0QlAaW.css
deleted file mode 100644
index 6ef841b..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Ci0QlAaW.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-lb8x40{margin-bottom:2rem}.back.svelte-lb8x40{display:inline-block;margin-bottom:1rem;color:#3498db;text-decoration:none}.back.svelte-lb8x40:hover{text-decoration:underline}.error.svelte-lb8x40{color:#e74c3c}.cards-grid.svelte-lb8x40{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1.5rem}.card.svelte-lb8x40{background:#fff;padding:2rem;border-radius:8px;box-shadow:0 2px 4px #0000001a;text-align:center;text-decoration:none;color:inherit;transition:transform .2s,box-shadow .2s}.card.svelte-lb8x40:hover{transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.card.svelte-lb8x40 h3:where(.svelte-lb8x40){font-size:3rem;margin:0;color:#3498db}.card.svelte-lb8x40 p:where(.svelte-lb8x40){margin:.5rem 0 0;color:#7f8c8d;font-size:1.1rem}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CvxoqpCi.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CvxoqpCi.css
deleted file mode 100644
index f53ac9e..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CvxoqpCi.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-15uyvzd{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;gap:1rem}.back.svelte-15uyvzd{color:#3498db;text-decoration:none;font-size:.9rem}.back.svelte-15uyvzd:hover{text-decoration:underline}.header.svelte-15uyvzd h2:where(.svelte-15uyvzd){flex:1;margin:0}table.svelte-15uyvzd{width:100%;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}th.svelte-15uyvzd,td.svelte-15uyvzd{padding:1rem;text-align:left;border-bottom:1px solid #eee}th.svelte-15uyvzd{background:#f8f9fa;font-weight:600}button.svelte-15uyvzd{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff}button.danger.svelte-15uyvzd{background:#e74c3c}.modal-backdrop.svelte-15uyvzd{position:fixed;inset:0;background:#00000080;border:none;cursor:pointer;z-index:100}.modal.svelte-15uyvzd{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;padding:2rem;border-radius:8px;min-width:400px;z-index:101}.modal.svelte-15uyvzd h3:where(.svelte-15uyvzd){margin-top:0}.modal.svelte-15uyvzd form:where(.svelte-15uyvzd){display:flex;flex-direction:column;gap:1rem}.modal.svelte-15uyvzd label:where(.svelte-15uyvzd){display:flex;flex-direction:column;gap:.5rem}.modal.svelte-15uyvzd input:where(.svelte-15uyvzd){padding:.5rem;border:1px solid #ddd;border-radius:4px}.actions.svelte-15uyvzd{display:flex;gap:1rem;justify-content:flex-end}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DQdHIvb_.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DQdHIvb_.css
deleted file mode 100644
index 3f6263d..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DQdHIvb_.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-1lsf4ps{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;flex-wrap:wrap;gap:1rem}.controls.svelte-1lsf4ps{display:flex;gap:1rem;align-items:center}.controls.svelte-1lsf4ps label:where(.svelte-1lsf4ps){display:flex;align-items:center;gap:.5rem}.controls.svelte-1lsf4ps select:where(.svelte-1lsf4ps),.controls.svelte-1lsf4ps input:where(.svelte-1lsf4ps){padding:.5rem;border:1px solid #ddd;border-radius:4px}button.svelte-1lsf4ps{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff}.log-container.svelte-1lsf4ps{background:#1a1a2e;color:#eee;padding:1rem;border-radius:8px;max-height:600px;overflow-y:auto;font-family:monospace;font-size:.85rem}.log-entry.svelte-1lsf4ps{padding:.25rem 0;border-bottom:1px solid #333}.log-entry.svelte-1lsf4ps:last-child{border-bottom:none}.timestamp.svelte-1lsf4ps{color:#888;margin-right:.5rem}.priority.svelte-1lsf4ps{margin-right:.5rem;font-weight:700}.log-entry.error.svelte-1lsf4ps .priority:where(.svelte-1lsf4ps){color:#e74c3c}.log-entry.warning.svelte-1lsf4ps .priority:where(.svelte-1lsf4ps){color:#f39c12}.log-entry.info.svelte-1lsf4ps .priority:where(.svelte-1lsf4ps){color:#3498db}.error.svelte-1lsf4ps{color:#e74c3c}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DnP_H9DZ.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DnP_H9DZ.css
deleted file mode 100644
index 5caa7e3..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DnP_H9DZ.css
+++ /dev/null
@@ -1 +0,0 @@
-.header.svelte-qegr5c{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem}table.svelte-qegr5c{width:100%;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}th.svelte-qegr5c,td.svelte-qegr5c{padding:.75rem;text-align:left;border-bottom:1px solid #eee;font-size:.9rem}th.svelte-qegr5c{background:#f8f9fa;font-weight:600}.id.svelte-qegr5c{font-family:monospace;font-size:.8rem}.reason.svelte-qegr5c{color:#e74c3c}button.svelte-qegr5c{padding:.25rem .5rem;border:none;border-radius:4px;cursor:pointer;background:#3498db;color:#fff;font-size:.8rem;margin-right:.25rem}button.danger.svelte-qegr5c{background:#e74c3c}.error.svelte-qegr5c{color:#e74c3c}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.YbbfqdJp.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.YbbfqdJp.css
deleted file mode 100644
index 47f5e83..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.YbbfqdJp.css
+++ /dev/null
@@ -1 +0,0 @@
-.page-container.svelte-1s1ktxm{min-height:100vh;background:#f5f7fa}.header.svelte-1s1ktxm{background:#fff;padding:1rem 2rem;box-shadow:0 2px 4px #0000001a;display:flex;justify-content:space-between;align-items:center}.header.svelte-1s1ktxm h1:where(.svelte-1s1ktxm){margin:0;font-size:1.5rem;color:#2c3e50}.user-info.svelte-1s1ktxm{display:flex;align-items:center;gap:1rem}.logout.svelte-1s1ktxm{padding:.5rem 1rem;background:#e74c3c;color:#fff;border:none;border-radius:4px;cursor:pointer}.content.svelte-1s1ktxm{max-width:800px;margin:2rem auto;padding:0 1rem}.card.svelte-1s1ktxm{background:#fff;padding:1.5rem;border-radius:12px;box-shadow:0 2px 8px #0000001a;margin-bottom:1.5rem}.card.svelte-1s1ktxm h2:where(.svelte-1s1ktxm){margin:0 0 1rem;color:#2c3e50;font-size:1.2rem}.info-row.svelte-1s1ktxm{display:flex;padding:.75rem 0;border-bottom:1px solid #eee}.info-row.svelte-1s1ktxm:last-child{border-bottom:none}.label.svelte-1s1ktxm{font-weight:500;color:#666;width:120px}.value.svelte-1s1ktxm{color:#2c3e50}.actions.svelte-1s1ktxm{display:flex;gap:1rem;flex-wrap:wrap}.action-btn.svelte-1s1ktxm{padding:.75rem 1.5rem;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;text-decoration:none;border-radius:6px;font-weight:500;transition:opacity .2s}.action-btn.svelte-1s1ktxm:hover{opacity:.9}
diff --git a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.w_qTFDpy.css b/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.w_qTFDpy.css
deleted file mode 100644
index 4f2c471..0000000
--- a/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.w_qTFDpy.css
+++ /dev/null
@@ -1 +0,0 @@
-.login-container.svelte-15sczaz{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#667eea,#764ba2);padding:1rem}.login-card.svelte-15sczaz{background:#fff;padding:2rem;border-radius:12px;box-shadow:0 10px 40px #0003;width:100%;max-width:400px}h1.svelte-15sczaz{text-align:center;margin:0 0 1rem;color:#2c3e50}.info.svelte-15sczaz{color:#666;text-align:center;margin-bottom:1.5rem;font-size:.9rem}.error.svelte-15sczaz{background:#fee;color:#c00;padding:.75rem;border-radius:4px;margin-bottom:1rem;font-size:.9rem}.success.svelte-15sczaz{background:#efe;color:#060;padding:1rem;border-radius:4px;margin-bottom:1rem;text-align:center}.success.svelte-15sczaz p:where(.svelte-15sczaz){margin:.5rem 0}form.svelte-15sczaz{display:flex;flex-direction:column;gap:1rem}label.svelte-15sczaz{display:flex;flex-direction:column;gap:.5rem;font-weight:500;color:#555}input.svelte-15sczaz{padding:.75rem;border:1px solid #ddd;border-radius:6px;font-size:1rem}input.svelte-15sczaz:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}button.svelte-15sczaz{padding:.75rem;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:6px;font-size:1rem;font-weight:500;cursor:pointer;transition:opacity .2s}button.svelte-15sczaz:hover:not(:disabled){opacity:.9}button.svelte-15sczaz:disabled{opacity:.6;cursor:not-allowed}.links.svelte-15sczaz{margin-top:1.5rem;text-align:center;padding-top:1rem;border-top:1px solid #eee}.links.svelte-15sczaz a:where(.svelte-15sczaz){color:#667eea;text-decoration:none;font-size:.9rem}.links.svelte-15sczaz a:where(.svelte-15sczaz):hover{text-decoration:underline}
diff --git a/frontend/.svelte-kit/output/server/chunks/environment.js b/frontend/.svelte-kit/output/server/chunks/environment.js
deleted file mode 100644
index ad45c3c..0000000
--- a/frontend/.svelte-kit/output/server/chunks/environment.js
+++ /dev/null
@@ -1,34 +0,0 @@
-let base = "";
-let assets = base;
-const app_dir = "_app";
-const relative = true;
-const initial = { base, assets };
-function override(paths) {
- base = paths.base;
- assets = paths.assets;
-}
-function reset() {
- base = initial.base;
- assets = initial.assets;
-}
-function set_assets(path) {
- assets = initial.assets = path;
-}
-let prerendering = false;
-function set_building() {
-}
-function set_prerendering() {
- prerendering = true;
-}
-export {
- assets as a,
- base as b,
- app_dir as c,
- reset as d,
- set_building as e,
- set_prerendering as f,
- override as o,
- prerendering as p,
- relative as r,
- set_assets as s
-};
diff --git a/frontend/.svelte-kit/output/server/chunks/exports.js b/frontend/.svelte-kit/output/server/chunks/exports.js
deleted file mode 100644
index 81554d4..0000000
--- a/frontend/.svelte-kit/output/server/chunks/exports.js
+++ /dev/null
@@ -1,174 +0,0 @@
-const SCHEME = /^[a-z][a-z\d+\-.]+:/i;
-const internal = new URL("sveltekit-internal://");
-function resolve(base, path) {
- if (path[0] === "/" && path[1] === "/") return path;
- let url = new URL(base, internal);
- url = new URL(path, url);
- return url.protocol === internal.protocol ? url.pathname + url.search + url.hash : url.href;
-}
-function normalize_path(path, trailing_slash) {
- if (path === "/" || trailing_slash === "ignore") return path;
- if (trailing_slash === "never") {
- return path.endsWith("/") ? path.slice(0, -1) : path;
- } else if (trailing_slash === "always" && !path.endsWith("/")) {
- return path + "/";
- }
- return path;
-}
-function decode_pathname(pathname) {
- return pathname.split("%25").map(decodeURI).join("%25");
-}
-function decode_params(params) {
- for (const key in params) {
- params[key] = decodeURIComponent(params[key]);
- }
- return params;
-}
-function make_trackable(url, callback, search_params_callback, allow_hash = false) {
- const tracked = new URL(url);
- Object.defineProperty(tracked, "searchParams", {
- value: new Proxy(tracked.searchParams, {
- get(obj, key) {
- if (key === "get" || key === "getAll" || key === "has") {
- return (param, ...rest) => {
- search_params_callback(param);
- return obj[key](param, ...rest);
- };
- }
- callback();
- const value = Reflect.get(obj, key);
- return typeof value === "function" ? value.bind(obj) : value;
- }
- }),
- enumerable: true,
- configurable: true
- });
- const tracked_url_properties = ["href", "pathname", "search", "toString", "toJSON"];
- if (allow_hash) tracked_url_properties.push("hash");
- for (const property of tracked_url_properties) {
- Object.defineProperty(tracked, property, {
- get() {
- callback();
- return url[property];
- },
- enumerable: true,
- configurable: true
- });
- }
- {
- tracked[Symbol.for("nodejs.util.inspect.custom")] = (depth, opts, inspect) => {
- return inspect(url, opts);
- };
- tracked.searchParams[Symbol.for("nodejs.util.inspect.custom")] = (depth, opts, inspect) => {
- return inspect(url.searchParams, opts);
- };
- }
- if (!allow_hash) {
- disable_hash(tracked);
- }
- return tracked;
-}
-function disable_hash(url) {
- allow_nodejs_console_log(url);
- Object.defineProperty(url, "hash", {
- get() {
- throw new Error(
- "Cannot access event.url.hash. Consider using `page.url.hash` inside a component instead"
- );
- }
- });
-}
-function disable_search(url) {
- allow_nodejs_console_log(url);
- for (const property of ["search", "searchParams"]) {
- Object.defineProperty(url, property, {
- get() {
- throw new Error(`Cannot access url.${property} on a page with prerendering enabled`);
- }
- });
- }
-}
-function allow_nodejs_console_log(url) {
- {
- url[Symbol.for("nodejs.util.inspect.custom")] = (depth, opts, inspect) => {
- return inspect(new URL(url), opts);
- };
- }
-}
-function validator(expected) {
- function validate(module, file) {
- if (!module) return;
- for (const key in module) {
- if (key[0] === "_" || expected.has(key)) continue;
- const values = [...expected.values()];
- const hint = hint_for_supported_files(key, file?.slice(file.lastIndexOf("."))) ?? `valid exports are ${values.join(", ")}, or anything with a '_' prefix`;
- throw new Error(`Invalid export '${key}'${file ? ` in ${file}` : ""} (${hint})`);
- }
- }
- return validate;
-}
-function hint_for_supported_files(key, ext = ".js") {
- const supported_files = [];
- if (valid_layout_exports.has(key)) {
- supported_files.push(`+layout${ext}`);
- }
- if (valid_page_exports.has(key)) {
- supported_files.push(`+page${ext}`);
- }
- if (valid_layout_server_exports.has(key)) {
- supported_files.push(`+layout.server${ext}`);
- }
- if (valid_page_server_exports.has(key)) {
- supported_files.push(`+page.server${ext}`);
- }
- if (valid_server_exports.has(key)) {
- supported_files.push(`+server${ext}`);
- }
- if (supported_files.length > 0) {
- return `'${key}' is a valid export in ${supported_files.slice(0, -1).join(", ")}${supported_files.length > 1 ? " or " : ""}${supported_files.at(-1)}`;
- }
-}
-const valid_layout_exports = /* @__PURE__ */ new Set([
- "load",
- "prerender",
- "csr",
- "ssr",
- "trailingSlash",
- "config"
-]);
-const valid_page_exports = /* @__PURE__ */ new Set([...valid_layout_exports, "entries"]);
-const valid_layout_server_exports = /* @__PURE__ */ new Set([...valid_layout_exports]);
-const valid_page_server_exports = /* @__PURE__ */ new Set([...valid_layout_server_exports, "actions", "entries"]);
-const valid_server_exports = /* @__PURE__ */ new Set([
- "GET",
- "POST",
- "PATCH",
- "PUT",
- "DELETE",
- "OPTIONS",
- "HEAD",
- "fallback",
- "prerender",
- "trailingSlash",
- "config",
- "entries"
-]);
-const validate_layout_exports = validator(valid_layout_exports);
-const validate_page_exports = validator(valid_page_exports);
-const validate_layout_server_exports = validator(valid_layout_server_exports);
-const validate_page_server_exports = validator(valid_page_server_exports);
-const validate_server_exports = validator(valid_server_exports);
-export {
- SCHEME as S,
- decode_params as a,
- validate_layout_exports as b,
- validate_page_server_exports as c,
- disable_search as d,
- validate_page_exports as e,
- decode_pathname as f,
- validate_server_exports as g,
- make_trackable as m,
- normalize_path as n,
- resolve as r,
- validate_layout_server_exports as v
-};
diff --git a/frontend/.svelte-kit/output/server/chunks/false.js b/frontend/.svelte-kit/output/server/chunks/false.js
deleted file mode 100644
index 85bc56d..0000000
--- a/frontend/.svelte-kit/output/server/chunks/false.js
+++ /dev/null
@@ -1,4 +0,0 @@
-const BROWSER = false;
-export {
- BROWSER as B
-};
diff --git a/frontend/.svelte-kit/output/server/chunks/index.js b/frontend/.svelte-kit/output/server/chunks/index.js
deleted file mode 100644
index aff0709..0000000
--- a/frontend/.svelte-kit/output/server/chunks/index.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import { n as noop } from "./index2.js";
-import { s as safe_not_equal } from "./root.js";
-const subscriber_queue = [];
-function readable(value, start) {
- return {
- subscribe: writable(value, start).subscribe
- };
-}
-function writable(value, start = noop) {
- let stop = null;
- const subscribers = /* @__PURE__ */ new Set();
- function set(new_value) {
- if (safe_not_equal(value, new_value)) {
- value = new_value;
- if (stop) {
- const run_queue = !subscriber_queue.length;
- for (const subscriber of subscribers) {
- subscriber[1]();
- subscriber_queue.push(subscriber, value);
- }
- if (run_queue) {
- for (let i = 0; i < subscriber_queue.length; i += 2) {
- subscriber_queue[i][0](subscriber_queue[i + 1]);
- }
- subscriber_queue.length = 0;
- }
- }
- }
- }
- function update(fn) {
- set(fn(
- /** @type {T} */
- value
- ));
- }
- function subscribe(run, invalidate = noop) {
- const subscriber = [run, invalidate];
- subscribers.add(subscriber);
- if (subscribers.size === 1) {
- stop = start(set, update) || noop;
- }
- run(
- /** @type {T} */
- value
- );
- return () => {
- subscribers.delete(subscriber);
- if (subscribers.size === 0 && stop) {
- stop();
- stop = null;
- }
- };
- }
- return { set, update, subscribe };
-}
-export {
- readable as r,
- writable as w
-};
diff --git a/frontend/.svelte-kit/output/server/chunks/index2.js b/frontend/.svelte-kit/output/server/chunks/index2.js
deleted file mode 100644
index 9953b10..0000000
--- a/frontend/.svelte-kit/output/server/chunks/index2.js
+++ /dev/null
@@ -1,1250 +0,0 @@
-import { clsx as clsx$1 } from "clsx";
-import * as devalue from "devalue";
-var is_array = Array.isArray;
-var index_of = Array.prototype.indexOf;
-var includes = Array.prototype.includes;
-var array_from = Array.from;
-var define_property = Object.defineProperty;
-var get_descriptor = Object.getOwnPropertyDescriptor;
-var object_prototype = Object.prototype;
-var array_prototype = Array.prototype;
-var get_prototype_of = Object.getPrototypeOf;
-var is_extensible = Object.isExtensible;
-var has_own_property = Object.prototype.hasOwnProperty;
-const noop = () => {
-};
-function run_all(arr) {
- for (var i = 0; i < arr.length; i++) {
- arr[i]();
- }
-}
-function deferred() {
- var resolve;
- var reject;
- var promise = new Promise((res, rej) => {
- resolve = res;
- reject = rej;
- });
- return { promise, resolve, reject };
-}
-const DERIVED = 1 << 1;
-const EFFECT = 1 << 2;
-const RENDER_EFFECT = 1 << 3;
-const MANAGED_EFFECT = 1 << 24;
-const BLOCK_EFFECT = 1 << 4;
-const BRANCH_EFFECT = 1 << 5;
-const ROOT_EFFECT = 1 << 6;
-const BOUNDARY_EFFECT = 1 << 7;
-const CONNECTED = 1 << 9;
-const CLEAN = 1 << 10;
-const DIRTY = 1 << 11;
-const MAYBE_DIRTY = 1 << 12;
-const INERT = 1 << 13;
-const DESTROYED = 1 << 14;
-const REACTION_RAN = 1 << 15;
-const DESTROYING = 1 << 25;
-const EFFECT_TRANSPARENT = 1 << 16;
-const EAGER_EFFECT = 1 << 17;
-const HEAD_EFFECT = 1 << 18;
-const EFFECT_PRESERVED = 1 << 19;
-const USER_EFFECT = 1 << 20;
-const WAS_MARKED = 1 << 16;
-const REACTION_IS_UPDATING = 1 << 21;
-const ASYNC = 1 << 22;
-const ERROR_VALUE = 1 << 23;
-const STATE_SYMBOL = Symbol("$state");
-const LEGACY_PROPS = Symbol("legacy props");
-const STALE_REACTION = new class StaleReactionError extends Error {
- name = "StaleReactionError";
- message = "The reaction that called `getAbortSignal()` was re-run or destroyed";
-}();
-const COMMENT_NODE = 8;
-function lifecycle_outside_component(name) {
- {
- throw new Error(`https://svelte.dev/e/lifecycle_outside_component`);
- }
-}
-const HYDRATION_START = "[";
-const HYDRATION_START_ELSE = "[!";
-const HYDRATION_START_FAILED = "[?";
-const HYDRATION_END = "]";
-const HYDRATION_ERROR = {};
-const ELEMENT_IS_NAMESPACED = 1;
-const ELEMENT_PRESERVE_ATTRIBUTE_CASE = 1 << 1;
-const ELEMENT_IS_INPUT = 1 << 2;
-const UNINITIALIZED = Symbol();
-const DOM_BOOLEAN_ATTRIBUTES = [
- "allowfullscreen",
- "async",
- "autofocus",
- "autoplay",
- "checked",
- "controls",
- "default",
- "disabled",
- "formnovalidate",
- "indeterminate",
- "inert",
- "ismap",
- "loop",
- "multiple",
- "muted",
- "nomodule",
- "novalidate",
- "open",
- "playsinline",
- "readonly",
- "required",
- "reversed",
- "seamless",
- "selected",
- "webkitdirectory",
- "defer",
- "disablepictureinpicture",
- "disableremoteplayback"
-];
-function is_boolean_attribute(name) {
- return DOM_BOOLEAN_ATTRIBUTES.includes(name);
-}
-const PASSIVE_EVENTS = ["touchstart", "touchmove"];
-function is_passive_event(name) {
- return PASSIVE_EVENTS.includes(name);
-}
-const ATTR_REGEX = /[&"<]/g;
-const CONTENT_REGEX = /[&<]/g;
-function escape_html(value, is_attr) {
- const str = String(value ?? "");
- const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;
- pattern.lastIndex = 0;
- let escaped = "";
- let last = 0;
- while (pattern.test(str)) {
- const i = pattern.lastIndex - 1;
- const ch = str[i];
- escaped += str.substring(last, i) + (ch === "&" ? "&" : ch === '"' ? """ : "<");
- last = i + 1;
- }
- return escaped + str.substring(last);
-}
-const replacements = {
- translate: /* @__PURE__ */ new Map([
- [true, "yes"],
- [false, "no"]
- ])
-};
-function attr(name, value, is_boolean = false) {
- if (name === "hidden" && value !== "until-found") {
- is_boolean = true;
- }
- if (value == null || !value && is_boolean) return "";
- const normalized = has_own_property.call(replacements, name) && replacements[name].get(value) || value;
- const assignment = is_boolean ? `=""` : `="${escape_html(normalized, true)}"`;
- return ` ${name}${assignment}`;
-}
-function clsx(value) {
- if (typeof value === "object") {
- return clsx$1(value);
- } else {
- return value ?? "";
- }
-}
-const whitespace = [..." \n\r\f \v\uFEFF"];
-function to_class(value, hash, directives) {
- var classname = value == null ? "" : "" + value;
- if (hash) {
- classname = classname ? classname + " " + hash : hash;
- }
- if (directives) {
- for (var key of Object.keys(directives)) {
- if (directives[key]) {
- classname = classname ? classname + " " + key : key;
- } else if (classname.length) {
- var len = key.length;
- var a = 0;
- while ((a = classname.indexOf(key, a)) >= 0) {
- var b = a + len;
- if ((a === 0 || whitespace.includes(classname[a - 1])) && (b === classname.length || whitespace.includes(classname[b]))) {
- classname = (a === 0 ? "" : classname.substring(0, a)) + classname.substring(b + 1);
- } else {
- a = b;
- }
- }
- }
- }
- }
- return classname === "" ? null : classname;
-}
-function append_styles(styles, important = false) {
- var separator = important ? " !important;" : ";";
- var css = "";
- for (var key of Object.keys(styles)) {
- var value = styles[key];
- if (value != null && value !== "") {
- css += " " + key + ": " + value + separator;
- }
- }
- return css;
-}
-function to_css_name(name) {
- if (name[0] !== "-" || name[1] !== "-") {
- return name.toLowerCase();
- }
- return name;
-}
-function to_style(value, styles) {
- if (styles) {
- var new_style = "";
- var normal_styles;
- var important_styles;
- if (Array.isArray(styles)) {
- normal_styles = styles[0];
- important_styles = styles[1];
- } else {
- normal_styles = styles;
- }
- if (value) {
- value = String(value).replaceAll(/\s*\/\*.*?\*\/\s*/g, "").trim();
- var in_str = false;
- var in_apo = 0;
- var in_comment = false;
- var reserved_names = [];
- if (normal_styles) {
- reserved_names.push(...Object.keys(normal_styles).map(to_css_name));
- }
- if (important_styles) {
- reserved_names.push(...Object.keys(important_styles).map(to_css_name));
- }
- var start_index = 0;
- var name_index = -1;
- const len = value.length;
- for (var i = 0; i < len; i++) {
- var c = value[i];
- if (in_comment) {
- if (c === "/" && value[i - 1] === "*") {
- in_comment = false;
- }
- } else if (in_str) {
- if (in_str === c) {
- in_str = false;
- }
- } else if (c === "/" && value[i + 1] === "*") {
- in_comment = true;
- } else if (c === '"' || c === "'") {
- in_str = c;
- } else if (c === "(") {
- in_apo++;
- } else if (c === ")") {
- in_apo--;
- }
- if (!in_comment && in_str === false && in_apo === 0) {
- if (c === ":" && name_index === -1) {
- name_index = i;
- } else if (c === ";" || i === len - 1) {
- if (name_index !== -1) {
- var name = to_css_name(value.substring(start_index, name_index).trim());
- if (!reserved_names.includes(name)) {
- if (c !== ";") {
- i++;
- }
- var property = value.substring(start_index, i).trim();
- new_style += " " + property + ";";
- }
- }
- start_index = i + 1;
- name_index = -1;
- }
- }
- }
- }
- if (normal_styles) {
- new_style += append_styles(normal_styles);
- }
- if (important_styles) {
- new_style += append_styles(important_styles, true);
- }
- new_style = new_style.trim();
- return new_style === "" ? null : new_style;
- }
- return value == null ? null : String(value);
-}
-const BLOCK_OPEN = ``;
-const BLOCK_CLOSE = ``;
-let controller = null;
-function abort() {
- controller?.abort(STALE_REACTION);
- controller = null;
-}
-function await_invalid() {
- const error = new Error(`await_invalid
-Encountered asynchronous work while rendering synchronously.
-https://svelte.dev/e/await_invalid`);
- error.name = "Svelte error";
- throw error;
-}
-function invalid_csp() {
- const error = new Error(`invalid_csp
-\`csp.nonce\` was set while \`csp.hash\` was \`true\`. These options cannot be used simultaneously.
-https://svelte.dev/e/invalid_csp`);
- error.name = "Svelte error";
- throw error;
-}
-function server_context_required() {
- const error = new Error(`server_context_required
-Could not resolve \`render\` context.
-https://svelte.dev/e/server_context_required`);
- error.name = "Svelte error";
- throw error;
-}
-var ssr_context = null;
-function set_ssr_context(v) {
- ssr_context = v;
-}
-function getContext(key) {
- const context_map = get_or_init_context_map();
- const result = (
- /** @type {T} */
- context_map.get(key)
- );
- return result;
-}
-function setContext(key, context) {
- get_or_init_context_map().set(key, context);
- return context;
-}
-function get_or_init_context_map(name) {
- if (ssr_context === null) {
- lifecycle_outside_component();
- }
- return ssr_context.c ??= new Map(get_parent_context(ssr_context) || void 0);
-}
-function push(fn) {
- ssr_context = { p: ssr_context, c: null, r: null };
-}
-function pop() {
- ssr_context = /** @type {SSRContext} */
- ssr_context.p;
-}
-function get_parent_context(ssr_context2) {
- let parent = ssr_context2.p;
- while (parent !== null) {
- const context_map = parent.c;
- if (context_map !== null) {
- return context_map;
- }
- parent = parent.p;
- }
- return null;
-}
-function unresolved_hydratable(key, stack) {
- {
- console.warn(`https://svelte.dev/e/unresolved_hydratable`);
- }
-}
-function get_render_context() {
- const store = als?.getStore();
- {
- server_context_required();
- }
- return store;
-}
-let als = null;
-let text_encoder;
-let crypto;
-const obfuscated_import = (module_name) => import(
- /* @vite-ignore */
- module_name
-);
-async function sha256(data) {
- text_encoder ??= new TextEncoder();
- crypto ??= globalThis.crypto?.subtle?.digest ? globalThis.crypto : (
- // @ts-ignore - we don't install node types in the prod build
- // don't use import('node:crypto') directly because static analysers will think we rely on node when we don't
- (await obfuscated_import("node:crypto")).webcrypto
- );
- const hash_buffer = await crypto.subtle.digest("SHA-256", text_encoder.encode(data));
- return base64_encode(hash_buffer);
-}
-function base64_encode(bytes) {
- if (globalThis.Buffer) {
- return globalThis.Buffer.from(bytes).toString("base64");
- }
- let binary = "";
- for (let i = 0; i < bytes.length; i++) {
- binary += String.fromCharCode(bytes[i]);
- }
- return btoa(binary);
-}
-class Renderer {
- /**
- * The contents of the renderer.
- * @type {RendererItem[]}
- */
- #out = [];
- /**
- * Any `onDestroy` callbacks registered during execution of this renderer.
- * @type {(() => void)[] | undefined}
- */
- #on_destroy = void 0;
- /**
- * Whether this renderer is a component body.
- * @type {boolean}
- */
- #is_component_body = false;
- /**
- * If set, this renderer is an error boundary. When async collection
- * of the children fails, the failed snippet is rendered instead.
- * @type {{
- * failed: (renderer: Renderer, error: unknown, reset: () => void) => void;
- * transformError: (error: unknown) => unknown;
- * context: SSRContext | null;
- * } | null}
- */
- #boundary = null;
- /**
- * The type of string content that this renderer is accumulating.
- * @type {RendererType}
- */
- type;
- /** @type {Renderer | undefined} */
- #parent;
- /**
- * Asynchronous work associated with this renderer
- * @type {Promise | undefined}
- */
- promise = void 0;
- /**
- * State which is associated with the content tree as a whole.
- * It will be re-exposed, uncopied, on all children.
- * @type {SSRState}
- * @readonly
- */
- global;
- /**
- * State that is local to the branch it is declared in.
- * It will be shallow-copied to all children.
- *
- * @type {{ select_value: string | undefined }}
- */
- local;
- /**
- * @param {SSRState} global
- * @param {Renderer | undefined} [parent]
- */
- constructor(global, parent) {
- this.#parent = parent;
- this.global = global;
- this.local = parent ? { ...parent.local } : { select_value: void 0 };
- this.type = parent ? parent.type : "body";
- }
- /**
- * @param {(renderer: Renderer) => void} fn
- */
- head(fn) {
- const head = new Renderer(this.global, this);
- head.type = "head";
- this.#out.push(head);
- head.child(fn);
- }
- /**
- * @param {Array>} blockers
- * @param {(renderer: Renderer) => void} fn
- */
- async_block(blockers, fn) {
- this.#out.push(BLOCK_OPEN);
- this.async(blockers, fn);
- this.#out.push(BLOCK_CLOSE);
- }
- /**
- * @param {Array>} blockers
- * @param {(renderer: Renderer) => void} fn
- */
- async(blockers, fn) {
- let callback = fn;
- if (blockers.length > 0) {
- const context = ssr_context;
- callback = (renderer) => {
- return Promise.all(blockers).then(() => {
- const previous_context = ssr_context;
- try {
- set_ssr_context(context);
- return fn(renderer);
- } finally {
- set_ssr_context(previous_context);
- }
- });
- };
- }
- this.child(callback);
- }
- /**
- * @param {Array<() => void>} thunks
- */
- run(thunks) {
- const context = ssr_context;
- let promise = Promise.resolve(thunks[0]());
- const promises = [promise];
- for (const fn of thunks.slice(1)) {
- promise = promise.then(() => {
- const previous_context = ssr_context;
- set_ssr_context(context);
- try {
- return fn();
- } finally {
- set_ssr_context(previous_context);
- }
- });
- promises.push(promise);
- }
- promise.catch(noop);
- this.promise = promise;
- return promises;
- }
- /**
- * @param {(renderer: Renderer) => MaybePromise} fn
- */
- child_block(fn) {
- this.#out.push(BLOCK_OPEN);
- this.child(fn);
- this.#out.push(BLOCK_CLOSE);
- }
- /**
- * Create a child renderer. The child renderer inherits the state from the parent,
- * but has its own content.
- * @param {(renderer: Renderer) => MaybePromise} fn
- */
- child(fn) {
- const child = new Renderer(this.global, this);
- this.#out.push(child);
- const parent = ssr_context;
- set_ssr_context({
- ...ssr_context,
- p: parent,
- c: null,
- r: child
- });
- const result = fn(child);
- set_ssr_context(parent);
- if (result instanceof Promise) {
- result.catch(noop);
- result.finally(() => set_ssr_context(null)).catch(noop);
- if (child.global.mode === "sync") {
- await_invalid();
- }
- child.promise = result;
- }
- return child;
- }
- /**
- * Render children inside an error boundary. If the children throw and the API-level
- * `transformError` transform handles the error (doesn't re-throw), the `failed` snippet is
- * rendered instead. Otherwise the error propagates.
- *
- * @param {{ failed?: (renderer: Renderer, error: unknown, reset: () => void) => void }} props
- * @param {(renderer: Renderer) => MaybePromise} children_fn
- */
- boundary(props, children_fn) {
- const child = new Renderer(this.global, this);
- this.#out.push(child);
- const parent_context = ssr_context;
- if (props.failed) {
- child.#boundary = {
- failed: props.failed,
- transformError: this.global.transformError,
- context: parent_context
- };
- }
- set_ssr_context({
- ...ssr_context,
- p: parent_context,
- c: null,
- r: child
- });
- try {
- const result = children_fn(child);
- set_ssr_context(parent_context);
- if (result instanceof Promise) {
- if (child.global.mode === "sync") {
- await_invalid();
- }
- result.catch(noop);
- child.promise = result;
- }
- } catch (error) {
- set_ssr_context(parent_context);
- const failed_snippet = props.failed;
- if (!failed_snippet) throw error;
- const result = this.global.transformError(error);
- child.#out.length = 0;
- child.#boundary = null;
- if (result instanceof Promise) {
- if (this.global.mode === "sync") {
- await_invalid();
- }
- child.promise = /** @type {Promise} */
- result.then((transformed) => {
- set_ssr_context(parent_context);
- child.#out.push(Renderer.#serialize_failed_boundary(transformed));
- failed_snippet(child, transformed, noop);
- child.#out.push(BLOCK_CLOSE);
- });
- child.promise.catch(noop);
- } else {
- child.#out.push(Renderer.#serialize_failed_boundary(result));
- failed_snippet(child, result, noop);
- child.#out.push(BLOCK_CLOSE);
- }
- }
- }
- /**
- * Create a component renderer. The component renderer inherits the state from the parent,
- * but has its own content. It is treated as an ordering boundary for ondestroy callbacks.
- * @param {(renderer: Renderer) => MaybePromise} fn
- * @param {Function} [component_fn]
- * @returns {void}
- */
- component(fn, component_fn) {
- push();
- const child = this.child(fn);
- child.#is_component_body = true;
- pop();
- }
- /**
- * @param {Record} attrs
- * @param {(renderer: Renderer) => void} fn
- * @param {string | undefined} [css_hash]
- * @param {Record | undefined} [classes]
- * @param {Record | undefined} [styles]
- * @param {number | undefined} [flags]
- * @param {boolean | undefined} [is_rich]
- * @returns {void}
- */
- select(attrs, fn, css_hash, classes, styles, flags, is_rich) {
- const { value, ...select_attrs } = attrs;
- this.push(``);
- }
- /**
- * @param {Record} attrs
- * @param {string | number | boolean | ((renderer: Renderer) => void)} body
- * @param {string | undefined} [css_hash]
- * @param {Record | undefined} [classes]
- * @param {Record | undefined} [styles]
- * @param {number | undefined} [flags]
- * @param {boolean | undefined} [is_rich]
- */
- option(attrs, body, css_hash, classes, styles, flags, is_rich) {
- this.#out.push(``);
- if (head) {
- renderer.head((child) => child.push(head));
- }
- };
- if (typeof body === "function") {
- this.child((renderer) => {
- const r = new Renderer(this.global, this);
- body(r);
- if (this.global.mode === "async") {
- return r.#collect_content_async().then((content) => {
- close(renderer, content.body.replaceAll("", ""), content);
- });
- } else {
- const content = r.#collect_content();
- close(renderer, content.body.replaceAll("", ""), content);
- }
- });
- } else {
- close(this, body, { body: escape_html(body) });
- }
- }
- /**
- * @param {(renderer: Renderer) => void} fn
- */
- title(fn) {
- const path = this.get_path();
- const close = (head) => {
- this.global.set_title(head, path);
- };
- this.child((renderer) => {
- const r = new Renderer(renderer.global, renderer);
- fn(r);
- if (renderer.global.mode === "async") {
- return r.#collect_content_async().then((content) => {
- close(content.head);
- });
- } else {
- const content = r.#collect_content();
- close(content.head);
- }
- });
- }
- /**
- * @param {string | (() => Promise)} content
- */
- push(content) {
- if (typeof content === "function") {
- this.child(async (renderer) => renderer.push(await content()));
- } else {
- this.#out.push(content);
- }
- }
- /**
- * @param {() => void} fn
- */
- on_destroy(fn) {
- (this.#on_destroy ??= []).push(fn);
- }
- /**
- * @returns {number[]}
- */
- get_path() {
- return this.#parent ? [...this.#parent.get_path(), this.#parent.#out.indexOf(this)] : [];
- }
- /**
- * @deprecated this is needed for legacy component bindings
- */
- copy() {
- const copy = new Renderer(this.global, this.#parent);
- copy.#out = this.#out.map((item) => item instanceof Renderer ? item.copy() : item);
- copy.promise = this.promise;
- return copy;
- }
- /**
- * @param {Renderer} other
- * @deprecated this is needed for legacy component bindings
- */
- subsume(other) {
- if (this.global.mode !== other.global.mode) {
- throw new Error(
- "invariant: A renderer cannot switch modes. If you're seeing this, there's a compiler bug. File an issue!"
- );
- }
- this.local = other.local;
- this.#out = other.#out.map((item) => {
- if (item instanceof Renderer) {
- item.subsume(item);
- }
- return item;
- });
- this.promise = other.promise;
- this.type = other.type;
- }
- get length() {
- return this.#out.length;
- }
- /**
- * Creates the hydration comment that marks the start of a failed boundary.
- * The error is JSON-serialized and embedded inside an HTML comment for the client
- * to parse during hydration. The JSON is escaped to prevent `-->` or ``;
- }
- /**
- * Only available on the server and when compiling with the `server` option.
- * Takes a component and returns an object with `body` and `head` properties on it, which you can use to populate the HTML when server-rendering your app.
- * @template {Record} Props
- * @param {Component} component
- * @param {{ props?: Omit; context?: Map; idPrefix?: string; csp?: Csp }} [options]
- * @returns {RenderOutput}
- */
- static render(component, options = {}) {
- let sync;
- const result = (
- /** @type {RenderOutput} */
- {}
- );
- Object.defineProperties(result, {
- html: {
- get: () => {
- return (sync ??= Renderer.#render(component, options)).body;
- }
- },
- head: {
- get: () => {
- return (sync ??= Renderer.#render(component, options)).head;
- }
- },
- body: {
- get: () => {
- return (sync ??= Renderer.#render(component, options)).body;
- }
- },
- hashes: {
- value: {
- script: ""
- }
- },
- then: {
- value: (
- /**
- * this is not type-safe, but honestly it's the best I can do right now, and it's a straightforward function.
- *
- * @template TResult1
- * @template [TResult2=never]
- * @param { (value: SyncRenderOutput) => TResult1 } onfulfilled
- * @param { (reason: unknown) => TResult2 } onrejected
- */
- (onfulfilled, onrejected) => {
- {
- const result2 = sync ??= Renderer.#render(component, options);
- const user_result = onfulfilled({
- head: result2.head,
- body: result2.body,
- html: result2.body,
- hashes: { script: [] }
- });
- return Promise.resolve(user_result);
- }
- }
- )
- }
- });
- return result;
- }
- /**
- * Collect all of the `onDestroy` callbacks registered during rendering. In an async context, this is only safe to call
- * after awaiting `collect_async`.
- *
- * Child renderers are "porous" and don't affect execution order, but component body renderers
- * create ordering boundaries. Within a renderer, callbacks run in order until hitting a component boundary.
- * @returns {Iterable<() => void>}
- */
- *#collect_on_destroy() {
- for (const component of this.#traverse_components()) {
- yield* component.#collect_ondestroy();
- }
- }
- /**
- * Performs a depth-first search of renderers, yielding the deepest components first, then additional components as we backtrack up the tree.
- * @returns {Iterable}
- */
- *#traverse_components() {
- for (const child of this.#out) {
- if (typeof child !== "string") {
- yield* child.#traverse_components();
- }
- }
- if (this.#is_component_body) {
- yield this;
- }
- }
- /**
- * @returns {Iterable<() => void>}
- */
- *#collect_ondestroy() {
- if (this.#on_destroy) {
- for (const fn of this.#on_destroy) {
- yield fn;
- }
- }
- for (const child of this.#out) {
- if (child instanceof Renderer && !child.#is_component_body) {
- yield* child.#collect_ondestroy();
- }
- }
- }
- /**
- * Render a component. Throws if any of the children are performing asynchronous work.
- *
- * @template {Record} Props
- * @param {Component} component
- * @param {{ props?: Omit; context?: Map; idPrefix?: string }} options
- * @returns {AccumulatedContent}
- */
- static #render(component, options) {
- var previous_context = ssr_context;
- try {
- const renderer = Renderer.#open_render("sync", component, options);
- const content = renderer.#collect_content();
- return Renderer.#close_render(content, renderer);
- } finally {
- abort();
- set_ssr_context(previous_context);
- }
- }
- /**
- * Render a component.
- *
- * @template {Record} Props
- * @param {Component} component
- * @param {{ props?: Omit; context?: Map; idPrefix?: string; csp?: Csp }} options
- * @returns {Promise}
- */
- static async #render_async(component, options) {
- const previous_context = ssr_context;
- try {
- const renderer = Renderer.#open_render("async", component, options);
- const content = await renderer.#collect_content_async();
- const hydratables = await renderer.#collect_hydratables();
- if (hydratables !== null) {
- content.head = hydratables + content.head;
- }
- return Renderer.#close_render(content, renderer);
- } finally {
- set_ssr_context(previous_context);
- abort();
- }
- }
- /**
- * Collect all of the code from the `out` array and return it as a string, or a promise resolving to a string.
- * @param {AccumulatedContent} content
- * @returns {AccumulatedContent}
- */
- #collect_content(content = { head: "", body: "" }) {
- for (const item of this.#out) {
- if (typeof item === "string") {
- content[this.type] += item;
- } else if (item instanceof Renderer) {
- item.#collect_content(content);
- }
- }
- return content;
- }
- /**
- * Collect all of the code from the `out` array and return it as a string.
- * @param {AccumulatedContent} content
- * @returns {Promise}
- */
- async #collect_content_async(content = { head: "", body: "" }) {
- await this.promise;
- for (const item of this.#out) {
- if (typeof item === "string") {
- content[this.type] += item;
- } else if (item instanceof Renderer) {
- if (item.#boundary) {
- const boundary_content = { head: "", body: "" };
- try {
- await item.#collect_content_async(boundary_content);
- content.head += boundary_content.head;
- content.body += boundary_content.body;
- } catch (error) {
- const { context, failed, transformError } = item.#boundary;
- set_ssr_context(context);
- let transformed = await transformError(error);
- const failed_renderer = new Renderer(item.global, item);
- failed_renderer.type = item.type;
- failed_renderer.#out.push(Renderer.#serialize_failed_boundary(transformed));
- failed(failed_renderer, transformed, noop);
- failed_renderer.#out.push(BLOCK_CLOSE);
- await failed_renderer.#collect_content_async(content);
- }
- } else {
- await item.#collect_content_async(content);
- }
- }
- }
- return content;
- }
- async #collect_hydratables() {
- const ctx = get_render_context().hydratable;
- for (const [_, key] of ctx.unresolved_promises) {
- unresolved_hydratable(key, ctx.lookup.get(key)?.stack ?? "");
- }
- for (const comparison of ctx.comparisons) {
- await comparison;
- }
- return await this.#hydratable_block(ctx);
- }
- /**
- * @template {Record} Props
- * @param {'sync' | 'async'} mode
- * @param {import('svelte').Component} component
- * @param {{ props?: Omit; context?: Map; idPrefix?: string; csp?: Csp; transformError?: (error: unknown) => unknown }} options
- * @returns {Renderer}
- */
- static #open_render(mode, component, options) {
- var previous_context = ssr_context;
- try {
- const renderer = new Renderer(
- new SSRState(
- mode,
- options.idPrefix ? options.idPrefix + "-" : "",
- options.csp,
- options.transformError
- )
- );
- const context = { p: null, c: options.context ?? null, r: renderer };
- set_ssr_context(context);
- renderer.push(BLOCK_OPEN);
- component(renderer, options.props ?? {});
- renderer.push(BLOCK_CLOSE);
- return renderer;
- } finally {
- set_ssr_context(previous_context);
- }
- }
- /**
- * @param {AccumulatedContent} content
- * @param {Renderer} renderer
- * @returns {AccumulatedContent & { hashes: { script: Sha256Source[] } }}
- */
- static #close_render(content, renderer) {
- for (const cleanup of renderer.#collect_on_destroy()) {
- cleanup();
- }
- let head = content.head + renderer.global.get_title();
- let body = content.body;
- for (const { hash, code } of renderer.global.css) {
- head += ``;
- }
- return {
- head,
- body,
- hashes: {
- script: renderer.global.csp.script_hashes
- }
- };
- }
- /**
- * @param {HydratableContext} ctx
- */
- async #hydratable_block(ctx) {
- if (ctx.lookup.size === 0) {
- return null;
- }
- let entries = [];
- let has_promises = false;
- for (const [k, v] of ctx.lookup) {
- if (v.promises) {
- has_promises = true;
- for (const p of v.promises) await p;
- }
- entries.push(`[${devalue.uneval(k)},${v.serialized}]`);
- }
- let prelude = `const h = (window.__svelte ??= {}).h ??= new Map();`;
- if (has_promises) {
- prelude = `const r = (v) => Promise.resolve(v);
- ${prelude}`;
- }
- const body = `
- {
- ${prelude}
-
- for (const [k, v] of [
- ${entries.join(",\n ")}
- ]) {
- h.set(k, v);
- }
- }
- `;
- let csp_attr = "";
- if (this.global.csp.nonce) {
- csp_attr = ` nonce="${this.global.csp.nonce}"`;
- } else if (this.global.csp.hash) {
- const hash = await sha256(body);
- this.global.csp.script_hashes.push(`sha256-${hash}`);
- }
- return `
-