feat(clawbot): add native WeChat ClawBot protocol engine (clawbot.py) and WechatClawModal UI

Browse Source
This commit is contained in:
Yin Kou committed 2026-11-07 00:51:38 +08:00
1 parent 07d2050c5f
commit 8fa46a2b8d
14 files changed
+1551 -201

No files matched your search

+599
View File
@@ -0,0 +1,599 @@
#!/usr/bin/env python3
# ==============================================================================
# HomeLab WeChat ClawBot Engine (Tencent iLink Bot Protocol v2.4.10)
# 100% 兼容 @tencent-weixin/openclaw-weixin 官方协议 (ilinkai.weixin.qq.com)
# 支持:
# 1. 生成微信 ClawBot 绑定二维码 & 轮询扫码状态 (支持 IDC 重定向与配对验证码)
# 2. 7x24h 长轮询接收微信消息 (getupdates) + "正在输入..." 状态推送 (sendtyping)
# 3. 微信内直接查询 Mac mini / 极空间状态、触发备份、执行终端指令、与 AGY AI 对话
# ==============================================================================
import base64
import json
import os
import random
import re
import subprocess
import threading
import time
import urllib.error
import urllib.parse
import urllib.request
import uuid
from pathlib import Path
FIXED_BASE_URL = "https://ilinkai.weixin.qq.com"
DEFAULT_BOT_TYPE = "3"
CHANNEL_VERSION = "2.4.10"
# (2 << 16) | (4 << 8) | 10 = 132106
ILINK_CLIENT_VERSION = str((2 << 16) | (4 << 8) | 10)
ILINK_APP_ID = "bot"
STATE_DIR = Path("/Users/ixvii0iv/homelab/stacks/wechat-bot")
SESSION_FILE = STATE_DIR / "clawbot_session.json"
SYNC_BUF_FILE = STATE_DIR / "clawbot_sync_buf.txt"
def _random_wechat_uin() -> str:
uint32 = random.randint(10000000, 0xFFFFFFFF)
return base64.b64encode(str(uint32).encode("utf-8")).decode("utf-8")
def _common_headers() -> dict:
return {
"iLink-App-Id": ILINK_APP_ID,
"iLink-App-ClientVersion": ILINK_CLIENT_VERSION,
}
def _post_headers(token: str = "") -> dict:
h = {
"Content-Type": "application/json",
"AuthorizationType": "ilink_bot_token",
"X-WECHAT-UIN": _random_wechat_uin(),
**_common_headers(),
}
if token.strip():
h["Authorization"] = f"Bearer {token.strip()}"
return h
def _base_info() -> dict:
return {
"channel_version": CHANNEL_VERSION,
"bot_agent": "OpenClaw",
}
def _parse_lossless_json(raw_text: str) -> dict:
# Quote uint64 message_id / msg_id / svr_id fields so JS/Python keeps exact strings
patched = re.sub(
r'("(?:message_id|msg_id|svr_id)"\s*:\s*)(-?\d+)',
r'\1"\2"',
raw_text,
)
return json.loads(patched)
def _api_get(base_url: str, endpoint: str, timeout: float = 36.0) -> dict:
url = base_url.rstrip("/") + "/" + endpoint.lstrip("/")
req = urllib.request.Request(url, headers=_common_headers(), method="GET")
with urllib.request.urlopen(req, timeout=timeout) as resp:
raw = resp.read().decode("utf-8")
return _parse_lossless_json(raw)
def _api_post(base_url: str, endpoint: str, payload: dict, token: str = "", timeout: float = 20.0) -> dict:
url = base_url.rstrip("/") + "/" + endpoint.lstrip("/")
data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
req = urllib.request.Request(url, data=data, headers=_post_headers(token), method="POST")
with urllib.request.urlopen(req, timeout=timeout) as resp:
raw = resp.read().decode("utf-8")
return _parse_lossless_json(raw)
class ClawBotManager:
def __init__(self, telemetry_fn=None, action_runner_fn=None):
STATE_DIR.mkdir(parents=True, exist_ok=True)
self.telemetry_fn = telemetry_fn
self.action_runner_fn = action_runner_fn
self._lock = threading.Lock()
# Saved session credentials
self.session = self._load_session()
# Active QR login state
self.login_state = {
"active": False,
"qrcode": "",
"qrcode_url": "",
"status": "idle", # idle | wait | scaned | need_verifycode | confirmed | expired | error
"message": "尚未发起扫码登录",
"api_base_url": FIXED_BASE_URL,
"pending_verify_code": "",
"started_at": 0.0,
}
# Runtime monitor stats
self.last_event_ts = 0.0
self.last_inbound_text = ""
self.last_reply_text = ""
self.msg_count = 0
self._stop_event = threading.Event()
self._monitor_thread = None
if self.is_connected():
self._start_monitor_thread()
def _load_session(self) -> dict:
if SESSION_FILE.exists():
try:
return json.loads(SESSION_FILE.read_text(encoding="utf-8"))
except Exception:
pass
return {}
def _save_session(self, data: dict):
self.session = data
SESSION_FILE.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
def is_connected(self) -> bool:
return bool(self.session.get("bot_token") and self.session.get("ilink_bot_id"))
def get_public_status(self) -> dict:
return {
"connected": self.is_connected(),
"bot_id": self.session.get("ilink_bot_id", ""),
"user_id": self.session.get("ilink_user_id", ""),
"base_url": self.session.get("baseurl", FIXED_BASE_URL),
"connected_at": self.session.get("connected_at", ""),
"msg_count": self.msg_count,
"last_inbound_text": self.last_inbound_text,
"last_reply_text": self.last_reply_text,
"login": {
"active": self.login_state["active"],
"qrcode_url": self.login_state["qrcode_url"],
"status": self.login_state["status"],
"message": self.login_state["message"],
},
}
# ------------------------------------------------------------------
# 1. QR Code Login Flow
# ------------------------------------------------------------------
def start_qr_login(self) -> dict:
try:
local_tokens = [self.session["bot_token"]] if self.session.get("bot_token") else []
resp = _api_post(
FIXED_BASE_URL,
f"ilink/bot/get_bot_qrcode?bot_type={DEFAULT_BOT_TYPE}",
{"local_token_list": local_tokens},
timeout=12.0,
)
qrcode = resp.get("qrcode", "")
qrcode_url = resp.get("qrcode_img_content", "")
if not qrcode or not qrcode_url:
raise RuntimeError(f"未获取到二维码: {resp}")
with self._lock:
self.login_state = {
"active": True,
"qrcode": qrcode,
"qrcode_url": qrcode_url,
"status": "wait",
"message": "请使用手机微信扫描二维码(或在微信 ClawBot 页面点击「开始扫一扫」)",
"api_base_url": FIXED_BASE_URL,
"pending_verify_code": "",
"started_at": time.time(),
}
t = threading.Thread(target=self._poll_qr_worker, args=(qrcode,), daemon=True)
t.start()
return {"ok": True, **self.get_public_status()}
except Exception as e:
with self._lock:
self.login_state["status"] = "error"
self.login_state["message"] = f"获取二维码失败: {e}"
return {"ok": False, "message": str(e)}
def submit_verify_code(self, code: str) -> dict:
clean = code.strip()
if not clean:
return {"ok": False, "message": "请输入有效的数字配对码"}
with self._lock:
self.login_state["pending_verify_code"] = clean
self.login_state["message"] = f"已提交配对码 {clean},正在向微信服务器验证..."
return {"ok": True, **self.get_public_status()}
def disconnect(self) -> dict:
self._stop_event.set()
if SESSION_FILE.exists():
SESSION_FILE.unlink()
if SYNC_BUF_FILE.exists():
SYNC_BUF_FILE.unlink()
self.session = {}
with self._lock:
self.login_state["active"] = False
self.login_state["status"] = "idle"
self.login_state["message"] = "已断开微信 ClawBot 连接"
return {"ok": True, **self.get_public_status()}
def _poll_qr_worker(self, initial_qrcode: str):
deadline = time.time() + 300.0 # 5 minutes
while time.time() < deadline:
with self._lock:
if not self.login_state["active"] or self.login_state["qrcode"] != initial_qrcode:
return
base_url = self.login_state["api_base_url"]
qrcode = self.login_state["qrcode"]
verify_code = self.login_state["pending_verify_code"]
endpoint = f"ilink/bot/get_qrcode_status?qrcode={urllib.parse.quote(qrcode)}"
if verify_code:
endpoint += f"&verify_code={urllib.parse.quote(verify_code)}"
try:
resp = _api_get(base_url, endpoint, timeout=35.0)
except Exception:
resp = {"status": "wait"}
st = resp.get("status", "wait")
with self._lock:
if self.login_state["qrcode"] != initial_qrcode:
return
self.login_state["status"] = st
if st == "wait":
pass
elif st == "scaned":
self.login_state["pending_verify_code"] = ""
self.login_state["message"] = "📱 已扫码!请在手机微信上点击确认授权..."
elif st == "scaned_but_redirect":
r_host = resp.get("redirect_host", "")
if r_host:
self.login_state["api_base_url"] = f"https://{r_host}"
self.login_state["message"] = "📱 已扫码,正在切换微信数据中心节点..."
elif st == "need_verifycode":
if self.login_state["pending_verify_code"]:
self.login_state["message"] = "❌ 配对码不匹配,请重新输入手机微信上显示的数字:"
self.login_state["pending_verify_code"] = ""
else:
self.login_state["message"] = "🔢 请输入手机微信屏幕上显示的配对数字:"
elif st == "binded_redirect":
self.login_state["active"] = False
self.login_state["message"] = "✅ 此微信已绑定过当前节点!"
return
elif st in ("expired", "verify_code_blocked"):
self.login_state["active"] = False
self.login_state["message"] = "⏳ 二维码已过期,请点击「刷新二维码」重新扫描"
return
elif st == "confirmed":
bot_token = resp.get("bot_token", "")
bot_id = resp.get("ilink_bot_id", "")
baseurl = resp.get("baseurl") or FIXED_BASE_URL
user_id = resp.get("ilink_user_id", "")
self._save_session(
{
"bot_token": bot_token,
"ilink_bot_id": bot_id,
"baseurl": baseurl,
"ilink_user_id": user_id,
"connected_at": time.strftime("%Y-%m-%d %H:%M:%S"),
}
)
self.login_state["active"] = False
self.login_state["message"] = "🎉 微信 ClawBot 绑定成功!现在可以直接在微信里收发消息了"
self._start_monitor_thread()
# Send immediate welcome message to the user on WeChat!
if user_id:
threading.Thread(
target=self.send_text_message,
args=(
user_id,
"✅ M6 Mac mini (HomeLab & AGY AI) 已成功连接微信 ClawBot!\n\n"
"你可以直接发送以下内容与我交互:\n"
"• 发送「状态」:查看 M6 Mac mini 与极空间 Z4 实时遥测\n"
"• 发送「备份」:立即打包备份核心数据至极空间 20TB\n"
"• 发送「屏幕」:查看 AGY 云端终端当前实时画面\n"
"• 发送「$ 命令」:在 Mac mini 上执行终端命令 (如 $ df -h)\n"
"• 直接发任何问题:直接转发给 Mac mini 上的 AI 助手回答",
),
daemon=True,
).start()
return
time.sleep(1.0)
# ------------------------------------------------------------------
# 2. Long-Poll Monitor & Outbound Messaging
# ------------------------------------------------------------------
def _start_monitor_thread(self):
if self._monitor_thread and self._monitor_thread.is_alive():
return
self._stop_event.clear()
self._monitor_thread = threading.Thread(target=self._monitor_loop, daemon=True)
self._monitor_thread.start()
def send_text_message(self, to_user_id: str, text: str, context_token: str = "", run_id: str = ""):
if not self.is_connected() or not to_user_id or not text:
return
base_url = self.session.get("baseurl") or FIXED_BASE_URL
token = self.session.get("bot_token", "")
client_id = f"openclaw-weixin-{uuid.uuid4().hex[:12]}"
msg_obj = {
"from_user_id": "",
"to_user_id": to_user_id,
"client_id": client_id,
"message_type": 2, # BOT
"message_state": 2, # FINISH
"item_list": [{"type": 1, "text_item": {"text": text}}],
}
if context_token:
msg_obj["context_token"] = context_token
if run_id:
msg_obj["run_id"] = run_id
payload = {
"msg": msg_obj,
"base_info": _base_info(),
}
try:
_api_post(base_url, "ilink/bot/sendmessage", payload, token=token, timeout=15.0)
self.last_reply_text = text[:120]
except Exception as e:
print(f"[ClawBot] send_text_message error: {e}")
def _send_typing(self, to_user_id: str, context_token: str = ""):
if not self.is_connected() or not to_user_id:
return
base_url = self.session.get("baseurl") or FIXED_BASE_URL
token = self.session.get("bot_token", "")
try:
cfg = _api_post(
base_url,
"ilink/bot/getconfig",
{
"ilink_user_id": to_user_id,
"context_token": context_token,
"base_info": _base_info(),
},
token=token,
timeout=8.0,
)
ticket = cfg.get("typing_ticket", "")
if ticket:
_api_post(
base_url,
"ilink/bot/sendtyping",
{
"ilink_user_id": to_user_id,
"typing_ticket": ticket,
"status": 1,
"base_info": _base_info(),
},
token=token,
timeout=8.0,
)
except Exception:
pass
def _monitor_loop(self):
base_url = self.session.get("baseurl") or FIXED_BASE_URL
token = self.session.get("bot_token", "")
try:
_api_post(
base_url,
"ilink/bot/msg/notifystart",
{"base_info": _base_info()},
token=token,
timeout=10.0,
)
except Exception:
pass
sync_buf = ""
if SYNC_BUF_FILE.exists():
try:
sync_buf = SYNC_BUF_FILE.read_text(encoding="utf-8").strip()
except Exception:
pass
while not self._stop_event.is_set() and self.is_connected():
base_url = self.session.get("baseurl") or FIXED_BASE_URL
token = self.session.get("bot_token", "")
try:
resp = _api_post(
base_url,
"ilink/bot/getupdates",
{"get_updates_buf": sync_buf, "base_info": _base_info()},
token=token,
timeout=38.0,
)
new_buf = resp.get("get_updates_buf")
if new_buf:
sync_buf = new_buf
SYNC_BUF_FILE.write_text(sync_buf, encoding="utf-8")
msgs = resp.get("msgs") or []
for m in msgs:
# Only handle USER messages (message_type == 1)
if m.get("message_type") == 2:
continue
from_user = m.get("from_user_id", "")
ctx_token = m.get("context_token", "")
run_id = m.get("run_id", "")
items = m.get("item_list") or []
text_parts = []
for it in items:
t_type = it.get("type")
if t_type == 1 and it.get("text_item", {}).get("text"):
text_parts.append(it["text_item"]["text"])
elif t_type == 3 and it.get("voice_item", {}).get("text"):
text_parts.append(it["voice_item"]["text"])
user_text = "\n".join(text_parts).strip()
if from_user and user_text:
self.msg_count += 1
self.last_inbound_text = user_text
self.last_event_ts = time.time()
threading.Thread(
target=self._handle_inbound_message,
args=(from_user, user_text, ctx_token, run_id),
daemon=True,
).start()
except urllib.error.URLError as e:
# Normal long-poll timeout
if "timed out" in str(e).lower():
continue
time.sleep(2.0)
except TimeoutError:
continue
except Exception as e:
if "timed out" in str(e).lower():
continue
print(f"[ClawBot] getupdates error: {e}")
time.sleep(3.0)
# ------------------------------------------------------------------
# 3. Intelligent Command & AI Router for WeChat Messages
# ------------------------------------------------------------------
def _handle_inbound_message(self, from_user: str, text: str, ctx_token: str, run_id: str):
self._send_typing(from_user, ctx_token)
cmd = text.strip()
low = cmd.lower()
# 1. Help
if low in ("帮助", "help", "/help", "?"):
reply = (
"🍎 HomeLab & AGY 微信中控台指令清单:\n"
"━━━━━━━━━━━━━━\n"
"1️⃣ 发送「状态」或 /status\n"
" 查看 M6 Mac mini、极空间 20TB、联通公网 IP 与狮城专线实时指标\n"
"2️⃣ 发送「备份」或 /backup\n"
" 立即将 Vaultwarden 与核心配置打包灾备至极空间 Z4\n"
"3️⃣ 发送「刷新」或 /ddns\n"
" 立即刷新 Cloudflare 泛域名 DDNS 解析\n"
"4️⃣ 发送「屏幕」或 /screen\n"
" 抓取 Mac mini 上 tmux (agy) 终端的实时画面\n"
"5️⃣ 发送「$ <终端命令>」\n"
" 在 Mac mini 上直接运行 Shell 命令并返回结果 (如: $ df -h)\n"
"6️⃣ 发送「> <按键内容>」\n"
" 直接向 Mac mini 的 tmux (agy) 终端输入文字并回车\n"
"7️⃣ 直接发送任意问题\n"
" 自动调用 Mac mini AI 助手为你解答或执行任务"
)
self.send_text_message(from_user, reply, ctx_token, run_id)
return
# 2. Telemetry Status
if low in ("状态", "status", "/status", "监控"):
if self.telemetry_fn:
t = self.telemetry_fn()
mini = t["mini"]
nas = t["nas"]
net = t["network"]
reply = (
f"🍏 HomeLab 实时状态 ({t['timestamp']})\n"
f"━━━━━━━━━━━━━━\n"
f"🖥 M6 Mac mini ({mini['ip']})\n"
f"• CPU 负载: {mini['cpu_pct']}% (1m: {mini['load_1m']})\n"
f"• 内存占用: {mini['mem_used_gb']} / {mini['mem_total_gb']} GB ({mini['mem_pct']}%)\n"
f"• SSD 占用: {mini['disk_used_gb']} / {mini['disk_total_gb']} GB ({mini['disk_pct']}%)\n"
f"• 在线时长: {mini['uptime']}\n"
f"• AGY 终端: {'🟢 常驻运行中' if mini['agy_tmux'] else '⚪ 待机'}\n\n"
f"💾 极空间 Z4 ({nas['ip']})\n"
f"• 可用余量: {nas['free_tb']} TB / {nas['total_tb']} TB\n"
f"• 最近灾备: {nas['latest_backup']}\n\n"
f"🌐 网络与 AI 算力专线\n"
f"• 家庭公网 IP: {net['home_wan_ip']}\n"
f"• AI 分流策略: {net['ai_policy']}\n"
f"• 狮城节点延迟: {net['sg_delay_ms']} ms\n"
f"• 免端口中控台: https://nav.961504.xyz"
)
else:
reply = "状态采集接口未就绪"
self.send_text_message(from_user, reply, ctx_token, run_id)
return
# 3. Backup to ZSpace NAS
if low in ("备份", "backup", "/backup"):
out = self._exec_shell("/Users/ixvii0iv/homelab/scripts/backup-to-nas.sh", timeout=20.0)
self.send_text_message(from_user, f"✅ 极空间 Z4 灾备执行完毕:\n{out or '已完成备份'}", ctx_token, run_id)
return
# 4. Refresh DDNS
if low in ("刷新", "ddns", "/ddns"):
out = self._exec_shell("/Users/ixvii0iv/homelab/scripts/cloudflare-ddns.sh", timeout=15.0)
self.send_text_message(from_user, f"✅ Cloudflare DDNS 刷新结果:\n{out or '已同步最新公网 IP'}", ctx_token, run_id)
return
# 5. Capture tmux screen
if low in ("屏幕", "screen", "/screen", "tmux"):
out = self._exec_shell("/opt/homebrew/bin/tmux capture-pane -t agy -p | tail -n 25", timeout=5.0)
self.send_text_message(
from_user,
f"🖥 AGY 终端 (tmux: agy) 最新画面:\n━━━━━━━━━━━━━━\n{out or '(空)'}",
ctx_token,
run_id,
)
return
# 6. Direct Shell Command ($ ...)
if cmd.startswith("$"):
shell_cmd = cmd[1:].strip()
if not shell_cmd:
self.send_text_message(from_user, "请在 $ 后输入要执行的命令,例如:$ df -h", ctx_token, run_id)
return
out = self._exec_shell(shell_cmd, timeout=25.0)
if len(out) > 3500:
out = out[-3500:] + "\n...(已截断)"
self.send_text_message(from_user, f"💻 终端执行结果 ($ {shell_cmd}):\n━━━━━━━━━━━━━━\n{out or '(无输出)'}", ctx_token, run_id)
return
# 7. Inject keys into tmux agy session (> ...)
if cmd.startswith(">"):
keys = cmd[1:].strip()
safe_keys = keys.replace('"', '\\"')
self._exec_shell(f'/opt/homebrew/bin/tmux send-keys -t agy "{safe_keys}" C-m', timeout=5.0)
time.sleep(2.5)
out = self._exec_shell("/opt/homebrew/bin/tmux capture-pane -t agy -p | tail -n 25", timeout=5.0)
self.send_text_message(
from_user,
f"⌨️ 已向 AGY 终端发送指令并捕获最新画面:\n━━━━━━━━━━━━━━\n{out or '(已发送)'}",
ctx_token,
run_id,
)
return
# 8. Natural language -> Try agy -p on Mac mini, or inject into tmux agy session!
agy_out = self._exec_shell(
f'cd /Users/ixvii0iv/homelab && /Users/ixvii0iv/.local/bin/agy -c --dangerously-skip-permissions -p {json.dumps(cmd)}',
timeout=90.0,
)
if agy_out and "authentication required" not in agy_out.lower():
if len(agy_out) > 3800:
agy_out = agy_out[:3800] + "\n...(内容较长,完整输出请查看 https://agy.961504.xyz)"
self.send_text_message(from_user, agy_out, ctx_token, run_id)
else:
# Fallback: send into tmux agy session and return terminal capture + quick guide
self.send_text_message(
from_user,
f"🤖 收到你的消息:「{cmd}」\n\n"
"💡 提示:检测到 Mac mini 上的 `agy` 终端首次启动需要完成一次 Google 账号登录授权。你可以:\n"
"1. 打开 https://agy.961504.xyz 完成一次扫码/授权码粘贴,之后微信即可直接与 AGY 自由对话!\n"
"2. 现在你已可以直接在微信发送「状态」「备份」「屏幕」或「$ 命令」(如 `$ docker ps`)直接操控 Mac mini!",
ctx_token,
run_id,
)
def _exec_shell(self, cmd: str, timeout: float = 15.0) -> str:
try:
env = os.environ.copy()
env["PATH"] = "/Users/ixvii0iv/.local/bin:/Users/ixvii0iv/.orbstack/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
env["HOME"] = "/Users/ixvii0iv"
env["LANG"] = "en_US.UTF-8"
res = subprocess.run(
cmd, shell=True, capture_output=True, text=True, timeout=timeout, env=env
)
out = (res.stdout or "") + ("\n" + res.stderr if res.stderr else "")
return out.strip()
except Exception as e:
return f"执行超时或异常: {e}"
-1
View File
@@ -1 +0,0 @@
/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);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}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@suppoLine truncated
-194
View File
@@ -1,194 +0,0 @@
var Ry=i=>{throw TypeError(i)};var jy=(i,c,r)=>c.has(i)||Ry("Cannot "+r);var pt=(i,c,r)=>(jy(i,c,"read from private field"),r?r.call(i):c.get(i)),Dy=(i,c,r)=>c.has(i)?Ry("Cannot add the same private member more than once"):c instanceof WeakSet?c.add(i):c.set(i,r),Is=(i,c,r,o)=>(jy(i,c,"write to private field"),o?o.call(i,r):c.set(i,r),r);function Nx(i,c){for(var r=0;r<c.length;r++){const o=c[r];if(typeof o!="string"&&!Array.isArray(o)){for(const f in o)if(f!=="default"&&!(f in i)){const m=Object.getOwnPropertyDescriptor(o,f);m&&Object.defineProperty(i,f,m.get?m:{enumerable:!0,get:()=>o[f]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}(function(){const c=document.createElement("link").relList;if(c&&c.supports&&c.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))o(f);new MutationObserver(f=>{for(const m of f)if(m.type==="childList")for(const v of m.addedNodes)v.tagName==="LINK"&&v.rel==="modulepreload"&&o(v)}).observe(document,{childList:!0,subtree:!0});function r(f){const m={};return f.integrity&&(m.integrity=f.integrity),f.referrerPolicy&&(m.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?m.credentials="include":f.crossOrigin==="anonymous"?m.credentials="omit":m.credentials="same-origin",m}function o(f){if(f.ep)return;f.ep=!0;const m=r(f);fetch(f.href,m)}})();function pg(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var Fs={exports:{}},ii={};/**
* @license React
* react-jsx-runtime.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var My;function Cx(){if(My)return ii;My=1;var i=Symbol.for("react.transitional.element"),c=Symbol.for("react.fragment");function r(o,f,m){var v=null;if(m!==void 0&&(v=""+m),f.key!==void 0&&(v=""+f.key),"key"in f){m={};for(var p in f)p!=="key"&&(m[p]=f[p])}else m=f;return f=m.ref,{$$typeof:i,type:o,key:v,ref:f!==void 0?f:null,props:m}}return ii.Fragment=c,ii.jsx=r,ii.jsxs=r,ii}var Uy;function Tx(){return Uy||(Uy=1,Fs.exports=Cx()),Fs.exports}var d=Tx(),$s={exports:{}},ve={};/**
* @license React
* react.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var Hy;function _x(){if(Hy)return ve;Hy=1;var i=Symbol.for("react.transitional.element"),c=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),m=Symbol.for("react.consumer"),v=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),E=Symbol.for("react.suspense"),b=Symbol.for("react.memo"),N=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),T=Symbol.for("react.view_transition"),B=Symbol.iterator;function D(S){return S===null||typeof S!="object"?null:(S=B&&S[B]||S["@@iterator"],typeof S=="function"?S:null)}var M={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},H=Object.assign,Z={};function Q(S,z,J){this.props=S,this.context=z,this.refs=Z,this.updater=J||M}Q.prototype.isReactComponent={},Q.prototype.setState=function(S,z){if(typeof S!="object"&&typeof S!="function"&&S!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,S,z,"setState")},Q.prototype.forceUpdate=function(S){this.updater.enqueueForceUpdate(this,S,"forceUpdate")};function V(){}V.prototype=Q.prototype;function P(S,z,J){this.props=S,this.context=z,this.refs=Z,this.updater=J||M}var F=P.prototype=new V;F.constructor=P,H(F,Q.prototype),F.isPureReactComponent=!0;var G=Array.isArray;function U(){}var k={H:null,A:null,T:null,S:null},ce=Object.prototype.hasOwnProperty;function xe(S,z,J){var I=J.ref;return{$$typeof:i,type:S,key:z,ref:I!==void 0?I:null,props:J}}function he(S,z){return xe(S.type,z,S.props)}function se(S){return typeof S=="object"&&S!==null&&S.$$typeof===i}function je(S){var z={"=":"=0",":":"=2"};return"$"+S.replace(/[=:]/g,function(J){return z[J]})}var ze=/\/+/g;function ye(S,z){return typeof S=="object"&&S!==null&&S.key!=null?je(""+S.key):z.toString(36)}function K(S){switch(S.status){case"fulfilled":return S.value;case"rejected":throw S.reason;default:switch(typeof S.status=="string"?S.then(U,U):(S.status="pending",S.then(function(z){S.status==="pending"&&(S.status="fulfilled",S.value=z)},function(z){S.status==="pending"&&(S.status="rejected",S.reason=z)})),S.status){case"fulfilled":return S.value;case"rejected":throw S.reason}}throw S}function W(S,z,J,I,de){var te=typeof S;(te==="undefined"||te==="boolean")&&(S=null);var Se=!1;if(S===null)Se=!0;else switch(te){case"bigint":case"string":case"number":Se=!0;break;case"object":switch(S.$$typeof){case i:case c:Se=!0;break;case N:return Se=S._init,W(Se(S._payload),z,J,I,de)}}if(Se)return de=de(S),Se=I===""?"."+ye(S,0):I,G(de)?(J="",Se!=null&&(J=Se.replace(ze,"$&/")+"/"),W(de,z,J,"",function(Mt){return Mt})):de!=null&&(se(de)&&(de=he(de,J+(de.key==null||S&&S.key===de.key?"":(""+de.key).replace(ze,"$&/")+"/")+Se)),z.push(de)),1;Se=0;var ae=I===""?".":I+":";if(G(S))for(var fe=0;fe<S.length;fe++)I=S[fe],te=ae+ye(I,fe),Se+=W(I,z,J,te,de);else if(fe=D(S),typeof fe=="function")for(S=fe.call(S),fe=0;!(I=S.next()).done;)I=I.value,te=ae+ye(I,fe++),Se+=W(I,z,J,te,de);else if(te==="object"){if(typeof S.then=="function")return W(K(S),z,J,I,de);throw z=String(S),Error("Objects are not valid as a React child (found: "+(z==="[object Object]"?"object with keys {"+Object.keys(S).join(", ")+"}":z)+"). If you meant to render a collection of children, use an array instead.")}return Se}function ie(S,z,J){if(S==null)return S;var I=[],de=0;return W(S,I,"","",function(te){return z.call(J,te,de++)}),I}function ge(S){if(S._status===-1){var z=S._result,J=z();J.then(function(I){(S._status===0||S._status===-1)&&(S._status=1,S._result=I,J.status===void 0&&(J.status="fulfilled",J.value=I))},function(I){(S._status===0||S._status===-1)&&(S._status=2,S._result=I,J.status===void 0&&(J.status="rejected",J.reason=I))}),S._status===-1&&(S._status=0,S._result=J)}if(S._status===1)return S._result.default;throw S._result}var q=typeof reportError=="function"?reportError:function(S){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var z=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof S=="object"&&S!==null&&typeof S.message=="string"?String(S.message):String(S),error:S});if(!window.dispatchEvent(z))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",S);return}console.error(S)};function Ce(S){var z=k.T,J={};J.types=z!==null?z.types:null,k.T=J;try{var I=S(),de=k.S;de!==null&&de(J,I),typeof I=="object"&&I!==null&&typeof I.then=="function"&&I.then(U,q)}catch(te){q(te)}finally{z!==null&&J.types!==null&&(z.types=J.types),k.T=z}}function X(S){var z=k.T;if(z!==null){var J=z.types;J===null?z.types=[S]:J.indexOf(S)===-1&&J.push(S)}else Ce(X.bind(null,S))}var re={map:ie,forEach:function(S,z,J){ie(S,function(){z.apply(this,arguments)},J)},count:function(S){var z=0;return ie(S,function(){z++}),z},toArray:function(S){return ie(S,function(z){return z})||[]},only:function(S){if(!se(S))throw Error("Line truncated
* @license React
* scheduler.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var ky;function wx(){return ky||(ky=1,(function(i){function c(K,W){var ie=K.length;K.push(W);e:for(;0<ie;){var ge=ie-1>>>1,q=K[ge];if(0<f(q,W))K[ge]=W,K[ie]=q,ie=ge;else break e}}function r(K){return K.length===0?null:K[0]}function o(K){if(K.length===0)return null;var W=K[0],ie=K.pop();if(ie!==W){K[0]=ie;e:for(var ge=0,q=K.length,Ce=q>>>1;ge<Ce;){var X=2*(ge+1)-1,re=K[X],S=X+1,z=K[S];if(0>f(re,ie))S<q&&0>f(z,re)?(K[ge]=z,K[S]=ie,ge=S):(K[ge]=re,K[X]=ie,ge=X);else if(S<q&&0>f(z,ie))K[ge]=z,K[S]=ie,ge=S;else break e}}return W}function f(K,W){var ie=K.sortIndex-W.sortIndex;return ie!==0?ie:K.id-W.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var m=performance;i.unstable_now=function(){return m.now()}}else{var v=Date,p=v.now();i.unstable_now=function(){return v.now()-p}}var E=[],b=[],N=1,y=null,T=3,B=!1,D=!1,M=!1,H=!1,Z=typeof setTimeout=="function"?setTimeout:null,Q=typeof clearTimeout=="function"?clearTimeout:null,V=typeof setImmediate<"u"?setImmediate:null;function P(K){for(var W=r(b);W!==null;){if(W.callback===null)o(b);else if(W.startTime<=K)o(b),W.sortIndex=W.expirationTime,c(E,W);else break;W=r(b)}}function F(K){if(M=!1,P(K),!D)if(r(E)!==null)D=!0,G||(G=!0,se());else{var W=r(b);W!==null&&ye(F,W.startTime-K)}}var G=!1,U=-1,k=5,ce=-1;function xe(){return H?!0:!(i.unstable_now()-ce<k)}function he(){if(H=!1,G){var K=i.unstable_now();ce=K;var W=!0;try{e:{D=!1,M&&(M=!1,Q(U),U=-1),B=!0;var ie=T;try{t:{for(P(K),y=r(E);y!==null&&!(y.expirationTime>K&&xe());){var ge=y.callback;if(typeof ge=="function"){y.callback=null,T=y.priorityLevel;var q=ge(y.expirationTime<=K);if(K=i.unstable_now(),typeof q=="function"){y.callback=q,P(K),W=!0;break t}y===r(E)&&o(E),P(K)}else o(E);y=r(E)}if(y!==null)W=!0;else{var Ce=r(b);Ce!==null&&ye(F,Ce.startTime-K),W=!1}}break e}finally{y=null,T=ie,B=!1}W=void 0}}finally{W?se():G=!1}}}var se;if(typeof V=="function")se=function(){V(he)};else if(typeof MessageChannel<"u"){var je=new MessageChannel,ze=je.port2;je.port1.onmessage=he,se=function(){ze.postMessage(null)}}else se=function(){Z(he,0)};function ye(K,W){U=Z(function(){K(i.unstable_now())},W)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(K){K.callback=null},i.unstable_forceFrameRate=function(K){0>K||125<K?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):k=0<K?Math.floor(1e3/K):5},i.unstable_getCurrentPriorityLevel=function(){return T},i.unstable_next=function(K){switch(T){case 1:case 2:case 3:var W=3;break;default:W=T}var ie=T;T=W;try{return K()}finally{T=ie}},i.unstable_requestPaint=function(){H=!0},i.unstable_runWithPriority=function(K,W){switch(K){case 1:case 2:case 3:case 4:case 5:break;default:K=3}var ie=T;T=K;try{return W()}finally{T=ie}},i.unstable_scheduleCallback=function(K,W,ie){var ge=i.unstable_now();switch(typeof ie=="object"&&ie!==null?(ie=ie.delay,ie=typeof ie=="number"&&0<ie?ge+ie:ge):ie=ge,K){case 1:var q=-1;break;case 2:q=250;break;case 5:q=1073741823;break;case 4:q=1e4;break;default:q=5e3}return q=ie+q,K={id:N++,callback:W,priorityLevel:K,startTime:ie,expirationTime:q,sortIndex:-1},ie>ge?(K.sortIndex=ie,c(b,K),r(E)===null&&K===r(b)&&(M?(Q(U),U=-1):M=!0,ye(F,ie-ge))):(K.sortIndex=q,c(E,K),D||B||(D=!0,G||(G=!0,se()))),K},i.unstable_shouldYield=xe,i.unstable_wrapCallback=function(K){var W=T;return function(){var ie=T;T=W;try{return K.apply(this,arguments)}finally{T=ie}}}})(ef)),ef}var Ly;function Ox(){return Ly||(Ly=1,Ws.exports=wx()),Ws.exports}var tf={exports:{}},bt={};/**
* @license React
* react-dom.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var Gy;function Ax(){if(Gy)return bt;Gy=1;var i=zf();function c(N){var y="https://react.dev/errors/"+N;if(1<arguments.length){y+="?args[]="+encodeURIComponent(arguments[1]);for(var T=2;T<arguments.length;T++)y+="&args[]="+encodeURIComponent(arguments[T])}return"Minified React error #"+N+"; visit "+y+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function r(){}var o={d:{f:r,r:function(){throw Error(c(522))},D:r,C:r,L:r,m:r,X:r,S:r,M:r},p:0,findDOMNode:null},f=Symbol.for("react.portal"),m=Symbol.for("react.recoverable"),v=Symbol.for("react.optimistic_key");function p(N,y,T){var B=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:f,key:B==null?null:B===v?v:""+B,children:N,containerInfo:y,implementation:T}}var E=i.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function b(N,y){if(N==="font")return"";if(typeof y=="string")return y==="use-credentials"?y:""}return bt.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=o,bt.browser=function(N){return{$$typeof:m,_reason:N}},bt.createPortal=function(N,y){var T=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!y||y.nodeType!==1&&y.nodeType!==9&&y.nodeType!==11)throw Error(c(299));return p(N,y,null,T)},bt.flushSync=function(N){var y=E.T,T=o.p;try{if(E.T=null,o.p=2,N)return N()}finally{E.T=y,o.p=T,o.d.f()}},bt.preconnect=function(N,y){typeof N=="string"&&(y?(y=y.crossOrigin,y=typeof y=="string"?y==="use-credentials"?y:"":void 0):y=null,o.d.C(N,y))},bt.prefetchDNS=function(N){typeof N=="string"&&o.d.D(N)},bt.preinit=function(N,y){if(typeof N=="string"&&y&&typeof y.as=="string"){var T=y.as,B=b(T,y.crossOrigin),D=typeof y.integrity=="string"?y.integrity:void 0,M=typeof y.fetchPriority=="string"?y.fetchPriority:void 0;T==="style"?o.d.S(N,typeof y.precedence=="string"?y.precedence:void 0,{crossOrigin:B,integrity:D,fetchPriority:M}):T==="script"&&o.d.X(N,{crossOrigin:B,integrity:D,fetchPriority:M,nonce:typeof y.nonce=="string"?y.nonce:void 0})}},bt.preinitModule=function(N,y){if(typeof N=="string")if(typeof y=="object"&&y!==null){if(y.as==null||y.as==="script"){var T=b(y.as,y.crossOrigin);o.d.M(N,{crossOrigin:T,integrity:typeof y.integrity=="string"?y.integrity:void 0,nonce:typeof y.nonce=="string"?y.nonce:void 0,fetchPriority:typeof y.fetchPriority=="string"?y.fetchPriority:void 0})}}else y==null&&o.d.M(N)},bt.preload=function(N,y){if(typeof N=="string"&&typeof y=="object"&&y!==null&&typeof y.as=="string"){var T=y.as,B=b(T,y.crossOrigin);o.d.L(N,T,{crossOrigin:B,integrity:typeof y.integrity=="string"?y.integrity:void 0,nonce:typeof y.nonce=="string"?y.nonce:void 0,type:typeof y.type=="string"?y.type:void 0,fetchPriority:typeof y.fetchPriority=="string"?y.fetchPriority:void 0,referrerPolicy:typeof y.referrerPolicy=="string"?y.referrerPolicy:void 0,imageSrcSet:typeof y.imageSrcSet=="string"?y.imageSrcSet:void 0,imageSizes:typeof y.imageSizes=="string"?y.imageSizes:void 0,media:typeof y.media=="string"?y.media:void 0})}},bt.preloadModule=function(N,y){if(typeof N=="string")if(y){var T=b(y.as,y.crossOrigin);o.d.m(N,{as:typeof y.as=="string"&&y.as!=="script"?y.as:void 0,crossOrigin:T,integrity:typeof y.integrity=="string"?y.integrity:void 0,nonce:typeof y.nonce=="string"?y.nonce:void 0,fetchPriority:typeof y.fetchPriority=="string"?y.fetchPriority:void 0})}else o.d.m(N)},bt.requestFormReset=function(N){o.d.r(N)},bt.unstable_batchedUpdates=function(N,y){return N(y)},bt.useFormState=function(N,y,T){return E.H.useFormState(N,y,T)},bt.useFormStatus=function(){return E.H.useHostTransitionStatus()},bt.version="19.3.1",bt}var Yy;function bg(){if(Yy)return tf.exports;Yy=1;function i(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(c){console.error(c)}}return i(),tf.exports=Ax(),tf.exports}/**
* @license React
* react-dom-client.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var qy;function zx(){if(qy)return ci;qy=1;var i=Ox(),c=zf(),r=bg();function o(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var l=2;l<arguments.length;l++)t+="&args[]="+encodeURIComponent(arguments[l])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function f(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function m(e){for(var t=e,l=t;l&&!l.alternate;)t=l,(t.flags&4098)!==0&&(e=t.return),l=t.return;for(;t.return;)t=t.return;return t.tag===3?e:null}function v(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function p(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function E(e){if(m(e)!==e)throw Error(o(188))}function b(e){var t=e.alternate;if(!t){if(t=m(e),t===null)throw Error(o(188));return t!==e?null:e}for(var l=e,n=t;;){var a=l.return;if(a===null)break;var u=a.alternate;if(u===null){if(n=a.return,n!==null){l=n;continue}break}if(a.child===u.child){for(u=a.child;u;){if(u===l)return E(a),e;if(u===n)return E(a),t;u=u.sibling}throw Error(o(188))}if(l.return!==n.return)l=a,n=u;else{for(var s=!1,h=a.child;h;){if(h===l){s=!0,l=a,n=u;break}if(h===n){s=!0,n=a,l=u;break}h=h.sibling}if(!s){for(h=u.child;h;){if(h===l){s=!0,l=u,n=a;break}if(h===n){s=!0,n=u,l=a;break}h=h.sibling}if(!s)throw Error(o(189))}}if(l.alternate!==n)throw Error(o(190))}if(l.tag!==3)throw Error(o(188));return l.stateNode.current===l?e:t}function N(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=N(e),t!==null)return t;e=e.sibling}return null}function y(e,t,l,n,a,u){for(;e!==null;){if((e.tag===5||e.tag===27||e.tag===6)&&l(e,n,a,u)||(e.tag!==22||e.memoizedState===null)&&(t||e.tag!==5&&e.tag!==27)&&y(e.child,t,l,n,a,u))return!0;e=e.sibling}return!1}function T(e){for(e=e.return;e!==null;){if(e.tag===3||e.tag===5||e.tag===27)return e;e=e.return}return null}function B(e){var t=!1;for(e=e.return;e!==null&&(e.tag===4&&(t=!0),!(e.tag===3||e.tag===5||e.tag===27));)e=e.return;return t}function D(e){var t=[null,null],l=T(e);return l===null||M(t,e,l.child,{foundSelf:!1}),t}function M(e,t,l,n){for(;l!==null;){if(l===t)n.foundSelf=!0;else if(l.tag===5||l.tag===27||l.tag===6){if(n.foundSelf)return e[1]=l,!0;e[0]=l}else if((l.tag!==22||l.memoizedState===null)&&M(e,t,l.child,n))return!0;l=l.sibling}return!1}function H(e){switch(e.tag){case 5:case 27:case 6:return e.stateNode;case 3:return e.stateNode.containerInfo;default:throw Error(o(559))}}var Z=null,Q=null;function V(e,t,l){return e===l?!0:e===t?(Z=e,!0):!1}function P(e,t,l){return e===l?(Q=e,!1):e===t?(Q!==null&&(Z=e),!0):!1}function F(e){if(e===null)return null;do e=e===null?null:e.return;while(e&&e.tag!==5&&e.tag!==27&&e.tag!==3);return e||null}function G(e,t,l){for(var n=0,a=e;a;a=l(a))n++;a=0;for(var u=t;u;u=l(u))a++;for(;0<n-a;)e=l(e),n--;for(;0<a-n;)t=l(t),a--;for(;n--;){if(e===t||t!==null&&e===t.alternate)return e;e=l(e),t=l(t)}return null}var U=Object.assign,k=Symbol.for("react.element"),ce=Symbol.for("react.transitional.element"),xe=Symbol.for("react.portal"),he=Symbol.for("react.fragment"),se=Symbol.for("react.strict_mode"),je=Symbol.for("react.profiler"),ze=Symbol.for("react.consumer"),ye=Symbol.for("react.context"),K=Symbol.for("react.forward_ref"),W=Symbol.for("react.suspense"),ie=Symbol.for("react.suspense_list"),ge=Symbol.for("react.memo"),q=Symbol.for("react.lazy"),Ce=Symbol.for("react.activity"),X=Symbol.for("react.legacy_hidden"),re=Symbol.for("react.memo_cache_sentinel"),S=Symbol.for("react.view_transition"),z=Symbol.for("react.recoverable"),J=Symbol.iterator;function I(e){return e===null||typeof e!="object"?null:(e=J&&e[J]||e["@@iterator"],typeof e=="function"?e:null)}var de=Symbol.for("react.client.reference");function te(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===de?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case he:return"Fragment";case je:return"Profiler";case se:return"StrictMode";case W:return"Suspense";case ie:return"SuspenseList";case Ce:return"Activity";case S:return"ViewTransition"}if(typeof e=="object")switch(e.$$typeof){case xe:return"Portal";case ye:return e.displayName||"Context";case ze:return(e._context.displayName||"Context")+".Consumer";case K:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ge:return t=e.displayName||null,t!==null?t:te(e.type)||"Memo";case q:t=e._payload,e=e._init;try{return te(e(t))}catch{}}return null}var Se=Array.isArray,ae=c.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,fe=r.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Mt={pending:!1,data:null,method:null,action:null},Il=[],daLine truncated
at`)?" (<anonymous>)":-1<l.stack.indexOf("@")?"@unknown:0:0":""}return`
`+vr+e+cd}var yr=!1;function gr(e,t){if(!e||yr)return"";yr=!0;var l=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var n={DetermineComponentFrameRoot:function(){try{if(t){var Y=function(){throw Error()};if(Object.defineProperty(Y.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Y,[])}catch($){var _=$}Reflect.construct(e,[],Y)}else{try{Y.call()}catch($){_=$}Y=!1;try{var R=Object.getOwnPropertyDescriptor(e.prototype,"props");Object.defineProperty(e.prototype,"props",{configurable:!0,set:function(){throw Error()}}),Y=!0,new e}finally{Y&&(R!==void 0?Object.defineProperty(e.prototype,"props",R):delete e.prototype.props)}}}else{try{throw Error()}catch($){_=$}(Y=e())&&typeof Y.catch=="function"&&Y.catch(function(){})}}catch($){if($&&_&&typeof $.stack=="string")return[$.stack,_.stack]}return[null,null]}};n.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var a=Object.getOwnPropertyDescriptor(n.DetermineComponentFrameRoot,"name");a&&a.configurable&&Object.defineProperty(n.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=n.DetermineComponentFrameRoot(),s=u[0],h=u[1];if(s&&h){var x=s.split(`
`),O=h.split(`
`);for(a=n=0;n<x.length&&!x[n].includes("DetermineComponentFrameRoot");)n++;for(;a<O.length&&!O[a].includes("DetermineComponentFrameRoot");)a++;if(n===x.length||a===O.length)for(n=x.length-1,a=O.length-1;1<=n&&0<=a&&x[n]!==O[a];)a--;for(;1<=n&&0<=a;n--,a--)if(x[n]!==O[a]){if(n!==1||a!==1)do if(n--,a--,0>a||x[n]!==O[a]){var j=`
`+x[n].replace(" at new "," at ");return e.displayName&&j.includes("<anonymous>")&&(j=j.replace("<anonymous>",e.displayName)),j}while(1<=n&&0<=a);break}}}finally{yr=!1,Error.prepareStackTrace=l}return(l=e?e.displayName||e.name:"")?$l(l):""}function w0(e,t){switch(e.tag){case 26:case 27:case 5:return $l(e.type);case 16:return $l("Lazy");case 13:return e.child!==t&&t!==null?$l("Suspense Fallback"):$l("Suspense");case 19:return $l("SuspenseList");case 0:case 15:return gr(e.type,!1);case 11:return gr(e.type.render,!1);case 1:return gr(e.type,!0);case 31:return $l("Activity");case 30:return $l("ViewTransition");default:return""}}function rd(e){try{var t="",l=null;do t+=w0(e,l),l=e,e=e.return;while(e);return t}catch(n){return`
Error generating stack: `+n.message+`
`+n.stack}}var pr=Object.prototype.hasOwnProperty,br=i.unstable_scheduleCallback,xr=i.unstable_cancelCallback,O0=i.unstable_shouldYield,A0=i.unstable_requestPaint,Ut=i.unstable_now,z0=i.unstable_getCurrentPriorityLevel,od=i.unstable_ImmediatePriority,sd=i.unstable_UserBlockingPriority,pi=i.unstable_NormalPriority,R0=i.unstable_LowPriority,fd=i.unstable_IdlePriority,j0=i.log,D0=i.unstable_setDisableYieldValue,mu=null,Ht=null;function Pl(e){if(typeof j0=="function"&&D0(e),Ht&&typeof Ht.setStrictMode=="function")try{Ht.setStrictMode(mu,e)}catch{}}var Bt=Math.clz32?Math.clz32:H0,M0=Math.log,U0=Math.LN2;function H0(e){return e>>>=0,e===0?32:31-(M0(e)/U0|0)|0}var bi=256,xi=262144,Si=4194304;function Mn(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ei(e,t,l){var n=e.pendingLanes;if(n===0)return 0;var a=0,u=e.suspendedLanes,s=e.pingedLanes;e=e.warmLanes;var h=n&134217727;return h!==0?(n=h&~u,n!==0?a=Mn(n):(s&=h,s!==0?a=Mn(s):l||(l=h&~e,l!==0&&(a=Mn(l))))):(h=n&~u,h!==0?a=Mn(h):s!==0?a=Mn(s):l||(l=n&~e,l!==0&&(a=Mn(l)))),a===0?0:t!==0&&t!==a&&(t&u)===0&&(u=a&-a,l=t&-t,u>=l||u===32&&(l&4194048)!==0)?t:a}function hu(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function dd(e,t){(t&8)!==0&&(t|=t&32);var l=e.entangledLanes;if(l!==0)for(e=e.entanglements,l&=t;0<l;){var n=31-Bt(l),a=1<<n;t|=e[n],l&=~a}return t}function B0(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function md(){var e=Si;return Si<<=1,(Si&62914560)===0&&(Si=4194304),e}function Sr(e){for(var t=[],l=0;31>l;l++)t.push(e);return t}function vu(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function k0(e,t,l,n,a,u){var s=e.pendingLanes;e.pendingLanes=l,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=l,e.entangledLanes&=l,e.errorRecoveryDisabledLanes&=l,e.shellSuspendCounter=0;var h=e.entanglements,x=e.expirationTimes,O=e.hiddenUpdates;for(l=s&~l;0<l;){var j=31-Bt(l),Y=1<<j;h[j]=0,x[j]=-1;var _=O[j];if(_!==null)for(O[j]=null,j=0;j<_.length;j++){var R=_[j];R!==null&&(R.lane&=-536870913)}l&=~Y}n!==0&&hd(e,n,0),u!==0&&a===0&&e.tag!==0&&(e.suspendedLanes|=u&~(s&~t))}function hd(e,t,l){e.pendingLanes|=t,e.suspendedLanes&=~t;var n=31-Bt(t);e.entangledLanes|=t,e.entanglements[n]=e.entanglements[n]|1073741824|l&261930}function vd(e,t){var l=e.entangledLanes|=t;for(e=e.entanglements;l;){var n=31-Bt(l),a=1<<n;a&t|e[n]&t&&(e[n]|=t),l&=~a}}function yd(e,t){var l=t&-t;return l=(l&42)!==0?1:Er(l),(l&(e.suspendedLanes|t))!==0?0:l}function Er(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:e=128;break;case 268435456:e=134217728;break;default:e=0}return e}function Nr(e){return e&=-e,2<e?8<e?(e&134217727)!==0?32:268435456:8:2}function gd(){var e=fe.p;return e!==0?e:(e=window.event,e===void 0?32:Cy(e.type))}function pd(e,t){var l=fe.p;try{return fe.p=e,t()}finally{fe.p=l}}var zl=Math.random().toString(36).slice(2),dt="__reactFiber$"+zl,_t="__reactProps$"+zl,ha="__reactContainer$"+zl,bd="__reactEvents$"+zl,L0="__reactListeners$"+zl,G0="__reactHandles$"+zl,xd="__reactResources$"+zl,yu="__reactMarker$"+zl,Ni="__reactLoad$"+zl;function Ci(e){delete e[dt],delete e[_t],delete e[L0],delete e[G0]}function Un(e){var t;if(t=e[dt])return t;for(var l=e.parentNode;l;){if(t=l[ha]||l[dt]){if(l=t.alternate,t.child!==null||l!==null&&l.child!==null)for(e=ay(e);e!==null;){if(l=e[dt])return l;e=ay(e)}return t}e=l,l=e.parentNode}return null}function va(e){if(e=e[dt]||e[ha]){var t=e.tag;if(t===5||t===6||t===13||t===31||t===26||t===27||t===3)return e}return null}function gu(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e.stateNode;throw Error(o(33))}function ya(e){var t=e[xd];return t||(t=e[xd]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function ut(e){e[yu]=!0}function Sd(e){e[Ni]=void 0}var Ed=new Set,Nd={};function Hn(e,t){ga(e,t),ga(e+"Capture",t)}funct Line truncated
`).replace(w1,"")}function kv(e,t){return t=Bv(t),Bv(e)===t}function Be(e,t,l,n,a,u){switch(l){case"children":if(typeof n=="string")t==="body"||t==="textarea"&&n===""||ba(e,n);else if(typeof n=="number"||typeof n=="bigint")t!=="body"&&ba(e,""+n);else return;break;case"className":_i(e,"class",n);break;case"tabIndex":_i(e,"tabindex",n);break;case"dir":case"role":case"viewBox":case"width":case"height":_i(e,l,n);break;case"style":Dd(e,n,u);return;case"data":if(t!=="object"){_i(e,"data",n);break}case"src":case"href":if(n===""&&(t!=="a"||l!=="href")){e.removeAttribute(l);break}if(n==null||typeof n=="function"||typeof n=="symbol"||typeof n=="boolean"){e.removeAttribute(l);break}n=wi(n),e.setAttribute(l,n);break;case"action":case"formAction":if(typeof n=="function"){e.setAttribute(l,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof u=="function"&&(l==="formAction"?(t!=="input"&&Be(e,t,"name",a.name,a,null),Be(e,t,"formEncType",a.formEncType,a,null),Be(e,t,"formMethod",a.formMethod,a,null),Be(e,t,"formTarget",a.formTarget,a,null)):(Be(e,t,"encType",a.encType,a,null),Be(e,t,"method",a.method,a,null),Be(e,t,"target",a.target,a,null)));if(n==null||typeof n=="symbol"||typeof n=="boolean"){e.removeAttribute(l);break}n=wi(n),e.setAttribute(l,n);break;case"onClick":n!=null&&(e.onclick=yl);return;case"onScroll":n!=null&&_e("scroll",e);return;case"onScrollEnd":n!=null&&_e("scrollend",e);return;case"dangerouslySetInnerHTML":if(n!=null){if(typeof n!="object"||!("__html"in n))throw Error(o(61));if(l=n.__html,l!=null){if(a.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==l&&(e.innerHTML=l)}}break;case"multiple":e.multiple=n&&typeof n!="function"&&typeof n!="symbol";break;case"muted":e.muted=n&&typeof n!="function"&&typeof n!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(n==null||typeof n=="function"||typeof n=="boolean"||typeof n=="symbol"){e.removeAttribute("xlink:href");break}l=wi(n),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",l);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":n!=null&&typeof n!="function"&&typeof n!="symbol"?e.setAttribute(l,n):e.removeAttribute(l);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"credentialless":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":n&&typeof n!="function"&&typeof n!="symbol"?e.setAttribute(l,""):e.removeAttribute(l);break;case"capture":case"download":n===!0?e.setAttribute(l,""):n!==!1&&n!=null&&typeof n!="function"&&typeof n!="symbol"?e.setAttribute(l,n):e.removeAttribute(l);break;case"cols":case"rows":case"size":case"span":n!=null&&typeof n!="function"&&typeof n!="symbol"&&!isNaN(n)&&1<=n?e.setAttribute(l,n):e.removeAttribute(l);break;case"rowSpan":case"start":n==null||typeof n=="function"||typeof n=="symbol"||isNaN(n)?e.removeAttribute(l):e.setAttribute(l,n);break;case"popover":_e("beforetoggle",e),_e("toggle",e),Ti(e,"popover",n);break;case"xlinkActuate":Rl(e,"http://www.w3.org/1999/xlink","xlink:actuate",n);break;case"xlinkArcrole":Rl(e,"http://www.w3.org/1999/xlink","xlink:arcrole",n);break;case"xlinkRole":Rl(e,"http://www.w3.org/1999/xlink","xlink:role",n);break;case"xlinkShow":Rl(e,"http://www.w3.org/1999/xlink","xlink:show",n);break;case"xlinkTitle":Rl(e,"http://www.w3.org/1999/xlink","xlink:title",n);break;case"xlinkType":Rl(e,"http://www.w3.org/1999/xlink","xlink:type",n);break;case"xmlBase":Rl(e,"http://www.w3.org/XML/1998/namespace","xml:base",n);break;case"xmlLang":Rl(e,"http://www.w3.org/XML/1998/namespace","xml:lang",n);break;case"xmlSpace":Rl(e,"http://www.w3.org/XML/1998/namespace","xml:space",n);break;case"is":Ti(e,"is",n);break;case"innerText":case"textContent":return;default:if(!(2<l.length)||l[0]!=="o"&&l[0]!=="O"||l[1]!=="n"&&l[1]!=="N")l=Z0.get(l)||l,Ti(e,l,n);else return}Re=!0}function _s(e,t,l,n,a,u){switch(l){case"style":Dd(e,n,u);return;case"dangerouslySetInnerHTML":if(n!=null){if(typeof n!="object"||!("__html"in n))throw Error(o(61));if(l=n.__html,l!=null){if(a.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==l&&(e.innerHTML=l)}}break;case"children":if(typeof n=="string")ba(e,n);else if(typeof n=="number"||typeof n=="bigint")ba(e,""+n);else return;break;case"onScroll":n!=null&&_e("scroll",e);return;case"onScrollEnd":n!=null&&_e("scro Line truncated
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Vx=i=>i.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Eg=(...i)=>i.filter((c,r,o)=>!!c&&c.trim()!==""&&o.indexOf(c)===r).join(" ").trim();/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/var Xx={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Qx=g.forwardRef(({color:i="currentColor",size:c=24,strokeWidth:r=2,absoluteStrokeWidth:o,className:f="",children:m,iconNode:v,...p},E)=>g.createElement("svg",{ref:E,...Xx,width:c,height:c,stroke:i,strokeWidth:o?Number(r)*24/Number(c):r,className:Eg("lucide",f),...p},[...v.map(([b,N])=>g.createElement(b,N)),...Array.isArray(m)?m:[m]]));/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const xt=(i,c)=>{const r=g.forwardRef(({className:o,...f},m)=>g.createElement(Qx,{ref:m,iconNode:c,className:Eg(`lucide-${Vx(i)}`,o),...f}));return r.displayName=`${i}`,r};/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Zx=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],Ng=xt("BookOpen",Zx);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Kx=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Jx=xt("Check",Kx);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Ix=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],Fx=xt("EyeOff",Ix);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const $x=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],Px=xt("Eye",$x);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Wx=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],Zy=xt("KeyRound",Wx);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const eS=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],tS=xt("Layers",eS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const lS=[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]],nS=xt("LayoutGrid",lS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const aS=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],uS=xt("Lock",aS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const iS=[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]],cS=xt("Moon",iS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const rS=[["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z",key:"12rzf8"}]],oS=xt("Palette",rS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const sS=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]],fS=xt("PanelsTopLeft",sS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const dS=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],Rf=xt("Search",dS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const mS=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],hS=xt("ShieldCheck",mS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const vS=[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]],yS=xt("Sparkles",vS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const gS=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],pS=xt("Sun",gS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const bS=[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]],jf=xt("Terminal",bS);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const xS=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]],SS=xt("User",xS);var ES=Object.defineProperty,Df=(i,c)=>ES(i,"name",{value:c,configurable:!0});function vf(i,c){if(typeof i=="function")return i(c);i!=null&&(i.current=c)}Df(vf,"setRef");function ua(...i){return c=>{let r=!1;const o=i.map(f=>{const m=vf(f,c);return!r&&typeof m=="function"&&(r=!0),m});if(r)return()=>{for(let f=0;f<o.length;f++){const m=o[f];typeof m=="function"?m():vf(i[f],null)}}}}Df(ua,"composeRefs");function Dt(...i){return g.useCallback(ua(...i),i)}Df(Dt,"useComposedRefs");var NS=Object.defineProperty,Kt=(i,c)=>NS(i,"name",{value:c,configurable:!0});function An(i){const c=g.forwardRef((r,o)=>{let{children:f,...m}=r,v=null,p=!1;const E=[];f=Ag(f),g.Children.forEach(f,T=>{var B;if(wg(T)){p=!0;const D=T;let M="child"in D.props?D.props.child:D.props.children;for(;Mf(M)&&typeof ar=="function";)M=ar(M._payload);v=_S(D,M),E.push((B=v==null?void 0:v.props)==null?void 0:B.children)}else E.push(T)}),v?v=g.cloneElement(v,void 0,E):!p&&g.Children.count(f)===1&&g.isValidElement(f)&&(v=f);const b=v?_g(v):void 0,N=Dt(o,b);if(!v){if(f||f===0)throw new Error(p?AS(i):OS(i));return f}const y=Tg(m,v.props??{});return v.type!==g.Fragment&&(y.ref=o?N:b),g.cloneElement(v,y)});return c.displayName=`${i}.Slot`,c}Kt(An,"createSlot");var CS=An("Slot"),Cg=Symbol.for("radix.slottable");function TS(i){const c=Kt(r=>"child"in r?r.children(r.child):r.children,"Slottable");return c.displayName=`${i}.Slottable`,c.__radixId=Cg,c}Kt(TS,"createSlottable");var _S=Kt((i,c)=>"child"in i.props?g.isValidElement(c)?g.cloneElement(c,void 0,i.props.children(c.props.children)):null:g.isValidElement(c)?c:null,"getSlottableElementFromSlottable");function Tg(i,c){const r={...c};for(const o in c){const f=i[o],m=c[o];/^on[A-Z]/.test(o)?f&&m?r[o]=(...p)=>{const E=m(...p);return f(...p),E}:f&&(r[o]=f):o==="style"?r[o]={...f,...m}:o==="className"?r[o]=[f,m].filter(Boolean).join(" "):o==="aria-describedby"&&(r[o]=zg(m,f))}return{...i,...r}}Kt(Tg,"mergeProps");function _g(i){var o,f;let c=(o=Object.getOwnPropertyDescriptor(i.props,"ref"))==null?void 0:o.get,r=c&&"isReactWarning"in c&&c.isReactWarning;return r?i.ref:(c=(f=Object.getOwnPropertyDescriptor(i,"ref"))==null?void 0:f.get,r=c&&"isReactWarning"in c&&c.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}Kt(_g,"getElementRef");function wg(i){return g.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===Cg}Kt(wg,"isSlottable");var wS=Symbol.for("react.lazy");function Mf(i){return i!=null&&typeof i=="object"&&"$$typeof"in i&&i.$$typeof===wS&&"_payload"in i&&Og(i._payload)}Kt(Mf,"isLazyComponent");function Og(i){return typeof i=="object"&&i!==null&&"then"in i}Kt(Og,"isPromiseLike");function Ag(i){let c=i;for(;Mf(c)&&typeof ar=="function";)c=ar(c._payload);return c}Kt(Ag,"useUnwrappedLazy");function zg(...i){const c=new Set;for(const r of i)if(typeof r=="string")for(const o of String(r).trim().split(/\s+/))o&&c.add(o);return c.size>0?Array.from(c).join(" "):void 0}Kt(zg,"concatAriaDescribedby");var OS=Kt(i=>`${i} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),AS=Kt(i=>`${i} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),ar=ra[" use ".trim().toString()];function Rg(i){var c,r,o="";if(typeof i=="string"||typeof i=="number")o+=i;else if(typeof i=="object")if(Array.isArray(i)){var f=i.length;for(c=0;c<f;c++)i[c]&&(r=Rg(i[c]))&&(o&&(o+=" "),o+=r)}else for(r in i)i[r]&&(o&&(o+=" "),o+=r);return o}function jg(){for(var i,c,r=0,o="",f=arguments.length;r<f;r++)(i=arguments[r])&&(c=Rg(i))&&(o&&(o+=" "),o+=c);return o}const Ky=i=>typeof i=="boolean"?`${i}`:i===0?"0":i,Jy=jg,Dg=(i,c)=>r=>{var o;if((c==null?void 0:c.variants)==null)return Jy(i,r==null?void 0:r.class,r==null?void 0:r.className);const{variants:f,defaultVariants:m}=c,v=Object.keys(f).map(b=>{const N=r==null?void 0:r[b],y=m==null?void 0:m[b];if(N===null)return null;const T=Ky(N)||Ky(y);return f[b][T]}),p=r&&Object.entries(r).reduce((b,N)=>{let[y,T]=N;return T===void 0||(b[y]=T),b},{}),E=c==null||(o=c.compoundVariants)===null||o===void 0?void 0:o.reduce((b,N)=>{let{class:y,className:T,...B}=N;return Object.entries(B).every(D=>{let[M,H]=D;return Array.isArray(H)?H.includes({...m,...p}[M]):{...m,...p}[M]===H})?[...b,y,T]:b},[]);return Jy(i,v,E,r==null?void 0:r.class,r==null?void 0:r.className)},zS=(i,c)=>{const r=new Array(i.length+c.length);for(let o=0;o<i.length;o++)r[o]=i[o];for(let o=0;o<c.length;o++)r[i.length+o]=c[o];return r},RS=(i,c)=>({classGroupId:i,validator:c}),Mg=(i=new Map,c=null,r)=>({nextPart:i,validators:c,classGroupId:r}),ur="-",Iy=[],jS="arbitrary..",DS=i=>{const c=US(i),{conflictingClassGroups:r,conflictingClassGroupModifiers:o}=i;return{getClassGroupId:v=>{if(v.startsWith("[")&&v.endsWith("]"))return MS(v);const p=v.splitLine truncated
.`.concat(qE,` {
overflow: hidden `).concat(o,`;
padding-right: `).concat(p,"px ").concat(o,`;
}
body[`).concat(ou,`] {
overflow: hidden `).concat(o,`;
overscroll-behavior: contain;
`).concat([c&&"position: relative ".concat(o,";"),r==="margin"&&`
padding-left: `.concat(f,`px;
padding-top: `).concat(m,`px;
padding-right: `).concat(v,`px;
margin-left:0;
margin-top:0;
margin-right: `).concat(p,"px ").concat(o,`;
`),r==="padding"&&"padding-right: ".concat(p,"px ").concat(o,";")].filter(Boolean).join(""),`
}
.`).concat(lr,` {
right: `).concat(p,"px ").concat(o,`;
}
.`).concat(nr,` {
margin-right: `).concat(p,"px ").concat(o,`;
}
.`).concat(lr," .").concat(lr,` {
right: 0 `).concat(o,`;
}
.`).concat(nr," .").concat(nr,` {
margin-right: 0 `).concat(o,`;
}
body[`).concat(ou,`] {
`).concat(VE,": ").concat(p,`px;
}
`)},mg=function(){var i=parseInt(document.body.getAttribute(ou)||"0",10);return isFinite(i)?i:0},rN=function(){g.useEffect(function(){return document.body.setAttribute(ou,(mg()+1).toString()),function(){var i=mg()-1;i<=0?document.body.removeAttribute(ou):document.body.setAttribute(ou,i.toString())}},[])},oN=function(i){var c=i.noRelative,r=i.noImportant,o=i.gapMode,f=o===void 0?"margin":o;rN();var m=g.useMemo(function(){return uN(f)},[f]);return g.createElement(iN,{styles:cN(m,!c,f,r?"":"!important")})},wf=!1;if(typeof window<"u")try{var Fc=Object.defineProperty({},"passive",{get:function(){return wf=!0,!0}});window.addEventListener("test",Fc,Fc),window.removeEventListener("test",Fc,Fc)}catch{wf=!1}var nu=wf?{passive:!1}:!1,sN=function(i){return i.tagName==="TEXTAREA"},Kp=function(i,c){if(!(i instanceof Element))return!1;var r=window.getComputedStyle(i);return r[c]!=="hidden"&&!(r.overflowY===r.overflowX&&!sN(i)&&r[c]==="visible")},fN=function(i){return Kp(i,"overflowY")},dN=function(i){return Kp(i,"overflowX")},hg=function(i,c){var r=c.ownerDocument,o=c;do{typeof ShadowRoot<"u"&&o instanceof ShadowRoot&&(o=o.host);var f=Jp(i,o);if(f){var m=Ip(i,o),v=m[1],p=m[2];if(v>p)return!0}o=o.parentNode}while(o&&o!==r.body);return!1},mN=function(i){var c=i.scrollTop,r=i.scrollHeight,o=i.clientHeight;return[c,r,o]},hN=function(i){var c=i.scrollLeft,r=i.scrollWidth,o=i.clientWidth;return[c,r,o]},Jp=function(i,c){return i==="v"?fN(c):dN(c)},Ip=function(i,c){return i==="v"?mN(c):hN(c)},vN=function(i,c){return i==="h"&&c==="rtl"?-1:1},yN=function(i,c,r,o,f){var m=vN(i,window.getComputedStyle(c).direction),v=m*o,p=r.target,E=c.contains(p),b=!1,N=v>0,y=0,T=0;do{if(!p)break;var B=Ip(i,p),D=B[0],M=B[1],H=B[2],Z=M-H-m*D;(D||Z)&&Jp(i,p)&&(y+=Z,T+=D);var Q=p.parentNode;p=Q&&Q.nodeType===Node.DOCUMENT_FRAGMENT_NODE?Q.host:Q}while(!E&&p!==document.body||E&&(c.contains(p)||c===p));return(N&&Math.abs(y)<1||!N&&Math.abs(T)<1)&&(b=!0),b},$c=function(i){return"changedTouches"in i?[i.changedTouches[0].clientX,i.changedTouches[0].clientY]:[0,0]},vg=function(i){return[i.deltaX,i.deltaY]},yg=function(i){return i&&"current"in i?i.current:i},gN=function(i,c){return i[0]===c[0]&&i[1]===c[1]},pN=function(i){return`
.block-interactivity-`.concat(i,` {pointer-events: none;}
.allow-interactivity-`).concat(i,` {pointer-events: all;}
`)},bN=0,au=[];function xN(i){var c=g.useRef([]),r=g.useRef([0,0]),o=g.useRef(),f=g.useState(bN++)[0],m=g.useState(Zp)[0],v=g.useRef(i);g.useEffect(function(){v.current=i},[i]),g.useEffect(function(){if(i.inert){document.body.classList.add("block-interactivity-".concat(f));var M=YE([i.lockRef.current],(i.shards||[]).map(yg),!0).filter(Boolean);return M.forEach(function(H){return H.classList.add("allow-interactivity-".concat(f))}),function(){document.body.classList.remove("block-interactivity-".concat(f)),M.forEach(function(H){return H.classList.remove("allow-interactivity-".concat(f))})}}},[i.inert,i.lockRef.current,i.shards]);var p=g.useCallback(function(M,H){if("touches"in M&&M.touches.length===2||M.type==="wheel"&&M.ctrlKey)return!v.current.allowPinchZoom;var Z=$c(M),Q=r.current,V="deltaX"in M?M.deltaX:Q[0]-Z[0],P="deltaY"in M?M.deltaY:Q[1]-Z[1],F,G=M.target,U=Math.abs(V)>Math.abs(P)?"h":"v";if("touches"in M&&U==="h"&&G.type==="range")return!1;var k=window.getSelection(),ce=k&&k.anchorNode,xe=ce?ce===G||ce.contains(G):!1;if(xe)return!1;var he=hg(U,G);if(!he)return!0;if(he?F=U:(F=U==="v"?"h":"v",he=hg(U,G)),!he)return!1;if(!o.current&&"changedTouches"in M&&(V||P)&&(o.current=F),!F)return!0;var se=o.current||F;return yN(se,H,M,se==="h"?V:P)},[]),E=g.useCallback(function(M){var H=M;if(!(!au.length||au[au.length-1]!==m)){var Z="deltaY"in H?vg(H):$c(H),Q=c.current.filter(function(F){return F.name===H.type&&(F.target===H.target||H.target===F.shadowParent)&&gN(F.delta,Z)})[0];if(Q&&Q.should){H.cancelable&&H.preventDefault();return}if(!Q){var V=(v.current.shards||[]).map(yg).filter(Boolean).filter(function(F){return F.contains(H.target)}),P=V.length>0?p(H,V[0]):!v.current.noIsolation;P&&H.cancelable&&H.preventDefault()}}},[]),b=g.useCallback(function(M,H,Z,Q){var V={name:M,delta:H,target:Z,should:Q,shadowParent:SN(Z)};c.current.push(V),setTimeout(function(){c.current=c.current.filter(function(P){return P!==V})},1)},[]),N=g.useCallback(function(M){r.current=$c(M),o.current=void 0},[]),y=g.useCallback(function(M){b(M.type,vg(M),M.target,p(M,i.lockRef.current))},[]),T=g.useCallback(function(M){b(M.type,$c(M),M.target,p(M,i.lockRef.current))},[]);g.useEffect(function(){return au.push(m),i.setCallbacks({onScrollCapture:y,onWheelCapture:y,onTouchMoveCapture:T}),document.addEventListener("wheel",E,nu),document.addEventListener("touchmove",E,nu),document.addEventListener("touchstart",N,nu),function(){au=au.filter(function(M){return M!==m}),document.removeEventListener("wheel",E,nu),document.removeEventListener("touchmove",E,nu),document.removeEventListener("touchstart",N,nu)}},[]);var B=i.removeScrollBar,D=i.inert;return g.createElement(g.Fragment,null,D?g.createElement(m,{styles:pN(f)}):null,B?g.createElement(oN,{noRelative:i.noRelative,gapMode:i.gapMode}):null)}function SN(i){for(var c=null;i!==null;)i instanceof ShadowRoot&&(c=i.host,i=i.host),i=i.parentNode;return c}const EN=FE(Qp,xN);var Fp=g.forwardRef(function(i,c){return g.createElement(dr,Al({},i,{ref:c,sideCar:EN}))});Fp.classNames=dr.classNames;var NN=function(i){if(typeof document>"u")return null;var c=Array.isArray(i)?i[0]:i;return c.ownerDocument.body},uu=new WeakMap,Pc=new WeakMap,Wc={},mf=0,$p=function(i){return i&&(i.host||$p(i.parentNode))},CN=function(i,c){return c.map(function(r){if(i.contains(r))return r;var o=$p(r);return o&&i.contains(o)?o:(console.error("aria-hidden",r,"in not contained inside",i,". Doing nothing"),null)}).filter(function(r){return!!r})},TN=function(i,c,r,o){var f=CN(c,Array.isArray(i)?i:[i]);Wc[r]||(Wc[r]=new WeakMap);var m=Wc[r],v=[],p=new Set,E=new Set(f),b=function(y){!y||p.has(y)||(p.add(y),b(y.parentNode))};f.forEach(b);var N=function(y){!y||E.has(y)||Array.prototype.forEach.call(y.children,function(T){if(p.has(T))N(T);else try{var B=T.getAttribute(o),D=B!==null&&B!=="false",M=(uu.get(T)||0)+1,H=(m.get(T)||0)+1;uu.set(T,M),m.set(T,H),v.push(T),M===1&&D&&Pc.set(T,!0),H===1&&T.setAttribute(r,"true"),D||T.setAttribute(o,"true")}catch(Z){console.error("aria-hidden: cannot operate on ",T,Z)}})};return N(c),p.clear(),mf++,function(){v.forEach(function(y){var T=uu.get(y)-1,B=m.get(y)-1;uu.set(y,T),m.set(y,B),T||(Pc.has(y)||y.removeAttribute(o),Pc.delete(y)),B||y.removeAttribute(r)}),mf--,mf||(uu=new WeakMap,uu=new WeakMap,Pc=new WeakMap,Wc={})}},_N=function(i,c,r){r===void 0&&(r="data-aria-hidden");var o=Array.from(Array.isArray(i)?i:[i]),f=NN(i);return f?(o.push.apply(o,Array.from(f.querySelectorAll("[aria-live], script"))),TN(o,f,r,"aria-hidden")):function(){return null}},wN=Object.defineProperty,il=(i,c)=>wN(i,"name",{value:c,configurable:!0}),If="Dialog",[Pp,xC]=sa(If),[ON,Jl]=Pp(If),Wp=il(i=>{const{__scopeDialog:c,children:r,open:o,defaultOpen:f,onOpenChange:m,modal:v=!0}=i,p=g.useRef(null),E=g.useRef(null),{nodes:b,registry:N}=Hp(),[y,T]=mi({prop:o,defaultProp:f??!1,onChange:m,caller:If}),[B,D]=g.useState(0),[M,H]=g.useState(0);return d.jsx(ON,{scope:c,triggerRef:p,contentRef:E,contentId:al(),titleId:al(),descriptionId:al() Line truncated
+236
View File
@@ -0,0 +1,236 @@
var d0=i=>{throw TypeError(i)};var m0=(i,r,c)=>r.has(i)||d0("Cannot "+c);var xt=(i,r,c)=>(m0(i,r,"read from private field"),c?c.call(i):r.get(i)),h0=(i,r,c)=>r.has(i)?d0("Cannot add the same private member more than once"):r instanceof WeakSet?r.add(i):r.set(i,c),uf=(i,r,c,o)=>(m0(i,r,"write to private field"),o?o.call(i,c):r.set(i,c),c);function DS(i,r){for(var c=0;c<r.length;c++){const o=r[c];if(typeof o!="string"&&!Array.isArray(o)){for(const s in o)if(s!=="default"&&!(s in i)){const f=Object.getOwnPropertyDescriptor(o,s);f&&Object.defineProperty(i,s,f.get?f:{enumerable:!0,get:()=>o[s]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))o(s);new MutationObserver(s=>{for(const f of s)if(f.type==="childList")for(const m of f.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&o(m)}).observe(document,{childList:!0,subtree:!0});function c(s){const f={};return s.integrity&&(f.integrity=s.integrity),s.referrerPolicy&&(f.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?f.credentials="include":s.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function o(s){if(s.ep)return;s.ep=!0;const f=c(s);fetch(s.href,f)}})();function sd(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var rf={exports:{}},fu={};/**
* @license React
* react-jsx-runtime.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var v0;function US(){if(v0)return fu;v0=1;var i=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function c(o,s,f){var m=null;if(f!==void 0&&(m=""+f),s.key!==void 0&&(m=""+s.key),"key"in s){f={};for(var v in s)v!=="key"&&(f[v]=s[v])}else f=s;return s=f.ref,{$$typeof:i,type:o,key:m,ref:s!==void 0?s:null,props:f}}return fu.Fragment=r,fu.jsx=c,fu.jsxs=c,fu}var g0;function BS(){return g0||(g0=1,rf.exports=US()),rf.exports}var h=BS(),of={exports:{}},be={};/**
* @license React
* react.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var y0;function kS(){if(y0)return be;y0=1;var i=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),c=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),f=Symbol.for("react.consumer"),m=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),b=Symbol.for("react.memo"),S=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),E=Symbol.for("react.view_transition"),A=Symbol.iterator;function j(N){return N===null||typeof N!="object"?null:(N=A&&N[A]||N["@@iterator"],typeof N=="function"?N:null)}var D={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},L=Object.assign,Y={};function G(N,U,$){this.props=N,this.context=U,this.refs=Y,this.updater=$||D}G.prototype.isReactComponent={},G.prototype.setState=function(N,U){if(typeof N!="object"&&typeof N!="function"&&N!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,N,U,"setState")},G.prototype.forceUpdate=function(N){this.updater.enqueueForceUpdate(this,N,"forceUpdate")};function k(){}k.prototype=G.prototype;function V(N,U,$){this.props=N,this.context=U,this.refs=Y,this.updater=$||D}var I=V.prototype=new k;I.constructor=V,L(I,G.prototype),I.isPureReactComponent=!0;var R=Array.isArray;function T(){}var z={H:null,A:null,T:null,S:null},Z=Object.prototype.hasOwnProperty;function te(N,U,$){var ee=$.ref;return{$$typeof:i,type:N,key:U,ref:ee!==void 0?ee:null,props:$}}function W(N,U){return te(N.type,U,N.props)}function P(N){return typeof N=="object"&&N!==null&&N.$$typeof===i}function ne(N){var U={"=":"=0",":":"=2"};return"$"+N.replace(/[=:]/g,function($){return U[$]})}var ue=/\/+/g;function ge(N,U){return typeof N=="object"&&N!==null&&N.key!=null?ne(""+N.key):U.toString(36)}function F(N){switch(N.status){case"fulfilled":return N.value;case"rejected":throw N.reason;default:switch(typeof N.status=="string"?N.then(T,T):(N.status="pending",N.then(function(U){N.status==="pending"&&(N.status="fulfilled",N.value=U)},function(U){N.status==="pending"&&(N.status="rejected",N.reason=U)})),N.status){case"fulfilled":return N.value;case"rejected":throw N.reason}}throw N}function ae(N,U,$,ee,he){var ie=typeof N;(ie==="undefined"||ie==="boolean")&&(N=null);var Ee=!1;if(N===null)Ee=!0;else switch(ie){case"bigint":case"string":case"number":Ee=!0;break;case"object":switch(N.$$typeof){case i:case r:Ee=!0;break;case S:return Ee=N._init,ae(Ee(N._payload),U,$,ee,he)}}if(Ee)return he=he(N),Ee=ee===""?"."+ge(N,0):ee,R(he)?($="",Ee!=null&&($=Ee.replace(ue,"$&/")+"/"),ae(he,U,$,"",function(Dt){return Dt})):he!=null&&(P(he)&&(he=W(he,$+(he.key==null||N&&N.key===he.key?"":(""+he.key).replace(ue,"$&/")+"/")+Ee)),U.push(he)),1;Ee=0;var fe=ee===""?".":ee+":";if(R(N))for(var ye=0;ye<N.length;ye++)ee=N[ye],ie=fe+ge(ee,ye),Ee+=ae(ee,U,$,ie,he);else if(ye=j(N),typeof ye=="function")for(N=ye.call(N),ye=0;!(ee=N.next()).done;)ee=ee.value,ie=fe+ge(ee,ye++),Ee+=ae(ee,U,$,ie,he);else if(ie==="object"){if(typeof N.then=="function")return ae(F(N),U,$,ee,he);throw U=String(N),Error("Objects are not valid as a React child (found: "+(U==="[object Object]"?"object with keys {"+Object.keys(N).join(", ")+"}":U)+"). If you meant to render a collection of children, use an array instead.")}return Ee}function ce(N,U,$){if(N==null)return N;var ee=[],he=0;return ae(N,ee,"","",function(ie){return U.call($,ie,he++)}),ee}function xe(N){if(N._status===-1){var U=N._result,$=U();$.then(function(ee){(N._status===0||N._status===-1)&&(N._status=1,N._result=ee,$.status===void 0&&($.status="fulfilled",$.value=ee))},function(ee){(N._status===0||N._status===-1)&&(N._status=2,N._result=ee,$.status===void 0&&($.status="rejected",$.reason=ee))}),N._status===-1&&(N._status=0,N._result=$)}if(N._status===1)return N._result.default;throw N._result}var K=typeof reportError=="function"?reportError:function(N){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var U=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof N=="object"&&N!==null&&typeof N.message=="string"?String(N.message):String(N),error:N});if(!window.dispatchEvent(U))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",N);return}console.error(N)};function Se(N){var U=z.T,$={};$.types=U!==null?U.types:null,z.T=$;try{var ee=N(),he=z.S;he!==null&&he($,ee),typeof ee=="object"&&ee!==null&&typeof ee.then=="function"&&ee.then(T,K)}catch(ie){K(ie)}finally{U!==null&&$.types!==null&&(U.types=$.types),z.T=U}}function J(N){var U=z.T;if(U!==null){var $=U.types;$===null?U.types=[N]:$.indexOf(N)===-1&&$.push(N)}else Se(J.bind(null,N))}var me={map:ce,forEach:function(N,U,$){ce(N,function(){U.apply(this,arguments)},$)},count:function(N){var U=0;return ce(N,function(){U++}),U},toArray:function(N){return ce(N,function(U){return U})||[]},only:Line truncated
* @license React
* scheduler.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var b0;function HS(){return b0||(b0=1,(function(i){function r(F,ae){var ce=F.length;F.push(ae);e:for(;0<ce;){var xe=ce-1>>>1,K=F[xe];if(0<s(K,ae))F[xe]=ae,F[ce]=K,ce=xe;else break e}}function c(F){return F.length===0?null:F[0]}function o(F){if(F.length===0)return null;var ae=F[0],ce=F.pop();if(ce!==ae){F[0]=ce;e:for(var xe=0,K=F.length,Se=K>>>1;xe<Se;){var J=2*(xe+1)-1,me=F[J],N=J+1,U=F[N];if(0>s(me,ce))N<K&&0>s(U,me)?(F[xe]=U,F[N]=ce,xe=N):(F[xe]=me,F[J]=ce,xe=J);else if(N<K&&0>s(U,ce))F[xe]=U,F[N]=ce,xe=N;else break e}}return ae}function s(F,ae){var ce=F.sortIndex-ae.sortIndex;return ce!==0?ce:F.id-ae.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var f=performance;i.unstable_now=function(){return f.now()}}else{var m=Date,v=m.now();i.unstable_now=function(){return m.now()-v}}var p=[],b=[],S=1,y=null,E=3,A=!1,j=!1,D=!1,L=!1,Y=typeof setTimeout=="function"?setTimeout:null,G=typeof clearTimeout=="function"?clearTimeout:null,k=typeof setImmediate<"u"?setImmediate:null;function V(F){for(var ae=c(b);ae!==null;){if(ae.callback===null)o(b);else if(ae.startTime<=F)o(b),ae.sortIndex=ae.expirationTime,r(p,ae);else break;ae=c(b)}}function I(F){if(D=!1,V(F),!j)if(c(p)!==null)j=!0,R||(R=!0,P());else{var ae=c(b);ae!==null&&ge(I,ae.startTime-F)}}var R=!1,T=-1,z=5,Z=-1;function te(){return L?!0:!(i.unstable_now()-Z<z)}function W(){if(L=!1,R){var F=i.unstable_now();Z=F;var ae=!0;try{e:{j=!1,D&&(D=!1,G(T),T=-1),A=!0;var ce=E;try{t:{for(V(F),y=c(p);y!==null&&!(y.expirationTime>F&&te());){var xe=y.callback;if(typeof xe=="function"){y.callback=null,E=y.priorityLevel;var K=xe(y.expirationTime<=F);if(F=i.unstable_now(),typeof K=="function"){y.callback=K,V(F),ae=!0;break t}y===c(p)&&o(p),V(F)}else o(p);y=c(p)}if(y!==null)ae=!0;else{var Se=c(b);Se!==null&&ge(I,Se.startTime-F),ae=!1}}break e}finally{y=null,E=ce,A=!1}ae=void 0}}finally{ae?P():R=!1}}}var P;if(typeof k=="function")P=function(){k(W)};else if(typeof MessageChannel<"u"){var ne=new MessageChannel,ue=ne.port2;ne.port1.onmessage=W,P=function(){ue.postMessage(null)}}else P=function(){Y(W,0)};function ge(F,ae){T=Y(function(){F(i.unstable_now())},ae)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(F){F.callback=null},i.unstable_forceFrameRate=function(F){0>F||125<F?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):z=0<F?Math.floor(1e3/F):5},i.unstable_getCurrentPriorityLevel=function(){return E},i.unstable_next=function(F){switch(E){case 1:case 2:case 3:var ae=3;break;default:ae=E}var ce=E;E=ae;try{return F()}finally{E=ce}},i.unstable_requestPaint=function(){L=!0},i.unstable_runWithPriority=function(F,ae){switch(F){case 1:case 2:case 3:case 4:case 5:break;default:F=3}var ce=E;E=F;try{return ae()}finally{E=ce}},i.unstable_scheduleCallback=function(F,ae,ce){var xe=i.unstable_now();switch(typeof ce=="object"&&ce!==null?(ce=ce.delay,ce=typeof ce=="number"&&0<ce?xe+ce:xe):ce=xe,F){case 1:var K=-1;break;case 2:K=250;break;case 5:K=1073741823;break;case 4:K=1e4;break;default:K=5e3}return K=ce+K,F={id:S++,callback:ae,priorityLevel:F,startTime:ce,expirationTime:K,sortIndex:-1},ce>xe?(F.sortIndex=ce,r(b,F),c(p)===null&&F===c(b)&&(D?(G(T),T=-1):D=!0,ge(I,ce-xe))):(F.sortIndex=K,r(p,F),j||A||(j=!0,R||(R=!0,P()))),F},i.unstable_shouldYield=te,i.unstable_wrapCallback=function(F){var ae=E;return function(){var ce=E;E=ae;try{return F.apply(this,arguments)}finally{E=ce}}}})(ff)),ff}var x0;function LS(){return x0||(x0=1,sf.exports=HS()),sf.exports}var df={exports:{}},St={};/**
* @license React
* react-dom.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var S0;function qS(){if(S0)return St;S0=1;var i=fd();function r(S){var y="https://react.dev/errors/"+S;if(1<arguments.length){y+="?args[]="+encodeURIComponent(arguments[1]);for(var E=2;E<arguments.length;E++)y+="&args[]="+encodeURIComponent(arguments[E])}return"Minified React error #"+S+"; visit "+y+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function c(){}var o={d:{f:c,r:function(){throw Error(r(522))},D:c,C:c,L:c,m:c,X:c,S:c,M:c},p:0,findDOMNode:null},s=Symbol.for("react.portal"),f=Symbol.for("react.recoverable"),m=Symbol.for("react.optimistic_key");function v(S,y,E){var A=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:s,key:A==null?null:A===m?m:""+A,children:S,containerInfo:y,implementation:E}}var p=i.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function b(S,y){if(S==="font")return"";if(typeof y=="string")return y==="use-credentials"?y:""}return St.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=o,St.browser=function(S){return{$$typeof:f,_reason:S}},St.createPortal=function(S,y){var E=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!y||y.nodeType!==1&&y.nodeType!==9&&y.nodeType!==11)throw Error(r(299));return v(S,y,null,E)},St.flushSync=function(S){var y=p.T,E=o.p;try{if(p.T=null,o.p=2,S)return S()}finally{p.T=y,o.p=E,o.d.f()}},St.preconnect=function(S,y){typeof S=="string"&&(y?(y=y.crossOrigin,y=typeof y=="string"?y==="use-credentials"?y:"":void 0):y=null,o.d.C(S,y))},St.prefetchDNS=function(S){typeof S=="string"&&o.d.D(S)},St.preinit=function(S,y){if(typeof S=="string"&&y&&typeof y.as=="string"){var E=y.as,A=b(E,y.crossOrigin),j=typeof y.integrity=="string"?y.integrity:void 0,D=typeof y.fetchPriority=="string"?y.fetchPriority:void 0;E==="style"?o.d.S(S,typeof y.precedence=="string"?y.precedence:void 0,{crossOrigin:A,integrity:j,fetchPriority:D}):E==="script"&&o.d.X(S,{crossOrigin:A,integrity:j,fetchPriority:D,nonce:typeof y.nonce=="string"?y.nonce:void 0})}},St.preinitModule=function(S,y){if(typeof S=="string")if(typeof y=="object"&&y!==null){if(y.as==null||y.as==="script"){var E=b(y.as,y.crossOrigin);o.d.M(S,{crossOrigin:E,integrity:typeof y.integrity=="string"?y.integrity:void 0,nonce:typeof y.nonce=="string"?y.nonce:void 0,fetchPriority:typeof y.fetchPriority=="string"?y.fetchPriority:void 0})}}else y==null&&o.d.M(S)},St.preload=function(S,y){if(typeof S=="string"&&typeof y=="object"&&y!==null&&typeof y.as=="string"){var E=y.as,A=b(E,y.crossOrigin);o.d.L(S,E,{crossOrigin:A,integrity:typeof y.integrity=="string"?y.integrity:void 0,nonce:typeof y.nonce=="string"?y.nonce:void 0,type:typeof y.type=="string"?y.type:void 0,fetchPriority:typeof y.fetchPriority=="string"?y.fetchPriority:void 0,referrerPolicy:typeof y.referrerPolicy=="string"?y.referrerPolicy:void 0,imageSrcSet:typeof y.imageSrcSet=="string"?y.imageSrcSet:void 0,imageSizes:typeof y.imageSizes=="string"?y.imageSizes:void 0,media:typeof y.media=="string"?y.media:void 0})}},St.preloadModule=function(S,y){if(typeof S=="string")if(y){var E=b(y.as,y.crossOrigin);o.d.m(S,{as:typeof y.as=="string"&&y.as!=="script"?y.as:void 0,crossOrigin:E,integrity:typeof y.integrity=="string"?y.integrity:void 0,nonce:typeof y.nonce=="string"?y.nonce:void 0,fetchPriority:typeof y.fetchPriority=="string"?y.fetchPriority:void 0})}else o.d.m(S)},St.requestFormReset=function(S){o.d.r(S)},St.unstable_batchedUpdates=function(S,y){return S(y)},St.useFormState=function(S,y,E){return p.H.useFormState(S,y,E)},St.useFormStatus=function(){return p.H.useHostTransitionStatus()},St.version="19.3.1",St}var E0;function _y(){if(E0)return df.exports;E0=1;function i(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(r){console.error(r)}}return i(),df.exports=qS(),df.exports}/**
* @license React
* react-dom-client.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var C0;function GS(){if(C0)return du;C0=1;var i=LS(),r=fd(),c=_y();function o(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function s(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function f(e){for(var t=e,n=t;n&&!n.alternate;)t=n,(t.flags&4098)!==0&&(e=t.return),n=t.return;for(;t.return;)t=t.return;return t.tag===3?e:null}function m(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function v(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function p(e){if(f(e)!==e)throw Error(o(188))}function b(e){var t=e.alternate;if(!t){if(t=f(e),t===null)throw Error(o(188));return t!==e?null:e}for(var n=e,l=t;;){var a=n.return;if(a===null)break;var u=a.alternate;if(u===null){if(l=a.return,l!==null){n=l;continue}break}if(a.child===u.child){for(u=a.child;u;){if(u===n)return p(a),e;if(u===l)return p(a),t;u=u.sibling}throw Error(o(188))}if(n.return!==l.return)n=a,l=u;else{for(var d=!1,g=a.child;g;){if(g===n){d=!0,n=a,l=u;break}if(g===l){d=!0,l=a,n=u;break}g=g.sibling}if(!d){for(g=u.child;g;){if(g===n){d=!0,n=u,l=a;break}if(g===l){d=!0,l=u,n=a;break}g=g.sibling}if(!d)throw Error(o(189))}}if(n.alternate!==l)throw Error(o(190))}if(n.tag!==3)throw Error(o(188));return n.stateNode.current===n?e:t}function S(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=S(e),t!==null)return t;e=e.sibling}return null}function y(e,t,n,l,a,u){for(;e!==null;){if((e.tag===5||e.tag===27||e.tag===6)&&n(e,l,a,u)||(e.tag!==22||e.memoizedState===null)&&(t||e.tag!==5&&e.tag!==27)&&y(e.child,t,n,l,a,u))return!0;e=e.sibling}return!1}function E(e){for(e=e.return;e!==null;){if(e.tag===3||e.tag===5||e.tag===27)return e;e=e.return}return null}function A(e){var t=!1;for(e=e.return;e!==null&&(e.tag===4&&(t=!0),!(e.tag===3||e.tag===5||e.tag===27));)e=e.return;return t}function j(e){var t=[null,null],n=E(e);return n===null||D(t,e,n.child,{foundSelf:!1}),t}function D(e,t,n,l){for(;n!==null;){if(n===t)l.foundSelf=!0;else if(n.tag===5||n.tag===27||n.tag===6){if(l.foundSelf)return e[1]=n,!0;e[0]=n}else if((n.tag!==22||n.memoizedState===null)&&D(e,t,n.child,l))return!0;n=n.sibling}return!1}function L(e){switch(e.tag){case 5:case 27:case 6:return e.stateNode;case 3:return e.stateNode.containerInfo;default:throw Error(o(559))}}var Y=null,G=null;function k(e,t,n){return e===n?!0:e===t?(Y=e,!0):!1}function V(e,t,n){return e===n?(G=e,!1):e===t?(G!==null&&(Y=e),!0):!1}function I(e){if(e===null)return null;do e=e===null?null:e.return;while(e&&e.tag!==5&&e.tag!==27&&e.tag!==3);return e||null}function R(e,t,n){for(var l=0,a=e;a;a=n(a))l++;a=0;for(var u=t;u;u=n(u))a++;for(;0<l-a;)e=n(e),l--;for(;0<a-l;)t=n(t),a--;for(;l--;){if(e===t||t!==null&&e===t.alternate)return e;e=n(e),t=n(t)}return null}var T=Object.assign,z=Symbol.for("react.element"),Z=Symbol.for("react.transitional.element"),te=Symbol.for("react.portal"),W=Symbol.for("react.fragment"),P=Symbol.for("react.strict_mode"),ne=Symbol.for("react.profiler"),ue=Symbol.for("react.consumer"),ge=Symbol.for("react.context"),F=Symbol.for("react.forward_ref"),ae=Symbol.for("react.suspense"),ce=Symbol.for("react.suspense_list"),xe=Symbol.for("react.memo"),K=Symbol.for("react.lazy"),Se=Symbol.for("react.activity"),J=Symbol.for("react.legacy_hidden"),me=Symbol.for("react.memo_cache_sentinel"),N=Symbol.for("react.view_transition"),U=Symbol.for("react.recoverable"),$=Symbol.iterator;function ee(e){return e===null||typeof e!="object"?null:(e=$&&e[$]||e["@@iterator"],typeof e=="function"?e:null)}var he=Symbol.for("react.client.reference");function ie(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===he?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case W:return"Fragment";case ne:return"Profiler";case P:return"StrictMode";case ae:return"Suspense";case ce:return"SuspenseList";case Se:return"Activity";case N:return"ViewTransition"}if(typeof e=="object")switch(e.$$typeof){case te:return"Portal";case ge:return e.displayName||"Context";case ue:return(e._context.displayName||"Context")+".Consumer";case F:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case xe:return t=e.displayName||null,t!==null?t:ie(e.type)||"Memo";case K:t=e._payload,e=e._init;try{return ie(e(t))}catch{}}return null}var Ee=Array.isArray,fe=r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,ye=c.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Dt={pending:!1,data:null,method:null,action:null},Wn=[],ga=-Line truncated
at`)?" (<anonymous>)":-1<n.stack.indexOf("@")?"@unknown:0:0":""}return`
`+To+e+Yd}var _o=!1;function Ao(e,t){if(!e||_o)return"";_o=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var l={DetermineComponentFrameRoot:function(){try{if(t){var X=function(){throw Error()};if(Object.defineProperty(X.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(X,[])}catch(le){var _=le}Reflect.construct(e,[],X)}else{try{X.call()}catch(le){_=le}X=!1;try{var H=Object.getOwnPropertyDescriptor(e.prototype,"props");Object.defineProperty(e.prototype,"props",{configurable:!0,set:function(){throw Error()}}),X=!0,new e}finally{X&&(H!==void 0?Object.defineProperty(e.prototype,"props",H):delete e.prototype.props)}}}else{try{throw Error()}catch(le){_=le}(X=e())&&typeof X.catch=="function"&&X.catch(function(){})}}catch(le){if(le&&_&&typeof le.stack=="string")return[le.stack,_.stack]}return[null,null]}};l.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var a=Object.getOwnPropertyDescriptor(l.DetermineComponentFrameRoot,"name");a&&a.configurable&&Object.defineProperty(l.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=l.DetermineComponentFrameRoot(),d=u[0],g=u[1];if(d&&g){var C=d.split(`
`),M=g.split(`
`);for(a=l=0;l<C.length&&!C[l].includes("DetermineComponentFrameRoot");)l++;for(;a<M.length&&!M[a].includes("DetermineComponentFrameRoot");)a++;if(l===C.length||a===M.length)for(l=C.length-1,a=M.length-1;1<=l&&0<=a&&C[l]!==M[a];)a--;for(;1<=l&&0<=a;l--,a--)if(C[l]!==M[a]){if(l!==1||a!==1)do if(l--,a--,0>a||C[l]!==M[a]){var q=`
`+C[l].replace(" at new "," at ");return e.displayName&&q.includes("<anonymous>")&&(q=q.replace("<anonymous>",e.displayName)),q}while(1<=l&&0<=a);break}}}finally{_o=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?tl(n):""}function Hp(e,t){switch(e.tag){case 26:case 27:case 5:return tl(e.type);case 16:return tl("Lazy");case 13:return e.child!==t&&t!==null?tl("Suspense Fallback"):tl("Suspense");case 19:return tl("SuspenseList");case 0:case 15:return Ao(e.type,!1);case 11:return Ao(e.type.render,!1);case 1:return Ao(e.type,!0);case 31:return tl("Activity");case 30:return tl("ViewTransition");default:return""}}function Vd(e){try{var t="",n=null;do t+=Hp(e,n),n=e,e=e.return;while(e);return t}catch(l){return`
Error generating stack: `+l.message+`
`+l.stack}}var Ro=Object.prototype.hasOwnProperty,jo=i.unstable_scheduleCallback,Oo=i.unstable_cancelCallback,Lp=i.unstable_shouldYield,qp=i.unstable_requestPaint,Ut=i.unstable_now,Gp=i.unstable_getCurrentPriorityLevel,Qd=i.unstable_ImmediatePriority,Xd=i.unstable_UserBlockingPriority,Nu=i.unstable_NormalPriority,Yp=i.unstable_LowPriority,Zd=i.unstable_IdlePriority,Vp=i.log,Qp=i.unstable_setDisableYieldValue,pi=null,Bt=null;function nl(e){if(typeof Vp=="function"&&Qp(e),Bt&&typeof Bt.setStrictMode=="function")try{Bt.setStrictMode(pi,e)}catch{}}var kt=Math.clz32?Math.clz32:Kp,Xp=Math.log,Zp=Math.LN2;function Kp(e){return e>>>=0,e===0?32:31-(Xp(e)/Zp|0)|0}var wu=256,Tu=262144,_u=4194304;function Bl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Au(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var a=0,u=e.suspendedLanes,d=e.pingedLanes;e=e.warmLanes;var g=l&134217727;return g!==0?(l=g&~u,l!==0?a=Bl(l):(d&=g,d!==0?a=Bl(d):n||(n=g&~e,n!==0&&(a=Bl(n))))):(g=l&~u,g!==0?a=Bl(g):d!==0?a=Bl(d):n||(n=l&~e,n!==0&&(a=Bl(n)))),a===0?0:t!==0&&t!==a&&(t&u)===0&&(u=a&-a,n=t&-t,u>=n||u===32&&(n&4194048)!==0)?t:a}function bi(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Kd(e,t){(t&8)!==0&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0<n;){var l=31-kt(n),a=1<<l;t|=e[l],n&=~a}return t}function Ip(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Id(){var e=_u;return _u<<=1,(_u&62914560)===0&&(_u=4194304),e}function Mo(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function xi(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Jp(e,t,n,l,a,u){var d=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var g=e.entanglements,C=e.expirationTimes,M=e.hiddenUpdates;for(n=d&~n;0<n;){var q=31-kt(n),X=1<<q;g[q]=0,C[q]=-1;var _=M[q];if(_!==null)for(M[q]=null,q=0;q<_.length;q++){var H=_[q];H!==null&&(H.lane&=-536870913)}n&=~X}l!==0&&Jd(e,l,0),u!==0&&a===0&&e.tag!==0&&(e.suspendedLanes|=u&~(d&~t))}function Jd(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var l=31-kt(t);e.entangledLanes|=t,e.entanglements[l]=e.entanglements[l]|1073741824|n&261930}function Fd(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var l=31-kt(n),a=1<<l;a&t|e[l]&t&&(e[l]|=t),n&=~a}}function Pd(e,t){var n=t&-t;return n=(n&42)!==0?1:zo(n),(n&(e.suspendedLanes|t))!==0?0:n}function zo(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:e=128;break;case 268435456:e=134217728;break;default:e=0}return e}function Do(e){return e&=-e,2<e?8<e?(e&134217727)!==0?32:268435456:8:2}function $d(){var e=ye.p;return e!==0?e:(e=window.event,e===void 0?32:i0(e.type))}function Wd(e,t){var n=ye.p;try{return ye.p=e,t()}finally{ye.p=n}}var Mn=Math.random().toString(36).slice(2),ht="__reactFiber$"+Mn,_t="__reactProps$"+Mn,pa="__reactContainer$"+Mn,em="__reactEvents$"+Mn,Fp="__reactListeners$"+Mn,Pp="__reactHandles$"+Mn,tm="__reactResources$"+Mn,Si="__reactMarker$"+Mn,Ru="__reactLoad$"+Mn;function ju(e){delete e[ht],delete e[_t],delete e[Fp],delete e[Pp]}function kl(e){var t;if(t=e[ht])return t;for(var n=e.parentNode;n;){if(t=n[pa]||n[ht]){if(n=t.alternate,t.child!==null||n!==null&&n.child!==null)for(e=Lg(e);e!==null;){if(n=e[ht])return n;e=Lg(e)}return t}e=n,n=e.parentNode}return null}function ba(e){if(e=e[ht]||e[pa]){var t=e.tag;if(t===5||t===6||t===13||t===31||t===26||t===27||t===3)return e}return null}function Ei(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e.stateNode;throw Error(o(33))}function xa(e){var t=e[tm];return t||(t=e[tm]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function rt(e){e[Si]=!0}function nm(e){e[Ru]=void 0}var lm=new Set,am={};function Hl(e,t){Sa(e,t),Sa(e+"Capture",t)}funct Line truncated
`).replace(Hx,"")}function bg(e,t){return t=pg(t),pg(e)===t}function ke(e,t,n,l,a,u){switch(n){case"children":if(typeof l=="string")t==="body"||t==="textarea"&&l===""||Ca(e,l);else if(typeof l=="number"||typeof l=="bigint")t!=="body"&&Ca(e,""+l);else return;break;case"className":Mu(e,"class",l);break;case"tabIndex":Mu(e,"tabindex",l);break;case"dir":case"role":case"viewBox":case"width":case"height":Mu(e,n,l);break;case"style":hm(e,l,u);return;case"data":if(t!=="object"){Mu(e,"data",l);break}case"src":case"href":if(l===""&&(t!=="a"||n!=="href")){e.removeAttribute(n);break}if(l==null||typeof l=="function"||typeof l=="symbol"||typeof l=="boolean"){e.removeAttribute(n);break}l=zu(l),e.setAttribute(n,l);break;case"action":case"formAction":if(typeof l=="function"){e.setAttribute(n,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof u=="function"&&(n==="formAction"?(t!=="input"&&ke(e,t,"name",a.name,a,null),ke(e,t,"formEncType",a.formEncType,a,null),ke(e,t,"formMethod",a.formMethod,a,null),ke(e,t,"formTarget",a.formTarget,a,null)):(ke(e,t,"encType",a.encType,a,null),ke(e,t,"method",a.method,a,null),ke(e,t,"target",a.target,a,null)));if(l==null||typeof l=="symbol"||typeof l=="boolean"){e.removeAttribute(n);break}l=zu(l),e.setAttribute(n,l);break;case"onClick":l!=null&&(e.onclick=yn);return;case"onScroll":l!=null&&Ae("scroll",e);return;case"onScrollEnd":l!=null&&Ae("scrollend",e);return;case"dangerouslySetInnerHTML":if(l!=null){if(typeof l!="object"||!("__html"in l))throw Error(o(61));if(n=l.__html,n!=null){if(a.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==n&&(e.innerHTML=n)}}break;case"multiple":e.multiple=l&&typeof l!="function"&&typeof l!="symbol";break;case"muted":e.muted=l&&typeof l!="function"&&typeof l!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(l==null||typeof l=="function"||typeof l=="boolean"||typeof l=="symbol"){e.removeAttribute("xlink:href");break}n=zu(l),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",n);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":l!=null&&typeof l!="function"&&typeof l!="symbol"?e.setAttribute(n,l):e.removeAttribute(n);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"credentialless":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":l&&typeof l!="function"&&typeof l!="symbol"?e.setAttribute(n,""):e.removeAttribute(n);break;case"capture":case"download":l===!0?e.setAttribute(n,""):l!==!1&&l!=null&&typeof l!="function"&&typeof l!="symbol"?e.setAttribute(n,l):e.removeAttribute(n);break;case"cols":case"rows":case"size":case"span":l!=null&&typeof l!="function"&&typeof l!="symbol"&&!isNaN(l)&&1<=l?e.setAttribute(n,l):e.removeAttribute(n);break;case"rowSpan":case"start":l==null||typeof l=="function"||typeof l=="symbol"||isNaN(l)?e.removeAttribute(n):e.setAttribute(n,l);break;case"popover":Ae("beforetoggle",e),Ae("toggle",e),Ou(e,"popover",l);break;case"xlinkActuate":zn(e,"http://www.w3.org/1999/xlink","xlink:actuate",l);break;case"xlinkArcrole":zn(e,"http://www.w3.org/1999/xlink","xlink:arcrole",l);break;case"xlinkRole":zn(e,"http://www.w3.org/1999/xlink","xlink:role",l);break;case"xlinkShow":zn(e,"http://www.w3.org/1999/xlink","xlink:show",l);break;case"xlinkTitle":zn(e,"http://www.w3.org/1999/xlink","xlink:title",l);break;case"xlinkType":zn(e,"http://www.w3.org/1999/xlink","xlink:type",l);break;case"xmlBase":zn(e,"http://www.w3.org/XML/1998/namespace","xml:base",l);break;case"xmlLang":zn(e,"http://www.w3.org/XML/1998/namespace","xml:lang",l);break;case"xmlSpace":zn(e,"http://www.w3.org/XML/1998/namespace","xml:space",l);break;case"is":Ou(e,"is",l);break;case"innerText":case"textContent":return;default:if(!(2<n.length)||n[0]!=="o"&&n[0]!=="O"||n[1]!=="n"&&n[1]!=="N")n=lb.get(n)||n,Ou(e,n,l);else return}Me=!0}function Bs(e,t,n,l,a,u){switch(n){case"style":hm(e,l,u);return;case"dangerouslySetInnerHTML":if(l!=null){if(typeof l!="object"||!("__html"in l))throw Error(o(61));if(n=l.__html,n!=null){if(a.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==n&&(e.innerHTML=n)}}break;case"children":if(typeof l=="string")Ca(e,l);else if(typeof l=="number"||typeof l=="bigint")Ca(e,""+l);else return;break;case"onScroll":l!=null&&Ae("scroll",e);return;case"onScrollEnd":l!=null&&Ae("scro Line truncated
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const e2=i=>i.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),jy=(...i)=>i.filter((r,c,o)=>!!r&&r.trim()!==""&&o.indexOf(r)===c).join(" ").trim();/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/var t2={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const n2=x.forwardRef(({color:i="currentColor",size:r=24,strokeWidth:c=2,absoluteStrokeWidth:o,className:s="",children:f,iconNode:m,...v},p)=>x.createElement("svg",{ref:p,...t2,width:r,height:r,stroke:i,strokeWidth:o?Number(c)*24/Number(r):c,className:jy("lucide",s),...v},[...m.map(([b,S])=>x.createElement(b,S)),...Array.isArray(f)?f:[f]]));/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Xe=(i,r)=>{const c=x.forwardRef(({className:o,...s},f)=>x.createElement(n2,{ref:f,iconNode:r,className:jy(`lucide-${e2(i)}`,o),...s}));return c.displayName=`${i}`,c};/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const l2=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],Oy=Xe("BookOpen",l2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const a2=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],i2=Xe("Check",a2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const u2=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],r2=Xe("CircleCheck",u2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const o2=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],c2=Xe("EyeOff",o2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const s2=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],f2=Xe("Eye",s2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const d2=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],_0=Xe("KeyRound",d2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const m2=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],h2=Xe("Layers",m2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const v2=[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]],g2=Xe("LayoutGrid",v2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const y2=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],p2=Xe("Lock",y2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const b2=[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]],My=Xe("MessageSquare",b2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const x2=[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]],S2=Xe("Moon",x2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const E2=[["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z",key:"12rzf8"}]],C2=Xe("Palette",E2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const N2=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]],w2=Xe("PanelsTopLeft",N2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const T2=[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]],_2=Xe("QrCode",T2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const A2=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],R2=Xe("RefreshCw",A2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const j2=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],dd=Xe("Search",j2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const O2=[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]],M2=Xe("Send",O2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const z2=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],D2=Xe("ShieldCheck",z2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const U2=[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]],B2=Xe("Smartphone",U2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const k2=[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]],H2=Xe("Sparkles",k2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const L2=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],q2=Xe("Sun",L2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const G2=[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]],md=Xe("Terminal",G2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Y2=[["path",{d:"m19 5 3-3",key:"yk6iyv"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z",key:"1snsnr"}]],V2=Xe("Unplug",Y2);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Q2=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]],X2=Xe("User",Q2);var Z2=Object.defineProperty,hd=(i,r)=>Z2(i,"name",{value:r,configurable:!0});function Jf(i,r){if(typeof i=="function")return i(r);i!=null&&(i.current=r)}hd(Jf,"setRef");function ra(...i){return r=>{let c=!1;const o=i.map(s=>{const f=Jf(s,r);return!c&&typeof f=="function"&&(c=!0),f});if(c)return()=>{for(let s=0;s<o.length;s++){const f=o[s];typeof f=="function"?f():Jf(i[s],null)}}}}hd(ra,"composeRefs");function zt(...i){return x.useCallback(ra(...i),i)}hd(zt,"useComposedRefs");var K2=Object.defineProperty,Kt=(i,r)=>K2(i,"name",{value:r,configurable:!0});function Ml(i){const r=x.forwardRef((c,o)=>{let{children:s,...f}=c,m=null,v=!1;const p=[];s=Hy(s),x.Children.forEach(s,E=>{var A;if(By(E)){v=!0;const j=E;let D="child"in j.props?j.props.child:j.props.children;for(;vd(D)&&typeof fo=="function";)D=fo(D._payload);m=F2(j,D),p.push((A=m==null?void 0:m.props)==null?void 0:A.children)}else p.push(E)}),m?m=x.cloneElement(m,void 0,p):!v&&x.Children.count(s)===1&&x.isValidElement(s)&&(m=s);const b=m?Uy(m):void 0,S=zt(o,b);if(!m){if(s||s===0)throw new Error(v?W2(i):$2(i));return s}const y=Dy(f,m.props??{});return m.type!==x.Fragment&&(y.ref=o?S:b),x.cloneElement(m,y)});return r.displayName=`${i}.Slot`,r}Kt(Ml,"createSlot");var I2=Ml("Slot"),zy=Symbol.for("radix.slottable");function J2(i){const r=Kt(c=>"child"in c?c.children(c.child):c.children,"Slottable");return r.displayName=`${i}.Slottable`,r.__radixId=zy,r}Kt(J2,"createSlottable");var F2=Kt((i,r)=>"child"in i.props?x.isValidElement(r)?x.cloneElement(r,void 0,i.props.children(r.props.children)):null:x.isValidElement(r)?r:null,"getSlottableElementFromSlottable");function Dy(i,r){const c={...r};for(const o in r){const s=i[o],f=r[o];/^on[A-Z]/.test(o)?s&&f?c[o]=(...v)=>{const p=f(...v);return s(...v),p}:s&&(c[o]=s):o==="style"?c[o]={...s,...f}:o==="className"?c[o]=[s,f].filter(Boolean).join(" "):o==="aria-describedby"&&(c[o]=Ly(f,s))}return{...i,...c}}Kt(Dy,"mergeProps");function Uy(i){var o,s;let r=(o=Object.getOwnPropertyDescriptor(i.props,"ref"))==null?void 0:o.get,c=r&&"isReactWarning"in r&&r.isReactWarning;return c?i.ref:(r=(s=Object.getOwnPropertyDescriptor(i,"ref"))==null?void 0:s.get,c=r&&"isReactWarning"in r&&r.isReactWarning,c?i.props.ref:i.props.ref||i.ref)}Kt(Uy,"getElementRef");function By(i){return x.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===zy}Kt(By,"isSlottable");var P2=Symbol.for("react.lazy");function vd(i){return i!=null&&typeof i=="object"&&"$$typeof"in i&&i.$$typeof===P2&&"_payload"in i&&ky(i._payload)}Kt(vd,"isLazyComponent");function ky(i){return typeof i=="object"&&i!==null&&"then"in i}Kt(ky,"isPromiseLike");function Hy(i){let r=i;for(;vd(r)&&typeof fo=="function";)r=fo(r._payload);return r}Kt(Hy,"useUnwrappedLazy");function Ly(...i){const r=new Set;for(const c of i)if(typeof c=="string")for(const o of String(c).trim().split(/\s+/))o&&r.add(o);return r.size>0?Array.from(r).join(" "):void 0}Kt(Ly,"concatAriaDescribedby");var $2=Kt(i=>`${i} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),W2=Kt(i=>`${i} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),fo=sa[" use ".trim().toString()];function qy(i){var r,c,o="";if(typeof i=="string"||typeof i=="number")o+=i;else if(typeof i=="object")if(Array.isArray(i)){var s=i.length;for(r=0;r<s;r++)i[r]&&(c=qy(i[r]))&&(o&&(o+=" "),o+=c)}else for(c in i)i[c]&&(o&&(o+=" "),o+=c);return o}function Gy(){for(var i,r,c=0,o="",s=arguments.length;c<s;c++)(i=arguments[c])&&(r=qy(i))&&(o&&(o+=" "),o+=r);return o}const A0=i=>typeof i=="boolean"?`${i}`:i===0?"0":i,R0=Gy,Yy=(i,r)=>c=>{var o;if((r==null?void 0:r.variants)==null)return R0(i,c==null?void 0:c.class,c==null?void 0:c.className);const{variants:s,defaultVariants:f}=r,m=Object.keys(s).map(b=>{const S=c==null?void 0:c[b],y=f==null?void 0:f[b];if(S===null)return null;const E=A0(S)||A0(y);return s[b][E]}),v=c&&Object.entries(c).reduce((b,S)=>{let[y,E]=S;return E===void 0||(b[y]=E),b},{}),p=r==null||(o=r.compoundVariants)===null||o===void 0?void 0:o.reduce((b,S)=>{let{class:y,className:E,...A}=S;return Object.entries(A).every(j=>{let[D,L]=j;return Array.isArray(L)?L.includes({...f,...v}[D]):{...f,...v}[D]===L})?[...b,y,E]:b},[]);return R0(i,m,p,c==null?void 0:c.class,c==null?void 0:c.className)},eE=(i,r)=>{const c=new Array(i.length+r.length);for(let o=0;o<i.length;o++)c[o]=i[o];for(let o=0;o<r.length;o++)c[i.length+o]=r[o];return c},tE=(i,r)=>({classGroupId:i,validator:r}),Vy=(i=new Map,r=null,c)=>({nextPart:i,validators:r,classGroupId:c}),mo="-",j0=[],nE="arbitrary..",lE=i=>{const r=iE(i),{conflictingClassGroups:c,conflictingClassGroupModifiers:o}=i;return{getClassGroupId:m=>{if(m.startsWith("[")&&m.endsWith("]"))return aE(m);const v=m.splitLine truncated
.`.concat(d4,` {
overflow: hidden `).concat(o,`;
padding-right: `).concat(v,"px ").concat(o,`;
}
body[`).concat(hi,`] {
overflow: hidden `).concat(o,`;
overscroll-behavior: contain;
`).concat([r&&"position: relative ".concat(o,";"),c==="margin"&&`
padding-left: `.concat(s,`px;
padding-top: `).concat(f,`px;
padding-right: `).concat(m,`px;
margin-left:0;
margin-top:0;
margin-right: `).concat(v,"px ").concat(o,`;
`),c==="padding"&&"padding-right: ".concat(v,"px ").concat(o,";")].filter(Boolean).join(""),`
}
.`).concat(co,` {
right: `).concat(v,"px ").concat(o,`;
}
.`).concat(so,` {
margin-right: `).concat(v,"px ").concat(o,`;
}
.`).concat(co," .").concat(co,` {
right: 0 `).concat(o,`;
}
.`).concat(so," .").concat(so,` {
margin-right: 0 `).concat(o,`;
}
body[`).concat(hi,`] {
`).concat(m4,": ").concat(v,`px;
}
`)},I0=function(){var i=parseInt(document.body.getAttribute(hi)||"0",10);return isFinite(i)?i:0},M4=function(){x.useEffect(function(){return document.body.setAttribute(hi,(I0()+1).toString()),function(){var i=I0()-1;i<=0?document.body.removeAttribute(hi):document.body.setAttribute(hi,i.toString())}},[])},z4=function(i){var r=i.noRelative,c=i.noImportant,o=i.gapMode,s=o===void 0?"margin":o;M4();var f=x.useMemo(function(){return R4(s)},[s]);return x.createElement(j4,{styles:O4(f,!r,s,c?"":"!important")})},rd=!1;if(typeof window<"u")try{var no=Object.defineProperty({},"passive",{get:function(){return rd=!0,!0}});window.addEventListener("test",no,no),window.removeEventListener("test",no,no)}catch{rd=!1}var ri=rd?{passive:!1}:!1,D4=function(i){return i.tagName==="TEXTAREA"},np=function(i,r){if(!(i instanceof Element))return!1;var c=window.getComputedStyle(i);return c[r]!=="hidden"&&!(c.overflowY===c.overflowX&&!D4(i)&&c[r]==="visible")},U4=function(i){return np(i,"overflowY")},B4=function(i){return np(i,"overflowX")},J0=function(i,r){var c=r.ownerDocument,o=r;do{typeof ShadowRoot<"u"&&o instanceof ShadowRoot&&(o=o.host);var s=lp(i,o);if(s){var f=ap(i,o),m=f[1],v=f[2];if(m>v)return!0}o=o.parentNode}while(o&&o!==c.body);return!1},k4=function(i){var r=i.scrollTop,c=i.scrollHeight,o=i.clientHeight;return[r,c,o]},H4=function(i){var r=i.scrollLeft,c=i.scrollWidth,o=i.clientWidth;return[r,c,o]},lp=function(i,r){return i==="v"?U4(r):B4(r)},ap=function(i,r){return i==="v"?k4(r):H4(r)},L4=function(i,r){return i==="h"&&r==="rtl"?-1:1},q4=function(i,r,c,o,s){var f=L4(i,window.getComputedStyle(r).direction),m=f*o,v=c.target,p=r.contains(v),b=!1,S=m>0,y=0,E=0;do{if(!v)break;var A=ap(i,v),j=A[0],D=A[1],L=A[2],Y=D-L-f*j;(j||Y)&&lp(i,v)&&(y+=Y,E+=j);var G=v.parentNode;v=G&&G.nodeType===Node.DOCUMENT_FRAGMENT_NODE?G.host:G}while(!p&&v!==document.body||p&&(r.contains(v)||r===v));return(S&&Math.abs(y)<1||!S&&Math.abs(E)<1)&&(b=!0),b},lo=function(i){return"changedTouches"in i?[i.changedTouches[0].clientX,i.changedTouches[0].clientY]:[0,0]},F0=function(i){return[i.deltaX,i.deltaY]},P0=function(i){return i&&"current"in i?i.current:i},G4=function(i,r){return i[0]===r[0]&&i[1]===r[1]},Y4=function(i){return`
.block-interactivity-`.concat(i,` {pointer-events: none;}
.allow-interactivity-`).concat(i,` {pointer-events: all;}
`)},V4=0,oi=[];function Q4(i){var r=x.useRef([]),c=x.useRef([0,0]),o=x.useRef(),s=x.useState(V4++)[0],f=x.useState(tp)[0],m=x.useRef(i);x.useEffect(function(){m.current=i},[i]),x.useEffect(function(){if(i.inert){document.body.classList.add("block-interactivity-".concat(s));var D=f4([i.lockRef.current],(i.shards||[]).map(P0),!0).filter(Boolean);return D.forEach(function(L){return L.classList.add("allow-interactivity-".concat(s))}),function(){document.body.classList.remove("block-interactivity-".concat(s)),D.forEach(function(L){return L.classList.remove("allow-interactivity-".concat(s))})}}},[i.inert,i.lockRef.current,i.shards]);var v=x.useCallback(function(D,L){if("touches"in D&&D.touches.length===2||D.type==="wheel"&&D.ctrlKey)return!m.current.allowPinchZoom;var Y=lo(D),G=c.current,k="deltaX"in D?D.deltaX:G[0]-Y[0],V="deltaY"in D?D.deltaY:G[1]-Y[1],I,R=D.target,T=Math.abs(k)>Math.abs(V)?"h":"v";if("touches"in D&&T==="h"&&R.type==="range")return!1;var z=window.getSelection(),Z=z&&z.anchorNode,te=Z?Z===R||Z.contains(R):!1;if(te)return!1;var W=J0(T,R);if(!W)return!0;if(W?I=T:(I=T==="v"?"h":"v",W=J0(T,R)),!W)return!1;if(!o.current&&"changedTouches"in D&&(k||V)&&(o.current=I),!I)return!0;var P=o.current||I;return q4(P,L,D,P==="h"?k:V)},[]),p=x.useCallback(function(D){var L=D;if(!(!oi.length||oi[oi.length-1]!==f)){var Y="deltaY"in L?F0(L):lo(L),G=r.current.filter(function(I){return I.name===L.type&&(I.target===L.target||L.target===I.shadowParent)&&G4(I.delta,Y)})[0];if(G&&G.should){L.cancelable&&L.preventDefault();return}if(!G){var k=(m.current.shards||[]).map(P0).filter(Boolean).filter(function(I){return I.contains(L.target)}),V=k.length>0?v(L,k[0]):!m.current.noIsolation;V&&L.cancelable&&L.preventDefault()}}},[]),b=x.useCallback(function(D,L,Y,G){var k={name:D,delta:L,target:Y,should:G,shadowParent:X4(Y)};r.current.push(k),setTimeout(function(){r.current=r.current.filter(function(V){return V!==k})},1)},[]),S=x.useCallback(function(D){c.current=lo(D),o.current=void 0},[]),y=x.useCallback(function(D){b(D.type,F0(D),D.target,v(D,i.lockRef.current))},[]),E=x.useCallback(function(D){b(D.type,lo(D),D.target,v(D,i.lockRef.current))},[]);x.useEffect(function(){return oi.push(f),i.setCallbacks({onScrollCapture:y,onWheelCapture:y,onTouchMoveCapture:E}),document.addEventListener("wheel",p,ri),document.addEventListener("touchmove",p,ri),document.addEventListener("touchstart",S,ri),function(){oi=oi.filter(function(D){return D!==f}),document.removeEventListener("wheel",p,ri),document.removeEventListener("touchmove",p,ri),document.removeEventListener("touchstart",S,ri)}},[]);var A=i.removeScrollBar,j=i.inert;return x.createElement(x.Fragment,null,j?x.createElement(f,{styles:Y4(s)}):null,A?x.createElement(z4,{noRelative:i.noRelative,gapMode:i.gapMode}):null)}function X4(i){for(var r=null;i!==null;)i instanceof ShadowRoot&&(r=i.host,i=i.host),i=i.parentNode;return r}const Z4=x4(ep,Q4);var ip=x.forwardRef(function(i,r){return x.createElement(xo,On({},i,{ref:r,sideCar:Z4}))});ip.classNames=xo.classNames;var K4=function(i){if(typeof document>"u")return null;var r=Array.isArray(i)?i[0]:i;return r.ownerDocument.body},ci=new WeakMap,ao=new WeakMap,io={},Cf=0,up=function(i){return i&&(i.host||up(i.parentNode))},I4=function(i,r){return r.map(function(c){if(i.contains(c))return c;var o=up(c);return o&&i.contains(o)?o:(console.error("aria-hidden",c,"in not contained inside",i,". Doing nothing"),null)}).filter(function(c){return!!c})},J4=function(i,r,c,o){var s=I4(r,Array.isArray(i)?i:[i]);io[c]||(io[c]=new WeakMap);var f=io[c],m=[],v=new Set,p=new Set(s),b=function(y){!y||v.has(y)||(v.add(y),b(y.parentNode))};s.forEach(b);var S=function(y){!y||p.has(y)||Array.prototype.forEach.call(y.children,function(E){if(v.has(E))S(E);else try{var A=E.getAttribute(o),j=A!==null&&A!=="false",D=(ci.get(E)||0)+1,L=(f.get(E)||0)+1;ci.set(E,D),f.set(E,L),m.push(E),D===1&&j&&ao.set(E,!0),L===1&&E.setAttribute(c,"true"),j||E.setAttribute(o,"true")}catch(Y){console.error("aria-hidden: cannot operate on ",E,Y)}})};return S(r),v.clear(),Cf++,function(){m.forEach(function(y){var E=ci.get(y)-1,A=f.get(y)-1;ci.set(y,E),f.set(y,A),E||(ao.has(y)||y.removeAttribute(o),ao.delete(y)),A||y.removeAttribute(c)}),Cf--,Cf||(ci=new WeakMap,ci=new WeakMap,ao=new WeakMap,io={})}},F4=function(i,r,c){c===void 0&&(c="data-aria-hidden");var o=Array.from(Array.isArray(i)?i:[i]),s=K4(i);return s?(o.push.apply(o,Array.from(s.querySelectorAll("[aria-live], script"))),J4(o,s,c,"aria-hidden")):function(){return null}},P4=Object.defineProperty,rn=(i,r)=>P4(i,"name",{value:r,configurable:!0}),jd="Dialog",[rp,mN]=da(jd),[$4,$n]=rp(jd),op=rn(i=>{const{__scopeDialog:r,children:c,open:o,defaultOpen:s,onOpenChange:f,modal:m=!0}=i,v=x.useRef(null),p=x.useRef(null),{nodes:b,registry:S}=X1(),[y,E]=bu({prop:o,defaultProp:s??!1,onChange:f,caller:jd}),[A,j]=x.useState(0),[D,L]=x.useState(0);return h.jsx($4,{scope:r,triggerRef:v,contentRef:p,contentId:an(),titleId:an(),descriptionId:an(),titlePresen Line truncated
]))+`;jn.KANJI=new RegExp(c,"g"),jn.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),jn.BYTE=new RegExp(o,"g"),jn.NUMERIC=new RegExp(i,"g"),jn.ALPHANUMERIC=new RegExp(r,"g");const s=new RegExp("^"+c+"$"),f=new RegExp("^"+i+"$"),m=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");return jn.testKanji=function(p){return s.test(p)},jn.testNumeric=function(p){return f.test(p)},jn.testAlphanumeric=function(p){return m.test(p)},jn}var my;function va(){return my||(my=1,(function(i){const r=Up(),c=Bp();i.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},i.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},i.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},i.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},i.MIXED={bit:-1},i.getCharCountIndicator=function(f,m){if(!f.ccBits)throw new Error("Invalid mode: "+f);if(!r.isValid(m))throw new Error("Invalid version: "+m);return m>=1&&m<10?f.ccBits[0]:m<27?f.ccBits[1]:f.ccBits[2]},i.getBestModeForData=function(f){return c.testNumeric(f)?i.NUMERIC:c.testAlphanumeric(f)?i.ALPHANUMERIC:c.testKanji(f)?i.KANJI:i.BYTE},i.toString=function(f){if(f&&f.id)return f.id;throw new Error("Invalid mode")},i.isValid=function(f){return f&&f.bit&&f.ccBits};function o(s){if(typeof s!="string")throw new Error("Param is not a string");switch(s.toLowerCase()){case"numeric":return i.NUMERIC;case"alphanumeric":return i.ALPHANUMERIC;case"kanji":return i.KANJI;case"byte":return i.BYTE;default:throw new Error("Unknown mode: "+s)}}i.from=function(f,m){if(i.isValid(f))return f;try{return o(f)}catch{return m}}})(Bf)),Bf}var hy;function I3(){return hy||(hy=1,(function(i){const r=ha(),c=Dp(),o=Gd(),s=va(),f=Up(),m=7973,v=r.getBCHDigit(m);function p(E,A,j){for(let D=1;D<=40;D++)if(A<=i.getCapacity(D,j,E))return D}function b(E,A){return s.getCharCountIndicator(E,A)+4}function S(E,A){let j=0;return E.forEach(function(D){const L=b(D.mode,A);j+=L+D.getBitsLength()}),j}function y(E,A){for(let j=1;j<=40;j++)if(S(E,j)<=i.getCapacity(j,A,s.MIXED))return j}i.from=function(A,j){return f.isValid(A)?parseInt(A,10):j},i.getCapacity=function(A,j,D){if(!f.isValid(A))throw new Error("Invalid QR Code version");typeof D>"u"&&(D=s.BYTE);const L=r.getSymbolTotalCodewords(A),Y=c.getTotalCodewordsCount(A,j),G=(L-Y)*8;if(D===s.MIXED)return G;const k=G-b(D,A);switch(D){case s.NUMERIC:return Math.floor(k/10*3);case s.ALPHANUMERIC:return Math.floor(k/11*2);case s.KANJI:return Math.floor(k/13);case s.BYTE:default:return Math.floor(k/8)}},i.getBestVersionForData=function(A,j){let D;const L=o.from(j,o.M);if(Array.isArray(A)){if(A.length>1)return y(A,L);if(A.length===0)return 1;D=A[0]}else D=A;return p(D.mode,D.getLength(),L)},i.getEncodedBits=function(A){if(!f.isValid(A)||A<7)throw new Error("Invalid QR Code version");let j=A<<12;for(;r.getBCHDigit(j)-v>=0;)j^=m<<r.getBCHDigit(j)-v;return A<<12|j}})(Uf)),Uf}var Hf={},vy;function J3(){if(vy)return Hf;vy=1;const i=ha(),r=1335,c=21522,o=i.getBCHDigit(r);return Hf.getEncodedBits=function(f,m){const v=f.bit<<3|m;let p=v<<10;for(;i.getBCHDigit(p)-o>=0;)p^=r<<i.getBCHDigit(p)-o;return(v<<10|p)^c},Hf}var Lf={},qf,gy;function F3(){if(gy)return qf;gy=1;const i=va();function r(c){this.mode=i.NUMERIC,this.data=c.toString()}return r.getBitsLength=function(o){return 10*Math.floor(o/3)+(o%3?o%3*3+1:0)},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(o){let s,f,m;for(s=0;s+3<=this.data.length;s+=3)f=this.data.substr(s,3),m=parseInt(f,10),o.put(m,10);const v=this.data.length-s;v>0&&(f=this.data.substr(s),m=parseInt(f,10),o.put(m,v*3+1))},qf=r,qf}var Gf,yy;function P3(){if(yy)return Gf;yy=1;const i=va(),r=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function c(o){this.mode=i.ALPHANUMERIC,this.data=o}return c.getBitsLength=function(s){return 11*Math.floor(s/2)+6*(s%2)},c.prototype.getLength=function(){return this.data.length},c.prototype.getBitsLength=function(){return c.getBitsLength(this.data.length)},c.prototype.write=function(s){let f;for(f=0;f+2<=this.data.length;f+=2){let m=r.indexOf(this.data[f])*45;m+=r.indexOf(this.data[f+1]),s.put(m,11)}this.data.length%2&&s.put(r.indexOf(this.data[f]),6)},Gf=c,Gf}var Yf,py;function $3(){if(py)return Yf;py=1;const i=va();function r(c){this.mode=i.BYTE,typeof c=="string"?this.data=new TextEncoder().encode(c):this.data=new Uint8Array(c)}return r.getBitsLength=function(o){return o*8},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(c){for(let o=0,s=this.data.length;o<s;o++)c.put(this.data[o],8)},Yf=r,Yf}var Vf,by;function W3(){if(by)return Vf;by=1;const i=va(),r=ha();function c(o){this.mode=i.KANJI,this.data=o}return c.getBitsLength=function(s){return s*13},c.prototype.getLength=function(){return this.data.length},c.prototype.g Line truncated
Make sure your charset is UTF-8`);f=(f>>>8&255)*192+(f&255),o.put(f,13)}},Vf=c,Vf}var Qf={exports:{}},xy;function eN(){return xy||(xy=1,(function(i){var r={single_source_shortest_paths:function(c,o,s){var f={},m={};m[o]=0;var v=r.PriorityQueue.make();v.push(o,0);for(var p,b,S,y,E,A,j,D,L;!v.empty();){p=v.pop(),b=p.value,y=p.cost,E=c[b]||{};for(S in E)E.hasOwnProperty(S)&&(A=E[S],j=y+A,D=m[S],L=typeof m[S]>"u",(L||D>j)&&(m[S]=j,v.push(S,j),f[S]=b))}if(typeof s<"u"&&typeof m[s]>"u"){var Y=["Could not find a path from ",o," to ",s,"."].join("");throw new Error(Y)}return f},extract_shortest_path_from_predecessor_list:function(c,o){for(var s=[],f=o;f;)s.push(f),c[f],f=c[f];return s.reverse(),s},find_path:function(c,o,s){var f=r.single_source_shortest_paths(c,o,s);return r.extract_shortest_path_from_predecessor_list(f,s)},PriorityQueue:{make:function(c){var o=r.PriorityQueue,s={},f;c=c||{};for(f in o)o.hasOwnProperty(f)&&(s[f]=o[f]);return s.queue=[],s.sorter=c.sorter||o.default_sorter,s},default_sorter:function(c,o){return c.cost-o.cost},push:function(c,o){var s={value:c,cost:o};this.queue.push(s),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};i.exports=r})(Qf)),Qf.exports}var Sy;function tN(){return Sy||(Sy=1,(function(i){const r=va(),c=F3(),o=P3(),s=$3(),f=W3(),m=Bp(),v=ha(),p=eN();function b(Y){return unescape(encodeURIComponent(Y)).length}function S(Y,G,k){const V=[];let I;for(;(I=Y.exec(k))!==null;)V.push({data:I[0],index:I.index,mode:G,length:I[0].length});return V}function y(Y){const G=S(m.NUMERIC,r.NUMERIC,Y),k=S(m.ALPHANUMERIC,r.ALPHANUMERIC,Y);let V,I;return v.isKanjiModeEnabled()?(V=S(m.BYTE,r.BYTE,Y),I=S(m.KANJI,r.KANJI,Y)):(V=S(m.BYTE_KANJI,r.BYTE,Y),I=[]),G.concat(k,V,I).sort(function(T,z){return T.index-z.index}).map(function(T){return{data:T.data,mode:T.mode,length:T.length}})}function E(Y,G){switch(G){case r.NUMERIC:return c.getBitsLength(Y);case r.ALPHANUMERIC:return o.getBitsLength(Y);case r.KANJI:return f.getBitsLength(Y);case r.BYTE:return s.getBitsLength(Y)}}function A(Y){return Y.reduce(function(G,k){const V=G.length-1>=0?G[G.length-1]:null;return V&&V.mode===k.mode?(G[G.length-1].data+=k.data,G):(G.push(k),G)},[])}function j(Y){const G=[];for(let k=0;k<Y.length;k++){const V=Y[k];switch(V.mode){case r.NUMERIC:G.push([V,{data:V.data,mode:r.ALPHANUMERIC,length:V.length},{data:V.data,mode:r.BYTE,length:V.length}]);break;case r.ALPHANUMERIC:G.push([V,{data:V.data,mode:r.BYTE,length:V.length}]);break;case r.KANJI:G.push([V,{data:V.data,mode:r.BYTE,length:b(V.data)}]);break;case r.BYTE:G.push([{data:V.data,mode:r.BYTE,length:b(V.data)}])}}return G}function D(Y,G){const k={},V={start:{}};let I=["start"];for(let R=0;R<Y.length;R++){const T=Y[R],z=[];for(let Z=0;Z<T.length;Z++){const te=T[Z],W=""+R+Z;z.push(W),k[W]={node:te,lastCount:0},V[W]={};for(let P=0;P<I.length;P++){const ne=I[P];k[ne]&&k[ne].node.mode===te.mode?(V[ne][W]=E(k[ne].lastCount+te.length,te.mode)-E(k[ne].lastCount,te.mode),k[ne].lastCount+=te.length):(k[ne]&&(k[ne].lastCount=te.length),V[ne][W]=E(te.length,te.mode)+4+r.getCharCountIndicator(te.mode,G))}}I=z}for(let R=0;R<I.length;R++)V[I[R]].end=0;return{map:V,table:k}}function L(Y,G){let k;const V=r.getBestModeForData(Y);if(k=r.from(G,V),k!==r.BYTE&&k.bit<V.bit)throw new Error('"'+Y+'" cannot be encoded with mode '+r.toString(k)+`.
Suggested mode is: `+r.toString(V));switch(k===r.KANJI&&!v.isKanjiModeEnabled()&&(k=r.BYTE),k){case r.NUMERIC:return new c(Y);case r.ALPHANUMERIC:return new o(Y);case r.KANJI:return new f(Y);case r.BYTE:return new s(Y)}}i.fromArray=function(G){return G.reduce(function(k,V){return typeof V=="string"?k.push(L(V,null)):V.data&&k.push(L(V.data,V.mode)),k},[])},i.fromString=function(G,k){const V=y(G,v.isKanjiModeEnabled()),I=j(V),R=D(I,k),T=p.find_path(R.map,"start","end"),z=[];for(let Z=1;Z<T.length-1;Z++)z.push(R.table[T[Z]].node);return i.fromArray(A(z))},i.rawSplit=function(G){return i.fromArray(y(G,v.isKanjiModeEnabled()))}})(Lf)),Lf}var Ey;function nN(){if(Ey)return Tf;Ey=1;const i=ha(),r=Gd(),c=q3(),o=G3(),s=Y3(),f=V3(),m=Q3(),v=Dp(),p=K3(),b=I3(),S=J3(),y=va(),E=tN();function A(R,T){const z=R.size,Z=f.getPositions(T);for(let te=0;te<Z.length;te++){const W=Z[te][0],P=Z[te][1];for(let ne=-1;ne<=7;ne++)if(!(W+ne<=-1||z<=W+ne))for(let ue=-1;ue<=7;ue++)P+ue<=-1||z<=P+ue||(ne>=0&&ne<=6&&(ue===0||ue===6)||ue>=0&&ue<=6&&(ne===0||ne===6)||ne>=2&&ne<=4&&ue>=2&&ue<=4?R.set(W+ne,P+ue,!0,!0):R.set(W+ne,P+ue,!1,!0))}}function j(R){const T=R.size;for(let z=8;z<T-8;z++){const Z=z%2===0;R.set(z,6,Z,!0),R.set(6,z,Z,!0)}}function D(R,T){const z=s.getPositions(T);for(let Z=0;Z<z.length;Z++){const te=z[Z][0],W=z[Z][1];for(let P=-2;P<=2;P++)for(let ne=-2;ne<=2;ne++)P===-2||P===2||ne===-2||ne===2||P===0&&ne===0?R.set(te+P,W+ne,!0,!0):R.set(te+P,W+ne,!1,!0)}}function L(R,T){const z=R.size,Z=b.getEncodedBits(T);let te,W,P;for(let ne=0;ne<18;ne++)te=Math.floor(ne/3),W=ne%3+z-8-3,P=(Z>>ne&1)===1,R.set(te,W,P,!0),R.set(W,te,P,!0)}function Y(R,T,z){const Z=R.size,te=S.getEncodedBits(T,z);let W,P;for(W=0;W<15;W++)P=(te>>W&1)===1,W<6?R.set(W,8,P,!0):W<8?R.set(W+1,8,P,!0):R.set(Z-15+W,8,P,!0),W<8?R.set(8,Z-W-1,P,!0):W<9?R.set(8,15-W-1+1,P,!0):R.set(8,15-W-1,P,!0);R.set(Z-8,8,1,!0)}function G(R,T){const z=R.size;let Z=-1,te=z-1,W=7,P=0;for(let ne=z-1;ne>0;ne-=2)for(ne===6&&ne--;;){for(let ue=0;ue<2;ue++)if(!R.isReserved(te,ne-ue)){let ge=!1;P<T.length&&(ge=(T[P]>>>W&1)===1),R.set(te,ne-ue,ge),W--,W===-1&&(P++,W=7)}if(te+=Z,te<0||z<=te){te-=Z,Z=-Z;break}}}function k(R,T,z){const Z=new c;z.forEach(function(ue){Z.put(ue.mode.bit,4),Z.put(ue.getLength(),y.getCharCountIndicator(ue.mode,R)),ue.write(Z)});const te=i.getSymbolTotalCodewords(R),W=v.getTotalCodewordsCount(R,T),P=(te-W)*8;for(Z.getLengthInBits()+4<=P&&Z.put(0,4);Z.getLengthInBits()%8!==0;)Z.putBit(0);const ne=(P-Z.getLengthInBits())/8;for(let ue=0;ue<ne;ue++)Z.put(ue%2?17:236,8);return V(Z,R,T)}function V(R,T,z){const Z=i.getSymbolTotalCodewords(T),te=v.getTotalCodewordsCount(T,z),W=Z-te,P=v.getBlocksCount(T,z),ne=Z%P,ue=P-ne,ge=Math.floor(Z/P),F=Math.floor(W/P),ae=F+1,ce=ge-F,xe=new p(ce);let K=0;const Se=new Array(P),J=new Array(P);let me=0;const N=new Uint8Array(R.buffer);for(let ie=0;ie<P;ie++){const Ee=ie<ue?F:ae;Se[ie]=N.slice(K,K+Ee),J[ie]=xe.encode(Se[ie]),K+=Ee,me=Math.max(me,Ee)}const U=new Uint8Array(Z);let $=0,ee,he;for(ee=0;ee<me;ee++)for(he=0;he<P;he++)ee<Se[he].length&&(U[$++]=Se[he][ee]);for(ee=0;ee<ce;ee++)for(he=0;he<P;he++)U[$++]=J[he][ee];return U}function I(R,T,z,Z){let te;if(Array.isArray(R))te=E.fromArray(R);else if(typeof R=="string"){let ge=T;if(!ge){const F=E.rawSplit(R);ge=b.getBestVersionForData(F,z)}te=E.fromString(R,ge||40)}else throw new Error("Invalid data");const W=b.getBestVersionForData(te,z);if(!W)throw new Error("The amount of data is too big to be stored in a QR Code");if(!T)T=W;else if(T<W)throw new Error(`
The chosen QR Code version cannot contain this amount of data.
Minimum version required to store current data is: `+W+`.
`);const P=k(T,z,te),ne=i.getSymbolSize(T),ue=new o(ne);return A(ue,T),j(ue),D(ue,T),Y(ue,z,0),T>=7&&L(ue,T),G(ue,P),isNaN(Z)&&(Z=m.getBestMask(ue,Y.bind(null,ue,z))),m.applyMask(Z,ue),Y(ue,z,Z),{modules:ue,version:T,errorCorrectionLevel:z,maskPattern:Z,segments:te}}return Tf.create=function(T,z){if(typeof T>"u"||T==="")throw new Error("No input text");let Z=r.M,te,W;return typeof z<"u"&&(Z=r.from(z.errorCorrectionLevel,r.M),te=b.from(z.version),W=m.from(z.maskPattern),z.toSJISFunc&&i.setToSJISFunction(z.toSJISFunc)),I(T,te,Z,W)},Tf}var Xf={},Zf={},Cy;function kp(){return Cy||(Cy=1,(function(i){function r(c){if(typeof c=="number"&&(c=c.toString()),typeof c!="string")throw new Error("Color should be defined as hex string");let o=c.slice().replace("#","").split("");if(o.length<3||o.length===5||o.length>8)throw new Error("Invalid hex color: "+c);(o.length===3||o.length===4)&&(o=Array.prototype.concat.apply([],o.map(function(f){return[f,f]}))),o.length===6&&o.push("F","F");const s=parseInt(o.join(""),16);return{r:s>>24&255,g:s>>16&255,b:s>>8&255,a:s&255,hex:"#"+o.slice(0,6).join("")}}i.getOptions=function(o){o||(o={}),o.color||(o.color={});const s=typeof o.margin>"u"||o.margin===null||o.margin<0?4:o.margin,f=o.width&&o.width>=21?o.width:void 0,m=o.scale||4;return{width:f,scale:f?4:m,margin:s,color:{dark:r(o.color.dark||"#000000ff"),light:r(o.color.light||"#ffffffff")},type:o.type,rendererOpts:o.rendererOpts||{}}},i.getScale=function(o,s){return s.width&&s.width>=o+s.margin*2?s.width/(o+s.margin*2):s.scale},i.getImageWidth=function(o,s){const f=i.getScale(o,s);return Math.floor((o+s.margin*2)*f)},i.qrToImageData=function(o,s,f){const m=s.modules.size,v=s.modules.data,p=i.getScale(m,f),b=Math.floor((m+f.margin*2)*p),S=f.margin*p,y=[f.color.light,f.color.dark];for(let E=0;E<b;E++)for(let A=0;A<b;A++){let j=(E*b+A)*4,D=f.color.light;if(E>=S&&A>=S&&E<b-S&&A<b-S){const L=Math.floor((E-S)/p),Y=Math.floor((A-S)/p);D=y[v[L*m+Y]?1:0]}o[j++]=D.r,o[j++]=D.g,o[j++]=D.b,o[j]=D.a}}})(Zf)),Zf}var Ny;function lN(){return Ny||(Ny=1,(function(i){const r=kp();function c(s,f,m){s.clearRect(0,0,f.width,f.height),f.style||(f.style={}),f.height=m,f.width=m,f.style.height=m+"px",f.style.width=m+"px"}function o(){try{return document.createElement("canvas")}catch{throw new Error("You need to specify a canvas element")}}i.render=function(f,m,v){let p=v,b=m;typeof p>"u"&&(!m||!m.getContext)&&(p=m,m=void 0),m||(b=o()),p=r.getOptions(p);const S=r.getImageWidth(f.modules.size,p),y=b.getContext("2d"),E=y.createImageData(S,S);return r.qrToImageData(E.data,f,p),c(y,b,S),y.putImageData(E,0,0),b},i.renderToDataURL=function(f,m,v){let p=v;typeof p>"u"&&(!m||!m.getContext)&&(p=m,m=void 0),p||(p={});const b=i.render(f,m,p),S=p.type||"image/png",y=p.rendererOpts||{};return b.toDataURL(S,y.quality)}})(Xf)),Xf}var Kf={},wy;function aN(){if(wy)return Kf;wy=1;const i=kp();function r(s,f){const m=s.a/255,v=f+'="'+s.hex+'"';return m<1?v+" "+f+'-opacity="'+m.toFixed(2).slice(1)+'"':v}function c(s,f,m){let v=s+f;return typeof m<"u"&&(v+=" "+m),v}function o(s,f,m){let v="",p=0,b=!1,S=0;for(let y=0;y<s.length;y++){const E=Math.floor(y%f),A=Math.floor(y/f);!E&&!b&&(b=!0),s[y]?(S++,y>0&&E>0&&s[y-1]||(v+=b?c("M",E+m,.5+A+m):c("m",p,0),p=0,b=!1),E+1<f&&s[y+1]||(v+=c("h",S),S=0)):p++}return v}return Kf.render=function(f,m,v){const p=i.getOptions(m),b=f.modules.size,S=f.modules.data,y=b+p.margin*2,E=p.color.light.a?"<path "+r(p.color.light,"fill")+' d="M0 0h'+y+"v"+y+'H0z"/>':"",A="<path "+r(p.color.dark,"stroke")+' d="'+o(S,b,p.margin)+'"/>',j='viewBox="0 0 '+y+" "+y+'"',L='<svg xmlns="http://www.w3.org/2000/svg" '+(p.width?'width="'+p.width+'" height="'+p.width+'" ':"")+j+' shape-rendering="crispEdges">'+E+A+`</svg>
`;return typeof v=="function"&&v(null,L),L},Kf}var Ty;function iN(){if(Ty)return si;Ty=1;const i=L3(),r=nN(),c=lN(),o=aN();function s(f,m,v,p,b){const S=[].slice.call(arguments,1),y=S.length,E=typeof S[y-1]=="function";if(!E&&!i())throw new Error("Callback required as last argument");if(E){if(y<2)throw new Error("Too few arguments provided");y===2?(b=v,v=m,m=p=void 0):y===3&&(m.getContext&&typeof b>"u"?(b=p,p=void 0):(b=p,p=v,v=m,m=void 0))}else{if(y<1)throw new Error("Too few arguments provided");return y===1?(v=m,m=p=void 0):y===2&&!m.getContext&&(p=v,v=m,m=void 0),new Promise(function(A,j){try{const D=r.create(v,p);A(f(D,m,p))}catch(D){j(D)}})}try{const A=r.create(v,p);b(null,f(A,m,p))}catch(A){b(A)}}return si.create=r.create,si.toCanvas=s.bind(null,c.render),si.toDataURL=s.bind(null,c.renderToDataURL),si.toString=s.bind(null,function(f,m,v){return o.render(f,v)}),si}var uN=iN();const If=sd(uN),rN=()=>{const{showWechatModal:i,setShowWechatModal:r,showToast:c,fetchTelemetry:o}=Pn(),[s,f]=x.useState(null),[m,v]=x.useState(""),[p,b]=x.useState(!1),[S,y]=x.useState(""),[E,A]=x.useState(!1),j=async()=>{var k;b(!0);try{const I=await(await fetch("/api/clawbot/qrcode",{method:"POST"})).json();f(I);const R=(k=I==null?void 0:I.login)==null?void 0:k.qrcode_url;if(R){const T=await If.toDataURL(R,{width:240,margin:2,color:{dark:"#09090b",light:"#ffffff"}});v(T)}}catch{c("获取微信 ClawBot 二维码失败")}finally{b(!1)}};x.useEffect(()=>{if(!i)return;let k=!1;(async()=>{var R,T,z;try{const te=await(await fetch("/api/clawbot/status")).json();if(k)return;if(f(te),!te.connected&&(!((R=te.login)!=null&&R.active)||!((T=te.login)!=null&&T.qrcode_url)))await j();else if((z=te.login)!=null&&z.qrcode_url){const W=await If.toDataURL(te.login.qrcode_url,{width:240,margin:2,color:{dark:"#09090b",light:"#ffffff"}});k||v(W)}}catch{}})();const I=setInterval(async()=>{var R;try{const T=await fetch("/api/clawbot/status");if(!T.ok)return;const z=await T.json();if(k)return;if(f(z),(R=z.login)!=null&&R.qrcode_url){const Z=await If.toDataURL(z.login.qrcode_url,{width:240,margin:2,color:{dark:"#09090b",light:"#ffffff"}});k||v(Z)}}catch{}},1500);return()=>{k=!0,clearInterval(I)}},[i]);const D=async k=>{if(k.preventDefault(),!!S.trim()){A(!0);try{const I=await(await fetch("/api/clawbot/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:S.trim()})})).json();f(I),y(""),c("配对码已提交,正在等待微信验证...")}catch{c("配对码提交失败")}finally{A(!1)}}},L=async()=>{try{const V=await(await fetch("/api/clawbot/disconnect",{method:"POST"})).json();f(V),v(""),o(),c("已断开微信 ClawBot 连接")}catch{c("断开失败")}},Y=!!(s!=null&&s.connected),G=s==null?void 0:s.login;return h.jsx(Ud,{open:i,onOpenChange:r,children:h.jsxs(Eo,{className:"max-w-lg p-6 space-y-5",children:[h.jsx("div",{className:"flex items-start justify-between gap-3 border-b hl-border pb-4",children:h.jsxs("div",{className:"flex items-center gap-3",children:[h.jsx("div",{className:"w-10 h-10 rounded-xl flex items-center justify-center border hl-border shrink-0",style:{backgroundColor:"rgba(16, 185, 129, 0.14)",color:"var(--success)"},children:h.jsx(My,{className:"w-5 h-5"})}),h.jsxs("div",{children:[h.jsxs("div",{className:"flex items-center gap-2",children:[h.jsx(Co,{className:"text-sm font-bold",children:"微信 ClawBot · M6 Mac mini 直连通道"}),h.jsx(Jn,{variant:Y?"success":"accent",children:Y?"已连接在线":"扫码绑定"})]}),h.jsx(No,{className:"text-xs font-mono-num mt-0.5",children:"@tencent-weixin/openclaw-weixin · ilinkai.weixin.qq.com"})]})]})}),Y?h.jsxs("div",{className:"space-y-4",children:[h.jsxs("div",{className:"p-4 rounded-xl border flex items-center justify-between",style:{backgroundColor:"var(--success-soft)",borderColor:"rgba(16, 185, 129, 0.3)"},children:[h.jsxs("div",{className:"flex items-center gap-3",children:[h.jsx(r2,{className:"w-5 h-5 shrink-0",style:{color:"var(--success)"}}),h.jsxs("div",{children:[h.jsx("div",{className:"text-xs font-bold",children:"微信 ClawBot 长轮询守护线程运行中"}),h.jsxs("div",{className:"text-[11px] font-mono-num mt-0.5",style:{color:"var(--text-muted)"},children:["Bot ID: ",s==null?void 0:s.bot_id," · 累计收发: ",(s==null?void 0:s.msg_count)??0," 条"]})]})]}),h.jsxs(nt,{variant:"outline",size:"sm",onClick:L,children:[h.jsx(V2,{className:"w-3.5 h-3.5"}),h.jsx("span",{children:"重新绑定"})]})]}),h.jsxs("div",{className:"p-4 rounded-xl hl-muted border hl-border space-y-2.5 text-xs",children:[h.jsx("div",{className:"font-semibold",children:"📱 现在打开手机微信「微信 ClawBot」可直接发送:"}),h.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2 font-mono-num text-[11px]",children:[h.jsxs("div",{className:"p-2 rounded hl-card",children:[h.jsx("span",{style:{color:"var(--accent)"},children:"状态"})," · 查看 M6 & 极空间遥测"]}),h.jsxs("div",{className:"p-2 rounded hl-card",children:[h.jsx("span Line truncated
+1
View File
@@ -0,0 +1 @@
/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);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}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@suppoLine truncated
+2 -2
View File
@@ -11,8 +11,8 @@
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap"
rel="stylesheet" rel="stylesheet"
/> />
<script type="module" crossorigin src="/assets/index-DE2eKnU3.js"></script> <script type="module" crossorigin src="/assets/index-DiTh48KJ.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CYjCaNsV.css"> <link rel="stylesheet" crossorigin href="/assets/index-YkrrDNrk.css">
</head> </head>
<body class="min-h-screen"> <body class="min-h-screen">
<div id="root"></div> <div id="root"></div>
+31
View File
@@ -23,6 +23,7 @@ from concurrent.futures import ThreadPoolExecutor
from http.cookies import SimpleCookie from http.cookies import SimpleCookie
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path from pathlib import Path
from clawbot import ClawBotManager
PORT = int(os.environ.get("PORT", "3004")) PORT = int(os.environ.get("PORT", "3004"))
BASE_DIR = Path(__file__).resolve().parent BASE_DIR = Path(__file__).resolve().parent
@@ -298,7 +299,9 @@ def collect_telemetry() -> dict:
"clash": net["router_online"], "clash": net["router_online"],
"router": net["router_online"], "router": net["router_online"],
"uptime": net["azure_online"], "uptime": net["azure_online"],
"clawbot": clawbot_mgr.is_connected(),
}, },
"clawbot": clawbot_mgr.get_public_status(),
} }
with _cache_lock: with _cache_lock:
_cache["data"] = data _cache["data"] = data
@@ -306,6 +309,9 @@ def collect_telemetry() -> dict:
return data return data
clawbot_mgr = ClawBotManager(telemetry_fn=collect_telemetry)
class PortalHandler(BaseHTTPRequestHandler): class PortalHandler(BaseHTTPRequestHandler):
def log_message(self, fmt, *args): def log_message(self, fmt, *args):
pass pass
@@ -383,6 +389,11 @@ class PortalHandler(BaseHTTPRequestHandler):
self._send_json(collect_telemetry()) self._send_json(collect_telemetry())
return return
# 3b. WeChat ClawBot status endpoint (/api/clawbot/status)
if self.path.startswith("/api/clawbot/status"):
self._send_json(clawbot_mgr.get_public_status())
return
# 4. Serve static assets from Vite build output (dist/) if available # 4. Serve static assets from Vite build output (dist/) if available
clean_path = self.path.split("?", 1)[0].lstrip("/") clean_path = self.path.split("?", 1)[0].lstrip("/")
if clean_path and DIST_DIR.exists(): if clean_path and DIST_DIR.exists():
@@ -456,6 +467,26 @@ class PortalHandler(BaseHTTPRequestHandler):
self._send_json({"ok": True}, status=200, extra_headers=headers) self._send_json({"ok": True}, status=200, extra_headers=headers)
return return
# 2b. WeChat ClawBot Endpoints (/api/clawbot/*)
if self.path == "/api/clawbot/qrcode":
res = clawbot_mgr.start_qr_login()
self._send_json(res, status=200 if res.get("ok") else 500)
return
if self.path == "/api/clawbot/verify":
length = int(self.headers.get("Content-Length", "0"))
raw = self.rfile.read(length).decode("utf-8") if length > 0 else "{}"
try:
body = json.loads(raw)
except Exception:
body = {}
res = clawbot_mgr.submit_verify_code(str(body.get("code", "")))
self._send_json(res)
return
if self.path == "/api/clawbot/disconnect":
res = clawbot_mgr.disconnect()
self._send_json(res)
return
# 3. Operations Actions # 3. Operations Actions
if self.path == "/api/action/backup_nas": if self.path == "/api/action/backup_nas":
out = run_cmd("/Users/ixvii0iv/homelab/scripts/backup-to-nas.sh", timeout=15.0) out = run_cmd("/Users/ixvii0iv/homelab/scripts/backup-to-nas.sh", timeout=15.0)
+331
View File
@@ -14,10 +14,12 @@
"@radix-ui/react-slot": "^1.5.0", "@radix-ui/react-slot": "^1.5.0",
"@radix-ui/react-switch": "^1.4.1", "@radix-ui/react-switch": "^1.4.1",
"@radix-ui/react-tabs": "^1.2.1", "@radix-ui/react-tabs": "^1.2.1",
"@types/qrcode": "^1.5.6",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"cmdk": "^1.1.1", "cmdk": "^1.1.1",
"lucide-react": "^0.475.0", "lucide-react": "^0.475.0",
"qrcode": "^1.5.4",
"react": "^19.0.0", "react": "^19.0.0",
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"tailwind-merge": "^3.0.1", "tailwind-merge": "^3.0.1",
@@ -2148,6 +2150,24 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": {
"version": "26.6.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.6.tgz",
"integrity": "sha512-MzQj+8Kx3XI40OmUAE6Qoh58ZMNstNNMwn2nfd3qWsfe7nDNSqJNzes4njhz6AHwrSHOffSLwXU6yb474Q4aog==",
"license": "MIT",
"dependencies": {
"undici-types": "~8.9.0"
}
},
"node_modules/@types/qrcode": {
"version": "1.5.6",
"resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz",
"integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "19.3.0", "version": "19.3.0",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz",
@@ -2189,6 +2209,30 @@
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
} }
}, },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/aria-hidden": { "node_modules/aria-hidden": {
"version": "1.2.6", "version": "1.2.6",
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
@@ -2248,6 +2292,15 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
} }
}, },
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001823", "version": "1.0.30001823",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001823.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001823.tgz",
@@ -2281,6 +2334,17 @@
"url": "https://polar.sh/cva" "url": "https://polar.sh/cva"
} }
}, },
"node_modules/cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^6.2.0"
}
},
"node_modules/clsx": { "node_modules/clsx": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -2306,6 +2370,24 @@
"react-dom": "^18 || ^19 || ^19.0.0-rc" "react-dom": "^18 || ^19 || ^19.0.0-rc"
} }
}, },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
"node_modules/convert-source-map": { "node_modules/convert-source-map": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -2338,6 +2420,15 @@
} }
} }
}, },
"node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/detect-libc": { "node_modules/detect-libc": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
@@ -2354,6 +2445,12 @@
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/dijkstrajs": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
"integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
"license": "MIT"
},
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.478", "version": "1.5.478",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.478.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.478.tgz",
@@ -2361,6 +2458,12 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/enhanced-resolve": { "node_modules/enhanced-resolve": {
"version": "5.26.1", "version": "5.26.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.1.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.1.tgz",
@@ -2445,6 +2548,19 @@
} }
} }
}, },
"node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/fsevents": { "node_modules/fsevents": {
"version": "2.3.3", "version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -2470,6 +2586,15 @@
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-nonce": { "node_modules/get-nonce": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
@@ -2486,6 +2611,15 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jiti": { "node_modules/jiti": {
"version": "2.7.0", "version": "2.7.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
@@ -2802,6 +2936,18 @@
"url": "https://opencollective.com/parcel" "url": "https://opencollective.com/parcel"
} }
}, },
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/lru-cache": { "node_modules/lru-cache": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -2867,6 +3013,51 @@
"node": ">=18" "node": ">=18"
} }
}, },
"node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -2887,6 +3078,15 @@
"url": "https://github.com/sponsors/jonschlinkert" "url": "https://github.com/sponsors/jonschlinkert"
} }
}, },
"node_modules/pngjs": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
"integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
"license": "MIT",
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.32", "version": "8.5.32",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz",
@@ -2916,6 +3116,23 @@
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
} }
}, },
"node_modules/qrcode": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz",
"integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
"license": "MIT",
"dependencies": {
"dijkstrajs": "^1.0.1",
"pngjs": "^5.0.0",
"yargs": "^15.3.1"
},
"bin": {
"qrcode": "bin/qrcode"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/react": { "node_modules/react": {
"version": "19.3.1", "version": "19.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz",
@@ -3016,6 +3233,21 @@
} }
} }
}, },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"license": "ISC"
},
"node_modules/rollup": { "node_modules/rollup": {
"version": "4.67.5", "version": "4.67.5",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.67.5.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.67.5.tgz",
@@ -3078,6 +3310,12 @@
"semver": "bin/semver.js" "semver": "bin/semver.js"
} }
}, },
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
"license": "ISC"
},
"node_modules/source-map-js": { "node_modules/source-map-js": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz",
@@ -3088,6 +3326,32 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/tailwind-merge": { "node_modules/tailwind-merge": {
"version": "3.7.0", "version": "3.7.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.7.0.tgz", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.7.0.tgz",
@@ -3156,6 +3420,12 @@
"node": ">=14.17" "node": ">=14.17"
} }
}, },
"node_modules/undici-types": {
"version": "8.9.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz",
"integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==",
"license": "MIT"
},
"node_modules/update-browserslist-db": { "node_modules/update-browserslist-db": {
"version": "1.3.4", "version": "1.3.4",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz",
@@ -3305,6 +3575,32 @@
} }
} }
}, },
"node_modules/which-module": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
"license": "ISC"
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"license": "ISC"
},
"node_modules/yallist": { "node_modules/yallist": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -3312,6 +3608,41 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/yargs": {
"version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"license": "MIT",
"dependencies": {
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
"find-up": "^4.1.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^4.2.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^18.1.2"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs-parser": {
"version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"license": "ISC",
"dependencies": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/zustand": { "node_modules/zustand": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/zustand/-/zustand-5.1.0.tgz", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.1.0.tgz",
+2
View File
@@ -15,10 +15,12 @@
"@radix-ui/react-slot": "^1.5.0", "@radix-ui/react-slot": "^1.5.0",
"@radix-ui/react-switch": "^1.4.1", "@radix-ui/react-switch": "^1.4.1",
"@radix-ui/react-tabs": "^1.2.1", "@radix-ui/react-tabs": "^1.2.1",
"@types/qrcode": "^1.5.6",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"cmdk": "^1.1.1", "cmdk": "^1.1.1",
"lucide-react": "^0.475.0", "lucide-react": "^0.475.0",
"qrcode": "^1.5.4",
"react": "^19.0.0", "react": "^19.0.0",
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"tailwind-merge": "^3.0.1", "tailwind-merge": "^3.0.1",
+4
View File
@@ -6,6 +6,7 @@ import { SshShelf } from './components/SshShelf';
import { CommandPalette } from './components/CommandPalette'; import { CommandPalette } from './components/CommandPalette';
import { AgyTerminalModal } from './components/AgyTerminalModal'; import { AgyTerminalModal } from './components/AgyTerminalModal';
import { AuthGateCard } from './components/AuthGateModal'; import { AuthGateCard } from './components/AuthGateModal';
import { WechatClawModal } from './components/WechatClawModal';
import { StorybookWorkbench } from './components/StorybookWorkbench'; import { StorybookWorkbench } from './components/StorybookWorkbench';
import { LAYOUT_PRESETS } from './design-system/tokens'; import { LAYOUT_PRESETS } from './design-system/tokens';
import type { ServiceGroup } from './types/telemetry'; import type { ServiceGroup } from './types/telemetry';
@@ -244,6 +245,9 @@ export const App: React.FC = () => {
{/* 5. Embedded AGY Cloud Terminal Modal */} {/* 5. Embedded AGY Cloud Terminal Modal */}
<AgyTerminalModal /> <AgyTerminalModal />
{/* 5b. WeChat ClawBot QR Code & Live Status Modal */}
<WechatClawModal />
{/* 6. Custom SSO Auth Gate Modal (Replaces Browser Native Basic Auth Popup!) */} {/* 6. Custom SSO Auth Gate Modal (Replaces Browser Native Basic Auth Popup!) */}
{authRedirect && ( {authRedirect && (
<div className="fixed inset-0 z-50 bg-black/75 backdrop-blur-sm flex items-center justify-center p-4"> <div className="fixed inset-0 z-50 bg-black/75 backdrop-blur-sm flex items-center justify-center p-4">
+17 -1
View File
@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { BookOpen, LayoutGrid, Moon, Search, Sun, Terminal } from 'lucide-react'; import { BookOpen, LayoutGrid, MessageSquare, Moon, Search, Sun, Terminal } from 'lucide-react';
import { usePortalStore } from '../store/usePortalStore'; import { usePortalStore } from '../store/usePortalStore';
import type { RouteModeId } from '../types/telemetry'; import type { RouteModeId } from '../types/telemetry';
import { Button } from './ui/button'; import { Button } from './ui/button';
@@ -24,6 +24,7 @@ export const TopRibbon: React.FC = () => {
setRouteMode, setRouteMode,
setViewMode, setViewMode,
setShowAgyModal, setShowAgyModal,
setShowWechatModal,
setShowCmdPalette, setShowCmdPalette,
} = usePortalStore(); } = usePortalStore();
@@ -98,6 +99,21 @@ export const TopRibbon: React.FC = () => {
</kbd> </kbd>
</Button> </Button>
<Button
variant="outline"
onClick={() => setShowWechatModal(true)}
title="连接微信 ClawBot,在微信内直接收发消息与控制 Mac mini"
>
<span
className="w-2 h-2 rounded-full"
style={{
backgroundColor: telemetry.services.clawbot ? 'var(--success)' : 'var(--accent)',
}}
/>
<MessageSquare className="w-3.5 h-3.5" />
<span>微信 ClawBot</span>
</Button>
<Button onClick={() => setShowAgyModal(true)}> <Button onClick={() => setShowAgyModal(true)}>
<Terminal className="w-3.5 h-3.5" /> <Terminal className="w-3.5 h-3.5" />
<span>AGY 终端</span> <span>AGY 终端</span>
@@ -0,0 +1,301 @@
import React, { useEffect, useState } from 'react';
import QRCode from 'qrcode';
import {
CheckCircle2,
MessageSquare,
QrCode,
RefreshCw,
Send,
Smartphone,
Unplug,
} from 'lucide-react';
import { usePortalStore } from '../store/usePortalStore';
import type { ClawbotPublicStatus } from '../types/telemetry';
import { Badge } from './ui/badge';
import { Button } from './ui/button';
import { Dialog, DialogContent, DialogDescription, DialogTitle } from './ui/dialog';
import { Input } from './ui/input';
export const WechatClawModal: React.FC = () => {
const { showWechatModal, setShowWechatModal, showToast, fetchTelemetry } = usePortalStore();
const [statusData, setStatusData] = useState<ClawbotPublicStatus | null>(null);
const [qrDataUrl, setQrDataUrl] = useState<string>('');
const [loadingQr, setLoadingQr] = useState(false);
const [verifyCode, setVerifyCode] = useState('');
const [submittingCode, setSubmittingCode] = useState(false);
const generateNewQr = async () => {
setLoadingQr(true);
try {
const res = await fetch('/api/clawbot/qrcode', { method: 'POST' });
const data = await res.json();
setStatusData(data);
const url = data?.login?.qrcode_url;
if (url) {
const svgUrl = await QRCode.toDataURL(url, {
width: 240,
margin: 2,
color: { dark: '#09090b', light: '#ffffff' },
});
setQrDataUrl(svgUrl);
}
} catch {
showToast('获取微信 ClawBot 二维码失败');
} finally {
setLoadingQr(false);
}
};
// Initial load & polling while modal is open
useEffect(() => {
if (!showWechatModal) return;
let cancelled = false;
const init = async () => {
try {
const r = await fetch('/api/clawbot/status');
const d: ClawbotPublicStatus = await r.json();
if (cancelled) return;
setStatusData(d);
if (!d.connected && (!d.login?.active || !d.login?.qrcode_url)) {
await generateNewQr();
} else if (d.login?.qrcode_url) {
const svgUrl = await QRCode.toDataURL(d.login.qrcode_url, {
width: 240,
margin: 2,
color: { dark: '#09090b', light: '#ffffff' },
});
if (!cancelled) setQrDataUrl(svgUrl);
}
} catch {
// ignore
}
};
init();
const timer = setInterval(async () => {
try {
const r = await fetch('/api/clawbot/status');
if (!r.ok) return;
const d: ClawbotPublicStatus = await r.json();
if (cancelled) return;
setStatusData(d);
if (d.login?.qrcode_url) {
const svgUrl = await QRCode.toDataURL(d.login.qrcode_url, {
width: 240,
margin: 2,
color: { dark: '#09090b', light: '#ffffff' },
});
if (!cancelled) setQrDataUrl(svgUrl);
}
} catch {
// ignore
}
}, 1500);
return () => {
cancelled = true;
clearInterval(timer);
};
}, [showWechatModal]);
const handleVerifySubmit = async (e: React.FormEvent) => {
e.preventDefault();
if (!verifyCode.trim()) return;
setSubmittingCode(true);
try {
const res = await fetch('/api/clawbot/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code: verifyCode.trim() }),
});
const data = await res.json();
setStatusData(data);
setVerifyCode('');
showToast('配对码已提交,正在等待微信验证...');
} catch {
showToast('配对码提交失败');
} finally {
setSubmittingCode(false);
}
};
const handleDisconnect = async () => {
try {
const res = await fetch('/api/clawbot/disconnect', { method: 'POST' });
const data = await res.json();
setStatusData(data);
setQrDataUrl('');
fetchTelemetry();
showToast('已断开微信 ClawBot 连接');
} catch {
showToast('断开失败');
}
};
const connected = Boolean(statusData?.connected);
const loginState = statusData?.login;
return (
<Dialog open={showWechatModal} onOpenChange={setShowWechatModal}>
<DialogContent className="max-w-lg p-6 space-y-5">
{/* Header */}
<div className="flex items-start justify-between gap-3 border-b hl-border pb-4">
<div className="flex items-center gap-3">
<div
className="w-10 h-10 rounded-xl flex items-center justify-center border hl-border shrink-0"
style={{ backgroundColor: 'rgba(16, 185, 129, 0.14)', color: 'var(--success)' }}
>
<MessageSquare className="w-5 h-5" />
</div>
<div>
<div className="flex items-center gap-2">
<DialogTitle className="text-sm font-bold">
微信 ClawBot · M6 Mac mini 直连通道
</DialogTitle>
<Badge variant={connected ? 'success' : 'accent'}>
{connected ? '已连接在线' : '扫码绑定'}
</Badge>
</div>
<DialogDescription className="text-xs font-mono-num mt-0.5">
@tencent-weixin/openclaw-weixin · ilinkai.weixin.qq.com
</DialogDescription>
</div>
</div>
</div>
{/* Body: Connected vs QR Login */}
{connected ? (
<div className="space-y-4">
<div
className="p-4 rounded-xl border flex items-center justify-between"
style={{
backgroundColor: 'var(--success-soft)',
borderColor: 'rgba(16, 185, 129, 0.3)',
}}
>
<div className="flex items-center gap-3">
<CheckCircle2 className="w-5 h-5 shrink-0" style={{ color: 'var(--success)' }} />
<div>
<div className="text-xs font-bold">微信 ClawBot 长轮询守护线程运行中</div>
<div className="text-[11px] font-mono-num mt-0.5" style={{ color: 'var(--text-muted)' }}>
Bot ID: {statusData?.bot_id} · 累计收发: {statusData?.msg_count ?? 0} 条
</div>
</div>
</div>
<Button variant="outline" size="sm" onClick={handleDisconnect}>
<Unplug className="w-3.5 h-3.5" />
<span>重新绑定</span>
</Button>
</div>
<div className="p-4 rounded-xl hl-muted border hl-border space-y-2.5 text-xs">
<div className="font-semibold">📱 现在打开手机微信「微信 ClawBot」可直接发送:</div>
<div className="grid grid-cols-1 sm:grid-cols-2 gap-2 font-mono-num text-[11px]">
<div className="p-2 rounded hl-card">
<span style={{ color: 'var(--accent)' }}>状态</span> · 查看 M6 & 极空间遥测
</div>
<div className="p-2 rounded hl-card">
<span style={{ color: 'var(--accent)' }}>备份</span> · 立即打包备份至 20TB NAS
</div>
<div className="p-2 rounded hl-card">
<span style={{ color: 'var(--accent)' }}>屏幕</span> · 截取 AGY 终端实时画面
</div>
<div className="p-2 rounded hl-card">
<span style={{ color: 'var(--accent)' }}>$ df -h</span> · 执行任意 Mac mini 命令
</div>
<div className="p-2 rounded hl-card sm:col-span-2">
<span style={{ color: 'var(--accent)' }}>&gt; 你好</span> 或直接发任意问题 · 注入 AGY 终端或调用 AI 回答
</div>
</div>
</div>
</div>
) : (
<div className="space-y-4">
<div className="flex flex-col items-center justify-center p-5 rounded-xl hl-muted border hl-border space-y-3">
{qrDataUrl ? (
<div className="p-3 bg-white rounded-xl shadow-md border">
<img
src={qrDataUrl}
alt="WeChat ClawBot QR Code"
className="w-48 h-48 block"
/>
</div>
) : (
<div className="w-48 h-48 rounded-xl hl-card flex items-center justify-center text-xs font-mono-num">
{loadingQr ? '正在向微信申请二维码...' : '点击下方按钮生成二维码'}
</div>
)}
<div className="flex items-center gap-2 text-xs font-medium text-center">
<Smartphone className="w-4 h-4 shrink-0" style={{ color: 'var(--accent)' }} />
<span>{loginState?.message || '请使用手机微信扫描上方二维码启用 ClawBot'}</span>
</div>
<div className="flex items-center gap-2">
<Button
variant="outline"
size="sm"
onClick={generateNewQr}
disabled={loadingQr}
>
<RefreshCw className="w-3.5 h-3.5" />
<span>{loadingQr ? '刷新中...' : '刷新二维码'}</span>
</Button>
{loginState?.qrcode_url && (
<Button variant="ghost" size="sm" asChild>
<a
href={loginState.qrcode_url}
target="_blank"
rel="noopener noreferrer"
className="font-mono-num"
>
<QrCode className="w-3.5 h-3.5" />
<span>打开备用链接 ↗</span>
</a>
</Button>
)}
</div>
</div>
{/* Verify Code Input (if WeChat prompts for pairing digits) */}
{loginState?.status === 'need_verifycode' && (
<form
onSubmit={handleVerifySubmit}
className="p-4 rounded-xl border space-y-2.5"
style={{
backgroundColor: 'var(--accent-soft)',
borderColor: 'var(--accent)',
}}
>
<label className="block text-xs font-bold">
🔢 手机微信上显示了配对数字,请在下方输入:
</label>
<div className="flex items-center gap-2">
<Input
type="text"
value={verifyCode}
onChange={(e) => setVerifyCode(e.target.value)}
placeholder="输入手机微信显示的 6 位数字..."
className="font-mono-num"
autoFocus
/>
<Button type="submit" disabled={submittingCode}>
<Send className="w-3.5 h-3.5" />
<span>验证</span>
</Button>
</div>
</form>
)}
</div>
)}
<div className="flex items-center justify-end pt-1">
<Button variant="outline" onClick={() => setShowWechatModal(false)}>
关闭窗口
</Button>
</div>
</DialogContent>
</Dialog>
);
};
@@ -9,6 +9,7 @@ interface PortalState {
layoutPreset: LayoutPresetId; layoutPreset: LayoutPresetId;
viewMode: 'dashboard' | 'storybook'; viewMode: 'dashboard' | 'storybook';
showAgyModal: boolean; showAgyModal: boolean;
showWechatModal: boolean;
showCmdPalette: boolean; showCmdPalette: boolean;
toast: string; toast: string;
actionLoading: boolean; actionLoading: boolean;
@@ -19,6 +20,7 @@ interface PortalState {
setLayoutPreset: (preset: LayoutPresetId) => void; setLayoutPreset: (preset: LayoutPresetId) => void;
setViewMode: (view: 'dashboard' | 'storybook') => void; setViewMode: (view: 'dashboard' | 'storybook') => void;
setShowAgyModal: (open: boolean) => void; setShowAgyModal: (open: boolean) => void;
setShowWechatModal: (open: boolean) => void;
setShowCmdPalette: (open: boolean) => void; setShowCmdPalette: (open: boolean) => void;
showToast: (msg: string) => void; showToast: (msg: string) => void;
fetchTelemetry: () => Promise<void>; fetchTelemetry: () => Promise<void>;
@@ -34,11 +36,11 @@ const getSystemDark = () =>
const applyDomTheme = (mode: ThemeId): 'light' | 'dark' => { const applyDomTheme = (mode: ThemeId): 'light' | 'dark' => {
const isDark = mode === 'system' ? getSystemDark() : mode === 'dark'; const isDark = mode === 'system' ? getSystemDark() : mode === 'dark';
const domTheme = isDark ? 'catppuccin' : 'zinc-light'; const domTheme = isDark ? 'dark' : 'light';
if (typeof document !== 'undefined') { if (typeof document !== 'undefined') {
document.documentElement.setAttribute('data-theme', domTheme); document.documentElement.setAttribute('data-theme', domTheme);
} }
return isDark ? 'dark' : 'light'; return domTheme;
}; };
const storedTheme = localStorage.getItem('hl_theme_v2') as ThemeId | null; const storedTheme = localStorage.getItem('hl_theme_v2') as ThemeId | null;
@@ -62,6 +64,7 @@ export const usePortalStore = create<PortalState>((set, get) => ({
layoutPreset: initialLayout, layoutPreset: initialLayout,
viewMode: initialView, viewMode: initialView,
showAgyModal: false, showAgyModal: false,
showWechatModal: false,
showCmdPalette: false, showCmdPalette: false,
toast: '', toast: '',
actionLoading: false, actionLoading: false,
@@ -105,6 +108,7 @@ export const usePortalStore = create<PortalState>((set, get) => ({
clash: true, clash: true,
router: true, router: true,
uptime: true, uptime: true,
clawbot: false,
}, },
}, },
@@ -138,6 +142,7 @@ export const usePortalStore = create<PortalState>((set, get) => ({
}, },
setShowAgyModal: (showAgyModal) => set({ showAgyModal }), setShowAgyModal: (showAgyModal) => set({ showAgyModal }),
setShowWechatModal: (showWechatModal) => set({ showWechatModal }),
setShowCmdPalette: (showCmdPalette) => set({ showCmdPalette }), setShowCmdPalette: (showCmdPalette) => set({ showCmdPalette }),
showToast: (msg) => { showToast: (msg) => {
+20 -1
View File
@@ -1,6 +1,23 @@
export type ThemeId = 'system' | 'light' | 'dark'; export type ThemeId = 'system' | 'light' | 'dark';
export type RouteModeId = 'auto' | 'edge443' | 'home10443' | 'lan'; export type RouteModeId = 'auto' | 'edge443' | 'home10443' | 'lan';
export interface ClawbotPublicStatus {
connected: boolean;
bot_id?: string;
user_id?: string;
base_url?: string;
connected_at?: string;
msg_count?: number;
last_inbound_text?: string;
last_reply_text?: string;
login?: {
active: boolean;
qrcode_url: string;
status: string;
message: string;
};
}
export interface TelemetryData { export interface TelemetryData {
timestamp?: string; timestamp?: string;
mini: { mini: {
@@ -53,7 +70,9 @@ export interface TelemetryData {
clash: boolean; clash: boolean;
router: boolean; router: boolean;
uptime: boolean; uptime: boolean;
clawbot?: boolean;
}; };
clawbot?: ClawbotPublicStatus;
} }
export interface StatCell { export interface StatCell {
@@ -68,7 +87,7 @@ export interface ServiceCardItem {
subtitle: string; subtitle: string;
iconUrl: string; iconUrl: string;
online: boolean; online: boolean;
actionType?: 'drawer' | 'backup'; actionType?: 'drawer' | 'backup' | 'clawbot';
desc: string; desc: string;
edgeUrl: string; edgeUrl: string;
homeUrl: string; homeUrl: string;