From 87859397dfb4f575f45459209ddf906217c3339a Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Mon, 6 Oct 2025 06:01:41 +0200 Subject: [PATCH] Sort le serveur dans une crate pmoserver --- Cargo.lock | 133 ++------- Cargo.toml | 2 +- PMOMusic/Cargo.toml | 1 + PMOMusic/src/main.rs | 8 +- pmoserver/Cargo.toml | 27 ++ pmoserver/src/lib.rs | 79 ++++++ .../src/server => pmoserver/src}/logs/mod.rs | 0 .../server => pmoserver/src}/logs/sselayer.rs | 0 .../server/mod.rs => pmoserver/src/server.rs | 2 - pmoserver/src/upnp_impl.rs | 94 +++++++ pmoserver/webapp/dist/.gitkeep | 0 .../webapp/dist/assets/index-B3fd9aU-.js | 81 ++++++ .../webapp/dist/assets/index-Qw8Jzbm-.css | 1 + pmoserver/webapp/dist/index.html | 14 + pmoserver/webapp/dist/vite.svg | 1 + pmoupnp/Cargo.toml | 16 +- pmoupnp/src/devices/device_instance.rs | 2 +- pmoupnp/src/lib.rs | 3 + pmoupnp/src/server.rs | 262 ++++++++++++++++++ pmoupnp/src/services/service_instance.rs | 20 +- 20 files changed, 606 insertions(+), 140 deletions(-) create mode 100644 pmoserver/Cargo.toml create mode 100644 pmoserver/src/lib.rs rename {pmoupnp/src/server => pmoserver/src}/logs/mod.rs (100%) rename {pmoupnp/src/server => pmoserver/src}/logs/sselayer.rs (100%) rename pmoupnp/src/server/mod.rs => pmoserver/src/server.rs (99%) create mode 100644 pmoserver/src/upnp_impl.rs create mode 100644 pmoserver/webapp/dist/.gitkeep create mode 100644 pmoserver/webapp/dist/assets/index-B3fd9aU-.js create mode 100644 pmoserver/webapp/dist/assets/index-Qw8Jzbm-.css create mode 100644 pmoserver/webapp/dist/index.html create mode 100644 pmoserver/webapp/dist/vite.svg create mode 100644 pmoupnp/src/server.rs diff --git a/Cargo.lock b/Cargo.lock index 2d2863b5..5ec069dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,7 @@ version = "0.1.0" dependencies = [ "axum", "pmoconfig", + "pmoserver", "pmoupnp", "serde_json", "tokio", @@ -467,41 +468,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn", -] - [[package]] name = "derive_arbitrary" version = "1.4.2" @@ -1129,12 +1095,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "1.1.0" @@ -1511,41 +1471,50 @@ dependencies = [ ] [[package]] -name = "pmoupnp" +name = "pmoserver" version = "0.1.0" dependencies = [ - "anyhow", "async-stream", "axum", "axum-embed", "axum-server", + "futures", + "futures-util", + "pmoconfig", + "pmoupnp", + "rust-embed", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tracing", + "tracing-subscriber", + "utoipa", + "utoipa-swagger-ui", +] + +[[package]] +name = "pmoupnp" +version = "0.1.0" +dependencies = [ + "axum", "base64", "bevy_reflect", "bevy_reflect_derive", "chrono", - "futures", - "futures-util", - "get_if_addrs", "hex", - "log", "once_cell", "parking_lot", "pmoconfig", "pmodidl", "reqwest", - "rust-embed", "serde", "serde_json", "thiserror", "tokio", - "tokio-stream", "tracing", - "tracing-subscriber", "url", - "utoipa", - "utoipa-swagger-ui", "uuid", - "validator", "xmltree", ] @@ -1580,28 +1549,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.101" @@ -2050,12 +1997,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - [[package]] name = "subtle" version = "2.6.1" @@ -2492,36 +2433,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "validator" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43fb22e1a008ece370ce08a3e9e4447a910e92621bb49b85d6e48a45397e7cfa" -dependencies = [ - "idna", - "once_cell", - "regex", - "serde", - "serde_derive", - "serde_json", - "url", - "validator_derive", -] - -[[package]] -name = "validator_derive" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7df16e474ef958526d1205f6dda359fdfab79d9aa6d54bafcb92dcd07673dca" -dependencies = [ - "darling", - "once_cell", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "valuable" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index ea24bbb2..f68aa1aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] resolver = "3" -members = ["PMOMusic", "pmoupnp","pmoconfig", "pmoutils", "pmodidl"] +members = ["PMOMusic", "pmoupnp","pmoconfig", "pmoutils", "pmodidl", "pmoserver"] diff --git a/PMOMusic/Cargo.toml b/PMOMusic/Cargo.toml index 05a06ed5..10ad334e 100644 --- a/PMOMusic/Cargo.toml +++ b/PMOMusic/Cargo.toml @@ -6,6 +6,7 @@ edition = "2024" [dependencies] pmoconfig = { path = "../pmoconfig" } pmoupnp = { path = "../pmoupnp"} +pmoserver = { path = "../pmoserver" } tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync", "time","signal"] } diff --git a/PMOMusic/src/main.rs b/PMOMusic/src/main.rs index f0d7a29b..b24695ff 100644 --- a/PMOMusic/src/main.rs +++ b/PMOMusic/src/main.rs @@ -1,6 +1,8 @@ -use pmoupnp::{mediarenderer::avtransport::{actions::SETAVTRANSPORTURI, AVTTRANSPORT}, server::{ - logs::{log_dump, log_sse, LogState, SseLayer}, ServerBuilder, Webapp -}, UpnpObject}; // ton module pmoupnp::server +use pmoupnp::{mediarenderer::avtransport::AVTTRANSPORT, UpnpObject}; +use pmoserver::{ + logs::{log_dump, log_sse, LogState, SseLayer}, + ServerBuilder, Webapp +}; use tracing_subscriber::Registry; use tracing_subscriber::prelude::*; use tracing::info; diff --git a/pmoserver/Cargo.toml b/pmoserver/Cargo.toml new file mode 100644 index 00000000..d5d74ddd --- /dev/null +++ b/pmoserver/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "pmoserver" +version = "0.1.0" +edition = "2024" + +[dependencies] +pmoconfig = { path = "../pmoconfig" } + +axum = "0.8.4" +tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync", "time", "signal"] } +tokio-stream = "0.1" +futures-util = "0.3" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] } +futures = "0.3" +async-stream = "0.3.6" +axum-server = "0.7.2" +axum-embed = "0.1.0" +rust-embed = "8.7.2" +utoipa = { version = "5.4.0", features = ["axum_extras"] } +utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] } + +[dependencies.pmoupnp] +path = "../pmoupnp" +default-features = false diff --git a/pmoserver/src/lib.rs b/pmoserver/src/lib.rs new file mode 100644 index 00000000..288a20c4 --- /dev/null +++ b/pmoserver/src/lib.rs @@ -0,0 +1,79 @@ +//! # pmoserver - Serveur web haut niveau basé sur Axum +//! +//! Cette crate fournit une abstraction simple et ergonomique pour créer des serveurs HTTP +//! avec Axum, spécialement conçue pour les applications UPnP et les serveurs multimédia. +//! +//! ## Fonctionnalités +//! +//! - 🚀 **API de haut niveau** : Interface simple pour créer des serveurs HTTP avec Axum +//! - 🎯 **Support UPnP** : Implémentation du trait `UpnpServer` pour connecter des devices UPnP +//! - 📡 **Server-Sent Events (SSE)** : Support intégré pour les logs en temps réel via SSE +//! - ⚛️ **Applications SPA** : Support pour servir des applications Single Page (Vue.js, React, etc.) +//! - 📁 **Fichiers statiques** : Serve de fichiers statiques avec `RustEmbed` +//! - 🔀 **Redirections** : Support pour les redirections HTTP +//! - 📚 **Documentation OpenAPI** : Génération automatique de Swagger UI +//! - ⚡ **Arrêt gracieux** : Gestion propre de l'arrêt sur Ctrl+C +//! +//! ## Architecture +//! +//! La crate est organisée en plusieurs modules : +//! +//! - [`server`] : Implémentation du serveur principal et du builder +//! - [`logs`] : Système de logs SSE pour monitoring en temps réel +//! - `upnp_impl` : Implémentation du trait `pmoupnp::UpnpServer` (privé) +//! +//! ## Exemple d'utilisation +//! +//! ```rust,no_run +//! use pmoserver::{ServerBuilder, logs::{LogState, SseLayer}}; +//! use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; +//! +//! #[tokio::main] +//! async fn main() { +//! // Configuration des logs avec SSE +//! let log_state = LogState::new(); +//! tracing_subscriber::registry() +//! .with(SseLayer::new(log_state.clone())) +//! .init(); +//! +//! // Création et démarrage du serveur +//! let mut server = ServerBuilder::new("MyServer") +//! .http_port(8080) +//! .build(); +//! +//! // Ajout d'une route JSON +//! server.add_route("/api/status", || async { +//! serde_json::json!({"status": "ok"}) +//! }).await; +//! +//! // Démarrage +//! server.start().await; +//! } +//! ``` +//! +//! ## Intégration UPnP +//! +//! Le serveur implémente automatiquement le trait `pmoupnp::UpnpServer`, permettant +//! de connecter des devices UPnP : +//! +//! ```rust,no_run +//! use pmoupnp::{UpnpServer, mediarenderer::device::MEDIA_RENDERER}; +//! use pmoupnp::devices::DeviceInstance; +//! use pmoserver::ServerBuilder; +//! use std::sync::Arc; +//! +//! # async fn example() { +//! let mut server = ServerBuilder::new("MediaRenderer").build(); +//! let device = Arc::new(DeviceInstance::new(&MEDIA_RENDERER)); +//! +//! // Le device enregistre automatiquement ses routes +//! device.register_urls(&mut server).await; +//! # } +//! ``` + +pub mod server; +pub mod logs; +mod upnp_impl; + +pub use server::{Server, ServerBuilder, ServerInfo, Webapp}; +pub use logs::{LogState, SseLayer, log_sse, log_dump}; diff --git a/pmoupnp/src/server/logs/mod.rs b/pmoserver/src/logs/mod.rs similarity index 100% rename from pmoupnp/src/server/logs/mod.rs rename to pmoserver/src/logs/mod.rs diff --git a/pmoupnp/src/server/logs/sselayer.rs b/pmoserver/src/logs/sselayer.rs similarity index 100% rename from pmoupnp/src/server/logs/sselayer.rs rename to pmoserver/src/logs/sselayer.rs diff --git a/pmoupnp/src/server/mod.rs b/pmoserver/src/server.rs similarity index 99% rename from pmoupnp/src/server/mod.rs rename to pmoserver/src/server.rs index 303931ce..7cd06655 100644 --- a/pmoupnp/src/server/mod.rs +++ b/pmoserver/src/server.rs @@ -13,8 +13,6 @@ //! - 📚 **Documentation API** : OpenAPI/Swagger automatique avec `add_openapi()` //! - ⚡ **Gestion gracieuse** : Arrêt propre sur Ctrl+C -pub mod logs; - use axum::handler::Handler; use axum::response::Redirect; use axum::routing::get; diff --git a/pmoserver/src/upnp_impl.rs b/pmoserver/src/upnp_impl.rs new file mode 100644 index 00000000..d877c108 --- /dev/null +++ b/pmoserver/src/upnp_impl.rs @@ -0,0 +1,94 @@ +//! Implémentation du trait UpnpServer pour le serveur pmoserver +//! +//! Ce module fournit l'implémentation du trait [`pmoupnp::UpnpServer`] pour +//! le [`Server`](crate::server::Server) de pmoserver, permettant aux devices +//! et services UPnP d'enregistrer automatiquement leurs endpoints HTTP. +//! +//! ## Architecture +//! +//! L'implémentation fait le pont entre : +//! - Les pointeurs de fonction du trait `UpnpServer` (agnostiques du framework web) +//! - Les handlers Axum (spécifiques à l'implémentation `pmoserver`) +//! +//! Chaque méthode du trait crée un wrapper qui : +//! 1. Convertit les pointeurs de fonction en closures compatibles Axum +//! 2. Délègue l'enregistrement aux méthodes internes du `Server` +//! 3. Retourne une future qui se résout une fois le handler enregistré +//! +//! ## Exemple d'utilisation +//! +//! ```rust,no_run +//! use pmoupnp::{UpnpServer, mediarenderer::device::MEDIA_RENDERER}; +//! use pmoupnp::devices::DeviceInstance; +//! use pmoserver::ServerBuilder; +//! use std::sync::Arc; +//! +//! # async fn example() { +//! let mut server = ServerBuilder::new("MyRenderer").build(); +//! let device = Arc::new(DeviceInstance::new(&MEDIA_RENDERER)); +//! +//! // Le trait UpnpServer est automatiquement disponible +//! device.register_urls(&mut server).await; +//! # } +//! ``` + +use crate::server::Server; +use pmoupnp::{UpnpServer, server::{Response, HeaderMap, Request}}; +use std::future::Future; +use std::pin::Pin; +use axum::extract::State; + +impl UpnpServer for Server { + fn add_handler(&mut self, path: &str, handler: F) -> Pin + Send + '_>> + where + F: Fn() -> Fut + Send + Sync + 'static + Clone, + Fut: Future + Send + 'static, + { + let path = path.to_string(); + Box::pin(async move { + Self::add_handler(self, &path, handler).await; + }) + } + + fn add_post_handler_with_state( + &mut self, + path: &str, + handler: fn(State, String) -> Pin + Send>>, + state: S, + ) -> Pin + Send + '_>> + where + S: Clone + Send + Sync + 'static, + { + let path = path.to_string(); + + // Créer un wrapper qui convertit le fn pointer en handler Axum + let wrapper = move |State(s): State, body: String| -> Pin + Send>> { + handler(State(s), body) + }; + + Box::pin(async move { + Self::add_post_handler_with_state(self, &path, wrapper, state).await; + }) + } + + fn add_handler_with_state( + &mut self, + path: &str, + handler: fn(State, HeaderMap, Request) -> Pin + Send>>, + state: S, + ) -> Pin + Send + '_>> + where + S: Clone + Send + Sync + 'static, + { + let path = path.to_string(); + + // Créer un wrapper qui convertit le fn pointer en handler Axum + let wrapper = move |State(s): State, headers: HeaderMap, req: Request| -> Pin + Send>> { + handler(State(s), headers, req) + }; + + Box::pin(async move { + Self::add_handler_with_state(self, &path, wrapper, state).await; + }) + } +} diff --git a/pmoserver/webapp/dist/.gitkeep b/pmoserver/webapp/dist/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/pmoserver/webapp/dist/assets/index-B3fd9aU-.js b/pmoserver/webapp/dist/assets/index-B3fd9aU-.js new file mode 100644 index 00000000..0d4c5d29 --- /dev/null +++ b/pmoserver/webapp/dist/assets/index-B3fd9aU-.js @@ -0,0 +1,81 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();/** +* @vue/shared v3.5.22 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Ir(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ae={},ln=[],mt=()=>{},Co=()=>!1,Ts=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Lr=e=>e.startsWith("onUpdate:"),Pe=Object.assign,Mr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ga=Object.prototype.hasOwnProperty,te=(e,t)=>ga.call(e,t),B=Array.isArray,an=e=>Kn(e)==="[object Map]",As=e=>Kn(e)==="[object Set]",yi=e=>Kn(e)==="[object Date]",V=e=>typeof e=="function",_e=e=>typeof e=="string",bt=e=>typeof e=="symbol",ce=e=>e!==null&&typeof e=="object",Oo=e=>(ce(e)||V(e))&&V(e.then)&&V(e.catch),Po=Object.prototype.toString,Kn=e=>Po.call(e),ma=e=>Kn(e).slice(8,-1),Io=e=>Kn(e)==="[object Object]",Dr=e=>_e(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,On=Ir(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Rs=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ba=/-\w/g,Qe=Rs(e=>e.replace(ba,t=>t.slice(1).toUpperCase())),_a=/\B([A-Z])/g,Qt=Rs(e=>e.replace(_a,"-$1").toLowerCase()),Cs=Rs(e=>e.charAt(0).toUpperCase()+e.slice(1)),qs=Rs(e=>e?`on${Cs(e)}`:""),Bt=(e,t)=>!Object.is(e,t),ls=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Mo=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let wi;const Os=()=>wi||(wi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Nr(e){if(B(e)){const t={};for(let n=0;n{if(n){const s=n.split(ya);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function cn(e){let t="";if(_e(e))t=e;else if(B(e))for(let n=0;nPs(n,t))}const No=e=>!!(e&&e.__v_isRef===!0),ht=e=>_e(e)?e:e==null?"":B(e)||ce(e)&&(e.toString===Po||!V(e.toString))?No(e)?ht(e.value):JSON.stringify(e,$o,2):String(e),$o=(e,t)=>No(t)?$o(e,t.value):an(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[Ks(s,i)+" =>"]=r,n),{})}:As(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Ks(n))}:bt(t)?Ks(t):ce(t)&&!B(t)&&!Io(t)?String(t):t,Ks=(e,t="")=>{var n;return bt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.22 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let je;class Aa{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=je,!t&&je&&(this.index=(je.scopes||(je.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(je=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(In){let t=In;for(In=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Pn;){let t=Pn;for(Pn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Uo(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Bo(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Hr(s),Ca(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function pr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(jo(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function jo(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Un)||(e.globalVersion=Un,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!pr(e))))return;e.flags|=2;const t=e.dep,n=fe,s=it;fe=e,it=!0;try{Uo(e);const r=e.fn(e._value);(t.version===0||Bt(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{fe=n,it=s,Bo(e),e.flags&=-3}}function Hr(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Hr(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Ca(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let it=!0;const Wo=[];function It(){Wo.push(it),it=!1}function Lt(){const e=Wo.pop();it=e===void 0?!0:e}function ki(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=fe;fe=void 0;try{t()}finally{fe=n}}}let Un=0;class Oa{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class zr{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(!fe||!it||fe===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==fe)n=this.activeLink=new Oa(fe,this),fe.deps?(n.prevDep=fe.depsTail,fe.depsTail.nextDep=n,fe.depsTail=n):fe.deps=fe.depsTail=n,Vo(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=fe.depsTail,n.nextDep=void 0,fe.depsTail.nextDep=n,fe.depsTail=n,fe.deps===n&&(fe.deps=s)}return n}trigger(t){this.version++,Un++,this.notify(t)}notify(t){$r();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Fr()}}}function Vo(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Vo(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const hr=new WeakMap,Zt=Symbol(""),dr=Symbol(""),Bn=Symbol("");function Re(e,t,n){if(it&&fe){let s=hr.get(e);s||hr.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new zr),r.map=s,r.key=n),r.track()}}function At(e,t,n,s,r,i){const o=hr.get(e);if(!o){Un++;return}const l=a=>{a&&a.trigger()};if($r(),t==="clear")o.forEach(l);else{const a=B(e),c=a&&Dr(n);if(a&&n==="length"){const u=Number(s);o.forEach((p,g)=>{(g==="length"||g===Bn||!bt(g)&&g>=u)&&l(p)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),c&&l(o.get(Bn)),t){case"add":a?c&&l(o.get("length")):(l(o.get(Zt)),an(e)&&l(o.get(dr)));break;case"delete":a||(l(o.get(Zt)),an(e)&&l(o.get(dr)));break;case"set":an(e)&&l(o.get(Zt));break}}Fr()}function sn(e){const t=ee(e);return t===e?t:(Re(t,"iterate",Bn),Xe(e)?t:t.map(ve))}function Is(e){return Re(e=ee(e),"iterate",Bn),e}const Pa={__proto__:null,[Symbol.iterator](){return Zs(this,Symbol.iterator,ve)},concat(...e){return sn(this).concat(...e.map(t=>B(t)?sn(t):t))},entries(){return Zs(this,"entries",e=>(e[1]=ve(e[1]),e))},every(e,t){return St(this,"every",e,t,void 0,arguments)},filter(e,t){return St(this,"filter",e,t,n=>n.map(ve),arguments)},find(e,t){return St(this,"find",e,t,ve,arguments)},findIndex(e,t){return St(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return St(this,"findLast",e,t,ve,arguments)},findLastIndex(e,t){return St(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return St(this,"forEach",e,t,void 0,arguments)},includes(...e){return Xs(this,"includes",e)},indexOf(...e){return Xs(this,"indexOf",e)},join(e){return sn(this).join(e)},lastIndexOf(...e){return Xs(this,"lastIndexOf",e)},map(e,t){return St(this,"map",e,t,void 0,arguments)},pop(){return _n(this,"pop")},push(...e){return _n(this,"push",e)},reduce(e,...t){return Si(this,"reduce",e,t)},reduceRight(e,...t){return Si(this,"reduceRight",e,t)},shift(){return _n(this,"shift")},some(e,t){return St(this,"some",e,t,void 0,arguments)},splice(...e){return _n(this,"splice",e)},toReversed(){return sn(this).toReversed()},toSorted(e){return sn(this).toSorted(e)},toSpliced(...e){return sn(this).toSpliced(...e)},unshift(...e){return _n(this,"unshift",e)},values(){return Zs(this,"values",ve)}};function Zs(e,t,n){const s=Is(e),r=s[t]();return s!==e&&!Xe(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const Ia=Array.prototype;function St(e,t,n,s,r,i){const o=Is(e),l=o!==e&&!Xe(e),a=o[t];if(a!==Ia[t]){const p=a.apply(e,i);return l?ve(p):p}let c=n;o!==e&&(l?c=function(p,g){return n.call(this,ve(p),g,e)}:n.length>2&&(c=function(p,g){return n.call(this,p,g,e)}));const u=a.call(o,c,s);return l&&r?r(u):u}function Si(e,t,n,s){const r=Is(e);let i=n;return r!==e&&(Xe(e)?n.length>3&&(i=function(o,l,a){return n.call(this,o,l,a,e)}):i=function(o,l,a){return n.call(this,o,ve(l),a,e)}),r[t](i,...s)}function Xs(e,t,n){const s=ee(e);Re(s,"iterate",Bn);const r=s[t](...n);return(r===-1||r===!1)&&jr(n[0])?(n[0]=ee(n[0]),s[t](...n)):r}function _n(e,t,n=[]){It(),$r();const s=ee(e)[t].apply(e,n);return Fr(),Lt(),s}const La=Ir("__proto__,__v_isRef,__isVue"),Go=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(bt));function Ma(e){bt(e)||(e=String(e));const t=ee(this);return Re(t,"has",e),t.hasOwnProperty(e)}class qo{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Wa:Xo:i?Zo:Yo).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=B(t);if(!r){let a;if(o&&(a=Pa[n]))return a;if(n==="hasOwnProperty")return Ma}const l=Reflect.get(t,n,Oe(t)?t:s);if((bt(n)?Go.has(n):La(n))||(r||Re(t,"get",n),i))return l;if(Oe(l)){const a=o&&Dr(n)?l:l.value;return r&&ce(a)?mr(a):a}return ce(l)?r?mr(l):Ls(l):l}}class Ko extends qo{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const a=jt(i);if(!Xe(s)&&!jt(s)&&(i=ee(i),s=ee(s)),!B(t)&&Oe(i)&&!Oe(s))return a||(i.value=s),!0}const o=B(t)&&Dr(n)?Number(n)e,ts=e=>Reflect.getPrototypeOf(e);function Ha(e,t,n){return function(...s){const r=this.__v_raw,i=ee(r),o=an(i),l=e==="entries"||e===Symbol.iterator&&o,a=e==="keys"&&o,c=r[e](...s),u=n?gr:t?hs:ve;return!t&&Re(i,"iterate",a?dr:Zt),{next(){const{value:p,done:g}=c.next();return g?{value:p,done:g}:{value:l?[u(p[0]),u(p[1])]:u(p),done:g}},[Symbol.iterator](){return this}}}}function ns(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function za(e,t){const n={get(r){const i=this.__v_raw,o=ee(i),l=ee(r);e||(Bt(r,l)&&Re(o,"get",r),Re(o,"get",l));const{has:a}=ts(o),c=t?gr:e?hs:ve;if(a.call(o,r))return c(i.get(r));if(a.call(o,l))return c(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&Re(ee(r),"iterate",Zt),r.size},has(r){const i=this.__v_raw,o=ee(i),l=ee(r);return e||(Bt(r,l)&&Re(o,"has",r),Re(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,a=ee(l),c=t?gr:e?hs:ve;return!e&&Re(a,"iterate",Zt),l.forEach((u,p)=>r.call(i,c(u),c(p),o))}};return Pe(n,e?{add:ns("add"),set:ns("set"),delete:ns("delete"),clear:ns("clear")}:{add(r){!t&&!Xe(r)&&!jt(r)&&(r=ee(r));const i=ee(this);return ts(i).has.call(i,r)||(i.add(r),At(i,"add",r,r)),this},set(r,i){!t&&!Xe(i)&&!jt(i)&&(i=ee(i));const o=ee(this),{has:l,get:a}=ts(o);let c=l.call(o,r);c||(r=ee(r),c=l.call(o,r));const u=a.call(o,r);return o.set(r,i),c?Bt(i,u)&&At(o,"set",r,i):At(o,"add",r,i),this},delete(r){const i=ee(this),{has:o,get:l}=ts(i);let a=o.call(i,r);a||(r=ee(r),a=o.call(i,r)),l&&l.call(i,r);const c=i.delete(r);return a&&At(i,"delete",r,void 0),c},clear(){const r=ee(this),i=r.size!==0,o=r.clear();return i&&At(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Ha(r,e,t)}),n}function Ur(e,t){const n=za(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(te(n,r)&&r in s?n:s,r,i)}const Ua={get:Ur(!1,!1)},Ba={get:Ur(!1,!0)},ja={get:Ur(!0,!1)};const Yo=new WeakMap,Zo=new WeakMap,Xo=new WeakMap,Wa=new WeakMap;function Va(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ga(e){return e.__v_skip||!Object.isExtensible(e)?0:Va(ma(e))}function Ls(e){return jt(e)?e:Br(e,!1,Na,Ua,Yo)}function Qo(e){return Br(e,!1,Fa,Ba,Zo)}function mr(e){return Br(e,!0,$a,ja,Xo)}function Br(e,t,n,s,r){if(!ce(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Ga(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function un(e){return jt(e)?un(e.__v_raw):!!(e&&e.__v_isReactive)}function jt(e){return!!(e&&e.__v_isReadonly)}function Xe(e){return!!(e&&e.__v_isShallow)}function jr(e){return e?!!e.__v_raw:!1}function ee(e){const t=e&&e.__v_raw;return t?ee(t):e}function qa(e){return!te(e,"__v_skip")&&Object.isExtensible(e)&&Lo(e,"__v_skip",!0),e}const ve=e=>ce(e)?Ls(e):e,hs=e=>ce(e)?mr(e):e;function Oe(e){return e?e.__v_isRef===!0:!1}function $t(e){return Jo(e,!1)}function Ka(e){return Jo(e,!0)}function Jo(e,t){return Oe(e)?e:new Ya(e,t)}class Ya{constructor(t,n){this.dep=new zr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:ee(t),this._value=n?t:ve(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Xe(t)||jt(t);t=s?t:ee(t),Bt(t,n)&&(this._rawValue=t,this._value=s?t:ve(t),this.dep.trigger())}}function fn(e){return Oe(e)?e.value:e}const Za={get:(e,t,n)=>t==="__v_raw"?e:fn(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return Oe(r)&&!Oe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function el(e){return un(e)?e:new Proxy(e,Za)}class Xa{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new zr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Un-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&fe!==this)return zo(this,!0),!0}get value(){const t=this.dep.track();return jo(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Qa(e,t,n=!1){let s,r;return V(e)?s=e:(s=e.get,r=e.set),new Xa(s,r,n)}const ss={},ds=new WeakMap;let Kt;function Ja(e,t=!1,n=Kt){if(n){let s=ds.get(n);s||ds.set(n,s=[]),s.push(e)}}function ec(e,t,n=ae){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:a}=n,c=A=>r?A:Xe(A)||r===!1||r===0?Rt(A,1):Rt(A);let u,p,g,b,k=!1,R=!1;if(Oe(e)?(p=()=>e.value,k=Xe(e)):un(e)?(p=()=>c(e),k=!0):B(e)?(R=!0,k=e.some(A=>un(A)||Xe(A)),p=()=>e.map(A=>{if(Oe(A))return A.value;if(un(A))return c(A);if(V(A))return a?a(A,2):A()})):V(e)?t?p=a?()=>a(e,2):e:p=()=>{if(g){It();try{g()}finally{Lt()}}const A=Kt;Kt=u;try{return a?a(e,3,[b]):e(b)}finally{Kt=A}}:p=mt,t&&r){const A=p,W=r===!0?1/0:r;p=()=>Rt(A(),W)}const j=Ra(),I=()=>{u.stop(),j&&j.active&&Mr(j.effects,u)};if(i&&t){const A=t;t=(...W)=>{A(...W),I()}}let O=R?new Array(e.length).fill(ss):ss;const M=A=>{if(!(!(u.flags&1)||!u.dirty&&!A))if(t){const W=u.run();if(r||k||(R?W.some((oe,K)=>Bt(oe,O[K])):Bt(W,O))){g&&g();const oe=Kt;Kt=u;try{const K=[W,O===ss?void 0:R&&O[0]===ss?[]:O,b];O=W,a?a(t,3,K):t(...K)}finally{Kt=oe}}}else u.run()};return l&&l(M),u=new Fo(p),u.scheduler=o?()=>o(M,!1):M,b=A=>Ja(A,!1,u),g=u.onStop=()=>{const A=ds.get(u);if(A){if(a)a(A,4);else for(const W of A)W();ds.delete(u)}},t?s?M(!0):O=u.run():o?o(M.bind(null,!0),!0):u.run(),I.pause=u.pause.bind(u),I.resume=u.resume.bind(u),I.stop=I,I}function Rt(e,t=1/0,n){if(t<=0||!ce(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Oe(e))Rt(e.value,t,n);else if(B(e))for(let s=0;s{Rt(s,t,n)});else if(Io(e)){for(const s in e)Rt(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Rt(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.22 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Yn(e,t,n,s){try{return s?e(...s):e()}catch(r){Ms(r,t,n)}}function _t(e,t,n,s){if(V(e)){const r=Yn(e,t,n,s);return r&&Oo(r)&&r.catch(i=>{Ms(i,t,n)}),r}if(B(e)){const r=[];for(let i=0;i>>1,r=De[s],i=jn(r);i=jn(n)?De.push(e):De.splice(nc(t),0,e),e.flags|=1,nl()}}function nl(){gs||(gs=tl.then(rl))}function sc(e){B(e)?pn.push(...e):Ft&&e.id===-1?Ft.splice(rn+1,0,e):e.flags&1||(pn.push(e),e.flags|=1),nl()}function Ei(e,t,n=pt+1){for(;njn(n)-jn(s));if(pn.length=0,Ft){Ft.push(...t);return}for(Ft=t,rn=0;rne.id==null?e.flags&2?-1:1/0:e.id;function rl(e){try{for(pt=0;pt{s._d&&xs(-1);const i=ms(t);let o;try{o=e(...r)}finally{ms(i),s._d&&xs(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function rc(e,t){if(Ge===null)return e;const n=zs(Ge),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport,lc=Symbol("_leaveCb");function Vr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Vr(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 Ns(e,t){return V(e)?Pe({name:e.name},t,{setup:e}):e}function ol(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}const bs=new WeakMap;function Ln(e,t,n,s,r=!1){if(B(e)){e.forEach((k,R)=>Ln(k,t&&(B(t)?t[R]:t),n,s,r));return}if(Mn(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Ln(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?zs(s.component):s.el,o=r?null:i,{i:l,r:a}=e,c=t&&t.r,u=l.refs===ae?l.refs={}:l.refs,p=l.setupState,g=ee(p),b=p===ae?Co:k=>te(g,k);if(c!=null&&c!==a){if(vi(t),_e(c))u[c]=null,b(c)&&(p[c]=null);else if(Oe(c)){c.value=null;const k=t;k.k&&(u[k.k]=null)}}if(V(a))Yn(a,l,12,[o,u]);else{const k=_e(a),R=Oe(a);if(k||R){const j=()=>{if(e.f){const I=k?b(a)?p[a]:u[a]:a.value;if(r)B(I)&&Mr(I,i);else if(B(I))I.includes(i)||I.push(i);else if(k)u[a]=[i],b(a)&&(p[a]=u[a]);else{const O=[i];a.value=O,e.k&&(u[e.k]=O)}}else k?(u[a]=o,b(a)&&(p[a]=o)):R&&(a.value=o,e.k&&(u[e.k]=o))};if(o){const I=()=>{j(),bs.delete(e)};I.id=-1,bs.set(e,I),Ve(I,n)}else vi(e),j()}}}function vi(e){const t=bs.get(e);t&&(t.flags|=8,bs.delete(e))}Os().requestIdleCallback;Os().cancelIdleCallback;const Mn=e=>!!e.type.__asyncLoader,ll=e=>e.type.__isKeepAlive;function ac(e,t){al(e,"a",t)}function cc(e,t){al(e,"da",t)}function al(e,t,n=Ce){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if($s(t,s,n),n){let r=n.parent;for(;r&&r.parent;)ll(r.parent.vnode)&&uc(s,t,n,r),r=r.parent}}function uc(e,t,n,s){const r=$s(t,e,s,!0);Gr(()=>{Mr(s[t],r)},n)}function $s(e,t,n=Ce,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{It();const l=Zn(n),a=_t(t,n,e,o);return l(),Lt(),a});return s?r.unshift(i):r.push(i),i}}const Mt=e=>(t,n=Ce)=>{(!Vn||e==="sp")&&$s(e,(...s)=>t(...s),n)},fc=Mt("bm"),cl=Mt("m"),pc=Mt("bu"),hc=Mt("u"),dc=Mt("bum"),Gr=Mt("um"),gc=Mt("sp"),mc=Mt("rtg"),bc=Mt("rtc");function _c(e,t=Ce){$s("ec",e,t)}const xc="components";function Ti(e,t){return wc(xc,e,!0,t)||e}const yc=Symbol.for("v-ndc");function wc(e,t,n=!0,s=!1){const r=Ge||Ce;if(r){const i=r.type;{const l=hu(i,!1);if(l&&(l===t||l===Qe(t)||l===Cs(Qe(t))))return i}const o=Ai(r[e]||i[e],t)||Ai(r.appContext[e],t);return!o&&s?i:o}}function Ai(e,t){return e&&(e[t]||e[Qe(t)]||e[Cs(Qe(t))])}function kc(e,t,n,s){let r;const i=n,o=B(e);if(o||_e(e)){const l=o&&un(e);let a=!1,c=!1;l&&(a=!Xe(e),c=jt(e),e=Is(e)),r=new Array(e.length);for(let u=0,p=e.length;ut(l,a,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let a=0,c=l.length;ae?Cl(e)?zs(e):_r(e.parent):null,Dn=Pe(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=>_r(e.parent),$root:e=>_r(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>fl(e),$forceUpdate:e=>e.f||(e.f=()=>{Wr(e.update)}),$nextTick:e=>e.n||(e.n=Ds.bind(e.proxy)),$watch:e=>jc.bind(e)}),Qs=(e,t)=>e!==ae&&!e.__isScriptSetup&&te(e,t),Sc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:a}=e;let c;if(t[0]!=="$"){const b=o[t];if(b!==void 0)switch(b){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Qs(s,t))return o[t]=1,s[t];if(r!==ae&&te(r,t))return o[t]=2,r[t];if((c=e.propsOptions[0])&&te(c,t))return o[t]=3,i[t];if(n!==ae&&te(n,t))return o[t]=4,n[t];xr&&(o[t]=0)}}const u=Dn[t];let p,g;if(u)return t==="$attrs"&&Re(e.attrs,"get",""),u(e);if((p=l.__cssModules)&&(p=p[t]))return p;if(n!==ae&&te(n,t))return o[t]=4,n[t];if(g=a.config.globalProperties,te(g,t))return g[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Qs(r,t)?(r[t]=n,!0):s!==ae&&te(s,t)?(s[t]=n,!0):te(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i,type:o}},l){let a,c;return!!(n[l]||e!==ae&&l[0]!=="$"&&te(e,l)||Qs(t,l)||(a=i[0])&&te(a,l)||te(s,l)||te(Dn,l)||te(r.config.globalProperties,l)||(c=o.__cssModules)&&c[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:te(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Ri(e){return B(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let xr=!0;function Ec(e){const t=fl(e),n=e.proxy,s=e.ctx;xr=!1,t.beforeCreate&&Ci(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:a,inject:c,created:u,beforeMount:p,mounted:g,beforeUpdate:b,updated:k,activated:R,deactivated:j,beforeDestroy:I,beforeUnmount:O,destroyed:M,unmounted:A,render:W,renderTracked:oe,renderTriggered:K,errorCaptured:He,serverPrefetch:lt,expose:Ke,inheritAttrs:pe,components:et,directives:ze,filters:xt}=t;if(c&&vc(c,s,null),o)for(const X in o){const Y=o[X];V(Y)&&(s[X]=Y.bind(n))}if(r){const X=r.call(n,n);ce(X)&&(e.data=Ls(X))}if(xr=!0,i)for(const X in i){const Y=i[X],tt=V(Y)?Y.bind(n,n):V(Y.get)?Y.get.bind(n,n):mt,nt=!V(Y)&&V(Y.set)?Y.set.bind(n):mt,re=Ze({get:tt,set:nt});Object.defineProperty(s,X,{enumerable:!0,configurable:!0,get:()=>re.value,set:ke=>re.value=ke})}if(l)for(const X in l)ul(l[X],s,n,X);if(a){const X=V(a)?a.call(n):a;Reflect.ownKeys(X).forEach(Y=>{as(Y,X[Y])})}u&&Ci(u,e,"c");function ge(X,Y){B(Y)?Y.forEach(tt=>X(tt.bind(n))):Y&&X(Y.bind(n))}if(ge(fc,p),ge(cl,g),ge(pc,b),ge(hc,k),ge(ac,R),ge(cc,j),ge(_c,He),ge(bc,oe),ge(mc,K),ge(dc,O),ge(Gr,A),ge(gc,lt),B(Ke))if(Ke.length){const X=e.exposed||(e.exposed={});Ke.forEach(Y=>{Object.defineProperty(X,Y,{get:()=>n[Y],set:tt=>n[Y]=tt,enumerable:!0})})}else e.exposed||(e.exposed={});W&&e.render===mt&&(e.render=W),pe!=null&&(e.inheritAttrs=pe),et&&(e.components=et),ze&&(e.directives=ze),lt&&ol(e)}function vc(e,t,n=mt){B(e)&&(e=yr(e));for(const s in e){const r=e[s];let i;ce(r)?"default"in r?i=Pt(r.from||s,r.default,!0):i=Pt(r.from||s):i=Pt(r),Oe(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Ci(e,t,n){_t(B(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function ul(e,t,n,s){let r=s.includes(".")?El(n,s):()=>n[s];if(_e(e)){const i=t[e];V(i)&&Nn(r,i)}else if(V(e))Nn(r,e.bind(n));else if(ce(e))if(B(e))e.forEach(i=>ul(i,t,n,s));else{const i=V(e.handler)?e.handler.bind(n):t[e.handler];V(i)&&Nn(r,i,e)}}function fl(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let a;return l?a=l:!r.length&&!n&&!s?a=t:(a={},r.length&&r.forEach(c=>_s(a,c,o,!0)),_s(a,t,o)),ce(t)&&i.set(t,a),a}function _s(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&_s(e,i,n,!0),r&&r.forEach(o=>_s(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Tc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Tc={data:Oi,props:Pi,emits:Pi,methods:Rn,computed:Rn,beforeCreate:Me,created:Me,beforeMount:Me,mounted:Me,beforeUpdate:Me,updated:Me,beforeDestroy:Me,beforeUnmount:Me,destroyed:Me,unmounted:Me,activated:Me,deactivated:Me,errorCaptured:Me,serverPrefetch:Me,components:Rn,directives:Rn,watch:Rc,provide:Oi,inject:Ac};function Oi(e,t){return t?e?function(){return Pe(V(e)?e.call(this,this):e,V(t)?t.call(this,this):t)}:t:e}function Ac(e,t){return Rn(yr(e),yr(t))}function yr(e){if(B(e)){const t={};for(let n=0;n1)return n&&V(t)?t.call(s&&s.proxy):t}}const hl={},dl=()=>Object.create(hl),gl=e=>Object.getPrototypeOf(e)===hl;function Pc(e,t,n,s=!1){const r={},i=dl();e.propsDefaults=Object.create(null),ml(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Qo(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Ic(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=ee(r),[a]=e.propsOptions;let c=!1;if((s||o>0)&&!(o&16)){if(o&8){const u=e.vnode.dynamicProps;for(let p=0;p{a=!0;const[g,b]=bl(p,t,!0);Pe(o,g),b&&l.push(...b)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!i&&!a)return ce(e)&&s.set(e,ln),ln;if(B(i))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",Kr=e=>B(e)?e.map(gt):[gt(e)],Mc=(e,t,n)=>{if(t._n)return t;const s=br((...r)=>Kr(t(...r)),n);return s._c=!1,s},_l=(e,t,n)=>{const s=e._ctx;for(const r in e){if(qr(r))continue;const i=e[r];if(V(i))t[r]=Mc(r,i,s);else if(i!=null){const o=Kr(i);t[r]=()=>o}}},xl=(e,t)=>{const n=Kr(t);e.slots.default=()=>n},yl=(e,t,n)=>{for(const s in t)(n||!qr(s))&&(e[s]=t[s])},Dc=(e,t,n)=>{const s=e.slots=dl();if(e.vnode.shapeFlag&32){const r=t._;r?(yl(s,t,n),n&&Lo(s,"_",r,!0)):_l(t,s)}else t&&xl(e,t)},Nc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ae;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:yl(r,t,n):(i=!t.$stable,_l(t,r)),o=t}else t&&(xl(e,t),o={default:1});if(i)for(const l in r)!qr(l)&&o[l]==null&&delete r[l]},Ve=Xc;function $c(e){return Fc(e)}function Fc(e,t){const n=Os();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:a,setText:c,setElementText:u,parentNode:p,nextSibling:g,setScopeId:b=mt,insertStaticContent:k}=e,R=(f,h,m,x=null,w=null,_=null,C=void 0,T=null,v=!!h.dynamicChildren)=>{if(f===h)return;f&&!xn(f,h)&&(x=y(f),ke(f,w,_,!0),f=null),h.patchFlag===-2&&(v=!1,h.dynamicChildren=null);const{type:S,ref:z,shapeFlag:L}=h;switch(S){case Hs:j(f,h,m,x);break;case Wt:I(f,h,m,x);break;case cs:f==null&&O(h,m,x,C);break;case rt:et(f,h,m,x,w,_,C,T,v);break;default:L&1?W(f,h,m,x,w,_,C,T,v):L&6?ze(f,h,m,x,w,_,C,T,v):(L&64||L&128)&&S.process(f,h,m,x,w,_,C,T,v,N)}z!=null&&w?Ln(z,f&&f.ref,_,h||f,!h):z==null&&f&&f.ref!=null&&Ln(f.ref,null,_,f,!0)},j=(f,h,m,x)=>{if(f==null)s(h.el=l(h.children),m,x);else{const w=h.el=f.el;h.children!==f.children&&c(w,h.children)}},I=(f,h,m,x)=>{f==null?s(h.el=a(h.children||""),m,x):h.el=f.el},O=(f,h,m,x)=>{[f.el,f.anchor]=k(f.children,h,m,x,f.el,f.anchor)},M=({el:f,anchor:h},m,x)=>{let w;for(;f&&f!==h;)w=g(f),s(f,m,x),f=w;s(h,m,x)},A=({el:f,anchor:h})=>{let m;for(;f&&f!==h;)m=g(f),r(f),f=m;r(h)},W=(f,h,m,x,w,_,C,T,v)=>{h.type==="svg"?C="svg":h.type==="math"&&(C="mathml"),f==null?oe(h,m,x,w,_,C,T,v):lt(f,h,w,_,C,T,v)},oe=(f,h,m,x,w,_,C,T)=>{let v,S;const{props:z,shapeFlag:L,transition:F,dirs:U}=f;if(v=f.el=o(f.type,_,z&&z.is,z),L&8?u(v,f.children):L&16&&He(f.children,v,null,x,w,Js(f,_),C,T),U&&Gt(f,null,x,"created"),K(v,f,f.scopeId,C,x),z){for(const ie in z)ie!=="value"&&!On(ie)&&i(v,ie,null,z[ie],_,x);"value"in z&&i(v,"value",null,z.value,_),(S=z.onVnodeBeforeMount)&&ut(S,x,f)}U&&Gt(f,null,x,"beforeMount");const G=Hc(w,F);G&&F.beforeEnter(v),s(v,h,m),((S=z&&z.onVnodeMounted)||G||U)&&Ve(()=>{S&&ut(S,x,f),G&&F.enter(v),U&&Gt(f,null,x,"mounted")},w)},K=(f,h,m,x,w)=>{if(m&&b(f,m),x)for(let _=0;_{for(let S=v;S{const T=h.el=f.el;let{patchFlag:v,dynamicChildren:S,dirs:z}=h;v|=f.patchFlag&16;const L=f.props||ae,F=h.props||ae;let U;if(m&&qt(m,!1),(U=F.onVnodeBeforeUpdate)&&ut(U,m,h,f),z&&Gt(h,f,m,"beforeUpdate"),m&&qt(m,!0),(L.innerHTML&&F.innerHTML==null||L.textContent&&F.textContent==null)&&u(T,""),S?Ke(f.dynamicChildren,S,T,m,x,Js(h,w),_):C||Y(f,h,T,null,m,x,Js(h,w),_,!1),v>0){if(v&16)pe(T,L,F,m,w);else if(v&2&&L.class!==F.class&&i(T,"class",null,F.class,w),v&4&&i(T,"style",L.style,F.style,w),v&8){const G=h.dynamicProps;for(let ie=0;ie{U&&ut(U,m,h,f),z&&Gt(h,f,m,"updated")},x)},Ke=(f,h,m,x,w,_,C)=>{for(let T=0;T{if(h!==m){if(h!==ae)for(const _ in h)!On(_)&&!(_ in m)&&i(f,_,h[_],null,w,x);for(const _ in m){if(On(_))continue;const C=m[_],T=h[_];C!==T&&_!=="value"&&i(f,_,T,C,w,x)}"value"in m&&i(f,"value",h.value,m.value,w)}},et=(f,h,m,x,w,_,C,T,v)=>{const S=h.el=f?f.el:l(""),z=h.anchor=f?f.anchor:l("");let{patchFlag:L,dynamicChildren:F,slotScopeIds:U}=h;U&&(T=T?T.concat(U):U),f==null?(s(S,m,x),s(z,m,x),He(h.children||[],m,z,w,_,C,T,v)):L>0&&L&64&&F&&f.dynamicChildren?(Ke(f.dynamicChildren,F,m,w,_,C,T),(h.key!=null||w&&h===w.subTree)&&wl(f,h,!0)):Y(f,h,m,z,w,_,C,T,v)},ze=(f,h,m,x,w,_,C,T,v)=>{h.slotScopeIds=T,f==null?h.shapeFlag&512?w.ctx.activate(h,m,x,C,v):xt(h,m,x,w,_,C,v):Dt(f,h,v)},xt=(f,h,m,x,w,_,C)=>{const T=f.component=lu(f,x,w);if(ll(f)&&(T.ctx.renderer=N),cu(T,!1,C),T.asyncDep){if(w&&w.registerDep(T,ge,C),!f.el){const v=T.subTree=Te(Wt);I(null,v,h,m),f.placeholder=v.el}}else ge(T,f,h,m,w,_,C)},Dt=(f,h,m)=>{const x=h.component=f.component;if(Yc(f,h,m))if(x.asyncDep&&!x.asyncResolved){X(x,h,m);return}else x.next=h,x.update();else h.el=f.el,x.vnode=h},ge=(f,h,m,x,w,_,C)=>{const T=()=>{if(f.isMounted){let{next:L,bu:F,u:U,parent:G,vnode:ie}=f;{const Ie=kl(f);if(Ie){L&&(L.el=ie.el,X(f,L,C)),Ie.asyncDep.then(()=>{f.isUnmounted||T()});return}}let Z=L,Se;qt(f,!1),L?(L.el=ie.el,X(f,L,C)):L=ie,F&&ls(F),(Se=L.props&&L.props.onVnodeBeforeUpdate)&&ut(Se,G,L,ie),qt(f,!0);const ye=Mi(f),We=f.subTree;f.subTree=ye,R(We,ye,p(We.el),y(We),f,w,_),L.el=ye.el,Z===null&&Zc(f,ye.el),U&&Ve(U,w),(Se=L.props&&L.props.onVnodeUpdated)&&Ve(()=>ut(Se,G,L,ie),w)}else{let L;const{el:F,props:U}=h,{bm:G,m:ie,parent:Z,root:Se,type:ye}=f,We=Mn(h);qt(f,!1),G&&ls(G),!We&&(L=U&&U.onVnodeBeforeMount)&&ut(L,Z,h),qt(f,!0);{Se.ce&&Se.ce._def.shadowRoot!==!1&&Se.ce._injectChildStyle(ye);const Ie=f.subTree=Mi(f);R(null,Ie,m,x,f,w,_),h.el=Ie.el}if(ie&&Ve(ie,w),!We&&(L=U&&U.onVnodeMounted)){const Ie=h;Ve(()=>ut(L,Z,Ie),w)}(h.shapeFlag&256||Z&&Mn(Z.vnode)&&Z.vnode.shapeFlag&256)&&f.a&&Ve(f.a,w),f.isMounted=!0,h=m=x=null}};f.scope.on();const v=f.effect=new Fo(T);f.scope.off();const S=f.update=v.run.bind(v),z=f.job=v.runIfDirty.bind(v);z.i=f,z.id=f.uid,v.scheduler=()=>Wr(z),qt(f,!0),S()},X=(f,h,m)=>{h.component=f;const x=f.vnode.props;f.vnode=h,f.next=null,Ic(f,h.props,x,m),Nc(f,h.children,m),It(),Ei(f),Lt()},Y=(f,h,m,x,w,_,C,T,v=!1)=>{const S=f&&f.children,z=f?f.shapeFlag:0,L=h.children,{patchFlag:F,shapeFlag:U}=h;if(F>0){if(F&128){nt(S,L,m,x,w,_,C,T,v);return}else if(F&256){tt(S,L,m,x,w,_,C,T,v);return}}U&8?(z&16&&xe(S,w,_),L!==S&&u(m,L)):z&16?U&16?nt(S,L,m,x,w,_,C,T,v):xe(S,w,_,!0):(z&8&&u(m,""),U&16&&He(L,m,x,w,_,C,T,v))},tt=(f,h,m,x,w,_,C,T,v)=>{f=f||ln,h=h||ln;const S=f.length,z=h.length,L=Math.min(S,z);let F;for(F=0;Fz?xe(f,w,_,!0,!1,L):He(h,m,x,w,_,C,T,v,L)},nt=(f,h,m,x,w,_,C,T,v)=>{let S=0;const z=h.length;let L=f.length-1,F=z-1;for(;S<=L&&S<=F;){const U=f[S],G=h[S]=v?Ht(h[S]):gt(h[S]);if(xn(U,G))R(U,G,m,null,w,_,C,T,v);else break;S++}for(;S<=L&&S<=F;){const U=f[L],G=h[F]=v?Ht(h[F]):gt(h[F]);if(xn(U,G))R(U,G,m,null,w,_,C,T,v);else break;L--,F--}if(S>L){if(S<=F){const U=F+1,G=UF)for(;S<=L;)ke(f[S],w,_,!0),S++;else{const U=S,G=S,ie=new Map;for(S=G;S<=F;S++){const me=h[S]=v?Ht(h[S]):gt(h[S]);me.key!=null&&ie.set(me.key,S)}let Z,Se=0;const ye=F-G+1;let We=!1,Ie=0;const at=new Array(ye);for(S=0;S=ye){ke(me,w,_,!0);continue}let Ue;if(me.key!=null)Ue=ie.get(me.key);else for(Z=G;Z<=F;Z++)if(at[Z-G]===0&&xn(me,h[Z])){Ue=Z;break}Ue===void 0?ke(me,w,_,!0):(at[Ue-G]=S+1,Ue>=Ie?Ie=Ue:We=!0,R(me,h[Ue],m,null,w,_,C,T,v),Se++)}const Ye=We?zc(at):ln;for(Z=Ye.length-1,S=ye-1;S>=0;S--){const me=G+S,Ue=h[me],en=h[me+1],Qn=me+1{const{el:_,type:C,transition:T,children:v,shapeFlag:S}=f;if(S&6){re(f.component.subTree,h,m,x);return}if(S&128){f.suspense.move(h,m,x);return}if(S&64){C.move(f,h,m,N);return}if(C===rt){s(_,h,m);for(let L=0;LT.enter(_),w);else{const{leave:L,delayLeave:F,afterLeave:U}=T,G=()=>{f.ctx.isUnmounted?r(_):s(_,h,m)},ie=()=>{_._isLeaving&&_[lc](!0),L(_,()=>{G(),U&&U()})};F?F(_,G,ie):ie()}else s(_,h,m)},ke=(f,h,m,x=!1,w=!1)=>{const{type:_,props:C,ref:T,children:v,dynamicChildren:S,shapeFlag:z,patchFlag:L,dirs:F,cacheIndex:U}=f;if(L===-2&&(w=!1),T!=null&&(It(),Ln(T,null,m,f,!0),Lt()),U!=null&&(h.renderCache[U]=void 0),z&256){h.ctx.deactivate(f);return}const G=z&1&&F,ie=!Mn(f);let Z;if(ie&&(Z=C&&C.onVnodeBeforeUnmount)&&ut(Z,h,f),z&6)ue(f.component,m,x);else{if(z&128){f.suspense.unmount(m,x);return}G&&Gt(f,null,h,"beforeUnmount"),z&64?f.type.remove(f,h,m,N,x):S&&!S.hasOnce&&(_!==rt||L>0&&L&64)?xe(S,h,m,!1,!0):(_===rt&&L&384||!w&&z&16)&&xe(v,h,m),x&&he(f)}(ie&&(Z=C&&C.onVnodeUnmounted)||G)&&Ve(()=>{Z&&ut(Z,h,f),G&&Gt(f,null,h,"unmounted")},m)},he=f=>{const{type:h,el:m,anchor:x,transition:w}=f;if(h===rt){yt(m,x);return}if(h===cs){A(f);return}const _=()=>{r(m),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(f.shapeFlag&1&&w&&!w.persisted){const{leave:C,delayLeave:T}=w,v=()=>C(m,_);T?T(f.el,_,v):v()}else _()},yt=(f,h)=>{let m;for(;f!==h;)m=g(f),r(f),f=m;r(h)},ue=(f,h,m)=>{const{bum:x,scope:w,job:_,subTree:C,um:T,m:v,a:S}=f;Li(v),Li(S),x&&ls(x),w.stop(),_&&(_.flags|=8,ke(C,f,h,m)),T&&Ve(T,h),Ve(()=>{f.isUnmounted=!0},h)},xe=(f,h,m,x=!1,w=!1,_=0)=>{for(let C=_;C{if(f.shapeFlag&6)return y(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const h=g(f.anchor||f.el),m=h&&h[ic];return m?g(m):h};let D=!1;const P=(f,h,m)=>{f==null?h._vnode&&ke(h._vnode,null,null,!0):R(h._vnode||null,f,h,null,null,null,m),h._vnode=f,D||(D=!0,Ei(),sl(),D=!1)},N={p:R,um:ke,m:re,r:he,mt:xt,mc:He,pc:Y,pbc:Ke,n:y,o:e};return{render:P,hydrate:void 0,createApp:Oc(P)}}function Js({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function qt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Hc(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function wl(e,t,n=!1){const s=e.children,r=t.children;if(B(s)&&B(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function kl(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:kl(t)}function Li(e){if(e)for(let t=0;tPt(Uc);function Nn(e,t,n){return Sl(e,t,n)}function Sl(e,t,n=ae){const{immediate:s,deep:r,flush:i,once:o}=n,l=Pe({},n),a=t&&s||!t&&i!=="post";let c;if(Vn){if(i==="sync"){const b=Bc();c=b.__watcherHandles||(b.__watcherHandles=[])}else if(!a){const b=()=>{};return b.stop=mt,b.resume=mt,b.pause=mt,b}}const u=Ce;l.call=(b,k,R)=>_t(b,u,k,R);let p=!1;i==="post"?l.scheduler=b=>{Ve(b,u&&u.suspense)}:i!=="sync"&&(p=!0,l.scheduler=(b,k)=>{k?b():Wr(b)}),l.augmentJob=b=>{t&&(b.flags|=4),p&&(b.flags|=2,u&&(b.id=u.uid,b.i=u))};const g=ec(e,t,l);return Vn&&(c?c.push(g):a&&g()),g}function jc(e,t,n){const s=this.proxy,r=_e(e)?e.includes(".")?El(s,e):()=>s[e]:e.bind(s,s);let i;V(t)?i=t:(i=t.handler,n=t);const o=Zn(this),l=Sl(r,i.bind(s),n);return o(),l}function El(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Qe(t)}Modifiers`]||e[`${Qt(t)}Modifiers`];function Vc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ae;let r=n;const i=t.startsWith("update:"),o=i&&Wc(s,t.slice(7));o&&(o.trim&&(r=n.map(u=>_e(u)?u.trim():u)),o.number&&(r=n.map(Mo)));let l,a=s[l=qs(t)]||s[l=qs(Qe(t))];!a&&i&&(a=s[l=qs(Qt(t))]),a&&_t(a,e,6,r);const c=s[l+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,_t(c,e,6,r)}}const Gc=new WeakMap;function vl(e,t,n=!1){const s=n?Gc:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!V(e)){const a=c=>{const u=vl(c,t,!0);u&&(l=!0,Pe(o,u))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!i&&!l?(ce(e)&&s.set(e,null),null):(B(i)?i.forEach(a=>o[a]=null):Pe(o,i),ce(e)&&s.set(e,o),o)}function Fs(e,t){return!e||!Ts(t)?!1:(t=t.slice(2).replace(/Once$/,""),te(e,t[0].toLowerCase()+t.slice(1))||te(e,Qt(t))||te(e,t))}function Mi(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:a,render:c,renderCache:u,props:p,data:g,setupState:b,ctx:k,inheritAttrs:R}=e,j=ms(e);let I,O;try{if(n.shapeFlag&4){const A=r||s,W=A;I=gt(c.call(W,A,u,p,b,g,k)),O=l}else{const A=t;I=gt(A.length>1?A(p,{attrs:l,slots:o,emit:a}):A(p,null)),O=t.props?l:qc(l)}}catch(A){$n.length=0,Ms(A,e,1),I=Te(Wt)}let M=I;if(O&&R!==!1){const A=Object.keys(O),{shapeFlag:W}=M;A.length&&W&7&&(i&&A.some(Lr)&&(O=Kc(O,i)),M=dn(M,O,!1,!0))}return n.dirs&&(M=dn(M,null,!1,!0),M.dirs=M.dirs?M.dirs.concat(n.dirs):n.dirs),n.transition&&Vr(M,n.transition),I=M,ms(j),I}const qc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ts(n))&&((t||(t={}))[n]=e[n]);return t},Kc=(e,t)=>{const n={};for(const s in e)(!Lr(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Yc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:a}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?Di(s,o,c):!!o;if(a&8){const u=t.dynamicProps;for(let p=0;pe.__isSuspense;function Xc(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):sc(e)}const rt=Symbol.for("v-fgt"),Hs=Symbol.for("v-txt"),Wt=Symbol.for("v-cmt"),cs=Symbol.for("v-stc"),$n=[];let qe=null;function Ut(e=!1){$n.push(qe=e?null:[])}function Qc(){$n.pop(),qe=$n[$n.length-1]||null}let Wn=1;function xs(e,t=!1){Wn+=e,e<0&&qe&&t&&(qe.hasOnce=!0)}function Al(e){return e.dynamicChildren=Wn>0?qe||ln:null,Qc(),Wn>0&&qe&&qe.push(e),e}function Yt(e,t,n,s,r,i){return Al(le(e,t,n,s,r,i,!0))}function Jc(e,t,n,s,r){return Al(Te(e,t,n,s,r,!0))}function ys(e){return e?e.__v_isVNode===!0:!1}function xn(e,t){return e.type===t.type&&e.key===t.key}const Rl=({key:e})=>e??null,us=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?_e(e)||Oe(e)||V(e)?{i:Ge,r:e,k:t,f:!!n}:e:null);function le(e,t=null,n=null,s=0,r=null,i=e===rt?0:1,o=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Rl(t),ref:t&&us(t),scopeId:il,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:Ge};return l?(Yr(a,n),i&128&&e.normalize(a)):n&&(a.shapeFlag|=_e(n)?8:16),Wn>0&&!o&&qe&&(a.patchFlag>0||i&6)&&a.patchFlag!==32&&qe.push(a),a}const Te=eu;function eu(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===yc)&&(e=Wt),ys(e)){const l=dn(e,t,!0);return n&&Yr(l,n),Wn>0&&!i&&qe&&(l.shapeFlag&6?qe[qe.indexOf(e)]=l:qe.push(l)),l.patchFlag=-2,l}if(du(e)&&(e=e.__vccOpts),t){t=tu(t);let{class:l,style:a}=t;l&&!_e(l)&&(t.class=cn(l)),ce(a)&&(jr(a)&&!B(a)&&(a=Pe({},a)),t.style=Nr(a))}const o=_e(e)?1:Tl(e)?128:oc(e)?64:ce(e)?4:V(e)?2:0;return le(e,t,n,s,r,o,i,!0)}function tu(e){return e?jr(e)||gl(e)?Pe({},e):e:null}function dn(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:a}=e,c=t?ru(r||{},t):r,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Rl(c),ref:t&&t.ref?n&&i?B(i)?i.concat(us(t)):[i,us(t)]:us(t):i,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!==rt?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&dn(e.ssContent),ssFallback:e.ssFallback&&dn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&s&&Vr(u,a.clone(u)),u}function dt(e=" ",t=0){return Te(Hs,null,e,t)}function nu(e,t){const n=Te(cs,null,e);return n.staticCount=t,n}function su(e="",t=!1){return t?(Ut(),Jc(Wt,null,e)):Te(Wt,null,e)}function gt(e){return e==null||typeof e=="boolean"?Te(Wt):B(e)?Te(rt,null,e.slice()):ys(e)?Ht(e):Te(Hs,null,String(e))}function Ht(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:dn(e)}function Yr(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(B(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Yr(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!gl(t)?t._ctx=Ge:r===3&&Ge&&(Ge.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else V(t)?(t={default:t,_ctx:Ge},n=32):(t=String(t),s&64?(n=16,t=[dt(t)]):n=8);e.children=t,e.shapeFlag|=n}function ru(...e){const t={};for(let n=0;nCe||Ge;let ws,kr;{const e=Os(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};ws=t("__VUE_INSTANCE_SETTERS__",n=>Ce=n),kr=t("__VUE_SSR_SETTERS__",n=>Vn=n)}const Zn=e=>{const t=Ce;return ws(e),e.scope.on(),()=>{e.scope.off(),ws(t)}},Ni=()=>{Ce&&Ce.scope.off(),ws(null)};function Cl(e){return e.vnode.shapeFlag&4}let Vn=!1;function cu(e,t=!1,n=!1){t&&kr(t);const{props:s,children:r}=e.vnode,i=Cl(e);Pc(e,s,i,t),Dc(e,r,n||t);const o=i?uu(e,t):void 0;return t&&kr(!1),o}function uu(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Sc);const{setup:s}=n;if(s){It();const r=e.setupContext=s.length>1?pu(e):null,i=Zn(e),o=Yn(s,e,0,[e.props,r]),l=Oo(o);if(Lt(),i(),(l||e.sp)&&!Mn(e)&&ol(e),l){if(o.then(Ni,Ni),t)return o.then(a=>{$i(e,a)}).catch(a=>{Ms(a,e,0)});e.asyncDep=o}else $i(e,o)}else Ol(e)}function $i(e,t,n){V(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ce(t)&&(e.setupState=el(t)),Ol(e)}function Ol(e,t,n){const s=e.type;e.render||(e.render=s.render||mt);{const r=Zn(e);It();try{Ec(e)}finally{Lt(),r()}}}const fu={get(e,t){return Re(e,"get",""),e[t]}};function pu(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,fu),slots:e.slots,emit:e.emit,expose:t}}function zs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(el(qa(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Dn)return Dn[n](e)},has(t,n){return n in t||n in Dn}})):e.proxy}function hu(e,t=!0){return V(e)?e.displayName||e.name:e.name||t&&e.__name}function du(e){return V(e)&&"__vccOpts"in e}const Ze=(e,t)=>Qa(e,t,Vn);function Pl(e,t,n){try{xs(-1);const s=arguments.length;return s===2?ce(t)&&!B(t)?ys(t)?Te(e,null,[t]):Te(e,t):Te(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&ys(n)&&(n=[n]),Te(e,t,n))}finally{xs(1)}}const gu="3.5.22";/** +* @vue/runtime-dom v3.5.22 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Sr;const Fi=typeof window<"u"&&window.trustedTypes;if(Fi)try{Sr=Fi.createPolicy("vue",{createHTML:e=>e})}catch{}const Il=Sr?e=>Sr.createHTML(e):e=>e,mu="http://www.w3.org/2000/svg",bu="http://www.w3.org/1998/Math/MathML",Tt=typeof document<"u"?document:null,Hi=Tt&&Tt.createElement("template"),_u={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Tt.createElementNS(mu,e):t==="mathml"?Tt.createElementNS(bu,e):n?Tt.createElement(e,{is:n}):Tt.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Tt.createTextNode(e),createComment:e=>Tt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Tt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Hi.innerHTML=Il(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Hi.content;if(s==="svg"||s==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},xu=Symbol("_vtc");function yu(e,t,n){const s=e[xu];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const zi=Symbol("_vod"),wu=Symbol("_vsh"),ku=Symbol(""),Su=/(?:^|;)\s*display\s*:/;function Eu(e,t,n){const s=e.style,r=_e(n);let i=!1;if(n&&!r){if(t)if(_e(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&fs(s,l,"")}else for(const o in t)n[o]==null&&fs(s,o,"");for(const o in n)o==="display"&&(i=!0),fs(s,o,n[o])}else if(r){if(t!==n){const o=s[ku];o&&(n+=";"+o),s.cssText=n,i=Su.test(n)}}else t&&e.removeAttribute("style");zi in e&&(e[zi]=i?s.display:"",e[wu]&&(s.display="none"))}const Ui=/\s*!important$/;function fs(e,t,n){if(B(n))n.forEach(s=>fs(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=vu(e,t);Ui.test(n)?e.setProperty(Qt(s),n.replace(Ui,""),"important"):e[s]=n}}const Bi=["Webkit","Moz","ms"],er={};function vu(e,t){const n=er[t];if(n)return n;let s=Qe(t);if(s!=="filter"&&s in e)return er[t]=s;s=Cs(s);for(let r=0;rtr||(Cu.then(()=>tr=0),tr=Date.now());function Pu(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;_t(Iu(s,n.value),t,5,[s])};return n.value=e,n.attached=Ou(),n}function Iu(e,t){if(B(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Ki=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Lu=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?yu(e,s,o):t==="style"?Eu(e,n,s):Ts(t)?Lr(t)||Au(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Mu(e,t,s,o))?(Vi(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Wi(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!_e(s))?Vi(e,Qe(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Wi(e,t,s,o))};function Mu(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ki(t)&&V(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||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 Ki(t)&&_e(n)?!1:t in e}const Yi=e=>{const t=e.props["onUpdate:modelValue"]||!1;return B(t)?n=>ls(t,n):t},nr=Symbol("_assign"),Du={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const r=As(t);Ll(e,"change",()=>{const i=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?Mo(ks(o)):ks(o));e[nr](e.multiple?r?new Set(i):i:i[0]),e._assigning=!0,Ds(()=>{e._assigning=!1})}),e[nr]=Yi(s)},mounted(e,{value:t}){Zi(e,t)},beforeUpdate(e,t,n){e[nr]=Yi(n)},updated(e,{value:t}){e._assigning||Zi(e,t)}};function Zi(e,t){const n=e.multiple,s=B(t);if(!(n&&!s&&!As(t))){for(let r=0,i=e.options.length;rString(c)===String(l)):o.selected=Ta(t,l)>-1}else o.selected=t.has(l);else if(Ps(ks(o),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function ks(e){return"_value"in e?e._value:e.value}const Nu=Pe({patchProp:Lu},_u);let Xi;function $u(){return Xi||(Xi=$c(Nu))}const Fu=((...e)=>{const t=$u().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=zu(s);if(!r)return;const i=t._component;!V(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Hu(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t});function Hu(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function zu(e){return _e(e)?document.querySelector(e):e}const Uu=Ns({__name:"App",setup(e){return(t,n)=>{const s=Ti("router-link"),r=Ti("router-view");return Ut(),Yt("div",null,[le("nav",null,[Te(s,{to:"/"},{default:br(()=>[...n[0]||(n[0]=[dt("Accueil",-1)])]),_:1}),n[2]||(n[2]=dt(" | ",-1)),Te(s,{to:"/logs"},{default:br(()=>[...n[1]||(n[1]=[dt("Logs",-1)])]),_:1})]),Te(r)])}}}),Zr=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Bu=Zr(Uu,[["__scopeId","data-v-8858e74d"]]);/*! + * vue-router v4.5.1 + * (c) 2025 Eduardo San Martin Morote + * @license MIT + */const on=typeof document<"u";function Ml(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function ju(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Ml(e.default)}const J=Object.assign;function sr(e,t){const n={};for(const s in t){const r=t[s];n[s]=ot(r)?r.map(e):e(r)}return n}const Fn=()=>{},ot=Array.isArray,Dl=/#/g,Wu=/&/g,Vu=/\//g,Gu=/=/g,qu=/\?/g,Nl=/\+/g,Ku=/%5B/g,Yu=/%5D/g,$l=/%5E/g,Zu=/%60/g,Fl=/%7B/g,Xu=/%7C/g,Hl=/%7D/g,Qu=/%20/g;function Xr(e){return encodeURI(""+e).replace(Xu,"|").replace(Ku,"[").replace(Yu,"]")}function Ju(e){return Xr(e).replace(Fl,"{").replace(Hl,"}").replace($l,"^")}function Er(e){return Xr(e).replace(Nl,"%2B").replace(Qu,"+").replace(Dl,"%23").replace(Wu,"%26").replace(Zu,"`").replace(Fl,"{").replace(Hl,"}").replace($l,"^")}function ef(e){return Er(e).replace(Gu,"%3D")}function tf(e){return Xr(e).replace(Dl,"%23").replace(qu,"%3F")}function nf(e){return e==null?"":tf(e).replace(Vu,"%2F")}function Gn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const sf=/\/$/,rf=e=>e.replace(sf,"");function rr(e,t,n="/"){let s,r={},i="",o="";const l=t.indexOf("#");let a=t.indexOf("?");return l=0&&(a=-1),a>-1&&(s=t.slice(0,a),i=t.slice(a+1,l>-1?l:t.length),r=e(i)),l>-1&&(s=s||t.slice(0,l),o=t.slice(l,t.length)),s=cf(s??t,n),{fullPath:s+(i&&"?")+i+o,path:s,query:r,hash:Gn(o)}}function of(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Qi(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function lf(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&gn(t.matched[s],n.matched[r])&&zl(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function gn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function zl(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!af(e[n],t[n]))return!1;return!0}function af(e,t){return ot(e)?Ji(e,t):ot(t)?Ji(t,e):e===t}function Ji(e,t){return ot(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function cf(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),r=s[s.length-1];(r===".."||r===".")&&s.push("");let i=n.length-1,o,l;for(o=0;o1&&i--;else break;return n.slice(0,i).join("/")+"/"+s.slice(o).join("/")}const Nt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var qn;(function(e){e.pop="pop",e.push="push"})(qn||(qn={}));var Hn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Hn||(Hn={}));function uf(e){if(!e)if(on){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),rf(e)}const ff=/^[^#]+#/;function pf(e,t){return e.replace(ff,"#")+t}function hf(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Us=()=>({left:window.scrollX,top:window.scrollY});function df(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),r=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!r)return;t=hf(r,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function eo(e,t){return(history.state?history.state.position-t:-1)+e}const vr=new Map;function gf(e,t){vr.set(e,t)}function mf(e){const t=vr.get(e);return vr.delete(e),t}let bf=()=>location.protocol+"//"+location.host;function Ul(e,t){const{pathname:n,search:s,hash:r}=t,i=e.indexOf("#");if(i>-1){let l=r.includes(e.slice(i))?e.slice(i).length:1,a=r.slice(l);return a[0]!=="/"&&(a="/"+a),Qi(a,"")}return Qi(n,e)+s+r}function _f(e,t,n,s){let r=[],i=[],o=null;const l=({state:g})=>{const b=Ul(e,location),k=n.value,R=t.value;let j=0;if(g){if(n.value=b,t.value=g,o&&o===k){o=null;return}j=R?g.position-R.position:0}else s(b);r.forEach(I=>{I(n.value,k,{delta:j,type:qn.pop,direction:j?j>0?Hn.forward:Hn.back:Hn.unknown})})};function a(){o=n.value}function c(g){r.push(g);const b=()=>{const k=r.indexOf(g);k>-1&&r.splice(k,1)};return i.push(b),b}function u(){const{history:g}=window;g.state&&g.replaceState(J({},g.state,{scroll:Us()}),"")}function p(){for(const g of i)g();i=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",u,{passive:!0}),{pauseListeners:a,listen:c,destroy:p}}function to(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?Us():null}}function xf(e){const{history:t,location:n}=window,s={value:Ul(e,n)},r={value:t.state};r.value||i(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(a,c,u){const p=e.indexOf("#"),g=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+a:bf()+e+a;try{t[u?"replaceState":"pushState"](c,"",g),r.value=c}catch(b){console.error(b),n[u?"replace":"assign"](g)}}function o(a,c){const u=J({},t.state,to(r.value.back,a,r.value.forward,!0),c,{position:r.value.position});i(a,u,!0),s.value=a}function l(a,c){const u=J({},r.value,t.state,{forward:a,scroll:Us()});i(u.current,u,!0);const p=J({},to(s.value,a,null),{position:u.position+1},c);i(a,p,!1),s.value=a}return{location:s,state:r,push:l,replace:o}}function yf(e){e=uf(e);const t=xf(e),n=_f(e,t.state,t.location,t.replace);function s(i,o=!0){o||n.pauseListeners(),history.go(i)}const r=J({location:"",base:e,go:s,createHref:pf.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}function wf(e){return typeof e=="string"||e&&typeof e=="object"}function Bl(e){return typeof e=="string"||typeof e=="symbol"}const jl=Symbol("");var no;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(no||(no={}));function mn(e,t){return J(new Error,{type:e,[jl]:!0},t)}function Et(e,t){return e instanceof Error&&jl in e&&(t==null||!!(e.type&t))}const so="[^/]+?",kf={sensitive:!1,strict:!1,start:!0,end:!0},Sf=/[.+*?^${}()[\]/\\]/g;function Ef(e,t){const n=J({},kf,t),s=[];let r=n.start?"^":"";const i=[];for(const c of e){const u=c.length?[]:[90];n.strict&&!c.length&&(r+="/");for(let p=0;pt.length?t.length===1&&t[0]===80?1:-1:0}function Wl(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const Tf={type:0,value:""},Af=/[a-zA-Z0-9_]/;function Rf(e){if(!e)return[[]];if(e==="/")return[[Tf]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(b){throw new Error(`ERR (${n})/"${c}": ${b}`)}let n=0,s=n;const r=[];let i;function o(){i&&r.push(i),i=[]}let l=0,a,c="",u="";function p(){c&&(n===0?i.push({type:0,value:c}):n===1||n===2||n===3?(i.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:c,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),c="")}function g(){c+=a}for(;l{o(M)}:Fn}function o(p){if(Bl(p)){const g=s.get(p);g&&(s.delete(p),n.splice(n.indexOf(g),1),g.children.forEach(o),g.alias.forEach(o))}else{const g=n.indexOf(p);g>-1&&(n.splice(g,1),p.record.name&&s.delete(p.record.name),p.children.forEach(o),p.alias.forEach(o))}}function l(){return n}function a(p){const g=Lf(p,n);n.splice(g,0,p),p.record.name&&!lo(p)&&s.set(p.record.name,p)}function c(p,g){let b,k={},R,j;if("name"in p&&p.name){if(b=s.get(p.name),!b)throw mn(1,{location:p});j=b.record.name,k=J(io(g.params,b.keys.filter(M=>!M.optional).concat(b.parent?b.parent.keys.filter(M=>M.optional):[]).map(M=>M.name)),p.params&&io(p.params,b.keys.map(M=>M.name))),R=b.stringify(k)}else if(p.path!=null)R=p.path,b=n.find(M=>M.re.test(R)),b&&(k=b.parse(R),j=b.record.name);else{if(b=g.name?s.get(g.name):n.find(M=>M.re.test(g.path)),!b)throw mn(1,{location:p,currentLocation:g});j=b.record.name,k=J({},g.params,p.params),R=b.stringify(k)}const I=[];let O=b;for(;O;)I.unshift(O.record),O=O.parent;return{name:j,path:R,params:k,matched:I,meta:If(I)}}e.forEach(p=>i(p));function u(){n.length=0,s.clear()}return{addRoute:i,resolve:c,removeRoute:o,clearRoutes:u,getRoutes:l,getRecordMatcher:r}}function io(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function oo(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Pf(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Pf(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function lo(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function If(e){return e.reduce((t,n)=>J(t,n.meta),{})}function ao(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}function Lf(e,t){let n=0,s=t.length;for(;n!==s;){const i=n+s>>1;Wl(e,t[i])<0?s=i:n=i+1}const r=Mf(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function Mf(e){let t=e;for(;t=t.parent;)if(Vl(t)&&Wl(e,t)===0)return t}function Vl({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Df(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let r=0;ri&&Er(i)):[s&&Er(s)]).forEach(i=>{i!==void 0&&(t+=(t.length?"&":"")+n,i!=null&&(t+="="+i))})}return t}function Nf(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=ot(s)?s.map(r=>r==null?null:""+r):s==null?s:""+s)}return t}const $f=Symbol(""),uo=Symbol(""),Qr=Symbol(""),Gl=Symbol(""),Tr=Symbol("");function yn(){let e=[];function t(s){return e.push(s),()=>{const r=e.indexOf(s);r>-1&&e.splice(r,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function zt(e,t,n,s,r,i=o=>o()){const o=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((l,a)=>{const c=g=>{g===!1?a(mn(4,{from:n,to:t})):g instanceof Error?a(g):wf(g)?a(mn(2,{from:t,to:g})):(o&&s.enterCallbacks[r]===o&&typeof g=="function"&&o.push(g),l())},u=i(()=>e.call(s&&s.instances[r],t,n,c));let p=Promise.resolve(u);e.length<3&&(p=p.then(c)),p.catch(g=>a(g))})}function ir(e,t,n,s,r=i=>i()){const i=[];for(const o of e)for(const l in o.components){let a=o.components[l];if(!(t!=="beforeRouteEnter"&&!o.instances[l]))if(Ml(a)){const u=(a.__vccOpts||a)[t];u&&i.push(zt(u,n,s,o,l,r))}else{let c=a();i.push(()=>c.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${l}" at "${o.path}"`);const p=ju(u)?u.default:u;o.mods[l]=u,o.components[l]=p;const b=(p.__vccOpts||p)[t];return b&&zt(b,n,s,o,l,r)()}))}}return i}function fo(e){const t=Pt(Qr),n=Pt(Gl),s=Ze(()=>{const a=fn(e.to);return t.resolve(a)}),r=Ze(()=>{const{matched:a}=s.value,{length:c}=a,u=a[c-1],p=n.matched;if(!u||!p.length)return-1;const g=p.findIndex(gn.bind(null,u));if(g>-1)return g;const b=po(a[c-2]);return c>1&&po(u)===b&&p[p.length-1].path!==b?p.findIndex(gn.bind(null,a[c-2])):g}),i=Ze(()=>r.value>-1&&Bf(n.params,s.value.params)),o=Ze(()=>r.value>-1&&r.value===n.matched.length-1&&zl(n.params,s.value.params));function l(a={}){if(Uf(a)){const c=t[fn(e.replace)?"replace":"push"](fn(e.to)).catch(Fn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:s,href:Ze(()=>s.value.href),isActive:i,isExactActive:o,navigate:l}}function Ff(e){return e.length===1?e[0]:e}const Hf=Ns({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:fo,setup(e,{slots:t}){const n=Ls(fo(e)),{options:s}=Pt(Qr),r=Ze(()=>({[ho(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ho(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const i=t.default&&Ff(t.default(n));return e.custom?i:Pl("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},i)}}}),zf=Hf;function Uf(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Bf(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s=="string"){if(s!==r)return!1}else if(!ot(r)||r.length!==s.length||s.some((i,o)=>i!==r[o]))return!1}return!0}function po(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ho=(e,t,n)=>e??t??n,jf=Ns({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=Pt(Tr),r=Ze(()=>e.route||s.value),i=Pt(uo,0),o=Ze(()=>{let c=fn(i);const{matched:u}=r.value;let p;for(;(p=u[c])&&!p.components;)c++;return c}),l=Ze(()=>r.value.matched[o.value]);as(uo,Ze(()=>o.value+1)),as($f,l),as(Tr,r);const a=$t();return Nn(()=>[a.value,l.value,e.name],([c,u,p],[g,b,k])=>{u&&(u.instances[p]=c,b&&b!==u&&c&&c===g&&(u.leaveGuards.size||(u.leaveGuards=b.leaveGuards),u.updateGuards.size||(u.updateGuards=b.updateGuards))),c&&u&&(!b||!gn(u,b)||!g)&&(u.enterCallbacks[p]||[]).forEach(R=>R(c))},{flush:"post"}),()=>{const c=r.value,u=e.name,p=l.value,g=p&&p.components[u];if(!g)return go(n.default,{Component:g,route:c});const b=p.props[u],k=b?b===!0?c.params:typeof b=="function"?b(c):b:null,j=Pl(g,J({},k,t,{onVnodeUnmounted:I=>{I.component.isUnmounted&&(p.instances[u]=null)},ref:a}));return go(n.default,{Component:j,route:c})||j}}});function go(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Wf=jf;function Vf(e){const t=Of(e.routes,e),n=e.parseQuery||Df,s=e.stringifyQuery||co,r=e.history,i=yn(),o=yn(),l=yn(),a=Ka(Nt);let c=Nt;on&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=sr.bind(null,y=>""+y),p=sr.bind(null,nf),g=sr.bind(null,Gn);function b(y,D){let P,N;return Bl(y)?(P=t.getRecordMatcher(y),N=D):N=y,t.addRoute(N,P)}function k(y){const D=t.getRecordMatcher(y);D&&t.removeRoute(D)}function R(){return t.getRoutes().map(y=>y.record)}function j(y){return!!t.getRecordMatcher(y)}function I(y,D){if(D=J({},D||a.value),typeof y=="string"){const m=rr(n,y,D.path),x=t.resolve({path:m.path},D),w=r.createHref(m.fullPath);return J(m,x,{params:g(x.params),hash:Gn(m.hash),redirectedFrom:void 0,href:w})}let P;if(y.path!=null)P=J({},y,{path:rr(n,y.path,D.path).path});else{const m=J({},y.params);for(const x in m)m[x]==null&&delete m[x];P=J({},y,{params:p(m)}),D.params=p(D.params)}const N=t.resolve(P,D),Q=y.hash||"";N.params=u(g(N.params));const f=of(s,J({},y,{hash:Ju(Q),path:N.path})),h=r.createHref(f);return J({fullPath:f,hash:Q,query:s===co?Nf(y.query):y.query||{}},N,{redirectedFrom:void 0,href:h})}function O(y){return typeof y=="string"?rr(n,y,a.value.path):J({},y)}function M(y,D){if(c!==y)return mn(8,{from:D,to:y})}function A(y){return K(y)}function W(y){return A(J(O(y),{replace:!0}))}function oe(y){const D=y.matched[y.matched.length-1];if(D&&D.redirect){const{redirect:P}=D;let N=typeof P=="function"?P(y):P;return typeof N=="string"&&(N=N.includes("?")||N.includes("#")?N=O(N):{path:N},N.params={}),J({query:y.query,hash:y.hash,params:N.path!=null?{}:y.params},N)}}function K(y,D){const P=c=I(y),N=a.value,Q=y.state,f=y.force,h=y.replace===!0,m=oe(P);if(m)return K(J(O(m),{state:typeof m=="object"?J({},Q,m.state):Q,force:f,replace:h}),D||P);const x=P;x.redirectedFrom=D;let w;return!f&&lf(s,N,P)&&(w=mn(16,{to:x,from:N}),re(N,N,!0,!1)),(w?Promise.resolve(w):Ke(x,N)).catch(_=>Et(_)?Et(_,2)?_:nt(_):Y(_,x,N)).then(_=>{if(_){if(Et(_,2))return K(J({replace:h},O(_.to),{state:typeof _.to=="object"?J({},Q,_.to.state):Q,force:f}),D||x)}else _=et(x,N,!0,h,Q);return pe(x,N,_),_})}function He(y,D){const P=M(y,D);return P?Promise.reject(P):Promise.resolve()}function lt(y){const D=yt.values().next().value;return D&&typeof D.runWithContext=="function"?D.runWithContext(y):y()}function Ke(y,D){let P;const[N,Q,f]=Gf(y,D);P=ir(N.reverse(),"beforeRouteLeave",y,D);for(const m of N)m.leaveGuards.forEach(x=>{P.push(zt(x,y,D))});const h=He.bind(null,y,D);return P.push(h),xe(P).then(()=>{P=[];for(const m of i.list())P.push(zt(m,y,D));return P.push(h),xe(P)}).then(()=>{P=ir(Q,"beforeRouteUpdate",y,D);for(const m of Q)m.updateGuards.forEach(x=>{P.push(zt(x,y,D))});return P.push(h),xe(P)}).then(()=>{P=[];for(const m of f)if(m.beforeEnter)if(ot(m.beforeEnter))for(const x of m.beforeEnter)P.push(zt(x,y,D));else P.push(zt(m.beforeEnter,y,D));return P.push(h),xe(P)}).then(()=>(y.matched.forEach(m=>m.enterCallbacks={}),P=ir(f,"beforeRouteEnter",y,D,lt),P.push(h),xe(P))).then(()=>{P=[];for(const m of o.list())P.push(zt(m,y,D));return P.push(h),xe(P)}).catch(m=>Et(m,8)?m:Promise.reject(m))}function pe(y,D,P){l.list().forEach(N=>lt(()=>N(y,D,P)))}function et(y,D,P,N,Q){const f=M(y,D);if(f)return f;const h=D===Nt,m=on?history.state:{};P&&(N||h?r.replace(y.fullPath,J({scroll:h&&m&&m.scroll},Q)):r.push(y.fullPath,Q)),a.value=y,re(y,D,P,h),nt()}let ze;function xt(){ze||(ze=r.listen((y,D,P)=>{if(!ue.listening)return;const N=I(y),Q=oe(N);if(Q){K(J(Q,{replace:!0,force:!0}),N).catch(Fn);return}c=N;const f=a.value;on&&gf(eo(f.fullPath,P.delta),Us()),Ke(N,f).catch(h=>Et(h,12)?h:Et(h,2)?(K(J(O(h.to),{force:!0}),N).then(m=>{Et(m,20)&&!P.delta&&P.type===qn.pop&&r.go(-1,!1)}).catch(Fn),Promise.reject()):(P.delta&&r.go(-P.delta,!1),Y(h,N,f))).then(h=>{h=h||et(N,f,!1),h&&(P.delta&&!Et(h,8)?r.go(-P.delta,!1):P.type===qn.pop&&Et(h,20)&&r.go(-1,!1)),pe(N,f,h)}).catch(Fn)}))}let Dt=yn(),ge=yn(),X;function Y(y,D,P){nt(y);const N=ge.list();return N.length?N.forEach(Q=>Q(y,D,P)):console.error(y),Promise.reject(y)}function tt(){return X&&a.value!==Nt?Promise.resolve():new Promise((y,D)=>{Dt.add([y,D])})}function nt(y){return X||(X=!y,xt(),Dt.list().forEach(([D,P])=>y?P(y):D()),Dt.reset()),y}function re(y,D,P,N){const{scrollBehavior:Q}=e;if(!on||!Q)return Promise.resolve();const f=!P&&mf(eo(y.fullPath,0))||(N||!P)&&history.state&&history.state.scroll||null;return Ds().then(()=>Q(y,D,f)).then(h=>h&&df(h)).catch(h=>Y(h,y,D))}const ke=y=>r.go(y);let he;const yt=new Set,ue={currentRoute:a,listening:!0,addRoute:b,removeRoute:k,clearRoutes:t.clearRoutes,hasRoute:j,getRoutes:R,resolve:I,options:e,push:A,replace:W,go:ke,back:()=>ke(-1),forward:()=>ke(1),beforeEach:i.add,beforeResolve:o.add,afterEach:l.add,onError:ge.add,isReady:tt,install(y){const D=this;y.component("RouterLink",zf),y.component("RouterView",Wf),y.config.globalProperties.$router=D,Object.defineProperty(y.config.globalProperties,"$route",{enumerable:!0,get:()=>fn(a)}),on&&!he&&a.value===Nt&&(he=!0,A(r.location).catch(Q=>{}));const P={};for(const Q in Nt)Object.defineProperty(P,Q,{get:()=>a.value[Q],enumerable:!0});y.provide(Qr,D),y.provide(Gl,Qo(P)),y.provide(Tr,a);const N=y.unmount;yt.add(y),y.unmount=function(){yt.delete(y),yt.size<1&&(c=Nt,ze&&ze(),ze=null,a.value=Nt,he=!1,X=!1),N()}}};function xe(y){return y.reduce((D,P)=>D.then(()=>lt(P)),Promise.resolve())}return ue}function Gf(e,t){const n=[],s=[],r=[],i=Math.max(t.matched.length,e.matched.length);for(let o=0;ogn(c,l))?s.push(l):n.push(l));const a=e.matched[o];a&&(t.matched.find(c=>gn(c,a))||r.push(a))}return[n,s,r]}const qf={class:"card"},Kf=Ns({__name:"HelloWorld",props:{msg:{}},setup(e){const t=$t(0);return(n,s)=>(Ut(),Yt(rt,null,[le("h1",null,ht(e.msg),1),le("div",qf,[le("button",{type:"button",onClick:s[0]||(s[0]=r=>t.value++)},"count is "+ht(t.value),1),s[1]||(s[1]=le("p",null,[dt(" Edit "),le("code",null,"components/HelloWorld.vue"),dt(" to test HMR ")],-1))]),s[2]||(s[2]=le("p",null,[dt(" Check out "),le("a",{href:"https://vuejs.org/guide/quick-start.html#local",target:"_blank"},"create-vue"),dt(", the official Vue + Vite starter ")],-1)),s[3]||(s[3]=le("p",null,[dt(" Learn more about IDE Support for Vue in the "),le("a",{href:"https://vuejs.org/guide/scaling-up/tooling.html#ide-support",target:"_blank"},"Vue Docs Scaling up Guide"),dt(". ")],-1)),s[4]||(s[4]=le("p",{class:"read-the-docs"},"Click on the Vite and Vue logos to learn more",-1))],64))}}),Yf=Zr(Kf,[["__scopeId","data-v-cc337d8c"]]);function Jr(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Jt=Jr();function ql(e){Jt=e}var zn={exec:()=>null};function se(e,t=""){let n=typeof e=="string"?e:e.source,s={replace:(r,i)=>{let o=typeof i=="string"?i:i.source;return o=o.replace(Ne.caret,"$1"),n=n.replace(r,o),s},getRegex:()=>new RegExp(n,t)};return s}var Ne={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,"i")},Zf=/^(?:[ \t]*(?:\n|$))+/,Xf=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Qf=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,Xn=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Jf=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ei=/(?:[*+-]|\d{1,9}[.)])/,Kl=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Yl=se(Kl).replace(/bull/g,ei).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),ep=se(Kl).replace(/bull/g,ei).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),ti=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,tp=/^[^\n]+/,ni=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,np=se(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",ni).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),sp=se(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,ei).getRegex(),Bs="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",si=/|$))/,rp=se("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",si).replace("tag",Bs).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Zl=se(ti).replace("hr",Xn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Bs).getRegex(),ip=se(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Zl).getRegex(),ri={blockquote:ip,code:Xf,def:np,fences:Qf,heading:Jf,hr:Xn,html:rp,lheading:Yl,list:sp,newline:Zf,paragraph:Zl,table:zn,text:tp},mo=se("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Xn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Bs).getRegex(),op={...ri,lheading:ep,table:mo,paragraph:se(ti).replace("hr",Xn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",mo).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Bs).getRegex()},lp={...ri,html:se(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",si).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:zn,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:se(ti).replace("hr",Xn).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",Yl).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},ap=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,cp=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Xl=/^( {2,}|\\)\n(?!\s*$)/,up=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,ea=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,gp=se(ea,"u").replace(/punct/g,js).getRegex(),mp=se(ea,"u").replace(/punct/g,Jl).getRegex(),ta="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",bp=se(ta,"gu").replace(/notPunctSpace/g,Ql).replace(/punctSpace/g,ii).replace(/punct/g,js).getRegex(),_p=se(ta,"gu").replace(/notPunctSpace/g,hp).replace(/punctSpace/g,pp).replace(/punct/g,Jl).getRegex(),xp=se("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Ql).replace(/punctSpace/g,ii).replace(/punct/g,js).getRegex(),yp=se(/\\(punct)/,"gu").replace(/punct/g,js).getRegex(),wp=se(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),kp=se(si).replace("(?:-->|$)","-->").getRegex(),Sp=se("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",kp).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Ss=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`[^`]*`|[^\[\]\\`])*?/,Ep=se(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",Ss).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),na=se(/^!?\[(label)\]\[(ref)\]/).replace("label",Ss).replace("ref",ni).getRegex(),sa=se(/^!?\[(ref)\](?:\[\])?/).replace("ref",ni).getRegex(),vp=se("reflink|nolink(?!\\()","g").replace("reflink",na).replace("nolink",sa).getRegex(),oi={_backpedal:zn,anyPunctuation:yp,autolink:wp,blockSkip:dp,br:Xl,code:cp,del:zn,emStrongLDelim:gp,emStrongRDelimAst:bp,emStrongRDelimUnd:xp,escape:ap,link:Ep,nolink:sa,punctuation:fp,reflink:na,reflinkSearch:vp,tag:Sp,text:up,url:zn},Tp={...oi,link:se(/^!?\[(label)\]\((.*?)\)/).replace("label",Ss).getRegex(),reflink:se(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Ss).getRegex()},Ar={...oi,emStrongRDelimAst:_p,emStrongLDelim:mp,url:se(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},bo=e=>Rp[e];function ft(e,t){if(t){if(Ne.escapeTest.test(e))return e.replace(Ne.escapeReplace,bo)}else if(Ne.escapeTestNoEncode.test(e))return e.replace(Ne.escapeReplaceNoEncode,bo);return e}function _o(e){try{e=encodeURI(e).replace(Ne.percentDecode,"%")}catch{return null}return e}function xo(e,t){let n=e.replace(Ne.findPipe,(i,o,l)=>{let a=!1,c=o;for(;--c>=0&&l[c]==="\\";)a=!a;return a?"|":" |"}),s=n.split(Ne.splitPipe),r=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.length0?-2:-1}function yo(e,t,n,s,r){let i=t.href,o=t.title||null,l=e[1].replace(r.other.outputLinkReplace,"$1");s.state.inLink=!0;let a={type:e[0].charAt(0)==="!"?"image":"link",raw:n,href:i,title:o,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,a}function Op(e,t,n){let s=e.match(n.other.indentCodeCompensation);if(s===null)return t;let r=s[1];return t.split(` +`).map(i=>{let o=i.match(n.other.beginningSpace);if(o===null)return i;let[l]=o;return l.length>=r.length?i.slice(r.length):i}).join(` +`)}var Es=class{options;rules;lexer;constructor(e){this.options=e||Jt}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:kn(n,` +`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=Op(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=kn(n,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(n=s.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:kn(t[0],` +`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=kn(t[0],` +`).split(` +`),s="",r="",i=[];for(;n.length>0;){let o=!1,l=[],a;for(a=0;a1,r={type:"list",raw:"",ordered:s,start:s?+n.slice(0,-1):"",loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:"[*+-]");let i=this.rules.other.listItemRegex(n),o=!1;for(;e;){let a=!1,c="",u="";if(!(t=i.exec(e))||this.rules.block.hr.test(e))break;c=t[0],e=e.substring(c.length);let p=t[2].split(` +`,1)[0].replace(this.rules.other.listReplaceTabs,I=>" ".repeat(3*I.length)),g=e.split(` +`,1)[0],b=!p.trim(),k=0;if(this.options.pedantic?(k=2,u=p.trimStart()):b?k=t[1].length+1:(k=t[2].search(this.rules.other.nonSpaceChar),k=k>4?1:k,u=p.slice(k),k+=t[1].length),b&&this.rules.other.blankLine.test(g)&&(c+=g+` +`,e=e.substring(g.length+1),a=!0),!a){let I=this.rules.other.nextBulletRegex(k),O=this.rules.other.hrRegex(k),M=this.rules.other.fencesBeginRegex(k),A=this.rules.other.headingBeginRegex(k),W=this.rules.other.htmlBeginRegex(k);for(;e;){let oe=e.split(` +`,1)[0],K;if(g=oe,this.options.pedantic?(g=g.replace(this.rules.other.listReplaceNesting," "),K=g):K=g.replace(this.rules.other.tabCharGlobal," "),M.test(g)||A.test(g)||W.test(g)||I.test(g)||O.test(g))break;if(K.search(this.rules.other.nonSpaceChar)>=k||!g.trim())u+=` +`+K.slice(k);else{if(b||p.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||M.test(p)||A.test(p)||O.test(p))break;u+=` +`+g}!b&&!g.trim()&&(b=!0),c+=oe+` +`,e=e.substring(oe.length+1),p=K.slice(k)}}r.loose||(o?r.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(o=!0));let R=null,j;this.options.gfm&&(R=this.rules.other.listIsTask.exec(u),R&&(j=R[0]!=="[ ] ",u=u.replace(this.rules.other.listReplaceTask,""))),r.items.push({type:"list_item",raw:c,task:!!R,checked:j,loose:!1,text:u,tokens:[]}),r.raw+=c}let l=r.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let a=0;ap.type==="space"),u=c.length>0&&c.some(p=>this.rules.other.anyLine.test(p.raw));r.loose=u}if(r.loose)for(let a=0;a({text:l,tokens:this.lexer.inline(l),header:!1,align:i.align[a]})));return i}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===` +`?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let i=kn(n.slice(0,-1),"\\");if((n.length-i.length)%2===0)return}else{let i=Cp(t[2],"()");if(i===-2)return;if(i>-1){let o=(t[0].indexOf("!")===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,o).trim(),t[3]=""}}let s=t[2],r="";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(s);i&&(s=i[1],r=i[3])}else r=t[3]?t[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?s=s.slice(1):s=s.slice(1,-1)),yo(t,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:r&&r.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),r=t[s.toLowerCase()];if(!r){let i=n[0].charAt(0);return{type:"text",raw:i,text:i}}return yo(n,r,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!(!s||s[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[2])||!n||this.rules.inline.punctuation.exec(n))){let r=[...s[0]].length-1,i,o,l=r,a=0,c=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+r);(s=c.exec(t))!=null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(o=[...i].length,s[3]||s[4]){l+=o;continue}else if((s[5]||s[6])&&r%3&&!((r+o)%3)){a+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l+a);let u=[...s[0]][0].length,p=e.slice(0,r+s.index+u+o);if(Math.min(r,o)%2){let b=p.slice(1,-1);return{type:"em",raw:p,text:b,tokens:this.lexer.inlineTokens(b)}}let g=p.slice(2,-2);return{type:"strong",raw:p,text:g,tokens:this.lexer.inlineTokens(g)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(n),r=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&r&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]==="@"?(n=t[1],s="mailto:"+n):(n=t[1],s=n),{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]==="@")n=t[0],s="mailto:"+n;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(r!==t[0]);n=t[0],t[1]==="www."?s="http://"+t[0]:s=t[0]}return{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}},Ct=class Rr{tokens;options;state;tokenizer;inlineQueue;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||Jt,this.options.tokenizer=this.options.tokenizer||new Es,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:Ne,block:rs.normal,inline:wn.normal};this.options.pedantic?(n.block=rs.pedantic,n.inline=wn.pedantic):this.options.gfm&&(n.block=rs.gfm,this.options.breaks?n.inline=wn.breaks:n.inline=wn.gfm),this.tokenizer.rules=n}static get rules(){return{block:rs,inline:wn}}static lex(t,n){return new Rr(n).lex(t)}static lexInline(t,n){return new Rr(n).inlineTokens(t)}lex(t){t=t.replace(Ne.carriageReturn,` +`),this.blockTokens(t,this.tokens);for(let n=0;n(r=o.call({lexer:this},t,n))?(t=t.substring(r.raw.length),n.push(r),!0):!1))continue;if(r=this.tokenizer.space(t)){t=t.substring(r.raw.length);let o=n.at(-1);r.raw.length===1&&o!==void 0?o.raw+=` +`:n.push(r);continue}if(r=this.tokenizer.code(t)){t=t.substring(r.raw.length);let o=n.at(-1);o?.type==="paragraph"||o?.type==="text"?(o.raw+=(o.raw.endsWith(` +`)?"":` +`)+r.raw,o.text+=` +`+r.text,this.inlineQueue.at(-1).src=o.text):n.push(r);continue}if(r=this.tokenizer.fences(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.heading(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.hr(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.blockquote(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.list(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.html(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.def(t)){t=t.substring(r.raw.length);let o=n.at(-1);o?.type==="paragraph"||o?.type==="text"?(o.raw+=(o.raw.endsWith(` +`)?"":` +`)+r.raw,o.text+=` +`+r.raw,this.inlineQueue.at(-1).src=o.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},n.push(r));continue}if(r=this.tokenizer.table(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.lheading(t)){t=t.substring(r.raw.length),n.push(r);continue}let i=t;if(this.options.extensions?.startBlock){let o=1/0,l=t.slice(1),a;this.options.extensions.startBlock.forEach(c=>{a=c.call({lexer:this},l),typeof a=="number"&&a>=0&&(o=Math.min(o,a))}),o<1/0&&o>=0&&(i=t.substring(0,o+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let o=n.at(-1);s&&o?.type==="paragraph"?(o.raw+=(o.raw.endsWith(` +`)?"":` +`)+r.raw,o.text+=` +`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):n.push(r),s=i.length!==t.length,t=t.substring(r.raw.length);continue}if(r=this.tokenizer.text(t)){t=t.substring(r.raw.length);let o=n.at(-1);o?.type==="text"?(o.raw+=(o.raw.endsWith(` +`)?"":` +`)+r.raw,o.text+=` +`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):n.push(r);continue}if(t){let o="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(o);break}else throw new Error(o)}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){let s=t,r=null;if(this.tokens.links){let l=Object.keys(this.tokens.links);if(l.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)l.includes(r[0].slice(r[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,r.index)+"["+"a".repeat(r[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,r.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(r=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)s=s.slice(0,r.index)+"["+"a".repeat(r[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let i=!1,o="";for(;t;){i||(o=""),i=!1;let l;if(this.options.extensions?.inline?.some(c=>(l=c.call({lexer:this},t,n))?(t=t.substring(l.raw.length),n.push(l),!0):!1))continue;if(l=this.tokenizer.escape(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.tag(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.link(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(l.raw.length);let c=n.at(-1);l.type==="text"&&c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):n.push(l);continue}if(l=this.tokenizer.emStrong(t,s,o)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.codespan(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.br(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.del(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.autolink(t)){t=t.substring(l.raw.length),n.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(t))){t=t.substring(l.raw.length),n.push(l);continue}let a=t;if(this.options.extensions?.startInline){let c=1/0,u=t.slice(1),p;this.options.extensions.startInline.forEach(g=>{p=g.call({lexer:this},u),typeof p=="number"&&p>=0&&(c=Math.min(c,p))}),c<1/0&&c>=0&&(a=t.substring(0,c+1))}if(l=this.tokenizer.inlineText(a)){t=t.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(o=l.raw.slice(-1)),i=!0;let c=n.at(-1);c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):n.push(l);continue}if(t){let c="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return n}},vs=class{options;parser;constructor(e){this.options=e||Jt}space(e){return""}code({text:e,lang:t,escaped:n}){let s=(t||"").match(Ne.notSpaceStart)?.[0],r=e.replace(Ne.endingNewline,"")+` +`;return s?'
'+(n?r:ft(r,!0))+`
+`:"
"+(n?r:ft(r,!0))+`
+`}blockquote({tokens:e}){return`
+${this.parser.parse(e)}
+`}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`${this.parser.parseInline(e)} +`}hr(e){return`
+`}list(e){let t=e.ordered,n=e.start,s="";for(let o=0;o +`+s+" +`}listitem(e){let t="";if(e.task){let n=this.checkbox({checked:!!e.checked});e.loose?e.tokens[0]?.type==="paragraph"?(e.tokens[0].text=n+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&e.tokens[0].tokens[0].type==="text"&&(e.tokens[0].tokens[0].text=n+" "+ft(e.tokens[0].tokens[0].text),e.tokens[0].tokens[0].escaped=!0)):e.tokens.unshift({type:"text",raw:n+" ",text:n+" ",escaped:!0}):t+=n+" "}return t+=this.parser.parse(e.tokens,!!e.loose),`
  • ${t}
  • +`}checkbox({checked:e}){return"'}paragraph({tokens:e}){return`

    ${this.parser.parseInline(e)}

    +`}table(e){let t="",n="";for(let r=0;r${s}`),` + +`+t+` +`+s+`
    +`}tablerow({text:e}){return` +${e} +`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+` +`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${ft(e,!0)}`}br(e){return"
    "}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:t,tokens:n}){let s=this.parser.parseInline(n),r=_o(e);if(r===null)return s;e=r;let i='
    ",i}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let r=_o(e);if(r===null)return ft(n);e=r;let i=`${n}{let o=r[i].flat(1/0);n=n.concat(this.walkTokens(o,t))}):r.tokens&&(n=n.concat(this.walkTokens(r.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(r=>{if(!r.name)throw new Error("extension name required");if("renderer"in r){let i=t.renderers[r.name];i?t.renderers[r.name]=function(...o){let l=r.renderer.apply(this,o);return l===!1&&(l=i.apply(this,o)),l}:t.renderers[r.name]=r.renderer}if("tokenizer"in r){if(!r.level||r.level!=="block"&&r.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let i=t[r.level];i?i.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level==="block"?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level==="inline"&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}"childTokens"in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),s.extensions=t),n.renderer){let r=this.defaults.renderer||new vs(this.defaults);for(let i in n.renderer){if(!(i in r))throw new Error(`renderer '${i}' does not exist`);if(["options","parser"].includes(i))continue;let o=i,l=n.renderer[o],a=r[o];r[o]=(...c)=>{let u=l.apply(r,c);return u===!1&&(u=a.apply(r,c)),u||""}}s.renderer=r}if(n.tokenizer){let r=this.defaults.tokenizer||new Es(this.defaults);for(let i in n.tokenizer){if(!(i in r))throw new Error(`tokenizer '${i}' does not exist`);if(["options","rules","lexer"].includes(i))continue;let o=i,l=n.tokenizer[o],a=r[o];r[o]=(...c)=>{let u=l.apply(r,c);return u===!1&&(u=a.apply(r,c)),u}}s.tokenizer=r}if(n.hooks){let r=this.defaults.hooks||new Cn;for(let i in n.hooks){if(!(i in r))throw new Error(`hook '${i}' does not exist`);if(["options","block"].includes(i))continue;let o=i,l=n.hooks[o],a=r[o];Cn.passThroughHooks.has(i)?r[o]=c=>{if(this.defaults.async&&Cn.passThroughHooksRespectAsync.has(i))return Promise.resolve(l.call(r,c)).then(p=>a.call(r,p));let u=l.call(r,c);return a.call(r,u)}:r[o]=(...c)=>{let u=l.apply(r,c);return u===!1&&(u=a.apply(r,c)),u}}s.hooks=r}if(n.walkTokens){let r=this.defaults.walkTokens,i=n.walkTokens;s.walkTokens=function(o){let l=[];return l.push(i.call(this,o)),r&&(l=l.concat(r.call(this,o))),l}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return Ct.lex(e,t??this.defaults)}parser(e,t){return Ot.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let s={...n},r={...this.defaults,...s},i=this.onError(!!r.silent,!!r.async);if(this.defaults.async===!0&&s.async===!1)return i(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return i(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return i(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));r.hooks&&(r.hooks.options=r,r.hooks.block=e);let o=r.hooks?r.hooks.provideLexer():e?Ct.lex:Ct.lexInline,l=r.hooks?r.hooks.provideParser():e?Ot.parse:Ot.parseInline;if(r.async)return Promise.resolve(r.hooks?r.hooks.preprocess(t):t).then(a=>o(a,r)).then(a=>r.hooks?r.hooks.processAllTokens(a):a).then(a=>r.walkTokens?Promise.all(this.walkTokens(a,r.walkTokens)).then(()=>a):a).then(a=>l(a,r)).then(a=>r.hooks?r.hooks.postprocess(a):a).catch(i);try{r.hooks&&(t=r.hooks.preprocess(t));let a=o(t,r);r.hooks&&(a=r.hooks.processAllTokens(a)),r.walkTokens&&this.walkTokens(a,r.walkTokens);let c=l(a,r);return r.hooks&&(c=r.hooks.postprocess(c)),c}catch(a){return i(a)}}}onError(e,t){return n=>{if(n.message+=` +Please report this to https://github.com/markedjs/marked.`,e){let s="

    An error occurred:

    "+ft(n.message+"",!0)+"
    ";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}},Xt=new Pp;function ne(e,t){return Xt.parse(e,t)}ne.options=ne.setOptions=function(e){return Xt.setOptions(e),ne.defaults=Xt.defaults,ql(ne.defaults),ne};ne.getDefaults=Jr;ne.defaults=Jt;ne.use=function(...e){return Xt.use(...e),ne.defaults=Xt.defaults,ql(ne.defaults),ne};ne.walkTokens=function(e,t){return Xt.walkTokens(e,t)};ne.parseInline=Xt.parseInline;ne.Parser=Ot;ne.parser=Ot.parse;ne.Renderer=vs;ne.TextRenderer=li;ne.Lexer=Ct;ne.lexer=Ct.lex;ne.Tokenizer=Es;ne.Hooks=Cn;ne.parse=ne;ne.options;ne.setOptions;ne.use;ne.walkTokens;ne.parseInline;Ot.parse;Ct.lex;/*! @license DOMPurify 3.2.7 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.7/LICENSE */const{entries:ra,setPrototypeOf:wo,isFrozen:Ip,getPrototypeOf:Lp,getOwnPropertyDescriptor:Mp}=Object;let{freeze:$e,seal:Je,create:ia}=Object,{apply:Or,construct:Pr}=typeof Reflect<"u"&&Reflect;$e||($e=function(t){return t});Je||(Je=function(t){return t});Or||(Or=function(t,n){for(var s=arguments.length,r=new Array(s>2?s-2:0),i=2;i1?n-1:0),r=1;r1?n-1:0),r=1;r2&&arguments[2]!==void 0?arguments[2]:ps;wo&&wo(e,null);let s=t.length;for(;s--;){let r=t[s];if(typeof r=="string"){const i=n(r);i!==r&&(Ip(t)||(t[s]=i),r=i)}e[r]=!0}return e}function zp(e){for(let t=0;t/gm),Vp=Je(/\$\{[\w\W]*/gm),Gp=Je(/^data-[\-\w.\u00B7-\uFFFF]+$/),qp=Je(/^aria-[\-\w]+$/),oa=Je(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Kp=Je(/^(?:\w+script|data):/i),Yp=Je(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),la=Je(/^html$/i),Zp=Je(/^[a-z][.\w]*(-[.\w]+)+$/i);var Ao=Object.freeze({__proto__:null,ARIA_ATTR:qp,ATTR_WHITESPACE:Yp,CUSTOM_ELEMENT:Zp,DATA_ATTR:Gp,DOCTYPE_NAME:la,ERB_EXPR:Wp,IS_ALLOWED_URI:oa,IS_SCRIPT_OR_DATA:Kp,MUSTACHE_EXPR:jp,TMPLIT_EXPR:Vp});const An={element:1,text:3,progressingInstruction:7,comment:8,document:9},Xp=function(){return typeof window>"u"?null:window},Qp=function(t,n){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let s=null;const r="data-tt-policy-suffix";n&&n.hasAttribute(r)&&(s=n.getAttribute(r));const i="dompurify"+(s?"#"+s:"");try{return t.createPolicy(i,{createHTML(o){return o},createScriptURL(o){return o}})}catch{return console.warn("TrustedTypes policy "+i+" could not be created."),null}},Ro=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function aa(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Xp();const t=H=>aa(H);if(t.version="3.2.7",t.removed=[],!e||!e.document||e.document.nodeType!==An.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e;const s=n,r=s.currentScript,{DocumentFragment:i,HTMLTemplateElement:o,Node:l,Element:a,NodeFilter:c,NamedNodeMap:u=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:p,DOMParser:g,trustedTypes:b}=e,k=a.prototype,R=Tn(k,"cloneNode"),j=Tn(k,"remove"),I=Tn(k,"nextSibling"),O=Tn(k,"childNodes"),M=Tn(k,"parentNode");if(typeof o=="function"){const H=n.createElement("template");H.content&&H.content.ownerDocument&&(n=H.content.ownerDocument)}let A,W="";const{implementation:oe,createNodeIterator:K,createDocumentFragment:He,getElementsByTagName:lt}=n,{importNode:Ke}=s;let pe=Ro();t.isSupported=typeof ra=="function"&&typeof M=="function"&&oe&&oe.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:et,ERB_EXPR:ze,TMPLIT_EXPR:xt,DATA_ATTR:Dt,ARIA_ATTR:ge,IS_SCRIPT_OR_DATA:X,ATTR_WHITESPACE:Y,CUSTOM_ELEMENT:tt}=Ao;let{IS_ALLOWED_URI:nt}=Ao,re=null;const ke=q({},[...So,...ar,...cr,...ur,...Eo]);let he=null;const yt=q({},[...vo,...fr,...To,...os]);let ue=Object.seal(ia(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),xe=null,y=null,D=!0,P=!0,N=!1,Q=!0,f=!1,h=!0,m=!1,x=!1,w=!1,_=!1,C=!1,T=!1,v=!0,S=!1;const z="user-content-";let L=!0,F=!1,U={},G=null;const ie=q({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Z=null;const Se=q({},["audio","video","img","source","image","track"]);let ye=null;const We=q({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ie="http://www.w3.org/1998/Math/MathML",at="http://www.w3.org/2000/svg",Ye="http://www.w3.org/1999/xhtml";let me=Ye,Ue=!1,en=null;const Qn=q({},[Ie,at,Ye],or);let Jn=q({},["mi","mo","mn","ms","mtext"]),es=q({},["annotation-xml"]);const ca=q({},["title","style","font","a","script"]);let bn=null;const ua=["application/xhtml+xml","text/html"],fa="text/html";let we=null,tn=null;const pa=n.createElement("form"),ai=function(d){return d instanceof RegExp||d instanceof Function},Ws=function(){let d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(tn&&tn===d)){if((!d||typeof d!="object")&&(d={}),d=vt(d),bn=ua.indexOf(d.PARSER_MEDIA_TYPE)===-1?fa:d.PARSER_MEDIA_TYPE,we=bn==="application/xhtml+xml"?or:ps,re=st(d,"ALLOWED_TAGS")?q({},d.ALLOWED_TAGS,we):ke,he=st(d,"ALLOWED_ATTR")?q({},d.ALLOWED_ATTR,we):yt,en=st(d,"ALLOWED_NAMESPACES")?q({},d.ALLOWED_NAMESPACES,or):Qn,ye=st(d,"ADD_URI_SAFE_ATTR")?q(vt(We),d.ADD_URI_SAFE_ATTR,we):We,Z=st(d,"ADD_DATA_URI_TAGS")?q(vt(Se),d.ADD_DATA_URI_TAGS,we):Se,G=st(d,"FORBID_CONTENTS")?q({},d.FORBID_CONTENTS,we):ie,xe=st(d,"FORBID_TAGS")?q({},d.FORBID_TAGS,we):vt({}),y=st(d,"FORBID_ATTR")?q({},d.FORBID_ATTR,we):vt({}),U=st(d,"USE_PROFILES")?d.USE_PROFILES:!1,D=d.ALLOW_ARIA_ATTR!==!1,P=d.ALLOW_DATA_ATTR!==!1,N=d.ALLOW_UNKNOWN_PROTOCOLS||!1,Q=d.ALLOW_SELF_CLOSE_IN_ATTR!==!1,f=d.SAFE_FOR_TEMPLATES||!1,h=d.SAFE_FOR_XML!==!1,m=d.WHOLE_DOCUMENT||!1,_=d.RETURN_DOM||!1,C=d.RETURN_DOM_FRAGMENT||!1,T=d.RETURN_TRUSTED_TYPE||!1,w=d.FORCE_BODY||!1,v=d.SANITIZE_DOM!==!1,S=d.SANITIZE_NAMED_PROPS||!1,L=d.KEEP_CONTENT!==!1,F=d.IN_PLACE||!1,nt=d.ALLOWED_URI_REGEXP||oa,me=d.NAMESPACE||Ye,Jn=d.MATHML_TEXT_INTEGRATION_POINTS||Jn,es=d.HTML_INTEGRATION_POINTS||es,ue=d.CUSTOM_ELEMENT_HANDLING||{},d.CUSTOM_ELEMENT_HANDLING&&ai(d.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(ue.tagNameCheck=d.CUSTOM_ELEMENT_HANDLING.tagNameCheck),d.CUSTOM_ELEMENT_HANDLING&&ai(d.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(ue.attributeNameCheck=d.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),d.CUSTOM_ELEMENT_HANDLING&&typeof d.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(ue.allowCustomizedBuiltInElements=d.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),f&&(P=!1),C&&(_=!0),U&&(re=q({},Eo),he=[],U.html===!0&&(q(re,So),q(he,vo)),U.svg===!0&&(q(re,ar),q(he,fr),q(he,os)),U.svgFilters===!0&&(q(re,cr),q(he,fr),q(he,os)),U.mathMl===!0&&(q(re,ur),q(he,To),q(he,os))),d.ADD_TAGS&&(re===ke&&(re=vt(re)),q(re,d.ADD_TAGS,we)),d.ADD_ATTR&&(he===yt&&(he=vt(he)),q(he,d.ADD_ATTR,we)),d.ADD_URI_SAFE_ATTR&&q(ye,d.ADD_URI_SAFE_ATTR,we),d.FORBID_CONTENTS&&(G===ie&&(G=vt(G)),q(G,d.FORBID_CONTENTS,we)),L&&(re["#text"]=!0),m&&q(re,["html","head","body"]),re.table&&(q(re,["tbody"]),delete xe.tbody),d.TRUSTED_TYPES_POLICY){if(typeof d.TRUSTED_TYPES_POLICY.createHTML!="function")throw vn('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof d.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw vn('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');A=d.TRUSTED_TYPES_POLICY,W=A.createHTML("")}else A===void 0&&(A=Qp(b,r)),A!==null&&typeof W=="string"&&(W=A.createHTML(""));$e&&$e(d),tn=d}},ci=q({},[...ar,...cr,...Up]),ui=q({},[...ur,...Bp]),ha=function(d){let E=M(d);(!E||!E.tagName)&&(E={namespaceURI:me,tagName:"template"});const $=ps(d.tagName),de=ps(E.tagName);return en[d.namespaceURI]?d.namespaceURI===at?E.namespaceURI===Ye?$==="svg":E.namespaceURI===Ie?$==="svg"&&(de==="annotation-xml"||Jn[de]):!!ci[$]:d.namespaceURI===Ie?E.namespaceURI===Ye?$==="math":E.namespaceURI===at?$==="math"&&es[de]:!!ui[$]:d.namespaceURI===Ye?E.namespaceURI===at&&!es[de]||E.namespaceURI===Ie&&!Jn[de]?!1:!ui[$]&&(ca[$]||!ci[$]):!!(bn==="application/xhtml+xml"&&en[d.namespaceURI]):!1},ct=function(d){Sn(t.removed,{element:d});try{M(d).removeChild(d)}catch{j(d)}},Vt=function(d,E){try{Sn(t.removed,{attribute:E.getAttributeNode(d),from:E})}catch{Sn(t.removed,{attribute:null,from:E})}if(E.removeAttribute(d),d==="is")if(_||C)try{ct(E)}catch{}else try{E.setAttribute(d,"")}catch{}},fi=function(d){let E=null,$=null;if(w)d=""+d;else{const be=lr(d,/^[\r\n\t ]+/);$=be&&be[0]}bn==="application/xhtml+xml"&&me===Ye&&(d=''+d+"");const de=A?A.createHTML(d):d;if(me===Ye)try{E=new g().parseFromString(de,bn)}catch{}if(!E||!E.documentElement){E=oe.createDocument(me,"template",null);try{E.documentElement.innerHTML=Ue?W:de}catch{}}const Ae=E.body||E.documentElement;return d&&$&&Ae.insertBefore(n.createTextNode($),Ae.childNodes[0]||null),me===Ye?lt.call(E,m?"html":"body")[0]:m?E.documentElement:Ae},pi=function(d){return K.call(d.ownerDocument||d,d,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},Vs=function(d){return d instanceof p&&(typeof d.nodeName!="string"||typeof d.textContent!="string"||typeof d.removeChild!="function"||!(d.attributes instanceof u)||typeof d.removeAttribute!="function"||typeof d.setAttribute!="function"||typeof d.namespaceURI!="string"||typeof d.insertBefore!="function"||typeof d.hasChildNodes!="function")},hi=function(d){return typeof l=="function"&&d instanceof l};function wt(H,d,E){is(H,$=>{$.call(t,d,E,tn)})}const di=function(d){let E=null;if(wt(pe.beforeSanitizeElements,d,null),Vs(d))return ct(d),!0;const $=we(d.nodeName);if(wt(pe.uponSanitizeElement,d,{tagName:$,allowedTags:re}),h&&d.hasChildNodes()&&!hi(d.firstElementChild)&&Le(/<[/\w!]/g,d.innerHTML)&&Le(/<[/\w!]/g,d.textContent)||d.nodeType===An.progressingInstruction||h&&d.nodeType===An.comment&&Le(/<[/\w]/g,d.data))return ct(d),!0;if(!re[$]||xe[$]){if(!xe[$]&&mi($)&&(ue.tagNameCheck instanceof RegExp&&Le(ue.tagNameCheck,$)||ue.tagNameCheck instanceof Function&&ue.tagNameCheck($)))return!1;if(L&&!G[$]){const de=M(d)||d.parentNode,Ae=O(d)||d.childNodes;if(Ae&&de){const be=Ae.length;for(let Be=be-1;Be>=0;--Be){const kt=R(Ae[Be],!0);kt.__removalCount=(d.__removalCount||0)+1,de.insertBefore(kt,I(d))}}}return ct(d),!0}return d instanceof a&&!ha(d)||($==="noscript"||$==="noembed"||$==="noframes")&&Le(/<\/no(script|embed|frames)/i,d.innerHTML)?(ct(d),!0):(f&&d.nodeType===An.text&&(E=d.textContent,is([et,ze,xt],de=>{E=En(E,de," ")}),d.textContent!==E&&(Sn(t.removed,{element:d.cloneNode()}),d.textContent=E)),wt(pe.afterSanitizeElements,d,null),!1)},gi=function(d,E,$){if(v&&(E==="id"||E==="name")&&($ in n||$ in pa))return!1;if(!(P&&!y[E]&&Le(Dt,E))){if(!(D&&Le(ge,E))){if(!he[E]||y[E]){if(!(mi(d)&&(ue.tagNameCheck instanceof RegExp&&Le(ue.tagNameCheck,d)||ue.tagNameCheck instanceof Function&&ue.tagNameCheck(d))&&(ue.attributeNameCheck instanceof RegExp&&Le(ue.attributeNameCheck,E)||ue.attributeNameCheck instanceof Function&&ue.attributeNameCheck(E,d))||E==="is"&&ue.allowCustomizedBuiltInElements&&(ue.tagNameCheck instanceof RegExp&&Le(ue.tagNameCheck,$)||ue.tagNameCheck instanceof Function&&ue.tagNameCheck($))))return!1}else if(!ye[E]){if(!Le(nt,En($,Y,""))){if(!((E==="src"||E==="xlink:href"||E==="href")&&d!=="script"&&$p($,"data:")===0&&Z[d])){if(!(N&&!Le(X,En($,Y,"")))){if($)return!1}}}}}}return!0},mi=function(d){return d!=="annotation-xml"&&lr(d,tt)},bi=function(d){wt(pe.beforeSanitizeAttributes,d,null);const{attributes:E}=d;if(!E||Vs(d))return;const $={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:he,forceKeepAttr:void 0};let de=E.length;for(;de--;){const Ae=E[de],{name:be,namespaceURI:Be,value:kt}=Ae,nn=we(be),Gs=kt;let Ee=be==="value"?Gs:Fp(Gs);if($.attrName=nn,$.attrValue=Ee,$.keepAttr=!0,$.forceKeepAttr=void 0,wt(pe.uponSanitizeAttribute,d,$),Ee=$.attrValue,S&&(nn==="id"||nn==="name")&&(Vt(be,d),Ee=z+Ee),h&&Le(/((--!?|])>)|<\/(style|title|textarea)/i,Ee)){Vt(be,d);continue}if(nn==="attributename"&&lr(Ee,"href")){Vt(be,d);continue}if($.forceKeepAttr)continue;if(!$.keepAttr){Vt(be,d);continue}if(!Q&&Le(/\/>/i,Ee)){Vt(be,d);continue}f&&is([et,ze,xt],xi=>{Ee=En(Ee,xi," ")});const _i=we(d.nodeName);if(!gi(_i,nn,Ee)){Vt(be,d);continue}if(A&&typeof b=="object"&&typeof b.getAttributeType=="function"&&!Be)switch(b.getAttributeType(_i,nn)){case"TrustedHTML":{Ee=A.createHTML(Ee);break}case"TrustedScriptURL":{Ee=A.createScriptURL(Ee);break}}if(Ee!==Gs)try{Be?d.setAttributeNS(Be,be,Ee):d.setAttribute(be,Ee),Vs(d)?ct(d):ko(t.removed)}catch{Vt(be,d)}}wt(pe.afterSanitizeAttributes,d,null)},da=function H(d){let E=null;const $=pi(d);for(wt(pe.beforeSanitizeShadowDOM,d,null);E=$.nextNode();)wt(pe.uponSanitizeShadowNode,E,null),di(E),bi(E),E.content instanceof i&&H(E.content);wt(pe.afterSanitizeShadowDOM,d,null)};return t.sanitize=function(H){let d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},E=null,$=null,de=null,Ae=null;if(Ue=!H,Ue&&(H=""),typeof H!="string"&&!hi(H))if(typeof H.toString=="function"){if(H=H.toString(),typeof H!="string")throw vn("dirty is not a string, aborting")}else throw vn("toString is not a function");if(!t.isSupported)return H;if(x||Ws(d),t.removed=[],typeof H=="string"&&(F=!1),F){if(H.nodeName){const kt=we(H.nodeName);if(!re[kt]||xe[kt])throw vn("root node is forbidden and cannot be sanitized in-place")}}else if(H instanceof l)E=fi(""),$=E.ownerDocument.importNode(H,!0),$.nodeType===An.element&&$.nodeName==="BODY"||$.nodeName==="HTML"?E=$:E.appendChild($);else{if(!_&&!f&&!m&&H.indexOf("<")===-1)return A&&T?A.createHTML(H):H;if(E=fi(H),!E)return _?null:T?W:""}E&&w&&ct(E.firstChild);const be=pi(F?H:E);for(;de=be.nextNode();)di(de),bi(de),de.content instanceof i&&da(de.content);if(F)return H;if(_){if(C)for(Ae=He.call(E.ownerDocument);E.firstChild;)Ae.appendChild(E.firstChild);else Ae=E;return(he.shadowroot||he.shadowrootmode)&&(Ae=Ke.call(s,Ae,!0)),Ae}let Be=m?E.outerHTML:E.innerHTML;return m&&re["!doctype"]&&E.ownerDocument&&E.ownerDocument.doctype&&E.ownerDocument.doctype.name&&Le(la,E.ownerDocument.doctype.name)&&(Be=" +`+Be),f&&is([et,ze,xt],kt=>{Be=En(Be,kt," ")}),A&&T?A.createHTML(Be):Be},t.setConfig=function(){let H=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Ws(H),x=!0},t.clearConfig=function(){tn=null,x=!1},t.isValidAttribute=function(H,d,E){tn||Ws({});const $=we(H),de=we(d);return gi($,de,E)},t.addHook=function(H,d){typeof d=="function"&&Sn(pe[H],d)},t.removeHook=function(H,d){if(d!==void 0){const E=Dp(pe[H],d);return E===-1?void 0:Np(pe[H],E,1)[0]}return ko(pe[H])},t.removeHooks=function(H){pe[H]=[]},t.removeAllHooks=function(){pe=Ro()},t}var Jp=aa();const eh={class:"log-viewer"},th={class:"header"},nh={class:"controls"},sh={class:"timestamp"},rh={class:"level"},ih={class:"target"},oh=["innerHTML"],lh={key:0,class:"loading-state"},ah={key:1,class:"empty-state"},ch={class:"footer"},uh={class:"count"},fh={__name:"LogView",setup(e){ne.setOptions({breaks:!0,gfm:!0});const t=$t([]),n=$t(!0),s=$t(!1),r=$t(!0),i=$t("ALL"),o=$t(null);let l=null,a=!1;const c=new Set,u=Ze(()=>i.value==="ALL"?t.value:t.value.filter(I=>I.level===i.value));function p(I){return new Date(I.secs_since_epoch*1e3).toLocaleTimeString("fr-FR",{hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3})}function g(I){const O=ne.parse(I,{async:!1});return Jp.sanitize(O,{ALLOWED_TAGS:["strong","em","code","pre","a","ul","ol","li","p","br"],ALLOWED_ATTR:["href","target"]})}function b(){n.value=!n.value,n.value&&R()}function k(){t.value=[],c.clear()}function R(){!o.value||!n.value||Ds(()=>{o.value.scrollTop=o.value.scrollHeight})}function j(){const I=window.location.origin;l=new EventSource(`${I}/log-sse`),l.onopen=()=>{s.value=!0,console.log("SSE connection opened")},l.onmessage=A=>{try{const W=JSON.parse(A.data),oe=`${W.timestamp.secs_since_epoch}-${W.timestamp.nanos_since_epoch}-${W.message}-${W.target}`;if(c.has(oe))return;if(c.add(oe),a||(W.isHistory=!0),t.value.push(W),t.value.length>1e3){const K=t.value.shift(),He=`${K.timestamp.secs_since_epoch}-${K.timestamp.nanos_since_epoch}-${K.message}-${K.target}`;c.delete(He)}R()}catch(W){console.error("Failed to parse log entry:",W)}},l.onerror=()=>{s.value=!1,r.value=!1,console.error("SSE connection error"),setTimeout(()=>{l.readyState===EventSource.CLOSED&&(a=!1,j())},3e3)};let O;const M=l.onmessage;l.onmessage=A=>{clearTimeout(O),M(A),a||(O=setTimeout(()=>{a=!0,r.value=!1,console.log("History loaded, now streaming live logs")},500))}}return cl(()=>{j()}),Gr(()=>{l&&l.close()}),Nn(o,I=>{I&&I.addEventListener("scroll",()=>{!(I.scrollHeight-I.scrollTop<=I.clientHeight+50)&&n.value&&(n.value=!1)})}),(I,O)=>(Ut(),Yt("div",eh,[le("div",th,[O[2]||(O[2]=le("h2",null,"📋 System Logs",-1)),le("div",nh,[le("button",{onClick:b,class:cn({active:n.value})},ht(n.value?"📌 Auto-scroll ON":"📌 Auto-scroll OFF"),3),le("button",{onClick:k},"🗑️ Clear"),rc(le("select",{"onUpdate:modelValue":O[0]||(O[0]=M=>i.value=M),class:"filter"},[...O[1]||(O[1]=[nu('',6)])],512),[[Du,i.value]])])]),le("div",{class:"log-container",ref_key:"logContainer",ref:o},[(Ut(!0),Yt(rt,null,kc(u.value,(M,A)=>(Ut(),Yt("div",{key:A,class:cn(["log-entry",`level-${M.level.toLowerCase()}`,{"is-history":M.isHistory}])},[le("span",sh,ht(p(M.timestamp)),1),le("span",rh,ht(M.level),1),le("span",ih,ht(M.target),1),le("span",{class:"message markdown-content",innerHTML:g(M.message)},null,8,oh)],2))),128)),r.value?(Ut(),Yt("div",lh," ⏳ Loading history... ")):u.value.length===0?(Ut(),Yt("div",ah,ht(s.value?"Waiting for logs...":"Connecting to log stream..."),1)):su("",!0)],512),le("div",ch,[le("span",{class:cn(["status",{connected:s.value}])},ht(s.value?"🟢 Connected":"🔴 Disconnected"),3),le("span",uh,ht(u.value.length)+" logs",1)])]))}},ph=Zr(fh,[["__scopeId","data-v-b58606ca"]]),hh=[{path:"/",name:"home",component:Yf},{path:"/logs",name:"logs",component:ph}],dh=Vf({history:yf("/app"),routes:hh});Fu(Bu).use(dh).mount("#app"); diff --git a/pmoserver/webapp/dist/assets/index-Qw8Jzbm-.css b/pmoserver/webapp/dist/assets/index-Qw8Jzbm-.css new file mode 100644 index 00000000..671e3fad --- /dev/null +++ b/pmoserver/webapp/dist/assets/index-Qw8Jzbm-.css @@ -0,0 +1 @@ +nav[data-v-8858e74d]{background:#333;width:100vw;padding:.5rem}a[data-v-8858e74d]{color:#eee;margin:0 .5rem}a.router-link-active[data-v-8858e74d]{font-weight:700;text-decoration:underline}.read-the-docs[data-v-cc337d8c]{color:#888}.log-viewer[data-v-b58606ca]{display:flex;flex-direction:column;height:80vh;width:100vw;margin:0;padding:0;background:#1e1e1e;color:#d4d4d4;font-family:Consolas,Monaco,monospace;box-sizing:border-box}.header[data-v-b58606ca]{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;background:#252526;border-bottom:1px solid #3e3e42;flex-wrap:wrap;gap:.5rem}.header h2[data-v-b58606ca]{margin:0;color:#fff;font-size:1.2rem;flex-shrink:0}@media (max-width: 768px){.header[data-v-b58606ca]{padding:.75rem 1rem}.header h2[data-v-b58606ca]{font-size:1rem;width:100%}}.controls[data-v-b58606ca]{display:flex;gap:.5rem;flex-wrap:wrap}@media (max-width: 768px){.controls[data-v-b58606ca]{width:100%;justify-content:space-between}}button[data-v-b58606ca]{padding:.5rem 1rem;background:#3c3c3c;color:#d4d4d4;border:1px solid #555;border-radius:4px;cursor:pointer;font-size:.9rem;transition:all .2s;white-space:nowrap}@media (max-width: 768px){button[data-v-b58606ca]{padding:.4rem .7rem;font-size:.8rem;flex:1;min-width:0}}button[data-v-b58606ca]:hover{background:#505050}button.active[data-v-b58606ca]{background:#0e639c;border-color:#17b}.filter[data-v-b58606ca]{padding:.5rem;background:#3c3c3c;color:#d4d4d4;border:1px solid #555;border-radius:4px;cursor:pointer}@media (max-width: 768px){.filter[data-v-b58606ca]{padding:.4rem;font-size:.8rem;flex:1;min-width:0}}.log-container[data-v-b58606ca]{flex:1;overflow-y:auto;padding:1rem;background:#1e1e1e}.log-entry[data-v-b58606ca]{display:grid;grid-template-columns:130px 80px 200px 1fr;gap:1rem;padding:.5rem;margin-bottom:.25rem;border-left:3px solid transparent;font-size:.9rem;line-height:1.4}@media (max-width: 768px){.log-entry[data-v-b58606ca]{grid-template-columns:1fr;gap:.3rem;padding:.75rem .5rem;font-size:.85rem;border-left-width:4px}}.log-entry[data-v-b58606ca]:hover{background:#2d2d30}.log-entry.is-history[data-v-b58606ca]{opacity:.7}.timestamp[data-v-b58606ca]{color:#858585;font-weight:500}@media (max-width: 768px){.timestamp[data-v-b58606ca]{font-size:.75rem;order:1}}.level[data-v-b58606ca]{font-weight:700;text-transform:uppercase;padding:.1rem .5rem;border-radius:3px;text-align:center}@media (max-width: 768px){.level[data-v-b58606ca]{order:2;width:fit-content;font-size:.75rem;padding:.2rem .6rem}}.target[data-v-b58606ca]{color:#4ec9b0;font-style:italic}@media (max-width: 768px){.target[data-v-b58606ca]{order:3;font-size:.8rem;color:#6eb8a5}}.message[data-v-b58606ca]{color:#d4d4d4;word-break:break-word;text-align:left}@media (max-width: 768px){.message[data-v-b58606ca]{order:4;margin-top:.25rem}}.markdown-content[data-v-b58606ca]{line-height:1.5}.markdown-content[data-v-b58606ca] code{background:#3c3c3c;padding:.1rem .3rem;border-radius:3px;font-family:Consolas,Monaco,monospace;font-size:.85em;color:#ce9178}.markdown-content[data-v-b58606ca] pre{background:#2d2d30;padding:.5rem;border-radius:4px;overflow-x:auto;margin:.25rem 0}.markdown-content[data-v-b58606ca] pre code{background:transparent;padding:0;color:#d4d4d4}.markdown-content[data-v-b58606ca] strong{color:#fff;font-weight:700}.markdown-content[data-v-b58606ca] em{color:#dcdcaa;font-style:italic}.markdown-content[data-v-b58606ca] a{color:#569cd6;text-decoration:none}.markdown-content[data-v-b58606ca] a:hover{text-decoration:underline}.markdown-content[data-v-b58606ca] p{margin:0;display:inline}.markdown-content[data-v-b58606ca] ul,.markdown-content[data-v-b58606ca] ol{margin:.25rem 0;padding-left:1.5rem}.level-trace[data-v-b58606ca]{border-left-color:gray}.level-trace .level[data-v-b58606ca]{background:#3a3a3a;color:#a0a0a0}.level-debug[data-v-b58606ca]{border-left-color:#569cd6}.level-debug .level[data-v-b58606ca]{background:#1e3a5f;color:#569cd6}.level-info[data-v-b58606ca]{border-left-color:#4ec9b0}.level-info .level[data-v-b58606ca]{background:#1e4d42;color:#4ec9b0}.level-warn[data-v-b58606ca]{border-left-color:#dcdcaa}.level-warn .level[data-v-b58606ca]{background:#4d4d2a;color:#dcdcaa}.level-error[data-v-b58606ca]{border-left-color:#f48771}.level-error .level[data-v-b58606ca]{background:#5a1e1e;color:#f48771}.empty-state[data-v-b58606ca]{text-align:center;padding:3rem;color:#858585;font-size:1.1rem}.loading-state[data-v-b58606ca]{text-align:center;padding:3rem;color:#569cd6;font-size:1.1rem;animation:pulse-b58606ca 1.5s ease-in-out infinite}@keyframes pulse-b58606ca{0%,to{opacity:1}50%{opacity:.5}}.footer[data-v-b58606ca]{display:flex;justify-content:space-between;padding:.75rem 1.5rem;background:#252526;border-top:1px solid #3e3e42;font-size:.9rem}@media (max-width: 768px){.footer[data-v-b58606ca]{padding:.6rem 1rem;font-size:.8rem}}.status[data-v-b58606ca]{color:#f48771}.status.connected[data-v-b58606ca]{color:#4ec9b0}.count[data-v-b58606ca]{color:#858585}.log-container[data-v-b58606ca]::-webkit-scrollbar{width:12px}.log-container[data-v-b58606ca]::-webkit-scrollbar-track{background:#1e1e1e}.log-container[data-v-b58606ca]::-webkit-scrollbar-thumb{background:#424242;border-radius:6px}.log-container[data-v-b58606ca]::-webkit-scrollbar-thumb:hover{background:#4e4e4e}:root{font-family:system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh;width:100vw}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.card{padding:2em}#app{max-width:1280px;margin:0 auto;padding:2rem;text-align:center}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}} diff --git a/pmoserver/webapp/dist/index.html b/pmoserver/webapp/dist/index.html new file mode 100644 index 00000000..9317e49f --- /dev/null +++ b/pmoserver/webapp/dist/index.html @@ -0,0 +1,14 @@ + + + + + + + webapp + + + + +
    + + diff --git a/pmoserver/webapp/dist/vite.svg b/pmoserver/webapp/dist/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/pmoserver/webapp/dist/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pmoupnp/Cargo.toml b/pmoupnp/Cargo.toml index ab8bd4b2..d6bf20b4 100644 --- a/pmoupnp/Cargo.toml +++ b/pmoupnp/Cargo.toml @@ -13,28 +13,14 @@ hex = "0.4.3" base64 = "0.22.1" thiserror = "2.0.16" xmltree = "0.11.0" -get_if_addrs = "0.5.3" axum = "0.8.4" -tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync", "time", "signal"] } -tokio-stream = "0.1" -futures-util = "0.3" +tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" chrono = { version = "0.4.42", features = ["serde"] } -log = "0.4.28" once_cell = "1.20" parking_lot = "0.12" tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] } -futures = "0.3" -async-stream = "0.3.6" -axum-server = "0.7.2" -axum-embed = "0.1.0" -rust-embed = "8.7.2" -anyhow = "1.0" -utoipa = { version = "5.4.0", features = ["axum_extras"] } -utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] } -validator = { version = "0.20.0", features = ["derive"] } bevy_reflect = "0.17.1" bevy_reflect_derive = "0.17.1" reqwest = "0.12.23" diff --git a/pmoupnp/src/devices/device_instance.rs b/pmoupnp/src/devices/device_instance.rs index 229646ce..9c74eb71 100644 --- a/pmoupnp/src/devices/device_instance.rs +++ b/pmoupnp/src/devices/device_instance.rs @@ -245,7 +245,7 @@ impl DeviceInstance { } /// Enregistre toutes les URLs du device et de ses services dans le serveur. - pub fn register_urls<'a>(&'a self, server: &'a mut crate::server::Server) -> std::pin::Pin> + 'a>> { + pub fn register_urls<'a, S: crate::UpnpServer + ?Sized>(&'a self, server: &'a mut S) -> std::pin::Pin> + 'a>> { Box::pin(async move { info!( "✅ Device description for {} available at: {}{}", diff --git a/pmoupnp/src/lib.rs b/pmoupnp/src/lib.rs index a193cf52..9930f3d0 100644 --- a/pmoupnp/src/lib.rs +++ b/pmoupnp/src/lib.rs @@ -10,6 +10,9 @@ pub mod state_variables; pub mod value_ranges; pub mod variable_types; +// Re-exports +pub use server::UpnpServer; + use std::{collections::HashMap, sync::Arc}; diff --git a/pmoupnp/src/server.rs b/pmoupnp/src/server.rs new file mode 100644 index 00000000..007c8342 --- /dev/null +++ b/pmoupnp/src/server.rs @@ -0,0 +1,262 @@ +//! Trait pour les serveurs UPnP +//! +//! Ce module définit le trait [`UpnpServer`] qui permet de connecter +//! des devices UPnP à n'importe quelle implémentation de serveur web. +//! +//! ## Architecture +//! +//! Le trait `UpnpServer` définit une interface minimale permettant aux devices +//! et services UPnP d'enregistrer leurs endpoints HTTP sans dépendre d'une +//! implémentation de serveur spécifique. +//! +//! ## Séparation des responsabilités +//! +//! - **pmoupnp** : Définit le trait `UpnpServer` et l'utilise via des contraintes génériques +//! - **pmoserver** : Fournit une implémentation concrète basée sur Axum +//! - **Autres crates** : Peuvent fournir leurs propres implémentations (actix-web, warp, etc.) +//! +//! ## Exemple d'utilisation +//! +//! ```rust,no_run +//! use pmoupnp::{UpnpServer, devices::{Device, DeviceInstance}}; +//! use std::sync::Arc; +//! +//! # async fn example(mut server: S) { +//! // Créer un device +//! let device = Device::new( +//! "MyDevice".to_string(), +//! "MyDeviceType".to_string(), +//! "Friendly Name".to_string(), +//! ); +//! let device_instance = Arc::new(DeviceInstance::new(&device)); +//! +//! // Le device enregistre automatiquement ses routes UPnP +//! device_instance.register_urls(&mut server).await; +//! # } +//! ``` +//! +//! ## Implémentation +//! +//! Pour implémenter ce trait, votre serveur doit fournir trois méthodes +//! pour enregistrer des handlers HTTP asynchrones : +//! +//! ```rust,no_run +//! use pmoupnp::UpnpServer; +//! use std::future::Future; +//! use std::pin::Pin; +//! +//! struct MyServer { +//! // votre implémentation +//! } +//! +//! impl UpnpServer for MyServer { +//! fn add_handler(&mut self, path: &str, handler: F) +//! -> Pin + Send + '_>> +//! where +//! F: Fn() -> Fut + Send + Sync + 'static + Clone, +//! Fut: Future + Send + 'static, +//! { +//! // Enregistrer le handler pour GET requests +//! # todo!() +//! } +//! +//! fn add_post_handler_with_state( +//! &mut self, +//! path: &str, +//! handler: fn(axum::extract::State, String) +//! -> Pin + Send>>, +//! state: S, +//! ) -> Pin + Send + '_>> +//! where +//! S: Clone + Send + Sync + 'static, +//! { +//! // Enregistrer le handler pour POST avec body +//! # todo!() +//! } +//! +//! fn add_handler_with_state( +//! &mut self, +//! path: &str, +//! handler: fn(axum::extract::State, +//! pmoupnp::server::HeaderMap, +//! pmoupnp::server::Request) +//! -> Pin + Send>>, +//! state: S, +//! ) -> Pin + Send + '_>> +//! where +//! S: Clone + Send + Sync + 'static, +//! { +//! // Enregistrer le handler avec accès complet à la requête +//! # todo!() +//! } +//! } +//! ``` + +use std::future::Future; +use std::pin::Pin; + +/// Type alias pour la réponse HTTP (basé sur Axum). +/// +/// Utilisé pour éviter une dépendance directe sur axum dans les signatures de trait, +/// tout en restant compatible avec les types Axum. +pub type Response = axum::response::Response; + +/// Type alias pour les en-têtes HTTP (basé sur Axum). +pub type HeaderMap = axum::http::HeaderMap; + +/// Type alias pour la requête HTTP (basé sur Axum). +pub type Request = axum::extract::Request; + +/// Trait pour les serveurs compatibles UPnP. +/// +/// Ce trait définit l'interface minimale qu'un serveur web doit implémenter +/// pour supporter l'enregistrement automatique des endpoints UPnP par les +/// [`DeviceInstance`](crate::devices::DeviceInstance) et +/// [`ServiceInstance`](crate::services::ServiceInstance). +/// +/// ## Contraintes +/// +/// - `Send + Sync` : Le serveur doit être partageable entre threads +/// +/// ## Méthodes +/// +/// Les trois méthodes permettent d'enregistrer différents types de handlers : +/// +/// 1. **`add_handler`** : Handler GET simple sans état +/// 2. **`add_post_handler_with_state`** : Handler POST avec état et body texte (pour SOAP) +/// 3. **`add_handler_with_state`** : Handler générique avec accès complet (pour SUBSCRIBE/UNSUBSCRIBE) +/// +/// ## Implémentations +/// +/// - **pmoserver::Server** : Implémentation basée sur Axum (fournie par la crate `pmoserver`) +pub trait UpnpServer: Send + Sync { + /// Ajoute un handler GET pour un chemin donné. + /// + /// Utilisé principalement pour servir les descripteurs XML des devices et services. + /// + /// # Arguments + /// + /// * `path` - Le chemin HTTP (ex: `/device/MediaRenderer/description.xml`) + /// * `handler` - Une closure asynchrone qui génère la réponse + /// + /// # Retour + /// + /// Une future qui se résout quand le handler est enregistré. + /// + /// # Exemple + /// + /// ```rust,no_run + /// use pmoupnp::UpnpServer; + /// use axum::response::IntoResponse; + /// + /// # async fn example(mut server: S) { + /// server.add_handler("/description.xml", || async { + /// "".into_response() + /// }).await; + /// # } + /// ``` + fn add_handler(&mut self, path: &str, handler: F) -> Pin + Send + '_>> + where + F: Fn() -> Fut + Send + Sync + 'static + Clone, + Fut: Future + Send + 'static; + + /// Ajoute un handler POST avec état pour un chemin donné. + /// + /// Utilisé pour les endpoints de contrôle SOAP des services UPnP. + /// + /// # Arguments + /// + /// * `path` - Le chemin HTTP (ex: `/service/AVTransport/control`) + /// * `handler` - Un pointeur de fonction qui traite la requête SOAP + /// * `state` - L'état partagé (typiquement une `ServiceInstance`) + /// + /// # Retour + /// + /// Une future qui se résout quand le handler est enregistré. + /// + /// # Exemple + /// + /// ```rust,no_run + /// use pmoupnp::{UpnpServer, server::Response}; + /// use axum::extract::State; + /// use std::pin::Pin; + /// use std::future::Future; + /// + /// fn soap_handler( + /// State(service): State, + /// body: String, + /// ) -> Pin + Send>> { + /// Box::pin(async move { + /// // Traiter la requête SOAP + /// axum::response::Response::default() + /// }) + /// } + /// + /// # async fn example(mut server: S) { + /// server.add_post_handler_with_state( + /// "/control", + /// soap_handler, + /// "ServiceName".to_string(), + /// ).await; + /// # } + /// ``` + fn add_post_handler_with_state( + &mut self, + path: &str, + handler: fn(axum::extract::State, String) -> Pin + Send>>, + state: S, + ) -> Pin + Send + '_>> + where + S: Clone + Send + Sync + 'static; + + /// Ajoute un handler avec état et accès complet à la requête. + /// + /// Utilisé pour les endpoints d'événements (SUBSCRIBE/UNSUBSCRIBE) qui nécessitent + /// un accès aux en-têtes HTTP et à la méthode HTTP. + /// + /// # Arguments + /// + /// * `path` - Le chemin HTTP (ex: `/service/AVTransport/event`) + /// * `handler` - Un pointeur de fonction avec accès complet à la requête + /// * `state` - L'état partagé (typiquement une `ServiceInstance`) + /// + /// # Retour + /// + /// Une future qui se résout quand le handler est enregistré. + /// + /// # Exemple + /// + /// ```rust,no_run + /// use pmoupnp::{UpnpServer, server::{Response, HeaderMap, Request}}; + /// use axum::extract::State; + /// use std::pin::Pin; + /// use std::future::Future; + /// + /// fn event_handler( + /// State(service): State, + /// headers: HeaderMap, + /// req: Request, + /// ) -> Pin + Send>> { + /// Box::pin(async move { + /// // Traiter SUBSCRIBE/UNSUBSCRIBE + /// axum::response::Response::default() + /// }) + /// } + /// + /// # async fn example(mut server: S) { + /// server.add_handler_with_state( + /// "/event", + /// event_handler, + /// "ServiceName".to_string(), + /// ).await; + /// # } + /// ``` + fn add_handler_with_state( + &mut self, + path: &str, + handler: fn(axum::extract::State, HeaderMap, Request) -> Pin + Send>>, + state: S, + ) -> Pin + Send + '_>> + where + S: Clone + Send + Sync + 'static; +} diff --git a/pmoupnp/src/services/service_instance.rs b/pmoupnp/src/services/service_instance.rs index 326d2de7..7fab502d 100644 --- a/pmoupnp/src/services/service_instance.rs +++ b/pmoupnp/src/services/service_instance.rs @@ -4,6 +4,8 @@ use std::{ collections::HashMap, sync::{Arc, Mutex, RwLock}, time::Duration, + pin::Pin, + future::Future, }; use axum::{ extract::{Request, State}, @@ -297,12 +299,12 @@ impl ServiceInstance { &self.actions } - /// Enregistre les routes UPnP dans le serveur Axum. + /// Enregistre les routes UPnP dans le serveur. /// /// # Errors /// /// Retourne une erreur si l'enregistrement des routes échoue. - pub async fn register_urls(&self, server: &mut crate::server::Server) -> Result<(), ServiceError> { + pub async fn register_urls(&self, server: &mut S) -> Result<(), ServiceError> { let device = self.device.read().unwrap(); let device_name = device.as_ref().map(|d| d.get_name().clone()).unwrap_or_else(|| "unknown".to_string()); let server_url = device.as_ref().map(|d| d.base_url().to_string()).unwrap_or_default(); @@ -566,11 +568,12 @@ impl ServiceInstance { } /// Handler Axum pour les événements (SUBSCRIBE/UNSUBSCRIBE). -async fn event_sub_handler( +fn event_sub_handler( State(instance): State, headers: HeaderMap, req: Request, -) -> Response { +) -> Pin + Send>> { + Box::pin(async move { info!("📡 Event Subscription request for {}", instance.get_name()); let method = req.method().as_str(); @@ -633,13 +636,15 @@ async fn event_sub_handler( StatusCode::METHOD_NOT_ALLOWED.into_response() } } + }) } /// Handler Axum pour le contrôle SOAP. -async fn control_handler( +fn control_handler( State(instance): State, - body: String, -) -> Response { + _body: String, +) -> Pin + Send>> { + Box::pin(async move { info!("📡 Control request for {}", instance.get_name()); // TODO: Parser le SOAP et appeler l'action correspondante @@ -661,6 +666,7 @@ async fn control_handler( [(axum::http::header::CONTENT_TYPE, "text/xml; charset=\"utf-8\"")], response_xml, ).into_response() + }) } #[cfg(test)]