Files
ucvl-home-vision/web/ui/assets/index-CWMAn71z.js
T
2026-10-06 22:28:07 +08:00

2 lines
164 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function s(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=s(i);fetch(i.href,o)}})();function ss(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const le={},vt=[],ze=()=>{},dn=()=>!1,xl=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),wl=e=>e.startsWith("onUpdate:"),be=Object.assign,ns=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},Ti=Object.prototype.hasOwnProperty,G=(e,t)=>Ti.call(e,t),E=Array.isArray,ct=e=>Xt(e)==="[object Map]",lt=e=>Xt(e)==="[object Set]",As=e=>Xt(e)==="[object Date]",N=e=>typeof e=="function",re=e=>typeof e=="string",Ze=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",pn=e=>(ee(e)||N(e))&&N(e.then)&&N(e.catch),fn=Object.prototype.toString,Xt=e=>fn.call(e),$i=e=>Xt(e).slice(8,-1),hn=e=>Xt(e)==="[object Object]",is=e=>re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Nt=ss(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),kl=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},Mi=/-\w/g,qe=kl(e=>e.replace(Mi,t=>t.slice(1).toUpperCase())),ji=/\B([A-Z])/g,pt=kl(e=>e.replace(ji,"-$1").toLowerCase()),mn=kl(e=>e.charAt(0).toUpperCase()+e.slice(1)),El=kl(e=>e?`on${mn(e)}`:""),Ue=(e,t)=>!Object.is(e,t),rl=(e,...t)=>{for(let s=0;s<e.length;s++)e[s](...t)},bn=(e,t,s,n=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},gn=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Is;const Cl=()=>Is||(Is=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function jt(e){if(E(e)){const t={};for(let s=0;s<e.length;s++){const n=e[s],i=re(n)?qi(n):jt(n);if(i)for(const o in i)t[o]=i[o]}return t}else if(re(e)||ee(e))return e}const Ai=/;(?![^(]*\))/g,Ii=/:([^]+)/,Pi=/"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g;function qi(e){const t={};return e.replace(Pi,s=>s.startsWith("/*")?"":s).split(Ai).forEach(s=>{if(s){const n=s.split(Ii);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function tt(e){let t="";if(re(e))t=e;else if(E(e))for(let s=0;s<e.length;s++){const n=tt(e[s]);n&&(t+=n+" ")}else if(ee(e))for(const s in e)e[s]&&(t+=s+" ");return t.trim()}const Oi="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Ei=ss(Oi);function vn(e){return!!e||e===""}function Ri(e,t,s){if(e.length!==t.length)return!1;let n=!0;for(let i=0;n&&i<e.length;i++)n=st(e[i],t[i],s);return n}function Ps(e,t,s){if(e.size!==t.size)return!1;const n=Array.from(t),i=new Uint8Array(n.length);for(const o of e){let a=-1;for(let r=0;r<n.length;r++)if(!i[r]&&st(o,n[r],s)){a=r;break}if(a<0)return!1;i[a]=1}return!0}function Di(e,t,s){let n=ct(e),i=ct(t);if(n||i||(n=lt(e),i=lt(t),n||i))return n&&i?Ps(e,t,s):!1;const o=Object.keys(e).length,a=Object.keys(t).length;if(o!==a)return!1;for(const r in e){const c=e.hasOwnProperty(r),h=t.hasOwnProperty(r);if(c&&!h||!c&&h||!st(e[r],t[r],s))return!1}return String(e)===String(t)}function qs(e,t,s,n){s||(s=[new Map,new Map]);const[i,o]=s;if(i.has(e)||o.has(t))return i.get(e)===t&&o.get(t)===e;i.set(e,t),o.set(t,e);const a=n(e,t,s);return i.delete(e),o.delete(t),a}function st(e,t,s){if(e===t)return!0;let n=As(e),i=As(t);return n||i?n&&i?e.getTime()===t.getTime():!1:(n=Ze(e),i=Ze(t),n||i?e===t:(n=E(e),i=E(t),n||i?n&&i?qs(e,t,s,Ri):!1:(n=ee(e),i=ee(t),n||i?!n||!i?!1:qs(e,t,s,Di):String(e)===String(t))))}function os(e,t){return e.findIndex(s=>st(s,t))}const yn=e=>!!(e&&e.__v_isRef===!0),k=e=>re(e)?e:e==null?"":E(e)||ee(e)&&(e.toString===fn||!N(e.toString))?yn(e)?k(e.value):JSON.stringify(e,_n,2):String(e),_n=(e,t)=>yn(t)?_n(e,t.value):ct(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,i],o)=>(s[Rl(n,o)+" =>"]=i,s),{})}:lt(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>Rl(s))}:Ze(t)?Rl(t):ee(t)&&!E(t)&&!hn(t)?String(t):t,Rl=(e,t="")=>{var s;return Ze(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};let fe;class Hi{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&fe&&(fe.active?(this.parent=fe,this.index=(fe.scopes||(fe.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes){const n=this.scopes.slice();for(t=0,s=n.length;t<s;t++)n[t].pause()}for(t=0,s=this.effects.length;t<s;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,s;if(this.scopes){const i=this.scopes.slice();for(t=0,s=i.length;t<s;t++)i[t].resume()}const n=this.effects.slice();for(t=0,s=n.length;t<s;t++)n[t].resume()}}run(t){if(this._active){const s=fe;try{return fe=this,t()}finally{fe=s}}}on(){++this._on===1&&(this.prevScope=fe,fe=this)}off(){if(this._on>0&&--this._on===0){if(fe===this)fe=this.prevScope;else{let t=fe;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s<n;s++)this.effects[s].stop();for(this.effects.length=0,s=0,n=this.cleanups.length;s<n;s++)this.cleanups[s]();if(this.cleanups.length=0,this.scopes){const i=this.scopes.slice();for(s=0,n=i.length;s<n;s++)i[s].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const i=this.parent.scopes.pop();i&&i!==this&&(this.parent.scopes[this.index]=i,i.index=this.index)}this.parent=void 0}}}function Ni(){return fe}let ne;const Dl=new WeakSet;class xn{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,fe&&(fe.active?fe.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,Dl.has(this)&&(Dl.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||kn(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Os(this),Cn(this);const t=ne,s=Oe;ne=this,Oe=!0;try{return this.fn()}finally{Sn(this),ne=t,Oe=s,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)cs(t);this.deps=this.depsTail=void 0,Os(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?Dl.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Bl(this)&&this.run()}get dirty(){return Bl(this)}}let wn=0,Ft,Lt;function kn(e,t=!1){if(e.flags|=8,t){e.next=Lt,Lt=e;return}e.next=Ft,Ft=e}function as(){wn++}function rs(){if(--wn>0)return;if(Lt){let t=Lt;for(Lt=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Ft;){let t=Ft;for(Ft=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Cn(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Sn(e){let t,s=e.depsTail,n=s;for(;n;){const i=n.prevDep;n.version===-1?(n===s&&(s=i),cs(n),Fi(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=i}e.deps=t,e.depsTail=s}function Bl(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Tn(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Tn(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Bt)||(e.globalVersion=Bt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Bl(e))))return;e.flags|=2;const t=e.dep,s=ne,n=Oe;ne=e,Oe=!0;try{Cn(e);const i=e.fn(e._value);(t.version===0||Ue(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{ne=s,Oe=n,Sn(e),e.flags&=-3}}function cs(e,t=!1){const{dep:s,prevSub:n,nextSub:i}=e;if(n&&(n.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let o=s.computed.deps;o;o=o.nextDep)cs(o,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function Fi(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let Oe=!0;const $n=[];function nt(){$n.push(Oe),Oe=!1}function it(){const e=$n.pop();Oe=e===void 0?!0:e}function Os(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=ne;ne=void 0;try{t()}finally{ne=s}}}let Bt=0;class Li{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class us{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(!ne||!Oe||ne===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==ne)s=this.activeLink=new Li(ne,this),ne.deps?(s.prevDep=ne.depsTail,ne.depsTail.nextDep=s,ne.depsTail=s):ne.deps=ne.depsTail=s,Mn(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=ne.depsTail,s.nextDep=void 0,ne.depsTail.nextDep=s,ne.depsTail=s,ne.deps===s&&(ne.deps=n)}return s}trigger(t){this.version++,Bt++,this.notify(t)}notify(t){as();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{rs()}}}function Mn(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Mn(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const Wl=new WeakMap,yt=Symbol(""),zl=Symbol(""),Wt=Symbol("");function he(e,t,s){if(Oe&&ne){let n=Wl.get(e);n||Wl.set(e,n=new Map);let i=n.get(s);i||(n.set(s,i=new us),i.map=n,i.key=s),i.track()}}function Qe(e,t,s,n,i,o){const a=Wl.get(e);if(!a){Bt++;return}const r=c=>{c&&c.trigger()};if(as(),t==="clear")a.forEach(r);else{const c=E(e),h=c&&is(s);if(c&&s==="length"){const p=Number(n);a.forEach((b,$)=>{($==="length"||$===Wt||!Ze($)&&$>=p)&&r(b)})}else switch((s!==void 0||a.has(void 0))&&r(a.get(s)),h&&r(a.get(Wt)),t){case"add":c?h&&r(a.get("length")):(r(a.get(yt)),ct(e)&&r(a.get(zl)));break;case"delete":c||(r(a.get(yt)),ct(e)&&r(a.get(zl)));break;case"set":ct(e)&&r(a.get(yt));break}}rs()}function kt(e){const t=Y(e);return t===e||(he(t,"iterate",Wt),je(e))?t:Ye(e)?ut(e)?t.map(s=>dt(Ae(s))):t.map(dt):t.map(Ae)}function Sl(e){return he(e=Y(e),"iterate",Wt),e}function Ve(e,t){return Ye(e)?dt(ut(e)?Ae(t):t):Ae(t)}const Vi={__proto__:null,[Symbol.iterator](){return Hl(this,Symbol.iterator,e=>Ve(this,e))},concat(...e){return kt(this).concat(...e.map(t=>E(t)?kt(t):t))},entries(){return Hl(this,"entries",e=>(e[1]=Ve(this,e[1]),e))},every(e,t){return Ge(this,"every",e,t,void 0,arguments)},filter(e,t){return Ge(this,"filter",e,t,s=>s.map(n=>Ve(this,n)),arguments)},find(e,t){return Ge(this,"find",e,t,s=>Ve(this,s),arguments)},findIndex(e,t){return Ge(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ge(this,"findLast",e,t,s=>Ve(this,s),arguments)},findLastIndex(e,t){return Ge(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ge(this,"forEach",e,t,void 0,arguments)},includes(...e){return Nl(this,"includes",e)},indexOf(...e){return Nl(this,"indexOf",e)},join(e){return kt(this).join(e)},lastIndexOf(...e){return Nl(this,"lastIndexOf",e)},map(e,t){return Ge(this,"map",e,t,void 0,arguments)},pop(){return qt(this,"pop")},push(...e){return qt(this,"push",e)},reduce(e,...t){return Es(this,"reduce",e,t)},reduceRight(e,...t){return Es(this,"reduceRight",e,t)},shift(){return qt(this,"shift")},some(e,t){return Ge(this,"some",e,t,void 0,arguments)},splice(...e){return qt(this,"splice",e)},toReversed(){return kt(this).toReversed()},toSorted(e){return kt(this).toSorted(e)},toSpliced(...e){return kt(this).toSpliced(...e)},unshift(...e){return qt(this,"unshift",e)},values(){return Hl(this,"values",e=>Ve(this,e))}};function Hl(e,t,s){const n=Sl(e),i=n[t]();return n!==e&&!je(e)&&(i._next=i.next,i.next=()=>{const o=i._next();return o.done||(o.value=s(o.value)),o}),i}const Ki=Array.prototype;function Ge(e,t,s,n,i,o){const a=Sl(e),r=a!==e&&!je(e),c=a[t];if(c!==Ki[t]){const b=c.apply(e,o);return r?Ae(b):b}let h=s;a!==e&&(r?h=function(b,$){return s.call(this,Ve(e,b),$,e)}:s.length>2&&(h=function(b,$){return s.call(this,b,$,e)}));const p=c.call(a,h,n);return r&&i?i(p):p}function Es(e,t,s,n){const i=Sl(e),o=i!==e&&!je(e);let a=s,r=!1;i!==e&&(o?(r=n.length===0,a=function(h,p,b){return r&&(r=!1,h=Ve(e,h)),s.call(this,h,Ve(e,p),b,e)}):s.length>3&&(a=function(h,p,b){return s.call(this,h,p,b,e)}));const c=i[t](a,...n);return r?Ve(e,c):c}function Nl(e,t,s){const n=Y(e);he(n,"iterate",Wt);const i=n[t](...s);return(i===-1||i===!1)&&hs(s[0])?(s[0]=Y(s[0]),n[t](...s)):i}function qt(e,t,s=[]){nt(),as();const n=Y(e)[t].apply(e,s);return rs(),it(),n}const Ui=ss("__proto__,__v_isRef,__isVue"),jn=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ze));function Bi(e){Ze(e)||(e=String(e));const t=Y(this);return he(t,"has",e),t.hasOwnProperty(e)}class An{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const i=this._isReadonly,o=this._isShallow;if(s==="__v_isReactive")return!i;if(s==="__v_isReadonly")return i;if(s==="__v_isShallow")return o;if(s==="__v_raw")return n===(i?o?to:On:o?qn:Pn).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const a=E(t);if(!i){let c;if(a&&(c=Vi[s]))return c;if(s==="hasOwnProperty")return Bi}const r=Reflect.get(t,s,me(t)?t:n);if((Ze(s)?jn.has(s):Ui(s))||(i||he(t,"get",s),o))return r;if(me(r)){const c=a&&is(s)?r:r.value;return i&&ee(c)?Yl(c):c}return ee(r)?i?Yl(r):ps(r):r}}class In extends An{constructor(t=!1){super(!1,t)}set(t,s,n,i){let o=t[s];const a=E(t)&&is(s);if(!this._isShallow){const h=Ye(o);if(!je(n)&&!Ye(n)&&(o=Y(o),n=Y(n)),!a&&me(o)&&!me(n))return h||(o.value=n),!0}const r=a?Number(s)<t.length:G(t,s),c=Reflect.set(t,s,n,me(t)?t:i);return t===Y(i)&&c&&(r?Ue(n,o)&&Qe(t,"set",s,n):Qe(t,"add",s,n)),c}deleteProperty(t,s){const n=G(t,s);t[s];const i=Reflect.deleteProperty(t,s);return i&&n&&Qe(t,"delete",s,void 0),i}has(t,s){const n=Reflect.has(t,s);return(!Ze(s)||!jn.has(s))&&he(t,"has",s),n}ownKeys(t){return he(t,"iterate",E(t)?"length":yt),Reflect.ownKeys(t)}}class Wi extends An{constructor(t=!1){super(!0,t)}set(t,s){return!0}deleteProperty(t,s){return!0}}const zi=new In,Zi=new Wi,Yi=new In(!0);const Zl=e=>e,nl=e=>Reflect.getPrototypeOf(e);function Gi(e,t,s){return function(...n){const i=this.__v_raw,o=Y(i),a=ct(o),r=e==="entries"||e===Symbol.iterator&&a,c=e==="keys"&&a,h=i[e](...n),p=s?Zl:t?dt:Ae;return!t&&he(o,"iterate",c?zl:yt),be(Object.create(h),{next(){const{value:b,done:$}=h.next();return $?{value:b,done:$}:{value:r?[p(b[0]),p(b[1])]:p(b),done:$}}})}}function il(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Ji(e,t){const s={get(i){const o=this.__v_raw,a=Y(o),r=Y(i);e||(Ue(i,r)&&he(a,"get",i),he(a,"get",r));const{has:c}=nl(a),h=t?Zl:e?dt:Ae;if(c.call(a,i))return h(o.get(i));if(c.call(a,r))return h(o.get(r));o!==a&&o.get(i)},get size(){const i=this.__v_raw;return!e&&he(Y(i),"iterate",yt),i.size},has(i){const o=this.__v_raw,a=Y(o),r=Y(i);return e||(Ue(i,r)&&he(a,"has",i),he(a,"has",r)),i===r?o.has(i):o.has(i)||o.has(r)},forEach(i,o){const a=this,r=a.__v_raw,c=Y(r),h=t?Zl:e?dt:Ae;return!e&&he(c,"iterate",yt),r.forEach((p,b)=>i.call(o,h(p),h(b),a))}};return be(s,e?{add:il("add"),set:il("set"),delete:il("delete"),clear:il("clear")}:{add(i){const o=Y(this),a=nl(o),r=Y(i),c=!t&&!je(i)&&!Ye(i)?r:i;return a.has.call(o,c)||Ue(i,c)&&a.has.call(o,i)||Ue(r,c)&&a.has.call(o,r)||(o.add(c),Qe(o,"add",c,c)),this},set(i,o){!t&&!je(o)&&!Ye(o)&&(o=Y(o));const a=Y(this),{has:r,get:c}=nl(a);let h=r.call(a,i);h||(i=Y(i),h=r.call(a,i));const p=c.call(a,i);return a.set(i,o),h?Ue(o,p)&&Qe(a,"set",i,o):Qe(a,"add",i,o),this},delete(i){const o=Y(this),{has:a,get:r}=nl(o);let c=a.call(o,i);c||(i=Y(i),c=a.call(o,i)),r&&r.call(o,i);const h=o.delete(i);return c&&Qe(o,"delete",i,void 0),h},clear(){const i=Y(this),o=i.size!==0,a=i.clear();return o&&Qe(i,"clear",void 0,void 0),a}}),["keys","values","entries",Symbol.iterator].forEach(i=>{s[i]=Gi(i,e,t)}),s}function ds(e,t){const s=Ji(e,t);return(n,i,o)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?n:Reflect.get(G(s,i)&&i in n?s:n,i,o)}const Xi={get:ds(!1,!1)},Qi={get:ds(!1,!0)},eo={get:ds(!0,!1)};const Pn=new WeakMap,qn=new WeakMap,On=new WeakMap,to=new WeakMap;function lo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ps(e){return Ye(e)?e:fs(e,!1,zi,Xi,Pn)}function so(e){return fs(e,!1,Yi,Qi,qn)}function Yl(e){return fs(e,!0,Zi,eo,On)}function fs(e,t,s,n,i){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const o=i.get(e);if(o)return o;const a=lo($i(e));if(a===0)return e;const r=new Proxy(e,a===2?n:s);return i.set(e,r),r}function ut(e){return Ye(e)?ut(e.__v_raw):!!(e&&e.__v_isReactive)}function Ye(e){return!!(e&&e.__v_isReadonly)}function je(e){return!!(e&&e.__v_isShallow)}function hs(e){return e?!!e.__v_raw:!1}function Y(e){const t=e&&e.__v_raw;return t?Y(t):e}function no(e){return!G(e,"__v_skip")&&Object.isExtensible(e)&&bn(e,"__v_skip",!0),e}const Ae=e=>ee(e)?ps(e):e,dt=e=>ee(e)?Yl(e):e;function me(e){return e?e.__v_isRef===!0:!1}function ke(e){return Rn(e,!1)}function En(e){return Rn(e,!0)}function Rn(e,t){return me(e)?e:new io(e,t)}class io{constructor(t,s){this.dep=new us,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:Y(t),this._value=s?t:Ae(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||je(t)||Ye(t);t=n?t:Y(t),Ue(t,s)&&(this._rawValue=t,this._value=n?t:Ae(t),this.dep.trigger())}}function K(e){return me(e)?e.value:e}const oo={get:(e,t,s)=>t==="__v_raw"?e:K(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const i=e[t];return me(i)&&!me(s)?(i.value=s,!0):Reflect.set(e,t,s,n)}};function Dn(e){return ut(e)?e:new Proxy(e,oo)}class ao{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new us(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Bt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&ne!==this)return kn(this,!0),!0}get value(){const t=this.dep.track();return Tn(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function ro(e,t,s=!1){let n,i;return N(e)?n=e:(n=e.get,i=e.set),new ao(n,i,s)}const ol={},pl=new WeakMap;let gt;function co(e,t=!1,s=gt){if(s){let n=pl.get(s);n||pl.set(s,n=[]),n.push(e)}}function uo(e,t,s=le){const{immediate:n,deep:i,once:o,scheduler:a,augmentJob:r,call:c}=s,h=q=>i?q:je(q)||i===!1||i===0?et(q,1):et(q);let p,b,$,j,z=!1,D=!1;if(me(e)?(b=()=>e.value,z=je(e)):ut(e)?(b=()=>h(e),z=!0):E(e)?(D=!0,z=e.some(q=>ut(q)||je(q)),b=()=>e.map(q=>{if(me(q))return q.value;if(ut(q))return h(q);if(N(q))return c?c(q,2):q()})):N(e)?t?b=c?()=>c(e,2):e:b=()=>{if($){nt();try{$()}finally{it()}}const q=gt;gt=p;try{return c?c(e,3,[j]):e(j)}finally{gt=q}}:b=ze,t&&i){const q=b,ae=i===!0?1/0:i;b=()=>et(q(),ae)}const ie=Ni(),X=()=>{p.stop(),ie&&ie.active&&ns(ie.effects,p)};if(o&&t){const q=t;t=(...ae)=>{const F=q(...ae);return X(),F}}let V=D?new Array(e.length).fill(ol):ol;const Z=q=>{if(!(!(p.flags&1)||!p.dirty&&!q))if(t){const ae=p.run();if(q||i||z||(D?ae.some((F,x)=>Ue(F,V[x])):Ue(ae,V))){$&&$();const F=gt;gt=p;try{const x=[ae,V===ol?void 0:D&&V[0]===ol?[]:V,j];V=ae,c?c(t,3,x):t(...x)}finally{gt=F}}}else p.run()};return r&&r(Z),p=new xn(b),p.scheduler=a?()=>a(Z,!1):Z,j=q=>co(q,!1,p),$=p.onStop=()=>{const q=pl.get(p);if(q){if(c)c(q,4);else for(const ae of q)ae();pl.delete(p)}},t?n?Z(!0):V=p.run():a?a(Z.bind(null,!0),!0):p.run(),X.pause=p.pause.bind(p),X.resume=p.resume.bind(p),X.stop=X,X}function et(e,t=1/0,s){if(t<=0||!ee(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,me(e))et(e.value,t,s);else if(E(e))for(let n=0;n<e.length;n++)et(e[n],t,s);else if(lt(e)||ct(e))e.forEach(n=>{et(n,t,s)});else if(hn(e)){for(const n in e)et(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&et(e[n],t,s)}return e}function Qt(e,t,s,n){try{return n?e(...n):e()}catch(i){Tl(i,t,s)}}function Ee(e,t,s,n){if(N(e)){const i=Qt(e,t,s,n);return i&&pn(i)&&i.catch(o=>{Tl(o,t,s)}),i}if(E(e)){const i=[];for(let o=0;o<e.length;o++)i.push(Ee(e[o],t,s,n));return i}}function Tl(e,t,s,n=!0){const i=t?t.vnode:null,{errorHandler:o,throwUnhandledErrorInProduction:a}=t&&t.appContext.config||le;if(t){let r=t.parent;const c=t.proxy,h=`https://vuejs.org/error-reference/#runtime-${s}`;for(;r;){const p=r.ec;if(p){for(let b=0;b<p.length;b++)if(p[b](e,c,h)===!1)return}r=r.parent}if(o){nt(),Qt(o,null,10,[e,c,h]),it();return}}po(e,s,i,n,a)}function po(e,t,s,n=!0,i=!1){if(i)throw e;console.error(e)}const ye=[];let Le=-1;const St=[];let rt=null,Ct=0;const Hn=Promise.resolve();let fl=null;function Nn(e){const t=fl||Hn;return e?t.then(this?e.bind(this):e):t}function fo(e){let t=Le+1,s=ye.length;for(;t<s;){const n=t+s>>>1,i=ye[n],o=zt(i);o<e||o===e&&i.flags&2?t=n+1:s=n}return t}function ms(e){if(!(e.flags&1)){const t=zt(e),s=ye[ye.length-1];!s||!(e.flags&2)&&t>=zt(s)?ye.push(e):ye.splice(fo(t),0,e),e.flags|=1,Fn()}}function Fn(){fl||(fl=Hn.then(Vn))}function ho(e){if(!E(e))rt&&e.id===-1?rt.splice(Ct+1,0,e):e.flags&1||(St.push(e),e.flags|=1);else for(let t=0;t<e.length;t++)St.push(e[t]);Fn()}function Rs(e,t,s=Le+1){for(;s<ye.length;s++){const n=ye[s];if(n&&n.flags&2){if(e&&n.id!==e.uid)continue;ye.splice(s,1),s--,n.flags&4&&(n.flags&=-2),n(),n.flags&4||(n.flags&=-2)}}}function Ln(e){if(St.length){const t=[...new Set(St)].sort((s,n)=>zt(s)-zt(n));if(St.length=0,rt){for(let s=0;s<t.length;s++)rt.push(t[s]);return}for(rt=t,Ct=0;Ct<rt.length;Ct++){const s=rt[Ct];s.flags&4&&(s.flags&=-2),s.flags&8||s(),s.flags&=-2}rt=null,Ct=0}}const zt=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Vn(e){try{for(Le=0;Le<ye.length;Le++){const t=ye[Le];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),Qt(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Le<ye.length;Le++){const t=ye[Le];t&&(t.flags&=-2)}Le=-1,ye.length=0,Ln(),fl=null,(ye.length||St.length)&&Vn()}}let Me=null,Kn=null;function hl(e){const t=Me;return Me=e,Kn=e&&e.type.__scopeId||null,t}function mo(e,t=Me,s){if(!t||e._n)return e;const n=(...i)=>{n._d&&zs(-1);const o=hl(t),a=xt.length;let r;try{r=e(...i)}finally{for(let c=xt.length;c>a;c--)fi();hl(o),n._d&&zs(1)}return r};return n._n=!0,n._c=!0,n._d=!0,n}function Fe(e,t){if(Me===null)return e;const s=Il(Me),n=e.dirs||(e.dirs=[]);for(let i=0;i<t.length;i++){let[o,a,r,c=le]=t[i];o&&(N(o)&&(o={mounted:o,updated:o}),o.deep&&et(a),n.push({dir:o,instance:s,value:a,oldValue:void 0,arg:r,modifiers:c}))}return e}function mt(e,t,s,n){const i=e.dirs,o=t&&t.dirs;for(let a=0;a<i.length;a++){const r=i[a];o&&(r.oldValue=o[a].value);let c=r.dir[n];c&&(nt(),Ee(c,s,8,[e.el,r,e,t]),it())}}function bo(e,t){if(xe){let s=xe.provides;const n=xe.parent&&xe.parent.provides;n===s&&(s=xe.provides=Object.create(n)),s[e]=t}}function cl(e,t,s=!1){const n=da();if(n||Tt){let i=Tt?Tt._context.provides:n?n.parent==null||n.ce?n.vnode.appContext&&n.vnode.appContext.provides:n.parent.provides:void 0;if(i&&e in i)return i[e];if(arguments.length>1)return s&&N(t)?t.call(n&&n.proxy):t}}const go=Symbol.for("v-scx"),vo=()=>cl(go);function _t(e,t,s){return Un(e,t,s)}function Un(e,t,s=le){const{immediate:n,deep:i,flush:o,once:a}=s,r=be({},s),c=t&&n||!t&&o!=="post";let h;if(Gt){if(o==="sync"){const j=vo();h=j.__watcherHandles||(j.__watcherHandles=[])}else if(!c){const j=()=>{};return j.stop=ze,j.resume=ze,j.pause=ze,j}}const p=xe;r.call=(j,z,D)=>Ee(j,p,z,D);let b=!1;o==="post"?r.scheduler=j=>{we(j,p&&p.suspense)}:o!=="sync"&&(b=!0,r.scheduler=(j,z)=>{z?j():ms(j)}),r.augmentJob=j=>{t&&(j.flags|=4),b&&(j.flags|=2,p&&(j.id=p.uid,j.i=p))};const $=uo(e,t,r);return Gt&&(h?h.push($):c&&$()),$}function yo(e,t,s){const n=this.proxy,i=re(e)?e.includes(".")?Bn(n,e):()=>n[e]:e.bind(n,n);let o;N(t)?o=t:(o=t.handler,s=t);const a=el(this),r=Un(i,o.bind(n),s);return a(),r}function Bn(e,t){const s=t.split(".");return()=>{let n=e;for(let i=0;i<s.length&&n;i++)n=n[s[i]];return n}}const _o=Symbol("_vte"),$l=e=>e.__isTeleport,Fl=Symbol("_leaveCb");function xo(e){let t=e[0];if(e.length>1){for(const s of e)if(s.type!==ot){t=s;break}}return t}function Wn(e){if(!gs(e))return $l(e.type)&&e.children?xo(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:s}=e;if(s){if(t&16)return s[0];if(t&32&&N(s.default))return s.default()}}function bs(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const s=e.component.subTree;bs($l(s.type)&&Wn(s)||s,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function zn(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Ds(e,t){let s;return!!((s=Object.getOwnPropertyDescriptor(e,t))&&!s.configurable)}const ml=new WeakMap;function Vt(e,t,s,n,i=!1){if(E(e)){e.forEach((D,ie)=>Vt(D,t&&(E(t)?t[ie]:t),s,n,i));return}if(Kt(n)&&!i){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Vt(e,t,s,n.component.subTree);return}const o=n.shapeFlag&4?Il(n.component):n.el,a=i?null:o,{i:r,r:c}=e,h=t&&t.r,p=r.refs===le?r.refs={}:r.refs,b=r.setupState,$=Y(b),j=b===le?dn:D=>Ds(p,D)?!1:G($,D),z=(D,ie)=>!(ie&&Ds(p,ie));if(h!=null&&h!==c){if(Hs(t),re(h))p[h]=null,j(h)&&(b[h]=null);else if(me(h)){const D=t;z(h,D.k)&&(h.value=null),D.k&&(p[D.k]=null)}}if(N(c))Qt(c,r,12,[a,p]);else{const D=re(c),ie=me(c);if(D||ie){const X=()=>{if(e.f){const V=D?j(c)?b[c]:p[c]:z()||!e.k?c.value:p[e.k];if(i)E(V)&&ns(V,o);else if(E(V))V.includes(o)||V.push(o);else if(D)p[c]=[o],j(c)&&(b[c]=p[c]);else{const Z=[o];z(c,e.k)&&(c.value=Z),e.k&&(p[e.k]=Z)}}else D?(p[c]=a,j(c)&&(b[c]=a)):ie&&(z(c,e.k)&&(c.value=a),e.k&&(p[e.k]=a))};if(a){const V=()=>{X(),ml.delete(e)};V.id=-1,ml.set(e,V),we(V,s)}else Hs(e),X()}}}function Hs(e){const t=ml.get(e);t&&(t.flags|=8,ml.delete(e))}Cl().requestIdleCallback;Cl().cancelIdleCallback;const Kt=e=>!!e.type.__asyncLoader,gs=e=>e.type.__isKeepAlive;function wo(e,t){Zn(e,"a",t)}function ko(e,t){Zn(e,"da",t)}function Zn(e,t,s=xe){const n=e.__wdc||(e.__wdc=()=>{let i=s;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Ml(t,n,s),s){let i=s.parent;for(;i&&i.parent;)gs(i.parent.vnode)&&Co(n,t,s,i),i=i.parent}}function Co(e,t,s,n){const i=Ml(t,e,n,!0);vs(()=>{ns(n[t],i)},s)}function Ml(e,t,s=xe,n=!1){if(s){const i=s[e]||(s[e]=[]),o=t.__weh||(t.__weh=(...a)=>{nt();const r=el(s),c=Ee(t,s,e,a);return r(),it(),c});return n?i.unshift(o):i.push(o),o}}const at=e=>(t,s=xe)=>{(!Gt||e==="sp")&&Ml(e,(...n)=>t(...n),s)},So=at("bm"),Yn=at("m"),To=at("bu"),$o=at("u"),Mo=at("bum"),vs=at("um"),jo=at("sp"),Ao=at("rtg"),Io=at("rtc");function Po(e,t=xe){Ml("ec",e,t)}const qo=Symbol.for("v-ndc");function _e(e,t,s,n){let i;const o=s,a=E(e);if(a||re(e)){const r=a&&ut(e);let c=!1,h=!1;r&&(c=!je(e),h=Ye(e),e=Sl(e)),i=new Array(e.length);for(let p=0,b=e.length;p<b;p++)i[p]=t(c?h?dt(Ae(e[p])):Ae(e[p]):e[p],p,void 0,o)}else if(typeof e=="number"){i=new Array(e);for(let r=0;r<e;r++)i[r]=t(r+1,r,void 0,o)}else if(ee(e))if(e[Symbol.iterator])i=Array.from(e,(r,c)=>t(r,c,void 0,o));else{const r=Object.keys(e);i=new Array(r.length);for(let c=0,h=r.length;c<h;c++){const p=r[c];i[c]=t(e[p],p,c,o)}}else i=[];return i}const Gl=e=>e?vi(e)?Il(e):Gl(e.parent):null,Ut=be(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=>Gl(e.parent),$root:e=>Gl(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Jn(e),$forceUpdate:e=>e.f||(e.f=()=>{ms(e.update)}),$nextTick:e=>e.n||(e.n=Nn.bind(e.proxy)),$watch:e=>yo.bind(e)}),Ll=(e,t)=>e!==le&&!e.__isScriptSetup&&G(e,t),Oo={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:i,props:o,accessCache:a,type:r,appContext:c}=e;if(t[0]!=="$"){const $=a[t];if($!==void 0)switch($){case 1:return n[t];case 2:return i[t];case 4:return s[t];case 3:return o[t]}else{if(Ll(n,t))return a[t]=1,n[t];if(i!==le&&G(i,t))return a[t]=2,i[t];if(G(o,t))return a[t]=3,o[t];if(s!==le&&G(s,t))return a[t]=4,s[t];Jl&&(a[t]=0)}}const h=Ut[t];let p,b;if(h)return t==="$attrs"&&he(e.attrs,"get",""),h(e);if((p=r.__cssModules)&&(p=p[t]))return p;if(s!==le&&G(s,t))return a[t]=4,s[t];if(b=c.config.globalProperties,G(b,t))return b[t]},set({_:e},t,s){const{data:n,setupState:i,ctx:o}=e;return Ll(i,t)?(i[t]=s,!0):n!==le&&G(n,t)?(n[t]=s,!0):G(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:i,props:o,type:a}},r){let c;return!!(s[r]||e!==le&&r[0]!=="$"&&G(e,r)||Ll(t,r)||G(o,r)||G(n,r)||G(Ut,r)||G(i.config.globalProperties,r)||(c=a.__cssModules)&&c[r])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:G(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function Ns(e){return E(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let Jl=!0;function Eo(e){const t=Jn(e),s=e.proxy,n=e.ctx;Jl=!1,t.beforeCreate&&Fs(t.beforeCreate,e,"bc");const{data:i,computed:o,methods:a,watch:r,provide:c,inject:h,created:p,beforeMount:b,mounted:$,beforeUpdate:j,updated:z,activated:D,deactivated:ie,beforeDestroy:X,beforeUnmount:V,destroyed:Z,unmounted:q,render:ae,renderTracked:F,renderTriggered:x,errorCaptured:I,serverPrefetch:R,expose:ce,inheritAttrs:Ie,components:wt,directives:tl,filters:ql}=t;if(h&&Ro(h,n,null),a)for(const oe in a){const se=a[oe];N(se)&&(n[oe]=se.bind(s))}if(i){const oe=i.call(s,s);ee(oe)&&(e.data=ps(oe))}if(Jl=!0,o)for(const oe in o){const se=o[oe],ft=N(se)?se.bind(s,s):N(se.get)?se.get.bind(s,s):ze,ll=!N(se)&&N(se.set)?se.set.bind(s):ze,ht=Be({get:ft,set:ll});Object.defineProperty(n,oe,{enumerable:!0,configurable:!0,get:()=>ht.value,set:Pe=>ht.value=Pe})}if(r)for(const oe in r)Gn(r[oe],n,s,oe);if(c){const oe=N(c)?c.call(s):c;Reflect.ownKeys(oe).forEach(se=>{bo(se,oe[se])})}p&&Fs(p,e,"c");function ge(oe,se){E(se)?se.forEach(ft=>oe(ft.bind(s))):se&&oe(se.bind(s))}if(ge(So,b),ge(Yn,$),ge(To,j),ge($o,z),ge(wo,D),ge(ko,ie),ge(Po,I),ge(Io,F),ge(Ao,x),ge(Mo,V),ge(vs,q),ge(jo,R),E(ce))if(ce.length){const oe=e.exposed||(e.exposed={});ce.forEach(se=>{Object.defineProperty(oe,se,{get:()=>s[se],set:ft=>s[se]=ft,enumerable:!0})})}else e.exposed||(e.exposed={});ae&&e.render===ze&&(e.render=ae),Ie!=null&&(e.inheritAttrs=Ie),wt&&(e.components=wt),tl&&(e.directives=tl),R&&zn(e)}function Ro(e,t,s=ze){E(e)&&(e=Xl(e));for(const n in e){const i=e[n];let o;ee(i)?"default"in i?o=cl(i.from||n,i.default,!0):o=cl(i.from||n):o=cl(i),me(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:a=>o.value=a}):t[n]=o}}function Fs(e,t,s){Ee(E(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function Gn(e,t,s,n){let i=n.includes(".")?Bn(s,n):()=>s[n];if(re(e)){const o=t[e];N(o)&&_t(i,o)}else if(N(e))_t(i,e.bind(s));else if(ee(e))if(E(e))e.forEach(o=>Gn(o,t,s,n));else{const o=N(e.handler)?e.handler.bind(s):t[e.handler];N(o)&&_t(i,o,e)}}function Jn(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:a}}=e.appContext,r=o.get(t);let c;return r?c=r:!i.length&&!s&&!n?c=t:(c={},i.length&&i.forEach(h=>bl(c,h,a,!0)),bl(c,t,a)),ee(t)&&o.set(t,c),c}function bl(e,t,s,n=!1){const{mixins:i,extends:o}=t;o&&bl(e,o,s,!0),i&&i.forEach(a=>bl(e,a,s,!0));for(const a in t)if(!(n&&a==="expose")){const r=Do[a]||s&&s[a];e[a]=r?r(e[a],t[a]):t[a]}return e}const Do={data:Ls,props:Vs,emits:Vs,methods:Dt,computed:Dt,beforeCreate:ve,created:ve,beforeMount:ve,mounted:ve,beforeUpdate:ve,updated:ve,beforeDestroy:ve,beforeUnmount:ve,destroyed:ve,unmounted:ve,activated:ve,deactivated:ve,errorCaptured:ve,serverPrefetch:ve,components:Dt,directives:Dt,watch:No,provide:Ls,inject:Ho};function Ls(e,t){return t?e?function(){return be(N(e)?e.call(this,this):e,N(t)?t.call(this,this):t)}:t:e}function Ho(e,t){return Dt(Xl(e),Xl(t))}function Xl(e){if(E(e)){const t={};for(let s=0;s<e.length;s++)t[e[s]]=e[s];return t}return e}function ve(e,t){return e?[...new Set([].concat(e,t))]:t}function Dt(e,t){return e?be(Object.create(null),e,t):t}function Vs(e,t){return e?E(e)&&E(t)?[...new Set([...e,...t])]:be(Object.create(null),Ns(e),Ns(t??{})):t}function No(e,t){if(!e)return t;if(!t)return e;const s=be(Object.create(null),e);for(const n in t)s[n]=ve(e[n],t[n]);return s}function Xn(){return{app:null,config:{isNativeTag:dn,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Fo=0;function Lo(e,t){return function(n,i=null){N(n)||(n=be({},n)),i!=null&&!ee(i)&&(i=null);const o=Xn(),a=new WeakSet,r=[];let c=!1;const h=o.app={_uid:Fo++,_component:n,_props:i,_container:null,_context:o,_instance:null,version:ga,get config(){return o.config},set config(p){},use(p,...b){return a.has(p)||(p&&N(p.install)?(a.add(p),p.install(h,...b)):N(p)&&(a.add(p),p(h,...b))),h},mixin(p){return o.mixins.includes(p)||o.mixins.push(p),h},component(p,b){return b?(o.components[p]=b,h):o.components[p]},directive(p,b){return b?(o.directives[p]=b,h):o.directives[p]},mount(p,b,$){if(!c){const j=h._ceVNode||L(n,i);return j.appContext=o,$===!0?$="svg":$===!1&&($=void 0),e(j,p,$),c=!0,h._container=p,p.__vue_app__=h,Il(j.component)}},onUnmount(p){r.push(p)},unmount(){c&&(Ee(r,h._instance,16),e(null,h._container),delete h._container.__vue_app__)},provide(p,b){return o.provides[p]=b,h},runWithContext(p){const b=Tt;Tt=h;try{return p()}finally{Tt=b}}};return h}}let Tt=null;const Vo=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${qe(t)}Modifiers`]||e[`${pt(t)}Modifiers`];function Ko(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||le;let i=s;const o=t.startsWith("update:"),a=o&&Vo(n,t.slice(7));a&&(a.trim&&(i=s.map(p=>re(p)?p.trim():p)),a.number&&(i=i.map(gn)));let r,c=n[r=El(t)]||n[r=El(qe(t))];!c&&o&&(c=n[r=El(pt(t))]),c&&Ee(c,e,6,i);const h=n[r+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[r])return;e.emitted[r]=!0,Ee(h,e,6,i)}}const Uo=new WeakMap;function Qn(e,t,s=!1){const n=s?Uo:t.emitsCache,i=n.get(e);if(i!==void 0)return i;const o=e.emits;let a={},r=!1;if(!N(e)){const c=h=>{const p=Qn(h,t,!0);p&&(r=!0,be(a,p))};!s&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!r?(ee(e)&&n.set(e,null),null):(E(o)?o.forEach(c=>a[c]=null):be(a,o),ee(e)&&n.set(e,a),a)}function jl(e,t){return!e||!xl(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),G(e,t[0].toLowerCase()+t.slice(1))||G(e,pt(t))||G(e,t))}function Ks(e){const{type:t,vnode:s,proxy:n,withProxy:i,propsOptions:[o],slots:a,attrs:r,emit:c,render:h,renderCache:p,props:b,data:$,setupState:j,ctx:z,inheritAttrs:D}=e,ie=hl(e);let X,V;try{if(s.shapeFlag&4){const q=i||n,ae=q;X=Ke(h.call(ae,q,p,b,j,$,z)),V=r}else{const q=t;X=Ke(q.length>1?q(b,{attrs:r,slots:a,emit:c}):q(b,null)),V=t.props?r:Bo(r)}}catch(q){xt.length=0,Tl(q,e,1),X=L(ot)}let Z=X;if(V&&D!==!1){const q=Object.keys(V),{shapeFlag:ae}=Z;q.length&&ae&7&&(o&&q.some(wl)&&(V=Wo(V,o)),Z=Mt(Z,V,!1,!0))}if(s.dirs&&(Z=Mt(Z,null,!1,!0),Z.dirs=Z.dirs?Z.dirs.concat(s.dirs):s.dirs),s.transition){const q=$l(Z.type)&&Wn(Z)||Z;bs(q,s.transition)}return X=Z,hl(ie),X}const Bo=e=>{let t;for(const s in e)(s==="class"||s==="style"||xl(s))&&((t||(t={}))[s]=e[s]);return t},Wo=(e,t)=>{const s={};for(const n in e)(!wl(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function zo(e,t,s){const{props:n,children:i,component:o}=e,{props:a,children:r,patchFlag:c}=t,h=o.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&c>=0){if(c&1024)return!0;if(c&16)return n?Us(n,a,h):!!a;if(c&8){const p=t.dynamicProps;for(let b=0;b<p.length;b++){const $=p[b];if(ei(a,n,$)&&!jl(h,$))return!0}}}else return(i||r)&&(!r||!r.$stable)?!0:n===a?!1:n?a?Us(n,a,h):!0:!!a;return!1}function Us(e,t,s){const n=Object.keys(t);if(n.length!==Object.keys(e).length)return!0;for(let i=0;i<n.length;i++){const o=n[i];if(ei(t,e,o)&&!jl(s,o))return!0}return!1}function ei(e,t,s){const n=e[s],i=t[s];return s==="style"&&ee(n)&&ee(i)?!st(n,i):n!==i}function Zo({vnode:e,parent:t,suspense:s},n){for(;t;){const i=t.subTree;if(i.suspense&&i.suspense.activeBranch===e&&(i.suspense.vnode.el=i.el=n,e=i),i===e)(e=t.vnode).el=n,t=t.parent;else break}s&&s.activeBranch===e&&(s.vnode.el=n)}const ti={},li=()=>Object.create(ti),si=e=>Object.getPrototypeOf(e)===ti;function Yo(e,t,s,n=!1){const i={},o=li();e.propsDefaults=Object.create(null),ni(e,t,i,o);for(const a in e.propsOptions[0])a in i||(i[a]=void 0);s?e.props=n?i:so(i):e.type.props?e.props=i:e.props=o,e.attrs=o}function Go(e,t,s,n){const{props:i,attrs:o,vnode:{patchFlag:a}}=e,r=Y(i),[c]=e.propsOptions;let h=!1;if((n||a>0)&&!(a&16)){if(a&8){const p=e.vnode.dynamicProps;for(let b=0;b<p.length;b++){let $=p[b];if(jl(e.emitsOptions,$))continue;const j=t[$];if(c)if(G(o,$))j!==o[$]&&(o[$]=j,h=!0);else{const z=qe($);i[z]=Ql(c,r,z,j,e,!1)}else j!==o[$]&&(o[$]=j,h=!0)}}}else{ni(e,t,i,o)&&(h=!0);let p;for(const b in r)(!t||!G(t,b)&&((p=pt(b))===b||!G(t,p)))&&(c?s&&(s[b]!==void 0||s[p]!==void 0)&&(i[b]=Ql(c,r,b,void 0,e,!0)):delete i[b]);if(o!==r)for(const b in o)(!t||!G(t,b))&&(delete o[b],h=!0)}h&&Qe(e.attrs,"set","")}function ni(e,t,s,n){const[i,o]=e.propsOptions;let a=!1,r;if(t)for(let c in t){if(Nt(c))continue;const h=t[c];let p;i&&G(i,p=qe(c))?!o||!o.includes(p)?s[p]=h:(r||(r={}))[p]=h:jl(e.emitsOptions,c)||(!(c in n)||h!==n[c])&&(n[c]=h,a=!0)}if(o){const c=Y(s),h=r||le;for(let p=0;p<o.length;p++){const b=o[p];s[b]=Ql(i,c,b,h[b],e,!G(h,b))}}return a}function Ql(e,t,s,n,i,o){const a=e[s];if(a!=null){const r=G(a,"default");if(r&&n===void 0){const c=a.default;if(a.type!==Function&&!a.skipFactory&&N(c)){const{propsDefaults:h}=i;if(s in h)n=h[s];else{const p=el(i);n=h[s]=c.call(null,t),p()}}else n=c;i.ce&&i.ce._setProp(s,n)}a[0]&&(o&&!r?n=!1:a[1]&&(n===""||n===pt(s))&&(n=!0))}return n}const Jo=new WeakMap;function ii(e,t,s=!1){const n=s?Jo:t.propsCache,i=n.get(e);if(i)return i;const o=e.props,a={},r=[];let c=!1;if(!N(e)){const p=b=>{c=!0;const[$,j]=ii(b,t,!0);be(a,$),j&&r.push(...j)};!s&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!o&&!c)return ee(e)&&n.set(e,vt),vt;if(E(o))for(let p=0;p<o.length;p++){const b=qe(o[p]);Bs(b)&&(a[b]=le)}else if(o)for(const p in o){const b=qe(p);if(Bs(b)){const $=o[p],j=a[b]=E($)||N($)?{type:$}:be({},$),z=j.type;let D=!1,ie=!0;if(E(z))for(let X=0;X<z.length;++X){const V=z[X],Z=N(V)&&V.name;if(Z==="Boolean"){D=!0;break}else Z==="String"&&(ie=!1)}else D=N(z)&&z.name==="Boolean";j[0]=D,j[1]=ie,(D||G(j,"default"))&&r.push(b)}}const h=[a,r];return ee(e)&&n.set(e,h),h}function Bs(e){return e[0]!=="$"&&!Nt(e)}const ys=e=>e==="_"||e==="_ctx"||e==="$stable",_s=e=>E(e)?e.map(Ke):[Ke(e)],Xo=(e,t,s)=>{if(t._n)return t;const n=mo((...i)=>_s(t(...i)),s);return n._c=!1,n},oi=(e,t,s)=>{const n=e._ctx;for(const i in e){if(ys(i))continue;const o=e[i];if(N(o))t[i]=Xo(i,o,n);else if(o!=null){const a=_s(o);t[i]=()=>a}}},ai=(e,t)=>{const s=_s(t);e.slots.default=()=>s},ri=(e,t,s)=>{for(const n in t)(s||!ys(n))&&(e[n]=t[n])},Qo=(e,t,s)=>{const n=e.slots=li();if(e.vnode.shapeFlag&32){const i=t._;i?(ri(n,t,s),s&&bn(n,"_",i,!0)):oi(t,n)}else t&&ai(e,t)},ea=(e,t,s)=>{const{vnode:n,slots:i}=e;let o=!0,a=le;if(n.shapeFlag&32){const r=t._;r?s&&r===1?o=!1:ri(i,t,s):(o=!t.$stable,oi(t,i)),a=t}else t&&(ai(e,t),a={default:1});if(o)for(const r in i)!ys(r)&&a[r]==null&&delete i[r]},we=ia;function ta(e){return la(e)}function la(e,t){const s=Cl();s.__VUE__=!0;const{insert:n,remove:i,patchProp:o,createElement:a,createText:r,createComment:c,setText:h,setElementText:p,parentNode:b,nextSibling:$,setScopeId:j=ze,insertStaticContent:z}=e,D=(u,d,m,_=null,g=null,y=null,S=void 0,C=null,w=!!d.dynamicChildren)=>{if(u===d)return;u&&!Ot(u,d)&&(_=sl(u),Pe(u,g,y,!0),u=null),d.patchFlag===-2&&(w=!1,d.dynamicChildren=null),d.dynamicChildren&&u&&u.dynamicChildren&&u.dynamicChildren.hasOnce&&(d.dynamicChildren===vt&&(d.dynamicChildren=[]),d.dynamicChildren.hasOnce=!0);const{type:v,ref:O,shapeFlag:A}=d;switch(v){case Al:ie(u,d,m,_);break;case ot:X(u,d,m,_);break;case ul:u==null&&V(d,m,_,S);break;case W:wt(u,d,m,_,g,y,S,C,w);break;default:A&1?ae(u,d,m,_,g,y,S,C,w):A&6?tl(u,d,m,_,g,y,S,C,w):(A&64||A&128)&&v.process(u,d,m,_,g,y,S,C,w,It)}O!=null&&g?Vt(O,u&&u.ref,y,d||u,!d):O==null&&u&&u.ref!=null&&Vt(u.ref,null,y,u,!0)},ie=(u,d,m,_)=>{if(u==null)n(d.el=r(d.children),m,_);else{const g=d.el=u.el;d.children!==u.children&&h(g,d.children)}},X=(u,d,m,_)=>{u==null?n(d.el=c(d.children||""),m,_):d.el=u.el},V=(u,d,m,_)=>{[u.el,u.anchor]=z(u.children,d,m,_,u.el,u.anchor)},Z=({el:u,anchor:d},m,_)=>{let g;for(;u&&u!==d;)g=$(u),n(u,m,_),u=g;n(d,m,_)},q=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=$(u),i(u),u=m;i(d)},ae=(u,d,m,_,g,y,S,C,w)=>{if(d.type==="svg"?S="svg":d.type==="math"&&(S="mathml"),u==null)F(d,m,_,g,y,S,C,w);else{const v=u.el&&u.el._isVueCE?u.el:null;try{v&&v._beginPatch(),R(u,d,g,y,S,C,w)}finally{v&&v._endPatch()}}},F=(u,d,m,_,g,y,S,C)=>{let w,v;const{props:O,shapeFlag:A,transition:P,dirs:H}=u;if(w=u.el=a(u.type,y,O&&O.is,O),A&8?p(w,u.children):A&16&&I(u.children,w,null,_,g,Vl(u,y),S,C),H&&mt(u,null,_,"created"),x(w,u,u.scopeId,S,_),O){for(const te in O)te!=="value"&&!Nt(te)&&o(w,te,null,O[te],y,_);"value"in O&&o(w,"value",null,O.value,y),(v=O.onVnodeBeforeMount)&&Ne(v,_,u)}H&&mt(u,null,_,"beforeMount");const B=sa(g,P);B&&P.beforeEnter(w),n(w,d,m),((v=O&&O.onVnodeMounted)||B||H)&&we(()=>{v&&Ne(v,_,u),B&&P.enter(w),H&&mt(u,null,_,"mounted")},g)},x=(u,d,m,_,g)=>{if(m&&j(u,m),_)for(let y=0;y<_.length;y++)j(u,_[y]);if(g){let y=g.subTree;if(d===y||pi(y.type)&&(y.ssContent===d||y.ssFallback===d)){const S=g.vnode;x(u,S,S.scopeId,S.slotScopeIds,g.parent)}}},I=(u,d,m,_,g,y,S,C,w=0)=>{for(let v=w;v<u.length;v++){const O=u[v]=C?Xe(u[v]):Ke(u[v]);D(null,O,d,m,_,g,y,S,C)}},R=(u,d,m,_,g,y,S)=>{const C=d.el=u.el;let{patchFlag:w,dynamicChildren:v,dirs:O}=d;w|=u.patchFlag&16;const A=u.props||le,P=d.props||le;let H;if(m&&bt(m,!1),(H=P.onVnodeBeforeUpdate)&&Ne(H,m,d,u),O&&mt(d,u,m,"beforeUpdate"),m&&bt(m,!0),v&&(!u.dynamicChildren||u.dynamicChildren.length!==v.length)&&(w=0,S=!1,v=null),(A.innerHTML&&P.innerHTML==null||A.textContent&&P.textContent==null)&&p(C,""),v?ce(u.dynamicChildren,v,C,m,_,Vl(d,g),y):S||se(u,d,C,null,m,_,Vl(d,g),y,!1),w>0){if(w&16)Ie(C,A,P,m,g);else if(w&2&&A.class!==P.class&&o(C,"class",null,P.class,g),w&4&&o(C,"style",A.style,P.style,g),w&8){const B=d.dynamicProps;for(let te=0;te<B.length;te++){const Q=B[te],ue=A[Q],pe=P[Q];(pe!==ue||Q==="value")&&o(C,Q,ue,pe,g,m)}}w&1&&u.children!==d.children&&p(C,d.children)}else!S&&v==null&&Ie(C,A,P,m,g);((H=P.onVnodeUpdated)||O)&&we(()=>{H&&Ne(H,m,d,u),O&&mt(d,u,m,"updated")},_)},ce=(u,d,m,_,g,y,S)=>{for(let C=0;C<d.length;C++){const w=u[C],v=d[C],O=w.el&&(w.type===W||!Ot(w,v)||w.shapeFlag&198)?b(w.el):m;D(w,v,O,null,_,g,y,S,!0)}},Ie=(u,d,m,_,g)=>{if(d!==m){if(d!==le)for(const y in d)!Nt(y)&&!(y in m)&&o(u,y,d[y],null,g,_);for(const y in m){if(Nt(y))continue;const S=m[y],C=d[y];S!==C&&y!=="value"&&o(u,y,C,S,g,_)}"value"in m&&o(u,"value",d.value,m.value,g)}},wt=(u,d,m,_,g,y,S,C,w)=>{const v=d.el=u?u.el:r(""),O=d.anchor=u?u.anchor:r("");let{patchFlag:A,dynamicChildren:P,slotScopeIds:H}=d;H&&(C=C?C.concat(H):H),u==null?(n(v,m,_),n(O,m,_),I(d.children||[],m,O,g,y,S,C,w)):A>0&&A&64&&P&&u.dynamicChildren&&u.dynamicChildren.length===P.length?(ce(u.dynamicChildren,P,m,g,y,S,C),(d.key!=null||g&&d===g.subTree)&&ci(u,d,!0)):se(u,d,m,O,g,y,S,C,w)},tl=(u,d,m,_,g,y,S,C,w)=>{d.slotScopeIds=C,u==null?d.shapeFlag&512?g.ctx.activate(d,m,_,S,w):ql(d,m,_,g,y,S,w):Cs(u,d,w)},ql=(u,d,m,_,g,y,S)=>{const C=u.component=ua(u,_,g);if(gs(u)&&(C.ctx.renderer=It),pa(C,!1,S),C.asyncDep){if(g&&g.registerDep(C,ge,S),!u.el){const w=C.subTree=L(ot);X(null,w,d,m),u.placeholder=w.el}}else ge(C,u,d,m,g,y,S)},Cs=(u,d,m)=>{const _=d.component=u.component;if(zo(u,d,m))if(_.asyncDep&&!_.asyncResolved){d.el=u.el,oe(_,d,m);return}else _.next=d,_.update();else d.el=u.el,_.vnode=d},ge=(u,d,m,_,g,y,S)=>{const C=()=>{if(u.isMounted){let{next:A,bu:P,u:H,parent:B,vnode:te}=u;{const De=ui(u);if(De){A&&(A.el=te.el,oe(u,A,S)),De.asyncDep.then(()=>{we(()=>{u.isUnmounted||v()},g)});return}}let Q=A,ue;bt(u,!1),A?(A.el=te.el,oe(u,A,S)):A=te,P&&rl(P),(ue=A.props&&A.props.onVnodeBeforeUpdate)&&Ne(ue,B,A,te),bt(u,!0);const pe=Ks(u),Re=u.subTree;u.subTree=pe,D(Re,pe,b(Re.el),sl(Re),u,g,y),A.el=pe.el,Q===null&&Zo(u,pe.el),H&&we(H,g),(ue=A.props&&A.props.onVnodeUpdated)&&we(()=>Ne(ue,B,A,te),g)}else{let A;const{el:P,props:H}=d,{bm:B,m:te,parent:Q,root:ue,type:pe}=u,Re=Kt(d);bt(u,!1),B&&rl(B),!Re&&(A=H&&H.onVnodeBeforeMount)&&Ne(A,Q,d),bt(u,!0);{ue.ce&&ue.ce._hasShadowRoot()&&ue.ce._injectChildStyle(pe,u.parent?u.parent.type:void 0);const De=u.subTree=Ks(u);D(null,De,m,_,u,g,y),d.el=De.el}if(te&&we(te,g),!Re&&(A=H&&H.onVnodeMounted)){const De=d;we(()=>Ne(A,Q,De),g)}(d.shapeFlag&256||Q&&Kt(Q.vnode)&&Q.vnode.shapeFlag&256)&&u.a&&we(u.a,g),u.isMounted=!0,d=m=_=null}};u.scope.on();const w=u.effect=new xn(C);u.scope.off();const v=u.update=w.run.bind(w),O=u.job=w.runIfDirty.bind(w);O.i=u,O.id=u.uid,w.scheduler=()=>ms(O),bt(u,!0),v()},oe=(u,d,m)=>{d.component=u;const _=u.vnode.props;u.vnode=d,u.next=null,Go(u,d.props,_,m),ea(u,d.children,m),nt(),Rs(u),it()},se=(u,d,m,_,g,y,S,C,w=!1)=>{const v=u&&u.children,O=u?u.shapeFlag:0,A=d.children,{patchFlag:P,shapeFlag:H}=d;if(P>0){if(P&128){ll(v,A,m,_,g,y,S,C,w);return}else if(P&256){ft(v,A,m,_,g,y,S,C,w);return}}H&8?(O&16&&At(v,g,y),A!==v&&p(m,A)):O&16?H&16?ll(v,A,m,_,g,y,S,C,w):At(v,g,y,!0):(O&8&&p(m,""),H&16&&I(A,m,_,g,y,S,C,w))},ft=(u,d,m,_,g,y,S,C,w)=>{u=u||vt,d=d||vt;const v=u.length,O=d.length,A=Math.min(v,O);let P;for(P=0;P<A;P++){const H=d[P]=w?Xe(d[P]):Ke(d[P]);D(u[P],H,m,null,g,y,S,C,w)}v>O?At(u,g,y,!0,!1,A):I(d,m,_,g,y,S,C,w,A)},ll=(u,d,m,_,g,y,S,C,w)=>{let v=0;const O=d.length;let A=u.length-1,P=O-1;for(;v<=A&&v<=P;){const H=u[v],B=d[v]=w?Xe(d[v]):Ke(d[v]);if(Ot(H,B))D(H,B,m,null,g,y,S,C,w);else break;v++}for(;v<=A&&v<=P;){const H=u[A],B=d[P]=w?Xe(d[P]):Ke(d[P]);if(Ot(H,B))D(H,B,m,null,g,y,S,C,w);else break;A--,P--}if(v>A){if(v<=P){const H=P+1,B=H<O?d[H].el:_;for(;v<=P;)D(null,d[v]=w?Xe(d[v]):Ke(d[v]),m,B,g,y,S,C,w),v++}}else if(v>P)for(;v<=A;)Pe(u[v],g,y,!0),v++;else{const H=v,B=v,te=new Map;for(v=B;v<=P;v++){const Ce=d[v]=w?Xe(d[v]):Ke(d[v]);Ce.key!=null&&te.set(Ce.key,v)}let Q,ue=0;const pe=P-B+1;let Re=!1,De=0;const Pt=new Array(pe);for(v=0;v<pe;v++)Pt[v]=0;for(v=H;v<=A;v++){const Ce=u[v];if(ue>=pe){Pe(Ce,g,y,!0);continue}let He;if(Ce.key!=null)He=te.get(Ce.key);else for(Q=B;Q<=P;Q++)if(Pt[Q-B]===0&&Ot(Ce,d[Q])){He=Q;break}He===void 0?Pe(Ce,g,y,!0):(Pt[He-B]=v+1,He>=De?De=He:Re=!0,D(Ce,d[He],m,null,g,y,S,C,w),ue++)}const $s=Re?na(Pt):vt;for(Q=$s.length-1,v=pe-1;v>=0;v--){const Ce=B+v,He=d[Ce],Ms=d[Ce+1],js=Ce+1<O?Ms.el||di(Ms):_;Pt[v]===0?D(null,He,m,js,g,y,S,C,w):Re&&(Q<0||v!==$s[Q]?ht(He,m,js,2):Q--)}}},ht=(u,d,m,_,g=null)=>{const{el:y,type:S,transition:C,children:w,shapeFlag:v}=u;if(v&6){ht(u.component.subTree,d,m,_);return}if(v&128){u.suspense.move(d,m,_);return}if(v&64){S.move(u,d,m,It);return}if(S===W){n(y,d,m);for(let A=0;A<w.length;A++)ht(w[A],d,m,_);n(u.anchor,d,m);return}if(S===ul){Z(u,d,m);return}if(_!==2&&v&1&&C)if(_===0)C.persisted&&!y[Fl]?n(y,d,m):(C.beforeEnter(y),n(y,d,m),we(()=>C.enter(y),g));else{const{leave:A,delayLeave:P,afterLeave:H}=C,B=()=>{u.ctx.isUnmounted?i(y):n(y,d,m)},te=()=>{const Q=y._isLeaving||!!y[Fl];y._isLeaving&&y[Fl](!0),C.persisted&&!Q?B():A(y,()=>{B(),H&&H()})};P?P(y,B,te):te()}else n(y,d,m)},Pe=(u,d,m,_=!1,g=!1)=>{const{type:y,props:S,ref:C,children:w,dynamicChildren:v,shapeFlag:O,patchFlag:A,dirs:P,cacheIndex:H,memo:B}=u;if((A===-2||v&&v.hasOnce)&&(g=!1),C!=null&&(nt(),Vt(C,null,m,u,!0),it()),H!=null&&(!u.ctx||u.ctx===d)&&(d.renderCache[H]=void 0),O&256){d.ctx.deactivate(u);return}const te=O&1&&P,Q=!Kt(u);let ue;if(Q&&(ue=S&&S.onVnodeBeforeUnmount)&&Ne(ue,d,u),O&6)Si(u.component,m,_);else{if(O&128){u.suspense.unmount(m,_);return}te&&mt(u,null,d,"beforeUnmount"),O&64?u.type.remove(u,d,m,It,_):v&&!v.hasOnce&&(y!==W||A>0&&A&64)?At(v,d,m,!1,!0):(y===W&&A&384||!g&&O&16)&&At(w,d,m),_&&Ss(u)}const pe=B!=null&&H==null;(Q&&(ue=S&&S.onVnodeUnmounted)||te||pe)&&we(()=>{ue&&Ne(ue,d,u),te&&mt(u,null,d,"unmounted"),pe&&(u.el=null)},m)},Ss=u=>{const{type:d,el:m,anchor:_,transition:g}=u;if(d===W){Ci(m,_);return}if(d===ul){q(u),g&&!g.persisted&&g.afterLeave&&g.afterLeave();return}const y=()=>{i(m),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(u.shapeFlag&1&&g&&!g.persisted){const{leave:S,delayLeave:C}=g,w=()=>S(m,y);C?C(u.el,y,w):w()}else y()},Ci=(u,d)=>{let m;for(;u!==d;)m=$(u),i(u),u=m;i(d)},Si=(u,d,m)=>{const{bum:_,scope:g,job:y,subTree:S,um:C,m:w,a:v}=u;Ws(w),Ws(v),_&&rl(_),g.stop(),y?(y.flags|=8,Pe(S,u,d,m)):u.vnode.el&&S&&(S.transition=u.vnode.transition,Pe(S,u,d,m)),C&&we(C,d),we(()=>{u.isUnmounted=!0},d)},At=(u,d,m,_=!1,g=!1,y=0)=>{for(let S=y;S<u.length;S++)Pe(u[S],d,m,_,g)},sl=u=>{if(u.shapeFlag&6)return sl(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=$(u.anchor||u.el),m=d&&d[_o];return m?$(m):d};let Ol=!1;const Ts=(u,d,m)=>{let _;u==null?d._vnode&&(Pe(d._vnode,null,null,!0),_=d._vnode.component):D(d._vnode||null,u,d,null,null,null,m),d._vnode=u,Ol||(Ol=!0,Rs(_),Ln(),Ol=!1)},It={p:D,um:Pe,m:ht,r:Ss,mt:ql,mc:I,pc:se,pbc:ce,n:sl,o:e};return{render:Ts,hydrate:void 0,createApp:Lo(Ts)}}function Vl({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function bt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function sa(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ci(e,t,s=!1){const n=e.children,i=t.children;if(E(n)&&E(i))for(let o=0;o<n.length;o++){const a=n[o];let r=i[o];r.shapeFlag&1&&!r.dynamicChildren&&((r.patchFlag<=0||r.patchFlag===32)&&(r=i[o]=Xe(i[o]),r.el=a.el),!s&&r.patchFlag!==-2&&ci(a,r)),r.type===Al&&(r.patchFlag===-1&&(r=i[o]=Xe(r)),r.el=a.el),r.type===ot&&!r.el&&(r.el=a.el)}}function na(e){const t=e.slice(),s=[0];let n,i,o,a,r;const c=e.length;for(n=0;n<c;n++){const h=e[n];if(h!==0){if(i=s[s.length-1],e[i]<h){t[n]=i,s.push(n);continue}for(o=0,a=s.length-1;o<a;)r=o+a>>1,e[s[r]]<h?o=r+1:a=r;h<e[s[o]]&&(o>0&&(t[n]=s[o-1]),s[o]=n)}}for(o=s.length,a=s[o-1];o-- >0;)s[o]=a,a=t[a];return s}function ui(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ui(t)}function Ws(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function di(e){if(e.placeholder)return e.placeholder;const t=e.component;return t?di(t.subTree):null}const pi=e=>e.__isSuspense;function ia(e,t){t&&t.pendingBranch?E(e)?t.effects.push(...e):t.effects.push(e):ho(e)}const W=Symbol.for("v-fgt"),Al=Symbol.for("v-txt"),ot=Symbol.for("v-cmt"),ul=Symbol.for("v-stc"),xt=[];let $e=null;function T(e=!1){xt.push($e=e?null:[])}function fi(){xt.pop(),$e=xt[xt.length-1]||null}let Zt=1;function zs(e,t=!1){Zt+=e,e<0&&$e&&t&&($e.hasOnce=!0)}function hi(e){return e.dynamicChildren=Zt>0?$e||vt:null,fi(),Zt>0&&$e&&$e.push(e),e}function M(e,t,s,n,i,o){return hi(l(e,t,s,n,i,o,!0))}function xs(e,t,s,n,i){return hi(L(e,t,s,n,i,!0))}function mi(e){return e?e.__v_isVNode===!0:!1}function Ot(e,t){return e.type===t.type&&e.key===t.key}const bi=({key:e})=>e??null,dl=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?re(e)||me(e)||N(e)?{i:Me,r:e,k:t,f:!!s}:e:null);function l(e,t=null,s=null,n=0,i=null,o=e===W?0:1,a=!1,r=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&bi(t),ref:t&&dl(t),scopeId:Kn,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:n,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:Me};return r?(gl(c,s),o&128&&e.normalize(c)):s&&(c.shapeFlag|=re(s)?8:16),Zt>0&&!a&&$e&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&$e.push(c),c}const L=oa;function oa(e,t=null,s=null,n=0,i=null,o=!1){if((!e||e===qo)&&(e=ot),mi(e)){const r=Mt(e,t,!0);return s&&gl(r,s),Zt>0&&!o&&$e&&(r.shapeFlag&6?$e[$e.indexOf(e)]=r:$e.push(r)),r.patchFlag=-2,r}if(ba(e)&&(e=e.__vccOpts),t){t=aa(t);let{class:r,style:c}=t;r&&!re(r)&&(t.class=tt(r)),ee(c)&&(hs(c)&&!E(c)&&(c=be({},c)),t.style=jt(c))}const a=re(e)?1:pi(e)?128:$l(e)?64:ee(e)?4:N(e)?2:0;return l(e,t,s,n,i,a,o,!0)}function aa(e){return e?hs(e)||si(e)?be({},e):e:null}function Mt(e,t,s=!1,n=!1){const{props:i,ref:o,patchFlag:a,children:r,transition:c}=e,h=t?gi(i||{},t):i,p={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&bi(h),ref:t&&t.ref?s&&o?E(o)?o.concat(dl(t)):[o,dl(t)]:dl(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:r,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==W?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Mt(e.ssContent),ssFallback:e.ssFallback&&Mt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return c&&n&&bs(p,c.clone(p)),p}function f(e=" ",t=0){return L(Al,null,e,t)}function Se(e,t){const s=L(ul,null,e);return s.staticCount=t,s}function U(e="",t=!1){return t?(T(),xs(ot,null,e)):L(ot,null,e)}function Ke(e){return e==null||typeof e=="boolean"?L(ot):E(e)?L(W,null,e.slice()):mi(e)?Xe(e):L(Al,null,String(e))}function Xe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Mt(e)}function gl(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(E(t))s=16;else if(typeof t=="object")if(n&65){const i=t.default;i&&(i._c&&(i._d=!1),gl(e,i()),i._c&&(i._d=!0));return}else{s=32;const i=t._;!i&&!si(t)?t._ctx=Me:i===3&&Me&&(Me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(N(t)){if(n&65){gl(e,{default:t});return}t={default:t,_ctx:Me},s=32}else t=String(t),n&64?(s=16,t=[f(t)]):s=8;e.children=t,e.shapeFlag|=s}function gi(...e){const t={};for(let s=0;s<e.length;s++){const n=e[s];for(const i in n)if(i==="class")t.class!==n.class&&(t.class=tt([t.class,n.class]));else if(i==="style")t.style=jt([t.style,n.style]);else if(xl(i)){const o=t[i],a=n[i];a&&o!==a&&!(E(o)&&o.includes(a))?t[i]=o?[].concat(o,a):a:a==null&&o==null&&!wl(i)&&(t[i]=a)}else i!==""&&(t[i]=n[i])}return t}function Ne(e,t,s,n=null){Ee(e,t,7,[s,n])}const ra=Xn();let ca=0;function ua(e,t,s){const n=e.type,i=(t?t.appContext:e.appContext)||ra,o={uid:ca++,vnode:e,type:n,parent:t,appContext:i,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Hi(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(i.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ii(n,i),emitsOptions:Qn(n,i),emit:null,emitted:null,propsDefaults:le,inheritAttrs:n.inheritAttrs,ctx:le,data:le,props:le,attrs:le,slots:le,refs:le,setupState:le,setupContext:null,suspense:s,suspenseId:s?s.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return o.ctx={_:o},o.root=t?t.root:o,o.emit=Ko.bind(null,o),e.ce&&e.ce(o),o}let xe=null;const da=()=>xe||Me;let vl,Yt;{const e=Cl(),t=(s,n)=>{let i;return(i=e[s])||(i=e[s]=[]),i.push(n),o=>{i.length>1?i.forEach(a=>a(o)):i[0](o)}};vl=t("__VUE_INSTANCE_SETTERS__",s=>xe=s),Yt=t("__VUE_SSR_SETTERS__",s=>Gt=s)}const el=e=>{const t=xe;return vl(e),e.scope.on(),()=>{e.scope.off(),vl(t)}},Zs=()=>{xe&&xe.scope.off(),vl(null)};function vi(e){return e.vnode.shapeFlag&4}let Gt=!1;function pa(e,t=!1,s=!1){t&&Yt(t);const{props:n,children:i}=e.vnode,o=vi(e);Yo(e,n,o,t),Qo(e,i,s||t);const a=o?fa(e,t):void 0;return t&&Yt(!1),a}function fa(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Oo);const{setup:n}=s;if(n){nt();const i=e.setupContext=n.length>1?ma(e):null,o=el(e),a=Qt(n,e,0,[e.props,i]),r=pn(a);if(it(),o(),(r||e.sp)&&!Kt(e)&&zn(e),r){if(a.then(Zs,Zs),t)return a.then(c=>{Yt(!0);try{Ys(e,c,t)}finally{Yt(!1)}}).catch(c=>{Tl(c,e,0)});e.asyncDep=a}else Ys(e,a)}else yi(e)}function Ys(e,t,s){N(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=Dn(t)),yi(e)}function yi(e,t,s){const n=e.type;e.render||(e.render=n.render||ze);{const i=el(e);nt();try{Eo(e)}finally{it(),i()}}}const ha={get(e,t){return he(e,"get",""),e[t]}};function ma(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,ha),slots:e.slots,emit:e.emit,expose:t}}function Il(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Dn(no(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in Ut)return Ut[s](e)},has(t,s){return s in t||s in Ut}})):e.proxy}function ba(e){return N(e)&&"__vccOpts"in e}const Be=(e,t)=>ro(e,t,Gt),ga="3.5.43";let es;const Gs=typeof window<"u"&&window.trustedTypes;if(Gs)try{es=Gs.createPolicy("vue",{createHTML:e=>e})}catch{}const _i=es?e=>es.createHTML(e):e=>e,va="http://www.w3.org/2000/svg",ya="http://www.w3.org/1998/Math/MathML",Je=typeof document<"u"?document:null,Js=Je&&Je.createElement("template"),_a={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const i=t==="svg"?Je.createElementNS(va,e):t==="mathml"?Je.createElementNS(ya,e):s?Je.createElement(e,{is:s}):Je.createElement(e);return e==="select"&&n&&n.multiple!=null&&i.setAttribute("multiple",n.multiple),i},createText:e=>Je.createTextNode(e),createComment:e=>Je.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Je.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,i,o){const a=s?s.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),s),!(i===o||!(i=i.nextSibling)););else{Js.innerHTML=_i(n==="svg"?`<svg>${e}</svg>`:n==="mathml"?`<math>${e}</math>`:e);const r=Js.content;if(n==="svg"||n==="mathml"){const c=r.firstChild;for(;c.firstChild;)r.appendChild(c.firstChild);r.removeChild(c)}t.insertBefore(r,s)}return[a?a.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},xa=Symbol("_vtc");function wa(e,t,s){const n=e[xa];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const yl=Symbol("_vod"),xi=Symbol("_vsh"),Et={name:"show",beforeMount(e,{value:t},{transition:s}){e[yl]=e.style.display==="none"?"":e.style.display,s&&t?s.beforeEnter(e):Rt(e,t)},mounted(e,{value:t},{transition:s}){s&&t&&s.enter(e)},updated(e,{value:t,oldValue:s},{transition:n}){!t!=!s&&(n?t?(n.beforeEnter(e),Rt(e,!0),n.enter(e)):n.leave(e,()=>{Rt(e,!1)}):Rt(e,t))},beforeUnmount(e,{value:t}){Rt(e,t)}};function Rt(e,t){e.style.display=t?e[yl]:"none",e[xi]=!t}const ka=Symbol(""),Ca=/(?:^|;)\s*display\s*:/;function Sa(e,t,s){const n=e.style,i=re(s);let o=!1;if(s&&!i){if(t)if(re(t))for(const a of t.split(";")){const r=a.slice(0,a.indexOf(":")).trim();s[r]==null&&Ht(n,r,"")}else for(const a in t)s[a]==null&&Ht(n,a,"");for(const a in s){a==="display"&&(o=!0);const r=s[a];r!=null?$a(e,a,!re(t)&&t?t[a]:void 0,r)||Ht(n,a,r):Ht(n,a,"")}}else if(i){if(t!==s){const a=n[ka];a&&(s+=";"+a),n.cssText=s,o=Ca.test(s)}}else t&&e.removeAttribute("style");yl in e&&(e[yl]=o?n.display:"",e[xi]&&(n.display="none"))}const al=/\s*!important$/;function Ht(e,t,s){if(E(s))s.forEach(n=>Ht(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))al.test(s)?e.setProperty(t,s.replace(al,""),"important"):e.setProperty(t,s);else{const n=Ta(e,t);al.test(s)?e.setProperty(pt(n),s.replace(al,""),"important"):e[n]=s}}const Xs=["Webkit","Moz","ms"],Kl={};function Ta(e,t){const s=Kl[t];if(s)return s;let n=qe(t);if(n!=="filter"&&n in e)return Kl[t]=n;n=mn(n);for(let i=0;i<Xs.length;i++){const o=Xs[i]+n;if(o in e)return Kl[t]=o}return t}function $a(e,t,s,n){return e.tagName==="TEXTAREA"&&(t==="width"||t==="height")&&re(n)&&s===n}const Qs="http://www.w3.org/1999/xlink";function en(e,t,s,n,i,o=Ei(t)){n&&t.startsWith("xlink:")?s==null?e.removeAttributeNS(Qs,t.slice(6,t.length)):e.setAttributeNS(Qs,t,s):s==null||o&&!vn(s)?e.removeAttribute(t):e.setAttribute(t,o?"":Ze(s)?String(s):s)}function tn(e,t,s,n,i){if(t==="innerHTML"||t==="textContent"){s!=null&&(e[t]=t==="innerHTML"?_i(s):s);return}const o=e.tagName;if(t==="value"&&o!=="PROGRESS"&&!o.includes("-")){const r=o==="OPTION"?e.getAttribute("value")||"":e.value,c=s==null?e.type==="checkbox"?"on":"":String(s);(r!==c||!("_value"in e))&&(e.value=c),s==null&&e.removeAttribute(t),e._value=s;return}let a=!1;if(s===""||s==null){const r=typeof e[t];r==="boolean"?s=vn(s):s==null&&r==="string"?(s="",a=!0):r==="number"&&(s=0,a=!0)}try{e[t]=s}catch{}a&&e.removeAttribute(i||t)}function ws(e,t,s,n){e.addEventListener(t,s,n)}function Ma(e,t,s,n){e.removeEventListener(t,s,n)}const ln=Symbol("_vei");function ja(e,t,s,n,i=null){const o=e[ln]||(e[ln]={}),a=o[t];if(n&&a)a.value=n;else{const[r,c]=Pa(t);if(n){const h=o[t]=Ea(n,i);ws(e,r,h,c)}else a&&(Ma(e,r,a,c),o[t]=void 0)}}const Aa=/(Once|Passive|Capture)$/,Ia=/^on:?(?:Once|Passive|Capture)$/;function Pa(e){let t,s;for(;(s=e.match(Aa))&&!Ia.test(e);)t||(t={}),e=e.slice(0,e.length-s[1].length),t[s[1].toLowerCase()]=!0;return[e[2]===":"?e.slice(3):pt(e.slice(2)),t]}let Ul=0;const qa=Promise.resolve(),Oa=()=>Ul||(qa.then(()=>Ul=0),Ul=Date.now());function Ea(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;const i=s.value;if(E(i)){const o=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{o.call(n),n._stopped=!0};const a=i.slice(),r=[n];for(let c=0;c<a.length&&!n._stopped;c++){const h=a[c];h&&Ee(h,t,5,r)}}else Ee(i,t,5,[n])};return s.value=e,s.attached=Oa(),s}const sn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ra=(e,t,s,n,i,o)=>{const a=i==="svg";t==="class"?wa(e,n,a):t==="style"?Sa(e,s,n):xl(t)?wl(t)||ja(e,t,s,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Da(e,t,n,a))?(tn(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&en(e,t,n,a,o,t!=="value")):e._isVueCE&&(Ha(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!re(n)))?tn(e,qe(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),en(e,t,n,a))};function Da(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&sn(t)&&N(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return sn(t)&&re(s)?!1:t in e}function Ha(e,t){const s=e._def.props;if(!s)return!1;const n=qe(t);return Array.isArray(s)?s.some(i=>qe(i)===n):Object.keys(s).some(i=>qe(i)===n)}const _l=e=>{const t=e.props["onUpdate:modelValue"]||!1;return E(t)?s=>rl(t,s):t},$t=Symbol("_assign"),nn={deep:!0,created(e,t,s){e[$t]=_l(s),ws(e,"change",()=>{const n=e._modelValue,i=Jt(e),o=e.checked,a=e[$t];if(E(n)){const r=os(n,i),c=r!==-1;if(o&&!c)a(n.concat(i));else if(!o&&c){const h=[...n];h.splice(r,1),a(h)}}else if(lt(n)){const r=new Set(n);o?r.add(i):r.delete(i),a(r)}else a(wi(e,o))})},mounted:on,beforeUpdate(e,t,s){e[$t]=_l(s),on(e,t,s)}};function on(e,{value:t,oldValue:s},n){e._modelValue=t;let i;if(E(t))i=os(t,n.props.value)>-1;else if(lt(t))i=t.has(n.props.value);else{if(t===s)return;i=st(t,wi(e,!0))}e.checked!==i&&(e.checked=i)}const ts={deep:!0,created(e,{value:t,modifiers:{number:s}},n){e._modelValue=t,ws(e,"change",()=>{const i=Array.prototype.filter.call(e.options,c=>c.selected).map(c=>s?gn(Jt(c)):Jt(c)),o=e.multiple,a=o?lt(e._modelValue)?new Set(i):i:i[0],r=e._pendingValue=[o,o?E(a)?i.slice():i:a];try{e[$t](a)}finally{Nn(()=>{e._pendingValue===r&&(e._pendingValue=void 0)})}}),e[$t]=_l(n)},mounted(e,{value:t}){an(e,t)},beforeUpdate(e,{value:t},s){e._modelValue=t,e[$t]=_l(s)},updated(e,{value:t}){const s=e._pendingValue;e._pendingValue=void 0,(!s||s[0]!==e.multiple||!Na(t,s[1],s[0]))&&an(e,t)}};function Na(e,t,s){if(!s||E(e))return st(e,t);if(lt(e)){if(e.size!==t.length)return!1;for(const n of t)if(!e.has(n))return!1;return!0}return!1}function an(e,t){const s=e.multiple,n=E(t);if(!(s&&!n&&!lt(t))){for(let i=0,o=e.options.length;i<o;i++){const a=e.options[i],r=Jt(a);if(s)if(n){const c=typeof r;c==="string"||c==="number"?a.selected=t.some(h=>String(h)===String(r)):a.selected=os(t,r)>-1}else a.selected=t.has(r);else if(st(Jt(a),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Jt(e){return"_value"in e?e._value:e.value}function wi(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const Fa=["ctrl","shift","alt","meta"],La={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Fa.some(s=>e[`${s}Key`]&&!t.includes(s))},ls=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((i,...o)=>{for(let a=0;a<t.length;a++){const r=La[t[a]];if(r&&r(i,t))return}return e(i,...o)}))},Va={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},rn=(e,t)=>{const s=e._withKeys||(e._withKeys={}),n=t.join(".");return s[n]||(s[n]=(i=>{if(!("key"in i))return;const o=pt(i.key);if(t.some(a=>a===o||Va[a]===o))return e(i)}))},Ka=be({patchProp:Ra},_a);let cn;function Ua(){return cn||(cn=ta(Ka))}const Ba=((...e)=>{const t=Ua().createApp(...e),{mount:s}=t;return t.mount=n=>{const i=za(n);if(!i)return;const o=t._component;!N(o)&&!o.render&&!o.template&&(o.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const a=s(i,!1,Wa(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),a},t});function Wa(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function za(e){return re(e)?document.querySelector(e):e}const Za={class:"app-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.65","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},Ya=["d"],de={__name:"AppIcon",props:{name:{type:String,default:"grid"}},setup(e){const t={shield:"M12 2 3 6v6c0 5 9 10 9 10s9-5 9-10V6Z M8 12l3 3 5-6",location:"M20 10c0 6-8 12-8 12S4 16 4 10a8 8 0 1 1 16 0 M15 10a3 3 0 1 1-6 0 3 3 0 0 1 6 0",home:"m3 10 9-7 9 7v10H3Z M9 20v-7h6v7",journal:"M5 3h14v18H5Z M8 7h8 M8 11h8 M8 15h5",grid:"M3 3h7v7H3Z M14 3h7v7h-7Z M3 14h7v7H3Z M14 14h7v7h-7Z",devices:"M3 4h18v12H3Z M8 20h8 M12 16v4",tree:"M9 2h6v6H9Z M2 16h6v6H2Z M16 16h6v6h-6Z M12 8v4 M5 16v-4h14v4",users:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2 M22 21v-2a4 4 0 0 0-3-3.8 M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8 M17 3a4 4 0 0 1 0 8",settings:"M9 3h6l1 4 4 1v8l-4 1-1 4H9l-1-4-4-1V8l4-1Z M15 12a3 3 0 1 0-6 0 3 3 0 0 0 6 0",database:"M3 6c0-5 18-5 18 0s-18 5-18 0V18c0 5 18 5 18 0V6 M3 12c0 5 18 5 18 0",network:"M9 2h6v6H9Z M2 16h6v6H2Z M16 16h6v6h-6Z M12 8v4 M5 16v-4h14v4",arrow:"M5 12h14 M14 7l5 5-5 5",router:"M3 13h18v8H3Z M6 13V5 M18 13V5 M7 17h.01 M11 17h.01 M15 17h3",camera:"M3 6h12v12H3Z M15 10l6-4v12l-6-4"};return(s,n)=>(T(),M("svg",Za,[l("path",{d:t[e.name]||t.grid},null,8,Ya)]))}},Ga={class:"sidebar"},Ja={class:"nav flex-column",id:"main-navigation","aria-label":"主导航"},Xa={"data-page":"households",class:"active"},Qa={id:"scope-navigation",hidden:""},er={"data-page":"journal"},tr={"data-page":"overview"},lr={"data-page":"objects"},sr={"data-page":"heritage"},nr={"data-page":"users","data-admin":""},ir={"data-page":"settings"},or={"data-page":"storage"},ar={__name:"AppSidebar",setup(e){return(t,s)=>(T(),M("aside",Ga,[s[17]||(s[17]=Se('<a class="brand" href="/"><img id="brand-image" class="brand-icon" src="/zhao-icon.png" alt="赵字古文字风格标识"><span><span id="brand-name">赵府</span><small id="brand-subtitle">智能数字管家</small></span></a><button id="mobile-nav-toggle" class="quiet mobile-nav-toggle" aria-expanded="false" aria-controls="main-navigation" type="button">☰ 菜单</button><div class="nav-label">家宅 · 起居</div>',3)),l("nav",Ja,[l("button",Xa,[L(de,{name:"home"}),s[0]||(s[0]=f()),s[1]||(s[1]=l("span",null,"我的家庭与场所",-1))]),l("div",Qa,[s[12]||(s[12]=l("div",{id:"scope-nav-name",class:"nav-label"},null,-1)),l("button",er,[L(de,{name:"journal"}),s[2]||(s[2]=f()),s[3]||(s[3]=l("span",null,"记事与阅历",-1))]),l("button",tr,[L(de,{name:"grid"}),s[4]||(s[4]=f()),s[5]||(s[5]=l("span",null,"场所总览",-1))]),l("button",lr,[L(de,{name:"devices"}),s[6]||(s[6]=f()),s[7]||(s[7]=l("span",null,"区域与设备",-1))]),l("button",sr,[L(de,{name:"tree"}),s[8]||(s[8]=f()),s[9]||(s[9]=l("span",null,"家庭传承",-1))]),l("button",nr,[L(de,{name:"users"}),s[10]||(s[10]=f()),s[11]||(s[11]=l("span",null,"成员与权限",-1))])]),l("button",ir,[L(de,{name:"settings"}),s[13]||(s[13]=f()),s[14]||(s[14]=l("span",null,"设置中心",-1))]),l("button",or,[L(de,{name:"database"}),s[15]||(s[15]=f()),s[16]||(s[16]=l("span",null,"平台存储与审计",-1))])]),s[18]||(s[18]=Se('<div class="side-note"><span class="dot"></span> 独立部署 · 数据自有<p>按空间组织画面<br>让每一段记录有处可寻</p></div><p id="current-user" class="description"></p><button id="account-password" class="quiet" hidden>修改我的密码</button><button id="logout" class="quiet">退出登录</button>',4))]))}},ki=(e,t)=>{const s=e.__vccOpts||e;for(const[n,i]of t)s[n]=i;return s},rr={};function cr(e,t){return T(),M("header",null,[...t[0]||(t[0]=[Se('<div><div class="eyebrow" id="brand-motto">赵氏家宅 · 起居有序</div><h1 id="page-title">我的家庭与场所</h1><p id="page-note">从一个空间,看到每一个位置。</p></div><div class="header-status"><span id="service-status" class="badge">等待连接</span><span id="clock"></span></div>',2)])])}const ur=ki(rr,[["render",cr]]),J=En({state:{households:[],sites:[],cameras:[]},admin:!1,loggedIn:!1,page:"households",session:0,device:null}),We=En({devices:[],groups:[],rows:[]});window.ZhaoVue={enabled:!0,accept(e){J.value=e},setDevices(e){We.value=e},clear(){We.value={devices:[],groups:[],rows:[]}}};const Te=()=>window.ZhaoVue,Pl=e=>({lan:"局域网",tailscale:"Tailscale",public:"公网",unknown:"接入待确认"})[e]||"接入待确认";function dr(e=[]){const t=[{key:"home",label:"家庭",color:"#258b76",count:0},{key:"office",label:"办公",color:"#5c83cb",count:0},{key:"factory",label:"工厂",color:"#c69a52",count:0},{key:"other",label:"其他",color:"#8997a9",count:0}];let s=0,n=0;for(const o of e)(t.find(a=>a.key===(o.kind||"home"))||t[3]).count++,s+=Math.max(0,Number(o.deviceCount)||0),n+=Math.max(0,Number(o.sites)||0);let i=0;return{total:e.length,devices:s,areas:n,kinds:t.filter(o=>o.count).map(o=>{const a={...o,share:o.count/e.length*100,offset:i};return i+=a.share,a})}}function pr(e=[]){const t=e.map((i,o)=>({...i,x:28+Math.max(0,i.depth)*300,y:26+o*112})),s=new Map(t.map(i=>[i.device.id,i])),n=t.flatMap(i=>{const o=s.get(i.device.uplinkId);if(!o||o.depth+1!==i.depth)return[];const a=o.x+244,r=o.y+40,c=i.y+40;return[{id:i.device.id,path:`M${a},${r} H${a+24} V${c} H${i.x}`}]});return{nodes:t,edges:n,width:Math.max(640,...t.map(i=>i.x+272)),height:Math.max(172,t.length*112+26)}}const fr={class:"home-insights","aria-label":"已授权场所概览"},hr={class:"insight-welcome"},mr={class:"insight-scope"},br={class:"insight-number"},gr={class:"insight-icon"},vr={class:"insight-foot"},yr={class:"insight-distribution"},_r={class:"insight-donut"},xr=["aria-label"],wr=["stroke","stroke-dasharray","stroke-dashoffset"],kr={"aria-hidden":"true"},Cr={class:"insight-legend"},Sr={key:0},Tr={__name:"HomeInsights",setup(e){const t=Be(()=>dr(J.value.state.households));return(s,n)=>(T(),M("section",fr,[l("article",hr,[n[1]||(n[1]=l("span",{class:"insight-kicker"},"一处相连 · 各有归属",-1)),n[2]||(n[2]=l("h2",null,"家与日常,尽在掌握",-1)),n[3]||(n[3]=l("p",null,"从一个空间出发,照看设备,也珍藏生活。",-1)),l("div",mr,[L(de,{name:"shield"}),n[0]||(n[0]=f(" 仅汇总你有权访问的家庭与场所",-1))])]),l("article",br,[l("span",gr,[L(de,{name:"devices"})]),n[5]||(n[5]=l("span",{class:"insight-label"},"已登记设备",-1)),l("strong",null,[f(k(t.value.devices),1),n[4]||(n[4]=l("small",null,"台",-1))]),l("span",vr,"分布在 "+k(t.value.areas)+" 处区域",1)]),l("article",yr,[l("div",_r,[(T(),M("svg",{viewBox:"0 0 120 120",role:"img","aria-label":"场所分布:"+(t.value.kinds.map(i=>i.label+i.count+"个").join(",")||"暂无场所")},[n[6]||(n[6]=l("circle",{class:"donut-track",cx:"60",cy:"60",r:"48",fill:"none","stroke-width":"10"},null,-1)),(T(!0),M(W,null,_e(t.value.kinds,i=>(T(),M("circle",{key:i.key,cx:"60",cy:"60",r:"48",fill:"none","stroke-width":"10",pathLength:"100",stroke:i.color,"stroke-dasharray":`${i.share} ${100-i.share}`,"stroke-dashoffset":-i.offset,transform:"rotate(-90 60 60)"},null,8,wr))),128))],8,xr)),l("div",kr,[l("strong",null,k(t.value.total),1),n[7]||(n[7]=l("small",null,"家庭与场所",-1))])]),l("div",Cr,[n[8]||(n[8]=l("h3",null,"空间分布",-1)),(T(!0),M(W,null,_e(t.value.kinds,i=>(T(),M("span",{key:i.key},[l("i",{style:jt({background:i.color})},null,4),f(k(i.label),1),l("b",null,k(i.count),1)]))),128)),t.value.total?U("",!0):(T(),M("span",Sr,"等待添加空间"))])])]))}},$r={id:"page-households",class:"page"},Mr={class:"section-head"},jr={class:"count-pill"},Ar=["hidden"],Ir={class:"btn-group",role:"group","aria-label":"场所显示方式"},Pr=["aria-pressed"],qr=["aria-pressed"],Or=["aria-expanded"],Er={id:"home-layout-options",class:"home-layout-controls"},Rr=["disabled"],Dr=["value"],Hr=["disabled"],Nr=["value"],Fr={class:"inline-check"},Lr=["disabled"],Vr={class:"inline-check"},Kr=["disabled"],Ur=["disabled"],Br=["disabled"],Wr={id:"home-layout-status",role:"status",class:"small text-secondary"},zr={key:0,class:"group-title"},Zr={class:"home-card-grid"},Yr=["draggable","onDragstart","onDrop"],Gr={class:"home-cover"},Jr=["src","alt"],Xr={class:"home-cover-content"},Qr={class:"site-heading"},ec={class:"badge"},tc=["data-edit-household"],lc={class:"home-location"},sc={class:"card-body"},nc={key:0,class:"home-order-actions"},ic=["disabled","aria-label","onClick"],oc=["disabled","aria-label","onClick"],ac={class:"home-summary"},rc={class:"home-numbers"},cc={class:"compact-details"},uc={class:"home-card-actions"},dc=["onClick"],pc=["data-leadership"],fc={key:0,class:"empty"},hc={id:"home-global-topology",class:"network-overview"},mc={class:"network-platform"},bc={class:"platform-place-grid"},gc=["onClick"],vc={class:"badge"},yc={class:"home-pagination"},_c={id:"home-page-info"},xc=["disabled"],wc=["disabled"],kc={__name:"HomeExplorer",setup(e){const t=ke({revision:0,columns:2,rows:2,groupCity:!1,order:[]}),s=ke(!1),n=ke(!1),i=ke(0),o=ke(!1),a=ke("cards"),r=ke(!1),c=ke(""),h=ke("");let p="";_t(J,F=>{const x=F.user?.id+":"+F.session;p!==x&&(p=x,s.value=!1,n.value=!1,i.value=0,o.value=!1,a.value="cards",r.value=!1,c.value="",h.value=""),!s.value&&!n.value&&(t.value={revision:0,columns:2,rows:2,groupCity:!1,order:[],...F.state.householdLayout})},{immediate:!0});const b=Be(()=>{const F=J.value.state.households||[],x=new Map(F.map(I=>[I.id,I]));return[...new Set([...t.value.order,...F.map(I=>I.id)])].filter(I=>x.has(I)).map(I=>x.get(I))}),$=Be(()=>t.value.columns*t.value.rows),j=Be(()=>Math.max(1,Math.ceil(b.value.length/$.value)));_t(j,F=>i.value=Math.min(i.value,F-1));const z=Be(()=>{const F=b.value.slice(i.value*$.value,(i.value+1)*$.value);if(!t.value.groupCity)return[{name:"",items:F}];const x=new Map;for(const I of F){const R=[I.geography?.country||I.country,I.province,I.city||"地区待填写"].filter(Boolean).join(" / ");x.has(R)||x.set(R,[]),x.get(R).push(I)}return[...x].map(([I,R])=>({name:I,items:R}))}),D=F=>({home:"家庭",office:"办公场所",factory:"工厂"})[F.kind||"home"]||"场所",ie=F=>Te().address?.(F)||[F.province,F.city,F.district].filter(Boolean).join(" · ")||"地区待填写";function X(){s.value=!0,i.value=0,t.value.groupCity&&(o.value=!1),h.value="布局已调整,保存后下次登录会沿用。"}function V(F,x,I){if(n.value)return;const R=b.value.map(wt=>wt.id),ce=R.indexOf(F),Ie=I?R.indexOf(I):ce+x;ce<0||Ie<0||Ie>=R.length||ce===Ie||(R.splice(ce,1),R.splice(Ie,0,F),t.value.order=R,s.value=!0,i.value=Math.floor(Ie/$.value))}function Z(){s.value=!1,t.value={...J.value.state.householdLayout},i.value=0,h.value=""}async function q(){const F=p;n.value=!0;try{const x=await Te().saveLayout({...t.value});if(F!==p)return;t.value=x,s.value=!1,h.value="布局与卡片顺序已保存"}catch(x){!x.stale&&F===p&&(h.value=x.message)}finally{F===p&&(n.value=!1)}}async function ae(F,x=!1){await Te().enterHome(F.id,x)}return(F,x)=>(T(),M("section",$r,[l("div",Mr,[l("div",null,[l("h2",null,[x[11]||(x[11]=f(" 我的空间 ",-1)),l("span",jr,k(b.value.length),1)]),x[12]||(x[12]=l("p",{class:"description mb-0"}," 家庭、办公与工厂,各自管理成员、区域和设备。 ",-1))]),l("button",{id:"new-household",class:"btn btn-primary",hidden:!K(J).platformAdmin}," + 新建家庭或场所 ",8,Ar)]),L(Tr),l("div",{class:tt(["home-toolbar",{"home-options-open":r.value}])},[l("div",Ir,[l("button",{id:"home-card-view",class:tt(["btn btn-outline-secondary",{active:a.value==="cards"}]),"aria-pressed":a.value==="cards",onClick:x[0]||(x[0]=I=>a.value="cards")},[L(de,{name:"grid"}),x[13]||(x[13]=f(" 卡片",-1))],10,Pr),l("button",{id:"home-topology-view",class:tt(["btn btn-outline-secondary",{active:a.value==="topology"}]),"aria-pressed":a.value==="topology",onClick:x[1]||(x[1]=I=>a.value="topology")},[L(de,{name:"network"}),x[14]||(x[14]=f(" 整体拓扑 ",-1))],10,qr)]),Fe(l("button",{class:"btn btn-outline-secondary home-layout-toggle","aria-expanded":r.value,"aria-controls":"home-layout-options",onClick:x[2]||(x[2]=I=>r.value=!r.value)},k(r.value?"收起设置":"布局设置"),9,Or),[[Et,a.value==="cards"]]),Fe(l("div",Er,[l("label",null,[x[15]||(x[15]=f("每页 ",-1)),Fe(l("select",{id:"home-columns","onUpdate:modelValue":x[3]||(x[3]=I=>t.value.columns=I),class:"form-select",disabled:n.value,onChange:X},[(T(),M(W,null,_e(4,I=>l("option",{key:I,value:I},k(I)+" 列",9,Dr)),64))],40,Rr),[[ts,t.value.columns,void 0,{number:!0}]])]),x[18]||(x[18]=l("span",null,"×",-1)),Fe(l("select",{id:"home-rows","onUpdate:modelValue":x[4]||(x[4]=I=>t.value.rows=I),"aria-label":"每页行数",class:"form-select",disabled:n.value,onChange:X},[(T(),M(W,null,_e(4,I=>l("option",{key:I,value:I},k(I)+" 行",9,Nr)),64))],40,Hr),[[ts,t.value.rows,void 0,{number:!0}]]),l("label",Fr,[Fe(l("input",{id:"home-group-city","onUpdate:modelValue":x[5]||(x[5]=I=>t.value.groupCity=I),type:"checkbox",class:"form-check-input",disabled:n.value,onChange:X},null,40,Lr),[[nn,t.value.groupCity]]),x[16]||(x[16]=f("按城市分组",-1))]),l("label",Vr,[Fe(l("input",{id:"home-arrange","onUpdate:modelValue":x[6]||(x[6]=I=>o.value=I),type:"checkbox",class:"form-check-input",disabled:t.value.groupCity||n.value},null,8,Kr),[[nn,o.value]]),x[17]||(x[17]=f("调整顺序",-1))]),l("button",{id:"home-layout-save",class:"btn btn-primary",disabled:!s.value||n.value,onClick:q},k(n.value?"保存中…":"保存布局"),9,Ur),l("button",{id:"home-layout-reset",class:"btn btn-outline-secondary",disabled:!s.value||n.value,onClick:Z}," 撤销 ",8,Br)],512),[[Et,a.value==="cards"]])],2),l("p",Wr,k(h.value||"布局仅影响你的账号;手机端自动适配为单列。"),1),Fe(l("div",{id:"household-list",style:jt({"--home-columns":t.value.columns})},[(T(!0),M(W,null,_e(z.value,I=>(T(),M("section",{key:I.name,class:"home-city-group"},[I.name?(T(),M("h3",zr,k(I.name),1)):U("",!0),l("div",Zr,[(T(!0),M(W,null,_e(I.items,R=>(T(),M("article",{key:R.id,class:"card home-card",draggable:o.value&&!n.value,onDragstart:ce=>{c.value=R.id,ce.dataTransfer.setData("text/plain",R.id)},onDragend:x[7]||(x[7]=ce=>c.value=""),onDragover:x[8]||(x[8]=ce=>o.value&&c.value&&ce.preventDefault()),onDrop:ls(ce=>{o.value&&c.value&&V(c.value,0,R.id),c.value=""},["prevent"])},[l("div",Gr,[R.coverUrl?(T(),M("img",{key:0,src:R.coverUrl,alt:R.name+"封面",loading:"lazy"},null,8,Jr)):U("",!0),x[19]||(x[19]=l("div",{class:"cover-shade"},null,-1)),l("div",Xr,[l("div",Qr,[l("span",ec,[f(k(D(R)),1),R.id===K(J).state.familyId?(T(),M(W,{key:0},[f(" · 当前")],64)):U("",!0)]),K(J).admin?(T(),M("button",{key:0,class:"btn btn-sm cover-edit","data-edit-household":R.id}," 编辑 ",8,tc)):U("",!0)]),l("div",null,[l("h3",null,k(R.name),1),l("p",lc,k(ie(R)),1)])])]),l("div",sc,[o.value?(T(),M("div",nc,[x[20]||(x[20]=l("span",null,"拖动排序",-1)),l("button",{class:"btn btn-sm btn-outline-secondary",disabled:b.value[0]?.id===R.id||n.value,"aria-label":R.name+"前移",onClick:ce=>V(R.id,-1)}," ←",8,ic),l("button",{class:"btn btn-sm btn-outline-secondary",disabled:b.value.at(-1)?.id===R.id||n.value,"aria-label":R.name+"后移",onClick:ce=>V(R.id,1)}," → ",8,oc)])):U("",!0),l("p",ac,k(R.note||"成员、空间与设备,独立管理。"),1),l("div",rc,[l("span",null,[l("b",null,k(R.deviceCount||0),1),x[21]||(x[21]=f("设备",-1))]),l("span",null,[l("b",null,k(R.sites||0),1),x[22]||(x[22]=f("区域",-1))]),l("span",null,[l("b",null,k(R.members||0),1),x[23]||(x[23]=f("成员",-1))])]),l("dl",cc,[l("div",null,[l("dt",null,k(R.kind==="office"||R.kind==="factory"?"主要负责人":"一家之主"),1),l("dd",null,k(R.ownerName||"待指定"),1)]),l("div",null,[x[24]||(x[24]=l("dt",null,"备用负责人",-1)),l("dd",null,k(R.successorName||"待指定"),1)])]),l("div",uc,[l("button",{class:"btn btn-primary",onClick:ce=>ae(R)},[x[25]||(x[25]=f(" 进入空间 ",-1)),L(de,{name:"arrow"})],8,dc),R.canAssignOwner?(T(),M("button",{key:0,class:"btn btn-link","data-leadership":R.id}," 负责人安排 ",8,pc)):U("",!0)])])],40,Yr))),128))])]))),128)),b.value.length?U("",!0):(T(),M("div",fc," 登录后查看已授权的家庭与场所。 "))],4),[[Et,a.value==="cards"]]),Fe(l("div",hc,[l("div",mc,[L(de,{name:"network"}),l("div",null,[l("h3",null,k(K(J).brandName||"赵府")+" · 数字管家",1),l("p",null,k(b.value.length)+" 个已授权空间",1)])]),x[27]||(x[27]=l("p",{class:"description"}," 平台与场所的管理关系;进入场所查看内部设备及网络。 ",-1)),l("div",bc,[(T(!0),M(W,null,_e(b.value,I=>(T(),M("button",{key:I.id,class:"card platform-place-node",onClick:R=>ae(I,!0)},[l("span",vc,k(D(I)),1),l("h3",null,k(I.name),1),l("p",null,k(ie(I)),1),l("span",null,k(I.deviceCount||0)+" 台设备",1),l("small",null,k((I.networkAccesses||[]).map(K(Pl)).join(" · ")||"网络待登记"),1),x[26]||(x[26]=l("span",{class:"network-open"},"查看网络拓扑 →",-1))],8,gc))),128))])],512),[[Et,a.value==="topology"]]),Fe(l("div",yc,[l("span",_c,"第 "+k(i.value+1)+" / "+k(j.value)+" 页 · 每页最多 "+k($.value)+" 张",1),l("button",{id:"home-prev",class:"btn btn-outline-secondary",disabled:!i.value,onClick:x[9]||(x[9]=I=>i.value--)}," 上一页",8,xc),l("button",{id:"home-next",class:"btn btn-outline-secondary",disabled:i.value>=j.value-1,onClick:x[10]||(x[10]=I=>i.value++)}," 下一页 ",8,wc)],512),[[Et,a.value==="cards"]])]))}},Cc={key:0,class:"network-status-block"},Sc={class:"network-status-title"},Tc=["disabled"],$c={key:0,class:"text-danger small",role:"status"},Mc={key:0,class:"small text-secondary"},jc={key:1,class:"small text-secondary"},Ac={key:2,class:"small text-secondary"},Ic={class:"management-links"},Pc=["href"],qc={key:0},Oc={class:"network-check-time"},ks={__name:"NetworkStatus",props:{device:{type:Object,required:!0},active:{type:Boolean,default:!0}},setup(e){const t=e,s=ke(null),n=ke(!1),i=ke("");let o=0,a;const r=Be(()=>[t.device.id,t.device.source,t.device.managementHost,t.device.tailscaleHost,t.device.networkCidr,J.value.state.familyId,J.value.session,J.value.admin,t.active].join("|"));async function c(){const b=o;if(!(n.value||!J.value.admin||!t.active)){n.value=!0,i.value="";try{const $=await Te().api("/api/devices/network?source="+encodeURIComponent(t.device.source)+"&id="+encodeURIComponent(t.device.id));b===o&&(s.value=$)}catch($){b===o&&!$.stale&&(i.value=$.message)}finally{b===o&&(n.value=!1,a=setTimeout(c,35e3))}}}_t(r,()=>{o++,clearTimeout(a),n.value=!1,s.value=null,i.value="",J.value.admin&&t.active&&c()},{immediate:!0}),vs(()=>{o++,clearTimeout(a)});const h=Be(()=>s.value?s.value.targets.some(b=>b.reachable)?"网络可达":"未连通":"等待检查");function p(){clearTimeout(a),c()}return(b,$)=>K(J).admin?(T(),M("div",Cc,[l("div",Sc,[l("span",null,[l("i",{class:tt(["status-dot",{online:s.value?.targets.some(j=>j.reachable)}])},null,2),f(k(n.value?"正在检查…":h.value),1)]),l("button",{class:"btn btn-sm btn-link",disabled:n.value,onClick:p},"检查网络",8,Tc)]),i.value?(T(),M("p",$c,k(i.value),1)):U("",!0),s.value?(T(),M(W,{key:1},[(T(!0),M(W,null,_e(s.value.targets,j=>(T(),M("div",{key:j.kind,class:"network-target"},[l("span",null,k(j.kind==="tailscale"?"Tailscale":"设备地址"),1),l("code",null,k(j.host),1),l("span",{class:tt(j.reachable?"text-success":"text-secondary")},k(j.reachable?"服务可达":"未响应"),3)]))),128)),s.value.targets.length?U("",!0):(T(),M("p",Mc,"请编辑设备档案,填写 IP 或域名。")),s.value.tailscale?.available?(T(),M("p",jc,[f("Tailscale 节点"+k(s.value.tailscale.online?"在线":"离线"),1),s.value.tailscale.subnet?(T(),M(W,{key:0},[f(" · "+k(s.value.tailscale.subnetAvailable?"已发布":"未检测到")+" "+k(s.value.tailscale.subnet)+" 路由",1)],64)):U("",!0)])):s.value.tailscale?(T(),M("p",Ac,k(s.value.tailscale.note),1)):U("",!0),l("div",Ic,[(T(!0),M(W,null,_e(s.value.links,j=>(T(),M("a",{key:j.kind,href:j.url,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline-secondary"},[f("打开管理后台 · "+k(j.kind==="tailscale"?"Tailscale":"局域网")+" ↗",1),j.verified?U("",!0):(T(),M("span",qc,"(待连通)"))],8,Pc))),128))]),l("small",Oc,"检查于 "+k(new Date(s.value.checkedAt*1e3).toLocaleTimeString("zh-CN"))+" · 从服务器探测,打开后台需当前浏览器也能到达。",1)],64)):U("",!0)])):U("",!0)}},Ec={id:"asset-list"},Rc={class:"group-title"},Dc={class:"count-pill"},Hc={class:"device-card-grid"},Nc={class:"card-body"},Fc={class:"device-card-heading"},Lc={class:"device-symbol"},Vc={class:"flex-grow-1"},Kc={class:"small text-secondary"},Uc=["onClick"],Bc={class:"device-location"},Wc={class:"compact-details"},zc={class:"font-monospace"},Zc={key:0},Yc={key:0,class:"device-tags"},Gc={class:"card-footer device-card-actions"},Jc=["onClick"],Xc=["onClick"],Qc=["onClick"],eu={key:0,class:"empty"},tu={__name:"DeviceCollection",setup(e){const t=i=>(J.value.state.cameras||[]).filter(o=>i.source==="camera"?o.assetId===i.id:o.recorderId===i.id||o.archiveRecorderId===i.id),s=i=>({["data-"+(i.source==="camera"?"edit-asset":i.source==="recorder"?"edit-recorder":"edit-device")]:i.id}),n=i=>/路由|网关|服务器/.test(i.deviceType)||/gl\.inet/i.test(i.brand||"");return(i,o)=>(T(),M("div",Ec,[(T(!0),M(W,null,_e(K(We).groups,a=>(T(),M("section",{key:a.key,class:"device-group"},[l("h3",Rc,[f(k(a.labels.join(" / ")||"全部设备")+" ",1),l("span",Dc,k(a.items.length),1)]),l("div",Hc,[(T(!0),M(W,null,_e(a.items,r=>(T(),M("article",{key:r.source+r.id,class:"card device-card"},[l("div",Nc,[l("div",Fc,[l("div",Lc,[L(de,{name:r.source==="camera"?"camera":n(r)?"router":"devices"},null,8,["name"])]),l("div",Vc,[l("span",Kc,k(r.deviceType),1),l("h3",null,[l("button",{class:"device-title",onClick:c=>K(Te)().enterDevice(r.source,r.id)},k(r.name),9,Uc)])]),K(J).admin?(T(),M("button",gi({key:0,class:"btn btn-sm btn-outline-secondary"},{ref_for:!0},s(r))," 编辑 ",16)):U("",!0)]),l("p",Bc,[f(k(K(Te)().location?.(r.siteId)||"区域待填写"),1),r.point?(T(),M(W,{key:0},[f(" · "+k(r.point),1)],64)):U("",!0)]),l("dl",Wc,[l("div",null,[o[0]||(o[0]=l("dt",null,"品牌型号",-1)),l("dd",null,k([r.brand,r.model].filter(Boolean).join(" / ")||"未填写"),1)]),l("div",null,[o[1]||(o[1]=l("dt",null,"设备地址",-1)),l("dd",zc,k(r.networkHosts.join(" / ")||"未填写"),1)]),l("div",null,[o[2]||(o[2]=l("dt",null,"网络",-1)),l("dd",null,k(K(Pl)(r.networkAccess)),1)]),l("div",null,[o[3]||(o[3]=l("dt",null,"所有人 / 负责人",-1)),l("dd",null,k(r.ownerName||"待指定")+" / "+k(r.managerName||"待指定"),1)]),r.source!=="device"?(T(),M("div",Zc,[o[4]||(o[4]=l("dt",null,"镜头通道",-1)),l("dd",null,k(t(r).length)+" 个已配置",1)])):U("",!0)]),r.tags?.length?(T(),M("div",Yc,[(T(!0),M(W,null,_e(r.tags,c=>(T(),M("span",{key:c},k(c),1))),128))])):U("",!0),n(r)?(T(),xs(ks,{key:1,device:r,active:K(J).page==="objects"&&K(We).mode==="cards"},null,8,["device","active"])):U("",!0)]),l("div",Gc,[l("button",{class:"btn btn-sm btn-outline-secondary",onClick:c=>K(Te)().enterDevice(r.source,r.id,"device")}," 设备详情",8,Jc),r.source!=="device"?(T(),M(W,{key:0},[K(J).admin?(T(),M("button",{key:0,class:"btn btn-sm btn-outline-secondary",onClick:c=>K(Te)().enterDevice(r.source,r.id,"cameras")}," 配置镜头",8,Xc)):U("",!0),t(r).length?(T(),M("button",{key:1,class:"btn btn-sm btn-primary",onClick:c=>K(Te)().enterDevice(r.source,r.id,"live")}," 实时画面 ",8,Qc)):U("",!0)],64)):U("",!0)])]))),128))])]))),128)),K(We).devices.length?U("",!0):(T(),M("div",eu,[L(de,{name:"devices"}),o[5]||(o[5]=l("h3",null,"当前范围没有设备",-1)),o[6]||(o[6]=l("p",null,"调整筛选条件,或添加摄像机、路由器、灯等设备。",-1))]))]))}},lu={key:0,class:"network-diagram"},su={class:"diagram-toolbar"},nu={class:"small text-secondary"},iu={class:"diagram-scroll",tabindex:"0",role:"region","aria-label":"设备连接图,可滚动查看;点击设备打开档案"},ou=["width","height","viewBox"],au=["d"],ru=["transform","aria-label","onClick","onKeydown"],cu=["fill"],uu={x:"28",y:"26",class:"diagram-node-type"},du={x:"28",y:"48",class:"diagram-node-title"},pu={x:"28",y:"70",class:"diagram-node-ip"},fu={__name:"NetworkDiagram",setup(e){const t=ke(1),s=Be(()=>pr(We.value.rows));_t(()=>J.value.session+":"+J.value.state.familyId,()=>{t.value=1});const n=i=>Te().enterDevice(i.device.source,i.device.id,"device");return(i,o)=>s.value.nodes.length?(T(),M("div",lu,[l("div",su,[l("div",null,[o[1]||(o[1]=l("span",{class:"diagram-dot"},null,-1)),o[2]||(o[2]=l("strong",null,"设备连接图",-1)),l("span",nu,k(s.value.nodes.length)+" 台设备 · "+k(s.value.edges.length)+" 条已登记连接",1)]),l("label",null,[o[4]||(o[4]=f("缩放",-1)),Fe(l("select",{"onUpdate:modelValue":o[0]||(o[0]=a=>t.value=a),class:"form-select form-select-sm","aria-label":"网络图缩放"},[...o[3]||(o[3]=[l("option",{value:.75},"75%",-1),l("option",{value:1},"100%",-1),l("option",{value:1.25},"125%",-1)])],512),[[ts,t.value,void 0,{number:!0}]])])]),l("div",iu,[(T(),M("svg",{width:s.value.width*t.value,height:s.value.height*t.value,viewBox:`0 0 ${s.value.width} ${s.value.height}`,class:"network-svg",role:"group","aria-label":"已登记的网络连接"},[(T(!0),M(W,null,_e(s.value.edges,a=>(T(),M("path",{key:a.id,d:a.path,class:"network-edge",fill:"none"},null,8,au))),128)),(T(!0),M(W,null,_e(s.value.nodes,a=>(T(),M("g",{key:a.device.id,transform:`translate(${a.x},${a.y})`,class:"diagram-node",role:"button",tabindex:"0","aria-label":a.device.name+",打开设备档案",onClick:r=>n(a),onKeydown:[rn(ls(r=>n(a),["prevent"]),["enter"]),rn(ls(r=>n(a),["prevent"]),["space"])]},[l("title",null,k(a.device.name)+" · "+k(a.device.deviceType)+" · "+k((a.device.networkHosts||[]).join(" / ")||"IP 待填写"),1),o[5]||(o[5]=l("rect",{width:"244",height:"88",rx:"12",class:"diagram-node-bg"},null,-1)),l("rect",{x:"12",y:"16",width:"4",height:"54",rx:"2",fill:a.device.source==="camera"?"#5c83cb":"#258b76"},null,8,cu),l("text",uu,k(a.device.deviceType)+" · "+k(K(Pl)(a.device.networkAccess)),1),l("text",du,k(a.device.name.length>14?a.device.name.slice(0,14)+"…":a.device.name),1),l("text",pu,k((a.device.networkHosts||[])[0]||"IP 待填写"),1)],40,ru))),128))],8,ou))]),o[6]||(o[6]=l("p",{class:"diagram-note"},"点击节点查看名称、位置与网络详情。未登记上级的设备独立显示。",-1))])):U("",!0)}},hu={id:"device-topology",hidden:""},mu={class:"panel network-map"},bu={class:"network-platform"},gu={class:"topology-nodes"},vu={class:"card-body"},yu={class:"device-card-heading"},_u={class:"flex-grow-1"},xu={class:"small text-secondary"},wu=["onClick"],ku=["onClick"],Cu={class:"device-location"},Su={class:"network-facts"},Tu={key:0},$u={key:1},Mu={key:2},ju={key:3},Au={key:0,class:"empty"},Iu={__name:"NetworkMap",setup(e){const t=Be(()=>(J.value.state.households||[]).find(s=>s.id===J.value.state.familyId));return(s,n)=>(T(),M("div",hu,[l("section",mu,[l("div",bu,[L(de,{name:"network"}),l("div",null,[l("h3",null,k(t.value?.name||"当前场所"),1),l("p",null,k(K(We).devices.length)+" 台设备 · 随设备档案自动更新",1)])]),n[7]||(n[7]=l("p",{class:"description"}," 连线来自已确认的上级设备关系。上级未填写时单独列出;不代表已自动发现所有交换机或布线。 ",-1)),L(fu),n[8]||(n[8]=l("h3",{class:"network-details-heading"},"设备与连接详情",-1)),l("div",gu,[(T(!0),M(W,null,_e(K(We).rows,i=>(T(),M("article",{key:i.device.id,class:tt(["network-node card",{nested:i.depth>0}]),style:jt({"--depth":Math.min(i.depth,5)})},[l("div",vu,[l("div",yu,[L(de,{name:i.device.source==="camera"?"camera":"router"},null,8,["name"]),l("div",_u,[l("span",xu,k(i.device.deviceType)+" · "+k(K(Pl)(i.device.networkAccess)),1),l("h3",null,[l("button",{class:"device-title",onClick:o=>K(Te)().enterDevice(i.device.source,i.device.id)},k(i.device.name),9,wu)])]),l("button",{class:"btn btn-sm btn-outline-secondary",onClick:o=>K(Te)().enterDevice(i.device.source,i.device.id,"device")}," 详情 → ",8,ku)]),l("p",Cu,[f(k(K(Te)().location?.(i.device.siteId)||"未指定区域")+" ",1),i.device.point?(T(),M(W,{key:0},[f(" · "+k(i.device.point),1)],64)):U("",!0)]),l("div",Su,[l("span",null,[n[0]||(n[0]=f("IP ",-1)),l("b",null,k(i.device.networkHosts.join(" / ")||"待填写"),1)]),i.device.tailscaleHost?(T(),M("span",Tu,[n[1]||(n[1]=f("Tailscale ",-1)),l("b",null,k(i.device.tailscaleHost),1)])):U("",!0),i.device.networkCidr?(T(),M("span",$u,[n[2]||(n[2]=f("网段 ",-1)),l("b",null,k(i.device.networkCidr),1)])):U("",!0),l("span",null,[n[3]||(n[3]=f("上级 ",-1)),l("b",null,k(i.parentName||"待确认 / 直接接入"),1)]),l("span",null,[n[4]||(n[4]=f("连接 ",-1)),l("b",null,k({wired:"网线",wifi:"Wi-Fi"}[i.device.connectionType]||"待确认"),1)]),i.via.length?(T(),M("span",Mu,[n[5]||(n[5]=f("取流经录像机 ",-1)),l("b",null,k(i.via.join("、")),1)])):U("",!0),i.archiveVia.length?(T(),M("span",ju,[n[6]||(n[6]=f("录像归档 ",-1)),l("b",null,k(i.archiveVia.join("、")),1)])):U("",!0)]),/路由|网关|服务器/.test(i.device.deviceType)?(T(),xs(ks,{key:0,device:i.device,active:K(J).page==="objects"&&K(We).mode==="topology"},null,8,["device","active"])):U("",!0)])],6))),128)),K(We).rows.length?U("",!0):(T(),M("p",Au," 当前范围尚未登记设备。 "))])])]))}},Pu={key:0,class:"panel"},qu={__name:"DeviceNetworkPanel",setup(e){return(t,s)=>K(J).admin&&K(J).device&&K(J).page==="device"?(T(),M("section",Pu,[s[0]||(s[0]=l("h3",null,"网络状态与管理入口",-1)),L(ks,{device:K(J).device},null,8,["device"]),s[1]||(s[1]=l("p",{class:"description mb-0"},"只检查已登记的设备地址。常用端口未响应不一定表示断电;Tailscale 节点在线也不代表下级网段可达。",-1))])):U("",!0)}},Ou={id:"page-device",class:"page",hidden:""},Eu={id:"page-objects",class:"page",hidden:""},Ru={__name:"Workspace",setup(e){return(t,s)=>(T(),M(W,null,[s[4]||(s[4]=l("div",{id:"household-context",class:"household-context",hidden:""},[l("label",null,[f("当前归属 "),l("select",{id:"household-filter","aria-label":"当前归属"})]),l("span",{id:"household-context-note"}),l("button",{id:"scope-back",class:"quiet"},"返回场所")],-1)),s[5]||(s[5]=l("div",{id:"device-context",class:"device-context",hidden:""},[l("p",{id:"device-breadcrumb"}),l("div",{role:"group","aria-label":"设备功能"},[l("button",{class:"quiet","data-device-tab":"device"},"设备档案"),l("button",{class:"quiet","data-device-tab":"live"},"实时画面"),l("button",{class:"quiet","data-device-tab":"playback"},"录像回放"),l("button",{class:"quiet","data-device-tab":"cameras"},"镜头与设置")])],-1)),s[6]||(s[6]=Se('<div id="banner" class="banner" hidden></div><section class="metrics"><div><span>设备</span><strong id="metric-all">—</strong></div><div><span>已接通码流</span><strong id="metric-ready">—</strong></div><div><span>录像占用</span><strong id="metric-used">—</strong></div><div><span>空间档案</span><strong id="metric-sites">—</strong></div></section><div class="filter-row"><label>空间范围 <select id="site-filter"><option value="">全部空间</option></select></label><span id="filter-caption">可选择任意区域,包含其下级区域</span><button id="refresh" class="quiet">↻ 刷新状态</button></div>',3)),s[7]||(s[7]=l("section",{id:"page-settings",class:"page",hidden:""},[l("div",{class:"section-head"},[l("h2",null,"把这里布置成你习惯的样子"),l("button",{id:"settings-reload",class:"quiet"},"重新读取设置")]),l("p",{id:"settings-error",role:"status"}),l("div",{class:"settings-sections",role:"group","aria-label":"设置分类"},[l("button",{class:"quiet","data-settings-section":"preferences","aria-pressed":"true"},"我的偏好"),l("button",{class:"quiet","data-settings-section":"baidu","data-platform-setting":"",hidden:""},"网盘连接"),l("button",{class:"quiet","data-settings-section":"brand","data-platform-setting":"",hidden:""},"品牌与外观"),l("button",{class:"quiet","data-settings-section":"backup","data-platform-setting":"",hidden:""},"数据库备份")]),l("form",{id:"preferences-form",class:"panel"},[l("h3",null,"我的偏好"),l("p",{class:"description"},"只影响当前账号,保存后换电脑或手机登录也会沿用。切换选项可以预览,离开未保存的预览会撤销。"),l("div",{id:"personal-choices",class:"form-grid"}),l("p",{id:"preferences-status",role:"status"}),l("div",{class:"device-actions"},[l("button",{type:"submit"},"保存我的偏好"),l("button",{type:"button",id:"personal-follow",class:"quiet"},"全部跟随平台"),l("button",{type:"button",id:"personal-cancel",class:"quiet"},"撤销预览")])]),l("section",{id:"baidu-admin",class:"panel",hidden:""},[l("div",{class:"section-head"},[l("h3",null,"百度网盘 · 统一存储"),l("span",{class:"badge"},"仅超级管理员配置")]),l("p",{class:"description"},"连接一个网盘账号,统一保存封面、Logo、图标及各用户上传的照片、视频和语音。系统按用户、家庭和记事可见范围授权;网盘账号持有人本身可以管理网盘中的文件。服务器仅转发分片,不保存媒体原文件。"),l("details",{id:"baidu-storage-guide"},[l("summary",null,"文件存在哪里?"),l("ul",null,[l("li",null,"家庭与场所:按家庭或场所保存封面。"),l("li",null,"平台外观:保存 Logo 和图标。"),l("li",null,"个人记事:按家庭、用户分组,再分照片、视频、语音。"),l("li",null,"数据库备份:单独存放;新备份上传并校验成功后,清理超过一个自然月的旧云备份。")]),l("p",{class:"description"},"文字、权限和文件引用保存在本机数据库;个人媒体原文件保存在百度网盘。封面和品牌图片仅做有限的内存缓存。更换封面、移除附件或删除记事不会删除网盘原文件。")]),l("form",{id:"baidu-config"},[l("div",{class:"form-grid"},[l("label",null,[f("AppKey"),l("input",{name:"appKey",autocomplete:"off",maxlength:"150",required:""})]),l("label",null,[f("SecretKey"),l("input",{name:"secretKey",type:"password",autocomplete:"new-password",maxlength:"150"})]),l("label",null,[f("百度后台应用名称"),l("input",{name:"appFolder",value:"智家",required:"",maxlength:"40"})]),l("label",null,[f("OAuth 回调地址"),l("input",{name:"redirectUri",type:"url",placeholder:"https://你的域名/api/baidu/callback",required:"",maxlength:"400"})])]),l("p",{class:"description"},"回调地址须与百度后台完全一致。SecretKey 留空保持已保存值,SignKey 不需要填写。当前开发者应用仅限个人场景,适用范围以百度后台为准。"),l("p",{id:"baidu-config-status",role:"status"}),l("button",{type:"submit"},"保存网盘应用配置")]),l("hr"),l("p",{id:"baidu-status",role:"status"}),l("div",{class:"device-actions"},[l("button",{id:"baidu-connect"},"连接/重新授权百度网盘"),l("button",{id:"baidu-disconnect",class:"quiet"},"解除本机连接")]),l("p",{class:"description"},"解除连接不会删除云端文件。临时媒体地址由后台按需获取,令牌不发送给浏览器。网盘授权凭据单独保存在服务器受限目录,不包含在数据库备份或公开源码中。")]),l("div",{id:"settings-private",hidden:""},[l("form",{id:"brand-form",class:"panel"},[l("h3",null,"发布与品牌配置"),l("p",{class:"description"},"仅超级管理员可修改。名称、Logo、浏览器图标及登录文案会公开显示;适用于整套系统。已有个人偏好优先于平台默认。"),l("div",{class:"form-grid"},[l("label",null,[f("系统名称"),l("input",{name:"name",required:"",maxlength:"40"})]),l("label",null,[f("系统副标题"),l("input",{name:"subtitle",required:"",maxlength:"60"})]),l("label",{class:"full"},[f("页首题词"),l("input",{name:"motto",maxlength:"100"})]),l("label",null,[f("登录标题"),l("input",{name:"loginTitle",required:"",maxlength:"40"})]),l("label",null,[f("登录说明"),l("input",{name:"loginNote",maxlength:"160"})]),l("label",{class:"full"},[f("页脚说明"),l("input",{name:"footer",maxlength:"120"})])]),l("div",{class:"brand-image-grid"},[l("div",null,[l("img",{id:"brand-logo-preview",alt:"Logo 预览",src:"/zhao-icon.png"}),l("label",null,[f("更换系统 Logo"),l("input",{id:"brand-logo-file",type:"file",accept:"image/png,image/jpeg,image/webp"})]),l("button",{type:"button",id:"brand-logo-reset",class:"quiet"},"使用默认 Logo")]),l("div",null,[l("img",{id:"brand-icon-preview",alt:"浏览器图标预览",src:"/zhao-icon.png"}),l("label",null,[f("更换浏览器图标"),l("input",{id:"brand-icon-file",type:"file",accept:"image/png,image/jpeg,image/webp"})]),l("button",{type:"button",id:"brand-icon-reset",class:"quiet"},"使用默认图标")])]),l("p",{class:"description"},"支持 PNG、JPEG、WebP,原图最多 5 MB;上传时自动缩小,图片随系统数据库保存。"),l("h3",null,"新账号与跟随平台账号的默认外观"),l("div",{id:"brand-defaults",class:"form-grid"}),l("p",{id:"brand-status",role:"status"}),l("div",{class:"device-actions"},[l("button",{type:"submit"},"保存发布配置"),l("button",{type:"button",id:"brand-export",class:"quiet"},"导出发布配置"),l("label",{class:"config-import"},[f("导入配置到表单"),l("input",{id:"brand-import",type:"file",accept:"application/json,.json"})])]),l("p",{class:"description"},"导入后先核对再保存。导出的配置只含品牌与默认外观,不含账号、设备凭据、家庭资料和网络备份目录。")]),l("section",{id:"backup-panel",class:"panel"},[l("h3",null,"数据库备份"),l("p",{class:"description"},"整台服务的数据库包含所有家庭、账号、设备连接配置和网盘文件引用,因此仅超级管理员可操作。网盘中的照片、视频、语音及录像文件不包含在新数据库副本中;旧版备份可能仍含历史内嵌图片。恢复后所有账号需要重新登录。"),l("form",{id:"backup-form"},[l("div",{class:"form-grid"},[l("label",{class:"check full"},[l("input",{name:"enabled",type:"checkbox"}),f("启用每日定时备份")]),l("label",{class:"check full"},[l("input",{name:"baidu",type:"checkbox"}),f("同时上传到已连接的百度网盘")]),l("label",null,[f("每日时间(北京时间)"),l("input",{name:"time",type:"time",required:"",value:"03:00"})]),l("label",null,[f("本机/挂载目录保留份数"),l("input",{name:"keep",type:"number",min:"1",max:"90",required:"",value:"14"})]),l("label",{class:"full"},[f("网络备份目录(可留空)"),l("input",{name:"networkPath",maxlength:"500",placeholder:"/var/lib/zhaovision/network-backup"})])]),l("p",{class:"description"},"填写本服务器已挂载的网络盘目录。使用百度接口备份只需勾选上方选项;此路径用于其他已挂载的网络存储,不能填网页地址或分享链接。写入网络目录成功不等于已确认百度云端同步完成。"),l("p",{class:"description"},"默认部署允许写入 /var/lib/zhaovision 下的目录。挂载和目录权限须由主机管理员配置;本页不会保存网盘登录密码。保留份数只清理本机和挂载目录中本系统生成的旧备份,百度网盘保留最近一个自然月;新备份上传并校验成功后才清理本应用的过期副本。"),l("p",{id:"backup-local-path",class:"description"}),l("p",{id:"backup-save-status",role:"status"}),l("button",{type:"submit"},"保存备份设置")]),l("div",{class:"section-head"},[l("h3",null,"备份记录"),l("button",{id:"backup-run"},"立即备份数据库")]),l("p",{id:"backup-result",role:"status"}),l("div",{id:"backup-history"})])])],-1)),s[8]||(s[8]=l("section",{id:"page-journal",class:"page",hidden:""},[l("div",{class:"scope-intro"},[l("span",{class:"eyebrow"},"岁月有迹 · 日常成章"),l("h2",null,"把生活,写成自己的来时路"),l("p",null,"与家人分享近况,也为自己留下一份阅历。")]),l("form",{id:"journal-form",class:"panel journal-compose"},[l("input",{type:"hidden",name:"id"}),l("input",{type:"hidden",name:"revision",value:"0"}),l("input",{type:"hidden",name:"clientId"}),l("label",null,[f("此刻想记下什么?"),l("textarea",{name:"text",rows:"4",maxlength:"5000",placeholder:"今天的心情、一段往事,或一个值得记住的时刻…"})]),l("div",{class:"form-grid"},[l("label",null,[f("记事日期"),l("input",{name:"occurredOn",type:"date",required:""})]),l("label",null,[f("阅历分类"),l("select",{name:"category"},[l("option",null,"日常"),l("option",null,"成长"),l("option",null,"家庭"),l("option",null,"旅行"),l("option",null,"工作"),l("option",null,"其他")])]),l("label",null,[f("谁可以看到"),l("select",{name:"visibility"},[l("option",{value:"private"},"仅自己可见"),l("option",{value:"household"},"当前家庭/场所成员")])])]),l("div",{class:"journal-add-media"},[l("label",{class:"quiet"},[f("+ 照片、视频或语音"),l("input",{id:"journal-files",disabled:"",type:"file",accept:"image/jpeg,image/png,image/webp,video/mp4,video/quicktime,video/webm,audio/mpeg,audio/mp4,audio/aac,audio/wav,audio/ogg,audio/webm,.m4a"})]),l("button",{id:"journal-record",disabled:"",type:"button",class:"quiet"},"● 直接录音"),l("button",{id:"journal-stop-record",type:"button",hidden:""},"结束录音并上传"),l("button",{id:"journal-cancel-upload",type:"button",class:"quiet",hidden:""},"暂停上传")]),l("p",{id:"journal-cloud-note",class:"description"}),l("p",{class:"description"},"每条最多 9 个附件,单个文件最多 256 MB;一次上传一个文件。录音须通过 HTTPS 并允许麦克风,最长 5 分钟。上传完成后默认选中。保存后清空本次输入;再次使用可展开“我的附件库”。"),l("div",{id:"journal-upload-list",class:"journal-upload-grid"}),l("details",{id:"journal-library",class:"journal-library"},[l("summary",null,[f("我的附件库("),l("span",{id:"journal-library-count"},"0"),f(")")]),l("p",{class:"description"},"已上传的附件可预览、删除或再次用于记事。"),l("div",{id:"journal-library-list",class:"journal-upload-grid"})]),l("details",{id:"journal-trash",class:"journal-trash",hidden:""},[l("summary",null,[f("已删除附件("),l("span",{id:"journal-trash-count"},"0"),f(")")]),l("p",{class:"description"},"删除仅整理附件库,已发布的记事与网盘原文件保留。恢复后可再次使用。"),l("div",{id:"journal-trash-list"})]),l("p",{id:"journal-status",role:"status","aria-live":"polite"}),l("div",{class:"device-actions"},[l("button",{id:"journal-save",type:"submit"},"保存记事"),l("button",{id:"journal-new",type:"button",class:"quiet"},"另写一条")])]),l("form",{id:"journal-filter",class:"panel journal-filters"},[l("label",null,[f("查看方式"),l("select",{id:"journal-mode"},[l("option",{value:"feed"},"家庭/场所动态"),l("option",{value:"mine"},"我的个人阅历"),l("option",{value:"person"},"某个人的阅历")])]),l("label",{id:"journal-person-label",hidden:""},[f("人物"),l("select",{id:"journal-person"})]),l("label",null,[f("分类"),l("select",{id:"journal-category"},[l("option",{value:""},"全部分类"),l("option",null,"日常"),l("option",null,"成长"),l("option",null,"家庭"),l("option",null,"旅行"),l("option",null,"工作"),l("option",null,"其他")])]),l("label",null,[f("关键词"),l("input",{id:"journal-search",type:"search",maxlength:"120",placeholder:"在文字中查找"})]),l("label",null,[f("开始日期"),l("input",{id:"journal-from",type:"date"})]),l("label",null,[f("结束日期"),l("input",{id:"journal-to",type:"date"})]),l("button",{type:"submit"},"查询阅历"),l("button",{id:"journal-filter-clear",type:"button",class:"quiet"},"清除筛选")]),l("p",{class:"description"},"个人阅历保留同一条记事的文字、附件和互动;查看他人时只展示其分享给当前家庭/场所的内容。删除记事或移出附件列表不会删除网盘原文件。"),l("div",{class:"section-head"},[l("p",{id:"journal-query-status",role:"status"}),l("div",null,[l("button",{id:"journal-prev",class:"quiet"},"上一页"),l("button",{id:"journal-next",class:"quiet"},"下一页")])]),l("div",{id:"journal-list",class:"journal-feed"})],-1)),s[9]||(s[9]=l("section",{id:"page-overview",class:"page",hidden:""},[l("div",{id:"scope-overview"})],-1)),l("section",Ou,[L(qu),s[0]||(s[0]=l("div",{id:"device-detail"},null,-1))]),s[10]||(s[10]=l("section",{id:"page-heritage",class:"page",hidden:""},[l("div",{id:"heritage-home"})],-1)),s[11]||(s[11]=l("section",{id:"page-live",class:"page"},[l("div",{class:"section-head"},[l("h2",{id:"live-heading"},"本场所监控墙"),l("div",null,[l("label",null,[f("清晰度 "),l("select",{id:"quality"},[l("option",{value:"hd"},"主码流"),l("option",{value:"compat"},"子码流")])])])]),l("details",{class:"live-help"},[l("summary",null,"画面与清晰度说明"),l("p",{id:"wall-context",class:"description"},"这里汇总当前场所内已授权的镜头;点击摄像头详情可进入单台设备。"),l("p",{class:"description",id:"quality-note"},"主码流画面更清晰,最高 1920×1080;子码流更流畅,最高 768×432,适合网络较慢时使用。")]),l("div",{class:"wall-toolbar"},[l("label",null,[f("分屏 "),l("select",{id:"wall-layout"},[l("option",{value:"auto"},"自适应"),l("option",{value:"1"},"1 画面"),l("option",{value:"2"},"2 画面"),l("option",{value:"4"},"4 画面"),l("option",{value:"6"},"6 画面"),l("option",{value:"9"},"9 画面"),l("option",{value:"16"},"16 画面")])]),l("label",{class:"check"},[l("input",{id:"wall-arrange",type:"checkbox"}),f("调整顺序")]),l("div",{class:"wall-paging"},[l("button",{id:"wall-prev",class:"quiet","aria-label":"上一组画面"},"‹"),l("span",{id:"wall-page"}),l("button",{id:"wall-next",class:"quiet","aria-label":"下一组画面"},"›")]),l("span",{id:"wall-clock"}),l("button",{id:"wall-fullscreen"},"全屏监控")]),l("div",{id:"live-grid",class:"live-grid"}),l("section",{id:"ptz-panel",class:"ptz-panel",hidden:""},[l("div",null,[l("strong",{id:"ptz-title"},"云台"),l("p",{id:"ptz-status",role:"status"})]),l("div",{class:"ptz-pad"},[l("button",{"data-ptz-action":"up","aria-label":"云台向上"},"↑"),l("button",{"data-ptz-action":"left","aria-label":"云台向左"},"←"),l("button",{"data-ptz-action":"stop"},"停止"),l("button",{"data-ptz-action":"right","aria-label":"云台向右"},"→"),l("button",{"data-ptz-action":"down","aria-label":"云台向下"},"↓")]),l("div",{id:"ptz-presets"},[l("div",{class:"section-head"},[l("strong",null,[f("常用位置 "),l("small",{id:"preset-count"})]),l("button",{id:"preset-reload",class:"quiet"},"重新读取")]),l("p",{id:"preset-status",role:"status"}),l("div",{id:"preset-list"}),l("p",{class:"description"},"调整位置后可另存为新预置位。本版不覆盖已有位置,避免设备固件拒绝或误改。"),l("form",{id:"preset-form",hidden:""},[l("label",null,[f("当前位置名称"),l("input",{id:"preset-name",required:"",maxlength:"40",placeholder:"例如:大门、院子"})]),l("button",{type:"submit"},"保存当前位置")]),l("div",{id:"preset-confirmation",hidden:""},[l("p",{id:"preset-confirm-text"}),l("button",{id:"preset-confirm-yes"},"确认"),l("button",{id:"preset-confirm-cancel",class:"quiet"},"取消")])]),l("button",{id:"ptz-close",class:"quiet"},"收起云台")])],-1)),s[12]||(s[12]=l("section",{id:"page-playback",class:"page",hidden:""},[l("div",{class:"section-head"},[l("h2",null,[f("回到那一刻 "),l("small",null,"光阴")])]),l("div",{class:"panel playback-controls"},[l("label",null,[f("镜头 / 通道"),l("select",{id:"play-camera"})]),l("label",null,[f("录像来源"),l("select",{id:"archive-source"},[l("option",{value:"recorder"},"录像机原有录像(待接入)"),l("option",{value:"local"},"小电脑本机录像")])]),l("label",null,[f("日期"),l("input",{id:"play-date",type:"date"})]),l("button",{id:"query-recordings"},"查找录像"),l("span",{id:"play-info"},"选择日期,查看实际录像时段")]),l("aside",{id:"recording-health",class:"panel","aria-label":"本机录像状态",hidden:""},[l("div",{class:"section-head"},[l("strong",{id:"recording-health-text",role:"status"}),l("button",{id:"recording-configure",class:"quiet",hidden:""},"录像设置")]),l("p",{id:"recording-policy-note",class:"description"}),l("p",{id:"recording-start-note",class:"description"})]),l("div",{class:"video-panel"},[l("video",{id:"play-video",controls:"",playsinline:""}),l("div",{id:"play-empty",class:"video-empty"},"选择一个有录像的时间段")]),l("div",{class:"panel"},[l("div",{class:"timeline-head"},[l("strong",null,"当日时间轴"),l("span",null,[l("i",{class:"legend"}),f(" 有录像的时段 · 点击定位")])]),l("canvas",{id:"timeline",height:"76","aria-label":"录像时间轴"}),l("div",{class:"time-labels"},[l("span",null,"00:00"),l("span",null,"06:00"),l("span",null,"12:00"),l("span",null,"18:00"),l("span",null,"24:00")]),l("div",{class:"seek-row"},[l("label",null,[f("定位时间 "),l("input",{id:"seek-time",type:"time",step:"1",value:"12:00:00"})]),l("button",{id:"seek-button",class:"secondary"},"定位播放"),l("a",{id:"download",class:"button secondary",hidden:""},"下载原始片段")])]),l("div",{class:"panel"},[l("div",{class:"playback-tools"},[l("label",{class:"check"},[l("input",{id:"play-autonext",type:"checkbox",checked:""}),f("自动续播下一时段(跳过空档)")]),l("button",{id:"play-snapshot",class:"quiet"},"回放截图"),l("span",{id:"play-position",role:"status"})]),l("details",{class:"clip-editor"},[l("summary",null,"选取并下载指定片段"),l("form",{id:"clip-form"},[l("div",{class:"form-grid"},[l("label",null,[f("开始时间"),l("input",{id:"clip-start",type:"datetime-local",step:"1",required:""})]),l("label",null,[f("结束时间"),l("input",{id:"clip-end",type:"datetime-local",step:"1",required:""})])]),l("div",{class:"playback-tools"},[l("button",{type:"button",class:"quiet","data-clip-mark":"start"},"当前位置作起点"),l("button",{type:"button",class:"quiet","data-clip-mark":"end"},"当前位置作终点"),l("button",{type:"submit"},"生成下载链接"),l("a",{id:"clip-download",class:"button secondary",hidden:""},"下载所选片段")]),l("p",{id:"clip-status",role:"status",class:"description"}),l("p",{class:"description"},"每段最多一小时,不可跨越无录像时段。下载保留原始编码,剪辑边界可能受设备关键帧影响。")])])]),l("div",{id:"recording-list",class:"recording-list"})],-1)),s[13]||(s[13]=Se('<section id="page-cameras" class="page" hidden><div class="section-head"><h2>镜头通道 <small>通道</small></h2><button data-action="new-camera">+ 添加镜头通道</button></div><div class="panel discovery"><div><strong>发现局域网设备</strong><p>探测 RTSP 服务,添加后用设备账号连接。</p></div><input id="scan-network" placeholder="例如 192.168.1.0/24" aria-label="局域网网段"><button id="scan-button" class="secondary">开始探测</button></div><div id="scan-result"></div><div id="camera-list"></div></section>',1)),l("section",Eu,[s[1]||(s[1]=Se('<div class="section-head"><h2>一物一档 <small>设备 · 归属</small></h2><div class="device-actions"><button class="quiet" data-page="sites" data-admin>管理区域</button><button data-action="new-asset">+ 摄像机</button><button data-action="new-recorder">+ 录像机</button><button id="new-device" data-admin>+ 其他设备</button></div></div><p class="description">同一设备可同时记录类型、区域、所有人、负责人和标签。分组顺序可自由组合,例如“灯 → 卧室”或“负责人 → 类型 → 区域”。人员归属不自动授予访问权限。</p>',2)),s[2]||(s[2]=l("div",{class:"panel device-view-controls"},[l("div",{class:"device-search-row"},[l("label",null,[f("设备类型"),l("select",{id:"device-type"},[l("option",{value:""},"所有类型")])]),l("label",null,[f("搜索设备或人员"),l("input",{id:"device-search",type:"search",placeholder:"例如:卧室 灯;也可查 IP、品牌、型号、人员"})]),l("button",{id:"device-clear",type:"button",class:"quiet",hidden:""},"清除设备筛选")]),l("div",{class:"device-actions view-presets",role:"group","aria-label":"设备分组方式"},[l("button",{type:"button",class:"quiet","data-group-preset":"space,type"},"按区域查看"),l("button",{type:"button",class:"quiet","data-group-preset":"type,space"},"按类型查看"),l("button",{type:"button",class:"quiet","data-group-preset":"manager,type,space"},"按负责人查看")]),l("details",{class:"group-custom"},[l("summary",null,"自定义分组顺序"),l("p",{class:"description"},"依次分组(前面的维度优先,区域按你定义的完整层级展示)"),l("div",{id:"device-group-order",class:"device-group-order"}),l("div",{class:"device-actions"},[l("button",{id:"device-group-add",class:"quiet"},"+ 增加分组维度"),l("button",{"data-admin":"",id:"device-view-save",class:"secondary"},"保存为本归属的默认视图")])]),l("p",{id:"device-count",class:"description"})],-1)),s[3]||(s[3]=l("div",{class:"device-actions",role:"group","aria-label":"设备展示方式"},[l("button",{id:"devices-card-view",class:"quiet","aria-pressed":"true"},"设备卡片"),l("button",{id:"devices-topology-view",class:"quiet","aria-pressed":"false"},"网络拓扑")],-1)),L(tu),L(Iu)]),s[14]||(s[14]=Se('<section id="page-recorders" class="page" hidden><div class="section-head"><h2>录像机 <small>存影</small></h2><button data-action="new-recorder">+ 添加录像机</button></div><p class="description">统一保存录像机地址与账号,镜头通道关联录像机。实时取流使用 RTSP;读取录像机已有历史录像,需要该型号的回放接口适配。</p><div id="recorder-list" class="site-grid"></div></section><section id="page-sites" class="page" hidden><div class="section-head"><h2>区域与空间 <small>自定层级</small></h2><button data-action="new-site">+ 新建空间</button></div><p class="description">在当前家庭或场所下自行划分区域,不限定层级数量。例如“一楼 → 卧室”或“厂区 → 车间 → 产线”。名称和区域类别均由你定义,地址信息按需填写。</p><div id="site-list" class="site-grid"></div></section><section id="page-storage" class="page" hidden><div class="section-head"><h2>录像与存储 <small>留存</small></h2></div><div class="storage-grid"><form id="storage-form" class="panel"><h3>录像保留策略</h3><label>保留天数<input name="retentionDays" type="number" min="1" max="365" required></label><label>录像容量上限(GB)<input name="maxGB" type="number" min="5" max="100000" required></label><label>磁盘预留空间(GB)<input name="reserveGB" type="number" min="2" max="1000" required></label><p class="description">默认最长保留 30 天,超过设定天数的录像会自动删除。容量上限由全部摄像头共用;达到上限或预留空间不足时暂停录像,空间恢复后继续。实际可留时长取决于码率和路数,未必存满设定天数。容量每 20 秒检查一次,可能有少量超出。</p><button type="submit">保存策略</button><span class="form-error"></span></form><div class="panel"><h3>运行状态</h3><dl id="storage-status"></dl><p class="description">开启摄像头的“持续录像”后,服务会保存主码流。预览默认使用主码流高清画面(最高 1920×1080、15 帧/秒),也可切换子码流流畅画面(最高 768×432、10 帧/秒)。本机录像保留设备原始编码。</p><h3>最近操作</h3><div id="audit-list"></div></div></div></section>',3)),s[15]||(s[15]=l("section",{id:"page-heritage-records",class:"page",hidden:""},[l("div",{class:"section-head"},[l("h2",{id:"heritage-records-title"},"文化与家风"),l("div",null,[l("button",{class:"quiet","data-page":"heritage"},"返回家庭传承"),l("button",{id:"heritage-new"},"+ 新建档案")])]),l("div",{class:"panel heritage-controls"},[l("label",null,[f("查找档案"),l("input",{id:"heritage-search",type:"search",placeholder:"名称、内容、相关人员"})]),l("label",{class:"check"},[l("input",{id:"heritage-archived",type:"checkbox"}),f("包含归档资料")]),l("button",{id:"heritage-reload",class:"quiet"},"重新载入")]),l("p",{id:"heritage-error",class:"form-error",role:"status"}),l("div",{id:"heritage-list",class:"site-grid"}),l("aside",{id:"heritage-detail",class:"panel",hidden:""})],-1)),s[16]||(s[16]=l("section",{id:"page-family",class:"page",hidden:""},[l("div",{class:"section-head"},[l("h2",null,[f("家族的来处与延续 "),l("small",null,"世系 · 传承")]),l("div",null,[l("button",{id:"family-reload",class:"quiet"},"重新载入"),l("button",{id:"family-export",class:"quiet"},"导出家谱"),l("button",{id:"new-person"},"+ 录入人物")])]),l("p",{class:"description"},"从祖辈到后辈,一张图看全家。点击人物查看档案,暖金色卡片是当前账号关联的本人。"),l("div",{class:"panel family-toolbar"},[l("label",null,[f("关系参照人物"),l("select",{id:"family-reference"})]),l("label",null,[f("查找人物"),l("input",{id:"family-search",type:"search",placeholder:"姓名、别名或籍贯"})]),l("button",{id:"family-find",class:"quiet",hidden:""},"定位搜索结果"),l("label",{class:"check"},[l("input",{id:"family-archived",type:"checkbox"}),f("显示归档人物")]),l("span",{id:"family-count"})]),l("div",{id:"family-error",class:"form-error",role:"status"}),l("div",{id:"family-workspace",class:"family-workspace"},[l("section",{id:"family-canvas-panel",class:"family-canvas-panel","aria-label":"全家关系图"},[l("div",{class:"family-map-heading"},[l("div",null,[l("span",{class:"eyebrow"},"枝叶相连 · 世代相承"),l("h2",{id:"family-view-title"},"全家关系图")]),l("div",{class:"family-view-tabs",role:"group","aria-label":"家谱显示方式"},[l("button",{id:"family-view-tree",class:"quiet","aria-pressed":"true"},"关系图"),l("button",{id:"family-view-list",class:"quiet","aria-pressed":"false"},"人物名册"),l("button",{id:"family-view-timeline",class:"quiet","aria-pressed":"false"},"家族时间线")])]),l("div",{id:"family-map-controls",class:"family-map-controls"},[l("div",{class:"family-zoom-controls"},[l("button",{id:"family-zoom-out",class:"quiet","aria-label":"缩小家谱"},"−"),l("output",{id:"family-zoom-value","aria-live":"polite"},"100%"),l("button",{id:"family-zoom-in",class:"quiet","aria-label":"放大家谱"},"+"),l("button",{id:"family-fit",class:"quiet"},"查看全谱")]),l("button",{id:"family-locate-self",class:"quiet"},"◎ 定位本人"),l("button",{id:"family-fullscreen",class:"quiet"},"全屏家谱")]),l("div",{id:"family-tree",class:"family-map-viewport",tabindex:"0",role:"region","aria-label":"家谱关系图,可拖动空白处或使用滚动条浏览"}),l("div",{id:"family-people",class:"family-people family-register",hidden:""}),l("section",{id:"family-events",hidden:"","aria-label":"家族重大记事"},[l("div",{class:"family-event-intro"},[l("div",null,[l("h3",null,"把值得记住的事,留给后来的人"),l("p",{class:"description"},"按事情发生的日期排列,可关联多位亲人,并附上详细记载或报道链接。")]),l("button",{id:"family-new-event"},"+ 写一则记事")]),l("div",{class:"family-event-filters"},[l("label",null,[f("关联人物"),l("select",{id:"family-event-person"},[l("option",{value:""},"全家")])]),l("label",null,[f("年份"),l("select",{id:"family-event-year"},[l("option",{value:""},"所有年份")])]),l("label",null,[f("排列"),l("select",{id:"family-event-order"},[l("option",{value:"desc"},"从近到远"),l("option",{value:"asc"},"从远到近")])]),l("label",null,[f("搜索记事"),l("input",{id:"family-event-search",type:"search",placeholder:"标题、摘要或正文"})]),l("label",{class:"check"},[l("input",{id:"family-event-relatives",type:"checkbox"}),f("包括此人的父母、配偶和子女")]),l("label",{id:"family-event-state-label"},[f("状态"),l("select",{id:"family-event-state"},[l("option",{value:"published"},"已发布"),l("option",{value:"draft"},"草稿箱"),l("option",{value:"archived"},"已归档"),l("option",{value:"all"},"全部")])]),l("button",{id:"family-event-clear",class:"quiet"},"清除筛选")]),l("p",{id:"family-event-count",class:"description",role:"status"}),l("div",{id:"family-timeline",class:"family-timeline"})]),l("div",{id:"family-map-footer",class:"family-map-footer"},[l("div",{class:"family-map-legend"},[l("span",null,[l("i",{class:"legend-self"}),f("本人")]),l("span",null,[l("i",{class:"legend-selected"}),f("正在查看")]),l("span",null,[l("i",{class:"legend-parent"}),f("父母 → 子女")]),l("span",null,[l("i",{class:"legend-spouse"}),f("配偶")]),l("span",null,[l("i",{class:"legend-adoptive"}),f("收养 / 继亲")])]),l("p",{id:"family-map-note",class:"description",role:"status"}),l("span",{class:"description"},"拖动空白处移动 · 点击人物查看档案 · 关系称谓按参照人物计算")])]),l("aside",{id:"family-detail",class:"panel family-inspector","aria-label":"人物档案"})])],-1)),L(kc),s[17]||(s[17]=Se('<section id="page-users" class="page" hidden><div class="section-head"><h2>账号与人物关系 <small>ACCOUNTS</small></h2><button id="new-user">+ 新建账号</button></div><p class="description">这里只管理当前家庭或场所的账号。新账号默认没有摄像头或家谱访问权限;可按需授权。亲属称呼与管理权限分别设置,无需为每位家谱人物创建账号。</p><div id="user-list"></div></section><footer><span id="brand-footer">赵府 · 智能数字管家</span><span id="version">独立部署 / 数据自有</span></footer>',2))],64))}},Du={};function Hu(e,t){return T(),M(W,null,[t[0]||(t[0]=Se('<dialog id="auth-dialog"><form id="auth-form"><span class="eyebrow">灯火可亲 · 归家有时</span><h2 id="auth-title">欢迎回来</h2><p id="auth-note">使用自己的账号,进入家庭空间。</p><label id="setup-code-label" hidden>初始化码<input name="code" autocomplete="off"></label><label>用户名<input name="username" value="admin" maxlength="32" required autocomplete="username"></label><label>密码<input name="password" type="password" minlength="8" maxlength="128" required autocomplete="current-password"></label><p class="form-error"></p><button type="submit" class="wide">进入系统</button></form></dialog><dialog id="device-dialog"><form id="device-form"><div class="dialog-heading"><h2>设备档案</h2><button type="button" class="quiet" data-close="device-dialog">关闭</button></div><input name="id" type="hidden"><div class="form-grid"><label>设备名称 *<input name="name" required maxlength="120" placeholder="例如:卧室台灯、爸爸的手机"></label><label>设备类型 *<input name="deviceType" list="device-types" required maxlength="120" placeholder="可选择或自定义"></label><datalist id="device-types"><option value="灯"></option><option value="手机"></option><option value="冰箱"></option><option value="空调"></option><option value="传感器"></option><option value="电脑"></option><option value="路由器"></option><option value="交换机"></option><option value="无线接入点"></option><option value="其他"></option></datalist><label class="full">所在区域<select name="siteId"></select></label><label>品牌<input name="brand" maxlength="120"></label><label>型号<input name="model" maxlength="120"></label><label>序列号<input name="serial" maxlength="120"></label><label>所有人<select name="ownerRef" aria-label="所有人"></select><input name="ownerName" aria-label="手动填写所有人" maxlength="80" placeholder="姓名或单位" hidden></label><label>负责人<select name="managerRef" aria-label="负责人"></select><input name="managerName" aria-label="手动填写负责人" maxlength="80" placeholder="管理或维护人员" hidden></label><fieldset class="full device-network"><legend>网络与连接</legend><div class="form-grid"><label>设备 IP/域名<input name="managementHost" maxlength="253" placeholder="例如 192.168.8.160"></label><label>服务端接入方式<select name="networkAccess"><option value="unknown">待确认</option><option value="lan">局域网直连</option><option value="tailscale">Tailscale 跨网</option><option value="public">公网接入</option></select></label><label>Tailscale 地址(可选)<input name="tailscaleHost" maxlength="253" placeholder="100.x.x.x 或设备域名"></label><label>网关提供的网段(可选)<input name="networkCidr" maxlength="64" placeholder="例如 192.168.8.0/24"></label><label>上级设备<select name="uplinkId"></select></label><label>连接方式<select name="connectionType"><option value="unknown">待确认</option><option value="wired">网线连接</option><option value="wifi">Wi-Fi 连接</option></select></label></div><p class="description">保存后自动更新拓扑。网络信息用于设备档案;摄像机实际取流地址在“配置镜头”内设置。选择人员不改变账号访问权限。</p></fieldset><label class="full">自定义标签<input name="tags" maxlength="500" placeholder="用顿号或逗号分隔,例如:照明、常用、公共"></label><label class="full">备注<textarea name="note" maxlength="300" rows="3"></textarea></label></div><p class="description">手机、灯、冰箱等当前支持设备档案、分类和责任归属。自动控制需另行接入对应协议,登记不代表已连接设备。</p><p class="form-error"></p><div class="dialog-footer"><button type="submit">保存设备</button></div></form></dialog><dialog id="heritage-dialog"><form id="heritage-form"><div class="dialog-heading"><h2 id="heritage-form-title">传承资料</h2><button type="button" class="quiet" data-close="heritage-dialog">关闭</button></div><input type="hidden" name="id"><input type="hidden" name="revision" value="0"><input type="hidden" name="kind"><div class="form-grid"><label class="full">档案名称 *<input name="name" required maxlength="120"></label><label>相关日期<input name="date" type="date"></label><label>讲述人 / 整理人<input name="contributor" maxlength="80"></label><label class="full">相关内容与来历<textarea name="content" rows="6" maxlength="8000"></textarea></label><label class="full">资料 / 报道链接<input name="sourceUrl" type="url" maxlength="1500" placeholder="https://"></label><label class="full">关联已有设备<select name="deviceReference"><option value="">不关联设备</option></select></label><label data-heritage-asset>所有人 / 共有说明<input name="ownerName" maxlength="80"></label><label data-heritage-asset>保管人<input name="custodianName" maxlength="80"></label><label data-heritage-asset>意向接收人<input name="successorName" maxlength="80"></label><label class="full" data-heritage-asset>交接意愿与说明<textarea name="handoverNote" rows="3" maxlength="2000"></textarea></label><label class="check full"><input type="checkbox" name="archived">归档(保留资料,可恢复)</label></div><p class="description">这里只保存资料和意愿;不会据此转移财产或授予任何账号权限。链接内容保存在原位置,本系统保存链接和文字记录。</p><p class="form-error"></p><div class="dialog-footer"><button type="submit">保存档案</button></div></form></dialog><dialog id="site-dialog"><form id="site-form"><div class="dialog-heading"><h2>空间档案</h2><button type="button" class="quiet" data-close="site-dialog">关闭</button></div><input name="id" type="hidden"><div class="form-grid"><label>空间名称 *<input name="name" required maxlength="100" placeholder="例如:一楼、主卧、三号车间"></label><label>上级区域<select name="parentId"></select></label><label>区域类别<input name="category" maxlength="40" placeholder="自定,例如:楼层、卧室、车间、产线"></label><label>用途<select name="kind"><option value="home">家庭</option><option value="company">办公场所</option><option value="factory">工厂</option><option value="other">其他</option></select></label><label>所属家庭 / 单位<input name="owner" maxlength="100"></label><fieldset class="full geo-picker" data-geography="" data-geo-title="空间所在地"></fieldset><label>街道 / 乡镇<input name="street" maxlength="100"></label><label>小区 / 园区 / 村<input name="community" maxlength="100"></label><label>楼栋<input name="building" maxlength="100" placeholder="例如:3 号楼"></label><label>单元<input name="unit" maxlength="100"></label><label>楼层<input name="floor" maxlength="100"></label><label>门牌号<input name="door" maxlength="100" placeholder="例如:502"></label><label class="full">详细地址<input name="address" maxlength="240"></label><label class="full">备注<input name="note" maxlength="240"></label></div><p class="form-error"></p><div class="dialog-footer"><button type="submit">保存空间</button></div></form></dialog><dialog id="camera-dialog"><form id="camera-form"><div class="dialog-heading"><h2>镜头通道配置</h2><button type="button" class="quiet" data-close="camera-dialog">关闭</button></div><input name="id" type="hidden"><div class="form-grid"><label class="full">所属摄像头对象 *<select name="assetId" required></select></label><label>接入方式<select name="sourceKind"><option value="recorder">通过录像机</option><option value="direct">直接连接摄像头</option></select></label><label>关联录像机<select name="recorderId"><option value="">请选择</option></select></label><label>录像机通道编号<input name="channelNumber" maxlength="30" placeholder="按录像机实际通道填写"></label><label>录像存储设备<select name="archiveRecorderId"><option value="">尚未绑定</option></select></label><label>历史录像主要保存于<select name="archiveSource"><option value="recorder">录像机</option><option value="local">本机</option></select></label><label>镜头 / 通道名称 *<input name="name" required maxlength="120" placeholder="例如:大门口"></label><label>所属空间 *<select name="siteId" required></select></label><label>安装位置<input name="point" maxlength="120" placeholder="例如:院门外侧"></label><label>品牌 / 型号<input name="model" maxlength="120"></label><label>设备 IP *<input name="host" required placeholder="局域网 IPv4 地址"></label><label>RTSP 端口<input name="port" type="number" value="554" min="1" max="65535" required></label><label>ONVIF 服务端口<input name="onvifPort" type="number" value="80" min="1" max="65535" required></label><label>设备用户名<input name="username" maxlength="120" autocomplete="off"></label><label>设备密码<input name="password" type="password" maxlength="256" autocomplete="new-password" placeholder="编辑时留空,保留原密码"></label><div class="full"><button id="onvif-read" type="button" class="secondary">读取 ONVIF 镜头配置</button><p class="description">直接接入摄像头时,可读取设备实际提供的媒体配置。端口请按设备填写:通常为 80,部分 TP-Link 设备为 2020。服务器需要能够访问该设备所在网络。</p><div id="onvif-result"></div></div><label class="full">常见码流路径<select id="path-preset"><option value="custom">手动填写</option><option value="tplink">TP-Link 单镜头</option><option value="hikvision">海康威视 / 兼容路径 · 通道 1</option><option value="dahua">大华 / 兼容路径 · 通道 1</option></select></label><label class="full">主码流路径 *<input name="mainPath" required maxlength="500" value="/stream1"></label><label class="full">子码流路径 *<input name="subPath" required maxlength="500" value="/stream2"></label><label class="check"><input name="enabled" type="checkbox" checked>启用连接</label><label class="check"><input name="record" type="checkbox">持续录像(保存到服务器,按保留策略清理)</label></div><p class="description">账号和密码只保存在本机受限数据目录。RTSP 服务响应代表设备可达,实际码流接通后才显示在线。路径预设需要与设备型号、通道一致。</p><p class="form-error"></p><div class="dialog-footer"><button type="submit">保存设备</button></div></form></dialog><dialog id="asset-dialog"><form id="asset-form"><div class="dialog-heading"><h2>摄像头对象</h2><button type="button" class="quiet" data-close="asset-dialog">关闭</button></div><input name="id" type="hidden"><div class="form-grid"><label>对象名称 *<input name="name" required maxlength="120" placeholder="例如:院门双镜头摄像头"></label><label>所属空间 *<select name="siteId" required></select></label><label>品牌<input name="brand" maxlength="120"></label><label>型号<input name="model" maxlength="120"></label><label>序列号<input name="serial" maxlength="120"></label><label>物理镜头数<input name="lensCount" type="number" value="1" min="1" max="16" required></label><label>安装位置<input name="point" maxlength="120"></label><label>备注<input name="note" maxlength="120"></label><label>所有人<select name="ownerRef" aria-label="所有人"></select><input name="ownerName" aria-label="手动填写所有人" maxlength="80" placeholder="姓名或单位" hidden></label><label>负责人<select name="managerRef" aria-label="负责人"></select><input name="managerName" aria-label="手动填写负责人" maxlength="80" placeholder="管理或维护人员" hidden></label><fieldset class="full device-network"><legend>网络与连接</legend><div class="form-grid"><label>设备 IP/域名<input name="managementHost" maxlength="253" placeholder="例如 192.168.8.160"></label><label>服务端接入方式<select name="networkAccess"><option value="unknown">待确认</option><option value="lan">局域网直连</option><option value="tailscale">Tailscale 跨网</option><option value="public">公网接入</option></select></label><label>Tailscale 地址(可选)<input name="tailscaleHost" maxlength="253" placeholder="100.x.x.x 或设备域名"></label><label>网关提供的网段(可选)<input name="networkCidr" maxlength="64" placeholder="例如 192.168.8.0/24"></label><label>上级设备<select name="uplinkId"></select></label><label>连接方式<select name="connectionType"><option value="unknown">待确认</option><option value="wired">网线连接</option><option value="wifi">Wi-Fi 连接</option></select></label></div><p class="description">保存后自动更新拓扑。网络信息用于设备档案;摄像机实际取流地址在“配置镜头”内设置。选择人员不改变账号访问权限。</p></fieldset><label class="full">自定义标签<input name="tags" maxlength="500" placeholder="用顿号或逗号分隔,例如:照明、常用、公共"></label></div><p class="form-error"></p><div class="dialog-footer"><button type="submit">保存对象</button></div></form></dialog><dialog id="recorder-dialog"><form id="recorder-form"><div class="dialog-heading"><h2>录像机配置</h2><button type="button" class="quiet" data-close="recorder-dialog">关闭</button></div><input name="id" type="hidden"><div class="form-grid"><label>录像机名称 *<input name="name" required maxlength="120"></label><label>所属空间 *<select name="siteId" required></select></label><label>品牌<input name="brand" maxlength="120"></label><label>型号<input name="model" maxlength="120"></label><label>录像机 IP *<input name="host" required></label><label>RTSP 端口<input name="port" type="number" value="554" min="1" max="65535" required></label><label>登录用户名<input name="username" maxlength="120" autocomplete="off"></label><label>设备密码<input name="password" type="password" maxlength="256" placeholder="留空保留原密码" autocomplete="new-password"></label><label class="full">接入驱动<select name="driver"><option value="generic-rtsp">通用 RTSP / 手动通道路径</option><option value="hikvision-rtsp">海康 / 兼容型号 RTSP 路径</option><option value="tplink-rtsp">TP-Link RTSP 路径</option><option value="dahua-rtsp">大华 / 兼容型号 RTSP 路径</option></select></label><label>所有人<select name="ownerRef" aria-label="所有人"></select><input name="ownerName" aria-label="手动填写所有人" maxlength="80" placeholder="姓名或单位" hidden></label><label>负责人<select name="managerRef" aria-label="负责人"></select><input name="managerName" aria-label="手动填写负责人" maxlength="80" placeholder="管理或维护人员" hidden></label><fieldset class="full device-network"><legend>网络与连接</legend><div class="form-grid"><label>设备 IP/域名<input name="managementHost" maxlength="253" placeholder="例如 192.168.8.160"></label><label>服务端接入方式<select name="networkAccess"><option value="unknown">待确认</option><option value="lan">局域网直连</option><option value="tailscale">Tailscale 跨网</option><option value="public">公网接入</option></select></label><label>Tailscale 地址(可选)<input name="tailscaleHost" maxlength="253" placeholder="100.x.x.x 或设备域名"></label><label>网关提供的网段(可选)<input name="networkCidr" maxlength="64" placeholder="例如 192.168.8.0/24"></label><label>上级设备<select name="uplinkId"></select></label><label>连接方式<select name="connectionType"><option value="unknown">待确认</option><option value="wired">网线连接</option><option value="wifi">Wi-Fi 连接</option></select></label></div><p class="description">保存后自动更新拓扑。网络信息用于设备档案;摄像机实际取流地址在“配置镜头”内设置。选择人员不改变账号访问权限。</p></fieldset><label class="full">自定义标签<input name="tags" maxlength="500" placeholder="用顿号或逗号分隔,例如:照明、常用、公共"></label></div><p class="description">驱动在当前版本提供路径模板。录像机历史录像检索、回放及通道自动导入,需要型号确认后接入,当前尚未实现。</p><p class="form-error"></p><div class="dialog-footer"><button type="submit">保存录像机</button></div></form></dialog>',7)),t[1]||(t[1]=l("dialog",{id:"leadership-dialog"},[l("form",{id:"leadership-form"},[l("div",{class:"dialog-heading"},[l("h2",null,"负责人安排与交接"),l("button",{type:"button",class:"quiet","data-close":"leadership-dialog"},"关闭")]),l("input",{name:"id",type:"hidden"}),l("input",{name:"revision",type:"hidden"}),l("p",{class:"description"},"选择本家庭 / 场所的成员,分别指定主要和备用负责人。主要负责人即一家之主;选择普通成员时,需明确确认授予其本家庭管理权限。备用负责人可稍后安排。"),l("p",{id:"leadership-scope",class:"fw-semibold"}),l("div",{id:"leadership-empty",class:"alert alert-info",role:"status",hidden:""},"本家庭 / 场所还没有可选成员。请先添加本家庭管理员,保存账号后会自动返回这里。其他家庭的账号不会混入此列表。"),l("div",{class:"leadership-member-actions d-flex flex-wrap gap-2 mb-3"},[l("button",{type:"button",id:"leadership-new",class:"secondary"},"+ 添加本家庭管理员"),l("button",{type:"button",id:"leadership-members",class:"quiet"},"管理本家庭成员")]),l("div",{class:"form-grid"},[l("label",null,[f("主要负责人 *"),l("select",{name:"ownerId",required:""})]),l("label",null,[f("备用负责人"),l("select",{name:"successorId"})]),l("label",{id:"leadership-grant",class:"check full alert alert-warning",hidden:""},[l("input",{type:"checkbox",name:"grantManagement"}),l("span",{id:"leadership-grant-note"})]),l("label",{class:"full"},[f("安排 / 交接说明 *"),l("textarea",{name:"reason",required:"",maxlength:"300",rows:"3",placeholder:"说明负责人安排或本次交接原因"})])]),l("p",{class:"description"},"交接后原负责人仍保留本归属的管理员权限。系统不会依据未登录或家谱去世日期自动转移权限;交接记录可追溯。"),l("p",{class:"form-error",role:"status"}),l("div",{class:"dialog-footer"},[l("button",{type:"submit"},"确认保存负责人安排")])])],-1)),t[2]||(t[2]=l("dialog",{id:"household-dialog"},[l("form",{id:"household-form"},[l("div",{class:"dialog-heading"},[l("h2",null,"家庭 / 场所档案"),l("button",{type:"button",class:"quiet","data-close":"household-dialog"},"关闭")]),l("input",{name:"id",type:"hidden"}),l("input",{name:"profileRevision",type:"hidden",value:"0"}),l("div",{class:"form-grid"},[l("label",{class:"full"},[f("归属名称 *"),l("input",{name:"name",maxlength:"80",required:"",placeholder:"例如:赵府、济南办公室、莱阳工厂"})]),l("label",{class:"full"},[f("归属类型"),l("select",{name:"kind"},[l("option",{value:"home"},"家庭"),l("option",{value:"office"},"办公场所"),l("option",{value:"factory"},"工厂")])]),l("fieldset",{class:"full geo-picker","data-geography":"","data-geo-title":"所在地"}),l("div",{class:"full cover-editor"},[l("img",{id:"household-cover-preview",alt:"场所封面预览",hidden:""}),l("label",null,[f("卡片封面照片"),l("input",{id:"household-cover-file",type:"file",accept:"image/png,image/jpeg,image/webp"})]),l("button",{type:"button",id:"household-cover-cancel",class:"quiet"},"取消本次图片选择"),l("button",{type:"button",id:"household-cover-reset",class:"quiet"},"使用默认封面"),l("p",{id:"household-cover-status",class:"description",role:"status","aria-live":"polite"},"照片仅向有权进入该家庭或场所的账号开放。")]),l("label",{class:"full"},[f("备注"),l("textarea",{name:"note",maxlength:"300",rows:"3"})])]),l("p",{class:"description"},"创建后进入该归属,建立管理员,再自行划分区域和登记设备。"),l("p",{class:"form-error"}),l("div",{class:"dialog-footer"},[l("button",{type:"submit"},"保存家庭")])])],-1)),t[3]||(t[3]=Se('<dialog id="user-dialog"><form id="user-form"><div class="dialog-heading"><h2>账号档案</h2><button type="button" class="quiet" data-close="user-dialog">关闭</button></div><input name="id" type="hidden"><div class="form-grid"><label>用户名 *<input name="username" required minlength="3" maxlength="32" autocomplete="off"></label><label>显示名称 *<input name="name" required maxlength="80"></label><label>密码<input name="password" type="password" minlength="8" maxlength="128" autocomplete="new-password" placeholder="编辑时留空保留"></label><label>账号角色<select name="role"><option value="member">家庭 / 场所成员</option><option value="family_admin">家庭 / 场所管理员</option><option value="admin">超级管理员</option></select></label><label>家谱权限<select name="familyAccess"><option value="none">不可访问</option><option value="read">查看家谱</option><option value="edit">录入和维护家谱</option></select></label><label>文化与财产档案权限<select name="heritageAccess"><option value="none">不可访问</option><option value="read">查看资料</option><option value="edit">整理与维护</option></select></label><label>关联家谱人物<select name="personId"></select></label><label>这个账号是<select name="relatedToId"></select></label><label>的什么关系<input name="relationship" list="relationship-choices" maxlength="40" placeholder="可选择或自行填写"></label><fieldset class="full"><legend>允许查看摄像头的空间</legend><div id="user-sites"></div><p class="description">普通成员只访问本归属内已授权的区域。默认仅授权所选区域;勾选“包含下级区域”后同时包含其所有后代。管理员可管理本归属全部区域。</p></fieldset><label class="check full"><input name="includeSubspaces" type="checkbox">授权包含所选区域的所有下级区域(含以后新增)</label><label class="check"><input name="ptzControl" type="checkbox">允许控制已授权空间的摄像头云台</label><label class="check"><input name="disabled" type="checkbox">停用账号</label></div><p class="form-error"></p><div class="dialog-footer"><button type="submit">保存账号</button></div></form></dialog><datalist id="relationship-choices"></datalist>',2)),t[4]||(t[4]=l("dialog",{id:"person-dialog"},[l("form",{id:"person-form"},[l("div",{class:"dialog-heading"},[l("h2",null,"家谱人物"),l("button",{type:"button",class:"quiet","data-close":"person-dialog"},"关闭")]),l("input",{name:"id",type:"hidden"}),l("input",{name:"revision",type:"hidden"}),l("div",{class:"form-grid"},[l("label",null,[f("姓名 / 称呼 *"),l("input",{name:"name",required:"",maxlength:"80",placeholder:"姓名暂不知时可先填称呼"})]),l("label",null,[f("别名 / 字 / 号"),l("input",{name:"alias",maxlength:"120"})]),l("label",null,[f("性别"),l("select",{name:"gender"},[l("option",{value:"unknown"},"待确认"),l("option",{value:"male"},"男"),l("option",{value:"female"},"女")])]),l("label",null,[f("在世情况"),l("select",{name:"lifeStatus"},[l("option",{value:"alive"},"在世"),l("option",{value:"deceased"},"不在世"),l("option",{value:"unknown"},"待确认")])]),l("fieldset",{class:"family-date","data-date-field":"birthDate"},[l("legend",null,"出生日期"),l("input",{name:"birthDate",type:"hidden"}),l("label",null,[f("历法"),l("select",{"data-calendar":"","aria-label":"出生日期历法"},[l("option",{value:"solar"},"公历"),l("option",{value:"lunar"},"农历")])]),l("label",null,[f("日期"),l("input",{"data-date-value":"","aria-label":"出生日期",type:"text",inputmode:"numeric",placeholder:"YYYY-MM-DD",maxlength:"10"})]),l("label",{"data-leap-label":"",class:"check",hidden:""},[l("input",{"data-date-leap":"",type:"checkbox"}),f("闰月")]),l("output",{"data-date-hint":"","aria-live":"polite"},"日期不详可留空")]),l("fieldset",{class:"family-date","data-date-field":"deathDate",hidden:""},[l("legend",null,"去世日期"),l("input",{name:"deathDate",type:"hidden"}),l("label",null,[f("历法"),l("select",{"data-calendar":"","aria-label":"去世日期历法"},[l("option",{value:"solar"},"公历"),l("option",{value:"lunar"},"农历")])]),l("label",null,[f("日期"),l("input",{"data-date-value":"","aria-label":"去世日期",type:"text",inputmode:"numeric",placeholder:"YYYY-MM-DD",maxlength:"10"})]),l("label",{"data-leap-label":"",class:"check",hidden:""},[l("input",{"data-date-leap":"",type:"checkbox"}),f("闰月")]),l("output",{"data-date-hint":"","aria-live":"polite"},"日期不详可留空")]),l("label",{class:"full",id:"person-legacy-place"},[f("原籍贯/出生地记录"),l("input",{name:"birthplace",maxlength:"160"}),l("small",null,"历史填写内容保留,可在下方分别补充。")]),l("fieldset",{class:"full person-location"},[l("legend",null,"籍贯(祖籍)"),l("div",{class:"form-grid"},[l("fieldset",{class:"full geo-picker","data-geography":"native","data-geo-title":"籍贯(祖籍)"}),l("label",null,[f("乡镇/街道"),l("input",{name:"nativeTown",maxlength:"80",placeholder:"","aria-label":"籍贯(祖籍) · 乡镇/街道"})]),l("label",null,[f("村/社区"),l("input",{name:"nativeCommunity",maxlength:"80",placeholder:"","aria-label":"籍贯(祖籍) · 村/社区"})]),l("label",{class:"full"},[f("详细地址/历史地名"),l("input",{name:"nativeAddress",maxlength:"200",placeholder:"楼栋、门牌或旧称,可按已知信息填写","aria-label":"籍贯(祖籍) · 详细地址/历史地名"})])])]),l("fieldset",{class:"full person-location"},[l("legend",null,"出生地"),l("div",{class:"form-grid"},[l("fieldset",{class:"full geo-picker","data-geography":"birth","data-geo-title":"出生地"}),l("label",null,[f("乡镇/街道"),l("input",{name:"birthTown",maxlength:"80",placeholder:"","aria-label":"出生地 · 乡镇/街道"})]),l("label",null,[f("村/社区"),l("input",{name:"birthCommunity",maxlength:"80",placeholder:"","aria-label":"出生地 · 村/社区"})]),l("label",{class:"full"},[f("详细地址/历史地名"),l("input",{name:"birthAddress",maxlength:"200",placeholder:"楼栋、门牌或旧称,可按已知信息填写","aria-label":"出生地 · 详细地址/历史地名"})])])]),l("p",{class:"description full"},"籍贯与出生地可不同;选择中国、世界或自定义地域,不详的层级可留空。"),l("label",{class:"full"},[f("生平简介"),l("textarea",{name:"biography",rows:"4",maxlength:"2000"})]),l("label",{class:"full"},[f("备注 / 信息来源"),l("textarea",{name:"note",rows:"3",maxlength:"500",placeholder:"例如:长辈口述、族谱记载、待考证信息"})]),l("label",{class:"check"},[l("input",{name:"archived",type:"checkbox"}),f("归档人物(保留关系,可恢复)")])]),l("p",{class:"form-error"}),l("div",{class:"dialog-footer"},[l("button",{type:"submit"},"保存人物")])])],-1)),t[5]||(t[5]=Se('<dialog id="relation-dialog"><form id="relation-form"><div class="dialog-heading"><h2>连接人物关系</h2><button type="button" class="quiet" data-close="relation-dialog">关闭</button></div><input name="id" type="hidden"><input name="revision" type="hidden"><div class="form-grid"><label>关系类型<select name="kind"><option value="parent">父母 → 子女</option><option value="spouse">配偶 ↔ 配偶</option></select></label><label>亲子属性<select name="lineage"><option value="unspecified">未注明</option><option value="biological">亲生</option><option value="adoptive">收养</option><option value="step">继亲</option></select></label><label>父母一方 / 配偶一方<select name="fromId" required></select></label><label>子女 / 另一位配偶<select name="toId" required></select></label><label class="full">关系备注<input name="note" maxlength="300"></label><label class="check"><input name="active" type="checkbox" checked>关系有效(取消后保留记录,可恢复)</label></div><p class="description">每条亲子关系连接一位父母与一位子女。录入另一位父母时,再建立一条关系。</p><p class="form-error"></p><div class="dialog-footer"><button type="submit">保存关系</button></div></form></dialog>',1)),t[6]||(t[6]=l("dialog",{id:"event-dialog","aria-labelledby":"event-editor-title"},[l("form",{id:"event-form"},[l("div",{class:"dialog-heading"},[l("h2",{id:"event-editor-title"},"写一则家族记事"),l("button",{type:"button",class:"quiet","data-close":"event-dialog"},"关闭")]),l("input",{name:"id",type:"hidden"}),l("input",{name:"revision",type:"hidden"}),l("div",{class:"form-grid"},[l("label",{class:"full"},[f("记事标题 *"),l("input",{name:"title",required:"",maxlength:"160",placeholder:"用一句话概括这件事"})]),l("fieldset",{class:"family-date full","data-date-field":"eventDate"},[l("legend",null,"事情发生的日期 *"),l("input",{name:"eventDate",type:"hidden"}),l("label",null,[f("历法"),l("select",{"data-calendar":"","aria-label":"记事日期历法"},[l("option",{value:"solar"},"公历"),l("option",{value:"lunar"},"农历")])]),l("label",null,[f("日期"),l("input",{"data-date-value":"","aria-label":"记事日期",required:"",type:"text",inputmode:"numeric",placeholder:"YYYY-MM-DD",maxlength:"10"})]),l("label",{"data-leap-label":"",class:"check",hidden:""},[l("input",{"data-date-leap":"",type:"checkbox"}),f("闰月")]),l("output",{"data-date-hint":"","aria-live":"polite"})]),l("fieldset",{class:"full"},[l("legend",null,"关联人物(可多选)"),l("input",{id:"event-person-search",type:"search",placeholder:"查找要关联的亲人","aria-label":"查找关联人物"}),l("div",{id:"event-person-choices"}),l("p",{class:"description"},"未选择人物时记为全家记事。每位关联人物的档案都可以追溯到这条记事。")]),l("label",{class:"full"},[f("摘要"),l("textarea",{name:"summary",maxlength:"400",rows:"2",placeholder:"简要说明这件事"})]),l("label",{class:"full"},[f("详细记载"),l("textarea",{name:"body",maxlength:"12000",rows:"7",placeholder:"记录经过、意义、长辈口述或资料出处。可分段书写。"})]),l("label",null,[f("报道 / 资料来源"),l("input",{name:"sourceName",maxlength:"160",placeholder:"例如:报刊名称、个人博客"})]),l("label",null,[f("原始报道链接"),l("input",{name:"sourceUrl",type:"url",maxlength:"2000",placeholder:"https://…"})]),l("label",{class:"check full"},[l("input",{name:"archived",type:"checkbox"}),f("归档记事(保留内容,可恢复)")])]),l("p",{class:"description"},"正式发布后,有家谱查看权限的账号即可在时间线看到;草稿只对有编辑权限的人可见。"),l("p",{class:"form-error",role:"status"}),l("div",{class:"dialog-footer event-editor-actions"},[l("button",{type:"submit","data-save-event":"",value:"draft",class:"secondary"},"保存草稿"),l("button",{type:"submit","data-publish-event":"",value:"published"},"发布记事"),l("button",{type:"submit","data-withdraw-event":"",value:"draft",class:"secondary",hidden:""},"撤回为草稿")])])],-1)),t[7]||(t[7]=Se('<dialog id="event-detail-dialog" aria-labelledby="event-detail-title"><div class="dialog-heading"><span class="eyebrow">家事 · 家声</span><button type="button" class="quiet" data-close="event-detail-dialog">关闭</button></div><article id="event-detail-content"></article></dialog>',1)),t[8]||(t[8]=l("dialog",{id:"history-dialog","aria-labelledby":"history-title"},[l("div",{class:"dialog-heading"},[l("h2",{id:"history-title"},"修改记录"),l("button",{type:"button",class:"quiet","data-close":"history-dialog"},"关闭")]),l("p",{class:"description"},"人物、关系与记事每次保存都会留存版本。仅有家谱编辑权限的账号可查阅和恢复。"),l("p",{id:"history-error",class:"form-error",role:"status"}),l("div",{id:"history-list"}),l("button",{id:"history-more",class:"quiet",hidden:""},"加载更早记录"),l("article",{id:"history-detail"})],-1)),t[9]||(t[9]=l("dialog",{id:"password-dialog","aria-labelledby":"password-title"},[l("form",{id:"password-form"},[l("div",{class:"dialog-heading"},[l("h2",{id:"password-title"},"修改我的密码"),l("button",{type:"button",class:"quiet","data-close":"password-dialog"},"关闭")]),l("p",{id:"password-account",class:"description"}),l("label",null,[f("当前密码"),l("input",{name:"currentPassword",type:"password",required:"",maxlength:"128",autocomplete:"current-password"})]),l("label",null,[f("新密码"),l("input",{name:"newPassword",type:"password",required:"",minlength:"8",maxlength:"128",autocomplete:"new-password"})]),l("label",null,[f("再次输入新密码"),l("input",{name:"confirmPassword",type:"password",required:"",minlength:"8",maxlength:"128",autocomplete:"new-password"})]),l("p",{class:"description"},"保存后,这个账号在所有设备上都需要用新密码重新登录。"),l("p",{class:"form-error",role:"status"}),l("div",{class:"dialog-footer"},[l("button",{type:"submit"},"保存新密码")])])],-1)),t[10]||(t[10]=l("dialog",{id:"camera-settings-dialog","aria-labelledby":"camera-settings-title"},[l("div",{class:"dialog-heading"},[l("h2",{id:"camera-settings-title"},"摄像机参数"),l("button",{class:"quiet","data-close":"camera-settings-dialog"},"关闭")]),l("div",{class:"section-head"},[l("label",null,[f("设置码流"),l("select",{id:"camera-settings-quality"},[l("option",{value:"main"},"主码流"),l("option",{value:"sub"},"子码流")])]),l("button",{id:"camera-settings-reload",class:"quiet"},"重新读取")]),l("div",{id:"camera-settings-info"}),l("p",{id:"camera-settings-status",class:"form-error",role:"status"}),l("form",{id:"camera-image-form"},[l("h3",null,"图像与日夜模式"),l("p",{class:"description"},"作用于当前物理镜头,主、子码流共用这些图像参数。"),l("div",{id:"camera-image-fields",class:"form-grid"}),l("div",{class:"dialog-footer"},[l("button",{type:"submit",disabled:""},"保存图像参数")])]),l("form",{id:"camera-video-form"},[l("h3",null,"码流与清晰度"),l("p",{class:"description"},"作用于上方选定的码流。保存后画面可能短暂重连,录像机也会使用调整后的码流。本页保留原有视频编码。"),l("div",{id:"camera-video-fields",class:"form-grid"}),l("div",{class:"dialog-footer"},[l("button",{type:"submit",disabled:""},"保存码流参数")])]),l("details",null,[l("summary",null,"其他萤石功能的接入情况"),l("ul",null,[l("li",null,"云台方向微调与预置位:在实时画面的“云台”中使用,按设备能力启用。"),l("li",null,"实时声音与全屏:通过画面播放器控制。"),l("li",null,"双向对讲、智能追踪、声光告警、隐私遮蔽、设备翻转、云录像和消息推送:当前尚未接入,请使用萤石 App。"),l("li",null,"录像机原有录像:仍通过录像机或原厂 App 查看;本系统已支持本机额外录像的回放。")]),l("p",{class:"description"},"功能按设备实际开放能力逐项接入,型号与固件不同可能有差异。")])],-1)),t[11]||(t[11]=l("div",{id:"toast",role:"status",hidden:""},null,-1)),t[12]||(t[12]=Se('<dialog id="snapshot-dialog" aria-labelledby="snapshot-title"><div class="dialog-heading"><h2 id="snapshot-title">画面截图</h2><button data-close="snapshot-dialog" class="quiet">关闭</button></div><img id="snapshot-image" alt="当前视频画面截图"><p id="snapshot-info" class="description"></p><a id="snapshot-save" class="button" download>下载 PNG 图片</a></dialog><dialog id="journal-preview" class="journal-preview" aria-labelledby="journal-preview-title"><header><h2 id="journal-preview-title">附件预览</h2><button id="journal-preview-close" type="button" class="quiet">关闭预览</button></header><div id="journal-preview-content"></div><footer><span>按 Esc 关闭预览</span><a id="journal-preview-download">下载原文件</a></footer></dialog>',2))],64)}const Nu=ki(Du,[["render",Hu]]),Fu=["/vendor/hls.min.js","/live-player.js","/kinship.js","/family-graph.js","/calendar.js","/device-model.js","/data/geography-data.js","/geography.js","/app.js","/monitor.js","/date-fields.js","/family-map.js","/family.js","/family-events.js","/family-history.js","/camera-settings.js","/recording-ranges.js","/recording-ui.js","/snapshot.js","/households.js","/devices.js","/steward.js","/heritage.js","/personalization.js","/file-hash.js","/journal.js"];function un(e){if(!(e instanceof Element))return;const t=[e,...e.querySelectorAll("button,input,select,textarea,table")];for(const s of t)s.matches("button")&&!s.closest(".family-map-viewport")&&!s.classList.contains("btn")&&s.classList.add("btn",s.matches(".quiet,.secondary")?"btn-outline-secondary":"btn-primary"),s.matches("select")&&s.classList.add("form-select"),s.matches("textarea,input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=hidden])")&&s.classList.add("form-control"),s.matches("input[type=checkbox],input[type=radio]")&&s.classList.add("form-check-input"),s.matches("table")&&s.classList.add("table","align-middle")}async function Lu(){un(document.getElementById("app")),new MutationObserver(e=>{for(const t of e)for(const s of t.addedNodes)un(s)}).observe(document.getElementById("app"),{childList:!0,subtree:!0});for(const e of[...Fu,"/vue-bridge.js"])await new Promise((t,s)=>{const n=document.createElement("script");n.src=e+"?ui=0.1.39",n.onload=t,n.onerror=()=>s(new Error("Could not load "+e)),document.head.append(n)});await window.ZhaoVue.boot()}const Vu=["data-page"],Ku={key:0,class:"alert alert-danger",role:"alert"},Uu={__name:"App",setup(e){const t=ke(!1);return Yn(async()=>{try{await Lu()}catch(s){console.error("Application startup failed",s),t.value=!0}}),(s,n)=>(T(),M(W,null,[L(ar),l("main",{"data-page":K(J).page},[L(ur),t.value?(T(),M("div",Ku,"页面组件加载失败,请检查网络后重新打开页面。")):U("",!0),L(Ru)],8,Vu),L(Nu)],64))}};Ba(Uu).mount("#app");