diff --git a/.gitignore b/.gitignore
index 35642a2..5dec41a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,10 +7,13 @@ venv/
ENV/
env/
.env
+node_modules/
# Distribution / packaging
dist/
build/
+!static/build/
+!static/build/**
*.egg-info/
# Unit test / coverage reports
@@ -35,4 +38,4 @@ ehthumbs.db
Desktop.ini
# Agent Skills
-.agents/
\ No newline at end of file
+.agents/
diff --git a/README.md b/README.md
index 8f4ad57..6dfadb5 100644
--- a/README.md
+++ b/README.md
@@ -1,71 +1,172 @@
-# Difference Equation Analyzer 專案維護指引
+# Difference Equation Analyzer
-本文件提供 `diff-eq-analyzer` 專案的日常維護、環境更新與故障排除指南。
+差分方程式與數位濾波器分析工具。後端使用 FastAPI,前端使用 Vue 3 + Vite 建置後由 FastAPI 以靜態檔案服務。
-## 1. 系統服務管理 (Systemd)
+## 專案結構
-本專案的後端 API (FastAPI) 以 systemd 服務 (`dea.service`) 的形式在背景執行。
+- `dea_api.py`:FastAPI 後端、API 端點、LAN 存取限制、安全標頭。
+- `src/`:Vue 前端原始碼。
+- `static/index.html`:正式 UI 入口,載入建置後的前端資源。
+- `static/build/app.js`、`static/build/app.css`:前端建置產物,正式服務會載入這兩個檔案。
+- `static/style.css`:既有自訂 CSS,由 `src/style.css` 引入。
+- `tests/`:後端回歸測試。
+- `dea.service`:systemd 服務設定範本。
+- `dea_legacy.py`:舊 Streamlit 版本,僅供參考。
-### 常用指令
+## 使用網址
-* **查看服務狀態:**
- ```bash
- sudo systemctl status dea.service
- ```
-* **啟動服務:**
- ```bash
- sudo systemctl start dea.service
- ```
-* **停止服務:**
- ```bash
- sudo systemctl stop dea.service
- ```
-* **重新啟動服務(更新程式碼後必備):**
- ```bash
- sudo systemctl restart dea.service
- ```
-* **查看即時日誌 (Logs):**
- ```bash
- sudo journalctl -u dea.service -f
- ```
+本機:
-## 2. 虛擬環境與套件管理
+```bash
+http://localhost:8000/ui/
+```
-專案使用 Python 虛擬環境 (`.venv`) 隔離依賴套件。若您需要更新套件或是因移動專案路徑導致環境異常,請依下列步驟重建虛擬環境:
+區網其他裝置:
-1. **進入專案目錄:**
- ```bash
- cd /home/wisetop/diff-eq-analyzer
- ```
-2. **刪除舊的虛擬環境並重建:**
- ```bash
- rm -rf .venv
- python3 -m venv .venv
- ```
-3. **安裝必要套件:**
- ```bash
- .venv/bin/pip install -r requirements.txt
- ```
-4. **重新啟動系統服務以套用新環境:**
- ```bash
- sudo systemctl restart dea.service
- ```
+```bash
+http://192.168.2.58:8000/ui/
+```
-## 3. 常見問題排除
+根路徑 `/` 會自動導向 `/ui/`。
-### 3.1 服務無法啟動 (status=203/EXEC)
-* **原因:** 通常是因為 Python 虛擬環境的路徑錯誤,或是啟動腳本 (`uvicorn`) 內部寫死的絕對路徑與實際位置不符(例如專案資料夾被重新命名)。
-* **解法:** 參考上方的「虛擬環境與套件管理」,將 `.venv` 刪除並重新安裝,然後重啟 `dea.service` 即可。
+## 後端環境
-### 3.2 網頁無法連線
-* **檢查後端狀態:** 執行 `sudo systemctl status dea.service` 確認 FastAPI 伺服器是否正常運作中(應顯示 `Active: active (running)`)。
-* **檢查防火牆設定:** 預設使用的 Port 為 `8000`,請確認防火牆或安全群組允許 `8000` 埠的入站連線。
-* **檢查綁定 IP:** 服務預設綁定於 `0.0.0.0`,代表接受所有網路介面的連線。如需限制,請修改 `dea.service` 內的 `ExecStart` 參數。
+建立或重建 Python 虛擬環境:
-## 4. 變更專案設定檔
-若您修改了 `dea.service`(位於專案目錄內或 `/etc/systemd/system/dea.service`),請務必執行下列指令讓系統重新載入設定:
+```bash
+cd /home/wisetop/diff-eq-analyzer
+python3 -m venv .venv
+.venv/bin/pip install -r requirements.txt
+```
+
+本機開發啟動:
+
+```bash
+.venv/bin/uvicorn dea_api:app --host 127.0.0.1 --port 8000
+```
+
+## 前端建置
+
+前端依賴由 `package.json` / `package-lock.json` 管理。首次安裝:
+
+```bash
+npm install
+```
+
+重新建置正式前端:
+
+```bash
+npm run build
+```
+
+建置後會更新:
+
+```text
+static/build/app.js
+static/build/app.css
+```
+
+注意:正式頁面不再載入 Vue CDN 或 Tailwind CDN;Vue 會被打包到 `static/build/app.js`。目前仍使用 Plotly CDN。
+
+## systemd 服務
+
+查看狀態:
+
+```bash
+sudo systemctl status dea.service
+```
+
+啟動、停止、重啟:
+
+```bash
+sudo systemctl start dea.service
+sudo systemctl stop dea.service
+sudo systemctl restart dea.service
+```
+
+查看即時日誌:
+
+```bash
+sudo journalctl -u dea.service -f
+```
+
+修改 `dea.service` 或 `/etc/systemd/system/dea.service` 後:
```bash
sudo systemctl daemon-reload
sudo systemctl restart dea.service
```
+
+## 測試與檢查
+
+Python 語法檢查:
+
+```bash
+.venv/bin/python -m py_compile dea_api.py tests/test_dea_api.py
+```
+
+後端測試:
+
+```bash
+.venv/bin/python -m unittest discover -s tests
+```
+
+前端建置檢查:
+
+```bash
+npm run build
+```
+
+## 安全與效能設定
+
+後端目前包含:
+
+- 僅允許 private / loopback IP 存取。
+- CSP、安全回應標頭、`X-Frame-Options: DENY`、`nosniff`。
+- CSV 上傳大小限制:10 MB。
+- 圖表用 CSV 回傳最多 5000 點,下載 CSV 仍保留完整資料。
+- 係數數量上限:64。
+- 濾波器頻率、係數有限值、`a[0]` 等輸入驗證。
+
+目前 CSP 的 `script-src` 僅允許:
+
+```text
+'self' https://cdn.plot.ly
+```
+
+因此不再需要 `'unsafe-eval'`。
+
+## 常見問題
+
+### 網頁空白
+
+1. 強制刷新瀏覽器:`Ctrl+F5`。
+2. 確認服務狀態:
+
+```bash
+sudo systemctl status dea.service
+```
+
+3. 確認靜態檔案存在:
+
+```bash
+ls static/build/app.js static/build/app.css
+```
+
+4. 若剛改前端,請重新建置並重啟:
+
+```bash
+npm run build
+sudo systemctl restart dea.service
+```
+
+### 服務無法啟動,出現 status=203/EXEC
+
+通常是 `.venv` 路徑或 `uvicorn` 腳本路徑失效。重建虛擬環境後再重啟:
+
+```bash
+rm -rf .venv
+python3 -m venv .venv
+.venv/bin/pip install -r requirements.txt
+sudo systemctl restart dea.service
+```
diff --git a/dea_api.py b/dea_api.py
index 8806cfc..0abdbca 100755
--- a/dea_api.py
+++ b/dea_api.py
@@ -3,14 +3,42 @@ import pandas as pd
from scipy import signal
from fastapi import FastAPI, File, UploadFile, Form, HTTPException, Request
from fastapi.staticfiles import StaticFiles
-from pydantic import BaseModel
-from typing import List, Optional
+from pydantic import BaseModel, Field
+from typing import List
import io
from fastapi.responses import StreamingResponse, RedirectResponse, JSONResponse
import ipaddress
app = FastAPI(title="Difference Equation Analyzer API")
+MAX_COEFFICIENTS = 64
+MAX_CSV_BYTES = 10 * 1024 * 1024
+MAX_PLOT_POINTS = 5000
+BODE_POINTS = 500
+BODE_MAX_MULTIPLIER = 3.162
+NYQUIST_MARGIN = 0.999999
+SECURITY_HEADERS = {
+ "Content-Security-Policy": (
+ "default-src 'self'; "
+ "script-src 'self' https://cdn.plot.ly; "
+ "style-src 'self' 'unsafe-inline'; "
+ "img-src 'self' data:; "
+ "connect-src 'self'; "
+ "font-src 'self' data:; "
+ "object-src 'none'; "
+ "base-uri 'self'; "
+ "frame-ancestors 'none'"
+ ),
+ "Referrer-Policy": "no-referrer",
+ "X-Content-Type-Options": "nosniff",
+ "X-Frame-Options": "DENY",
+}
+
+def add_security_headers(response):
+ for key, value in SECURITY_HEADERS.items():
+ response.headers[key] = value
+ return response
+
@app.middleware("http")
async def restrict_to_lan(request: Request, call_next):
client_ip = request.client.host
@@ -18,10 +46,11 @@ async def restrict_to_lan(request: Request, call_next):
try:
ip_obj = ipaddress.ip_address(client_ip)
if not (ip_obj.is_private or ip_obj.is_loopback):
- return JSONResponse(status_code=403, content={"detail": "Access Denied: Only LAN connections are allowed."})
+ return add_security_headers(JSONResponse(status_code=403, content={"detail": "Access Denied: Only LAN connections are allowed."}))
except ValueError:
pass
- return await call_next(request)
+ response = await call_next(request)
+ return add_security_headers(response)
# 掛載靜態網頁檔案,將預設首頁導向到 /ui/
app.mount("/ui", StaticFiles(directory="static", html=True), name="static")
@@ -32,57 +61,137 @@ def redirect_to_ui():
class DesignParams(BaseModel):
filter_type: str
- fs: float
- lp_fc: float = 1000.0
- lp_order: int = 1
- hp_fc: float = 1000.0
- hp_order: int = 1
- bp_f_low: float = 500.0
- bp_f_high: float = 2000.0
- bp_order: int = 1
- notch_f0: float = 120.0
- notch_q: float = 1.0
- opoz_fz: float = 15000.0
- opoz_fp: float = 10.0
- tptz_fz1: float = 200.0
- tptz_fz2: float = 25000.0
- tptz_fp1: float = 10.0
- tptz_fp2: float = 5000.0
+ fs: float = Field(gt=0)
+ lp_fc: float = Field(default=1000.0, gt=0)
+ lp_order: int = Field(default=1, ge=1, le=8)
+ hp_fc: float = Field(default=1000.0, gt=0)
+ hp_order: int = Field(default=1, ge=1, le=8)
+ bp_f_low: float = Field(default=500.0, gt=0)
+ bp_f_high: float = Field(default=2000.0, gt=0)
+ bp_order: int = Field(default=1, ge=1, le=8)
+ notch_f0: float = Field(default=120.0, gt=0)
+ notch_q: float = Field(default=1.0, gt=0)
+ opoz_fz: float = Field(default=15000.0, gt=0)
+ opoz_fp: float = Field(default=10.0, gt=0)
+ tptz_fz1: float = Field(default=200.0, gt=0)
+ tptz_fz2: float = Field(default=25000.0, gt=0)
+ tptz_fp1: float = Field(default=10.0, gt=0)
+ tptz_fp2: float = Field(default=5000.0, gt=0)
pid_kp: float = 0.003
pid_ki: float = 10.0
pid_kd: float = 0.000016
- sogi_f0: float = 60.0
- sogi_k: float = 1.414
+ sogi_f0: float = Field(default=60.0, gt=0)
+ sogi_k: float = Field(default=1.414, gt=0)
class BodeParams(BaseModel):
- b: List[float]
- a: List[float]
- fs: float
+ b: List[float] = Field(min_length=1, max_length=MAX_COEFFICIENTS)
+ a: List[float] = Field(min_length=1, max_length=MAX_COEFFICIENTS)
+ fs: float = Field(gt=0)
+
+def require_finite(value, name):
+ if not np.isfinite(value):
+ raise HTTPException(status_code=400, detail=f"{name} 必須是有限數值")
+ return float(value)
+
+def validate_frequency(name, value, fs, *, below_nyquist=True):
+ value = require_finite(value, name)
+ if value <= 0:
+ raise HTTPException(status_code=400, detail=f"{name} 必須大於 0")
+ if below_nyquist and value >= (fs / 2) * NYQUIST_MARGIN:
+ raise HTTPException(status_code=400, detail=f"{name} 必須小於 Nyquist 頻率 ({fs / 2:g} Hz)")
+ return value
+
+def parse_coefficients(raw, name):
+ try:
+ values = [float(x.strip()) for x in raw.replace(',', ' ').split() if x.strip()]
+ except ValueError:
+ raise HTTPException(status_code=400, detail=f"{name} 係數格式錯誤")
+ return validate_coefficients(values, name)
+
+def validate_coefficients(values, name):
+ if len(values) == 0:
+ raise HTTPException(status_code=400, detail=f"{name} 係數不可為空")
+ if len(values) > MAX_COEFFICIENTS:
+ raise HTTPException(status_code=400, detail=f"{name} 係數最多 {MAX_COEFFICIENTS} 個")
+ coeffs = np.asarray(values, dtype=float)
+ if not np.all(np.isfinite(coeffs)):
+ raise HTTPException(status_code=400, detail=f"{name} 係數必須都是有限數值")
+ if name == "a" and np.isclose(coeffs[0], 0.0):
+ raise HTTPException(status_code=400, detail="a[0] 不可為 0")
+ return coeffs
+
+def normalize_coefficients(b_values, a_values):
+ b_arr = validate_coefficients(b_values, "b")
+ a_arr = validate_coefficients(a_values, "a")
+ if not np.isclose(a_arr[0], 1.0):
+ b_arr = b_arr / a_arr[0]
+ a_arr = a_arr / a_arr[0]
+ return b_arr, a_arr
+
+def downsample_for_plot(index, original, filtered):
+ total = len(index)
+ if total <= MAX_PLOT_POINTS:
+ return index, original, filtered, 1
+ step = int(np.ceil(total / MAX_PLOT_POINTS))
+ return index[::step], original[::step], filtered[::step], step
+
+async def read_csv_upload(file):
+ contents = await file.read(MAX_CSV_BYTES + 1)
+ if len(contents) > MAX_CSV_BYTES:
+ raise HTTPException(status_code=413, detail=f"CSV 檔案不可超過 {MAX_CSV_BYTES // (1024 * 1024)}MB")
+ try:
+ df = pd.read_csv(io.BytesIO(contents))
+ except Exception as e:
+ raise HTTPException(status_code=400, detail=f"CSV 讀取失敗: {str(e)}")
+ if df.empty:
+ raise HTTPException(status_code=400, detail="CSV 不可為空")
+ return df
+
+def filtered_csv_data(df, b_vals, a_vals, col_idx):
+ if col_idx < 0 or len(df.columns) <= col_idx:
+ raise HTTPException(status_code=400, detail="欄位索引超出範圍")
+ col_to_filter = df.columns[col_idx]
+ x_signal = pd.to_numeric(df[col_to_filter], errors="coerce")
+ if x_signal.isna().any():
+ raise HTTPException(status_code=400, detail=f"欄位 {col_to_filter} 含有非數值資料")
+ y_signal = signal.lfilter(b_vals, a_vals, x_signal.to_numpy(dtype=float))
+ return col_to_filter, x_signal.to_numpy(dtype=float), y_signal
@app.post("/api/design")
def design_filter(params: DesignParams):
- fs_val = params.fs
+ fs_val = require_finite(params.fs, "fs")
f_type = params.filter_type
- b_new, a_new = [], []
try:
if f_type == "Lowpass (低通)":
+ validate_frequency("低通截止頻率", params.lp_fc, fs_val)
b_new, a_new = signal.butter(params.lp_order, params.lp_fc, btype='low', fs=fs_val)
elif f_type == "Highpass (高通)":
+ validate_frequency("高通截止頻率", params.hp_fc, fs_val)
b_new, a_new = signal.butter(params.hp_order, params.hp_fc, btype='high', fs=fs_val)
elif f_type == "Bandpass (帶通)":
f_low, f_high = params.bp_f_low, params.bp_f_high
- if f_low >= f_high: f_low = f_high * 0.99
+ validate_frequency("帶通下截止頻率", f_low, fs_val)
+ validate_frequency("帶通上截止頻率", f_high, fs_val)
+ if f_low >= f_high:
+ raise HTTPException(status_code=400, detail="帶通下截止頻率必須小於上截止頻率")
b_new, a_new = signal.butter(params.bp_order, [f_low, f_high], btype='bandpass', fs=fs_val)
elif f_type == "Notch (陷波器)":
+ validate_frequency("陷波中心頻率", params.notch_f0, fs_val)
b_new, a_new = signal.iirnotch(params.notch_f0, params.notch_q, fs=fs_val)
elif f_type == "1P1Z (一極一零)":
+ validate_frequency("1P1Z 零點頻率", params.opoz_fz, fs_val, below_nyquist=False)
+ validate_frequency("1P1Z 極點頻率", params.opoz_fp, fs_val, below_nyquist=False)
b_s = [1.0, 2 * np.pi * params.opoz_fz]
a_s = [1.0, 2 * np.pi * params.opoz_fp]
b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val)
dc_gain = np.sum(b_new) / np.sum(a_new)
b_new = b_new / dc_gain
elif f_type == "2P2Z (二極二零)":
+ validate_frequency("2P2Z 極點頻率 1", params.tptz_fp1, fs_val, below_nyquist=False)
+ validate_frequency("2P2Z 極點頻率 2", params.tptz_fp2, fs_val, below_nyquist=False)
+ validate_frequency("2P2Z 零點頻率 1", params.tptz_fz1, fs_val, below_nyquist=False)
+ validate_frequency("2P2Z 零點頻率 2", params.tptz_fz2, fs_val, below_nyquist=False)
w_p1, w_p2 = 2 * np.pi * params.tptz_fp1, 2 * np.pi * params.tptz_fp2
w_z1, w_z2 = 2 * np.pi * params.tptz_fz1, 2 * np.pi * params.tptz_fz2
b_s = [1.0, w_z1 + w_z2, w_z1 * w_z2]
@@ -99,36 +208,40 @@ def design_filter(params: DesignParams):
b_new = [b0, b1, b2]
a_new = [1.0, -1.0, 0.0]
elif f_type == "SOGI-Alpha (帶通)":
+ validate_frequency("SOGI 中心頻率", params.sogi_f0, fs_val)
w0 = 2 * np.pi * params.sogi_f0
b_s = [params.sogi_k * w0, 0.0]
a_s = [1.0, params.sogi_k * w0, w0**2]
b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val)
elif f_type == "SOGI-Beta (低通)":
+ validate_frequency("SOGI 中心頻率", params.sogi_f0, fs_val)
w0 = 2 * np.pi * params.sogi_f0
b_s = [params.sogi_k * (w0**2)]
a_s = [1.0, params.sogi_k * w0, w0**2]
b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val)
-
- # 強制進行 a[0] 正規化
- a_arr = np.array(a_new)
- b_arr = np.array(b_new)
- if a_arr[0] != 0 and a_arr[0] != 1.0:
- b_arr = b_arr / a_arr[0]
- a_arr = a_arr / a_arr[0]
+ else:
+ raise HTTPException(status_code=400, detail="未知的濾波器類型")
+
+ b_arr, a_arr = normalize_coefficients(b_new, a_new)
return {"b": b_arr.tolist(), "a": a_arr.tolist()}
+ except HTTPException:
+ raise
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
@app.post("/api/bode")
def calculate_bode(params: BodeParams):
try:
+ fs_val = require_finite(params.fs, "fs")
+ b_vals = validate_coefficients(params.b, "b")
+ a_vals = validate_coefficients(params.a, "a")
f_min = params.fs / 50000.0
- f_max = params.fs # 數位濾波器通常顯示至 fs 或 Nyquist (fs/2) 即可
- f_eval = np.logspace(np.log10(f_min), np.log10(f_max), 500)
+ f_max = params.fs * BODE_MAX_MULTIPLIER # 修復為 Legacy 版本的顯示範圍上限 (原為 params.fs)
+ f_eval = np.logspace(np.log10(f_min), np.log10(f_max), BODE_POINTS)
# WorN determines frequencies to evaluate at
- w, h = signal.freqz(params.b, params.a, worN=f_eval, fs=params.fs)
+ w, h = signal.freqz(b_vals, a_vals, worN=f_eval, fs=fs_val)
mag = 20 * np.log10(np.abs(h) + 1e-12)
phase = np.angle(h, deg=True)
@@ -138,6 +251,8 @@ def calculate_bode(params: BodeParams):
"mag": mag.tolist(),
"phase": phase.tolist()
}
+ except HTTPException:
+ raise
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
@@ -149,30 +264,23 @@ async def filter_csv(
col_idx: int = Form(0)
):
try:
- # 支援逗號、空格等多種分隔符號
- b_vals = [float(x.strip()) for x in b.replace(',', ' ').split() if x.strip()]
- a_vals = [float(x.strip()) for x in a.replace(',', ' ').split() if x.strip()]
-
- contents = await file.read()
- df = pd.read_csv(io.BytesIO(contents))
-
- if len(df.columns) <= col_idx:
- raise HTTPException(status_code=400, detail="欄位索引超出範圍")
-
- col_to_filter = df.columns[col_idx]
- x_signal = df[col_to_filter].values
-
- # 套用濾波
- y_signal = signal.lfilter(b_vals, a_vals, x_signal)
-
- # 準備資料回傳前端進行繪圖 (為了防止過大,可以在此決定是否 downsample,但目前保留原貌)
- # 前端收到 JSON 後可自行繪製並產生 CSV
+ b_vals = parse_coefficients(b, "b")
+ a_vals = parse_coefficients(a, "a")
+ df = await read_csv_upload(file)
+ col_to_filter, x_signal, y_signal = filtered_csv_data(df, b_vals, a_vals, col_idx)
+ index, original, filtered, step = downsample_for_plot(df.index.to_numpy(), x_signal, y_signal)
+
return {
- "index": df.index.tolist(),
- "original": x_signal.tolist(),
- "filtered": y_signal.tolist(),
- "col_name": col_to_filter
+ "index": index.tolist(),
+ "original": original.tolist(),
+ "filtered": filtered.tolist(),
+ "col_name": col_to_filter,
+ "total_points": int(len(df.index)),
+ "plot_points": int(len(index)),
+ "downsample_step": int(step)
}
+ except HTTPException:
+ raise
except Exception as e:
raise HTTPException(status_code=400, detail=f"CSV處理失敗: {str(e)}")
@@ -185,16 +293,10 @@ async def filter_csv_download(
):
# 此端點專為產生包含輸出結果的 CSV 檔供下載
try:
- # 支援逗號、空格等多種分隔符號
- b_vals = [float(x.strip()) for x in b.replace(',', ' ').split() if x.strip()]
- a_vals = [float(x.strip()) for x in a.replace(',', ' ').split() if x.strip()]
-
- contents = await file.read()
- df = pd.read_csv(io.BytesIO(contents))
-
- col_to_filter = df.columns[col_idx]
- x_signal = df[col_to_filter].values
- y_signal = signal.lfilter(b_vals, a_vals, x_signal)
+ b_vals = parse_coefficients(b, "b")
+ a_vals = parse_coefficients(a, "a")
+ df = await read_csv_upload(file)
+ col_to_filter, x_signal, y_signal = filtered_csv_data(df, b_vals, a_vals, col_idx)
output_col_name = f"{col_to_filter}_filtered"
df[output_col_name] = y_signal
@@ -207,5 +309,7 @@ async def filter_csv_download(
media_type="text/csv",
headers={"Content-Disposition": "attachment; filename=filtered_output.csv"}
)
+ except HTTPException:
+ raise
except Exception as e:
raise HTTPException(status_code=400, detail=f"CSV處理失敗: {str(e)}")
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..59dfadc
--- /dev/null
+++ b/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+ 差分方程式分析 (Difference Equation Analyzer)
+
+
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..5b567d9
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1932 @@
+{
+ "name": "diff-eq-analyzer",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "@vitejs/plugin-vue": "^6.0.6",
+ "autoprefixer": "^10.5.0",
+ "postcss": "^8.5.14",
+ "tailwindcss": "^3.4.17",
+ "vite": "^8.0.11",
+ "vue": "^3.5.34"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz",
+ "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
+ "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.1",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
+ "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.128.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz",
+ "integrity": "sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.18.tgz",
+ "integrity": "sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.18.tgz",
+ "integrity": "sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.18.tgz",
+ "integrity": "sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.18.tgz",
+ "integrity": "sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.18.tgz",
+ "integrity": "sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.18.tgz",
+ "integrity": "sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.18.tgz",
+ "integrity": "sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.18.tgz",
+ "integrity": "sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.18.tgz",
+ "integrity": "sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==",
+ "cpu": [
+ "s390x"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.18.tgz",
+ "integrity": "sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.18.tgz",
+ "integrity": "sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.18.tgz",
+ "integrity": "sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.18.tgz",
+ "integrity": "sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==",
+ "cpu": [
+ "wasm32"
+ ],
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.10.0",
+ "@emnapi/runtime": "1.10.0",
+ "@napi-rs/wasm-runtime": "^1.1.4"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.18.tgz",
+ "integrity": "sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.18.tgz",
+ "integrity": "sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.13.tgz",
+ "integrity": "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA=="
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
+ "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.6.tgz",
+ "integrity": "sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==",
+ "dependencies": {
+ "@rolldown/pluginutils": "1.0.0-rc.13"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz",
+ "integrity": "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==",
+ "dependencies": {
+ "@babel/parser": "^7.29.3",
+ "@vue/shared": "3.5.34",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz",
+ "integrity": "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.34",
+ "@vue/shared": "3.5.34"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz",
+ "integrity": "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==",
+ "dependencies": {
+ "@babel/parser": "^7.29.3",
+ "@vue/compiler-core": "3.5.34",
+ "@vue/compiler-dom": "3.5.34",
+ "@vue/compiler-ssr": "3.5.34",
+ "@vue/shared": "3.5.34",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.14",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz",
+ "integrity": "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.34",
+ "@vue/shared": "3.5.34"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz",
+ "integrity": "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==",
+ "dependencies": {
+ "@vue/shared": "3.5.34"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz",
+ "integrity": "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.34",
+ "@vue/shared": "3.5.34"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz",
+ "integrity": "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.34",
+ "@vue/runtime-core": "3.5.34",
+ "@vue/shared": "3.5.34",
+ "csstype": "^3.2.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz",
+ "integrity": "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.34",
+ "@vue/shared": "3.5.34"
+ },
+ "peerDependencies": {
+ "vue": "3.5.34"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz",
+ "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA=="
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz",
+ "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.28.2",
+ "caniuse-lite": "^1.0.30001787",
+ "fraction.js": "^5.3.4",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.29",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz",
+ "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.12",
+ "caniuse-lite": "^1.0.30001782",
+ "electron-to-chromium": "^1.5.328",
+ "node-releases": "^2.0.36",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001792",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz",
+ "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.353",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.353.tgz",
+ "integrity": "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w=="
+ },
+ "node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
+ "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.12",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
+ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.38",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz",
+ "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
+ "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
+ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/readdirp/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.18.tgz",
+ "integrity": "sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==",
+ "dependencies": {
+ "@oxc-project/types": "=0.128.0",
+ "@rolldown/pluginutils": "1.0.0-rc.18"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.0-rc.18",
+ "@rolldown/binding-darwin-arm64": "1.0.0-rc.18",
+ "@rolldown/binding-darwin-x64": "1.0.0-rc.18",
+ "@rolldown/binding-freebsd-x64": "1.0.0-rc.18",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.18",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.18",
+ "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.18",
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.18",
+ "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.18",
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.18",
+ "@rolldown/binding-linux-x64-musl": "1.0.0-rc.18",
+ "@rolldown/binding-openharmony-arm64": "1.0.0-rc.18",
+ "@rolldown/binding-wasm32-wasi": "1.0.0-rc.18",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.18",
+ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.18"
+ }
+ },
+ "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.18",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz",
+ "integrity": "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw=="
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.1",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
+ "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "tinyglobby": "^0.2.11",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.6.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.6",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.2",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "optional": true
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/vite": {
+ "version": "8.0.11",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.11.tgz",
+ "integrity": "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==",
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.4",
+ "postcss": "^8.5.14",
+ "rolldown": "1.0.0-rc.18",
+ "tinyglobby": "^0.2.16"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.1.18",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz",
+ "integrity": "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.34",
+ "@vue/compiler-sfc": "3.5.34",
+ "@vue/runtime-dom": "3.5.34",
+ "@vue/server-renderer": "3.5.34",
+ "@vue/shared": "3.5.34"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz",
+ "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..67c3620
--- /dev/null
+++ b/package.json
@@ -0,0 +1,15 @@
+{
+ "type": "module",
+ "scripts": {
+ "build": "vite build",
+ "dev": "vite --host 0.0.0.0"
+ },
+ "dependencies": {
+ "@vitejs/plugin-vue": "^6.0.6",
+ "autoprefixer": "^10.5.0",
+ "postcss": "^8.5.14",
+ "tailwindcss": "^3.4.17",
+ "vite": "^8.0.11",
+ "vue": "^3.5.34"
+ }
+}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..2e7af2b
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/requirements.txt b/requirements.txt
index 8783c78..c50f263 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,7 @@
fastapi>=0.100.0
uvicorn>=0.23.0
python-multipart>=0.0.6
+pydantic>=2.0.0
numpy>=1.24.0
pandas>=2.0.0
scipy>=1.10.0
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..0e1c67e
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,628 @@
+
+
+
+
+
+
![Logo]()
+
+ 差分方程式分析 (Difference Equation Analyzer)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ globalError }}
+
+
+
+
+
+
+
+
+
1. 頻率響應 (Frequency
+ Response)
+
+
+ 重新計算中...
+
+
+
+
+
+
+
+
+
+
2. 時域訊號探討
+
+
+
請上傳包含時域訊號的 CSV 檔案,系統會套用上述設定的差分濾波器。
+
+
+
+
{{
+ csvFile.name }}
+
+
+
+
+ 訊號欄位:
+
+
+
+
+
+
+
+
+
+
+
+ 資料預覽 (前五筆):
+
+
+
+
+ | {{ col
+ }} |
+
+
+
+
+ | {{ val }}
+ |
+
+
+
+
+
+
+
+
波形比較圖
+
+
+
+
+
+
+
請上傳包含時間序列的 CSV 檔案進行測試
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/app.js b/src/app-options.js
similarity index 99%
rename from static/app.js
rename to src/app-options.js
index 881f25a..9d367fd 100644
--- a/static/app.js
+++ b/src/app-options.js
@@ -1,6 +1,4 @@
-const { createApp } = Vue;
-
-createApp({
+export default {
data() {
return {
fs: 100000.0,
@@ -662,4 +660,4 @@ createApp({
} catch (e) { this.globalError = e.message; }
}
}
-}).mount('#app')
+}
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..dfcca6e
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,5 @@
+import { createApp } from 'vue'
+import App from './App.vue'
+import './style.css'
+
+createApp(App).mount('#dea-root')
diff --git a/src/style.css b/src/style.css
new file mode 100644
index 0000000..1c5136c
--- /dev/null
+++ b/src/style.css
@@ -0,0 +1,5 @@
+@import '../static/style.css';
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/static/build/app.css b/static/build/app.css
new file mode 100644
index 0000000..3acd56e
--- /dev/null
+++ b/static/build/app.css
@@ -0,0 +1 @@
+.custom-scrollbar::-webkit-scrollbar{width:6px;height:6px}.custom-scrollbar::-webkit-scrollbar-track{background:0 0}.custom-scrollbar::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.dark .custom-scrollbar::-webkit-scrollbar-thumb{background:#374151}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:#94a3b8}.dark .custom-scrollbar::-webkit-scrollbar-thumb:hover{background:#4b5563}body{font-family:Inter,system-ui,-apple-system,sans-serif;font-size:16px;line-height:1.6}input[type=range]{appearance:none;cursor:pointer;background:#e2e8f0;border-radius:4px;height:8px;transition:background .3s}.dark input[type=range]{background:#374151}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#3b82f6;border:2px solid #fff;border-radius:50%;width:24px;height:24px;transition:background .15s ease-in-out,transform .1s;box-shadow:0 2px 5px #0003}.dark input[type=range]::-webkit-slider-thumb{border:2px solid #1f2937}input[type=range]::-webkit-slider-thumb:hover{background:#2563eb;transform:scale(1.1)}button,select,input[type=number],textarea{min-height:44px}.btn-small{min-height:unset}input[type=number]::-webkit-inner-spin-button{appearance:none;margin:0}input[type=number]::-webkit-outer-spin-button{appearance:none;margin:0}input[type=number]{appearance:textfield}.js-plotly-plot .plotly .modebar-container{width:100%!important;display:block!important;top:-45px!important;left:0!important;right:0!important}.js-plotly-plot .plotly .modebar{padding-right:10px;background:0 0!important;flex-flow:row!important;justify-content:flex-end!important;display:flex!important;position:static!important}.js-plotly-plot .plotly .modebar-group{flex-direction:row!important;display:flex!important}#bodePlot,#timePlot{margin-top:50px}@media (width<=1024px){.js-plotly-plot .plotly .modebar-container{top:-40px!important}}details>summary{-webkit-user-select:none;user-select:none;list-style:none}details>summary::-webkit-details-marker{display:none}details>div{animation:.2s ease-out slideDown;overflow:hidden}@keyframes slideDown{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.right-6{right:1.5rem}.top-4{top:1rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mx-2{margin-left:.5rem;margin-right:.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.block{display:block}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-\[300px\]{height:300px}.h-\[400px\]{height:400px}.h-\[800px\]{height:800px}.h-full{height:100%}.h-screen{height:100vh}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-full{width:100%}.min-w-\[580px\]{min-width:580px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}.animate-ping{animation:1s cubic-bezier(0,0,.2,1) infinite ping}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite pulse}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.appearance-none{appearance:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-slate-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(241 245 249/var(--tw-divide-opacity,1))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-100{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity,1))}.border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity,1))}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity,1))}.border-orange-400{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity,1))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity,1))}.bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity,1))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.bg-slate-50\/50{background-color:#f8fafc80}.bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right, var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right, var(--tw-gradient-stops))}.from-blue-500\/5{--tw-gradient-from:#3b82f60d var(--tw-gradient-from-position);--tw-gradient-to:#3b82f600 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-600{--tw-gradient-from:#2563eb var(--tw-gradient-from-position);--tw-gradient-to:#2563eb00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.to-emerald-600{--tw-gradient-to:#059669 var(--tw-gradient-to-position)}.to-purple-500\/5{--tw-gradient-to:#a855f70d var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.object-contain{-o-object-fit:contain;object-fit:contain}.\!p-0{padding:0!important}.p-0{padding:0}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-3{padding-bottom:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity,1))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity,1))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.text-transparent{color:#0000}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.accent-blue-500{accent-color:#3b82f6}.accent-emerald-500{accent-color:#10b981}.accent-indigo-500{accent-color:#6366f1}.accent-orange-500{accent-color:#f97316}.opacity-50{opacity:.5}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 #0000000d;--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.outline-none{outline-offset:2px;outline:2px solid #0000}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-blue-400\/20{--tw-ring-color:#60a5fa33}.ring-orange-400\/20{--tw-ring-color:#fb923c33}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-300{transition-duration:.3s}.hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity,1))}.hover\:bg-amber-200:hover{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity,1))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.hover\:bg-emerald-500:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.hover\:bg-slate-200:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.hover\:bg-slate-300:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity,1))}.hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.hover\:bg-slate-50\/50:hover{background-color:#f8fafc80}.hover\:bg-slate-600:hover{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity,1))}.hover\:text-red-900:hover{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.hover\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.hover\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.hover\:shadow-blue-500\/20:hover{--tw-shadow-color:#3b82f633;--tw-shadow:var(--tw-shadow-colored)}.hover\:shadow-emerald-500\/20:hover{--tw-shadow-color:#10b98133;--tw-shadow:var(--tw-shadow-colored)}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.dark\:divide-gray-800:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(31 41 55/var(--tw-divide-opacity,1))}.dark\:border-amber-800\/30:is(.dark *){border-color:#92400e4d}.dark\:border-blue-800\/20:is(.dark *){border-color:#1e40af33}.dark\:border-blue-800\/30:is(.dark *){border-color:#1e40af4d}.dark\:border-blue-800\/50:is(.dark *){border-color:#1e40af80}.dark\:border-gray-100:is(.dark *){--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.dark\:border-gray-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}.dark\:border-orange-800\/20:is(.dark *){border-color:#9a341233}.dark\:border-orange-800\/30:is(.dark *){border-color:#9a34124d}.dark\:border-red-700:is(.dark *){--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity,1))}.dark\:bg-\[\#0f0f0f\]:is(.dark *){--tw-bg-opacity:1;background-color:rgb(15 15 15/var(--tw-bg-opacity,1))}.dark\:bg-amber-900\/20:is(.dark *){background-color:#78350f33}.dark\:bg-amber-900\/30:is(.dark *){background-color:#78350f4d}.dark\:bg-blue-400:is(.dark *){--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity,1))}.dark\:bg-blue-900\/20:is(.dark *){background-color:#1e3a8a33}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1e3a8a4d}.dark\:bg-dark:is(.dark *){--tw-bg-opacity:1;background-color:rgb(18 18 18/var(--tw-bg-opacity,1))}.dark\:bg-darker:is(.dark *){--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity,1))}.dark\:bg-emerald-900\/20:is(.dark *){background-color:#064e3b33}.dark\:bg-emerald-900\/30:is(.dark *){background-color:#064e3b4d}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:bg-gray-800\/50:is(.dark *){background-color:#1f293780}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.dark\:bg-gray-900\/30:is(.dark *){background-color:#1118274d}.dark\:bg-gray-900\/50:is(.dark *){background-color:#11182780}.dark\:bg-indigo-900\/30:is(.dark *){background-color:#312e814d}.dark\:bg-orange-900\/20:is(.dark *){background-color:#7c2d1233}.dark\:bg-orange-900\/30:is(.dark *){background-color:#7c2d124d}.dark\:bg-red-900:is(.dark *){--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.dark\:bg-white:is(.dark *){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.dark\:from-blue-400:is(.dark *){--tw-gradient-from:#60a5fa var(--tw-gradient-from-position);--tw-gradient-to:#60a5fa00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.dark\:to-emerald-400:is(.dark *){--tw-gradient-to:#34d399 var(--tw-gradient-to-position)}.dark\:text-amber-300:is(.dark *){--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.dark\:text-amber-400:is(.dark *){--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.dark\:text-blue-300:is(.dark *){--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.dark\:text-emerald-300:is(.dark *){--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity,1))}.dark\:text-emerald-400:is(.dark *){--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity,1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-gray-600:is(.dark *){--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.dark\:text-indigo-400:is(.dark *){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.dark\:text-orange-300:is(.dark *){--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:hover\:border-indigo-900:hover:is(.dark *){--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity,1))}.dark\:hover\:bg-amber-800\/50:hover:is(.dark *){background-color:#92400e80}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-800\/30:hover:is(.dark *){background-color:#1f29374d}.dark\:hover\:bg-gray-800\/50:hover:is(.dark *){background-color:#1f293780}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:hover\:text-red-200:hover:is(.dark *){--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity,1))}@media (width>=1024px){.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-96{width:24rem}.lg\:flex-row{flex-direction:row}.lg\:gap-6{gap:1.5rem}.lg\:rounded-xl{border-radius:.75rem}.lg\:border{border-width:1px}.lg\:border-b-0{border-bottom-width:0}.lg\:border-r{border-right-width:1px}.lg\:border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.lg\:p-1{padding:.25rem}.lg\:p-6{padding:1.5rem}.lg\:shadow-md{--tw-shadow:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.lg\:dark\:border-gray-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}.lg\:dark\:bg-dark:is(.dark *){--tw-bg-opacity:1;background-color:rgb(18 18 18/var(--tw-bg-opacity,1))}}
diff --git a/static/build/app.js b/static/build/app.js
new file mode 100644
index 0000000..dfaec78
--- /dev/null
+++ b/static/build/app.js
@@ -0,0 +1,2 @@
+(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>x(e)===`[object Map]`,p=e=>x(e)===`[object Set]`,m=e=>x(e)===`[object Date]`,h=e=>typeof e==`function`,g=e=>typeof e==`string`,_=e=>typeof e==`symbol`,v=e=>typeof e==`object`&&!!e,y=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),b=Object.prototype.toString,x=e=>b.call(e),S=e=>x(e).slice(8,-1),C=e=>x(e)===`[object Object]`,w=e=>g(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,ee=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),te=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ne=/-\w/g,T=te(e=>e.replace(ne,e=>e.slice(1).toUpperCase())),re=/\B([A-Z])/g,E=te(e=>e.replace(re,`-$1`).toLowerCase()),ie=te(e=>e.charAt(0).toUpperCase()+e.slice(1)),ae=te(e=>e?`on${ie(e)}`:``),D=(e,t)=>!Object.is(e,t),oe=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},se=e=>{let t=parseFloat(e);return isNaN(t)?e:t},ce,le=()=>ce||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};function ue(e){if(d(e)){let t={};for(let n=0;n{if(e){let n=e.split(fe);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function k(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;nye(e,t))}var xe=e=>!!(e&&e.__v_isRef===!0),A=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?xe(e)?A(e.value):JSON.stringify(e,Se,2):String(e),Se=(e,t)=>xe(t)?Se(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[Ce(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>Ce(e))}:_(t)?Ce(t):v(t)&&!d(t)&&!C(t)?String(t):t,Ce=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,j,we=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&j&&(j.active?(this.parent=j,this.index=(j.scopes||=[]).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,t;if(this.scopes)for(e=0,t=this.scopes.length;e0&&--this._on===0){if(j===this)j=this.prevScope;else{let e=j;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let t,n;for(t=0,n=this.effects.length;t0)return;if(Ae){let e=Ae;for(Ae=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;ke;){let t=ke;for(ke=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(t){e||=t}t=n}}if(e)throw e}function Pe(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Fe(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),Re(r),ze(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Ie(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Le(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Le(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===We)||(e.globalVersion=We,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ie(e))))return;e.flags|=2;let t=e.dep,n=M,r=N;M=e,N=!0;try{Pe(e);let n=e.fn(e._value);(t.version===0||D(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{M=n,N=r,Fe(e),e.flags&=-3}}function Re(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Re(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ze(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var N=!0,Be=[];function Ve(){Be.push(N),N=!1}function He(){let e=Be.pop();N=e===void 0?!0:e}function Ue(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=M;M=void 0;try{t()}finally{M=e}}}var We=0,Ge=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},Ke=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!M||!N||M===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==M)t=this.activeLink=new Ge(M,this),M.deps?(t.prevDep=M.depsTail,M.depsTail.nextDep=t,M.depsTail=t):M.deps=M.depsTail=t,qe(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=M.depsTail,t.nextDep=void 0,M.depsTail.nextDep=t,M.depsTail=t,M.deps===t&&(M.deps=e)}return t}trigger(e){this.version++,We++,this.notify(e)}notify(e){Me();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{Ne()}}};function qe(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)qe(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var Je=new WeakMap,Ye=Symbol(``),Xe=Symbol(``),Ze=Symbol(``);function P(e,t,n){if(N&&M){let t=Je.get(e);t||Je.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new Ke),r.map=t,r.key=n),r.track()}}function Qe(e,t,n,r,i,a){let o=Je.get(e);if(!o){We++;return}let s=e=>{e&&e.trigger()};if(Me(),t===`clear`)o.forEach(s);else{let i=d(e),a=i&&w(n);if(i&&n===`length`){let e=Number(r);o.forEach((t,n)=>{(n===`length`||n===Ze||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(Ze)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Ye)),f(e)&&s(o.get(Xe)));break;case`delete`:i||(s(o.get(Ye)),f(e)&&s(o.get(Xe)));break;case`set`:f(e)&&s(o.get(Ye));break}}Ne()}function $e(e){let t=L(e);return t===e?t:(P(t,`iterate`,Ze),I(e)?t:t.map(Bt))}function et(e){return P(e=L(e),`iterate`,Ze),e}function F(e,t){return Lt(e)?Vt(It(e)?Bt(t):t):Bt(t)}var tt={__proto__:null,[Symbol.iterator](){return nt(this,Symbol.iterator,e=>F(this,e))},concat(...e){return $e(this).concat(...e.map(e=>d(e)?$e(e):e))},entries(){return nt(this,`entries`,e=>(e[1]=F(this,e[1]),e))},every(e,t){return it(this,`every`,e,t,void 0,arguments)},filter(e,t){return it(this,`filter`,e,t,e=>e.map(e=>F(this,e)),arguments)},find(e,t){return it(this,`find`,e,t,e=>F(this,e),arguments)},findIndex(e,t){return it(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return it(this,`findLast`,e,t,e=>F(this,e),arguments)},findLastIndex(e,t){return it(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return it(this,`forEach`,e,t,void 0,arguments)},includes(...e){return ot(this,`includes`,e)},indexOf(...e){return ot(this,`indexOf`,e)},join(e){return $e(this).join(e)},lastIndexOf(...e){return ot(this,`lastIndexOf`,e)},map(e,t){return it(this,`map`,e,t,void 0,arguments)},pop(){return st(this,`pop`)},push(...e){return st(this,`push`,e)},reduce(e,...t){return at(this,`reduce`,e,t)},reduceRight(e,...t){return at(this,`reduceRight`,e,t)},shift(){return st(this,`shift`)},some(e,t){return it(this,`some`,e,t,void 0,arguments)},splice(...e){return st(this,`splice`,e)},toReversed(){return $e(this).toReversed()},toSorted(e){return $e(this).toSorted(e)},toSpliced(...e){return $e(this).toSpliced(...e)},unshift(...e){return st(this,`unshift`,e)},values(){return nt(this,`values`,e=>F(this,e))}};function nt(e,t,n){let r=et(e),i=r[t]();return r!==e&&!I(e)&&(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}var rt=Array.prototype;function it(e,t,n,r,i,a){let o=et(e),s=o!==e&&!I(e),c=o[t];if(c!==rt[t]){let t=c.apply(e,a);return s?Bt(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,F(e,t),r,e)}:n.length>2&&(l=function(t,r){return n.call(this,t,r,e)}));let u=c.call(o,l,r);return s&&i?i(u):u}function at(e,t,n,r){let i=et(e),a=i!==e&&!I(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=F(e,t)),n.call(this,t,F(e,r),i,e)}):n.length>3&&(o=function(t,r,i){return n.call(this,t,r,i,e)}));let c=i[t](o,...r);return s?F(e,c):c}function ot(e,t,n){let r=L(e);P(r,`iterate`,Ze);let i=r[t](...n);return(i===-1||i===!1)&&Rt(n[0])?(n[0]=L(n[0]),r[t](...n)):i}function st(e,t,n=[]){Ve(),Me();let r=L(e)[t].apply(e,n);return Ne(),He(),r}var ct=e(`__proto__,__v_isRef,__isVue`),lt=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function ut(e){_(e)||(e=String(e));let t=L(this);return P(t,`has`,e),t.hasOwnProperty(e)}var dt=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(t===`__v_skip`)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(t===`__v_isReactive`)return!r;if(t===`__v_isReadonly`)return r;if(t===`__v_isShallow`)return i;if(t===`__v_raw`)return n===(r?i?kt:Ot:i?Dt:Et).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=tt[t]))return e;if(t===`hasOwnProperty`)return ut}let o=Reflect.get(e,t,R(e)?e:n);if((_(t)?lt.has(t):ct(t))||(r||P(e,`get`,t),i))return o;if(R(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?Pt(e):e}return v(o)?r?Pt(o):Mt(o):o}},ft=class extends dt{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],a=d(e)&&w(t);if(!this._isShallow){let e=Lt(i);if(!I(n)&&!Lt(n)&&(i=L(i),n=L(n)),!a&&R(i)&&!R(n))return e||(i.value=n),!0}let o=a?Number(t)e,vt=e=>Reflect.getPrototypeOf(e);function yt(e,t,n){return function(...r){let i=this.__v_raw,a=L(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?_t:t?Vt:Bt;return!t&&P(a,`iterate`,l?Xe:Ye),s(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:c?[d(e[0]),d(e[1])]:d(e),done:t}}})}}function bt(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function xt(e,t){let n={get(n){let r=this.__v_raw,i=L(r),a=L(n);e||(D(n,a)&&P(i,`get`,n),P(i,`get`,a));let{has:o}=vt(i),s=t?_t:e?Vt:Bt;if(o.call(i,n))return s(r.get(n));if(o.call(i,a))return s(r.get(a));r!==i&&r.get(n)},get size(){let t=this.__v_raw;return!e&&P(L(t),`iterate`,Ye),t.size},has(t){let n=this.__v_raw,r=L(n),i=L(t);return e||(D(t,i)&&P(r,`has`,t),P(r,`has`,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,a=i.__v_raw,o=L(a),s=t?_t:e?Vt:Bt;return!e&&P(o,`iterate`,Ye),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:bt(`add`),set:bt(`set`),delete:bt(`delete`),clear:bt(`clear`)}:{add(e){let n=L(this),r=vt(n),i=L(e),a=!t&&!I(e)&&!Lt(e)?i:e;return r.has.call(n,a)||D(e,a)&&r.has.call(n,e)||D(i,a)&&r.has.call(n,i)||(n.add(a),Qe(n,`add`,a,a)),this},set(e,n){!t&&!I(n)&&!Lt(n)&&(n=L(n));let r=L(this),{has:i,get:a}=vt(r),o=i.call(r,e);o||=(e=L(e),i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?D(n,s)&&Qe(r,`set`,e,n,s):Qe(r,`add`,e,n),this},delete(e){let t=L(this),{has:n,get:r}=vt(t),i=n.call(t,e);i||=(e=L(e),n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&Qe(t,`delete`,e,void 0,a),o},clear(){let e=L(this),t=e.size!==0,n=e.clear();return t&&Qe(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=yt(r,e,t)}),n}function St(e,t){let n=xt(e,t);return(t,r,i)=>r===`__v_isReactive`?!e:r===`__v_isReadonly`?e:r===`__v_raw`?t:Reflect.get(u(n,r)&&r in t?n:t,r,i)}var Ct={get:St(!1,!1)},wt={get:St(!1,!0)},Tt={get:St(!0,!1)},Et=new WeakMap,Dt=new WeakMap,Ot=new WeakMap,kt=new WeakMap;function At(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function jt(e){return e.__v_skip||!Object.isExtensible(e)?0:At(S(e))}function Mt(e){return Lt(e)?e:Ft(e,!1,mt,Ct,Et)}function Nt(e){return Ft(e,!1,gt,wt,Dt)}function Pt(e){return Ft(e,!0,ht,Tt,Ot)}function Ft(e,t,n,r,i){if(!v(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;let a=jt(e);if(a===0)return e;let o=i.get(e);if(o)return o;let s=new Proxy(e,a===2?r:n);return i.set(e,s),s}function It(e){return Lt(e)?It(e.__v_raw):!!(e&&e.__v_isReactive)}function Lt(e){return!!(e&&e.__v_isReadonly)}function I(e){return!!(e&&e.__v_isShallow)}function Rt(e){return e?!!e.__v_raw:!1}function L(e){let t=e&&e.__v_raw;return t?L(t):e}function zt(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&O(e,`__v_skip`,!0),e}var Bt=e=>v(e)?Mt(e):e,Vt=e=>v(e)?Pt(e):e;function R(e){return e?e.__v_isRef===!0:!1}function Ht(e){return R(e)?e.value:e}var Ut={get:(e,t,n)=>t===`__v_raw`?e:Ht(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return R(i)&&!R(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Wt(e){return It(e)?e:new Proxy(e,Ut)}var Gt=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new Ke(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=We-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&M!==this)return je(this,!0),!0}get value(){let e=this.dep.track();return Le(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function Kt(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new Gt(r,i,n)}var qt={},Jt=new WeakMap,Yt=void 0;function Xt(e,t=!1,n=Yt){if(n){let t=Jt.get(n);t||Jt.set(n,t=[]),t.push(e)}}function Zt(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:I(e)||o===!1||o===0?Qt(e,1):Qt(e),m,g,_,v,y=!1,b=!1;if(R(e)?(g=()=>e.value,y=I(e)):It(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>It(e)||I(e)),g=()=>e.map(e=>{if(R(e))return e.value;if(It(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){Ve();try{_()}finally{He()}}let t=Yt;Yt=m;try{return f?f(e,3,[v]):e(v)}finally{Yt=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>Qt(e(),t)}let x=Te(),S=()=>{m.stop(),x&&x.active&&c(x.effects,m)};if(s&&n){let e=n;n=(...t)=>{e(...t),S()}}let C=b?Array(e.length).fill(qt):qt,w=e=>{if(!(!(m.flags&1)||!m.dirty&&!e))if(n){let e=m.run();if(o||y||(b?e.some((e,t)=>D(e,C[t])):D(e,C))){_&&_();let t=Yt;Yt=m;try{let t=[e,C===qt?void 0:b&&C[0]===qt?[]:C,v];C=e,f?f(n,3,t):n(...t)}finally{Yt=t}}}else m.run()};return u&&u(w),m=new De(g),m.scheduler=l?()=>l(w,!1):w,v=e=>Xt(e,!1,m),_=m.onStop=()=>{let e=Jt.get(m);if(e){if(f)f(e,4);else for(let t of e)t();Jt.delete(m)}},n?a?w(!0):C=m.run():l?l(w.bind(null,!0),!0):m.run(),S.pause=m.pause.bind(m),S.resume=m.resume.bind(m),S.stop=S,S}function Qt(e,t=1/0,n){if(t<=0||!v(e)||e.__v_skip||(n||=new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,R(e))Qt(e.value,t,n);else if(d(e))for(let r=0;r{Qt(e,t,n)});else if(C(e)){for(let r in e)Qt(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Qt(e[r],t,n)}return e}function $t(e,t,n,r){try{return r?e(...r):e()}catch(e){tn(e,t,n)}}function en(e,t,n,r){if(h(e)){let i=$t(e,t,n,r);return i&&y(i)&&i.catch(e=>{tn(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a>>1,i=z[r],a=_n(i);a=_n(n)?z.push(e):z.splice(dn(t),0,e),e.flags|=1,pn()}}function pn(){ln||=cn.then(vn)}function mn(e){d(e)?an.push(...e):on&&e.id===-1?on.splice(sn+1,0,e):e.flags&1||(an.push(e),e.flags|=1),pn()}function hn(e,t,n=rn+1){for(;n_n(e)-_n(t));if(an.length=0,on){on.push(...e);return}for(on=e,sn=0;sne.id==null?e.flags&2?-1:1/0:e.id;function vn(e){try{for(rn=0;rn{r._d&&Si(-1);let i=bn(t),a;try{a=e(...n)}finally{bn(i),r._d&&Si(1)}return a};return r._n=!0,r._c=!0,r._d=!0,r}function V(e,n){if(B===null)return e;let r=na(B),i=e.dirs||=[];for(let e=0;e1)return n&&h(t)?t.call(r&&r.proxy):t}}var Tn=Symbol.for(`v-scx`),En=()=>wn(Tn);function Dn(e,t,n){return On(e,t,n)}function On(e,n,i=t){let{immediate:a,deep:o,flush:c,once:l}=i,u=s({},i),d=n&&a||!n&&c!==`post`,f;if(qi){if(c===`sync`){let e=En();f=e.__watcherHandles||=[]}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=Q;u.call=(e,t,n)=>en(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{W(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():fn(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=Zt(e,n,u);return qi&&(f?f.push(h):d&&h()),h}function kn(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?An(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=Wi(this),s=On(i,a.bind(r),n);return o(),s}function An(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;ee.__isTeleport,Nn=Symbol(`_leaveCb`);function Pn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Pn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Fn(e){e.ids=[e.ids[0]+ e.ids[2]+++`-`,0,0]}function In(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}var Ln=new WeakMap;function Rn(e,n,r,a,o=!1){if(d(e)){e.forEach((e,t)=>Rn(e,n&&(d(n)?n[t]:n),r,a,o));return}if(Bn(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&Rn(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?na(a.component):a.el,l=o?null:s,{i:f,r:p}=e,m=n&&n.r,_=f.refs===t?f.refs={}:f.refs,v=f.setupState,y=L(v),b=v===t?i:e=>In(_,e)?!1:u(y,e),x=(e,t)=>!(t&&In(_,t));if(m!=null&&m!==p){if(zn(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(R(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))$t(p,f,12,[l,_]);else{let t=g(p),n=R(p);if(t||n){let i=()=>{if(e.f){let n=t?b(p)?v[p]:_[p]:x(p)||!e.k?p.value:_[e.k];if(o)d(n)&&c(n,s);else if(d(n))n.includes(s)||n.push(s);else if(t)_[p]=[s],b(p)&&(v[p]=_[p]);else{let t=[s];x(p,e.k)&&(p.value=t),e.k&&(_[e.k]=t)}}else t?(_[p]=l,b(p)&&(v[p]=l)):n&&(x(p,e.k)&&(p.value=l),e.k&&(_[e.k]=l))};if(l){let t=()=>{i(),Ln.delete(e)};t.id=-1,Ln.set(e,t),W(t,r)}else zn(e),i()}}}function zn(e){let t=Ln.get(e);t&&(t.flags|=8,Ln.delete(e))}le().requestIdleCallback,le().cancelIdleCallback;var Bn=e=>!!e.type.__asyncLoader,Vn=e=>e.type.__isKeepAlive;function Hn(e,t){Wn(e,`a`,t)}function Un(e,t){Wn(e,`da`,t)}function Wn(e,t,n=Q){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if(Kn(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Vn(e.parent.vnode)&&Gn(r,t,n,e),e=e.parent}}function Gn(e,t,n,r){let i=Kn(t,e,r,!0);$n(()=>{c(r[t],i)},n)}function Kn(e,t,n=Q,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{Ve();let i=Wi(n),a=en(t,n,e,r);return i(),He(),a};return r?i.unshift(a):i.push(a),a}}var qn=e=>(t,n=Q)=>{(!qi||e===`sp`)&&Kn(e,(...e)=>t(...e),n)},Jn=qn(`bm`),Yn=qn(`m`),Xn=qn(`bu`),Zn=qn(`u`),Qn=qn(`bum`),$n=qn(`um`),er=qn(`sp`),tr=qn(`rtg`),nr=qn(`rtc`);function rr(e,t=Q){Kn(`ec`,e,t)}var ir=Symbol.for(`v-ndc`);function H(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&It(e),r=!1,s=!1;n&&(r=!I(e),s=Lt(e),e=et(e)),i=Array(e.length);for(let n=0,o=e.length;nt(e,n,void 0,a&&a[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,o=n.length;re?Ki(e)?na(e):ar(e.parent):null,or=s(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ar(e.parent),$root:e=>ar(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>hr(e),$forceUpdate:e=>e.f||=()=>{fn(e.update)},$nextTick:e=>e.n||=un.bind(e.proxy),$watch:e=>kn.bind(e)}),sr=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),cr={get({_:e},n){if(n===`__v_skip`)return!0;let{ctx:r,setupState:i,data:a,props:o,accessCache:s,type:c,appContext:l}=e;if(n[0]!==`$`){let e=s[n];if(e!==void 0)switch(e){case 1:return i[n];case 2:return a[n];case 4:return r[n];case 3:return o[n]}else if(sr(i,n))return s[n]=1,i[n];else if(a!==t&&u(a,n))return s[n]=2,a[n];else if(u(o,n))return s[n]=3,o[n];else if(r!==t&&u(r,n))return s[n]=4,r[n];else ur&&(s[n]=0)}let d=or[n],f,p;if(d)return n===`$attrs`&&P(e.attrs,`get`,``),d(e);if((f=c.__cssModules)&&(f=f[n]))return f;if(r!==t&&u(r,n))return s[n]=4,r[n];if(p=l.config.globalProperties,u(p,n))return p[n]},set({_:e},n,r){let{data:i,setupState:a,ctx:o}=e;return sr(a,n)?(a[n]=r,!0):i!==t&&u(i,n)?(i[n]=r,!0):u(e.props,n)||n[0]===`$`&&n.slice(1)in e?!1:(o[n]=r,!0)},has({_:{data:e,setupState:n,accessCache:r,ctx:i,appContext:a,props:o,type:s}},c){let l;return!!(r[c]||e!==t&&c[0]!==`$`&&u(e,c)||sr(n,c)||u(o,c)||u(i,c)||u(or,c)||u(a.config.globalProperties,c)||(l=s.__cssModules)&&l[c])},defineProperty(e,t,n){return n.get==null?u(n,`value`)&&this.set(e,t,n.value,null):e._.accessCache[t]=0,Reflect.defineProperty(e,t,n)}};function lr(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var ur=!0;function dr(e){let t=hr(e),n=e.proxy,i=e.ctx;ur=!1,t.beforeCreate&&pr(t.beforeCreate,e,`bc`);let{data:a,computed:o,methods:s,watch:c,provide:l,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:g,updated:_,activated:y,deactivated:b,beforeDestroy:x,beforeUnmount:S,destroyed:C,unmounted:w,render:ee,renderTracked:te,renderTriggered:ne,errorCaptured:T,serverPrefetch:re,expose:E,inheritAttrs:ie,components:ae,directives:D,filters:oe}=t;if(u&&fr(u,i,null),s)for(let e in s){let t=s[e];h(t)&&(i[e]=t.bind(n))}if(a){let t=a.call(n,n);v(t)&&(e.data=Mt(t))}if(ur=!0,o)for(let e in o){let t=o[e],a=ia({get:h(t)?t.bind(n,n):h(t.get)?t.get.bind(n,n):r,set:!h(t)&&h(t.set)?t.set.bind(n):r});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(c)for(let e in c)mr(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{Cn(t,e[t])})}f&&pr(f,e,`c`);function O(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(O(Jn,p),O(Yn,m),O(Xn,g),O(Zn,_),O(Hn,y),O(Un,b),O(rr,T),O(nr,te),O(tr,ne),O(Qn,S),O($n,w),O(er,re),d(E))if(E.length){let t=e.exposed||={};E.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||={};ee&&e.render===r&&(e.render=ee),ie!=null&&(e.inheritAttrs=ie),ae&&(e.components=ae),D&&(e.directives=D),re&&Fn(e)}function fr(e,t,n=r){d(e)&&(e=br(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?wn(r.from||n,r.default,!0):wn(r.from||n):wn(r),R(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function pr(e,t,n){en(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function mr(e,t,n,r){let i=r.includes(`.`)?An(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&Dn(i,n)}else if(h(e))Dn(i,e.bind(n));else if(v(e))if(d(e))e.forEach(e=>mr(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&Dn(i,r,e)}}function hr(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t),c;return s?c=s:!i.length&&!n&&!r?c=t:(c={},i.length&&i.forEach(e=>gr(c,e,o,!0)),gr(c,t,o)),v(t)&&a.set(t,c),c}function gr(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&gr(e,a,n,!0),i&&i.forEach(t=>gr(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=_r[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var _r={data:vr,props:Sr,emits:Sr,methods:xr,computed:xr,beforeCreate:U,created:U,beforeMount:U,mounted:U,beforeUpdate:U,updated:U,beforeDestroy:U,beforeUnmount:U,destroyed:U,unmounted:U,activated:U,deactivated:U,errorCaptured:U,serverPrefetch:U,components:xr,directives:xr,watch:Cr,provide:vr,inject:yr};function vr(e,t){return t?e?function(){return s(h(e)?e.call(this,this):e,h(t)?t.call(this,this):t)}:t:e}function yr(e,t){return xr(br(e),br(t))}function br(e){if(d(e)){let t={};for(let n=0;nt===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${T(t)}Modifiers`]||e[`${E(t)}Modifiers`];function kr(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&Or(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>g(e)?e.trim():e)),s.number&&(a=r.map(se)));let c,l=i[c=ae(n)]||i[c=ae(T(n))];!l&&o&&(l=i[c=ae(E(n))]),l&&en(l,e,6,a);let u=i[c+`Once`];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,en(u,e,6,a)}}var Ar=new WeakMap;function jr(e,t,n=!1){let r=n?Ar:t.emitsCache,i=r.get(e);if(i!==void 0)return i;let a=e.emits,o={},c=!1;if(!h(e)){let r=e=>{let n=jr(e,t,!0);n&&(c=!0,s(o,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return!a&&!c?(v(e)&&r.set(e,null),null):(d(a)?a.forEach(e=>o[e]=null):s(o,a),v(e)&&r.set(e,o),o)}function Mr(e,t){return!e||!a(t)?!1:(t=t.slice(2).replace(/Once$/,``),u(e,t[0].toLowerCase()+t.slice(1))||u(e,E(t))||u(e,t))}function Nr(e){let{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[a],slots:s,attrs:c,emit:l,render:u,renderCache:d,props:f,data:p,setupState:m,ctx:h,inheritAttrs:g}=e,_=bn(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=Ni(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=Ni(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:Pr(c)}}catch(t){yi.length=0,tn(t,e,1),v=ki(_i)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=Fr(y,a)),b=Mi(b,y,!1,!0))}return n.dirs&&(b=Mi(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&Pn(b,n.transition),v=b,bn(_),v}var Pr=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||={})[n]=e[n]);return t},Fr=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Ir(e,t,n){let{props:r,children:i,component:a}=e,{props:o,children:s,patchFlag:c}=t,l=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Lr(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;tObject.create(Br),Hr=e=>Object.getPrototypeOf(e)===Br;function Ur(e,t,n,r=!1){let i={},a=Vr();e.propsDefaults=Object.create(null),Gr(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);n?e.props=r?i:Nt(i):e.type.props?e.props=i:e.props=a,e.attrs=a}function Wr(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=L(i),[c]=e.propsOptions,l=!1;if((r||o>0)&&!(o&16)){if(o&8){let n=e.vnode.dynamicProps;for(let r=0;r{p=!0;let[t,n]=Jr(e,r,!0);s(l,t),n&&f.push(...n)};!i&&r.mixins.length&&r.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!c&&!p)return v(e)&&a.set(e,n),n;if(d(c))for(let e=0;ee===`_`||e===`_ctx`||e===`$stable`,Zr=e=>d(e)?e.map(Ni):[Ni(e)],Qr=(e,t,n)=>{if(t._n)return t;let r=xn((...e)=>Zr(t(...e)),n);return r._c=!1,r},$r=(e,t,n)=>{let r=e._ctx;for(let n in e){if(Xr(n))continue;let i=e[n];if(h(i))t[n]=Qr(n,i,r);else if(i!=null){let e=Zr(i);t[n]=()=>e}}},ei=(e,t)=>{let n=Zr(t);e.slots.default=()=>n},ti=(e,t,n)=>{for(let r in t)(n||!Xr(r))&&(e[r]=t[r])},ni=(e,t,n)=>{let r=e.slots=Vr();if(e.vnode.shapeFlag&32){let e=t._;e?(ti(r,t,n),n&&O(r,`_`,e,!0)):$r(t,r)}else t&&ei(e,t)},ri=(e,n,r)=>{let{vnode:i,slots:a}=e,o=!0,s=t;if(i.shapeFlag&32){let e=n._;e?r&&e===1?o=!1:ti(a,n,r):(o=!n.$stable,$r(n,a)),s=n}else n&&(ei(e,n),s={default:1});if(o)for(let e in a)!Xr(e)&&s[e]==null&&delete a[e]},W=hi;function ii(e){return ai(e)}function ai(e,i){let a=le();a.__VUE__=!0;let{insert:o,remove:s,patchProp:c,createElement:l,createText:u,createComment:d,setText:f,setElementText:p,parentNode:m,nextSibling:h,setScopeId:g=r,insertStaticContent:_}=e,v=(e,t,n,r=null,i=null,a=null,o=void 0,s=null,c=!!t.dynamicChildren)=>{if(e===t)return;e&&!Ei(e,t)&&(r=ye(e),k(e,i,a,!0),e=null),t.patchFlag===-2&&(c=!1,t.dynamicChildren=null);let{type:l,ref:u,shapeFlag:d}=t;switch(l){case gi:y(e,t,n,r);break;case _i:b(e,t,n,r);break;case vi:e??x(t,n,r,o);break;case G:ae(e,t,n,r,i,a,o,s,c);break;default:d&1?w(e,t,n,r,i,a,o,s,c):d&6?D(e,t,n,r,i,a,o,s,c):(d&64||d&128)&&l.process(e,t,n,r,i,a,o,s,c,A)}u!=null&&i?Rn(u,e&&e.ref,a,t||e,!t):u==null&&e&&e.ref!=null&&Rn(e.ref,null,a,e,!0)},y=(e,t,n,r)=>{if(e==null)o(t.el=u(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},b=(e,t,n,r)=>{e==null?o(t.el=d(t.children||``),n,r):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},S=({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=h(e),o(e,n,r),e=i;o(t,n,r)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)},w=(e,t,n,r,i,a,o,s,c)=>{if(t.type===`svg`?o=`svg`:t.type===`math`&&(o=`mathml`),e==null)te(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),re(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},te=(e,t,n,r,i,a,s,u)=>{let d,f,{props:m,shapeFlag:h,transition:g,dirs:_}=e;if(d=e.el=l(e.type,a,m&&m.is,m),h&8?p(d,e.children):h&16&&T(e.children,d,null,r,i,oi(e,a),s,u),_&&Sn(e,null,r,`created`),ne(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!ee(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&Li(f,r,e)}_&&Sn(e,null,r,`beforeMount`);let v=ci(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&W(()=>{try{f&&Li(f,r,e),v&&g.enter(d),_&&Sn(e,null,r,`mounted`)}finally{}},i)},ne=(e,t,n,r,i)=>{if(n&&g(e,n),r)for(let t=0;t{for(let l=c;l{let l=n.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:f}=n;u|=e.patchFlag&16;let m=e.props||t,h=n.props||t,g;if(r&&si(r,!1),(g=h.onVnodeBeforeUpdate)&&Li(g,r,n,e),f&&Sn(n,e,r,`beforeUpdate`),r&&si(r,!0),(m.innerHTML&&h.innerHTML==null||m.textContent&&h.textContent==null)&&p(l,``),d?E(e.dynamicChildren,d,l,r,i,oi(n,a),o):s||de(e,n,l,null,r,i,oi(n,a),o,!1),u>0){if(u&16)ie(l,m,h,r,a);else if(u&2&&m.class!==h.class&&c(l,`class`,null,h.class,a),u&4&&c(l,`style`,m.style,h.style,a),u&8){let e=n.dynamicProps;for(let t=0;t{g&&Li(g,r,n,e),f&&Sn(n,e,r,`updated`)},i)},E=(e,t,n,r,i,a,o)=>{for(let s=0;s{if(n!==r){if(n!==t)for(let t in n)!ee(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(ee(t))continue;let o=r[t],s=n[t];o!==s&&t!==`value`&&c(e,t,s,o,a,i)}`value`in r&&c(e,`value`,n.value,r.value,a)}},ae=(e,t,n,r,i,a,s,c,l)=>{let d=t.el=e?e.el:u(``),f=t.anchor=e?e.anchor:u(``),{patchFlag:p,dynamicChildren:m,slotScopeIds:h}=t;h&&(c=c?c.concat(h):h),e==null?(o(d,n,r),o(f,n,r),T(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(E(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&li(e,t,!0)):de(e,t,n,f,i,a,s,c,l)},D=(e,t,n,r,i,a,o,s,c)=>{t.slotScopeIds=s,e==null?t.shapeFlag&512?i.ctx.activate(t,n,r,o,c):O(t,n,r,i,a,o,c):se(e,t,c)},O=(e,t,n,r,i,a,o)=>{let s=e.component=Bi(e,r,i);if(Vn(e)&&(s.ctx.renderer=A),Ji(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,ce,o),!e.el){let r=s.subTree=ki(_i);b(null,r,t,n),e.placeholder=r.el}}else ce(s,e,t,n,i,a,o)},se=(e,t,n)=>{let r=t.component=e.component;if(Ir(e,t,n))if(r.asyncDep&&!r.asyncResolved){ue(r,t,n);return}else r.next=t,r.update();else t.el=e.el,r.vnode=t},ce=(e,t,n,r,i,a,o)=>{let s=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{let n=di(e);if(n){t&&(t.el=c.el,ue(e,t,o)),n.asyncDep.then(()=>{W(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;si(e,!1),t?(t.el=c.el,ue(e,t,o)):t=c,n&&oe(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&Li(d,s,t,c),si(e,!0);let f=Nr(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),ye(p),e,i,a),t.el=f.el,u===null&&zr(e,f.el),r&&W(r,i),(d=t.props&&t.props.onVnodeUpdated)&&W(()=>Li(d,s,t,c),i)}else{let o,{el:s,props:c}=t,{bm:l,m:u,parent:d,root:f,type:p}=e,m=Bn(t);if(si(e,!1),l&&oe(l),!m&&(o=c&&c.onVnodeBeforeMount)&&Li(o,d,t),si(e,!0),s&&Ce){let t=()=>{e.subTree=Nr(e),Ce(s,e.subTree,e,i,null)};m&&p.__asyncHydrate?p.__asyncHydrate(s,e,t):t()}else{f.ce&&f.ce._hasShadowRoot()&&f.ce._injectChildStyle(p,e.parent?e.parent.type:void 0);let o=e.subTree=Nr(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&W(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;W(()=>Li(o,d,e),i)}(t.shapeFlag&256||d&&Bn(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&W(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new De(s);e.scope.off();let l=e.update=c.run.bind(c),u=e.job=c.runIfDirty.bind(c);u.i=e,u.id=e.uid,c.scheduler=()=>fn(u),si(e,!0),l()},ue=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,Wr(e,t.props,r,n),ri(e,t.children,n),Ve(),hn(e),He()},de=(e,t,n,r,i,a,o,s,c=!1)=>{let l=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:m}=t;if(f>0){if(f&128){pe(l,d,n,r,i,a,o,s,c);return}else if(f&256){fe(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&ve(l,i,a),d!==l&&p(n,d)):u&16?m&16?pe(l,d,n,r,i,a,o,s,c):ve(l,i,a,!0):(u&8&&p(n,``),m&16&&T(d,n,r,i,a,o,s,c))},fe=(e,t,r,i,a,o,s,c,l)=>{e||=n,t||=n;let u=e.length,d=t.length,f=Math.min(u,d),p;for(p=0;pd?ve(e,a,o,!0,!1,f):T(t,r,i,a,o,s,c,l,f)},pe=(e,t,r,i,a,o,s,c,l)=>{let u=0,d=t.length,f=e.length-1,p=d-1;for(;u<=f&&u<=p;){let n=e[u],i=t[u]=l?Pi(t[u]):Ni(t[u]);if(Ei(n,i))v(n,i,r,null,a,o,s,c,l);else break;u++}for(;u<=f&&u<=p;){let n=e[f],i=t[p]=l?Pi(t[p]):Ni(t[p]);if(Ei(n,i))v(n,i,r,null,a,o,s,c,l);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,n=ep)for(;u<=f;)k(e[u],a,o,!0),u++;else{let m=u,h=u,g=new Map;for(u=h;u<=p;u++){let e=t[u]=l?Pi(t[u]):Ni(t[u]);e.key!=null&&g.set(e.key,u)}let _,y=0,b=p-h+1,x=!1,S=0,C=Array(b);for(u=0;u=b){k(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&Ei(n,t[_])){i=_;break}i===void 0?k(n,a,o,!0):(C[i-h]=u+1,i>=S?S=i:x=!0,v(n,t[i],r,null,a,o,s,c,l),y++)}let w=x?ui(C):n;for(_=w.length-1,u=b-1;u>=0;u--){let e=h+u,n=t[e],f=t[e+1],p=e+1{let{el:a,type:c,transition:l,children:u,shapeFlag:d}=e;if(d&6){me(e.component.subTree,t,n,r);return}if(d&128){e.suspense.move(t,n,r);return}if(d&64){c.move(e,t,n,A);return}if(c===G){o(a,t,n);for(let e=0;el.enter(a),i);else{let{leave:r,delayLeave:i,afterLeave:c}=l,u=()=>{e.ctx.isUnmounted?s(a):o(a,t,n)},d=()=>{a._isLeaving&&a[Nn](!0),r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}else o(a,t,n)},k=(e,t,n,r=!1,i=!1)=>{let{type:a,props:o,ref:s,children:c,dynamicChildren:l,shapeFlag:u,patchFlag:d,dirs:f,cacheIndex:p,memo:m}=e;if(d===-2&&(i=!1),s!=null&&(Ve(),Rn(s,null,n,e,!0),He()),p!=null&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!Bn(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&Li(_,t,e),u&6)_e(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Sn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,A,r):l&&!l.hasOnce&&(a!==G||d>0&&d&64)?ve(l,t,n,!1,!0):(a===G&&d&384||!i&&u&16)&&ve(c,t,n),r&&he(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&W(()=>{_&&Li(_,t,e),h&&Sn(e,null,t,`unmounted`),v&&(e.el=null)},n)},he=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===G){ge(n,r);return}if(t===vi){C(e);return}let a=()=>{s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(e.shapeFlag&1&&i&&!i.persisted){let{leave:t,delayLeave:r}=i,o=()=>t(n,a);r?r(e.el,a,o):o()}else a()},ge=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},_e=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;fi(c),fi(l),r&&oe(r),i.stop(),a&&(a.flags|=8,k(o,e,t,n)),s&&W(s,t),W(()=>{e.isUnmounted=!0},t)},ve=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o{if(e.shapeFlag&6)return ye(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[jn];return n?h(n):t},be=!1,xe=(e,t,n)=>{let r;e==null?t._vnode&&(k(t._vnode,null,null,!0),r=t._vnode.component):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e,be||=(be=!0,hn(r),gn(),!1)},A={p:v,um:k,m:me,r:he,mt:O,mc:T,pc:de,pbc:E,n:ye,o:e},Se,Ce;return i&&([Se,Ce]=i(A)),{render:xe,hydrate:Se,createApp:Er(xe,Se)}}function oi({type:e,props:t},n){return n===`svg`&&e===`foreignObject`||n===`mathml`&&e===`annotation-xml`&&t&&t.encoding&&t.encoding.includes(`html`)?void 0:n}function si({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ci(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function li(e,t,n=!1){let r=e.children,i=t.children;if(d(r)&&d(i))for(let e=0;e>1,e[n[s]]0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,o=n[a-1];a-- >0;)n[a]=o,o=t[o];return n}function di(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:di(t)}function fi(e){if(e)for(let t=0;te.__isSuspense;function hi(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):mn(e)}var G=Symbol.for(`v-fgt`),gi=Symbol.for(`v-txt`),_i=Symbol.for(`v-cmt`),vi=Symbol.for(`v-stc`),yi=[],K=null;function q(e=!1){yi.push(K=e?null:[])}function bi(){yi.pop(),K=yi[yi.length-1]||null}var xi=1;function Si(e,t=!1){xi+=e,e<0&&K&&t&&(K.hasOnce=!0)}function Ci(e){return e.dynamicChildren=xi>0?K||n:null,bi(),xi>0&&K&&K.push(e),e}function J(e,t,n,r,i,a){return Ci(Y(e,t,n,r,i,a,!0))}function wi(e,t,n,r,i){return Ci(ki(e,t,n,r,i,!0))}function Ti(e){return e?e.__v_isVNode===!0:!1}function Ei(e,t){return e.type===t.type&&e.key===t.key}var Di=({key:e})=>e??null,Oi=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:g(e)||R(e)||h(e)?{i:B,r:e,k:t,f:!!n}:e);function Y(e,t=null,n=null,r=0,i=null,a=e===G?0:1,o=!1,s=!1){let c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Di(t),ref:t&&Oi(t),scopeId:yn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:B};return s?(Fi(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=g(n)?8:16),xi>0&&!o&&K&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&K.push(c),c}var ki=Ai;function Ai(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===ir)&&(e=_i),Ti(e)){let r=Mi(e,t,!0);return n&&Fi(r,n),xi>0&&!a&&K&&(r.shapeFlag&6?K[K.indexOf(e)]=r:K.push(r)),r.patchFlag=-2,r}if(ra(e)&&(e=e.__vccOpts),t){t=ji(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=k(e)),v(n)&&(Rt(n)&&!d(n)&&(n=s({},n)),t.style=ue(n))}let o=g(e)?1:mi(e)?128:Mn(e)?64:v(e)?4:h(e)?2:0;return Y(e,t,n,r,i,o,a,!0)}function ji(e){return e?Rt(e)||Hr(e)?s({},e):e:null}function Mi(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?Ii(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Di(l),ref:t&&t.ref?n&&a?d(a)?a.concat(Oi(t)):[a,Oi(t)]:Oi(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==G?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Mi(e.ssContent),ssFallback:e.ssFallback&&Mi(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&Pn(u,c.clone(u)),u}function X(e=` `,t=0){return ki(gi,null,e,t)}function Z(e=``,t=!1){return t?(q(),wi(_i,null,e)):ki(_i,null,e)}function Ni(e){return e==null||typeof e==`boolean`?ki(_i):d(e)?ki(G,null,e.slice()):Ti(e)?Pi(e):ki(gi,null,String(e))}function Pi(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Mi(e)}function Fi(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(d(t))n=16;else if(typeof t==`object`)if(r&65){let n=t.default;n&&(n._c&&(n._d=!1),Fi(e,n()),n._c&&(n._d=!0));return}else{n=32;let r=t._;!r&&!Hr(t)?t._ctx=B:r===3&&B&&(B.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else h(t)?(t={default:t,_ctx:B},n=32):(t=String(t),r&64?(n=16,t=[X(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ii(...e){let t={};for(let n=0;nQ||B,Hi,Ui;{let e=le(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};Hi=t(`__VUE_INSTANCE_SETTERS__`,e=>Q=e),Ui=t(`__VUE_SSR_SETTERS__`,e=>qi=e)}var Wi=e=>{let t=Q;return Hi(e),e.scope.on(),()=>{e.scope.off(),Hi(t)}},Gi=()=>{Q&&Q.scope.off(),Hi(null)};function Ki(e){return e.vnode.shapeFlag&4}var qi=!1;function Ji(e,t=!1,n=!1){t&&Ui(t);let{props:r,children:i}=e.vnode,a=Ki(e);Ur(e,r,a,t),ni(e,i,n||t);let o=a?Yi(e,t):void 0;return t&&Ui(!1),o}function Yi(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,cr);let{setup:r}=n;if(r){Ve();let n=e.setupContext=r.length>1?ta(e):null,i=Wi(e),a=$t(r,e,0,[e.props,n]),o=y(a);if(He(),i(),(o||e.sp)&&!Bn(e)&&Fn(e),o){if(a.then(Gi,Gi),t)return a.then(n=>{Xi(e,n,t)}).catch(t=>{tn(t,e,0)});e.asyncDep=a}else Xi(e,a,t)}else $i(e,t)}function Xi(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=Wt(t)),$i(e,n)}var Zi,Qi;function $i(e,t,n){let i=e.type;if(!e.render){if(!t&&Zi&&!i.render){let t=i.template||hr(e).template;if(t){let{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:a,compilerOptions:o}=i;i.render=Zi(t,s(s({isCustomElement:n,delimiters:a},r),o))}}e.render=i.render||r,Qi&&Qi(e)}{let t=Wi(e);Ve();try{dr(e)}finally{He(),t()}}}var ea={get(e,t){return P(e,`get`,``),e[t]}};function ta(e){return{attrs:new Proxy(e.attrs,ea),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function na(e){return e.exposed?e.exposeProxy||=new Proxy(Wt(zt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in or)return or[n](e)},has(e,t){return t in e||t in or}}):e.proxy}function ra(e){return h(e)&&`__vccOpts`in e}var ia=(e,t)=>Kt(e,t,qi),aa=`3.5.34`,oa=void 0,sa=typeof window<`u`&&window.trustedTypes;if(sa)try{oa=sa.createPolicy(`vue`,{createHTML:e=>e})}catch{}var ca=oa?e=>oa.createHTML(e):e=>e,la=`http://www.w3.org/2000/svg`,ua=`http://www.w3.org/1998/Math/MathML`,da=typeof document<`u`?document:null,fa=da&&da.createElement(`template`),pa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?da.createElementNS(la,e):t===`mathml`?da.createElementNS(ua,e):n?da.createElement(e,{is:n}):da.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>da.createTextNode(e),createComment:e=>da.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>da.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===a||!(i=i.nextSibling)););else{fa.innerHTML=ca(r===`svg`?``:r===`mathml`?``:e);let i=fa.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ma=Symbol(`_vtc`);function ha(e,t,n){let r=e[ma];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var ga=Symbol(`_vod`),_a=Symbol(`_vsh`),va={name:`show`,beforeMount(e,{value:t},{transition:n}){e[ga]=e.style.display===`none`?``:e.style.display,n&&t?n.beforeEnter(e):ya(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),ya(e,!0),r.enter(e)):r.leave(e,()=>{ya(e,!1)}):ya(e,t))},beforeUnmount(e,{value:t}){ya(e,t)}};function ya(e,t){e.style.display=t?e[ga]:`none`,e[_a]=!t}var ba=Symbol(``),xa=/(?:^|;)\s*display\s*:/;function Sa(e,t,n){let r=e.style,i=g(n),a=!1;if(n&&!i){if(t)if(g(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??wa(r,t,``)}else for(let e in t)n[e]??wa(r,e,``);for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?wa(r,i,``):Oa(e,i,!g(t)&&t?t[i]:void 0,o)||wa(r,i,o)}}else if(i){if(t!==n){let e=r[ba];e&&(n+=`;`+e),r.cssText=n,a=xa.test(n)}}else t&&e.removeAttribute(`style`);ga in e&&(e[ga]=a?r.display:``,e[_a]&&(r.display=`none`))}var Ca=/\s*!important$/;function wa(e,t,n){if(d(n))n.forEach(n=>wa(e,t,n));else if(n??=``,t.startsWith(`--`))e.setProperty(t,n);else{let r=Da(e,t);Ca.test(n)?e.setProperty(E(r),n.replace(Ca,``),`important`):e[r]=n}}var Ta=[`Webkit`,`Moz`,`ms`],Ea={};function Da(e,t){let n=Ea[t];if(n)return n;let r=T(t);if(r!==`filter`&&r in e)return Ea[t]=r;r=ie(r);for(let n=0;nRa||=(za.then(()=>Ra=0),Date.now());function Va(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;en(Ha(e,n.value),t,5,[e])};return n.value=e,n.attached=Ba(),n}function Ha(e,t){if(d(t)){let n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(e=>t=>!t._stopped&&e&&e(t))}else return t}var Ua=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Wa=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?ha(e,r,c):t===`style`?Sa(e,n,r):a(t)?o(t)||Fa(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),!0):t[0]===`^`?(t=t.slice(1),!1):Ga(e,t,r,c))?(ja(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&Aa(e,t,r,c,s,t!==`value`)):e._isVueCE&&(Ka(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?ja(e,T(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),Aa(e,t,r,c))};function Ga(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&Ua(t)&&h(n));if(t===`spellcheck`||t===`draggable`||t===`translate`||t===`autocorrect`||t===`sandbox`&&e.tagName===`IFRAME`||t===`form`||t===`list`&&e.tagName===`INPUT`||t===`type`&&e.tagName===`TEXTAREA`)return!1;if(t===`width`||t===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return Ua(t)&&g(n)?!1:t in e}function Ka(e,t){let n=e._def.props;if(!n)return!1;let r=T(t);return Array.isArray(n)?n.some(e=>T(e)===r):Object.keys(n).some(e=>T(e)===r)}var qa=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return d(t)?e=>oe(t,e):t};function Ja(e){e.target.composing=!0}function Ya(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var Xa=Symbol(`_assign`);function Za(e,t,n){return t&&(e=e.trim()),n&&(e=se(e)),e}var $={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e[Xa]=qa(i);let a=r||i.props&&i.props.type===`number`;Ma(e,t?`change`:`input`,t=>{t.target.composing||e[Xa](Za(e.value,n,a))}),(n||a)&&Ma(e,`change`,()=>{e.value=Za(e.value,n,a)}),t||(Ma(e,`compositionstart`,Ja),Ma(e,`compositionend`,Ya),Ma(e,`change`,Ya))},mounted(e,{value:t}){e.value=t??``},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[Xa]=qa(o),e.composing)return;let s=(a||e.type===`number`)&&!/^0\d/.test(e.value)?se(e.value):e.value,c=t??``;if(s===c)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&e.type!==`range`&&(r&&t===n||i&&e.value.trim()===c)||(e.value=c)}},Qa={deep:!0,created(e,{value:t,modifiers:{number:n}},r){let i=p(t);Ma(e,`change`,()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?se(eo(e)):eo(e));e[Xa](e.multiple?i?new Set(t):t:t[0]),e._assigning=!0,un(()=>{e._assigning=!1})}),e[Xa]=qa(r)},mounted(e,{value:t}){$a(e,t)},beforeUpdate(e,t,n){e[Xa]=qa(n)},updated(e,{value:t}){e._assigning||$a(e,t)}};function $a(e,t){let n=e.multiple,r=d(t);if(!(n&&!r&&!p(t))){for(let i=0,a=e.options.length;iString(e)===String(o)):a.selected=be(t,o)>-1}else a.selected=t.has(o);else if(ye(eo(a),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function eo(e){return`_value`in e?e._value:e.value}var to=s({patchProp:Wa},pa),no;function ro(){return no||=ii(to)}var io=((...e)=>{let t=ro().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=oo(e);if(!r)return;let i=t._component;!h(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent=``);let a=n(r,!1,ao(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t});function ao(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function oo(e){return g(e)?document.querySelector(e):e}var so={data(){return{fs:1e5,b_str:`0.5, 0.5, 0.0, 0.0`,a_str:`1.0, 0.0, 0.0, 0.0`,filterType:`Lowpass (低通)`,filterOptions:[`Lowpass (低通)`,`Highpass (高通)`,`Bandpass (帶通)`,`Notch (陷波器)`,`1P1Z (一極一零)`,`2P2Z (二極二零)`,`PID 控制器`,`SOGI-Alpha (帶通)`,`SOGI-Beta (低通)`,`(無) 手動自訂`],systemGain:1,params:{fc:1e3,order:1,bp_f_low:500,bp_f_high:2e3,bp_order:1,notch_f0:120,notch_q:1,opoz_fz:15e3,opoz_fp:10,tptz_fz1:200,tptz_fz2:25e3,tptz_fp1:10,tptz_fp2:5e3,kp:.003,ki:10,kd:16e-6,sogi_f0:60,sogi_k:1.414},isDarkMode:!0,baseB:[.5,.5,0,0,0,0,0],baseA:[1,0,0,0,0,0,0],bSliders:[0,0,0,0,0,0,0],aSliders:[0,0,0,0,0,0,0],sense_b:`2x`,sense_a:`2x`,loadingBode:!1,bodeTimeout:null,globalError:null,csvFile:null,csvColumns:[],csvPreview:[],selectedColumn:0,loadingFilter:!1,filterDone:!1,timePlotData:null,mobileTab:`settings`,shiftBits:14,fixedOverrides:{a:{},b:{}},outOfRangeB:[!1,!1,!1,!1,!1,!1,!1],outOfRangeA:[!1,!1,!1,!1,!1,!1,!1],a1a2Diff:0,a1a2Sum:0,showAdvancedAdjustment:!1}},computed:{maxLogB(){return this.sense_b===`1%`?Math.log10(1.01):this.sense_b===`2x`?Math.log10(2):1},maxLogA(){return this.sense_a===`1%`?Math.log10(1.01):this.sense_a===`2x`?Math.log10(2):this.sense_a===`10x`?Math.log10(10):Math.log10(2)},b_int_str:{get(){return this.fixedPointCoeffs.b.map(e=>e.val).join(`, `)},set(e){let t=e.replace(/[^0-9,\-\s]/g,``);this.parseCoeffs(t).forEach((e,t)=>{this.fixedOverrides.b[t]=Math.round(e)})}},a_int_str:{get(){return this.fixedPointCoeffs.a.map(e=>e.val).join(`, `)},set(e){let t=e.replace(/[^0-9,\-\s]/g,``);this.parseCoeffs(t).forEach((e,t)=>{this.fixedOverrides.a[t]=Math.round(e)})}},fixedPointCoeffs(){let e=2**this.shiftBits,t=this.parseCoeffs(this.b_str),n=this.parseCoeffs(this.a_str);return{b:t.map((t,n)=>{let r=Math.round(t*e),i=this.fixedOverrides.b[n]===void 0?r:this.fixedOverrides.b[n];return{label:`b${n}`,val:i,isOverridden:this.fixedOverrides.b[n]!==void 0}}),a:n.map((t,n)=>{let r=Math.round(t*e),i=this.fixedOverrides.a[n]===void 0?r:this.fixedOverrides.a[n];return{label:`a${n}`,val:i,isOverridden:this.fixedOverrides.a[n]!==void 0}})}},floatingCoeffs(){return{b:this.parseCoeffs(this.b_str).map((e,t)=>({label:`b${t}`,val:parseFloat(e.toPrecision(6))})),a:this.parseCoeffs(this.a_str).map((e,t)=>({label:`a${t}`,val:parseFloat(e.toPrecision(6))}))}},isManualDirty(){if(this.bSliders.some(e=>e!==0)||this.aSliders.some(e=>e!==0))return!0;let e=this.padTo7(this.parseCoeffs(this.b_str)),t=this.padTo7(this.parseCoeffs(this.a_str)),n=this.baseB.map(e=>e*(this.systemGain||1)),r=this.baseA;for(let i=0;i<7;i++){let a=e[i]||0,o=n[i]||0,s=Math.max(1e-8,Math.abs(o)*1e-10);if(Math.abs(a-o)>s)return!0;let c=t[i]||0,l=r[i]||0,u=Math.max(1e-8,Math.abs(l)*1e-10);if(Math.abs(c-l)>u)return!0}return!1},previewA1(){let e=parseFloat(this.a1a2Sum||0),t=parseFloat(this.a1a2Diff||0);return Math.round((e+t)/2*1e3)/1e3},previewA2(){let e=parseFloat(this.a1a2Sum||0),t=parseFloat(this.a1a2Diff||0);return Math.round((e-t)/2*1e3)/1e3},currentA1(){let e=this.parseCoeffs(this.a_str);return Math.round((e[1]||0)*1e3)/1e3},currentA2(){let e=this.parseCoeffs(this.a_str);return Math.round((e[2]||0)*1e3)/1e3}},mounted(){let e=localStorage.getItem(`theme`);e&&(this.isDarkMode=e===`dark`),this.isDarkMode?document.documentElement.classList.add(`dark`):document.documentElement.classList.remove(`dark`),this.applyFilterDesign()},methods:{toggleDarkMode(){this.isDarkMode=!this.isDarkMode,localStorage.setItem(`theme`,this.isDarkMode?`dark`:`light`),this.isDarkMode?document.documentElement.classList.add(`dark`):document.documentElement.classList.remove(`dark`),this.updateBodePlot(),this.timePlotData&&this.drawTimePlot(this.timePlotData)},formatK(e){return e>=1e6?`(~${(e/1e6).toFixed(1).replace(`.0`,``)}M)`:e>=1e3?`(~${(e/1e3).toFixed(1).replace(`.0`,``)}k)`:``},parseCoeffs(e){return e?e.split(/[,\s]+/).map(e=>parseFloat(e.trim())).filter(e=>!isNaN(e)):[]},padTo7(e){let t=e.slice(0,7);for(;t.length<7;)t.push(0);return t},syncBaseFromText(){let e=this.systemGain||1;this.baseB=this.padTo7(this.parseCoeffs(this.b_str)).map(t=>t/e),this.baseA=this.padTo7(this.parseCoeffs(this.a_str)),this.baseA[0]=1,this.fixedOverrides={a:{},b:{}},this.bSliders=[0,0,0,0,0,0,0],this.aSliders=[0,0,0,0,0,0,0],this.outOfRangeB=[!1,!1,!1,!1,!1,!1,!1],this.outOfRangeA=[!1,!1,!1,!1,!1,!1,!1]},resetSlidersB(){this.bSliders=[0,0,0,0,0,0,0],this.b_str=this.baseB.map(e=>parseFloat(e.toPrecision(10))).join(`, `)},resetSlidersA(){this.aSliders=[0,0,0,0,0,0],this.a_str=this.baseA.map(e=>parseFloat(e.toPrecision(10))).join(`, `)},clearManualAdjustments(){this.bSliders=[0,0,0,0,0,0,0],this.aSliders=[0,0,0,0,0,0,0];let e=this.systemGain||1;this.b_str=this.baseB.map(t=>parseFloat((t*e).toPrecision(10))).join(`, `),this.a_str=this.baseA.map(e=>parseFloat(e.toPrecision(10))).join(`, `),this.showAdvancedAdjustment=!1,this.calcSlidersFromText(),this.updateBodePlot()},updateFromControls(){let e=this.baseB.map((e,t)=>e*(this.systemGain||1)*10**(this.bSliders[t]||0)),t=[1];for(let e=1;e<7;e++)t.push(this.baseA[e]*10**(this.aSliders[e]||0));this.b_str=e.map(e=>parseFloat(e.toPrecision(10))).join(`, `),this.a_str=t.map(e=>parseFloat(e.toPrecision(10))).join(`, `)},updateFromText(){this.updateBodePlot()},updateA1A2FromRelationship(){let e=this.padTo7(this.parseCoeffs(this.a_str)),t=parseFloat(this.a1a2Sum||0),n=parseFloat(this.a1a2Diff||0);e[1]=Math.round((t+n)/2*1e3)/1e3,e[2]=Math.round((t-n)/2*1e3)/1e3,this.a_str=e.map(e=>parseFloat(e.toPrecision(10))).join(`, `),this.calcSlidersFromText()},enableAdvancedAdjustment(){this.calcSlidersFromText(),this.showAdvancedAdjustment=!0},calcSlidersFromText(){let e=this.systemGain||1,t=this.parseCoeffs(this.b_str),n=this.parseCoeffs(this.a_str);for(let n=0;n<7;n++){let r=t[n]||0,i=this.baseB[n]||0;if(this.outOfRangeB[n]=!1,i!==0&&r!==0&&r/(i*e)>0){let t=Math.log10(r/(i*e));Math.abs(t)<1e-12&&(t=0),Math.abs(t)>this.maxLogB&&(this.outOfRangeB[n]=!0),this.bSliders[n]=Math.max(-this.maxLogB,Math.min(this.maxLogB,t))}else this.bSliders[n]=0,r!==0&&i!==0&&(this.outOfRangeB[n]=!0)}for(let e=1;e<7;e++){let t=n[e]||0,r=this.baseA[e]||0;if(this.outOfRangeA[e]=!1,r!==0&&t!==0&&t/r>0){let n=Math.log10(t/r);Math.abs(n)<1e-12&&(n=0),Math.abs(n)>this.maxLogA&&(this.outOfRangeA[e]=!0),this.aSliders[e]=Math.max(-this.maxLogA,Math.min(this.maxLogA,n))}else this.aSliders[e]=0,t!==0&&r!==0&&(this.outOfRangeA[e]=!0)}let r=Math.round((n[1]||0)*1e3)/1e3,i=Math.round((n[2]||0)*1e3)/1e3;this.a1a2Diff=r-i,this.a1a2Sum=r+i},debouncedUpdateFromText(e){e===`b`&&(this.b_str=this.b_str.replace(/[^0-9,.\-\s]/g,``)),e===`a`&&(this.a_str=this.a_str.replace(/[^0-9,.\-\s]/g,``)),this.calcSlidersFromText()},onlyNumberKey(e,t=!0){[`Backspace`,`Delete`,`ArrowLeft`,`ArrowRight`,`Tab`,`Enter`,`Home`,`End`].includes(e.key)||e.ctrlKey||e.metaKey||(t?/[0-9,.\-\s]/:/[0-9,\-\s]/).test(e.key)||e.preventDefault()},updateFromFixed(e,t,n){let r=parseInt(n);isNaN(r)||(this.fixedOverrides[t][e]=r,this.updateBodePlot())},clearFixedOverrides(){this.fixedOverrides={a:{},b:{}}},onFsChange(){this.filterType===`(無) 手動自訂`?this.updateBodePlot():this.applyFilterDesign()},debouncedApply(){clearTimeout(this.bodeTimeout),this.bodeTimeout=setTimeout(()=>{this.filterType===`(無) 手動自訂`?this.updateBodePlot():this.applyFilterDesign()},300)},debouncedUpdateBode(){clearTimeout(this.bodeTimeout),this.bodeTimeout=setTimeout(()=>this.updateBodePlot(),150)},onGainChange(){this.updateFromControls(),this.debouncedUpdateBode()},onFilterTypeChange(){this.systemGain=1,this.filterType!==`(無) 手動自訂`&&(this.params={fc:1e3,order:1,bp_f_low:500,bp_f_high:2e3,bp_order:1,notch_f0:120,notch_q:1,opoz_fz:15e3,opoz_fp:10,tptz_fz1:200,tptz_fz2:25e3,tptz_fp1:10,tptz_fp2:5e3,kp:.003,ki:10,kd:16e-6,sogi_f0:60,sogi_k:1.414}),this.applyFilterDesign()},resetFilterParams(){this.systemGain=1,this.fixedOverrides={a:{},b:{}},this.bSliders=[0,0,0,0,0,0,0],this.aSliders=[0,0,0,0,0,0,0],this.outOfRangeB=[!1,!1,!1,!1,!1,!1,!1],this.outOfRangeA=[!1,!1,!1,!1,!1,!1,!1],this.filterType===`(無) 手動自訂`?(this.b_str=`1.0, 0.0, 0.0, 0.0`,this.a_str=`1.0, 0.0, 0.0, 0.0`,this.updateBodePlot()):(this.params={fc:1e3,order:1,bp_f_low:500,bp_f_high:2e3,bp_order:1,notch_f0:120,notch_q:1,opoz_fz:15e3,opoz_fp:10,tptz_fz1:200,tptz_fz2:25e3,tptz_fp1:10,tptz_fp2:5e3,kp:.003,ki:10,kd:16e-6,sogi_f0:60,sogi_k:1.414},this.applyFilterDesign())},async applyFilterDesign(){if(this.filterType!==`(無) 手動自訂`){this.globalError=null;try{let e={filter_type:this.filterType,fs:this.fs,lp_fc:this.params.fc,lp_order:this.params.order,hp_fc:this.params.fc,hp_order:this.params.order,bp_f_low:this.params.bp_f_low,bp_f_high:this.params.bp_f_high,bp_order:this.params.bp_order,notch_f0:this.params.notch_f0,notch_q:this.params.notch_q,opoz_fz:this.params.opoz_fz,opoz_fp:this.params.opoz_fp,tptz_fz1:this.params.tptz_fz1,tptz_fz2:this.params.tptz_fz2,tptz_fp1:this.params.tptz_fp1,tptz_fp2:this.params.tptz_fp2,pid_kp:this.params.kp,pid_ki:this.params.ki,pid_kd:this.params.kd,sogi_f0:this.params.sogi_f0,sogi_k:this.params.sogi_k},t=await fetch(`/api/design`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json();throw Error(e.detail||`設計濾波器失敗`)}let n=await t.json();this.baseB=this.padTo7(n.b),this.baseA=this.padTo7(n.a),this.baseA[0]=1,this.bSliders=[0,0,0,0,0,0,0],this.aSliders=[0,0,0,0,0,0,0],this.showAdvancedAdjustment=!1,this.updateFromControls(),this.updateBodePlot()}catch(e){this.globalError=e.message}}},async updateBodePlot(){this.loadingBode=!0,this.globalError=null;try{let e=this.parseCoeffs(this.b_str),t=this.parseCoeffs(this.a_str);e.length===0&&(e=[1]),t.length===0&&(t=[1]);let n=2**this.shiftBits,r=e.map((e,t)=>(this.fixedOverrides.b[t]===void 0?Math.round(e*n):this.fixedOverrides.b[t])/n),i=t.map((e,t)=>(this.fixedOverrides.a[t]===void 0?Math.round(e*n):this.fixedOverrides.a[t])/n),[a,o]=await Promise.all([fetch(`/api/bode`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({b:e,a:t,fs:this.fs})}),fetch(`/api/bode`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({b:r,a:i,fs:this.fs})})]);if(!a.ok||!o.ok)throw Error(`無法計算頻率響應`);let s=await a.json(),c=await o.json();this.drawBodePlot(s.freq,s.mag,s.phase,c.mag,c.phase),window.innerWidth<1024&&(this.mobileTab=`chart`)}catch(e){this.globalError=e.message}finally{this.loadingBode=!1}},drawBodePlot(e,t,n,r,i){let a=this.fs,o=e[0],s=e[e.length-1],c=this.isDarkMode,l=window.innerWidth<768,u=[],d=[],f=Math.floor(Math.log10(o)),p=Math.ceil(Math.log10(s));for(let e=f;e<=p;e++)for(let t of[1,2,5]){let n=t*10**e;ns||(u.push(n),n<1?d.push(n.toPrecision(3)):n<1e3?d.push(String(n)):n<1e6?d.push(n/1e3+`k`):d.push(n/1e6+`M`))}let m=[],h=[],g=(e,t,n)=>{let r=n===1?`y`:`y2`;m.push({type:`line`,x0:e,x1:e,y0:0,y1:1,xref:n===1?`x`:`x2`,yref:r+` domain`,line:{color:c?`rgba(255,0,0,0.5)`:`rgba(220,0,0,0.6)`,width:1.5,dash:`dash`}}),t&&h.push({x:Math.log10(e),y:1,text:t,xref:n===1?`x`:`x2`,yref:r+` domain`,showarrow:!1,font:{color:c?`rgba(255,100,100,0.8)`:`rgba(180,50,50,1)`,size:l?10:12},yshift:l?15:12,xanchor:`center`,yanchor:l?`middle`:`bottom`,textangle:l?-90:0})};g(a/2,`Nyquist`,1),g(a,`fs`,1),g(a/2,null,2),g(a,null,2);for(let e=f;e<=p;e++){let t=10**e;if(t>=o&&t<=s){let e=c?`rgba(128,128,128,0.5)`:`rgba(100,100,100,0.3)`;m.push({type:`line`,x0:t,x1:t,y0:0,y1:1,xref:`x`,yref:`y domain`,line:{color:e,width:1.5}},{type:`line`,x0:t,x1:t,y0:0,y1:1,xref:`x2`,yref:`y2 domain`,line:{color:e,width:1.5}})}}let _=c?`rgba(128,128,128,0.2)`:`rgba(0,0,0,0.1)`,v=c?`#4b5563`:`#cbd5e1`,y=c?`#9ca3af`:`#475569`,b=c?`#d1d5db`:`#1e293b`,x={type:`log`,title:{text:`Freq (Hz)`,font:{size:l?12:14}},range:[Math.log10(o),Math.log10(s)],tickvals:u,ticktext:d,showgrid:!0,gridcolor:_,tickfont:{color:y,size:l?11:12},nticks:l?6:10},S={paper_bgcolor:`transparent`,plot_bgcolor:`transparent`,margin:l?{t:80,b:120,l:55,r:15}:{t:70,b:120,l:70,r:30},showlegend:!1,grid:{rows:2,columns:1,pattern:`independent`,roworder:`top to bottom`,ygap:l?.35:.3},font:{color:y,family:`Inter, sans-serif`},annotations:[{text:`Magnitude Response (dB)`,xref:`x domain`,yref:`y domain`,x:.5,y:l?1.25:1.15,showarrow:!1,font:{size:l?14:16,color:b,weight:`bold`}},{text:`Phase Response (Deg)`,xref:`x2 domain`,yref:`y2 domain`,x:.5,y:l?1.25:1.15,showarrow:!1,font:{size:l?14:16,color:b,weight:`bold`}},{xref:`paper`,yref:`paper`,x:.35,y:l?.52:.54,text:`一一一`,font:{color:c?`#3b82f6`:`#2563eb`,size:10},showarrow:!1},{xref:`paper`,yref:`paper`,x:.42,y:l?.52:.54,text:`Ideal (Float)`,font:{color:y,size:11},showarrow:!1,xanchor:`left`},{xref:`paper`,yref:`paper`,x:.58,y:l?.52:.54,text:`· · · ·`,font:{color:c?`#10b981`:`#059669`,size:14},showarrow:!1},{xref:`paper`,yref:`paper`,x:.63,y:l?.52:.54,text:`Fixed (Q${this.shiftBits})`,font:{color:y,size:11},showarrow:!1,xanchor:`left`},{xref:`paper`,yref:`paper`,x:.35,y:-.15,text:`一一一`,font:{color:c?`#f97316`:`#ea580c`,size:10},showarrow:!1},{xref:`paper`,yref:`paper`,x:.42,y:-.15,text:`Ideal Phase`,font:{color:y,size:11},showarrow:!1,xanchor:`left`},{xref:`paper`,yref:`paper`,x:.58,y:-.15,text:`· · · ·`,font:{color:c?`#f43f5e`:`#e11d48`,size:14},showarrow:!1},{xref:`paper`,yref:`paper`,x:.63,y:-.15,text:`Fixed Phase`,font:{color:y,size:11},showarrow:!1,xanchor:`left`},...h],xaxis:{...x},yaxis:{title:{text:`Mag (dB)`,font:{size:l?12:14}},range:[-60,0],gridcolor:_,zerolinecolor:v,tickfont:{color:y,size:l?11:12}},xaxis2:{...x},yaxis2:{title:{text:`Phase (°)`,font:{size:l?12:14}},range:[-180,180],tickvals:[-180,-90,0,90,180],gridcolor:_,zerolinecolor:v,tickfont:{color:y,size:l?11:12}},shapes:m},C={x:e,y:t,name:`Ideal (Float)`,type:`scatter`,line:{color:c?`#3b82f6`:`#2563eb`,width:2.5}},w={x:e,y:r,name:`Fixed (Q${this.shiftBits})`,type:`scatter`,line:{color:c?`#10b981`:`#059669`,width:2,dash:`dot`}},ee={x:e,y:n,name:`Ideal Phase`,type:`scatter`,line:{color:c?`#f97316`:`#ea580c`,width:2.5},xaxis:`x2`,yaxis:`y2`},te={x:e,y:i,name:`Fixed Phase`,type:`scatter`,line:{color:c?`#f43f5e`:`#e11d48`,width:2,dash:`dot`},xaxis:`x2`,yaxis:`y2`};Plotly.react(`bodePlot`,[C,w,ee,te],S,{responsive:!0})},handleFileUpload(e){let t=e.target.files[0];if(!t)return;this.csvFile=t,this.filterDone=!1,this.csvPreview=[];let n=new FileReader;n.onload=e=>{let t=e.target.result.split(`
+`).filter(e=>e.trim());if(t.length===0)return;if(this.csvColumns=t[0].split(`,`).map(e=>e.trim()),this.selectedColumn=0,this.csvColumns.length>1){let e=this.csvColumns[0].toLowerCase();[`time`,`t`,`sec`,`x`,`index`,`unnamed`].some(t=>e.includes(t))&&(this.selectedColumn=1)}let n=[];for(let e=1;ee.trim()));this.csvPreview=n},n.readAsText(t)},async processFilter(){if(!this.csvFile)return;this.loadingFilter=!0,this.globalError=null;let e=new FormData;e.append(`file`,this.csvFile),e.append(`b`,this.b_str),e.append(`a`,this.a_str),e.append(`col_idx`,this.selectedColumn);try{let t=await fetch(`/api/filter`,{method:`POST`,body:e});if(!t.ok){let e=await t.json();throw Error(e.detail||`濾波處理失敗`)}let n=await t.json();this.timePlotData=n,this.filterDone=!0,this.$nextTick(()=>{this.drawTimePlot(n)})}catch(e){this.globalError=e.message}finally{this.loadingFilter=!1}},drawTimePlot(e){let t=this.isDarkMode,n=window.innerWidth<768,r=t?`rgba(128,128,128,0.2)`:`rgba(0,0,0,0.1)`,i=t?`#4b5563`:`#cbd5e1`,a=t?`#9ca3af`:`#475569`,o={paper_bgcolor:`transparent`,plot_bgcolor:`transparent`,margin:n?{t:60,b:60,l:45,r:15}:{t:40,b:55,l:60,r:20},font:{color:a,family:`Inter, sans-serif`},xaxis:{title:{text:`Sample Index`,font:{size:n?10:11}},gridcolor:r,zerolinecolor:i,tickfont:{color:a,size:n?9:11}},yaxis:{title:{text:`Amplitude`,font:{size:n?10:11}},gridcolor:r,zerolinecolor:i,tickfont:{color:a,size:n?9:11}},legend:{orientation:`h`,y:1.02,yanchor:`bottom`,x:1,xanchor:`right`,font:{color:a,size:n?9:10}}};Plotly.react(`timePlot`,[{x:e.index,y:e.original,name:`原始輸入訊號 (Input)`,type:`scatter`,line:{color:t?`#00cc96`:`#059669`},opacity:.7},{x:e.index,y:e.filtered,name:`濾波後輸出 (Output)`,type:`scatter`,line:{color:t?`#ef553b`:`#dc2626`},opacity:.9}],o,{responsive:!0})},async downloadCsv(){if(!this.csvFile)return;let e=new FormData;e.append(`file`,this.csvFile),e.append(`b`,this.b_str),e.append(`a`,this.a_str),e.append(`col_idx`,this.selectedColumn);try{let t=await fetch(`/api/filter/download`,{method:`POST`,body:e});if(!t.ok)throw Error(`下載失敗`);let n=await t.blob(),r=window.URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`filtered_output.csv`,document.body.appendChild(i),i.click(),window.URL.revokeObjectURL(r)}catch(e){this.globalError=e.message}}}},co=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},lo={id:`app`,class:`flex flex-col h-screen overflow-hidden`},uo={class:`bg-white dark:bg-dark border-b border-slate-200 dark:border-gray-800 p-4 shadow-md flex justify-between items-center z-10`},fo={class:`flex items-center gap-4`},po={key:0,class:`w-5 h-5 text-yellow-400`,fill:`currentColor`,viewBox:`0 0 20 20`},mo={key:1,class:`w-5 h-5 text-slate-700`,fill:`currentColor`,viewBox:`0 0 20 20`},ho={class:`lg:hidden flex border-b border-slate-200 dark:border-gray-800 bg-white dark:bg-dark z-10 flex-shrink-0`},go={key:0,class:`w-2 h-2 rounded-full bg-blue-500 animate-ping`},_o={class:`flex flex-col lg:flex-row flex-1 overflow-hidden`},vo={class:`text-sm font-semibold text-slate-500 dark:text-gray-400 uppercase tracking-wider mb-3 flex items-center justify-between`},yo=[`value`],bo={key:0,class:`space-y-3 bg-slate-100 dark:bg-gray-900 p-4 rounded-lg border border-slate-200 dark:border-gray-800 shadow-inner`},xo={key:0},So={class:`text-sm text-slate-500 dark:text-gray-400 flex justify-between mb-1`},Co={class:`text-emerald-600 dark:text-emerald-400`},wo=[`max`],To={class:`flex gap-2`},Eo=[`onClick`],Do={key:1},Oo={class:`text-sm text-slate-500 dark:text-gray-400 flex justify-between mb-1`},ko={class:`text-emerald-600 dark:text-emerald-400`},Ao={class:`text-sm text-slate-500 dark:text-gray-400 flex justify-between mb-1`},jo={class:`text-emerald-600 dark:text-emerald-400`},Mo={class:`flex gap-2`},No=[`onClick`],Po={key:2,class:`space-y-3`},Fo={key:3,class:`space-y-3`},Io={key:4,class:`space-y-3`},Lo={key:5,class:`space-y-3`},Ro={class:`text-sm font-medium text-slate-500 dark:text-gray-400 mb-1 block`},zo=[`onUpdate:modelValue`],Bo={key:6,class:`space-y-3`},Vo={class:`space-y-3`},Ho={class:`text-sm text-slate-500 dark:text-gray-400 flex justify-between mb-1`},Uo={class:`text-emerald-600 dark:text-emerald-400`},Wo={class:`text-sm text-slate-500 dark:text-gray-400 flex justify-between mb-1`},Go={class:`text-blue-600 dark:text-blue-400`},Ko={class:`text-sm font-semibold text-slate-500 dark:text-gray-400 uppercase tracking-wider mb-3 flex justify-between items-center`},qo={class:`flex items-center gap-2`},Jo={class:`mb-3`},Yo={class:`flex flex-wrap gap-1 mb-2`},Xo={class:`text-[9px] text-blue-500 font-bold`},Zo={class:`text-[10px] font-mono text-blue-800 dark:text-blue-300`},Qo={class:`mb-3 bg-slate-50 dark:bg-gray-900 border border-slate-200 dark:border-gray-800 rounded-lg`},$o={class:`px-3 pb-3`},es={class:`flex items-center gap-2 mb-2 mt-1`},ts=[`onClick`],ns={key:0},rs={class:`text-xs text-slate-400 dark:text-gray-500 flex justify-between mt-1`},is={key:0,class:`text-amber-500 font-bold animate-pulse`},as=[`onUpdate:modelValue`,`min`,`max`,`step`],os={class:`mb-3`},ss={class:`flex flex-wrap gap-1 mb-2`},cs={class:`text-[9px] text-orange-500 font-bold`},ls={class:`text-[10px] font-mono text-orange-800 dark:text-orange-300`},us={class:`bg-slate-50 dark:bg-gray-900 border border-slate-200 dark:border-gray-800 rounded-lg`},ds={class:`px-3 pb-3`},fs={class:`flex items-center gap-2 mb-2 mt-1`},ps=[`onClick`],ms={key:0},hs={class:`text-xs text-slate-400 dark:text-gray-500 flex justify-between mt-1`},gs={key:0,class:`text-amber-500 font-bold animate-pulse`},_s=[`onUpdate:modelValue`,`min`,`max`,`step`],vs={class:`mt-4`},ys={key:1,class:`p-4 bg-slate-50 dark:bg-gray-900 border border-slate-200 dark:border-gray-800 rounded-xl shadow-inner`},bs={class:`mb-4`},xs={class:`text-[11px] font-semibold text-slate-400 dark:text-gray-500 flex justify-between mb-2`},Ss={class:`text-indigo-600 dark:text-indigo-400 font-mono bg-indigo-50 dark:bg-indigo-900/30 px-2 py-0.5 rounded`},Cs={class:`mb-4`},ws={class:`text-[11px] font-semibold text-slate-400 dark:text-gray-500 flex justify-between mb-2`},Ts={class:`text-emerald-600 dark:text-emerald-400 font-mono bg-emerald-50 dark:bg-emerald-900/30 px-2 py-0.5 rounded`},Es={class:`flex gap-2 mb-4`},Ds={class:`flex-1 bg-white dark:bg-gray-800 border border-slate-100 dark:border-gray-700 rounded-lg p-2 text-center shadow-sm`},Os={class:`flex items-center justify-center gap-1.5`},ks={class:`text-[10px] font-mono text-slate-400`},As={class:`text-xs font-mono font-bold text-indigo-600 dark:text-indigo-400`},js={class:`flex-1 bg-white dark:bg-gray-800 border border-slate-100 dark:border-gray-700 rounded-lg p-2 text-center shadow-sm`},Ms={class:`flex items-center justify-center gap-1.5`},Ns={class:`text-[10px] font-mono text-slate-400`},Ps={class:`text-xs font-mono font-bold text-emerald-600 dark:text-emerald-400`},Fs={class:`text-sm font-semibold text-slate-500 dark:text-gray-400 uppercase tracking-wider mb-3 flex justify-between items-center`},Is={class:`flex items-center gap-2`},Ls={class:`text-xs bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 px-2 py-1 rounded`},Rs={class:`flex items-center gap-2`},zs={class:`mb-4`},Bs={class:`flex items-center gap-2`},Vs={class:`text-[10px] text-slate-400 mt-1`},Hs={class:`space-y-4`},Us={class:`flex flex-wrap gap-1 mb-2`},Ws={class:`text-[9px] text-blue-400 font-bold`},Gs={class:`flex flex-wrap gap-1 mb-2`},Ks={class:`text-[9px] text-orange-400 font-bold`},qs={class:`text-[10px] text-slate-400 dark:text-gray-500 mt-3 italic`},Js={key:0,class:`absolute top-4 right-6 bg-red-100 dark:bg-red-900 border border-red-200 dark:border-red-700 text-red-700 dark:text-white px-4 py-3 rounded-lg shadow-lg text-base z-50 flex items-center gap-2`},Ys={class:`bg-white dark:bg-dark lg:rounded-xl border-b lg:border border-slate-100 lg:border-slate-200 dark:border-gray-800 lg:dark:border-gray-800 lg:shadow-md p-0 lg:p-1 flex-shrink-0 relative transition-colors duration-300`},Xs={class:`px-5 py-4 border-b border-slate-100 dark:border-gray-800 flex justify-between items-center bg-white dark:bg-dark backdrop-blur-sm z-10 relative`},Zs={key:0,class:`text-sm text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/30 px-3 py-1.5 rounded border border-blue-100 dark:border-blue-800/50 flex items-center gap-2`},Qs={class:`bg-white dark:bg-white lg:dark:bg-dark lg:rounded-xl border-b lg:border border-slate-100 lg:border-slate-200 dark:border-gray-100 lg:dark:border-gray-800 lg:shadow-md p-0 lg:p-1 flex-shrink-0 relative transition-colors duration-300`},$s={class:`p-6 z-10 relative bg-white dark:bg-dark transition-colors duration-300`},ec={class:`flex items-center flex-wrap gap-4 mb-6 p-4 bg-slate-50 dark:bg-gray-900/50 rounded-lg border border-slate-100 dark:border-gray-800`},tc={class:`cursor-pointer bg-blue-600 hover:bg-blue-500 text-white px-5 py-3 rounded-lg text-base font-semibold transition-all shadow-md hover:shadow-blue-500/20 flex items-center gap-2`},nc={key:0,class:`text-base text-emerald-600 dark:text-emerald-400 font-mono`},rc={key:1,class:`h-8 border-l border-slate-200 dark:border-gray-700 mx-2`},ic={key:2,class:`flex items-center gap-2`},ac=[`value`],oc=[`disabled`],sc={key:0,class:`mb-6`},cc={class:`overflow-x-auto rounded-xl border border-slate-100 dark:border-gray-800 shadow-inner`},lc={class:`w-full text-sm text-left`},uc={class:`bg-slate-50 dark:bg-gray-800/50`},dc={class:`divide-y divide-slate-100 dark:divide-gray-800`},fc={key:1,class:`text-base font-bold text-slate-800 dark:text-gray-200 mb-3`},pc={class:`overflow-x-auto bg-white dark:bg-dark`},mc={id:`timePlot`,class:`min-w-[580px] w-full h-[400px] bg-white dark:bg-dark`},hc={key:2,class:`h-[300px] flex flex-col items-center justify-center text-slate-400 dark:text-gray-500 border-2 border-dashed border-slate-200 dark:border-gray-800 rounded-xl bg-slate-50/50 dark:bg-gray-900/30`};function gc(e,t,n,r,i,a){return q(),J(`div`,lo,[Y(`header`,uo,[t[74]||=Y(`div`,{class:`flex items-center gap-3`},[Y(`img`,{src:`/ui/logo.png`,alt:`Logo`,class:`h-10 w-10 object-contain rounded-lg shadow-sm`}),Y(`h1`,{class:`text-xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-blue-600 to-emerald-600 dark:from-blue-400 dark:to-emerald-400`},` 差分方程式分析 (Difference Equation Analyzer)`)],-1),Y(`div`,fo,[Y(`button`,{onClick:t[0]||=(...t)=>e.toggleDarkMode&&e.toggleDarkMode(...t),class:`p-2 rounded-lg bg-slate-100 dark:bg-gray-800 hover:bg-slate-200 dark:hover:bg-gray-700 transition-colors shadow-sm`},[e.isDarkMode?(q(),J(`svg`,po,[...t[72]||=[Y(`path`,{d:`M10 12a2 2 0 100-4 2 2 0 000 4z`},null,-1),Y(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm1-13a1 1 0 10-2 0 1 1 0 002 0zM2 10a1 1 0 011-1h1a1 1 0 110 2H3a1 1 0 01-1-1zm14 0a1 1 0 011-1h1a1 1 0 110 2h-1a1 1 0 01-1-1zM5.05 5.05a1 1 0 011.414 0l.707.707a1 1 0 11-1.414 1.414l-.707-.707a1 1 0 010-1.414zm9.9 9.9a1 1 0 011.414 0l.707.707a1 1 0 11-1.414 1.414l-.707-.707a1 1 0 010-1.414zM5.05 14.95a1 1 0 010-1.414l.707-.707a1 1 0 011.414 1.414l-.707.707a1 1 0 01-1.414 0zm9.9-9.9a1 1 0 010-1.414l.707-.707a1 1 0 011.414 1.414l-.707.707a1 1 0 01-1.414 0z`,"clip-rule":`evenodd`},null,-1)]])):(q(),J(`svg`,mo,[...t[73]||=[Y(`path`,{d:`M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z`},null,-1)]]))])])]),Y(`div`,ho,[Y(`button`,{onClick:t[1]||=t=>e.mobileTab=`settings`,class:k([e.mobileTab===`settings`?`border-b-2 border-blue-500 text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20`:`text-slate-500 dark:text-gray-400 hover:text-slate-700 dark:hover:text-gray-200`,`flex-1 flex items-center justify-center gap-2 py-3 text-sm font-semibold transition-colors`])},[...t[75]||=[Y(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z`}),Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 12a3 3 0 11-6 0 3 3 0 016 0z`})],-1),X(` 設定 `,-1)]],2),Y(`button`,{onClick:t[2]||=t=>e.mobileTab=`chart`,class:k([e.mobileTab===`chart`?`border-b-2 border-emerald-500 text-emerald-600 dark:text-emerald-400 bg-emerald-50 dark:bg-emerald-900/20`:`text-slate-500 dark:text-gray-400 hover:text-slate-700 dark:hover:text-gray-200`,`flex-1 flex items-center justify-center gap-2 py-3 text-sm font-semibold transition-colors`])},[t[76]||=Y(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z`})],-1),t[77]||=X(` 圖表 `,-1),e.loadingBode?(q(),J(`span`,go)):Z(``,!0)],2)]),Y(`div`,_o,[Y(`aside`,{class:k([e.mobileTab===`settings`?`flex`:`hidden`,`lg:flex flex-col w-full lg:w-96 h-full bg-white dark:bg-dark border-b lg:border-b-0 lg:border-r border-slate-200 dark:border-gray-800 overflow-y-auto p-5 gap-5 custom-scrollbar transition-colors duration-300`])},[Y(`section`,null,[Y(`h2`,vo,[t[78]||=Y(`div`,{class:`flex items-center gap-2`},[Y(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z`}),Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 12a3 3 0 11-6 0 3 3 0 016 0z`})]),X(` 濾波器設計 `)],-1),Y(`button`,{onClick:t[3]||=(...t)=>e.resetFilterParams&&e.resetFilterParams(...t),class:`text-[10px] font-bold bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300 hover:bg-amber-200 dark:hover:bg-amber-800/50 px-2 py-1 rounded transition-colors uppercase`},`重設設計`)]),V(Y(`select`,{"onUpdate:modelValue":t[4]||=t=>e.filterType=t,onChange:t[5]||=(...t)=>e.onFilterTypeChange&&e.onFilterTypeChange(...t),class:`w-full bg-slate-50 dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded-lg p-3 text-base focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none transition-all mb-3 text-slate-900 dark:text-gray-100 truncate`},[(q(!0),J(G,null,H(e.filterOptions,e=>(q(),J(`option`,{key:e,value:e},A(e),9,yo))),128))],544),[[Qa,e.filterType]]),e.filterType===`(無) 手動自訂`?Z(``,!0):(q(),J(`div`,bo,[[`Lowpass (低通)`,`Highpass (高通)`].includes(e.filterType)?(q(),J(`div`,xo,[Y(`label`,So,[t[79]||=Y(`span`,null,`截止頻率 f_c (Hz)`,-1),Y(`span`,Co,A(e.formatK(e.params.fc)),1)]),V(Y(`input`,{type:`range`,"onUpdate:modelValue":t[6]||=t=>e.params.fc=t,onInput:t[7]||=(...t)=>e.debouncedApply&&e.debouncedApply(...t),min:1,max:e.fs/2,class:`w-full accent-blue-500 mb-2`},null,40,wo),[[$,e.params.fc,void 0,{number:!0}]]),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[8]||=t=>e.params.fc=t,onChange:t[9]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base focus:border-blue-500 outline-none text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.fc,void 0,{number:!0}]]),t[80]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mt-3 mb-2 block`},`階數 Order`,-1),Y(`div`,To,[(q(),J(G,null,H([1,2,3],t=>Y(`button`,{key:t,onClick:n=>{e.params.order=t,e.applyFilterDesign()},class:k([e.params.order===t?`bg-blue-600 text-white border-blue-500`:`bg-slate-200 dark:bg-gray-800 text-slate-600 dark:text-gray-400 border-slate-300 dark:border-gray-700`,`flex-1 rounded py-2.5 text-base font-medium border transition-colors`])},A(t),11,Eo)),64))])])):Z(``,!0),e.filterType===`Bandpass (帶通)`?(q(),J(`div`,Do,[Y(`label`,Oo,[t[81]||=Y(`span`,null,`下截止頻率 f_low (Hz)`,-1),Y(`span`,ko,A(e.formatK(e.params.bp_f_low)),1)]),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[10]||=t=>e.params.bp_f_low=t,onChange:t[11]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base mb-2 text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.bp_f_low,void 0,{number:!0}]]),Y(`label`,Ao,[t[82]||=Y(`span`,null,`上截止頻率 f_high (Hz)`,-1),Y(`span`,jo,A(e.formatK(e.params.bp_f_high)),1)]),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[12]||=t=>e.params.bp_f_high=t,onChange:t[13]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base mb-2 text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.bp_f_high,void 0,{number:!0}]]),t[83]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mt-2 mb-2 block`},`階數 Order`,-1),Y(`div`,Mo,[(q(),J(G,null,H([1,2,3],t=>Y(`button`,{key:t,onClick:n=>{e.params.bp_order=t,e.applyFilterDesign()},class:k([e.params.bp_order===t?`bg-blue-600 text-white border-blue-500`:`bg-slate-200 dark:bg-gray-800 text-slate-600 dark:text-gray-400 border-slate-300 dark:border-gray-700`,`flex-1 rounded py-1.5 text-sm border transition-colors`])},A(t),11,No)),64))])])):Z(``,!0),e.filterType===`Notch (陷波器)`?(q(),J(`div`,Po,[Y(`div`,null,[t[84]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-2 block`},`中心頻率 f_0 (Hz)`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[14]||=t=>e.params.notch_f0=t,onChange:t[15]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.notch_f0,void 0,{number:!0}]])]),Y(`div`,null,[t[85]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-2 block`},`品質因數 Q`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[16]||=t=>e.params.notch_q=t,onChange:t[17]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),step:`0.1`,class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.notch_q,void 0,{number:!0}]])])])):Z(``,!0),e.filterType===`1P1Z (一極一零)`?(q(),J(`div`,Fo,[Y(`div`,null,[t[86]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-2 block`},`零點頻率 Freq_z (Hz)`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[18]||=t=>e.params.opoz_fz=t,onChange:t[19]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.opoz_fz,void 0,{number:!0}]])]),Y(`div`,null,[t[87]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-2 block`},`極點頻率 Freq_p (Hz)`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[20]||=t=>e.params.opoz_fp=t,onChange:t[21]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.opoz_fp,void 0,{number:!0}]])])])):Z(``,!0),e.filterType===`2P2Z (二極二零)`?(q(),J(`div`,Io,[Y(`div`,null,[t[88]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-2 block`},`零點頻率 1 Freq_z1 (Hz)`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[22]||=t=>e.params.tptz_fz1=t,onChange:t[23]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.tptz_fz1,void 0,{number:!0}]])]),Y(`div`,null,[t[89]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-2 block`},`零點頻率 2 Freq_z2 (Hz)`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[24]||=t=>e.params.tptz_fz2=t,onChange:t[25]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.tptz_fz2,void 0,{number:!0}]])]),Y(`div`,null,[t[90]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-2 block`},`極點頻率 1 Freq_p1 (Hz)`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[26]||=t=>e.params.tptz_fp1=t,onChange:t[27]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.tptz_fp1,void 0,{number:!0}]])]),Y(`div`,null,[t[91]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-2 block`},`極點頻率 2 Freq_p2 (Hz)`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[28]||=t=>e.params.tptz_fp2=t,onChange:t[29]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.tptz_fp2,void 0,{number:!0}]])])])):Z(``,!0),e.filterType===`PID 控制器`?(q(),J(`div`,Lo,[(q(),J(G,null,H([{key:`kp`,label:`比例增益 Kp`},{key:`ki`,label:`積分增益 Ki`},{key:`kd`,label:`微分增益 Kd`}],n=>Y(`div`,{key:n.key},[Y(`label`,Ro,A(n.label),1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t=>e.params[n.key]=t,onChange:t[30]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),step:`0.0001`,class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-3 text-base focus:border-blue-500 outline-none text-slate-900 dark:text-gray-100`},null,40,zo),[[$,e.params[n.key],void 0,{number:!0}]])])),64))])):Z(``,!0),e.filterType===`SOGI-Alpha (帶通)`||e.filterType===`SOGI-Beta (低通)`?(q(),J(`div`,Bo,[Y(`div`,null,[t[92]||=Y(`label`,{class:`text-xs text-slate-500 dark:text-gray-400 mb-1 block`},`中心頻率 f_0 (Hz)`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[31]||=t=>e.params.sogi_f0=t,onChange:t[32]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-2 text-sm text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.sogi_f0,void 0,{number:!0}]])]),Y(`div`,null,[t[93]||=Y(`label`,{class:`text-xs text-slate-500 dark:text-gray-400 mb-1 block`},`阻尼因數 k`,-1),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[33]||=t=>e.params.sogi_k=t,onChange:t[34]||=(...t)=>e.applyFilterDesign&&e.applyFilterDesign(...t),step:`0.001`,class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded p-2 text-sm text-slate-900 dark:text-gray-100`},null,544),[[$,e.params.sogi_k,void 0,{number:!0}]])])])):Z(``,!0),t[94]||=Y(`div`,{class:`bg-blue-100 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-800/50 rounded-lg p-3 text-sm text-blue-700 dark:text-blue-300 mt-2`},` 💡 調整上方參數會自動覆寫 a, b 係數。你也可以隨時手動修改下方係數進行微調! `,-1)]))]),t[118]||=Y(`hr`,{class:`border-slate-200 dark:border-gray-800`},null,-1),Y(`section`,null,[t[97]||=Y(`h2`,{class:`text-sm font-semibold text-slate-500 dark:text-gray-400 uppercase tracking-wider mb-3`},` 系統參數`,-1),Y(`div`,Vo,[Y(`div`,null,[Y(`label`,Ho,[t[95]||=Y(`span`,null,`取樣頻率 fs (Hz)`,-1),Y(`span`,Uo,A(e.formatK(e.fs)),1)]),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[35]||=t=>e.fs=t,onInput:t[36]||=(...t)=>e.debouncedApply&&e.debouncedApply(...t),onKeydown:t[37]||=(...t)=>e.onlyNumberKey&&e.onlyNumberKey(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded-lg p-3 text-base focus:border-blue-500 outline-none transition-all text-slate-900 dark:text-gray-100`},null,544),[[$,e.fs,void 0,{number:!0}]])]),Y(`div`,null,[Y(`label`,Wo,[t[96]||=Y(`span`,null,`系統增益 K (System Gain)`,-1),Y(`span`,Go,A(e.systemGain)+`x`,1)]),V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[38]||=t=>e.systemGain=t,onInput:t[39]||=(...t)=>e.onGainChange&&e.onGainChange(...t),step:`0.1`,onKeydown:t[40]||=(...t)=>e.onlyNumberKey&&e.onlyNumberKey(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded-lg p-3 text-base focus:border-blue-500 outline-none transition-all text-slate-900 dark:text-gray-100`},null,544),[[$,e.systemGain,void 0,{number:!0}]])])])]),t[119]||=Y(`hr`,{class:`border-slate-200 dark:border-gray-800`},null,-1),Y(`section`,null,[Y(`h2`,Ko,[t[98]||=Y(`span`,null,`濾波器係數設定`,-1),Y(`div`,qo,[e.isManualDirty?(q(),J(`button`,{key:0,onClick:t[41]||=(...t)=>e.clearManualAdjustments&&e.clearManualAdjustments(...t),class:`text-[10px] font-bold bg-slate-200 dark:bg-gray-800 hover:bg-slate-300 dark:hover:bg-gray-700 px-2 py-1 rounded text-slate-500 transition-colors uppercase mr-1`},`重設`)):Z(``,!0),Y(`button`,{onClick:t[42]||=(...t)=>e.updateFromText&&e.updateFromText(...t),class:`text-[10px] font-bold bg-blue-600 hover:bg-blue-500 text-white px-3 py-1 rounded transition-colors uppercase shadow-sm`},`套用`)])]),Y(`div`,Jo,[t[99]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-1 block`},`前饋分子係數 b (b0 ~ b6)`,-1),Y(`div`,Yo,[(q(!0),J(G,null,H(e.floatingCoeffs.b,e=>(q(),J(`div`,{key:e.label,class:`bg-blue-50 dark:bg-blue-900/30 px-1.5 py-0.5 rounded border border-blue-100 dark:border-blue-800/20 flex gap-1 items-center`},[Y(`span`,Xo,A(e.label)+`:`,1),Y(`span`,Zo,A(e.val),1)]))),128))]),V(Y(`textarea`,{"onUpdate:modelValue":t[43]||=t=>e.b_str=t,onInput:t[44]||=t=>e.debouncedUpdateFromText(`b`),onKeydown:t[45]||=(...t)=>e.onlyNumberKey&&e.onlyNumberKey(...t),rows:`2`,class:`w-full bg-slate-50 dark:bg-gray-900 border border-slate-200 dark:border-gray-700 rounded-lg p-3 text-sm focus:border-blue-500 outline-none font-mono resize-none leading-relaxed text-blue-700 dark:text-blue-300`},null,544),[[$,e.b_str]])]),Y(`details`,Qo,[t[101]||=Y(`summary`,{class:`text-sm text-slate-500 dark:text-gray-400 px-3 py-3 cursor-pointer hover:text-slate-600 dark:hover:text-gray-300`},` b 係數倍率微調`,-1),Y(`div`,$o,[Y(`div`,es,[t[100]||=Y(`span`,{class:`text-xs text-slate-400 dark:text-gray-500`},`靈敏度:`,-1),(q(),J(G,null,H([`1%`,`2x`,`10x`],t=>Y(`button`,{key:t,onClick:n=>e.sense_b=t,class:k([e.sense_b===t?`bg-blue-600 text-white`:`bg-slate-200 dark:bg-gray-800 text-slate-500 dark:text-gray-400`,`btn-small px-3 py-1.5 rounded text-xs font-medium border border-slate-300 dark:border-gray-700`])},A(t),11,ts)),64)),Y(`button`,{onClick:t[46]||=(...t)=>e.resetSlidersB&&e.resetSlidersB(...t),class:`btn-small ml-auto px-3 py-1.5 rounded text-xs font-medium bg-slate-200 dark:bg-gray-800 text-slate-500 dark:text-gray-400 border border-slate-300 dark:border-gray-700 hover:bg-slate-300 dark:hover:bg-gray-700`},`重置`)]),(q(),J(G,null,H(7,n=>(q(),J(G,{key:`bs`+n},[e.baseB[n-1]===0?Z(``,!0):(q(),J(`div`,ns,[Y(`label`,rs,[Y(`span`,null,`b`+A(n-1)+` (基準: `+A((e.baseB[n-1]*(e.systemGain||1)).toPrecision(6))+`)`,1),e.outOfRangeB[n-1]?(q(),J(`span`,is,`⚠️ 超出滑桿範圍`)):Z(``,!0)]),V(Y(`input`,{type:`range`,"onUpdate:modelValue":t=>e.bSliders[n-1]=t,onInput:t[47]||=(...t)=>e.updateFromControls&&e.updateFromControls(...t),min:-e.maxLogB,max:e.maxLogB,step:e.maxLogB/100,class:`w-full accent-blue-500`},null,40,as),[[$,e.bSliders[n-1],void 0,{number:!0}]])]))],64))),64))])]),Y(`div`,os,[t[102]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-1 block`},`回饋分母係數 a (a0=1, a1 ~ a6)`,-1),Y(`div`,ss,[(q(!0),J(G,null,H(e.floatingCoeffs.a,e=>(q(),J(`div`,{key:e.label,class:`bg-orange-50 dark:bg-orange-900/30 px-1.5 py-0.5 rounded border border-orange-100 dark:border-orange-800/20 flex gap-1 items-center`},[Y(`span`,cs,A(e.label)+`:`,1),Y(`span`,ls,A(e.val),1)]))),128))]),V(Y(`textarea`,{"onUpdate:modelValue":t[48]||=t=>e.a_str=t,onInput:t[49]||=t=>e.debouncedUpdateFromText(`a`),onKeydown:t[50]||=(...t)=>e.onlyNumberKey&&e.onlyNumberKey(...t),rows:`2`,class:`w-full bg-slate-50 dark:bg-gray-900 border border-slate-200 dark:border-gray-700 rounded-lg p-3 text-sm focus:border-blue-500 outline-none font-mono resize-none leading-relaxed text-orange-700 dark:text-orange-300`},null,544),[[$,e.a_str]])]),Y(`details`,us,[t[104]||=Y(`summary`,{class:`text-sm text-slate-500 dark:text-gray-400 px-3 py-3 cursor-pointer hover:text-slate-600 dark:hover:text-gray-300`},` a 係數倍率微調`,-1),Y(`div`,ds,[Y(`div`,fs,[t[103]||=Y(`span`,{class:`text-xs text-slate-400 dark:text-gray-500`},`靈敏度:`,-1),(q(),J(G,null,H([`1%`,`2x`,`10x`],t=>Y(`button`,{key:t,onClick:n=>e.sense_a=t,class:k([e.sense_a===t?`bg-blue-600 text-white`:`bg-slate-200 dark:bg-gray-800 text-slate-500 dark:text-gray-400`,`px-3 py-1.5 rounded text-xs font-medium border border-slate-300 dark:border-gray-700`])},A(t),11,ps)),64)),Y(`button`,{onClick:t[51]||=(...t)=>e.resetSlidersA&&e.resetSlidersA(...t),class:`btn-small ml-auto px-3 py-1.5 rounded text-xs font-medium bg-slate-200 dark:bg-gray-800 text-slate-500 dark:text-gray-400 border border-slate-300 dark:border-gray-700 hover:bg-slate-300 dark:hover:bg-gray-700`},`重置`)]),(q(),J(G,null,H(6,n=>(q(),J(G,{key:`as`+n},[e.baseA[n]===0?Z(``,!0):(q(),J(`div`,ms,[Y(`label`,hs,[Y(`span`,null,`a`+A(n)+` (基準: `+A(e.baseA[n].toPrecision(6))+`)`,1),e.outOfRangeA[n]?(q(),J(`span`,gs,`⚠️ 超出滑桿範圍`)):Z(``,!0)]),V(Y(`input`,{type:`range`,"onUpdate:modelValue":t=>e.aSliders[n]=t,onInput:t[52]||=(...t)=>e.updateFromControls&&e.updateFromControls(...t),min:-e.maxLogA,max:e.maxLogA,step:e.maxLogA/100,class:`w-full accent-orange-500`},null,40,_s),[[$,e.aSliders[n],void 0,{number:!0}]])]))],64))),64))])]),Y(`div`,vs,[e.showAdvancedAdjustment?Z(``,!0):(q(),J(`button`,{key:0,onClick:t[53]||=(...t)=>e.enableAdvancedAdjustment&&e.enableAdvancedAdjustment(...t),class:`w-full py-3 border-2 border-dashed border-slate-200 dark:border-gray-800 rounded-xl text-slate-400 dark:text-gray-500 text-xs font-bold hover:bg-slate-50 dark:hover:bg-gray-800/50 hover:border-indigo-300 dark:hover:border-indigo-900 transition-all flex items-center justify-center gap-2`},[...t[105]||=[Y(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4`})],-1),X(` 開啟進階係數關聯調整 (a1, a2) `,-1)]])),e.showAdvancedAdjustment?(q(),J(`div`,ys,[t[112]||=Y(`h3`,{class:`text-xs font-bold text-slate-500 dark:text-gray-400 uppercase tracking-widest mb-4 flex items-center gap-2`},[Y(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 10V3L4 14h7v7l9-11h-7z`})]),X(` 進階係數關聯調整 `)],-1),Y(`div`,bs,[Y(`label`,xs,[t[106]||=Y(`span`,null,`差距 (a1 - a2)`,-1),Y(`span`,Ss,A(e.a1a2Diff.toFixed(3)),1)]),V(Y(`input`,{type:`range`,"onUpdate:modelValue":t[54]||=t=>e.a1a2Diff=t,min:`-4`,max:`4`,step:`0.001`,onInput:t[55]||=(...t)=>e.updateA1A2FromRelationship&&e.updateA1A2FromRelationship(...t),class:`w-full accent-indigo-500 h-1.5 bg-slate-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer`},null,544),[[$,e.a1a2Diff,void 0,{number:!0}]])]),Y(`div`,Cs,[Y(`label`,ws,[t[107]||=Y(`span`,null,`平移 (a1 + a2)`,-1),Y(`span`,Ts,A(e.a1a2Sum.toFixed(3)),1)]),V(Y(`input`,{type:`range`,"onUpdate:modelValue":t[56]||=t=>e.a1a2Sum=t,min:`-4`,max:`4`,step:`0.001`,onInput:t[57]||=(...t)=>e.updateA1A2FromRelationship&&e.updateA1A2FromRelationship(...t),class:`w-full accent-emerald-500 h-1.5 bg-slate-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer`},null,544),[[$,e.a1a2Sum,void 0,{number:!0}]])]),Y(`div`,Es,[Y(`div`,Ds,[t[109]||=Y(`span`,{class:`text-[9px] text-slate-400 block uppercase font-bold mb-1`},`a1 變化預覽`,-1),Y(`div`,Os,[Y(`span`,ks,A(e.currentA1.toFixed(3)),1),t[108]||=Y(`svg`,{class:`w-2.5 h-2.5 text-slate-300`,fill:`currentColor`,viewBox:`0 0 20 20`},[Y(`path`,{"fill-rule":`evenodd`,d:`M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z`,"clip-rule":`evenodd`})],-1),Y(`span`,As,A(e.previewA1.toFixed(3)),1)])]),Y(`div`,js,[t[111]||=Y(`span`,{class:`text-[9px] text-slate-400 block uppercase font-bold mb-1`},`a2 變化預覽`,-1),Y(`div`,Ms,[Y(`span`,Ns,A(e.currentA2.toFixed(3)),1),t[110]||=Y(`svg`,{class:`w-2.5 h-2.5 text-slate-300`,fill:`currentColor`,viewBox:`0 0 20 20`},[Y(`path`,{"fill-rule":`evenodd`,d:`M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z`,"clip-rule":`evenodd`})],-1),Y(`span`,Ps,A(e.previewA2.toFixed(3)),1)])])]),t[113]||=Y(`div`,{class:`bg-amber-50 dark:bg-amber-900/20 border border-amber-100 dark:border-amber-800/30 rounded-lg p-3`},[Y(`p`,{class:`text-[10px] text-amber-700 dark:text-amber-400 leading-relaxed`},[Y(`span`,{class:`font-bold`},`運算說明:`),Y(`br`),X(` 調整時,系統會先將現有係數四捨五入至三位小數再計算基準值。調整結果會自動將 a1, a2 存回為三位小數精度。 `)])],-1)])):Z(``,!0)])]),t[120]||=Y(`hr`,{class:`border-slate-200 dark:border-gray-800`},null,-1),Y(`section`,null,[Y(`h2`,Fs,[Y(`div`,Is,[t[114]||=Y(`span`,null,`定點數係數轉換`,-1),Y(`span`,Ls,`Q`+A(e.shiftBits),1)]),Y(`div`,Rs,[Object.keys(e.fixedOverrides.a).length>0||Object.keys(e.fixedOverrides.b).length>0?(q(),J(`button`,{key:0,onClick:t[58]||=(...t)=>e.clearFixedOverrides&&e.clearFixedOverrides(...t),class:`text-[10px] font-bold bg-slate-200 dark:bg-gray-800 hover:bg-slate-300 dark:hover:bg-gray-700 px-2 py-1 rounded text-slate-500 transition-colors uppercase mr-1`},`重設`)):Z(``,!0),Y(`button`,{onClick:t[59]||=(...t)=>e.updateBodePlot&&e.updateBodePlot(...t),class:`text-[10px] font-bold bg-emerald-600 hover:bg-emerald-500 text-white px-3 py-1 rounded transition-colors uppercase shadow-sm`},`套用`)])]),Y(`div`,zs,[t[115]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-1 block`},`左移位元數 (Shift Bits: 0~14)`,-1),Y(`div`,Bs,[V(Y(`input`,{type:`number`,"onUpdate:modelValue":t[60]||=t=>e.shiftBits=t,min:`0`,max:`14`,onChange:t[61]||=(...t)=>e.clearFixedOverrides&&e.clearFixedOverrides(...t),onKeydown:t[62]||=(...t)=>e.onlyNumberKey&&e.onlyNumberKey(...t),class:`w-full bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded-lg p-3 text-base focus:border-blue-500 outline-none transition-all text-slate-900 dark:text-gray-100`},null,544),[[$,e.shiftBits,void 0,{number:!0}]])]),Y(`p`,Vs,`Scaling: 2^`+A(e.shiftBits)+` (`+A(2**e.shiftBits)+`)`,1)]),Y(`div`,Hs,[Y(`div`,null,[t[116]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-1 block`},`定點分子係數 b (Integers)`,-1),Y(`div`,Us,[(q(!0),J(G,null,H(e.fixedPointCoeffs.b,(e,t)=>(q(),J(`div`,{key:e.label,class:k([e.isOverridden?`border-blue-400 ring-1 ring-blue-400/20`:`border-blue-100 dark:border-blue-800/30`,`bg-blue-50 dark:bg-blue-900/20 px-1.5 py-0.5 rounded border flex items-center gap-1 transition-all`])},[Y(`span`,Ws,A(e.label)+`:`,1),Y(`span`,{class:k([`text-[10px] font-mono text-blue-700 dark:text-blue-300 font-bold`,{italic:!e.isOverridden}])},A(e.val),3)],2))),128))]),V(Y(`textarea`,{"onUpdate:modelValue":t[63]||=t=>e.b_int_str=t,onKeydown:t[64]||=t=>e.onlyNumberKey(t,!1),rows:`2`,class:`w-full bg-slate-50 dark:bg-gray-900 border border-slate-200 dark:border-gray-700 rounded-lg p-3 text-sm focus:border-blue-500 outline-none font-mono resize-none leading-relaxed text-blue-700 dark:text-blue-300`},null,544),[[$,e.b_int_str]])]),Y(`div`,null,[t[117]||=Y(`label`,{class:`text-sm text-slate-500 dark:text-gray-400 mb-1 block`},`定點分母係數 a (Integers)`,-1),Y(`div`,Gs,[(q(!0),J(G,null,H(e.fixedPointCoeffs.a,(e,t)=>(q(),J(`div`,{key:e.label,class:k([e.isOverridden?`border-orange-400 ring-1 ring-orange-400/20`:`border-orange-100 dark:border-orange-800/30`,`bg-orange-50 dark:bg-orange-900/20 px-1.5 py-0.5 rounded border flex items-center gap-1 transition-all`])},[Y(`span`,Ks,A(e.label)+`:`,1),Y(`span`,{class:k([`text-[10px] font-mono text-orange-700 dark:text-orange-300 font-bold`,{italic:!e.isOverridden}])},A(e.val),3)],2))),128))]),V(Y(`textarea`,{"onUpdate:modelValue":t[65]||=t=>e.a_int_str=t,onKeydown:t[66]||=t=>e.onlyNumberKey(t,!1),rows:`2`,class:`w-full bg-slate-50 dark:bg-gray-900 border border-slate-200 dark:border-gray-700 rounded-lg p-3 text-sm focus:border-blue-500 outline-none font-mono resize-none leading-relaxed text-orange-700 dark:text-orange-300`},null,544),[[$,e.a_int_str]])])]),Y(`p`,qs,`註:此數值為原始係數乘以 2^`+A(e.shiftBits)+` 後四捨五入之結果,可用於定點數 DSP 實作。`,1)])],2),Y(`main`,{class:k([e.mobileTab===`chart`?`flex bg-white dark:bg-[#0f0f0f] !p-0`:`hidden`,`lg:flex flex-1 flex-col overflow-y-auto bg-slate-50 dark:bg-[#0f0f0f] lg:p-6 gap-0 lg:gap-6 custom-scrollbar relative transition-colors duration-300`])},[e.globalError?(q(),J(`div`,Js,[t[121]||=Y(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),X(` `+A(e.globalError)+` `,1),Y(`button`,{onClick:t[67]||=t=>e.globalError=null,class:`ml-2 hover:text-red-900 dark:hover:text-red-200`},`×`)])):Z(``,!0),Y(`div`,Ys,[t[124]||=Y(`div`,{class:`hidden lg:block absolute inset-0 bg-gradient-to-br from-blue-500/5 to-purple-500/5 pointer-events-none`},null,-1),Y(`div`,Xs,[t[123]||=Y(`h3`,{class:`font-bold text-slate-800 dark:text-gray-200 tracking-wide`},`1. 頻率響應 (Frequency Response)`,-1),e.loadingBode?(q(),J(`div`,Zs,[...t[122]||=[Y(`span`,{class:`w-2 h-2 rounded-full bg-blue-500 dark:bg-blue-400 animate-ping`},null,-1),X(` 重新計算中... `,-1)]])):Z(``,!0)]),t[125]||=Y(`div`,{class:`overflow-x-auto bg-white dark:bg-dark`},[Y(`div`,{id:`bodePlot`,class:`min-w-[580px] w-full h-[800px] z-10 relative bg-white dark:bg-dark`})],-1)]),Y(`div`,Qs,[t[133]||=Y(`div`,{class:`px-5 py-4 border-b border-slate-100 dark:border-gray-800 bg-white dark:bg-dark backdrop-blur-sm z-10 relative`},[Y(`h3`,{class:`font-bold text-slate-800 dark:text-gray-200 tracking-wide`},`2. 時域訊號探討`)],-1),Y(`div`,$s,[t[132]||=Y(`p`,{class:`text-base text-slate-500 dark:text-gray-400 mb-4`},`請上傳包含時域訊號的 CSV 檔案,系統會套用上述設定的差分濾波器。 `,-1),Y(`div`,ec,[Y(`label`,tc,[t[126]||=Y(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12`})],-1),t[127]||=X(` 上傳輸入訊號 (CSV) `,-1),Y(`input`,{type:`file`,ref:`fileInput`,accept:`.csv`,onChange:t[68]||=(...t)=>e.handleFileUpload&&e.handleFileUpload(...t),class:`hidden`},null,544)]),e.csvFile?(q(),J(`span`,nc,A(e.csvFile.name),1)):Z(``,!0),e.csvColumns.length>0?(q(),J(`div`,rc)):Z(``,!0),e.csvColumns.length>0?(q(),J(`div`,ic,[t[128]||=Y(`span`,{class:`text-sm text-slate-400`},`訊號欄位:`,-1),V(Y(`select`,{"onUpdate:modelValue":t[69]||=t=>e.selectedColumn=t,class:`bg-white dark:bg-gray-800 border border-slate-200 dark:border-gray-700 rounded-lg p-3 text-base focus:border-blue-500 outline-none text-slate-900 dark:text-gray-100`},[(q(!0),J(G,null,H(e.csvColumns,(e,t)=>(q(),J(`option`,{key:t,value:t},A(e),9,ac))),128))],512),[[Qa,e.selectedColumn]])])):Z(``,!0),e.csvFile?(q(),J(`button`,{key:3,onClick:t[70]||=(...t)=>e.processFilter&&e.processFilter(...t),class:`bg-emerald-600 hover:bg-emerald-500 text-white px-6 py-3 rounded-lg text-base font-semibold transition-all shadow-md hover:shadow-emerald-500/20 disabled:opacity-50 disabled:cursor-not-allowed`,disabled:e.loadingFilter},A(e.loadingFilter?`處理中...`:`套用當前濾波器`),9,oc)):Z(``,!0),e.filterDone?(q(),J(`button`,{key:4,onClick:t[71]||=(...t)=>e.downloadCsv&&e.downloadCsv(...t),class:`ml-auto bg-slate-700 hover:bg-slate-600 text-white px-5 py-3 rounded-lg text-base font-semibold transition-all flex items-center gap-2`},[...t[129]||=[Y(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4`})],-1),X(` 匯出結果 `,-1)]])):Z(``,!0)]),e.csvPreview.length>0?(q(),J(`div`,sc,[t[130]||=Y(`h4`,{class:`text-sm font-semibold text-slate-500 dark:text-gray-400 mb-2 uppercase tracking-tight`},` 資料預覽 (前五筆):`,-1),Y(`div`,cc,[Y(`table`,lc,[Y(`thead`,null,[Y(`tr`,uc,[(q(!0),J(G,null,H(e.csvColumns,e=>(q(),J(`th`,{key:e,class:`px-4 py-3 font-semibold text-slate-700 dark:text-gray-300`},A(e),1))),128))])]),Y(`tbody`,dc,[(q(!0),J(G,null,H(e.csvPreview,(e,t)=>(q(),J(`tr`,{key:t,class:`hover:bg-slate-50/50 dark:hover:bg-gray-800/30 transition-colors`},[(q(!0),J(G,null,H(e,(e,t)=>(q(),J(`td`,{key:t,class:`px-4 py-2 font-mono text-slate-600 dark:text-gray-400`},A(e),1))),128))]))),128))])])])])):Z(``,!0),e.filterDone?(q(),J(`h4`,fc,`波形比較圖 `)):Z(``,!0),Y(`div`,pc,[V(Y(`div`,mc,null,512),[[va,e.filterDone]])]),!e.filterDone&&!e.loadingFilter&&e.csvPreview.length===0?(q(),J(`div`,hc,[...t[131]||=[Y(`svg`,{class:`w-12 h-12 mb-3 opacity-50`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[Y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`1.5`,d:`M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z`})],-1),Y(`p`,null,`請上傳包含時間序列的 CSV 檔案進行測試`,-1)]])):Z(``,!0)])])],2)]),t[134]||=Y(`footer`,{class:`bg-white dark:bg-dark border-t border-slate-200 dark:border-gray-800 py-2 text-center z-20 transition-colors duration-300`},[Y(`p`,{class:`text-xs text-slate-400 dark:text-gray-600`},`© 2026 喆富創新科技股份有限公司. All rights reserved.`)],-1)])}io(co(so,[[`render`,gc]])).mount(`#dea-root`);
\ No newline at end of file
diff --git a/static/build/index.html b/static/build/index.html
new file mode 100644
index 0000000..f4f2e36
--- /dev/null
+++ b/static/build/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+ 差分方程式分析 (Difference Equation Analyzer)
+
+
+
+
+
+
+
+
+
diff --git a/static/index.html b/static/index.html
index 0df25f0..d4180b8 100644
--- a/static/index.html
+++ b/static/index.html
@@ -5,645 +5,14 @@
差分方程式分析 (Difference Equation Analyzer)
-
-
-
-
+
-
-
-
-
-

-
- 差分方程式分析 (Difference Equation Analyzer)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ globalError }}
-
-
-
-
-
-
-
-
-
1. 頻率響應 (Frequency
- Response)
-
-
- 重新計算中...
-
-
-
-
-
-
-
-
-
-
2. 時域訊號探討
-
-
-
請上傳包含時域訊號的 CSV 檔案,系統會套用上述設定的差分濾波器。
-
-
-
-
{{
- csvFile.name }}
-
-
-
-
- 訊號欄位:
-
-
-
-
-
-
-
-
-
-
-
- 資料預覽 (前五筆):
-
-
-
-
- | {{ col
- }} |
-
-
-
-
- | {{ val }}
- |
-
-
-
-
-
-
-
-
波形比較圖
-
-
-
-
-
-
-
請上傳包含時間序列的 CSV 檔案進行測試
-
-
-
-
-
-
-
-
-
+
+
-