node-red-contrib-knx-ultimate 4.1.35 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,19 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 4.2.2** - March 2026<br/>
10
+
11
+ - CHANGE: **KNX AI Web Page** is now the official Vue-based dashboard served from `/knxUltimateAI/sidebar/page`.<br/>
12
+ - CHANGE: removed the old **KNX AI** legacy web page and its dedicated editor button, keeping the Vue preview as the only web UI entrypoint.<br/>
13
+ - IMPROVE: **KNX AI Flow Map** in the Vue dashboard: wider layout, fullscreen toggle, animated/dashed traffic arrows, refined marker sizing and better panel width usage.<br/>
14
+
15
+ **Version 4.2.1** - March 2026<br/>
16
+
17
+ - FIX: **KNX Hue Light** brightness writes are now applied even when the Hue light is OFF, without forcing the light to switch on.<br/>
18
+ - FIX: **KNX Hue Light** grouped light handling: when a `grouped_light` is OFF and receives a brightness write, the node now presets supported member `light` resources first, so the brightness is ready when the group is turned on later.<br/>
19
+ - TEST: extended **KNX Hue Light** coverage for brightness writes on OFF lights and OFF grouped lights.<br/>
20
+ - UPDATE: KNXUltimate engine bumped to 5.4.0<br/>
21
+
9
22
  **Version 4.1.35** - March 2026<br/>
10
23
 
11
24
  - NEW: **KNX AI** anomalies output now always emits dedicated bus connection events when the KNX gateway connection is lost and when it is restored.<br/>
@@ -100,7 +100,7 @@
100
100
 
101
101
  const nodeId = this.id;
102
102
 
