.topbar{display:flex;align-items:center;gap:16px;padding:10px 20px;border-bottom:1px solid var(--border);background:var(--panel)}.brand{font-weight:600;letter-spacing:.02em}.brand .dot{display:inline-block;width:8px;height:8px;margin-right:6px;border-radius:99px;background:var(--ok);vertical-align:middle}.spacer{flex:1}.topbar nav a{padding:6px 10px;border-radius:6px;color:var(--muted)}.topbar nav a.router-link-exact-active{background:var(--panel-2);color:var(--text)}.user{display:flex;align-items:center;gap:10px}.main{padding:20px;flex:1;max-width:1400px;margin:0 auto;width:100%}.login-wrap[data-v-bb25bd13]{min-height:calc(100vh + -0px);display:grid;place-items:center;padding:20px}.login[data-v-bb25bd13]{width:360px;max-width:100%;display:grid;gap:10px}.login h1[data-v-bb25bd13]{margin:0;font-size:22px}.login p[data-v-bb25bd13]{margin:0 0 10px}.login label[data-v-bb25bd13]{margin-top:8px}.error[data-v-bb25bd13]{color:var(--bad);font-size:13px}.login button[data-v-bb25bd13]{margin-top:8px}h2[data-v-cf274bf3]{margin:0 0 8px}.grid[data-v-cf274bf3]{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;margin-top:16px}.site-card[data-v-cf274bf3]{display:block;color:var(--text);transition:border-color .1s}.site-card[data-v-cf274bf3]:hover{border-color:var(--accent);text-decoration:none}.site-card .title[data-v-cf274bf3]{font-size:16px;font-weight:600;margin-bottom:4px}.header[data-v-a7a2cf70]{margin-bottom:12px}.header h2[data-v-a7a2cf70]{margin:0}.controls[data-v-a7a2cf70]{display:flex;align-items:center;gap:14px;margin-bottom:12px;flex-wrap:wrap;position:relative}.controls .spacer[data-v-a7a2cf70]{flex:1}.chk[data-v-a7a2cf70]{display:flex;align-items:center;gap:8px;cursor:pointer;margin:0;text-transform:none;letter-spacing:0;color:var(--text);font-size:14px}.chk small[data-v-a7a2cf70]{display:block;margin-top:2px}.jump-picker[data-v-a7a2cf70]{position:relative}.jump-picker .arrow[data-v-a7a2cf70]{margin-left:6px;opacity:.7}.jump-menu[data-v-a7a2cf70]{position:absolute;top:40px;left:0;z-index:20;min-width:340px;max-width:420px;max-height:400px;overflow:auto;box-shadow:0 12px 30px #0006}.jump-menu-head[data-v-a7a2cf70]{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:12px}.jump-menu-head .sm[data-v-a7a2cf70]{padding:2px 6px;font-size:11px}.jump-list[data-v-a7a2cf70]{display:grid;gap:2px}.jump-item[data-v-a7a2cf70]{display:grid;grid-template-columns:18px 1fr auto auto;gap:8px;align-items:center;padding:4px 6px;border-radius:4px;cursor:pointer;font-size:13px;margin:0;text-transform:none;letter-spacing:0;color:var(--text)}.jump-item[data-v-a7a2cf70]:hover{background:#ffffff0a}.jump-item .name[data-v-a7a2cf70]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.history-picker[data-v-a7a2cf70]{position:relative}.history-picker .arrow[data-v-a7a2cf70]{margin-left:6px;opacity:.7}.history-menu[data-v-a7a2cf70]{position:absolute;top:40px;left:0;z-index:20;min-width:340px;max-width:460px;max-height:420px;overflow:auto;box-shadow:0 12px 30px #0006;padding:6px}.history-list[data-v-a7a2cf70]{display:flex;flex-direction:column;gap:2px}.history-item[data-v-a7a2cf70]{display:flex;flex-direction:column;gap:4px;align-items:flex-start;padding:8px 10px;border-radius:4px;text-align:left;width:100%;background:transparent;border:1px solid transparent}.history-item[data-v-a7a2cf70]:hover{background:#ffffff0a}.history-item.active[data-v-a7a2cf70]{border-color:var(--accent);background:#3b82f614}.history-item .when[data-v-a7a2cf70]{font-size:12px;color:var(--muted)}.history-item .stats[data-v-a7a2cf70]{display:flex;align-items:center;gap:4px;font-size:12px}.viewing-saved[data-v-a7a2cf70]{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;padding:10px 14px;border-color:var(--accent);background:#3b82f614}.viewing-saved .sm[data-v-a7a2cf70]{padding:4px 10px;font-size:12px}.status-row[data-v-a7a2cf70]{display:flex;align-items:center;gap:10px;margin-bottom:12px}.status-row .dot[data-v-a7a2cf70]{width:8px;height:8px;border-radius:99px;background:var(--muted)}.status-row.scanning .dot[data-v-a7a2cf70],.status-row.webrtc .dot[data-v-a7a2cf70]{background:var(--accent);animation:pulse-a7a2cf70 1.2s infinite}.status-row.login .dot[data-v-a7a2cf70],.status-row.listing .dot[data-v-a7a2cf70],.status-row.start .dot[data-v-a7a2cf70]{background:var(--warn)}.status-row.done .dot[data-v-a7a2cf70]{background:var(--ok)}.status-row.error .dot[data-v-a7a2cf70]{background:var(--bad)}.status-text[data-v-a7a2cf70]{flex:1}@keyframes pulse-a7a2cf70{0%,to{opacity:1}50%{opacity:.4}}.jumps-grid[data-v-a7a2cf70]{display:grid;gap:10px;margin-bottom:12px;grid-template-columns:repeat(auto-fill,minmax(260px,1fr))}.jump-card[data-v-a7a2cf70]{padding:12px;display:flex;flex-direction:column;gap:8px}.jump-head[data-v-a7a2cf70]{display:flex;align-items:center;gap:10px}.jump-head .dot[data-v-a7a2cf70]{width:10px;height:10px;border-radius:99px;background:var(--muted)}.jump-card.scanning .dot[data-v-a7a2cf70],.jump-card.webrtc .dot[data-v-a7a2cf70]{background:var(--accent);animation:pulse-a7a2cf70 1.2s infinite}.jump-card.done .dot[data-v-a7a2cf70]{background:var(--ok)}.jump-card.error .dot[data-v-a7a2cf70]{background:var(--bad)}.jump-card.pending .dot[data-v-a7a2cf70]{background:var(--muted)}.jump-title[data-v-a7a2cf70]{flex:1;min-width:0}.jump-title .name[data-v-a7a2cf70]{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jump-counts[data-v-a7a2cf70]{text-align:right}.jump-counts .num[data-v-a7a2cf70]{font-size:18px;font-weight:700;display:block;line-height:1}.jump-counts .muted[data-v-a7a2cf70]{font-size:11px}.jump-msg[data-v-a7a2cf70]{font-size:12px;color:var(--muted);min-height:1em}.jump-bars[data-v-a7a2cf70]{display:flex;gap:4px;flex-wrap:wrap}.progress[data-v-a7a2cf70]{height:4px;background:#ffffff0f;border-radius:2px;overflow:hidden}.progress .bar[data-v-a7a2cf70]{height:100%;background:var(--accent);transition:width .3s ease}.jump-card.done .progress .bar[data-v-a7a2cf70]{background:var(--ok)}.jump-card.error .progress .bar[data-v-a7a2cf70]{background:var(--bad)}.status-row .dot.spin[data-v-a7a2cf70]{animation:pulse-a7a2cf70 1s infinite;background:var(--accent)}.timer[data-v-a7a2cf70]{font-size:13px}.scan-progress[data-v-a7a2cf70]{margin-bottom:12px;padding:10px 14px;background:#3b82f60a;border-color:#3b82f640}.scan-progress .bar-track[data-v-a7a2cf70]{height:8px;border-radius:4px;overflow:hidden;background:#ffffff0f;position:relative}.scan-progress .bar-fill[data-v-a7a2cf70]{height:100%;background:linear-gradient(90deg,#3b82f6,#60a5fa,#3b82f6);background-size:200% 100%;animation:shimmer-a7a2cf70 2s linear infinite;transition:width .3s ease}@keyframes shimmer-a7a2cf70{to{background-position:-200% 0}}.scan-progress .small[data-v-a7a2cf70]{font-size:12px;margin-top:6px}.summary[data-v-a7a2cf70]{display:flex;gap:10px;margin-bottom:12px;flex-wrap:wrap}.pill[data-v-a7a2cf70]{background:var(--panel);border:1px solid var(--border);border-radius:6px;padding:8px 12px;display:flex;gap:8px;align-items:baseline}.pill .num[data-v-a7a2cf70]{font-size:18px;font-weight:700}.pill .lbl[data-v-a7a2cf70]{font-size:12px;color:var(--muted)}.pill.ok[data-v-a7a2cf70]{border-color:#10b98166}.pill.bad[data-v-a7a2cf70]{border-color:#ef444466}.pill.warn[data-v-a7a2cf70]{border-color:#f59e0b66}.ap-table[data-v-a7a2cf70]{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden}.ap-table th[data-v-a7a2cf70],.ap-table td[data-v-a7a2cf70]{padding:8px 10px;text-align:left;font-size:13px}.ap-table thead th[data-v-a7a2cf70]{background:var(--panel-2);color:var(--muted);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.05em}.ap-table tbody tr[data-v-a7a2cf70]{border-top:1px solid var(--border)}.ap-table tbody tr[data-v-a7a2cf70]:hover{background:#ffffff05}.ap-table td.bad[data-v-a7a2cf70]{color:#f87171;font-weight:600}.panel.error[data-v-a7a2cf70]{margin-top:12px;color:var(--bad)}.btn-fix[data-v-a7a2cf70]{background:#2563eb}.btn-leak[data-v-a7a2cf70]{background:#9333ea}.btn-apply[data-v-a7a2cf70]{background:#ea580c}.btn-nf[data-v-a7a2cf70]{background:#0d9488}.btn-revert[data-v-a7a2cf70]{background:#475569}.btn-newfix[data-v-a7a2cf70]{background:#db2777}.btn-oldfix[data-v-a7a2cf70]{background:#a16207}.btn-tunnel[data-v-a7a2cf70]{background:#0891b2;color:#fff;border:0;border-radius:4px;padding:6px 10px;cursor:pointer;font-weight:600}.btn-tunnel[data-v-a7a2cf70]:disabled{opacity:.5;cursor:not-allowed}.tunnels-panel[data-v-a7a2cf70]{margin-top:12px;padding:10px 14px;border-left:3px solid #0891b2}.tunnels-panel.has-tunnels[data-v-a7a2cf70]{border-left-color:#10b981}.tunnels-head[data-v-a7a2cf70]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.tunnels-head strong[data-v-a7a2cf70]{font-size:13px;text-transform:uppercase;letter-spacing:.04em}.tunnel-count[data-v-a7a2cf70]{font-size:11px;padding:1px 7px}.tunnel-hint[data-v-a7a2cf70]{margin-left:auto;font-size:11px}.tunnel-empty[data-v-a7a2cf70]{margin-top:8px;padding:6px 2px}.tunnel-cards[data-v-a7a2cf70]{margin-top:8px;display:flex;flex-direction:column;gap:6px}.tunnel-card[data-v-a7a2cf70]{padding:8px 12px;background:#ffffff05;border-left:3px solid #475569;border-radius:3px}.tunnel-card.open[data-v-a7a2cf70]{border-left-color:#10b981;background:#10b9810f}.tunnel-card.opening[data-v-a7a2cf70]{border-left-color:#eab308;background:#eab3080d}.tunnel-card.error[data-v-a7a2cf70]{border-left-color:#ef4444;background:#ef44440f}.tunnel-card.closed[data-v-a7a2cf70]{border-left-color:#64748b;opacity:.75}.tunnel-card-row1[data-v-a7a2cf70]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.tunnel-card-row2[data-v-a7a2cf70]{display:flex;align-items:center;gap:18px;flex-wrap:wrap;margin-top:4px;font-size:12px}.tunnel-card-row1 .name[data-v-a7a2cf70]{font-size:14px}.tunnel-card-row1 .tid[data-v-a7a2cf70]{font-size:11px;padding:1px 6px;background:#ffffff0a;border-radius:3px}.tunnel-card-row1 .close-btn[data-v-a7a2cf70]{margin-left:auto}.status-dot[data-v-a7a2cf70]{width:9px;height:9px;border-radius:50%;background:#64748b;display:inline-block}.status-dot.open[data-v-a7a2cf70]{background:#10b981;box-shadow:0 0 #10b98199;animation:dot-pulse-a7a2cf70 1.6s infinite}.status-dot.opening[data-v-a7a2cf70]{background:#eab308;animation:dot-pulse-slow-a7a2cf70 2s infinite}.status-dot.error[data-v-a7a2cf70]{background:#ef4444}.status-dot.closed[data-v-a7a2cf70]{background:#64748b}.status-txt[data-v-a7a2cf70]{font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:600}.status-txt.open[data-v-a7a2cf70]{color:#10b981}.status-txt.opening[data-v-a7a2cf70]{color:#eab308}.status-txt.error[data-v-a7a2cf70]{color:#ef4444}.status-txt.closed[data-v-a7a2cf70]{color:#94a3b8}.metric[data-v-a7a2cf70]{font-size:12px;display:inline-flex;align-items:center;gap:4px}.metric .bad[data-v-a7a2cf70]{color:#ef4444}@keyframes dot-pulse-a7a2cf70{0%{box-shadow:0 0 #10b981b3}70%{box-shadow:0 0 0 8px #10b98100}to{box-shadow:0 0 #10b98100}}@keyframes dot-pulse-slow-a7a2cf70{0%,to{opacity:1}50%{opacity:.4}}.ap-tunnel-btn[data-v-a7a2cf70]{margin-left:auto;padding:2px 8px;font-size:11px;font-family:inherit;letter-spacing:.04em}.ap-tunnel-open[data-v-a7a2cf70]{margin-left:auto;display:inline-block;width:10px;height:10px;border-radius:50%;background:#10b981;box-shadow:0 0 #10b981b3;animation:dot-pulse-a7a2cf70 1.6s infinite}.spin-ring[data-v-a7a2cf70]{display:inline-block;width:10px;height:10px;border:2px solid rgba(255,255,255,.25);border-top-color:currentColor;border-radius:50%;animation:spin-a7a2cf70 .8s linear infinite;vertical-align:middle;margin-right:4px}@keyframes spin-a7a2cf70{to{transform:rotate(360deg)}}.btn-fix.active[data-v-a7a2cf70],.btn-leak.active[data-v-a7a2cf70],.btn-apply.active[data-v-a7a2cf70],.btn-nf.active[data-v-a7a2cf70],.btn-revert.active[data-v-a7a2cf70],.btn-newfix.active[data-v-a7a2cf70],.btn-oldfix.active[data-v-a7a2cf70]{box-shadow:0 0 0 2px #ffffff4d inset;animation:pulse-a7a2cf70 1.4s infinite}.mode-banner[data-v-a7a2cf70]{display:flex;gap:14px;align-items:baseline;margin-bottom:12px;padding:10px 14px}.mode-banner strong[data-v-a7a2cf70]{font-size:13px;text-transform:uppercase;letter-spacing:.06em}.mode-banner.fix[data-v-a7a2cf70]{border-left:4px solid #2563eb}.mode-banner.leak[data-v-a7a2cf70]{border-left:4px solid #9333ea}.mode-banner.applyfix[data-v-a7a2cf70]{border-left:4px solid #ea580c}.mode-banner.oldfix[data-v-a7a2cf70]{border-left:4px solid #a16207}.vlan-head[data-v-a7a2cf70]{text-align:center}.vlan-head.mgmt[data-v-a7a2cf70]{color:#60a5fa}.vlan-cell[data-v-a7a2cf70]{text-align:center;font-size:12px}.vlan-cell .sub[data-v-a7a2cf70]{font-size:10px;display:block;line-height:1}.vlan-cell.hot[data-v-a7a2cf70]{background:#ef444414}.vlan-cell.mgmt[data-v-a7a2cf70]{background:#60a5fa14;color:#93c5fd}.ap-table.leak .vlan-cell .vlan-inc[data-v-a7a2cf70]{font-size:14px;font-weight:700}.ap-table.leak .vlan-cell.hot[data-v-a7a2cf70]{background:#ef44442e}.ap-table.leak .vlan-cell.mgmt[data-v-a7a2cf70]{background:#60a5fa1f}.mgmt-tag[data-v-a7a2cf70]{display:inline-block;font-size:9px;margin-left:4px;padding:1px 4px;border-radius:3px;background:#60a5fa33;color:#93c5fd;font-weight:600}.action-head[data-v-a7a2cf70]{text-align:center;width:90px}.action-cell[data-v-a7a2cf70]{text-align:center}.action-cell .sm[data-v-a7a2cf70]{padding:2px 8px;font-size:12px}.fix-btn[data-v-a7a2cf70]{background:transparent;color:var(--accent);border:1px solid transparent;padding:4px 8px}.fix-btn[data-v-a7a2cf70]:hover{border-color:var(--accent)}.badge.applying[data-v-a7a2cf70]{background:#ea580c2e;color:#fb923c;animation:pulse-a7a2cf70 1.4s infinite}.apply-banner[data-v-a7a2cf70]{margin-bottom:12px;padding:10px 14px;border-left:4px solid #ea580c;background:#ea580c0f}.apply-head[data-v-a7a2cf70]{display:flex;align-items:center;gap:10px;margin-bottom:6px}.apply-spinner[data-v-a7a2cf70]{display:inline-block;animation:spin-a7a2cf70 1.5s linear infinite;font-size:16px}@keyframes spin-a7a2cf70{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.apply-list[data-v-a7a2cf70]{display:flex;flex-direction:column;gap:4px;font-size:13px}.apply-item[data-v-a7a2cf70]{display:grid;grid-template-columns:1fr auto 2fr auto;gap:10px;padding:4px 8px;border-radius:4px;background:#ffffff05}.apply-item .name[data-v-a7a2cf70]{font-weight:500}.emitters-panel[data-v-a7a2cf70]{margin-bottom:12px;border-left:4px solid #f59e0b;background:#f59e0b0a}.emitters-head[data-v-a7a2cf70]{display:flex;align-items:center;gap:10px;margin-bottom:8px;font-size:13px}.emitters-list[data-v-a7a2cf70]{display:flex;flex-direction:column;gap:3px}.emitter-row[data-v-a7a2cf70]{display:grid;grid-template-columns:30px 80px 1fr auto auto;gap:12px;align-items:center;padding:6px 10px;border-radius:4px;background:#ffffff05;font-size:13px}.emitter-row.initiator[data-v-a7a2cf70]{background:#ef444424;border:1px solid rgba(239,68,68,.3)}.emitter-row.us[data-v-a7a2cf70]{outline:1px solid rgba(59,130,246,.25)}.emitter-row .num[data-v-a7a2cf70]{font-weight:700;text-align:right;color:var(--muted)}.emitter-row .t[data-v-a7a2cf70]{color:var(--accent);font-weight:600}.emitter-row .who strong[data-v-a7a2cf70]{color:var(--text)}.emitter-row .count[data-v-a7a2cf70]{font-variant-numeric:tabular-nums}.emitter-row .tag[data-v-a7a2cf70]{display:inline-block;font-size:10px;padding:1px 5px;border-radius:3px;margin-right:4px;font-weight:700;letter-spacing:.04em}.emitter-row .tag.us[data-v-a7a2cf70]{background:#3b82f640;color:#93c5fd}.emitter-row .tag.gw[data-v-a7a2cf70]{background:#10b98140;color:#34d399}.emitter-row .tag.other[data-v-a7a2cf70]{background:#94a3b840;color:var(--muted)}:root{--bg: #0f172a;--panel: #1e293b;--panel-2: #334155;--text: #e2e8f0;--muted: #94a3b8;--ok: #10b981;--warn: #f59e0b;--bad: #ef4444;--accent: #3b82f6;--border: #334155;--mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;color-scheme:dark}*{box-sizing:border-box}html,body{height:100%;margin:0}body{background:var(--bg);color:var(--text);font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.4}#app{min-height:100%;display:flex;flex-direction:column}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}button{background:var(--accent);color:#fff;border:0;padding:8px 14px;border-radius:6px;cursor:pointer;font-size:14px;font-weight:500}button:hover:not(:disabled){filter:brightness(1.1)}button:disabled{opacity:.5;cursor:not-allowed}button.ghost{background:transparent;border:1px solid var(--border);color:var(--text)}input[type=text],input[type=password]{background:var(--panel);color:var(--text);border:1px solid var(--border);padding:8px 12px;border-radius:6px;font-size:14px;width:100%}input:focus{outline:none;border-color:var(--accent)}label{display:block;margin-bottom:4px;color:var(--muted);font-size:12px;text-transform:uppercase;letter-spacing:.04em}.panel{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:16px}.badge{display:inline-block;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.badge.ok{background:#10b98126;color:#34d399}.badge.warn{background:#f59e0b26;color:#fbbf24}.badge.bad{background:#ef444426;color:#f87171}.badge.muted{background:#94a3b826;color:var(--muted)}.mono{font-family:var(--mono)}.muted{color:var(--muted)}