103
- $("#knx-ai-open-web-page").on("click", function (evt) {
103
+ $("#knx-ai-open-web-page-vue").on("click", function (evt) {
104
104
  evt.preventDefault();
105
105
  const target = "knxUltimateAI/sidebar/page" + (nodeId ? ("?nodeId=" + encodeURIComponent(nodeId)) : "");
106
106
  const wnd = window.open(target, "_blank", "noopener,noreferrer");
@@ -199,9 +199,11 @@
199
199
  </div>
200
200
  <div class="form-row">
201
201
  <label><i class="fa fa-external-link"></i> Web UI</label>
202
- <button type="button" class="red-ui-button" id="knx-ai-open-web-page" style="background-color:#AD9EFF; border-color:#AD9EFF; color:#ffffff !important; -webkit-text-fill-color:#ffffff;">
203
- <i class="fa fa-magic" style="color:#2b1f4d !important;"></i> <span style="color:#2b1f4d !important;">Open KNX AI Web</span>
204
- </button>
202
+ <div style="display:flex; gap:8px; flex-wrap:wrap;">
203
+ <button type="button" class="red-ui-button" id="knx-ai-open-web-page-vue" style="background-color:#2bb673; border-color:#2bb673; color:#ffffff !important; -webkit-text-fill-color:#ffffff;">
204
+ <i class="fa fa-leaf" style="color:#10341f !important;"></i> <span style="color:#10341f !important;">Open KNX AI Web Page</span>
205
+ </button>
206
+ </div>
205
207
  </div>
206
208
 
207
209
  <div id="knx-ai-accordion">
@@ -389,4 +391,4 @@
389
391
  </div>
390
392
  </div>
391
393
  </div>
392
- </script>
394
+ </script>
@@ -7,6 +7,41 @@ const coerceBoolean = (value) => (value === true || value === 'true')
7
7
 
8
8
  let adminEndpointsRegistered = false
9
9
  const aiRuntimeNodes = new Map()
10
+ const knxAiVueDistDir = path.join(__dirname, 'plugins', 'knxUltimateAI-vue')
11
+
12
+ const sendKnxAiVueIndex = (res) => {
13
+ const entryPath = path.join(knxAiVueDistDir, 'index.html')
14
+ fs.stat(entryPath, (error, stats) => {
15
+ if (error || !stats || !stats.isFile()) {
16
+ res.status(503).type('text/plain').send('KNX AI Vue build not found. Run "npm run knx-ai:build" in the module root.')
17
+ return
18
+ }
19
+ res.sendFile(entryPath, (sendError) => {
20
+ if (!sendError || res.headersSent) return
21
+ res.status(sendError.statusCode || 500).type('text/plain').send(sendError.message || String(sendError))
22
+ })
23
+ })
24
+ }
25
+
26
+ const sendStaticFileSafe = ({ rootDir, relativePath, res }) => {
27
+ const rootPath = path.resolve(rootDir)
28
+ const requestedPath = String(relativePath || '').replace(/^\/+/, '')
29
+ const fullPath = path.resolve(rootPath, requestedPath)
30
+ if (!fullPath.startsWith(rootPath + path.sep) && fullPath !== rootPath) {
31
+ res.status(403).type('text/plain').send('Forbidden')
32
+ return
33
+ }
34
+ fs.stat(fullPath, (statError, stats) => {
35
+ if (statError || !stats || !stats.isFile()) {
36
+ res.status(404).type('text/plain').send('File not found')
37
+ return
38
+ }
39
+ res.sendFile(fullPath, (sendError) => {
40
+ if (!sendError || res.headersSent) return
41
+ res.status(sendError.statusCode || 500).type('text/plain').send(sendError.message || String(sendError))
42
+ })
43
+ })
44
+ }
10
45
 
11
46
  const sanitizeApiKey = (value) => {
12
47
  if (value === undefined || value === null) return ''
@@ -856,12 +891,26 @@ module.exports = function (RED) {
856
891
  adminEndpointsRegistered = true
857
892
 
858
893
  RED.httpAdmin.get('/knxUltimateAI/sidebar/page', RED.auth.needsPermission('knxUltimate-config.read'), (req, res) => {
859
- const pagePath = path.join(__dirname, 'plugins', 'knxUltimateAI-web-page.html')
860
- res.sendFile(pagePath, (error) => {
861
- if (!error) return
862
- if (!res.headersSent) {
863
- res.status(error.statusCode || 500).send(error.message || String(error))
864
- }
894
+ sendKnxAiVueIndex(res)
895
+ })
896
+
897
+ RED.httpAdmin.get('/knxUltimateAI/sidebar/page-vue', RED.auth.needsPermission('knxUltimate-config.read'), (req, res) => {
898
+ sendKnxAiVueIndex(res)
899
+ })
900
+
901
+ RED.httpAdmin.get('/knxUltimateAI/sidebar/page/assets/:file', RED.auth.needsPermission('knxUltimate-config.read'), (req, res) => {
902
+ sendStaticFileSafe({
903
+ rootDir: knxAiVueDistDir,
904
+ relativePath: path.join('assets', String(req.params?.file || '')),
905
+ res
906
+ })
907
+ })
908
+
909
+ RED.httpAdmin.get('/knxUltimateAI/sidebar/page-vue/assets/:file', RED.auth.needsPermission('knxUltimate-config.read'), (req, res) => {
910
+ sendStaticFileSafe({
911
+ rootDir: knxAiVueDistDir,
912
+ relativePath: path.join('assets', String(req.params?.file || '')),
913
+ res
865
914
  })
866
915
  })
867
916
 
@@ -1140,6 +1189,7 @@ module.exports = function (RED) {
1140
1189
  node._anomalyLifecycle = new Map()
1141
1190
  node._gaRateSeries = new Map()
1142
1191
  node._gaLabelCsvCache = { ref: null, map: {} }
1192
+ node._busConnectionWatchTimer = null
1143
1193
  node._busConnectionState = (node.serverKNX && typeof node.serverKNX.linkStatus === 'string')
1144
1194
  ? String(node.serverKNX.linkStatus).toLowerCase()
1145
1195
  : 'unknown'
@@ -1150,6 +1200,7 @@ module.exports = function (RED) {
1150
1200
  startedAtMs: nowMs(),
1151
1201
  endedAtMs: 0
1152
1202
  }]
1203
+ node._busConnectionWindowSec = 12 * 60 * 60
1153
1204
 
1154
1205
  // Register runtime instance for sidebar visibility
1155
1206
  aiRuntimeNodes.set(node.id, node)
@@ -2313,7 +2364,7 @@ module.exports = function (RED) {
2313
2364
  const appendBusConnectionTimeline = ({ state, atMs }) => {
2314
2365
  const nextState = state === 'connected' ? 'connected' : 'disconnected'
2315
2366
  const ts = Number.isFinite(Number(atMs)) && Number(atMs) > 0 ? Number(atMs) : nowMs()
2316
- const keepMs = Math.max(60, Number(node.historyWindowSec || 60)) * 4000
2367
+ const keepMs = Math.max(12 * 60 * 60, Number(node._busConnectionWindowSec || 0)) * 2000
2317
2368
  if (!Array.isArray(node._busConnectionTimeline) || node._busConnectionTimeline.length === 0) {
2318
2369
  node._busConnectionTimeline = [{ state: nextState, startedAtMs: ts, endedAtMs: 0 }]
2319
2370
  return
@@ -2348,7 +2399,7 @@ module.exports = function (RED) {
2348
2399
  }
2349
2400
 
2350
2401
  const buildBusConnectionSummary = (now) => {
2351
- const windowSec = Math.max(5, Number(node.historyWindowSec || 60))
2402
+ const windowSec = Math.max(12 * 60 * 60, Number(node._busConnectionWindowSec || 0))
2352
2403
  const windowMs = windowSec * 1000
2353
2404
  const windowStartMs = now - windowMs
2354
2405
  const timeline = Array.isArray(node._busConnectionTimeline) ? node._busConnectionTimeline : []
@@ -2424,7 +2475,10 @@ module.exports = function (RED) {
2424
2475
  if (/^Connected\./i.test(statusText)) nextState = 'connected'
2425
2476
  if (/^Disconnected\b/i.test(statusText)) nextState = 'disconnected'
2426
2477
  if (nextState === '') return
2478
+ applyBusConnectionStateChange({ nextState, statusText })
2479
+ }
2427
2480
 
2481
+ const applyBusConnectionStateChange = ({ nextState, statusText }) => {
2428
2482
  const previousState = node._busConnectionState || 'unknown'
2429
2483
  if (previousState === nextState) return
2430
2484
  node._busConnectionState = nextState
@@ -2455,6 +2509,17 @@ module.exports = function (RED) {
2455
2509
  }
2456
2510
  }
2457
2511
 
2512
+ const pollBusConnectionStatus = () => {
2513
+ try {
2514
+ const raw = String((node.serverKNX && node.serverKNX.linkStatus) ? node.serverKNX.linkStatus : '').trim().toLowerCase()
2515
+ if (raw !== 'connected' && raw !== 'disconnected') return
2516
+ applyBusConnectionStateChange({
2517
+ nextState: raw,
2518
+ statusText: `Polled gateway state: ${raw}`
2519
+ })
2520
+ } catch (error) { /* ignore */ }
2521
+ }
2522
+
2458
2523
  const maybeEmitOverallAnomaly = (now) => {
2459
2524
  const windowMs = Math.max(2, node.rateWindowSec) * 1000
2460
2525
  const cutoff = now - windowMs
@@ -2706,6 +2771,7 @@ module.exports = function (RED) {
2706
2771
  node.on('close', function (done) {
2707
2772
  try {
2708
2773
  if (node._timerEmit) clearInterval(node._timerEmit)
2774
+ if (node._busConnectionWatchTimer) clearInterval(node._busConnectionWatchTimer)
2709
2775
  if (node._summaryRebuildTimer) {
2710
2776
  clearTimeout(node._summaryRebuildTimer)
2711
2777
  node._summaryRebuildTimer = null
@@ -2731,6 +2797,12 @@ module.exports = function (RED) {
2731
2797
  }, Math.max(5, node.emitIntervalSec) * 1000)
2732
2798
  }
2733
2799
 
2800
+ if (node._busConnectionWatchTimer) clearInterval(node._busConnectionWatchTimer)
2801
+ node._busConnectionWatchTimer = setInterval(() => {
2802
+ pollBusConnectionStatus()
2803
+ }, 1000)
2804
+ pollBusConnectionStatus()
2805
+
2734
2806
  updateStatus({ fill: 'grey', shape: 'dot', text: 'AI ready' })
2735
2807
  }
2736
2808
 
@@ -160,7 +160,7 @@ module.exports = function (RED) {
160
160
  const defaultOperation = node.isGrouped_light === false ? "setLight" : "setGroupedLight";
161
161
  const isGroupedLightOff = node.isGrouped_light === true && node.currentHUEDevice?.on?.on === false;
162
162
  const stateKeys = _state && typeof _state === "object" ? Object.keys(_state) : [];
163
- const presetKeys = ["color", "color_temperature", "gradient"];
163
+ const presetKeys = ["dimming", "color", "color_temperature", "gradient"];
164
164
  const actionableKeys = ["dimming", ...presetKeys];
165
165
  const hasActionablePayload = stateKeys.some((key) => actionableKeys.includes(key));
166
166
  const mustPresetGroupedLightChildren = isGroupedLightOff
@@ -534,14 +534,12 @@ module.exports = function (RED) {
534
534
  break;
535
535
  case config.GALightBrightness:
536
536
  msg.payload = dptlib.fromBuffer(msg.knx.rawValue, dptlib.resolve(config.dptLightBrightness));
537
+ if (typeof msg.payload !== "number" || Number.isNaN(msg.payload)) throw new Error("Invalid KNX brightness payload");
537
538
  state = { dimming: { brightness: msg.payload } };
538
- if (node.currentHUEDevice === undefined) {
539
- // Grouped light
540
- state.on = { on: msg.payload > 0 };
541
- } else {
542
- // Light
543
- if (node.currentHUEDevice.on.on === false && msg.payload > 0) state.on = { on: true };
544
- if (node.currentHUEDevice.on.on === true && msg.payload === 0) state.on = { on: false };
539
+ if (msg.payload === 0) {
540
+ state.on = { on: false };
541
+ } else if (node.currentHUEDevice !== undefined && node.currentHUEDevice.on?.on === true) {
542
+ state.on = { on: true };
545
543
  }
546
544
  node.syncCurrentHUEDeviceFromKNXState(state); // Starting from v 4.1.31
547
545
  node.writeHueState(state);
@@ -0,0 +1 @@
1
+ .page-shell[data-v-d00cc40d]{width:min(1660px,calc(100% - 18px));margin:14px auto 28px}.topbar[data-v-d00cc40d]{margin-bottom:18px;padding:22px;border:1px solid var(--line);border-radius:24px;background:#ffffffe0;box-shadow:var(--shadow);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.brand[data-v-d00cc40d]{margin-bottom:18px}.eyebrow[data-v-d00cc40d]{margin:0 0 6px;color:var(--accent);font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.brand h1[data-v-d00cc40d]{margin:0;font-size:clamp(28px,4vw,40px);line-height:1}.subhead[data-v-d00cc40d]{max-width:860px;margin:10px 0 0;color:var(--muted);font-size:14px;line-height:1.5}.toolbar[data-v-d00cc40d],.statusbar[data-v-d00cc40d],.theme-strip[data-v-d00cc40d],.checkbox[data-v-d00cc40d],.pill-row[data-v-d00cc40d],.preset-row[data-v-d00cc40d],.ask-row[data-v-d00cc40d]{display:flex;flex-wrap:wrap;gap:10px;align-items:center}.toolbar[data-v-d00cc40d]{margin-bottom:12px}.theme-button[data-v-d00cc40d],.primary-button[data-v-d00cc40d],.preset-button[data-v-d00cc40d],.primary-link[data-v-d00cc40d],.secondary-button[data-v-d00cc40d]{border:1px solid var(--line);border-radius:999px;background:#fff;color:var(--text);text-decoration:none;font-size:13px;font-weight:700;padding:10px 14px;transition:.18s ease}.theme-button.active[data-v-d00cc40d],.primary-button[data-v-d00cc40d],.primary-link[data-v-d00cc40d]{border-color:transparent;background:linear-gradient(135deg,var(--accent),#4bbf77);color:#fff}.theme-button[data-v-d00cc40d]:hover,.preset-button[data-v-d00cc40d]:hover,.secondary-button[data-v-d00cc40d]:hover{background:var(--accent-soft);border-color:#7a68d866}.primary-button[data-v-d00cc40d]:disabled,.preset-button[data-v-d00cc40d]:disabled{opacity:.6;cursor:not-allowed}.node-select[data-v-d00cc40d]{min-width:min(360px,100%)}.node-select[data-v-d00cc40d],.checkbox[data-v-d00cc40d],.summary-pre[data-v-d00cc40d],.chat-log[data-v-d00cc40d],.anomaly-card pre[data-v-d00cc40d]{border:1px solid var(--line);border-radius:16px;background:#ffffffe0}.node-select[data-v-d00cc40d]{padding:10px 12px;color:var(--text)}.checkbox[data-v-d00cc40d]{padding:10px 12px;gap:8px}.statusbar[data-v-d00cc40d]{justify-content:space-between}.status-pill[data-v-d00cc40d],.meta-chip[data-v-d00cc40d],.pill[data-v-d00cc40d]{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:7px 12px;font-size:12px;font-weight:800}.status-pill[data-v-d00cc40d],.meta-chip[data-v-d00cc40d],.pill.neutral[data-v-d00cc40d]{background:var(--accent-soft);color:var(--text)}.status-pill.error[data-v-d00cc40d],.pill.danger[data-v-d00cc40d]{background:var(--err-bg);color:#a4333a}.pill.success[data-v-d00cc40d]{background:var(--ok-bg);color:#1b7d36}.status-detail[data-v-d00cc40d]{color:var(--muted);font-size:12px;font-weight:700}.content-grid[data-v-d00cc40d]{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:16px}.card[data-v-d00cc40d]{grid-column:span 6;min-height:240px;padding:18px;border:1px solid var(--line);border-radius:var(--card-radius);background:#ffffffe6;box-shadow:var(--shadow)}.card-summary[data-v-d00cc40d],.card-bus[data-v-d00cc40d],.card-chat[data-v-d00cc40d],.card-flow[data-v-d00cc40d],.card-anomalies[data-v-d00cc40d]{grid-column:span 6}.card-flow[data-v-d00cc40d]{grid-column:span 12}.card-head[data-v-d00cc40d]{display:flex;justify-content:space-between;gap:12px;align-items:center;margin-bottom:14px}.card-head-actions[data-v-d00cc40d]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.card-head h2[data-v-d00cc40d]{margin:0;font-size:18px}.summary-pre[data-v-d00cc40d],.chat-log[data-v-d00cc40d]{margin:0;padding:14px;white-space:pre-wrap;word-break:break-word;font-family:JetBrains Mono,SFMono-Regular,monospace;font-size:12px;line-height:1.5}.metric-grid[data-v-d00cc40d]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:14px}.metric[data-v-d00cc40d]{padding:12px;border-radius:16px;background:var(--panel-soft)}.metric span[data-v-d00cc40d]{display:block;margin-bottom:6px;color:var(--muted);font-size:12px;font-weight:700}.metric strong[data-v-d00cc40d]{font-size:20px}.rank-list[data-v-d00cc40d],.event-list[data-v-d00cc40d],.anomaly-list[data-v-d00cc40d]{margin:0;padding:0;list-style:none}.rank-row[data-v-d00cc40d],.event-row[data-v-d00cc40d]{display:grid;gap:12px;align-items:center;padding:10px 0;border-bottom:1px solid rgba(98,87,142,.14)}.rank-row[data-v-d00cc40d]{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr) auto}.event-row[data-v-d00cc40d]{grid-template-columns:minmax(0,1fr) minmax(0,1.6fr) auto}.rank-title[data-v-d00cc40d],.event-name[data-v-d00cc40d]{font-weight:800}.rank-label[data-v-d00cc40d]{color:var(--muted);font-size:12px}.event-bar[data-v-d00cc40d]{height:10px;overflow:hidden;border-radius:999px;background:#7a68d81f}.event-bar-fill[data-v-d00cc40d]{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--accent),#4bbf77)}.bus-track[data-v-d00cc40d]{position:relative;height:18px;margin-top:16px;overflow:hidden;border:1px solid rgba(98,87,142,.2);border-radius:999px;background:linear-gradient(180deg,#f6f3ff,#efebfb)}.bus-segment[data-v-d00cc40d]{position:absolute;top:0;bottom:0}.segment-connected[data-v-d00cc40d]{background:linear-gradient(90deg,#4ad06d,#38c45f)}.segment-disconnected[data-v-d00cc40d]{background:linear-gradient(90deg,#eb6a74,#d94b55)}.bus-scale[data-v-d00cc40d]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:10px;color:var(--muted);font-size:12px;font-weight:700}.bus-scale span[data-v-d00cc40d]:nth-child(2){text-align:center}.bus-scale span[data-v-d00cc40d]:nth-child(3){text-align:right}.bus-note[data-v-d00cc40d],.flow-note[data-v-d00cc40d],.empty-state[data-v-d00cc40d]{color:var(--muted);line-height:1.5}.flow-toolbar[data-v-d00cc40d]{display:grid;grid-template-columns:120px minmax(180px,1fr) minmax(220px,1.2fr);gap:12px;align-items:start}.flow-field[data-v-d00cc40d]{display:flex;flex-direction:column;gap:6px;color:var(--muted);font-size:12px;font-weight:700}.flow-field input[data-v-d00cc40d],.flow-field select[data-v-d00cc40d]{border:1px solid var(--line);border-radius:14px;background:#ffffffe0;color:var(--text);padding:10px 12px}.flow-field select[data-v-d00cc40d]{min-height:128px}.flow-legend[data-v-d00cc40d]{display:flex;flex-wrap:wrap;gap:10px 14px;align-items:center;padding:10px 0 0;color:var(--muted);font-size:12px;font-weight:700}.legend-line[data-v-d00cc40d],.legend-dot[data-v-d00cc40d]{display:inline-block;vertical-align:middle;margin-right:6px}.legend-line[data-v-d00cc40d]{width:18px;border-top:3px solid currentColor}.legend-write[data-v-d00cc40d]{color:#7a68d8}.legend-response[data-v-d00cc40d]{color:#46b86d}.legend-read[data-v-d00cc40d]{color:#d99a34}.legend-repeat[data-v-d00cc40d]{color:#c34747}.legend-dot[data-v-d00cc40d]{width:10px;height:10px;border-radius:50%}.legend-anomaly[data-v-d00cc40d]{background:#f08f92}.legend-external[data-v-d00cc40d]{background:#f5d9a2}.flow-frame[data-v-d00cc40d]{margin-top:16px;overflow:auto;border:1px solid var(--line);border-radius:20px;background:linear-gradient(180deg,#fffffffa,#f8f5fff5)}.card-flow.is-fullscreen[data-v-d00cc40d]{width:100%;height:100%;margin:0;padding:18px;border-radius:0;background:#fffffffa;overflow:auto}.card-flow.is-fullscreen .flow-frame[data-v-d00cc40d]{height:calc(100vh - 260px)}.card-flow.is-fullscreen .flow-svg[data-v-d00cc40d]{min-height:calc(100vh - 260px)}.flow-svg[data-v-d00cc40d]{width:100%;min-width:1180px;min-height:420px;display:block}.flow-empty[data-v-d00cc40d]{padding:24px}.flow-edge[data-v-d00cc40d]{fill:none;stroke-linecap:round;vector-effect:non-scaling-stroke}.flow-edge-active[data-v-d00cc40d]{stroke-dasharray:10 7;animation:graph-flow-d00cc40d 1.25s linear infinite}.flow-edge-idle[data-v-d00cc40d]{stroke-dasharray:8 8;animation:none}@keyframes graph-flow-d00cc40d{0%{stroke-dashoffset:0}to{stroke-dashoffset:-34}}.flow-node circle[data-v-d00cc40d]{fill:#edf9ef;stroke:#4caf66;stroke-width:2}.flow-node.is-anomaly circle[data-v-d00cc40d]{fill:#fff1f1;stroke:#e53935}.flow-node.is-external circle[data-v-d00cc40d]{fill:#fff8ea;stroke:#c98a1a;stroke-dasharray:4 3}.flow-node.is-idle circle[data-v-d00cc40d]{opacity:.7}.node-label[data-v-d00cc40d],.node-subtitle[data-v-d00cc40d],.node-payload[data-v-d00cc40d],.node-badge[data-v-d00cc40d]{text-anchor:middle;dominant-baseline:middle}.node-label[data-v-d00cc40d]{fill:#2f7f48;font-size:12px;font-weight:800}.flow-node.is-external .node-label[data-v-d00cc40d]{fill:#9a6b24}.node-subtitle[data-v-d00cc40d]{fill:#665f86;font-size:10px}.node-payload[data-v-d00cc40d]{fill:#645d84;font-size:9px;font-family:JetBrains Mono,SFMono-Regular,monospace}.node-badge[data-v-d00cc40d]{fill:#b3261e;font-size:9px;font-weight:800}.anomaly-list[data-v-d00cc40d]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px}.anomaly-card[data-v-d00cc40d]{padding:14px;border-left:4px solid var(--warn-border);border-radius:18px;background:var(--warn-bg)}.anomaly-head[data-v-d00cc40d]{display:flex;justify-content:space-between;gap:10px;align-items:baseline}.anomaly-time[data-v-d00cc40d]{margin:8px 0 10px;color:var(--muted);font-size:12px}.anomaly-card pre[data-v-d00cc40d]{margin:0;padding:12px;white-space:pre-wrap;word-break:break-word;font-size:12px}.chat-log[data-v-d00cc40d]{min-height:280px}.ask-row[data-v-d00cc40d]{margin-bottom:12px}.ask-input[data-v-d00cc40d]{flex:1 1 260px;min-width:0;border:1px solid var(--line);border-radius:999px;background:#ffffffe0;color:var(--text);padding:11px 14px}.chat-message[data-v-d00cc40d]{margin-bottom:12px;padding:12px;border-radius:16px}.chat-message pre[data-v-d00cc40d]{margin:0;white-space:pre-wrap;word-break:break-word;font-family:inherit}.chat-user[data-v-d00cc40d]{background:#7a68d81a}.chat-assistant[data-v-d00cc40d]{background:#5bbf731f}.chat-error[data-v-d00cc40d]{background:var(--err-bg)}.chat-pending[data-v-d00cc40d]{background:#62578e14;color:var(--muted)}[data-v-d00cc40d] .chat-svg-wrap{margin-top:10px;overflow:auto;border:1px solid rgba(122,104,216,.25);border-radius:14px;background:#fff;padding:8px}[data-v-d00cc40d] .chat-svg-wrap svg{width:100%;height:auto;display:block}[data-v-d00cc40d] .chat-table-wrap{overflow:auto}[data-v-d00cc40d] .chat-table-wrap table,[data-v-d00cc40d] table{width:100%;border-collapse:collapse;margin-top:8px}[data-v-d00cc40d] th,[data-v-d00cc40d] td{padding:6px 8px;border:1px solid rgba(98,87,142,.16)}@media(max-width:1100px){.card[data-v-d00cc40d],.card-summary[data-v-d00cc40d],.card-bus[data-v-d00cc40d],.card-chat[data-v-d00cc40d],.card-flow[data-v-d00cc40d],.card-anomalies[data-v-d00cc40d]{grid-column:span 12}}@media(max-width:720px){.page-shell[data-v-d00cc40d]{width:min(100% - 16px,1440px);margin-top:8px}.topbar[data-v-d00cc40d],.card[data-v-d00cc40d]{padding:14px;border-radius:20px}.rank-row[data-v-d00cc40d],.event-row[data-v-d00cc40d],.metric-grid[data-v-d00cc40d],.flow-toolbar[data-v-d00cc40d]{grid-template-columns:1fr}.statusbar[data-v-d00cc40d]{align-items:flex-start}}:root{color-scheme:light;--bg: #f4f1ff;--panel: #ffffff;--panel-soft: #f8f5ff;--text: #2b2446;--muted: #655f80;--line: rgba(98, 87, 142, .24);--accent: #7a68d8;--accent-soft: #ece8ff;--ok-bg: #edf9ef;--ok-border: #5bbf73;--err-bg: #ffe9ea;--err-border: #d95b63;--warn-bg: #fff3df;--warn-border: #d99a34;--card-radius: 18px;--shadow: 0 12px 40px rgba(43, 36, 70, .08);font-family:Manrope,Segoe UI,sans-serif}*{box-sizing:border-box}html,body,#app{min-height:100%;margin:0}body{background:radial-gradient(circle at top left,rgba(122,104,216,.16),transparent 30%),radial-gradient(circle at top right,rgba(91,191,115,.14),transparent 24%),linear-gradient(180deg,#f6f2ff,#f5f8ff 52%,#f7fcf8);color:var(--text)}button,input,select,textarea{font:inherit}a{color:inherit}
@@ -0,0 +1,3 @@
1
+ (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))n(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&n(i)}).observe(document,{childList:!0,subtree:!0});function s(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(r){if(r.ep)return;r.ep=!0;const o=s(r);fetch(r.href,o)}})();function _n(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const ie={},Gt=[],st=()=>{},Ir=()=>!1,Ls=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),vn=e=>e.startsWith("onUpdate:"),xe=Object.assign,wn=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},Uo=Object.prototype.hasOwnProperty,ee=(e,t)=>Uo.call(e,t),D=Array.isArray,qt=e=>_s(e)==="[object Map]",Zt=e=>_s(e)==="[object Set]",Bn=e=>_s(e)==="[object Date]",G=e=>typeof e=="function",ge=e=>typeof e=="string",rt=e=>typeof e=="symbol",re=e=>e!==null&&typeof e=="object",$r=e=>(re(e)||G(e))&&G(e.then)&&G(e.catch),Or=Object.prototype.toString,_s=e=>Or.call(e),Bo=e=>_s(e).slice(8,-1),Pr=e=>_s(e)==="[object Object]",Sn=e=>ge(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,os=_n(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Hs=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},Wo=/-\w/g,Ue=Hs(e=>e.replace(Wo,t=>t.slice(1).toUpperCase())),Go=/\B([A-Z])/g,Mt=Hs(e=>e.replace(Go,"-$1").toLowerCase()),kr=Hs(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ys=Hs(e=>e?`on${kr(e)}`:""),tt=(e,t)=>!Object.is(e,t),Ms=(e,...t)=>{for(let s=0;s<e.length;s++)e[s](...t)},Rr=(e,t,s,n=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},js=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Wn;const Vs=()=>Wn||(Wn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ds(e){if(D(e)){const t={};for(let s=0;s<e.length;s++){const n=e[s],r=ge(n)?Xo(n):ds(n);if(r)for(const o in r)t[o]=r[o]}return t}else if(ge(e)||re(e))return e}const qo=/;(?![^(]*\))/g,zo=/:([^]+)/,Jo=/\/\*[^]*?\*\//g;function Xo(e){const t={};return e.replace(Jo,"").split(qo).forEach(s=>{if(s){const n=s.split(zo);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function Qe(e){let t="";if(ge(e))t=e;else if(D(e))for(let s=0;s<e.length;s++){const n=Qe(e[s]);n&&(t+=n+" ")}else if(re(e))for(const s in e)e[s]&&(t+=s+" ");return t.trim()}const Yo="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Qo=_n(Yo);function Fr(e){return!!e||e===""}function Zo(e,t){if(e.length!==t.length)return!1;let s=!0;for(let n=0;s&&n<e.length;n++)s=es(e[n],t[n]);return s}function es(e,t){if(e===t)return!0;let s=Bn(e),n=Bn(t);if(s||n)return s&&n?e.getTime()===t.getTime():!1;if(s=rt(e),n=rt(t),s||n)return e===t;if(s=D(e),n=D(t),s||n)return s&&n?Zo(e,t):!1;if(s=re(e),n=re(t),s||n){if(!s||!n)return!1;const r=Object.keys(e).length,o=Object.keys(t).length;if(r!==o)return!1;for(const i in e){const l=e.hasOwnProperty(i),u=t.hasOwnProperty(i);if(l&&!u||!l&&u||!es(e[i],t[i]))return!1}}return String(e)===String(t)}function xn(e,t){return e.findIndex(s=>es(s,t))}const Dr=e=>!!(e&&e.__v_isRef===!0),V=e=>ge(e)?e:e==null?"":D(e)||re(e)&&(e.toString===Or||!G(e.toString))?Dr(e)?V(e.value):JSON.stringify(e,Lr,2):String(e),Lr=(e,t)=>Dr(t)?Lr(e,t.value):qt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,r],o)=>(s[Qs(n,o)+" =>"]=r,s),{})}:Zt(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>Qs(s))}:rt(t)?Qs(t):re(t)&&!D(t)&&!Pr(t)?String(t):t,Qs=(e,t="")=>{var s;return rt(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};let $e;class ei{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=$e,!t&&$e&&(this.index=($e.scopes||($e.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t<s;t++)this.scopes[t].pause();for(t=0,s=this.effects.length;t<s;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t<s;t++)this.scopes[t].resume();for(t=0,s=this.effects.length;t<s;t++)this.effects[t].resume()}}run(t){if(this._active){const s=$e;try{return $e=this,t()}finally{$e=s}}}on(){++this._on===1&&(this.prevScope=$e,$e=this)}off(){this._on>0&&--this._on===0&&($e=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s<n;s++)this.effects[s].stop();for(this.effects.length=0,s=0,n=this.cleanups.length;s<n;s++)this.cleanups[s]();if(this.cleanups.length=0,this.scopes){for(s=0,n=this.scopes.length;s<n;s++)this.scopes[s].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const r=this.parent.scopes.pop();r&&r!==this&&(this.parent.scopes[this.index]=r,r.index=this.index)}this.parent=void 0}}}function ti(){return $e}let ce;const Zs=new WeakSet;class Hr{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,$e&&$e.active&&$e.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,Zs.has(this)&&(Zs.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Vr(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Gn(this),Kr(this);const t=ce,s=Be;ce=this,Be=!0;try{return this.fn()}finally{Ur(this),ce=t,Be=s,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)Nn(t);this.deps=this.depsTail=void 0,Gn(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?Zs.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){cn(this)&&this.run()}get dirty(){return cn(this)}}let jr=0,is,ls;function Vr(e,t=!1){if(e.flags|=8,t){e.next=ls,ls=e;return}e.next=is,is=e}function An(){jr++}function En(){if(--jr>0)return;if(ls){let t=ls;for(ls=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;is;){let t=is;for(is=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Kr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ur(e){let t,s=e.depsTail,n=s;for(;n;){const r=n.prevDep;n.version===-1?(n===s&&(s=r),Nn(n),si(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=r}e.deps=t,e.depsTail=s}function cn(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Br(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Br(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===hs)||(e.globalVersion=hs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!cn(e))))return;e.flags|=2;const t=e.dep,s=ce,n=Be;ce=e,Be=!0;try{Kr(e);const r=e.fn(e._value);(t.version===0||tt(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{ce=s,Be=n,Ur(e),e.flags&=-3}}function Nn(e,t=!1){const{dep:s,prevSub:n,nextSub:r}=e;if(n&&(n.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let o=s.computed.deps;o;o=o.nextDep)Nn(o,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function si(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let Be=!0;const Wr=[];function yt(){Wr.push(Be),Be=!1}function bt(){const e=Wr.pop();Be=e===void 0?!0:e}function Gn(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=ce;ce=void 0;try{t()}finally{ce=s}}}let hs=0;class ni{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Mn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!ce||!Be||ce===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==ce)s=this.activeLink=new ni(ce,this),ce.deps?(s.prevDep=ce.depsTail,ce.depsTail.nextDep=s,ce.depsTail=s):ce.deps=ce.depsTail=s,Gr(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=ce.depsTail,s.nextDep=void 0,ce.depsTail.nextDep=s,ce.depsTail=s,ce.deps===s&&(ce.deps=n)}return s}trigger(t){this.version++,hs++,this.notify(t)}notify(t){An();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{En()}}}function Gr(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Gr(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const an=new WeakMap,Rt=Symbol(""),un=Symbol(""),ps=Symbol("");function we(e,t,s){if(Be&&ce){let n=an.get(e);n||an.set(e,n=new Map);let r=n.get(s);r||(n.set(s,r=new Mn),r.map=n,r.key=s),r.track()}}function pt(e,t,s,n,r,o){const i=an.get(e);if(!i){hs++;return}const l=u=>{u&&u.trigger()};if(An(),t==="clear")i.forEach(l);else{const u=D(e),g=u&&Sn(s);if(u&&s==="length"){const h=Number(n);i.forEach((b,T)=>{(T==="length"||T===ps||!rt(T)&&T>=h)&&l(b)})}else switch((s!==void 0||i.has(void 0))&&l(i.get(s)),g&&l(i.get(ps)),t){case"add":u?g&&l(i.get("length")):(l(i.get(Rt)),qt(e)&&l(i.get(un)));break;case"delete":u||(l(i.get(Rt)),qt(e)&&l(i.get(un)));break;case"set":qt(e)&&l(i.get(Rt));break}}En()}function Ut(e){const t=Z(e);return t===e?t:(we(t,"iterate",ps),He(e)?t:t.map(We))}function Ks(e){return we(e=Z(e),"iterate",ps),e}function Ze(e,t){return _t(e)?Xt(Ft(e)?We(t):t):We(t)}const ri={__proto__:null,[Symbol.iterator](){return en(this,Symbol.iterator,e=>Ze(this,e))},concat(...e){return Ut(this).concat(...e.map(t=>D(t)?Ut(t):t))},entries(){return en(this,"entries",e=>(e[1]=Ze(this,e[1]),e))},every(e,t){return ft(this,"every",e,t,void 0,arguments)},filter(e,t){return ft(this,"filter",e,t,s=>s.map(n=>Ze(this,n)),arguments)},find(e,t){return ft(this,"find",e,t,s=>Ze(this,s),arguments)},findIndex(e,t){return ft(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return ft(this,"findLast",e,t,s=>Ze(this,s),arguments)},findLastIndex(e,t){return ft(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return ft(this,"forEach",e,t,void 0,arguments)},includes(...e){return tn(this,"includes",e)},indexOf(...e){return tn(this,"indexOf",e)},join(e){return Ut(this).join(e)},lastIndexOf(...e){return tn(this,"lastIndexOf",e)},map(e,t){return ft(this,"map",e,t,void 0,arguments)},pop(){return ss(this,"pop")},push(...e){return ss(this,"push",e)},reduce(e,...t){return qn(this,"reduce",e,t)},reduceRight(e,...t){return qn(this,"reduceRight",e,t)},shift(){return ss(this,"shift")},some(e,t){return ft(this,"some",e,t,void 0,arguments)},splice(...e){return ss(this,"splice",e)},toReversed(){return Ut(this).toReversed()},toSorted(e){return Ut(this).toSorted(e)},toSpliced(...e){return Ut(this).toSpliced(...e)},unshift(...e){return ss(this,"unshift",e)},values(){return en(this,"values",e=>Ze(this,e))}};function en(e,t,s){const n=Ks(e),r=n[t]();return n!==e&&!He(e)&&(r._next=r.next,r.next=()=>{const o=r._next();return o.done||(o.value=s(o.value)),o}),r}const oi=Array.prototype;function ft(e,t,s,n,r,o){const i=Ks(e),l=i!==e&&!He(e),u=i[t];if(u!==oi[t]){const b=u.apply(e,o);return l?We(b):b}let g=s;i!==e&&(l?g=function(b,T){return s.call(this,Ze(e,b),T,e)}:s.length>2&&(g=function(b,T){return s.call(this,b,T,e)}));const h=u.call(i,g,n);return l&&r?r(h):h}function qn(e,t,s,n){const r=Ks(e),o=r!==e&&!He(e);let i=s,l=!1;r!==e&&(o?(l=n.length===0,i=function(g,h,b){return l&&(l=!1,g=Ze(e,g)),s.call(this,g,Ze(e,h),b,e)}):s.length>3&&(i=function(g,h,b){return s.call(this,g,h,b,e)}));const u=r[t](i,...n);return l?Ze(e,u):u}function tn(e,t,s){const n=Z(e);we(n,"iterate",ps);const r=n[t](...s);return(r===-1||r===!1)&&In(s[0])?(s[0]=Z(s[0]),n[t](...s)):r}function ss(e,t,s=[]){yt(),An();const n=Z(e)[t].apply(e,s);return En(),bt(),n}const ii=_n("__proto__,__v_isRef,__isVue"),qr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(rt));function li(e){rt(e)||(e=String(e));const t=Z(this);return we(t,"has",e),t.hasOwnProperty(e)}class zr{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const r=this._isReadonly,o=this._isShallow;if(s==="__v_isReactive")return!r;if(s==="__v_isReadonly")return r;if(s==="__v_isShallow")return o;if(s==="__v_raw")return n===(r?o?yi:Qr:o?Yr:Xr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const i=D(t);if(!r){let u;if(i&&(u=ri[s]))return u;if(s==="hasOwnProperty")return li}const l=Reflect.get(t,s,Se(t)?t:n);if((rt(s)?qr.has(s):ii(s))||(r||we(t,"get",s),o))return l;if(Se(l)){const u=i&&Sn(s)?l:l.value;return r&&re(u)?dn(u):u}return re(l)?r?dn(l):Us(l):l}}class Jr extends zr{constructor(t=!1){super(!1,t)}set(t,s,n,r){let o=t[s];const i=D(t)&&Sn(s);if(!this._isShallow){const g=_t(o);if(!He(n)&&!_t(n)&&(o=Z(o),n=Z(n)),!i&&Se(o)&&!Se(n))return g||(o.value=n),!0}const l=i?Number(s)<t.length:ee(t,s),u=Reflect.set(t,s,n,Se(t)?t:r);return t===Z(r)&&(l?tt(n,o)&&pt(t,"set",s,n):pt(t,"add",s,n)),u}deleteProperty(t,s){const n=ee(t,s);t[s];const r=Reflect.deleteProperty(t,s);return r&&n&&pt(t,"delete",s,void 0),r}has(t,s){const n=Reflect.has(t,s);return(!rt(s)||!qr.has(s))&&we(t,"has",s),n}ownKeys(t){return we(t,"iterate",D(t)?"length":Rt),Reflect.ownKeys(t)}}class ci extends zr{constructor(t=!1){super(!0,t)}set(t,s){return!0}deleteProperty(t,s){return!0}}const ai=new Jr,ui=new ci,fi=new Jr(!0);const fn=e=>e,As=e=>Reflect.getPrototypeOf(e);function di(e,t,s){return function(...n){const r=this.__v_raw,o=Z(r),i=qt(o),l=e==="entries"||e===Symbol.iterator&&i,u=e==="keys"&&i,g=r[e](...n),h=s?fn:t?Xt:We;return!t&&we(o,"iterate",u?un:Rt),xe(Object.create(g),{next(){const{value:b,done:T}=g.next();return T?{value:b,done:T}:{value:l?[h(b[0]),h(b[1])]:h(b),done:T}}})}}function Es(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function hi(e,t){const s={get(r){const o=this.__v_raw,i=Z(o),l=Z(r);e||(tt(r,l)&&we(i,"get",r),we(i,"get",l));const{has:u}=As(i),g=t?fn:e?Xt:We;if(u.call(i,r))return g(o.get(r));if(u.call(i,l))return g(o.get(l));o!==i&&o.get(r)},get size(){const r=this.__v_raw;return!e&&we(Z(r),"iterate",Rt),r.size},has(r){const o=this.__v_raw,i=Z(o),l=Z(r);return e||(tt(r,l)&&we(i,"has",r),we(i,"has",l)),r===l?o.has(r):o.has(r)||o.has(l)},forEach(r,o){const i=this,l=i.__v_raw,u=Z(l),g=t?fn:e?Xt:We;return!e&&we(u,"iterate",Rt),l.forEach((h,b)=>r.call(o,g(h),g(b),i))}};return xe(s,e?{add:Es("add"),set:Es("set"),delete:Es("delete"),clear:Es("clear")}:{add(r){const o=Z(this),i=As(o),l=Z(r),u=!t&&!He(r)&&!_t(r)?l:r;return i.has.call(o,u)||tt(r,u)&&i.has.call(o,r)||tt(l,u)&&i.has.call(o,l)||(o.add(u),pt(o,"add",u,u)),this},set(r,o){!t&&!He(o)&&!_t(o)&&(o=Z(o));const i=Z(this),{has:l,get:u}=As(i);let g=l.call(i,r);g||(r=Z(r),g=l.call(i,r));const h=u.call(i,r);return i.set(r,o),g?tt(o,h)&&pt(i,"set",r,o):pt(i,"add",r,o),this},delete(r){const o=Z(this),{has:i,get:l}=As(o);let u=i.call(o,r);u||(r=Z(r),u=i.call(o,r)),l&&l.call(o,r);const g=o.delete(r);return u&&pt(o,"delete",r,void 0),g},clear(){const r=Z(this),o=r.size!==0,i=r.clear();return o&&pt(r,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(r=>{s[r]=di(r,e,t)}),s}function Cn(e,t){const s=hi(e,t);return(n,r,o)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?n:Reflect.get(ee(s,r)&&r in n?s:n,r,o)}const pi={get:Cn(!1,!1)},gi={get:Cn(!1,!0)},mi={get:Cn(!0,!1)};const Xr=new WeakMap,Yr=new WeakMap,Qr=new WeakMap,yi=new WeakMap;function bi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function _i(e){return e.__v_skip||!Object.isExtensible(e)?0:bi(Bo(e))}function Us(e){return _t(e)?e:Tn(e,!1,ai,pi,Xr)}function vi(e){return Tn(e,!1,fi,gi,Yr)}function dn(e){return Tn(e,!0,ui,mi,Qr)}function Tn(e,t,s,n,r){if(!re(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=_i(e);if(o===0)return e;const i=r.get(e);if(i)return i;const l=new Proxy(e,o===2?n:s);return r.set(e,l),l}function Ft(e){return _t(e)?Ft(e.__v_raw):!!(e&&e.__v_isReactive)}function _t(e){return!!(e&&e.__v_isReadonly)}function He(e){return!!(e&&e.__v_isShallow)}function In(e){return e?!!e.__v_raw:!1}function Z(e){const t=e&&e.__v_raw;return t?Z(t):e}function wi(e){return!ee(e,"__v_skip")&&Object.isExtensible(e)&&Rr(e,"__v_skip",!0),e}const We=e=>re(e)?Us(e):e,Xt=e=>re(e)?dn(e):e;function Se(e){return e?e.__v_isRef===!0:!1}function zn(e){return Si(e,!1)}function Si(e,t){return Se(e)?e:new xi(e,t)}class xi{constructor(t,s){this.dep=new Mn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:Z(t),this._value=s?t:We(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||He(t)||_t(t);t=n?t:Z(t),tt(t,s)&&(this._rawValue=t,this._value=n?t:We(t),this.dep.trigger())}}function Ai(e){return Se(e)?e.value:e}const Ei={get:(e,t,s)=>t==="__v_raw"?e:Ai(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const r=e[t];return Se(r)&&!Se(s)?(r.value=s,!0):Reflect.set(e,t,s,n)}};function Zr(e){return Ft(e)?e:new Proxy(e,Ei)}class Ni{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new Mn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=hs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&ce!==this)return Vr(this,!0),!0}get value(){const t=this.dep.track();return Br(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Mi(e,t,s=!1){let n,r;return G(e)?n=e:(n=e.get,r=e.set),new Ni(n,r,s)}const Ns={},Os=new WeakMap;let kt;function Ci(e,t=!1,s=kt){if(s){let n=Os.get(s);n||Os.set(s,n=[]),n.push(e)}}function Ti(e,t,s=ie){const{immediate:n,deep:r,once:o,scheduler:i,augmentJob:l,call:u}=s,g=k=>r?k:He(k)||r===!1||r===0?gt(k,1):gt(k);let h,b,T,I,Y=!1,H=!1;if(Se(e)?(b=()=>e.value,Y=He(e)):Ft(e)?(b=()=>g(e),Y=!0):D(e)?(H=!0,Y=e.some(k=>Ft(k)||He(k)),b=()=>e.map(k=>{if(Se(k))return k.value;if(Ft(k))return g(k);if(G(k))return u?u(k,2):k()})):G(e)?t?b=u?()=>u(e,2):e:b=()=>{if(T){yt();try{T()}finally{bt()}}const k=kt;kt=h;try{return u?u(e,3,[I]):e(I)}finally{kt=k}}:b=st,t&&r){const k=b,fe=r===!0?1/0:r;b=()=>gt(k(),fe)}const ue=ti(),te=()=>{h.stop(),ue&&ue.active&&wn(ue.effects,h)};if(o&&t){const k=t;t=(...fe)=>{k(...fe),te()}}let K=H?new Array(e.length).fill(Ns):Ns;const se=k=>{if(!(!(h.flags&1)||!h.dirty&&!k))if(t){const fe=h.run();if(r||Y||(H?fe.some((Ge,Ce)=>tt(Ge,K[Ce])):tt(fe,K))){T&&T();const Ge=kt;kt=h;try{const Ce=[fe,K===Ns?void 0:H&&K[0]===Ns?[]:K,I];K=fe,u?u(t,3,Ce):t(...Ce)}finally{kt=Ge}}}else h.run()};return l&&l(se),h=new Hr(b),h.scheduler=i?()=>i(se,!1):se,I=k=>Ci(k,!1,h),T=h.onStop=()=>{const k=Os.get(h);if(k){if(u)u(k,4);else for(const fe of k)fe();Os.delete(h)}},t?n?se(!0):K=h.run():i?i(se.bind(null,!0),!0):h.run(),te.pause=h.pause.bind(h),te.resume=h.resume.bind(h),te.stop=te,te}function gt(e,t=1/0,s){if(t<=0||!re(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Se(e))gt(e.value,t,s);else if(D(e))for(let n=0;n<e.length;n++)gt(e[n],t,s);else if(Zt(e)||qt(e))e.forEach(n=>{gt(n,t,s)});else if(Pr(e)){for(const n in e)gt(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&gt(e[n],t,s)}return e}function vs(e,t,s,n){try{return n?e(...n):e()}catch(r){Bs(r,t,s)}}function ot(e,t,s,n){if(G(e)){const r=vs(e,t,s,n);return r&&$r(r)&&r.catch(o=>{Bs(o,t,s)}),r}if(D(e)){const r=[];for(let o=0;o<e.length;o++)r.push(ot(e[o],t,s,n));return r}}function Bs(e,t,s,n=!0){const r=t?t.vnode:null,{errorHandler:o,throwUnhandledErrorInProduction:i}=t&&t.appContext.config||ie;if(t){let l=t.parent;const u=t.proxy,g=`https://vuejs.org/error-reference/#runtime-${s}`;for(;l;){const h=l.ec;if(h){for(let b=0;b<h.length;b++)if(h[b](e,u,g)===!1)return}l=l.parent}if(o){yt(),vs(o,null,10,[e,u,g]),bt();return}}Ii(e,s,r,n,i)}function Ii(e,t,s,n=!0,r=!1){if(r)throw e;console.error(e)}const Ne=[];let Ye=-1;const zt=[];let xt=null,Wt=0;const eo=Promise.resolve();let Ps=null;function to(e){const t=Ps||eo;return e?t.then(this?e.bind(this):e):t}function $i(e){let t=Ye+1,s=Ne.length;for(;t<s;){const n=t+s>>>1,r=Ne[n],o=gs(r);o<e||o===e&&r.flags&2?t=n+1:s=n}return t}function $n(e){if(!(e.flags&1)){const t=gs(e),s=Ne[Ne.length-1];!s||!(e.flags&2)&&t>=gs(s)?Ne.push(e):Ne.splice($i(t),0,e),e.flags|=1,so()}}function so(){Ps||(Ps=eo.then(ro))}function Oi(e){D(e)?zt.push(...e):xt&&e.id===-1?xt.splice(Wt+1,0,e):e.flags&1||(zt.push(e),e.flags|=1),so()}function Jn(e,t,s=Ye+1){for(;s<Ne.length;s++){const n=Ne[s];if(n&&n.flags&2){if(e&&n.id!==e.uid)continue;Ne.splice(s,1),s--,n.flags&4&&(n.flags&=-2),n(),n.flags&4||(n.flags&=-2)}}}function no(e){if(zt.length){const t=[...new Set(zt)].sort((s,n)=>gs(s)-gs(n));if(zt.length=0,xt){xt.push(...t);return}for(xt=t,Wt=0;Wt<xt.length;Wt++){const s=xt[Wt];s.flags&4&&(s.flags&=-2),s.flags&8||s(),s.flags&=-2}xt=null,Wt=0}}const gs=e=>e.id==null?e.flags&2?-1:1/0:e.id;function ro(e){try{for(Ye=0;Ye<Ne.length;Ye++){const t=Ne[Ye];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),vs(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Ye<Ne.length;Ye++){const t=Ne[Ye];t&&(t.flags&=-2)}Ye=-1,Ne.length=0,no(),Ps=null,(Ne.length||zt.length)&&ro()}}let Le=null,oo=null;function ks(e){const t=Le;return Le=e,oo=e&&e.type.__scopeId||null,t}function Pi(e,t=Le,s){if(!t||e._n)return e;const n=(...r)=>{n._d&&ir(-1);const o=ks(t);let i;try{i=e(...r)}finally{ks(o),n._d&&ir(1)}return i};return n._n=!0,n._c=!0,n._d=!0,n}function Bt(e,t){if(Le===null)return e;const s=zs(Le),n=e.dirs||(e.dirs=[]);for(let r=0;r<t.length;r++){let[o,i,l,u=ie]=t[r];o&&(G(o)&&(o={mounted:o,updated:o}),o.deep&&gt(i),n.push({dir:o,instance:s,value:i,oldValue:void 0,arg:l,modifiers:u}))}return e}function Ot(e,t,s,n){const r=e.dirs,o=t&&t.dirs;for(let i=0;i<r.length;i++){const l=r[i];o&&(l.oldValue=o[i].value);let u=l.dir[n];u&&(yt(),ot(u,s,8,[e.el,l,e,t]),bt())}}function ki(e,t){if(Me){let s=Me.provides;const n=Me.parent&&Me.parent.provides;n===s&&(s=Me.provides=Object.create(n)),s[e]=t}}function Cs(e,t,s=!1){const n=kl();if(n||Jt){let r=Jt?Jt._context.provides:n?n.parent==null||n.ce?n.vnode.appContext&&n.vnode.appContext.provides:n.parent.provides:void 0;if(r&&e in r)return r[e];if(arguments.length>1)return s&&G(t)?t.call(n&&n.proxy):t}}const Ri=Symbol.for("v-scx"),Fi=()=>Cs(Ri);function At(e,t,s){return io(e,t,s)}function io(e,t,s=ie){const{immediate:n,deep:r,flush:o,once:i}=s,l=xe({},s),u=t&&n||!t&&o!=="post";let g;if(ys){if(o==="sync"){const I=Fi();g=I.__watcherHandles||(I.__watcherHandles=[])}else if(!u){const I=()=>{};return I.stop=st,I.resume=st,I.pause=st,I}}const h=Me;l.call=(I,Y,H)=>ot(I,h,Y,H);let b=!1;o==="post"?l.scheduler=I=>{Ie(I,h&&h.suspense)}:o!=="sync"&&(b=!0,l.scheduler=(I,Y)=>{Y?I():$n(I)}),l.augmentJob=I=>{t&&(I.flags|=4),b&&(I.flags|=2,h&&(I.id=h.uid,I.i=h))};const T=Ti(e,t,l);return ys&&(g?g.push(T):u&&T()),T}function Di(e,t,s){const n=this.proxy,r=ge(e)?e.includes(".")?lo(n,e):()=>n[e]:e.bind(n,n);let o;G(t)?o=t:(o=t.handler,s=t);const i=ws(this),l=io(r,o.bind(n),s);return i(),l}function lo(e,t){const s=t.split(".");return()=>{let n=e;for(let r=0;r<s.length&&n;r++)n=n[s[r]];return n}}const Li=Symbol("_vte"),Hi=e=>e.__isTeleport,ji=Symbol("_leaveCb");function On(e,t){e.shapeFlag&6&&e.component?(e.transition=t,On(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function co(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Xn(e,t){let s;return!!((s=Object.getOwnPropertyDescriptor(e,t))&&!s.configurable)}const Rs=new WeakMap;function cs(e,t,s,n,r=!1){if(D(e)){e.forEach((H,ue)=>cs(H,t&&(D(t)?t[ue]:t),s,n,r));return}if(as(n)&&!r){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&cs(e,t,s,n.component.subTree);return}const o=n.shapeFlag&4?zs(n.component):n.el,i=r?null:o,{i:l,r:u}=e,g=t&&t.r,h=l.refs===ie?l.refs={}:l.refs,b=l.setupState,T=Z(b),I=b===ie?Ir:H=>Xn(h,H)?!1:ee(T,H),Y=(H,ue)=>!(ue&&Xn(h,ue));if(g!=null&&g!==u){if(Yn(t),ge(g))h[g]=null,I(g)&&(b[g]=null);else if(Se(g)){const H=t;Y(g,H.k)&&(g.value=null),H.k&&(h[H.k]=null)}}if(G(u))vs(u,l,12,[i,h]);else{const H=ge(u),ue=Se(u);if(H||ue){const te=()=>{if(e.f){const K=H?I(u)?b[u]:h[u]:Y()||!e.k?u.value:h[e.k];if(r)D(K)&&wn(K,o);else if(D(K))K.includes(o)||K.push(o);else if(H)h[u]=[o],I(u)&&(b[u]=h[u]);else{const se=[o];Y(u,e.k)&&(u.value=se),e.k&&(h[e.k]=se)}}else H?(h[u]=i,I(u)&&(b[u]=i)):ue&&(Y(u,e.k)&&(u.value=i),e.k&&(h[e.k]=i))};if(i){const K=()=>{te(),Rs.delete(e)};K.id=-1,Rs.set(e,K),Ie(K,s)}else Yn(e),te()}}}function Yn(e){const t=Rs.get(e);t&&(t.flags|=8,Rs.delete(e))}Vs().requestIdleCallback;Vs().cancelIdleCallback;const as=e=>!!e.type.__asyncLoader,ao=e=>e.type.__isKeepAlive;function Vi(e,t){uo(e,"a",t)}function Ki(e,t){uo(e,"da",t)}function uo(e,t,s=Me){const n=e.__wdc||(e.__wdc=()=>{let r=s;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Ws(t,n,s),s){let r=s.parent;for(;r&&r.parent;)ao(r.parent.vnode)&&Ui(n,t,s,r),r=r.parent}}function Ui(e,t,s,n){const r=Ws(t,e,n,!0);po(()=>{wn(n[t],r)},s)}function Ws(e,t,s=Me,n=!1){if(s){const r=s[e]||(s[e]=[]),o=t.__weh||(t.__weh=(...i)=>{yt();const l=ws(s),u=ot(t,s,e,i);return l(),bt(),u});return n?r.unshift(o):r.push(o),o}}const vt=e=>(t,s=Me)=>{(!ys||e==="sp")&&Ws(e,(...n)=>t(...n),s)},Bi=vt("bm"),fo=vt("m"),Wi=vt("bu"),Gi=vt("u"),ho=vt("bum"),po=vt("um"),qi=vt("sp"),zi=vt("rtg"),Ji=vt("rtc");function Xi(e,t=Me){Ws("ec",e,t)}const Yi=Symbol.for("v-ndc");function De(e,t,s,n){let r;const o=s,i=D(e);if(i||ge(e)){const l=i&&Ft(e);let u=!1,g=!1;l&&(u=!He(e),g=_t(e),e=Ks(e)),r=new Array(e.length);for(let h=0,b=e.length;h<b;h++)r[h]=t(u?g?Xt(We(e[h])):We(e[h]):e[h],h,void 0,o)}else if(typeof e=="number"){r=new Array(e);for(let l=0;l<e;l++)r[l]=t(l+1,l,void 0,o)}else if(re(e))if(e[Symbol.iterator])r=Array.from(e,(l,u)=>t(l,u,void 0,o));else{const l=Object.keys(e);r=new Array(l.length);for(let u=0,g=l.length;u<g;u++){const h=l[u];r[u]=t(e[h],h,u,o)}}else r=[];return r}const hn=e=>e?Ro(e)?zs(e):hn(e.parent):null,us=xe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>hn(e.parent),$root:e=>hn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>mo(e),$forceUpdate:e=>e.f||(e.f=()=>{$n(e.update)}),$nextTick:e=>e.n||(e.n=to.bind(e.proxy)),$watch:e=>Di.bind(e)}),sn=(e,t)=>e!==ie&&!e.__isScriptSetup&&ee(e,t),Qi={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:r,props:o,accessCache:i,type:l,appContext:u}=e;if(t[0]!=="$"){const T=i[t];if(T!==void 0)switch(T){case 1:return n[t];case 2:return r[t];case 4:return s[t];case 3:return o[t]}else{if(sn(n,t))return i[t]=1,n[t];if(r!==ie&&ee(r,t))return i[t]=2,r[t];if(ee(o,t))return i[t]=3,o[t];if(s!==ie&&ee(s,t))return i[t]=4,s[t];pn&&(i[t]=0)}}const g=us[t];let h,b;if(g)return t==="$attrs"&&we(e.attrs,"get",""),g(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(s!==ie&&ee(s,t))return i[t]=4,s[t];if(b=u.config.globalProperties,ee(b,t))return b[t]},set({_:e},t,s){const{data:n,setupState:r,ctx:o}=e;return sn(r,t)?(r[t]=s,!0):n!==ie&&ee(n,t)?(n[t]=s,!0):ee(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:r,props:o,type:i}},l){let u;return!!(s[l]||e!==ie&&l[0]!=="$"&&ee(e,l)||sn(t,l)||ee(o,l)||ee(n,l)||ee(us,l)||ee(r.config.globalProperties,l)||(u=i.__cssModules)&&u[l])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:ee(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function Qn(e){return D(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let pn=!0;function Zi(e){const t=mo(e),s=e.proxy,n=e.ctx;pn=!1,t.beforeCreate&&Zn(t.beforeCreate,e,"bc");const{data:r,computed:o,methods:i,watch:l,provide:u,inject:g,created:h,beforeMount:b,mounted:T,beforeUpdate:I,updated:Y,activated:H,deactivated:ue,beforeDestroy:te,beforeUnmount:K,destroyed:se,unmounted:k,render:fe,renderTracked:Ge,renderTriggered:Ce,errorCaptured:qe,serverPrefetch:Dt,expose:ze,inheritAttrs:it,components:Lt,directives:Ht,filters:Ct}=t;if(g&&el(g,n,null),i)for(const oe in i){const X=i[oe];G(X)&&(n[oe]=X.bind(s))}if(r){const oe=r.call(s,s);re(oe)&&(e.data=Us(oe))}if(pn=!0,o)for(const oe in o){const X=o[oe],lt=G(X)?X.bind(s,s):G(X.get)?X.get.bind(s,s):st,ct=!G(X)&&G(X.set)?X.set.bind(s):st,Je=Ee({get:lt,set:ct});Object.defineProperty(n,oe,{enumerable:!0,configurable:!0,get:()=>Je.value,set:ke=>Je.value=ke})}if(l)for(const oe in l)go(l[oe],n,s,oe);if(u){const oe=G(u)?u.call(s):u;Reflect.ownKeys(oe).forEach(X=>{ki(X,oe[X])})}h&&Zn(h,e,"c");function ye(oe,X){D(X)?X.forEach(lt=>oe(lt.bind(s))):X&&oe(X.bind(s))}if(ye(Bi,b),ye(fo,T),ye(Wi,I),ye(Gi,Y),ye(Vi,H),ye(Ki,ue),ye(Xi,qe),ye(Ji,Ge),ye(zi,Ce),ye(ho,K),ye(po,k),ye(qi,Dt),D(ze))if(ze.length){const oe=e.exposed||(e.exposed={});ze.forEach(X=>{Object.defineProperty(oe,X,{get:()=>s[X],set:lt=>s[X]=lt,enumerable:!0})})}else e.exposed||(e.exposed={});fe&&e.render===st&&(e.render=fe),it!=null&&(e.inheritAttrs=it),Lt&&(e.components=Lt),Ht&&(e.directives=Ht),Dt&&co(e)}function el(e,t,s=st){D(e)&&(e=gn(e));for(const n in e){const r=e[n];let o;re(r)?"default"in r?o=Cs(r.from||n,r.default,!0):o=Cs(r.from||n):o=Cs(r),Se(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[n]=o}}function Zn(e,t,s){ot(D(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function go(e,t,s,n){let r=n.includes(".")?lo(s,n):()=>s[n];if(ge(e)){const o=t[e];G(o)&&At(r,o)}else if(G(e))At(r,e.bind(s));else if(re(e))if(D(e))e.forEach(o=>go(o,t,s,n));else{const o=G(e.handler)?e.handler.bind(s):t[e.handler];G(o)&&At(r,o,e)}}function mo(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:r,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let u;return l?u=l:!r.length&&!s&&!n?u=t:(u={},r.length&&r.forEach(g=>Fs(u,g,i,!0)),Fs(u,t,i)),re(t)&&o.set(t,u),u}function Fs(e,t,s,n=!1){const{mixins:r,extends:o}=t;o&&Fs(e,o,s,!0),r&&r.forEach(i=>Fs(e,i,s,!0));for(const i in t)if(!(n&&i==="expose")){const l=tl[i]||s&&s[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const tl={data:er,props:tr,emits:tr,methods:rs,computed:rs,beforeCreate:Ae,created:Ae,beforeMount:Ae,mounted:Ae,beforeUpdate:Ae,updated:Ae,beforeDestroy:Ae,beforeUnmount:Ae,destroyed:Ae,unmounted:Ae,activated:Ae,deactivated:Ae,errorCaptured:Ae,serverPrefetch:Ae,components:rs,directives:rs,watch:nl,provide:er,inject:sl};function er(e,t){return t?e?function(){return xe(G(e)?e.call(this,this):e,G(t)?t.call(this,this):t)}:t:e}function sl(e,t){return rs(gn(e),gn(t))}function gn(e){if(D(e)){const t={};for(let s=0;s<e.length;s++)t[e[s]]=e[s];return t}return e}function Ae(e,t){return e?[...new Set([].concat(e,t))]:t}function rs(e,t){return e?xe(Object.create(null),e,t):t}function tr(e,t){return e?D(e)&&D(t)?[...new Set([...e,...t])]:xe(Object.create(null),Qn(e),Qn(t??{})):t}function nl(e,t){if(!e)return t;if(!t)return e;const s=xe(Object.create(null),e);for(const n in t)s[n]=Ae(e[n],t[n]);return s}function yo(){return{app:null,config:{isNativeTag:Ir,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let rl=0;function ol(e,t){return function(n,r=null){G(n)||(n=xe({},n)),r!=null&&!re(r)&&(r=null);const o=yo(),i=new WeakSet,l=[];let u=!1;const g=o.app={_uid:rl++,_component:n,_props:r,_container:null,_context:o,_instance:null,version:jl,get config(){return o.config},set config(h){},use(h,...b){return i.has(h)||(h&&G(h.install)?(i.add(h),h.install(g,...b)):G(h)&&(i.add(h),h(g,...b))),g},mixin(h){return o.mixins.includes(h)||o.mixins.push(h),g},component(h,b){return b?(o.components[h]=b,g):o.components[h]},directive(h,b){return b?(o.directives[h]=b,g):o.directives[h]},mount(h,b,T){if(!u){const I=g._ceVNode||nt(n,r);return I.appContext=o,T===!0?T="svg":T===!1&&(T=void 0),e(I,h,T),u=!0,g._container=h,h.__vue_app__=g,zs(I.component)}},onUnmount(h){l.push(h)},unmount(){u&&(ot(l,g._instance,16),e(null,g._container),delete g._container.__vue_app__)},provide(h,b){return o.provides[h]=b,g},runWithContext(h){const b=Jt;Jt=g;try{return h()}finally{Jt=b}}};return g}}let Jt=null;const il=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ue(t)}Modifiers`]||e[`${Mt(t)}Modifiers`];function ll(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||ie;let r=s;const o=t.startsWith("update:"),i=o&&il(n,t.slice(7));i&&(i.trim&&(r=s.map(h=>ge(h)?h.trim():h)),i.number&&(r=s.map(js)));let l,u=n[l=Ys(t)]||n[l=Ys(Ue(t))];!u&&o&&(u=n[l=Ys(Mt(t))]),u&&ot(u,e,6,r);const g=n[l+"Once"];if(g){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,ot(g,e,6,r)}}const cl=new WeakMap;function bo(e,t,s=!1){const n=s?cl:t.emitsCache,r=n.get(e);if(r!==void 0)return r;const o=e.emits;let i={},l=!1;if(!G(e)){const u=g=>{const h=bo(g,t,!0);h&&(l=!0,xe(i,h))};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}return!o&&!l?(re(e)&&n.set(e,null),null):(D(o)?o.forEach(u=>i[u]=null):xe(i,o),re(e)&&n.set(e,i),i)}function Gs(e,t){return!e||!Ls(t)?!1:(t=t.slice(2).replace(/Once$/,""),ee(e,t[0].toLowerCase()+t.slice(1))||ee(e,Mt(t))||ee(e,t))}function sr(e){const{type:t,vnode:s,proxy:n,withProxy:r,propsOptions:[o],slots:i,attrs:l,emit:u,render:g,renderCache:h,props:b,data:T,setupState:I,ctx:Y,inheritAttrs:H}=e,ue=ks(e);let te,K;try{if(s.shapeFlag&4){const k=r||n,fe=k;te=et(g.call(fe,k,h,b,I,T,Y)),K=l}else{const k=t;te=et(k.length>1?k(b,{attrs:l,slots:i,emit:u}):k(b,null)),K=t.props?l:al(l)}}catch(k){fs.length=0,Bs(k,e,1),te=nt(Nt)}let se=te;if(K&&H!==!1){const k=Object.keys(K),{shapeFlag:fe}=se;k.length&&fe&7&&(o&&k.some(vn)&&(K=ul(K,o)),se=Yt(se,K,!1,!0))}return s.dirs&&(se=Yt(se,null,!1,!0),se.dirs=se.dirs?se.dirs.concat(s.dirs):s.dirs),s.transition&&On(se,s.transition),te=se,ks(ue),te}const al=e=>{let t;for(const s in e)(s==="class"||s==="style"||Ls(s))&&((t||(t={}))[s]=e[s]);return t},ul=(e,t)=>{const s={};for(const n in e)(!vn(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function fl(e,t,s){const{props:n,children:r,component:o}=e,{props:i,children:l,patchFlag:u}=t,g=o.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&u>=0){if(u&1024)return!0;if(u&16)return n?nr(n,i,g):!!i;if(u&8){const h=t.dynamicProps;for(let b=0;b<h.length;b++){const T=h[b];if(_o(i,n,T)&&!Gs(g,T))return!0}}}else return(r||l)&&(!l||!l.$stable)?!0:n===i?!1:n?i?nr(n,i,g):!0:!!i;return!1}function nr(e,t,s){const n=Object.keys(t);if(n.length!==Object.keys(e).length)return!0;for(let r=0;r<n.length;r++){const o=n[r];if(_o(t,e,o)&&!Gs(s,o))return!0}return!1}function _o(e,t,s){const n=e[s],r=t[s];return s==="style"&&re(n)&&re(r)?!es(n,r):n!==r}function dl({vnode:e,parent:t},s){for(;t;){const n=t.subTree;if(n.suspense&&n.suspense.activeBranch===e&&(n.el=e.el),n===e)(e=t.vnode).el=s,t=t.parent;else break}}const vo={},wo=()=>Object.create(vo),So=e=>Object.getPrototypeOf(e)===vo;function hl(e,t,s,n=!1){const r={},o=wo();e.propsDefaults=Object.create(null),xo(e,t,r,o);for(const i in e.propsOptions[0])i in r||(r[i]=void 0);s?e.props=n?r:vi(r):e.type.props?e.props=r:e.props=o,e.attrs=o}function pl(e,t,s,n){const{props:r,attrs:o,vnode:{patchFlag:i}}=e,l=Z(r),[u]=e.propsOptions;let g=!1;if((n||i>0)&&!(i&16)){if(i&8){const h=e.vnode.dynamicProps;for(let b=0;b<h.length;b++){let T=h[b];if(Gs(e.emitsOptions,T))continue;const I=t[T];if(u)if(ee(o,T))I!==o[T]&&(o[T]=I,g=!0);else{const Y=Ue(T);r[Y]=mn(u,l,Y,I,e,!1)}else I!==o[T]&&(o[T]=I,g=!0)}}}else{xo(e,t,r,o)&&(g=!0);let h;for(const b in l)(!t||!ee(t,b)&&((h=Mt(b))===b||!ee(t,h)))&&(u?s&&(s[b]!==void 0||s[h]!==void 0)&&(r[b]=mn(u,l,b,void 0,e,!0)):delete r[b]);if(o!==l)for(const b in o)(!t||!ee(t,b))&&(delete o[b],g=!0)}g&&pt(e.attrs,"set","")}function xo(e,t,s,n){const[r,o]=e.propsOptions;let i=!1,l;if(t)for(let u in t){if(os(u))continue;const g=t[u];let h;r&&ee(r,h=Ue(u))?!o||!o.includes(h)?s[h]=g:(l||(l={}))[h]=g:Gs(e.emitsOptions,u)||(!(u in n)||g!==n[u])&&(n[u]=g,i=!0)}if(o){const u=Z(s),g=l||ie;for(let h=0;h<o.length;h++){const b=o[h];s[b]=mn(r,u,b,g[b],e,!ee(g,b))}}return i}function mn(e,t,s,n,r,o){const i=e[s];if(i!=null){const l=ee(i,"default");if(l&&n===void 0){const u=i.default;if(i.type!==Function&&!i.skipFactory&&G(u)){const{propsDefaults:g}=r;if(s in g)n=g[s];else{const h=ws(r);n=g[s]=u.call(null,t),h()}}else n=u;r.ce&&r.ce._setProp(s,n)}i[0]&&(o&&!l?n=!1:i[1]&&(n===""||n===Mt(s))&&(n=!0))}return n}const gl=new WeakMap;function Ao(e,t,s=!1){const n=s?gl:t.propsCache,r=n.get(e);if(r)return r;const o=e.props,i={},l=[];let u=!1;if(!G(e)){const h=b=>{u=!0;const[T,I]=Ao(b,t,!0);xe(i,T),I&&l.push(...I)};!s&&t.mixins.length&&t.mixins.forEach(h),e.extends&&h(e.extends),e.mixins&&e.mixins.forEach(h)}if(!o&&!u)return re(e)&&n.set(e,Gt),Gt;if(D(o))for(let h=0;h<o.length;h++){const b=Ue(o[h]);rr(b)&&(i[b]=ie)}else if(o)for(const h in o){const b=Ue(h);if(rr(b)){const T=o[h],I=i[b]=D(T)||G(T)?{type:T}:xe({},T),Y=I.type;let H=!1,ue=!0;if(D(Y))for(let te=0;te<Y.length;++te){const K=Y[te],se=G(K)&&K.name;if(se==="Boolean"){H=!0;break}else se==="String"&&(ue=!1)}else H=G(Y)&&Y.name==="Boolean";I[0]=H,I[1]=ue,(H||ee(I,"default"))&&l.push(b)}}const g=[i,l];return re(e)&&n.set(e,g),g}function rr(e){return e[0]!=="$"&&!os(e)}const Pn=e=>e==="_"||e==="_ctx"||e==="$stable",kn=e=>D(e)?e.map(et):[et(e)],ml=(e,t,s)=>{if(t._n)return t;const n=Pi((...r)=>kn(t(...r)),s);return n._c=!1,n},Eo=(e,t,s)=>{const n=e._ctx;for(const r in e){if(Pn(r))continue;const o=e[r];if(G(o))t[r]=ml(r,o,n);else if(o!=null){const i=kn(o);t[r]=()=>i}}},No=(e,t)=>{const s=kn(t);e.slots.default=()=>s},Mo=(e,t,s)=>{for(const n in t)(s||!Pn(n))&&(e[n]=t[n])},yl=(e,t,s)=>{const n=e.slots=wo();if(e.vnode.shapeFlag&32){const r=t._;r?(Mo(n,t,s),s&&Rr(n,"_",r,!0)):Eo(t,n)}else t&&No(e,t)},bl=(e,t,s)=>{const{vnode:n,slots:r}=e;let o=!0,i=ie;if(n.shapeFlag&32){const l=t._;l?s&&l===1?o=!1:Mo(r,t,s):(o=!t.$stable,Eo(t,r)),i=t}else t&&(No(e,t),i={default:1});if(o)for(const l in r)!Pn(l)&&i[l]==null&&delete r[l]},Ie=xl;function _l(e){return vl(e)}function vl(e,t){const s=Vs();s.__VUE__=!0;const{insert:n,remove:r,patchProp:o,createElement:i,createText:l,createComment:u,setText:g,setElementText:h,parentNode:b,nextSibling:T,setScopeId:I=st,insertStaticContent:Y}=e,H=(a,d,m,x=null,w=null,_=null,N=void 0,A=null,E=!!d.dynamicChildren)=>{if(a===d)return;a&&!ns(a,d)&&(x=jt(a),ke(a,w,_,!0),a=null),d.patchFlag===-2&&(E=!1,d.dynamicChildren=null);const{type:S,ref:O,shapeFlag:M}=d;switch(S){case qs:ue(a,d,m,x);break;case Nt:te(a,d,m,x);break;case Ts:a==null&&K(d,m,x,N);break;case pe:Lt(a,d,m,x,w,_,N,A,E);break;default:M&1?fe(a,d,m,x,w,_,N,A,E):M&6?Ht(a,d,m,x,w,_,N,A,E):(M&64||M&128)&&S.process(a,d,m,x,w,_,N,A,E,de)}O!=null&&w?cs(O,a&&a.ref,_,d||a,!d):O==null&&a&&a.ref!=null&&cs(a.ref,null,_,a,!0)},ue=(a,d,m,x)=>{if(a==null)n(d.el=l(d.children),m,x);else{const w=d.el=a.el;d.children!==a.children&&g(w,d.children)}},te=(a,d,m,x)=>{a==null?n(d.el=u(d.children||""),m,x):d.el=a.el},K=(a,d,m,x)=>{[a.el,a.anchor]=Y(a.children,d,m,x,a.el,a.anchor)},se=({el:a,anchor:d},m,x)=>{let w;for(;a&&a!==d;)w=T(a),n(a,m,x),a=w;n(d,m,x)},k=({el:a,anchor:d})=>{let m;for(;a&&a!==d;)m=T(a),r(a),a=m;r(d)},fe=(a,d,m,x,w,_,N,A,E)=>{if(d.type==="svg"?N="svg":d.type==="math"&&(N="mathml"),a==null)Ge(d,m,x,w,_,N,A,E);else{const S=a.el&&a.el._isVueCE?a.el:null;try{S&&S._beginPatch(),Dt(a,d,w,_,N,A,E)}finally{S&&S._endPatch()}}},Ge=(a,d,m,x,w,_,N,A)=>{let E,S;const{props:O,shapeFlag:M,transition:$,dirs:R}=a;if(E=a.el=i(a.type,_,O&&O.is,O),M&8?h(E,a.children):M&16&&qe(a.children,E,null,x,w,nn(a,_),N,A),R&&Ot(a,null,x,"created"),Ce(E,a,a.scopeId,N,x),O){for(const Q in O)Q!=="value"&&!os(Q)&&o(E,Q,null,O[Q],_,x);"value"in O&&o(E,"value",null,O.value,_),(S=O.onVnodeBeforeMount)&&Xe(S,x,a)}R&&Ot(a,null,x,"beforeMount");const q=wl(w,$);q&&$.beforeEnter(E),n(E,d,m),((S=O&&O.onVnodeMounted)||q||R)&&Ie(()=>{S&&Xe(S,x,a),q&&$.enter(E),R&&Ot(a,null,x,"mounted")},w)},Ce=(a,d,m,x,w)=>{if(m&&I(a,m),x)for(let _=0;_<x.length;_++)I(a,x[_]);if(w){let _=w.subTree;if(d===_||$o(_.type)&&(_.ssContent===d||_.ssFallback===d)){const N=w.vnode;Ce(a,N,N.scopeId,N.slotScopeIds,w.parent)}}},qe=(a,d,m,x,w,_,N,A,E=0)=>{for(let S=E;S<a.length;S++){const O=a[S]=A?ht(a[S]):et(a[S]);H(null,O,d,m,x,w,_,N,A)}},Dt=(a,d,m,x,w,_,N)=>{const A=d.el=a.el;let{patchFlag:E,dynamicChildren:S,dirs:O}=d;E|=a.patchFlag&16;const M=a.props||ie,$=d.props||ie;let R;if(m&&Pt(m,!1),(R=$.onVnodeBeforeUpdate)&&Xe(R,m,d,a),O&&Ot(d,a,m,"beforeUpdate"),m&&Pt(m,!0),(M.innerHTML&&$.innerHTML==null||M.textContent&&$.textContent==null)&&h(A,""),S?ze(a.dynamicChildren,S,A,m,x,nn(d,w),_):N||X(a,d,A,null,m,x,nn(d,w),_,!1),E>0){if(E&16)it(A,M,$,m,w);else if(E&2&&M.class!==$.class&&o(A,"class",null,$.class,w),E&4&&o(A,"style",M.style,$.style,w),E&8){const q=d.dynamicProps;for(let Q=0;Q<q.length;Q++){const J=q[Q],_e=M[J],ve=$[J];(ve!==_e||J==="value")&&o(A,J,_e,ve,w,m)}}E&1&&a.children!==d.children&&h(A,d.children)}else!N&&S==null&&it(A,M,$,m,w);((R=$.onVnodeUpdated)||O)&&Ie(()=>{R&&Xe(R,m,d,a),O&&Ot(d,a,m,"updated")},x)},ze=(a,d,m,x,w,_,N)=>{for(let A=0;A<d.length;A++){const E=a[A],S=d[A],O=E.el&&(E.type===pe||!ns(E,S)||E.shapeFlag&198)?b(E.el):m;H(E,S,O,null,x,w,_,N,!0)}},it=(a,d,m,x,w)=>{if(d!==m){if(d!==ie)for(const _ in d)!os(_)&&!(_ in m)&&o(a,_,d[_],null,w,x);for(const _ in m){if(os(_))continue;const N=m[_],A=d[_];N!==A&&_!=="value"&&o(a,_,A,N,w,x)}"value"in m&&o(a,"value",d.value,m.value,w)}},Lt=(a,d,m,x,w,_,N,A,E)=>{const S=d.el=a?a.el:l(""),O=d.anchor=a?a.anchor:l("");let{patchFlag:M,dynamicChildren:$,slotScopeIds:R}=d;R&&(A=A?A.concat(R):R),a==null?(n(S,m,x),n(O,m,x),qe(d.children||[],m,O,w,_,N,A,E)):M>0&&M&64&&$&&a.dynamicChildren&&a.dynamicChildren.length===$.length?(ze(a.dynamicChildren,$,m,w,_,N,A),(d.key!=null||w&&d===w.subTree)&&Co(a,d,!0)):X(a,d,m,O,w,_,N,A,E)},Ht=(a,d,m,x,w,_,N,A,E)=>{d.slotScopeIds=A,a==null?d.shapeFlag&512?w.ctx.activate(d,m,x,N,E):Ct(d,m,x,w,_,N,E):wt(a,d,E)},Ct=(a,d,m,x,w,_,N)=>{const A=a.component=Pl(a,x,w);if(ao(a)&&(A.ctx.renderer=de),Rl(A,!1,N),A.asyncDep){if(w&&w.registerDep(A,ye,N),!a.el){const E=A.subTree=nt(Nt);te(null,E,d,m),a.placeholder=E.el}}else ye(A,a,d,m,w,_,N)},wt=(a,d,m)=>{const x=d.component=a.component;if(fl(a,d,m))if(x.asyncDep&&!x.asyncResolved){oe(x,d,m);return}else x.next=d,x.update();else d.el=a.el,x.vnode=d},ye=(a,d,m,x,w,_,N)=>{const A=()=>{if(a.isMounted){let{next:M,bu:$,u:R,parent:q,vnode:Q}=a;{const Re=To(a);if(Re){M&&(M.el=Q.el,oe(a,M,N)),Re.asyncDep.then(()=>{Ie(()=>{a.isUnmounted||S()},w)});return}}let J=M,_e;Pt(a,!1),M?(M.el=Q.el,oe(a,M,N)):M=Q,$&&Ms($),(_e=M.props&&M.props.onVnodeBeforeUpdate)&&Xe(_e,q,M,Q),Pt(a,!0);const ve=sr(a),Te=a.subTree;a.subTree=ve,H(Te,ve,b(Te.el),jt(Te),a,w,_),M.el=ve.el,J===null&&dl(a,ve.el),R&&Ie(R,w),(_e=M.props&&M.props.onVnodeUpdated)&&Ie(()=>Xe(_e,q,M,Q),w)}else{let M;const{el:$,props:R}=d,{bm:q,m:Q,parent:J,root:_e,type:ve}=a,Te=as(d);Pt(a,!1),q&&Ms(q),!Te&&(M=R&&R.onVnodeBeforeMount)&&Xe(M,J,d),Pt(a,!0);{_e.ce&&_e.ce._hasShadowRoot()&&_e.ce._injectChildStyle(ve,a.parent?a.parent.type:void 0);const Re=a.subTree=sr(a);H(null,Re,m,x,a,w,_),d.el=Re.el}if(Q&&Ie(Q,w),!Te&&(M=R&&R.onVnodeMounted)){const Re=d;Ie(()=>Xe(M,J,Re),w)}(d.shapeFlag&256||J&&as(J.vnode)&&J.vnode.shapeFlag&256)&&a.a&&Ie(a.a,w),a.isMounted=!0,d=m=x=null}};a.scope.on();const E=a.effect=new Hr(A);a.scope.off();const S=a.update=E.run.bind(E),O=a.job=E.runIfDirty.bind(E);O.i=a,O.id=a.uid,E.scheduler=()=>$n(O),Pt(a,!0),S()},oe=(a,d,m)=>{d.component=a;const x=a.vnode.props;a.vnode=d,a.next=null,pl(a,d.props,x,m),bl(a,d.children,m),yt(),Jn(a),bt()},X=(a,d,m,x,w,_,N,A,E=!1)=>{const S=a&&a.children,O=a?a.shapeFlag:0,M=d.children,{patchFlag:$,shapeFlag:R}=d;if($>0){if($&128){ct(S,M,m,x,w,_,N,A,E);return}else if($&256){lt(S,M,m,x,w,_,N,A,E);return}}R&8?(O&16&&Tt(S,w,_),M!==S&&h(m,M)):O&16?R&16?ct(S,M,m,x,w,_,N,A,E):Tt(S,w,_,!0):(O&8&&h(m,""),R&16&&qe(M,m,x,w,_,N,A,E))},lt=(a,d,m,x,w,_,N,A,E)=>{a=a||Gt,d=d||Gt;const S=a.length,O=d.length,M=Math.min(S,O);let $;for($=0;$<M;$++){const R=d[$]=E?ht(d[$]):et(d[$]);H(a[$],R,m,null,w,_,N,A,E)}S>O?Tt(a,w,_,!0,!1,M):qe(d,m,x,w,_,N,A,E,M)},ct=(a,d,m,x,w,_,N,A,E)=>{let S=0;const O=d.length;let M=a.length-1,$=O-1;for(;S<=M&&S<=$;){const R=a[S],q=d[S]=E?ht(d[S]):et(d[S]);if(ns(R,q))H(R,q,m,null,w,_,N,A,E);else break;S++}for(;S<=M&&S<=$;){const R=a[M],q=d[$]=E?ht(d[$]):et(d[$]);if(ns(R,q))H(R,q,m,null,w,_,N,A,E);else break;M--,$--}if(S>M){if(S<=$){const R=$+1,q=R<O?d[R].el:x;for(;S<=$;)H(null,d[S]=E?ht(d[S]):et(d[S]),m,q,w,_,N,A,E),S++}}else if(S>$)for(;S<=M;)ke(a[S],w,_,!0),S++;else{const R=S,q=S,Q=new Map;for(S=q;S<=$;S++){const c=d[S]=E?ht(d[S]):et(d[S]);c.key!=null&&Q.set(c.key,S)}let J,_e=0;const ve=$-q+1;let Te=!1,Re=0;const $t=new Array(ve);for(S=0;S<ve;S++)$t[S]=0;for(S=R;S<=M;S++){const c=a[S];if(_e>=ve){ke(c,w,_,!0);continue}let f;if(c.key!=null)f=Q.get(c.key);else for(J=q;J<=$;J++)if($t[J-q]===0&&ns(c,d[J])){f=J;break}f===void 0?ke(c,w,_,!0):($t[f-q]=S+1,f>=Re?Re=f:Te=!0,H(c,d[f],m,null,w,_,N,A,E),_e++)}const p=Te?Sl($t):Gt;for(J=p.length-1,S=ve-1;S>=0;S--){const c=q+S,f=d[c],C=d[c+1],F=c+1<O?C.el||Io(C):x;$t[S]===0?H(null,f,m,F,w,_,N,A,E):Te&&(J<0||S!==p[J]?Je(f,m,F,2):J--)}}},Je=(a,d,m,x,w=null)=>{const{el:_,type:N,transition:A,children:E,shapeFlag:S}=a;if(S&6){Je(a.component.subTree,d,m,x);return}if(S&128){a.suspense.move(d,m,x);return}if(S&64){N.move(a,d,m,de);return}if(N===pe){n(_,d,m);for(let M=0;M<E.length;M++)Je(E[M],d,m,x);n(a.anchor,d,m);return}if(N===Ts){se(a,d,m);return}if(x!==2&&S&1&&A)if(x===0)A.beforeEnter(_),n(_,d,m),Ie(()=>A.enter(_),w);else{const{leave:M,delayLeave:$,afterLeave:R}=A,q=()=>{a.ctx.isUnmounted?r(_):n(_,d,m)},Q=()=>{_._isLeaving&&_[ji](!0),M(_,()=>{q(),R&&R()})};$?$(_,q,Q):Q()}else n(_,d,m)},ke=(a,d,m,x=!1,w=!1)=>{const{type:_,props:N,ref:A,children:E,dynamicChildren:S,shapeFlag:O,patchFlag:M,dirs:$,cacheIndex:R}=a;if(M===-2&&(w=!1),A!=null&&(yt(),cs(A,null,m,a,!0),bt()),R!=null&&(d.renderCache[R]=void 0),O&256){d.ctx.deactivate(a);return}const q=O&1&&$,Q=!as(a);let J;if(Q&&(J=N&&N.onVnodeBeforeUnmount)&&Xe(J,d,a),O&6)Xs(a.component,m,x);else{if(O&128){a.suspense.unmount(m,x);return}q&&Ot(a,null,d,"beforeUnmount"),O&64?a.type.remove(a,d,m,de,x):S&&!S.hasOnce&&(_!==pe||M>0&&M&64)?Tt(S,d,m,!1,!0):(_===pe&&M&384||!w&&O&16)&&Tt(E,d,m),x&&Ss(a)}(Q&&(J=N&&N.onVnodeUnmounted)||q)&&Ie(()=>{J&&Xe(J,d,a),q&&Ot(a,null,d,"unmounted")},m)},Ss=a=>{const{type:d,el:m,anchor:x,transition:w}=a;if(d===pe){Js(m,x);return}if(d===Ts){k(a);return}const _=()=>{r(m),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(a.shapeFlag&1&&w&&!w.persisted){const{leave:N,delayLeave:A}=w,E=()=>N(m,_);A?A(a.el,_,E):E()}else _()},Js=(a,d)=>{let m;for(;a!==d;)m=T(a),r(a),a=m;r(d)},Xs=(a,d,m)=>{const{bum:x,scope:w,job:_,subTree:N,um:A,m:E,a:S}=a;or(E),or(S),x&&Ms(x),w.stop(),_&&(_.flags|=8,ke(N,a,d,m)),A&&Ie(A,d),Ie(()=>{a.isUnmounted=!0},d)},Tt=(a,d,m,x=!1,w=!1,_=0)=>{for(let N=_;N<a.length;N++)ke(a[N],d,m,x,w)},jt=a=>{if(a.shapeFlag&6)return jt(a.component.subTree);if(a.shapeFlag&128)return a.suspense.next();const d=T(a.anchor||a.el),m=d&&d[Li];return m?T(m):d};let ts=!1;const It=(a,d,m)=>{let x;a==null?d._vnode&&(ke(d._vnode,null,null,!0),x=d._vnode.component):H(d._vnode||null,a,d,null,null,null,m),d._vnode=a,ts||(ts=!0,Jn(x),no(),ts=!1)},de={p:H,um:ke,m:Je,r:Ss,mt:Ct,mc:qe,pc:X,pbc:ze,n:jt,o:e};return{render:It,hydrate:void 0,createApp:ol(It)}}function nn({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function Pt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function wl(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Co(e,t,s=!1){const n=e.children,r=t.children;if(D(n)&&D(r))for(let o=0;o<n.length;o++){const i=n[o];let l=r[o];l.shapeFlag&1&&!l.dynamicChildren&&((l.patchFlag<=0||l.patchFlag===32)&&(l=r[o]=ht(r[o]),l.el=i.el),!s&&l.patchFlag!==-2&&Co(i,l)),l.type===qs&&(l.patchFlag===-1&&(l=r[o]=ht(l)),l.el=i.el),l.type===Nt&&!l.el&&(l.el=i.el)}}function Sl(e){const t=e.slice(),s=[0];let n,r,o,i,l;const u=e.length;for(n=0;n<u;n++){const g=e[n];if(g!==0){if(r=s[s.length-1],e[r]<g){t[n]=r,s.push(n);continue}for(o=0,i=s.length-1;o<i;)l=o+i>>1,e[s[l]]<g?o=l+1:i=l;g<e[s[o]]&&(o>0&&(t[n]=s[o-1]),s[o]=n)}}for(o=s.length,i=s[o-1];o-- >0;)s[o]=i,i=t[i];return s}function To(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:To(t)}function or(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function Io(e){if(e.placeholder)return e.placeholder;const t=e.component;return t?Io(t.subTree):null}const $o=e=>e.__isSuspense;function xl(e,t){t&&t.pendingBranch?D(e)?t.effects.push(...e):t.effects.push(e):Oi(e)}const pe=Symbol.for("v-fgt"),qs=Symbol.for("v-txt"),Nt=Symbol.for("v-cmt"),Ts=Symbol.for("v-stc"),fs=[];let Pe=null;function B(e=!1){fs.push(Pe=e?null:[])}function Al(){fs.pop(),Pe=fs[fs.length-1]||null}let ms=1;function ir(e,t=!1){ms+=e,e<0&&Pe&&t&&(Pe.hasOnce=!0)}function Oo(e){return e.dynamicChildren=ms>0?Pe||Gt:null,Al(),ms>0&&Pe&&Pe.push(e),e}function W(e,t,s,n,r,o){return Oo(v(e,t,s,n,r,o,!0))}function El(e,t,s,n,r){return Oo(nt(e,t,s,n,r,!0))}function Po(e){return e?e.__v_isVNode===!0:!1}function ns(e,t){return e.type===t.type&&e.key===t.key}const ko=({key:e})=>e??null,Is=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?ge(e)||Se(e)||G(e)?{i:Le,r:e,k:t,f:!!s}:e:null);function v(e,t=null,s=null,n=0,r=null,o=e===pe?0:1,i=!1,l=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ko(t),ref:t&&Is(t),scopeId:oo,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:n,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:Le};return l?(Rn(u,s),o&128&&e.normalize(u)):s&&(u.shapeFlag|=ge(s)?8:16),ms>0&&!i&&Pe&&(u.patchFlag>0||o&6)&&u.patchFlag!==32&&Pe.push(u),u}const nt=Nl;function Nl(e,t=null,s=null,n=0,r=null,o=!1){if((!e||e===Yi)&&(e=Nt),Po(e)){const l=Yt(e,t,!0);return s&&Rn(l,s),ms>0&&!o&&Pe&&(l.shapeFlag&6?Pe[Pe.indexOf(e)]=l:Pe.push(l)),l.patchFlag=-2,l}if(Hl(e)&&(e=e.__vccOpts),t){t=Ml(t);let{class:l,style:u}=t;l&&!ge(l)&&(t.class=Qe(l)),re(u)&&(In(u)&&!D(u)&&(u=xe({},u)),t.style=ds(u))}const i=ge(e)?1:$o(e)?128:Hi(e)?64:re(e)?4:G(e)?2:0;return v(e,t,s,n,r,i,o,!0)}function Ml(e){return e?In(e)||So(e)?xe({},e):e:null}function Yt(e,t,s=!1,n=!1){const{props:r,ref:o,patchFlag:i,children:l,transition:u}=e,g=t?Il(r||{},t):r,h={__v_isVNode:!0,__v_skip:!0,type:e.type,props:g,key:g&&ko(g),ref:t&&t.ref?s&&o?D(o)?o.concat(Is(t)):[o,Is(t)]:Is(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==pe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:u,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Yt(e.ssContent),ssFallback:e.ssFallback&&Yt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return u&&n&&On(h,u.clone(h)),h}function Cl(e=" ",t=0){return nt(qs,null,e,t)}function Tl(e,t){const s=nt(Ts,null,e);return s.staticCount=t,s}function St(e="",t=!1){return t?(B(),El(Nt,null,e)):nt(Nt,null,e)}function et(e){return e==null||typeof e=="boolean"?nt(Nt):D(e)?nt(pe,null,e.slice()):Po(e)?ht(e):nt(qs,null,String(e))}function ht(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Yt(e)}function Rn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(D(t))s=16;else if(typeof t=="object")if(n&65){const r=t.default;r&&(r._c&&(r._d=!1),Rn(e,r()),r._c&&(r._d=!0));return}else{s=32;const r=t._;!r&&!So(t)?t._ctx=Le:r===3&&Le&&(Le.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else G(t)?(t={default:t,_ctx:Le},s=32):(t=String(t),n&64?(s=16,t=[Cl(t)]):s=8);e.children=t,e.shapeFlag|=s}function Il(...e){const t={};for(let s=0;s<e.length;s++){const n=e[s];for(const r in n)if(r==="class")t.class!==n.class&&(t.class=Qe([t.class,n.class]));else if(r==="style")t.style=ds([t.style,n.style]);else if(Ls(r)){const o=t[r],i=n[r];i&&o!==i&&!(D(o)&&o.includes(i))&&(t[r]=o?[].concat(o,i):i)}else r!==""&&(t[r]=n[r])}return t}function Xe(e,t,s,n=null){ot(e,t,7,[s,n])}const $l=yo();let Ol=0;function Pl(e,t,s){const n=e.type,r=(t?t.appContext:e.appContext)||$l,o={uid:Ol++,vnode:e,type:n,parent:t,appContext:r,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new ei(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(r.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Ao(n,r),emitsOptions:bo(n,r),emit:null,emitted:null,propsDefaults:ie,inheritAttrs:n.inheritAttrs,ctx:ie,data:ie,props:ie,attrs:ie,slots:ie,refs:ie,setupState:ie,setupContext:null,suspense:s,suspenseId:s?s.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return o.ctx={_:o},o.root=t?t.root:o,o.emit=ll.bind(null,o),e.ce&&e.ce(o),o}let Me=null;const kl=()=>Me||Le;let Ds,yn;{const e=Vs(),t=(s,n)=>{let r;return(r=e[s])||(r=e[s]=[]),r.push(n),o=>{r.length>1?r.forEach(i=>i(o)):r[0](o)}};Ds=t("__VUE_INSTANCE_SETTERS__",s=>Me=s),yn=t("__VUE_SSR_SETTERS__",s=>ys=s)}const ws=e=>{const t=Me;return Ds(e),e.scope.on(),()=>{e.scope.off(),Ds(t)}},lr=()=>{Me&&Me.scope.off(),Ds(null)};function Ro(e){return e.vnode.shapeFlag&4}let ys=!1;function Rl(e,t=!1,s=!1){t&&yn(t);const{props:n,children:r}=e.vnode,o=Ro(e);hl(e,n,o,t),yl(e,r,s||t);const i=o?Fl(e,t):void 0;return t&&yn(!1),i}function Fl(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Qi);const{setup:n}=s;if(n){yt();const r=e.setupContext=n.length>1?Ll(e):null,o=ws(e),i=vs(n,e,0,[e.props,r]),l=$r(i);if(bt(),o(),(l||e.sp)&&!as(e)&&co(e),l){if(i.then(lr,lr),t)return i.then(u=>{cr(e,u)}).catch(u=>{Bs(u,e,0)});e.asyncDep=i}else cr(e,i)}else Fo(e)}function cr(e,t,s){G(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:re(t)&&(e.setupState=Zr(t)),Fo(e)}function Fo(e,t,s){const n=e.type;e.render||(e.render=n.render||st);{const r=ws(e);yt();try{Zi(e)}finally{bt(),r()}}}const Dl={get(e,t){return we(e,"get",""),e[t]}};function Ll(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,Dl),slots:e.slots,emit:e.emit,expose:t}}function zs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Zr(wi(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in us)return us[s](e)},has(t,s){return s in t||s in us}})):e.proxy}function Hl(e){return G(e)&&"__vccOpts"in e}const Ee=(e,t)=>Mi(e,t,ys),jl="3.5.30";let bn;const ar=typeof window<"u"&&window.trustedTypes;if(ar)try{bn=ar.createPolicy("vue",{createHTML:e=>e})}catch{}const Do=bn?e=>bn.createHTML(e):e=>e,Vl="http://www.w3.org/2000/svg",Kl="http://www.w3.org/1998/Math/MathML",dt=typeof document<"u"?document:null,ur=dt&&dt.createElement("template"),Ul={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const r=t==="svg"?dt.createElementNS(Vl,e):t==="mathml"?dt.createElementNS(Kl,e):s?dt.createElement(e,{is:s}):dt.createElement(e);return e==="select"&&n&&n.multiple!=null&&r.setAttribute("multiple",n.multiple),r},createText:e=>dt.createTextNode(e),createComment:e=>dt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>dt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,r,o){const i=s?s.previousSibling:t.lastChild;if(r&&(r===o||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),s),!(r===o||!(r=r.nextSibling)););else{ur.innerHTML=Do(n==="svg"?`<svg>${e}</svg>`:n==="mathml"?`<math>${e}</math>`:e);const l=ur.content;if(n==="svg"||n==="mathml"){const u=l.firstChild;for(;u.firstChild;)l.appendChild(u.firstChild);l.removeChild(u)}t.insertBefore(l,s)}return[i?i.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Bl=Symbol("_vtc");function Wl(e,t,s){const n=e[Bl];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const fr=Symbol("_vod"),Gl=Symbol("_vsh"),ql=Symbol(""),zl=/(?:^|;)\s*display\s*:/;function Jl(e,t,s){const n=e.style,r=ge(s);let o=!1;if(s&&!r){if(t)if(ge(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();s[l]==null&&$s(n,l,"")}else for(const i in t)s[i]==null&&$s(n,i,"");for(const i in s)i==="display"&&(o=!0),$s(n,i,s[i])}else if(r){if(t!==s){const i=n[ql];i&&(s+=";"+i),n.cssText=s,o=zl.test(s)}}else t&&e.removeAttribute("style");fr in e&&(e[fr]=o?n.display:"",e[Gl]&&(n.display="none"))}const dr=/\s*!important$/;function $s(e,t,s){if(D(s))s.forEach(n=>$s(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=Xl(e,t);dr.test(s)?e.setProperty(Mt(n),s.replace(dr,""),"important"):e[n]=s}}const hr=["Webkit","Moz","ms"],rn={};function Xl(e,t){const s=rn[t];if(s)return s;let n=Ue(t);if(n!=="filter"&&n in e)return rn[t]=n;n=kr(n);for(let r=0;r<hr.length;r++){const o=hr[r]+n;if(o in e)return rn[t]=o}return t}const pr="http://www.w3.org/1999/xlink";function gr(e,t,s,n,r,o=Qo(t)){n&&t.startsWith("xlink:")?s==null?e.removeAttributeNS(pr,t.slice(6,t.length)):e.setAttributeNS(pr,t,s):s==null||o&&!Fr(s)?e.removeAttribute(t):e.setAttribute(t,o?"":rt(s)?String(s):s)}function mr(e,t,s,n,r){if(t==="innerHTML"||t==="textContent"){s!=null&&(e[t]=t==="innerHTML"?Do(s):s);return}const o=e.tagName;if(t==="value"&&o!=="PROGRESS"&&!o.includes("-")){const l=o==="OPTION"?e.getAttribute("value")||"":e.value,u=s==null?e.type==="checkbox"?"on":"":String(s);(l!==u||!("_value"in e))&&(e.value=u),s==null&&e.removeAttribute(t),e._value=s;return}let i=!1;if(s===""||s==null){const l=typeof e[t];l==="boolean"?s=Fr(s):s==null&&l==="string"?(s="",i=!0):l==="number"&&(s=0,i=!0)}try{e[t]=s}catch{}i&&e.removeAttribute(r||t)}function Et(e,t,s,n){e.addEventListener(t,s,n)}function Yl(e,t,s,n){e.removeEventListener(t,s,n)}const yr=Symbol("_vei");function Ql(e,t,s,n,r=null){const o=e[yr]||(e[yr]={}),i=o[t];if(n&&i)i.value=n;else{const[l,u]=Zl(t);if(n){const g=o[t]=sc(n,r);Et(e,l,g,u)}else i&&(Yl(e,l,i,u),o[t]=void 0)}}const br=/(?:Once|Passive|Capture)$/;function Zl(e){let t;if(br.test(e)){t={};let n;for(;n=e.match(br);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):Mt(e.slice(2)),t]}let on=0;const ec=Promise.resolve(),tc=()=>on||(ec.then(()=>on=0),on=Date.now());function sc(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;ot(nc(n,s.value),t,5,[n])};return s.value=e,s.attached=tc(),s}function nc(e,t){if(D(t)){const s=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{s.call(e),e._stopped=!0},t.map(n=>r=>!r._stopped&&n&&n(r))}else return t}const _r=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,rc=(e,t,s,n,r,o)=>{const i=r==="svg";t==="class"?Wl(e,n,i):t==="style"?Jl(e,s,n):Ls(t)?vn(t)||Ql(e,t,s,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):oc(e,t,n,i))?(mr(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&gr(e,t,n,i,o,t!=="value")):e._isVueCE&&(ic(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ge(n)))?mr(e,Ue(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),gr(e,t,n,i))};function oc(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&_r(t)&&G(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return _r(t)&&ge(s)?!1:t in e}function ic(e,t){const s=e._def.props;if(!s)return!1;const n=Ue(t);return Array.isArray(s)?s.some(r=>Ue(r)===n):Object.keys(s).some(r=>Ue(r)===n)}const Qt=e=>{const t=e.props["onUpdate:modelValue"]||!1;return D(t)?s=>Ms(t,s):t};function lc(e){e.target.composing=!0}function vr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const mt=Symbol("_assign");function wr(e,t,s){return t&&(e=e.trim()),s&&(e=js(e)),e}const ln={created(e,{modifiers:{lazy:t,trim:s,number:n}},r){e[mt]=Qt(r);const o=n||r.props&&r.props.type==="number";Et(e,t?"change":"input",i=>{i.target.composing||e[mt](wr(e.value,s,o))}),(s||o)&&Et(e,"change",()=>{e.value=wr(e.value,s,o)}),t||(Et(e,"compositionstart",lc),Et(e,"compositionend",vr),Et(e,"change",vr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:r,number:o}},i){if(e[mt]=Qt(i),e.composing)return;const l=(o||e.type==="number")&&!/^0\d/.test(e.value)?js(e.value):e.value,u=t??"";l!==u&&(document.activeElement===e&&e.type!=="range"&&(n&&t===s||r&&e.value.trim()===u)||(e.value=u))}},cc={deep:!0,created(e,t,s){e[mt]=Qt(s),Et(e,"change",()=>{const n=e._modelValue,r=bs(e),o=e.checked,i=e[mt];if(D(n)){const l=xn(n,r),u=l!==-1;if(o&&!u)i(n.concat(r));else if(!o&&u){const g=[...n];g.splice(l,1),i(g)}}else if(Zt(n)){const l=new Set(n);o?l.add(r):l.delete(r),i(l)}else i(Lo(e,o))})},mounted:Sr,beforeUpdate(e,t,s){e[mt]=Qt(s),Sr(e,t,s)}};function Sr(e,{value:t,oldValue:s},n){e._modelValue=t;let r;if(D(t))r=xn(t,n.props.value)>-1;else if(Zt(t))r=t.has(n.props.value);else{if(t===s)return;r=es(t,Lo(e,!0))}e.checked!==r&&(e.checked=r)}const xr={deep:!0,created(e,{value:t,modifiers:{number:s}},n){const r=Zt(t);Et(e,"change",()=>{const o=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>s?js(bs(i)):bs(i));e[mt](e.multiple?r?new Set(o):o:o[0]),e._assigning=!0,to(()=>{e._assigning=!1})}),e[mt]=Qt(n)},mounted(e,{value:t}){Ar(e,t)},beforeUpdate(e,t,s){e[mt]=Qt(s)},updated(e,{value:t}){e._assigning||Ar(e,t)}};function Ar(e,t){const s=e.multiple,n=D(t);if(!(s&&!n&&!Zt(t))){for(let r=0,o=e.options.length;r<o;r++){const i=e.options[r],l=bs(i);if(s)if(n){const u=typeof l;u==="string"||u==="number"?i.selected=t.some(g=>String(g)===String(l)):i.selected=xn(t,l)>-1}else i.selected=t.has(l);else if(es(bs(i),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function bs(e){return"_value"in e?e._value:e.value}function Lo(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const ac=["ctrl","shift","alt","meta"],uc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>ac.some(s=>e[`${s}Key`]&&!t.includes(s))},fc=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((r,...o)=>{for(let i=0;i<t.length;i++){const l=uc[t[i]];if(l&&l(r,t))return}return e(r,...o)}))},dc={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},hc=(e,t)=>{const s=e._withKeys||(e._withKeys={}),n=t.join(".");return s[n]||(s[n]=(r=>{if(!("key"in r))return;const o=Mt(r.key);if(t.some(i=>i===o||dc[i]===o))return e(r)}))},pc=xe({patchProp:rc},Ul);let Er;function gc(){return Er||(Er=_l(pc))}const mc=((...e)=>{const t=gc().createApp(...e),{mount:s}=t;return t.mount=n=>{const r=bc(n);if(!r)return;const o=t._component;!G(o)&&!o.render&&!o.template&&(o.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const i=s(r,!1,yc(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},t});function yc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function bc(e){return ge(e)?document.querySelector(e):e}const _c=(e,t)=>{const s=e.__vccOpts||e;for(const[n,r]of t)s[n]=r;return s},vc={class:"page-shell"},wc={class:"topbar"},Sc={class:"toolbar"},xc={class:"theme-strip"},Ac=["onClick"],Ec=["value"],Nc={class:"checkbox"},Mc=["disabled"],Cc={class:"statusbar"},Tc={key:0,class:"status-detail"},Ic={class:"content-grid"},$c={class:"card card-summary"},Oc={class:"card-head"},Pc={key:0,class:"meta-chip"},kc={class:"summary-pre"},Rc={class:"metric-grid"},Fc={class:"metric"},Dc={class:"metric"},Lc={class:"metric"},Hc={class:"metric"},jc={class:"card"},Vc={class:"card-head"},Kc={class:"meta-chip"},Uc={key:0,class:"rank-list"},Bc={class:"rank-title"},Wc={class:"rank-label"},Gc={key:1,class:"empty-state"},qc={class:"card"},zc={class:"card-head"},Jc={class:"meta-chip"},Xc={key:0,class:"event-list"},Yc={class:"event-name"},Qc={class:"event-bar"},Zc={key:1,class:"empty-state"},ea={class:"card card-bus"},ta={class:"card-head"},sa={key:0,class:"meta-chip"},na={class:"pill-row"},ra={class:"pill success"},oa={class:"pill danger"},ia={class:"pill neutral"},la={class:"bus-track"},ca=["title"],aa={class:"bus-scale"},ua={key:1,class:"empty-state"},fa={class:"card-head"},da={class:"card-head-actions"},ha={class:"meta-chip"},pa={class:"flow-toolbar"},ga={class:"flow-field"},ma={class:"flow-field flow-field-search"},ya={class:"flow-field flow-field-select"},ba=["value"],_a={class:"flow-frame"},va=["viewBox"],wa=["id"],Sa=["fill"],xa=["d","stroke","stroke-width","opacity","marker-end"],Aa=["cx","cy"],Ea=["x","y"],Na=["x","y"],Ma=["x","y"],Ca=["x","y"],Ta={key:1,class:"empty-state flow-empty"},Ia={class:"flow-note"},$a={class:"card card-anomalies"},Oa={class:"card-head"},Pa={class:"meta-chip"},ka={key:0,class:"anomaly-list"},Ra={class:"anomaly-head"},Fa={class:"anomaly-time"},Da={key:1,class:"empty-state"},La={class:"card card-chat"},Ha={class:"card-head"},ja={class:"meta-chip"},Va={class:"preset-row"},Ka=["disabled","onClick"],Ua={class:"ask-row"},Ba=["disabled"],Wa=["disabled"],Ga={class:"chat-log"},qa=["innerHTML"],za={key:1},Ja={key:0,class:"chat-message chat-pending"},Xa={key:1,class:"empty-state"},Nr="knxUltimateAI:selectedNodeId",Mr="knxUltimateAI:autoRefresh",Cr="knxUltimateAI:theme",Tr="knxUltimateAI:flowPreview",Ya={__name:"App",setup(e){const t=["mix","green","lavender"],s=["Summarize the current KNX traffic and highlight the busiest group addresses.","Explain any anomalies you see and suggest what to check first.","Generate an SVG bar chart of Top Group Addresses with counts and title."],n={write:"#7a68d8",response:"#46b86d",read:"#d99a34",repeat:"#c34747",other:"#9a93b8"},r=(()=>{try{return new URLSearchParams(window.location.search).get("nodeId")||""}catch{return""}})(),o=Us({nodes:[],selectedNodeId:"",autoRefresh:g(Mr,!0),theme:ue(u(Cr,"mix")),flowMaxNodes:h().maxNodes,flowSelectedGa:h().selectedGa,flowSearch:"",status:"Ready",loadingNodes:!1,loadingState:!1,asking:!1,stateData:null,lastError:"",chatMessages:[],chatDraft:"",pollStateHandle:null,pollNodesHandle:null}),i=zn(null),l=zn(!1);function u(p,c=""){try{return window.localStorage&&window.localStorage.getItem(p)||c}catch{return c}}function g(p,c){try{if(!window.localStorage)return c;const f=window.localStorage.getItem(p);return f==null||f===""?c:f==="true"}catch{return c}}function h(){try{if(!window.localStorage)return{maxNodes:14,selectedGa:[]};const p=window.localStorage.getItem(Tr);if(!p)return{maxNodes:14,selectedGa:[]};const c=JSON.parse(p),f=Math.max(4,Math.min(32,Number(c&&c.maxNodes)||14)),C=Array.isArray(c&&c.selectedGa)?Array.from(new Set(c.selectedGa.map(F=>String(F||"").trim()).filter(Boolean))).slice(0,80):[];return{maxNodes:f,selectedGa:C}}catch{return{maxNodes:14,selectedGa:[]}}}function b(p,c){try{window.localStorage&&window.localStorage.setItem(p,String(c??""))}catch{}}function T(p,c){try{window.localStorage&&window.localStorage.setItem(p,c?"true":"false")}catch{}}function I(){try{if(!window.localStorage)return;window.localStorage.setItem(Tr,JSON.stringify({maxNodes:Math.max(4,Math.min(32,Number(o.flowMaxNodes)||14)),selectedGa:Array.from(new Set((o.flowSelectedGa||[]).map(p=>String(p||"").trim()).filter(Boolean))).slice(0,80)}))}catch{}}async function Y(){const p=i.value;if(!(!p||typeof p.requestFullscreen!="function"))try{document.fullscreenElement===p?await document.exitFullscreen():document.fullscreenElement||await p.requestFullscreen()}catch{}}function H(){l.value=document.fullscreenElement===i.value}function ue(p){const c=String(p||"").trim().toLowerCase();return t.includes(c)?c:"mix"}function te(p){return new URL(p,window.location.href).toString()}function K(p){o.status=String(p||"")}async function se(p,c){const f=await fetch(p,Object.assign({credentials:"same-origin"},c||{})),C=await f.text();let F={};try{F=C?JSON.parse(C):{}}catch{F={error:C||`HTTP ${f.status}`}}if(!f.ok){const j=F&&F.error?F.error:`HTTP ${f.status}`;throw f.status===401||f.status===403?new Error(`Authentication required or insufficient permissions (${f.status}).`):new Error(j)}return F}function k(p){if(p==null)return"";if(typeof p=="string")return p;try{return JSON.stringify(p,null,2)}catch{return String(p)}}function fe(p){return String(p||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Ge(p){const c=String(p||"").trim();return c.includes("-")&&/^\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?\s*$/.test(c)}function Ce(p){let c=String(p||"").trim();return c.startsWith("|")&&(c=c.slice(1)),c.endsWith("|")&&(c=c.slice(0,-1)),c.split("|").map(f=>String(f||"").trim())}function qe(p){return Ce(p).map(c=>{const f=String(c||"").trim(),C=f.startsWith(":"),F=f.endsWith(":");return C&&F?"center":F?"right":"left"})}function Dt(p){const c=String(p||"").split(/\r?\n/);let f="",C=!1;const F=j=>{let U=String(j||"");return U=U.replace(/`([^`]+)`/g,"<code>$1</code>"),U=U.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),U=U.replace(/\*([^*]+)\*/g,"<em>$1</em>"),U=U.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(me,he,ne)=>`<a href="${/^javascript:/i.test(String(ne||"").trim())?"#":ne}" target="_blank" rel="noopener noreferrer">${he}</a>`),U};for(let j=0;j<c.length;j++){const U=c[j];if(/^```/.test(U.trim())){C=!C,f+=C?"<pre><code>":"</code></pre>";continue}if(C){f+=`${U}
2
+ `;continue}if(/^###\s+/.test(U)){f+=`<h3>${U.replace(/^###\s+/,"")}</h3>`;continue}if(/^##\s+/.test(U)){f+=`<h2>${U.replace(/^##\s+/,"")}</h2>`;continue}if(/^#\s+/.test(U)){f+=`<h1>${U.replace(/^#\s+/,"")}</h1>`;continue}if(U.includes("|")&&j+1<c.length&&Ge(c[j+1])){const ne=Ce(U),le=qe(c[j+1]),be=[];for(j+=2;j<c.length&&c[j]&&c[j].includes("|")&&!/^```/.test(c[j].trim());)be.push(Ce(c[j])),j++;j-=1;const Fe=Math.max(ne.length,le.length,...be.map(ae=>ae.length),0);f+='<div class="chat-table-wrap"><table><thead><tr>';for(let ae=0;ae<Fe;ae++)f+=`<th style="text-align:${le[ae]||"left"};">${F(ne[ae]||"")}</th>`;f+="</tr></thead><tbody>",be.forEach(ae=>{f+="<tr>";for(let Oe=0;Oe<Fe;Oe++)f+=`<td style="text-align:${le[Oe]||"left"};">${F(ae[Oe]||"")}</td>`;f+="</tr>"}),f+="</tbody></table></div>";continue}const me=/^\s*[-*]\s+/.test(U),he=/^\s*\d+\.\s+/.test(U);if(me||he){const ne=he?"ol":"ul",le=he?/^\s*\d+\.\s+/:/^\s*[-*]\s+/;for(f+=`<${ne}>`;j<c.length&&le.test(c[j]);)f+=`<li>${F(c[j].replace(le,""))}</li>`,j++;j-=1,f+=`</${ne}>`;continue}if(U.trim()===""){f+="<br>";continue}f+=`<p>${F(U)}</p>`}return C&&(f+="</code></pre>"),f}function ze(p){return String(p||"").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#39;/gi,"'").replace(/&amp;/gi,"&")}function it(p){const c=[],f=/<svg[\s\S]*?<\/svg>/gi;let C;for(;(C=f.exec(String(p||"")))!==null;)C&&C[0]&&c.push(String(C[0]));return c}const Lt=new Set(["svg","g","path","line","polyline","polygon","circle","ellipse","rect","text","tspan","title","desc","defs","marker","lineargradient","radialgradient","stop","clippath"]),Ht=new Set(["xmlns","xmlns:xlink","viewbox","preserveaspectratio","width","height","role","aria-label","id","class","x","y","x1","y1","x2","y2","cx","cy","r","rx","ry","d","points","transform","fill","fill-opacity","stroke","stroke-width","stroke-opacity","stroke-dasharray","stroke-linecap","stroke-linejoin","opacity","font-size","font-family","font-weight","text-anchor","dominant-baseline","offset","stop-color","stop-opacity","gradientunits","gradienttransform","fx","fy","marker-start","marker-mid","marker-end","markerwidth","markerheight","refx","refy","orient","markerunits","href","xlink:href","clip-path","clippathunits"]);function Ct(p){try{const f=new window.DOMParser().parseFromString(String(p||""),"image/svg+xml");if(!f||!f.documentElement||f.getElementsByTagName("parsererror").length)return"";const C=f.documentElement;if(String(C.tagName||"").toLowerCase()!=="svg")return"";const F=U=>{const me=String(U.tagName||"").toLowerCase();if(!Lt.has(me)){U.remove();return}Array.from(U.attributes||[]).forEach(he=>{const ne=String(he.name||"").toLowerCase(),le=String(he.value||"");if(ne.startsWith("on")||!Ht.has(ne)){U.removeAttribute(he.name);return}(ne==="href"||ne==="xlink:href")&&le&&!String(le).trim().startsWith("#")&&U.removeAttribute(he.name)}),Array.from(U.childNodes||[]).forEach(he=>{he.nodeType===1?F(he):he.nodeType!==3&&he.remove()})};F(C),!C.getAttribute("viewBox")&&!C.getAttribute("viewbox")&&C.setAttribute("viewBox","0 0 920 360"),C.setAttribute("role",C.getAttribute("role")||"img");const j=new window.XMLSerializer().serializeToString(C);return j.length>12e4?"":j}catch{return""}}function wt(p){return Dt(fe(p||""))}function ye(p){const c=k(p),f=c.trim();if(!f)return wt("(empty answer)");const C=/```(?:svg|xml|html)?\s*([\s\S]*?)```/gi;let F="",j=0,U=!1,me;for(;(me=C.exec(c))!==null;){const ne=c.slice(j,me.index);ne.trim()&&(F+=wt(ne));const le=String(me[1]||""),be=ze(le),Fe=it(be);if(Fe.length){let ae=0;Fe.forEach(Oe=>{const je=Ct(Oe);je&&(ae++,U=!0,F+=`<div class="chat-svg-wrap">${je}</div>`)}),ae||(F+=`<pre><code>${fe(le)}</code></pre>`)}else{const ae=Ct(be);ae?(U=!0,F+=`<div class="chat-svg-wrap">${ae}</div>`):F+=`<pre><code>${fe(le)}</code></pre>`}j=me.index+me[0].length}const he=c.slice(j);if(he.trim()&&(F+=wt(he)),!U){const ne=ze(c),le=Array.from(new Set([...it(c),...it(ne)])).map(be=>Ct(be)).filter(Boolean);if(le.length){const be=c.replace(/<svg[\s\S]*?<\/svg>/gi,"").replace(/&lt;svg[\s\S]*?&lt;\/svg&gt;/gi,"").trim();F=be?wt(be):"",le.forEach(Fe=>{F+=`<div class="chat-svg-wrap">${Fe}</div>`})}}return F||wt(f)}function oe(p){const c=Math.max(0,Math.round(Number(p)||0)),f=Math.floor(c/3600),C=Math.floor(c%3600/60),F=c%60;return f?`${f}h ${C}m`:C?`${C}m ${F}s`:`${F}s`}function X(p){if(!p)return"n/a";try{return new Date(p).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return"n/a"}}function lt(p){if(!p)return"";try{return new Date(p).toLocaleString()}catch{return String(p)}}function ct(p){return p&&p.payload&&typeof p.payload=="object"?p.payload:{}}function Je(p){return p==null?"":String(p).trim()}function ke(p){const c=String(p||"").trim();return c.length>14?`${c.slice(0,12)}..`:c}function Ss(p){const c=String(p||"").trim();return c?c.length>28?`${c.slice(0,26)}..`:c:""}function Js(p){const c=Je(p).replace(/\s+/g," ");return c?c.length>30?`${c.slice(0,28)}..`:c:""}function Xs(p){const c=String(p||"").toLowerCase();return c.includes("repeat")?"repeat":c.includes("write")?"write":c.includes("response")?"response":c.includes("read")?"read":"other"}function Tt(p){const c={write:0,response:0,read:0,repeat:0,other:0};return Object.keys(p||{}).forEach(f=>{const C=Number(p[f]||0);C<=0||(c[Xs(f)]+=C)}),Object.keys(c).sort((f,C)=>c[C]-c[f])[0]||"other"}function jt(p){const c=p&&p.summary?p.summary:{},f=Array.isArray(p&&p.anomalies)?p.anomalies:[],C=Array.isArray(c.patternTransitions)?c.patternTransitions:[],F=Array.isArray(c.patterns)?c.patterns:[],j=c&&typeof c.gaLabels=="object"?c.gaLabels:{},U=c&&typeof c.gaLastPayload=="object"?c.gaLastPayload:{},me=c&&typeof c.gaLastSeenAt=="object"?c.gaLastSeenAt:{},he=new Set((Array.isArray(c.flowKnownGAs)?c.flowKnownGAs:[]).map(y=>String(y||"").trim()).filter(Boolean)),ne={};f.forEach(y=>{const P=String(y&&y.payload&&y.payload.ga?y.payload.ga:"BUS").trim()||"BUS";ne[P]=(ne[P]||0)+1});const le=c&&c.flowMapTopology&&typeof c.flowMapTopology=="object"?c.flowMapTopology:null,be=Array.isArray(le&&le.nodes)?le.nodes:[],Fe=Array.isArray(le&&le.edges)?le.edges:[],ae=new Map,Oe=y=>{const P=String(y&&y.from?y.from:"").trim(),z=String(y&&y.to?y.to:"").trim();if(!P||!z||P===z)return;const at=`${P}->${z}`,Ve={key:at,from:P,to:z,weight:Math.max(1,Number(y&&(y.weight??y.currentWindowCount??y.totalCount??y.count)||1)),delta:Number(y&&y.delta?y.delta:0),edgeByEvent:y&&typeof y.edgeByEvent=="object"?y.edgeByEvent:{},lastAtMs:(()=>{const Ke=Number(y&&y.lastAtMs?y.lastAtMs:0);if(Number.isFinite(Ke)&&Ke>0)return Ke;const Kt=new Date(String(y&&y.lastAt?y.lastAt:"")).getTime();return Number.isFinite(Kt)?Kt:0})(),linkType:String(y&&y.linkType?y.linkType:"").trim()};if(!ae.has(at)){ae.set(at,Ve);return}const ut=ae.get(at);ut.weight+=Ve.weight,ut.delta+=Ve.delta,ut.lastAtMs=Math.max(Number(ut.lastAtMs||0),Number(Ve.lastAtMs||0)),Object.keys(Ve.edgeByEvent||{}).forEach(Ke=>{ut.edgeByEvent[Ke]=Number(ut.edgeByEvent[Ke]||0)+Number(Ve.edgeByEvent[Ke]||0)})};Fe.length?Fe.forEach(Oe):C.length?C.forEach(Oe):F.forEach(y=>Oe({from:y&&y.from,to:y&&y.to,count:y&&y.count,edgeByEvent:{}}));const je=new Map,L=(y,P={})=>{const z=String(y||"").trim();return z?(je.has(z)||je.set(z,{id:z,displayId:String(P.displayId||z).trim()||z,kind:String(P.kind||(z.startsWith("N:")?"node":"ga")).trim()||"ga",subtitle:String(P.subtitle||"").trim(),payload:Je(P.payload),anomalyCount:Number(P.anomalyCount||ne[z]||0),inFlow:P.inFlow!==void 0?!!P.inFlow:he.size?he.has(z)||z==="BUS"||z.startsWith("N:"):!0,lastSeenAtMs:Number(P.lastSeenAtMs||0),score:Number(P.score||0)}),je.get(z)):null};return be.forEach(y=>{const P=String(y&&y.id?y.id:"").trim();P&&L(P,{displayId:y&&y.displayId,kind:y&&y.kind,subtitle:y&&y.subtitle?y.subtitle:j[P],payload:y&&y.payload!==void 0?y.payload:U[P],anomalyCount:Number(y&&y.anomalyCount?y.anomalyCount:ne[P]||0),inFlow:y&&y.inFlow!==void 0?!!y.inFlow:void 0,lastSeenAtMs:Number(y&&y.lastSeenAtMs?y.lastSeenAtMs:new Date(String(y&&y.lastAt?y.lastAt:me[P]||"")).getTime()||0),score:Number(y&&y.score?y.score:0)})}),Array.from(ae.values()).forEach(y=>{L(y.from,{subtitle:j[y.from],payload:U[y.from],lastSeenAtMs:new Date(String(me[y.from]||"")).getTime()||y.lastAtMs||0}),L(y.to,{subtitle:j[y.to],payload:U[y.to],lastSeenAtMs:new Date(String(me[y.to]||"")).getTime()||y.lastAtMs||0});const P=je.get(y.from),z=je.get(y.to);P&&(P.score+=Number(y.weight||0)),z&&(z.score+=Number(y.weight||0))}),(Array.isArray(c.topGAs)?c.topGAs:[]).slice(0,12).forEach(y=>{const P=String(y&&y.ga?y.ga:"").trim();if(!P)return;const z=L(P,{subtitle:y&&y.label?y.label:j[P],payload:U[P],lastSeenAtMs:new Date(String(me[P]||"")).getTime()||0});z&&(z.score+=Number(y&&y.count?y.count:0))}),{nodes:Array.from(je.values()),edges:Array.from(ae.values()).sort((y,P)=>Number(P.weight||0)-Number(y.weight||0)).slice(0,48),telemetryWindowSec:Number(c&&c.graph&&c.graph.windowSec?c.graph.windowSec:c?.meta?.analysisWindowSec||0)}}function ts(p){const c=Array.isArray(p&&p.nodes)?p.nodes.slice():[],f=Array.isArray(p&&p.edges)?p.edges.slice():[],C=new Set((o.flowSelectedGa||[]).map(L=>String(L||"").trim()).filter(Boolean)),F=Math.max(4,Math.min(32,Number(o.flowMaxNodes)||14));let j=c.slice().sort((L,y)=>{const P=Number(L.anomalyCount||0)*10+Number(L.score||0),z=Number(y.anomalyCount||0)*10+Number(y.score||0);return z!==P?z-P:String(L.id||"").localeCompare(String(y.id||""))});if(C.size){const L=new Set(C);f.forEach(y=>{C.has(y.from)&&L.add(y.to),C.has(y.to)&&L.add(y.from)}),j=j.filter(y=>L.has(y.id))}else j=j.slice(0,F);const U=new Set(j.map(L=>L.id)),me=f.filter(L=>U.has(L.from)&&U.has(L.to)),he=Math.max(...me.map(L=>Number(L.weight||0)),1),ne=Math.max(2,Math.min(6,Math.ceil(Math.sqrt(Math.max(j.length,4)*1.5)))),le=Math.max(1,Math.ceil(j.length/ne)),be=1080,Fe=Math.max(420,140+(le-1)*150),ae=new Map;j.forEach((L,y)=>{const P=Math.floor(y/ne),z=y%ne,at=ne===1?be/2:90+z*((be-180)/Math.max(ne-1,1)),Ve=92+P*148;ae.set(L.id,{x:at,y:Ve,row:P,col:z})});const Oe=Date.now(),je=me.map((L,y)=>{const P=ae.get(L.from),z=ae.get(L.to);if(!P||!z)return null;const at=z.x-P.x,Ve=z.y-P.y,ut=Math.max(Math.hypot(at,Ve),1),Ke=at/ut,Kt=Ve/ut,xs=24,Fn=P.x+Ke*(xs+2),Dn=P.y+Kt*(xs+2),Ln=z.x-Ke*(xs+8),Hn=z.y-Kt*(xs+8),Ho=-Kt,jo=Ke,jn=28+y%3*14,Vn=y%2===0?1:-1,Vo=(Fn+Ln)/2+Ho*jn*Vn,Ko=(Dn+Hn)/2+jo*jn*Vn,Kn=Tt(L.edgeByEvent),Un=Number(L.lastAtMs||0)>0&&Oe-Number(L.lastAtMs||0)<=5e3;return{key:L.key,from:L.from,to:L.to,d:`M ${Fn} ${Dn} Q ${Vo} ${Ko} ${Ln} ${Hn}`,width:(.9+Number(L.weight||0)/he*1.7).toFixed(2),color:n[Kn]||n.other,opacity:Un?.82:.24,markerId:`flow-arrow-${Kn}`,tooltip:`${L.from} -> ${L.to} | traffic: ${Number(L.weight||0)}${L.delta?` | delta: ${L.delta>0?"+":""}${L.delta}`:""}`,active:Un}}).filter(Boolean);return{width:be,height:Fe,telemetryWindowSec:Number(p&&p.telemetryWindowSec?p.telemetryWindowSec:0),nodes:j.map(L=>{const y=ae.get(L.id),P=Number(L.lastSeenAtMs||0);return Object.assign({},L,y,{shortLabel:ke(L.displayId||L.id),shortSubtitle:Ss(L.subtitle),shortPayload:Js(L.payload),isIdle:P>0&&Oe-P>45e3})}),edges:je,maxNodes:F,selectedCount:C.size}}const It=Ee(()=>o.nodes.find(p=>p.id===o.selectedNodeId)||null),de=Ee(()=>o.stateData&&o.stateData.summary?o.stateData.summary:{}),Vt=Ee(()=>o.stateData&&o.stateData.node?o.stateData.node:{}),a=Ee(()=>Array.isArray(o.stateData&&o.stateData.anomalies)?o.stateData.anomalies.slice().reverse():[]),d=Ee(()=>Array.isArray(de.value.topGAs)?de.value.topGAs.slice(0,10):[]),m=Ee(()=>{const p=de.value&&de.value.byEvent&&typeof de.value.byEvent=="object"?de.value.byEvent:{};return Object.keys(p).map(c=>({name:c,count:Number(p[c]||0)})).filter(c=>c.count>0).sort((c,f)=>f.count-c.count)}),x=Ee(()=>Math.max(...m.value.map(p=>p.count),1)),w=Ee(()=>jt(o.stateData)),_=Ee(()=>ts(w.value)),N=Ee(()=>{const p=String(o.flowSearch||"").trim().toLowerCase();return w.value.nodes.slice().sort((c,f)=>String(c.id||"").localeCompare(String(f.id||""))).filter(c=>p?`${c.id} ${c.subtitle||""}`.toLowerCase().includes(p):!0).slice(0,120)}),A=Ee(()=>de.value&&de.value.busConnection&&typeof de.value.busConnection=="object"?de.value.busConnection:null),E=Ee(()=>{const p=de.value||{};if(!Object.keys(p).length)return"No data available.";const c=p.counters||{},f=[];return f.push(Vt.value.name||It.value?.name||"KNX AI"),f.push(`Analysis window: ${Number(p.meta?.analysisWindowSec||0)}s`),f.push(`Telegrams: ${Number(c.telegrams||0)} | Rate: ${Number(c.overallRatePerSec||0)}/s`),f.push(`Echoed: ${Number(c.echoed||0)} | Repeat: ${Number(c.repeated||0)} | Unknown DPT: ${Number(c.unknownDpt||0)}`),A.value&&f.push(`Bus: ${String(A.value.currentState||"unknown")} | Connected: ${Number(A.value.connectedPct||0)}% | Disconnected: ${Number(A.value.disconnectedPct||0)}%`),f.join(`
3
+ `)}),S=Ee(()=>{const p=A.value;return!p||!Array.isArray(p.segments)?[]:p.segments.map((c,f)=>{const C=Math.max(0,Math.min(1,Number(c&&c.ratioStart)||0)),F=Math.max(0,Math.min(1,Number(c&&c.ratioWidth)||0));return{key:`${f}-${c?.startedAt||""}`,left:`${(C*100).toFixed(3)}%`,width:`${Math.max(F*100,.4).toFixed(3)}%`,title:`${c?.state==="connected"?"Connected":"Disconnected"} | ${X(c?.startedAt)} -> ${X(c?.endedAt)} | ${oe(c?.durationSec||0)}`,className:c?.state==="connected"?"segment-connected":"segment-disconnected"}}).filter(c=>Number.parseFloat(c.width)>0)}),O=Ee(()=>o.chatMessages.map((p,c)=>({key:`${c}-${p.kind}`,kind:p.kind,rawText:k(p.text),html:p.kind==="assistant"?ye(p.text):""})));At(()=>o.selectedNodeId,p=>{b(Nr,p||"")}),At(()=>o.autoRefresh,p=>{T(Mr,p)}),At(()=>o.theme,p=>{b(Cr,ue(p)),R()}),At(()=>o.flowMaxNodes,p=>{o.flowMaxNodes=Math.max(4,Math.min(32,Number(p)||14)),I()}),At(()=>(o.flowSelectedGa||[]).join("|"),()=>{I()});function M(p,c){o.chatMessages.push({kind:p,text:c})}function $(){o.chatMessages=[]}function R(){const p="knx-ai-theme-link-vue";let c=document.getElementById(p);c||(c=document.createElement("link"),c.id=p,c.rel="stylesheet",document.head.appendChild(c));const f=ue(o.theme),C=te(`theme/${f}.css`);c.getAttribute("href")!==C&&(c.setAttribute("href",C),document.documentElement.setAttribute("data-theme",f))}function q(p){const c=r&&p.find(F=>F.id===r)?r:"",f=u(Nr,""),C=f&&p.find(F=>F.id===f)?f:"";return c||C||(p[0]?p[0].id:"")}async function Q({preserveSelection:p=!0}={}){o.loadingNodes=!0,K("Loading nodes...");try{const c=await se(te("nodes")),f=Array.isArray(c&&c.nodes)?c.nodes:[];if(o.nodes=f,!f.length){o.selectedNodeId="",o.stateData=null,o.lastError="No KNX AI nodes found.",K(o.lastError);return}const C=p&&o.selectedNodeId&&f.find(F=>F.id===o.selectedNodeId)?o.selectedNodeId:q(f);o.selectedNodeId=C,o.lastError="",K("Ready")}catch(c){o.lastError=c.message||"Failed to load nodes",K(o.lastError)}finally{o.loadingNodes=!1}}async function J({fresh:p=!1}={}){if(!(!o.selectedNodeId||o.loadingState)){o.loadingState=!0,p&&K("Loading...");try{const c=await se(te(`state?nodeId=${encodeURIComponent(o.selectedNodeId)}&fresh=${p?1:0}`));o.stateData=c,o.lastError="",K("Ready")}catch(c){o.lastError=c.message||"Failed to load state",K(o.lastError)}finally{o.loadingState=!1}}}async function _e(){await Q({preserveSelection:!0}),await J({fresh:!0})}async function ve(){$(),await J({fresh:!0})}async function Te(p=""){const c=String(p||"").trim(),f=c||String(o.chatDraft||"").trim();if(!(!f||!o.selectedNodeId)){M("user",f),c||(o.chatDraft=""),o.asking=!0,K("Asking...");try{const C=await se(te("ask"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:o.selectedNodeId,question:f})});M("assistant",C&&C.answer!==void 0?C.answer:""),K("Ready")}catch(C){M("error",C.message||"Ask failed"),K(C.message||"Ask failed")}finally{o.asking=!1}}}function Re(){o.pollStateHandle||(o.pollStateHandle=window.setInterval(()=>{o.autoRefresh&&J({fresh:!1})},1500)),o.pollNodesHandle||(o.pollNodesHandle=window.setInterval(()=>{Q({preserveSelection:!0})},15e3))}function $t(){o.pollStateHandle&&(window.clearInterval(o.pollStateHandle),o.pollStateHandle=null),o.pollNodesHandle&&(window.clearInterval(o.pollNodesHandle),o.pollNodesHandle=null)}return fo(async()=>{document.addEventListener("fullscreenchange",H),R(),await Q({preserveSelection:!1}),await J({fresh:!0}),Re()}),ho(()=>{document.removeEventListener("fullscreenchange",H),$t()}),(p,c)=>(B(),W("div",vc,[v("header",wc,[c[9]||(c[9]=v("div",{class:"brand"},[v("p",{class:"eyebrow"},"Vue Preview"),v("h1",null,"KNX AI Web"),v("p",{class:"subhead"},"Nuova UI in Vue 3, servita dal backend di Node-RED. Ora include anche una flow map SVG nativa per lavorare senza uscire dalla preview.")],-1)),v("div",Sc,[v("div",xc,[(B(),W(pe,null,De(t,f=>v("button",{key:f,class:Qe(["theme-button",{active:o.theme===f}]),type:"button",onClick:C=>o.theme=f},V(f),11,Ac)),64))]),Bt(v("select",{"onUpdate:modelValue":c[0]||(c[0]=f=>o.selectedNodeId=f),class:"node-select",onChange:ve},[(B(!0),W(pe,null,De(o.nodes,f=>(B(),W("option",{key:f.id,value:f.id},V(`${f.name||"KNX AI"}${f.gatewayName?` | ${f.gatewayName}`:""}`),9,Ec))),128))],544),[[xr,o.selectedNodeId]]),v("label",Nc,[Bt(v("input",{"onUpdate:modelValue":c[1]||(c[1]=f=>o.autoRefresh=f),type:"checkbox"},null,512),[[cc,o.autoRefresh]]),c[8]||(c[8]=v("span",null,"Auto refresh",-1))]),v("button",{class:"primary-button",type:"button",disabled:o.loadingNodes||o.loadingState,onClick:_e}," Refresh ",8,Mc)]),v("div",Cc,[v("span",{class:Qe(["status-pill",{error:!!o.lastError}])},V(o.status),3),It.value?(B(),W("span",Tc,"Provider: "+V(It.value.llmProvider||"n/a")+" | Model: "+V(It.value.llmModel||"n/a"),1)):St("",!0)])]),v("main",Ic,[v("section",$c,[v("div",Oc,[c[10]||(c[10]=v("h2",null,"Summary",-1)),de.value.meta?.generatedAt?(B(),W("span",Pc,V(lt(de.value.meta.generatedAt)),1)):St("",!0)]),v("pre",kc,V(E.value),1),v("div",Rc,[v("article",Fc,[c[11]||(c[11]=v("span",null,"Telegrams",-1)),v("strong",null,V(Number(de.value.counters?.telegrams||0)),1)]),v("article",Dc,[c[12]||(c[12]=v("span",null,"Rate",-1)),v("strong",null,V(Number(de.value.counters?.overallRatePerSec||0))+"/s",1)]),v("article",Lc,[c[13]||(c[13]=v("span",null,"Repeat",-1)),v("strong",null,V(Number(de.value.counters?.repeated||0)),1)]),v("article",Hc,[c[14]||(c[14]=v("span",null,"Unknown DPT",-1)),v("strong",null,V(Number(de.value.counters?.unknownDpt||0)),1)])])]),v("section",jc,[v("div",Vc,[c[15]||(c[15]=v("h2",null,"Top Group Addresses",-1)),v("span",Kc,V(d.value.length)+" visible",1)]),d.value.length?(B(),W("ul",Uc,[(B(!0),W(pe,null,De(d.value,f=>(B(),W("li",{key:f.ga,class:"rank-row"},[v("span",Bc,V(f.ga),1),v("span",Wc,V(f.label||"Unlabeled"),1),v("strong",null,V(Number(f.count||0)),1)]))),128))])):(B(),W("p",Gc,"No top group address data available yet."))]),v("section",qc,[v("div",zc,[c[16]||(c[16]=v("h2",null,"Event Mix",-1)),v("span",Jc,V(m.value.length)+" event types",1)]),m.value.length?(B(),W("ul",Xc,[(B(!0),W(pe,null,De(m.value,f=>(B(),W("li",{key:f.name,class:"event-row"},[v("span",Yc,V(f.name),1),v("div",Qc,[v("span",{class:"event-bar-fill",style:ds({width:`${Math.max(f.count/x.value*100,6)}%`})},null,4)]),v("strong",null,V(f.count),1)]))),128))])):(B(),W("p",Zc,"Event distribution will appear after the first samples."))]),v("section",ea,[v("div",ta,[c[17]||(c[17]=v("h2",null,"Bus Connection Persistence",-1)),A.value?(B(),W("span",sa,V(String(A.value.currentState||"unknown")),1)):St("",!0)]),A.value?(B(),W(pe,{key:0},[v("div",na,[v("span",ra,"Connected "+V(oe(A.value.connectedSec||0)),1),v("span",oa,"Disconnected "+V(oe(A.value.disconnectedSec||0)),1),v("span",ia,"Coverage "+V(Number(A.value.knownCoveragePct||0))+"%",1)]),v("div",la,[(B(!0),W(pe,null,De(S.value,f=>(B(),W("span",{key:f.key,class:Qe(["bus-segment",f.className]),style:ds({left:f.left,width:f.width}),title:f.title},null,14,ca))),128))]),v("div",aa,[v("span",null,V(X(A.value.windowStartAt)),1),v("span",null,V(X(A.value.windowEndAt)),1),c[18]||(c[18]=v("span",null,"Now",-1))]),c[19]||(c[19]=v("p",{class:"bus-note"},"Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.",-1))],64)):(B(),W("p",ua,"Waiting for connection persistence data..."))]),v("section",{ref_key:"flowCardRef",ref:i,class:Qe(["card card-flow",{"is-fullscreen":l.value}])},[v("div",fa,[c[20]||(c[20]=v("h2",null,"Flow Map",-1)),v("div",da,[v("span",ha," Nodes "+V(_.value.nodes.length)+" | Links "+V(_.value.edges.length),1),v("button",{class:"secondary-button",type:"button",onClick:Y},V(l.value?"Exit Fullscreen":"Fullscreen"),1)])]),v("div",pa,[v("label",ga,[c[21]||(c[21]=v("span",null,"Max nodes",-1)),Bt(v("input",{"onUpdate:modelValue":c[2]||(c[2]=f=>o.flowMaxNodes=f),type:"number",min:"4",max:"32",step:"1"},null,512),[[ln,o.flowMaxNodes,void 0,{number:!0}]])]),v("label",ma,[c[22]||(c[22]=v("span",null,"Find GA",-1)),Bt(v("input",{"onUpdate:modelValue":c[3]||(c[3]=f=>o.flowSearch=f),type:"text",placeholder:"Search GA or label"},null,512),[[ln,o.flowSearch]])]),v("label",ya,[c[23]||(c[23]=v("span",null,"Focus nodes",-1)),Bt(v("select",{"onUpdate:modelValue":c[4]||(c[4]=f=>o.flowSelectedGa=f),multiple:"",size:"5"},[(B(!0),W(pe,null,De(N.value,f=>(B(),W("option",{key:f.id,value:f.id},V(`${f.id}${f.subtitle?` | ${f.subtitle}`:""}`),9,ba))),128))],512),[[xr,o.flowSelectedGa]])]),c[24]||(c[24]=Tl('<div class="flow-legend" data-v-d00cc40d><span data-v-d00cc40d><i class="legend-line legend-write" data-v-d00cc40d></i>Write</span><span data-v-d00cc40d><i class="legend-line legend-response" data-v-d00cc40d></i>Response</span><span data-v-d00cc40d><i class="legend-line legend-read" data-v-d00cc40d></i>Read</span><span data-v-d00cc40d><i class="legend-line legend-repeat" data-v-d00cc40d></i>Repeat</span><span data-v-d00cc40d><i class="legend-dot legend-anomaly" data-v-d00cc40d></i>Anomaly</span><span data-v-d00cc40d><i class="legend-dot legend-external" data-v-d00cc40d></i>External</span></div>',1))]),v("div",_a,[_.value.nodes.length?(B(),W("svg",{key:0,class:"flow-svg",viewBox:`0 0 ${_.value.width} ${_.value.height}`,preserveAspectRatio:"xMidYMid meet"},[v("defs",null,[(B(),W(pe,null,De(n,(f,C)=>v("marker",{id:`flow-arrow-${C}`,key:C,viewBox:"0 0 10 8",markerWidth:"10",markerHeight:"8",refX:"8.8",refY:"4",orient:"auto",markerUnits:"userSpaceOnUse"},[v("path",{d:"M0,0 L10,4 L0,8 z",fill:f},null,8,Sa)],8,wa)),64))]),(B(!0),W(pe,null,De(_.value.edges,f=>(B(),W("path",{key:f.key,class:Qe(["flow-edge",{"flow-edge-active":f.active,"flow-edge-idle":!f.active}]),d:f.d,stroke:f.color,"stroke-width":f.width,opacity:f.opacity,"marker-end":`url(#${f.markerId})`},[v("title",null,V(f.tooltip),1)],10,xa))),128)),(B(!0),W(pe,null,De(_.value.nodes,f=>(B(),W("g",{key:f.id,class:Qe(["flow-node",{"is-anomaly":f.anomalyCount>0,"is-external":!f.inFlow,"is-idle":f.isIdle}])},[v("circle",{cx:f.x,cy:f.y,r:"24"},null,8,Aa),v("text",{class:"node-label",x:f.x,y:f.y+1},V(f.shortLabel),9,Ea),f.shortSubtitle?(B(),W("text",{key:0,class:"node-subtitle",x:f.x,y:f.y+38},V(f.shortSubtitle),9,Na)):St("",!0),f.shortPayload?(B(),W("text",{key:1,class:"node-payload",x:f.x,y:f.y+52},V(f.shortPayload),9,Ma)):St("",!0),f.anomalyCount>0?(B(),W("text",{key:2,class:"node-badge",x:f.x,y:f.y-30},"anomaly x"+V(f.anomalyCount),9,Ca)):St("",!0),v("title",null,V(`${f.id}${f.subtitle?` | ${f.subtitle}`:""}${f.payload?` | payload: ${f.payload}`:""}`),1)],2))),128))],8,va)):(B(),W("p",Ta,"No topology data available yet."))]),v("p",Ia,"Window "+V(_.value.telemetryWindowSec||0)+"s.",1)],2),v("section",$a,[v("div",Oa,[c[25]||(c[25]=v("h2",null,"Anomalies",-1)),v("span",Pa,V(a.value.length)+" recent",1)]),a.value.length?(B(),W("div",ka,[(B(!0),W(pe,null,De(a.value.slice(0,20),f=>(B(),W("article",{key:`${f.at}-${ct(f).ga||""}`,class:"anomaly-card"},[v("div",Ra,[v("strong",null,V(ct(f).type||"anomaly"),1),v("span",null,V(ct(f).ga||"no GA"),1)]),v("p",Fa,V(f.at||""),1),v("pre",null,V(JSON.stringify(ct(f),null,2)),1)]))),128))])):(B(),W("p",Da,"No anomalies detected right now."))]),v("section",La,[v("div",Ha,[c[26]||(c[26]=v("h2",null,"Ask",-1)),v("span",ja,V(Vt.value.llmEnabled?"LLM enabled":"LLM disabled"),1)]),v("div",Va,[(B(),W(pe,null,De(s,f=>v("button",{key:f,class:"preset-button",type:"button",disabled:o.asking||!Vt.value.llmEnabled,onClick:C=>Te(f)},V(f),9,Ka)),64))]),v("div",Ua,[Bt(v("input",{"onUpdate:modelValue":c[5]||(c[5]=f=>o.chatDraft=f),class:"ask-input",type:"text",disabled:o.asking||!Vt.value.llmEnabled,placeholder:"Ask a question about KNX traffic...",onKeydown:c[6]||(c[6]=hc(fc(f=>Te(),["prevent"]),["enter"]))},null,40,Ba),[[ln,o.chatDraft]]),v("button",{class:"primary-button",type:"button",disabled:o.asking||!Vt.value.llmEnabled,onClick:c[7]||(c[7]=f=>Te())}," Send ",8,Wa)]),v("div",Ga,[(B(!0),W(pe,null,De(O.value,f=>(B(),W("article",{key:f.key,class:Qe(["chat-message",`chat-${f.kind}`])},[f.kind==="assistant"?(B(),W("div",{key:0,innerHTML:f.html},null,8,qa)):(B(),W("pre",za,V(f.rawText),1))],2))),128)),o.asking?(B(),W("article",Ja,"Thinking...")):St("",!0),!O.value.length&&!o.asking?(B(),W("p",Xa,"Ask a question about KNX traffic. SVG responses are supported here as well.")):St("",!0)])])])]))}},Qa=_c(Ya,[["__scopeId","data-v-d00cc40d"]]);mc(Qa).mount("#app");
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>KNX AI Vue Preview</title>
7
+ <script type="module" crossorigin src="/knxUltimateAI/sidebar/page/assets/app.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/knxUltimateAI/sidebar/page/assets/app.css">
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ </body>
13
+ </html>
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "engines": {
4
4
  "node": ">=20.18.1"
5
5
  },
6
- "version": "4.1.35",
6
+ "version": "4.2.2",
7
7
  "description": "Control your KNX and KNX Secure intallation via Node-Red! A bunch of KNX nodes, with integrated Philips HUE control, ETS group address importer, and KNX routing between interfaces. Easy to use and highly configurable.",
8
8
  "files": [
9
9
  "nodes/",
@@ -18,7 +18,7 @@
18
18
  "dependencies": {
19
19
  "dns-sync": "0.2.1",
20
20
  "js-yaml": "4.1.1",
21
- "knxultimate": "5.2.11",
21
+ "knxultimate": "5.4.0",
22
22
  "lodash": "4.17.21",
23
23
  "node-color-log": "12.0.1",
24
24
  "ping": "0.4.4",
@@ -83,9 +83,13 @@
83
83
  "author": "Supergiovane",
84
84
  "license": "MIT",
85
85
  "scripts": {
86
+ "build": "npm run knx-ai:build",
87
+ "prepack": "npm run knx-ai:build",
86
88
  "test": "DEBUG_KNX_HUE_TEST=0 npm run test:unit && node scripts/check-node-load.js",
87
89
  "test:unit": "mocha \"test/**/*.test.js\"",
88
90
  "lint-fix": "standard --fix",
91
+ "knx-ai:dev": "vite --config ui/knxUltimateAI-vue/vite.config.mjs",
92
+ "knx-ai:build": "vite build --config ui/knxUltimateAI-vue/vite.config.mjs",
89
93
  "translate-wiki": "node scripts/translate-wiki.js",
90
94
  "wiki:help-export": "node scripts/help-to-wiki.js",
91
95
  "wiki:validate": "node scripts/validate-wiki-languagebar.js",
@@ -99,6 +103,9 @@
99
103
  "docs:serve:norl": "node scripts/dev-serve-docs.js"
100
104
  },
101
105
  "devDependencies": {
106
+ "@vitejs/plugin-vue": "^6.0.1",
107
+ "vite": "^7.1.3",
108
+ "vue": "^3.5.21",
102
109
  "translate-google": "^1.5.0",
103
110
  "chai": "^4.3.10",
104
111
  "mocha": "^10.4.0",