dsh-mobile-plugin 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,7 +20,7 @@ Error generating stack: `+e.message+`
20
20
  ${_}px !important;
21
21
  ${v}px !important;
22
22
  }
23
- `),()=>{s.current?.removeAttribute(`data-motion-pop-id`),b.contains(y)&&b.removeChild(y)}},[t]),(0,J.jsx)(A_,{isPresent:t,childRef:s,sizeRef:c,pop:a,children:a===!1?e:g.cloneElement(e,{ref:u})})}var M_=({children:e,initial:t,isPresent:n,onExitComplete:r,custom:i,presenceAffectsLayout:a,mode:o,anchorX:s,anchorY:c,root:l})=>{let u=bu(N_),d=(0,g.useId)(),f=(0,g.useRef)(n),p=(0,g.useRef)(r);xu(()=>{f.current=n,p.current=r});let m=!0,h=(0,g.useMemo)(()=>(m=!1,{id:d,initial:t,isPresent:n,custom:i,onExitComplete:e=>{u.set(e,!0);for(let e of u.values())if(!e)return;r&&r()},register:e=>(u.set(e,!1),()=>{u.delete(e),!f.current&&!u.size&&p.current?.()})}),[n,u,r]);return a&&m&&(h={...h}),(0,g.useMemo)(()=>{u.forEach((e,t)=>u.set(t,!1))},[n]),g.useEffect(()=>{!n&&!u.size&&r&&r()},[n]),e=(0,J.jsx)(j_,{pop:o===`popLayout`,isPresent:n,anchorX:s,anchorY:c,root:l,children:e}),(0,J.jsx)(Su.Provider,{value:h,children:e})};function N_(){return new Map}function P_(e=!0){let t=(0,g.useContext)(Su);if(t===null)return[!0,null];let{isPresent:n,onExitComplete:r,register:i}=t,a=(0,g.useId)();(0,g.useEffect)(()=>{if(e)return i(a)},[e]);let o=(0,g.useCallback)(()=>e&&r&&r(a),[a,r,e]);return!n&&r?[!1,o]:[!0]}var F_=e=>e.key||``;function I_(e){let t=[];return g.Children.forEach(e,e=>{(0,g.isValidElement)(e)&&t.push(e)}),t}var L_=({children:e,custom:t,initial:n=!0,onExitComplete:r,presenceAffectsLayout:i=!0,mode:a=`sync`,propagate:o=!1,anchorX:s=`left`,anchorY:c=`top`,root:l})=>{let[u,d]=P_(o),f=(0,g.useMemo)(()=>I_(e),[e]),p=o&&!u?[]:f.map(F_),m=(0,g.useRef)(!0),h=bu(()=>new Map),_=(0,g.useRef)(new Set),[v,y]=(0,g.useState)(f),[b,x]=(0,g.useState)(f);xu(()=>{o&&!u&&!b.length&&d?.()},[u,o,b.length,d]),xu(()=>{m.current=!1;for(let e=0;e<b.length;e++){let t=F_(b[e]);p.includes(t)?(h.delete(t),_.current.delete(t)):h.get(t)!==!0&&h.set(t,!1)}},[b,p.length,p.join(`-`)]);let S=[];if(f!==v){let e=[...f],t=0;for(let n of b){let r=p.indexOf(F_(n));r===-1?(e.splice(t++,0,n),S.push(n)):t=r+S.length+1}return S.every(e=>h.get(F_(e)))?e=f:a===`wait`&&(e=S),x(I_(e)),y(f),null}let{forceRender:C}=(0,g.useContext)(yu);return(0,J.jsx)(J.Fragment,{children:b.map(e=>{let g=F_(e),v=o&&!u?!1:f===b||p.includes(g);return(0,J.jsx)(M_,{isPresent:v,initial:!m.current||n?void 0:!1,custom:t,presenceAffectsLayout:i,mode:a,root:l,onExitComplete:v?void 0:()=>{if(_.current.has(g))return;if(h.has(g))_.current.add(g),h.set(g,!0);else return;let e=!0;h.forEach(t=>{t||(e=!1)}),e&&(C?.(),y([]),o&&d?.(),r&&r())},anchorX:s,anchorY:c,children:e},g)})})},R_=(0,g.createContext)({strict:!1}),z_={animation:[`animate`,`variants`,`whileHover`,`whileTap`,`exit`,`whileInView`,`whileFocus`,`whileDrag`],exit:[`exit`],drag:[`drag`,`dragControls`],focus:[`whileFocus`],hover:[`whileHover`,`onHoverStart`,`onHoverEnd`],tap:[`whileTap`,`onTap`,`onTapStart`,`onTapCancel`],pan:[`onPan`,`onPanStart`,`onPanSessionStart`,`onPanEnd`],inView:[`whileInView`,`onViewportEnter`,`onViewportLeave`],layout:[`layout`,`layoutId`]},B_=!1;function V_(){if(B_)return;let e={};for(let t in z_)e[t]={isEnabled:e=>z_[t].some(t=>!!e[t])};n_(e),B_=!0}function H_(){return V_(),r_()}function U_(e){let t=H_();for(let n in e)t[n]={...t[n],...e[n]};n_(t)}function W_({children:e,features:t,strict:n=!1}){let[,r]=(0,g.useState)(!G_(t)),i=(0,g.useRef)(void 0);if(!G_(t)){let{renderer:e,...n}=t;i.current=e,U_(n)}return(0,g.useEffect)(()=>{G_(t)&&t().then(({renderer:e,...t})=>{U_(t),i.current=e,r(!0)})},[]),(0,J.jsx)(R_.Provider,{value:{renderer:i.current,strict:n},children:e})}function G_(e){return typeof e==`function`}var K_=(0,g.createContext)({});function q_(e,t){if(qg(e)){let{initial:t,animate:n}=e;return{initial:t===!1||Wg(t)?t:void 0,animate:Wg(n)?n:void 0}}return e.inherit===!1?{}:t}function J_(e){let{initial:t,animate:n}=q_(e,(0,g.useContext)(K_));return(0,g.useMemo)(()=>({initial:t,animate:n}),[Y_(t),Y_(n)])}function Y_(e){return Array.isArray(e)?e.join(` `):e}var X_=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function Z_(e,t,n){for(let r in t)!fh(t[r])&&!l_(r,n)&&(e[r]=t[r])}function Q_({transformTemplate:e},t){return(0,g.useMemo)(()=>{let n=X_();return ng(n,t,e),Object.assign({},n.vars,n.style)},[t])}function $_(e,t){let n=e.style||{},r={};return Z_(r,n,e),Object.assign(r,Q_(e,t)),r}function ev(e,t){let n={},r=$_(e,t);return e.drag&&e.dragListener!==!1&&(n.draggable=!1,r.userSelect=r.WebkitUserSelect=r.WebkitTouchCallout=`none`,r.touchAction=e.drag===!0?`none`:`pan-${e.drag===`x`?`y`:`x`}`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(n.tabIndex=0),n.style=r,n}var tv=()=>({...X_(),attrs:{}});function nv(e,t,n,r){let i=(0,g.useMemo)(()=>{let n=tv();return sg(n,t,m_(r),e.transformTemplate,e.style),{...n.attrs,style:{...n.style}}},[t]);if(e.style){let t={};Z_(t,e.style,e),i.style={...t,...i.style}}return i}var rv=new Set(`animate.exit.variants.initial.style.values.transition.transformTemplate.custom.inherit.onBeforeLayoutMeasure.onAnimationStart.onAnimationComplete.onUpdate.onDragStart.onDrag.onDragEnd.onMeasureDragConstraints.onDirectionLock.onDragTransitionEnd._dragX._dragY.onHoverStart.onHoverEnd.onViewportEnter.onViewportLeave.globalTapTarget.propagate.ignoreStrict.viewport`.split(`.`));function iv(e){return e.startsWith(`while`)||e.startsWith(`drag`)&&e!==`draggable`||e.startsWith(`layout`)||e.startsWith(`onTap`)||e.startsWith(`onPan`)||e.startsWith(`onLayout`)||rv.has(e)}function av(e,t){return e.startsWith(`on`)?!iv(e):t?.(e)??!iv(e)}function ov(e,t,n,r){let i={};for(let a in e)(a!==`values`||typeof e.values!=`object`)&&(fh(e[a])||(av(a,r)||n===!0&&iv(a)||!t&&!iv(a)||e.draggable&&a.startsWith(`onDrag`))&&(i[a]=e[a]));return i}var sv=[`animate`,`circle`,`defs`,`desc`,`ellipse`,`g`,`image`,`line`,`filter`,`marker`,`mask`,`metadata`,`path`,`pattern`,`polygon`,`polyline`,`rect`,`stop`,`switch`,`symbol`,`svg`,`text`,`tspan`,`use`,`view`];function cv(e){return typeof e!=`string`||e.includes(`-`)?!1:!!(sv.indexOf(e)>-1||/[A-Z]/u.test(e))}function lv(e,t,n,{latestValues:r},i,a=!1,o,s){let c=(o??cv(e)?nv:ev)(t,r,i,e),l=ov(t,typeof e==`string`,a,s),u=e===g.Fragment?{}:{...l,...c,ref:n},{children:d}=t,f=(0,g.useMemo)(()=>fh(d)?d.get():d,[d]);return(0,g.createElement)(e,{...u,children:f})}function uv({scrapeMotionValuesFromProps:e,createRenderState:t},n,r,i){return{latestValues:dv(n,r,i,e),renderState:t()}}function dv(e,t,n,r){let i={},a=r(e,{});for(let e in a)i[e]=T_(a[e]);let{initial:o,animate:s}=e,c=qg(e),l=Jg(e);t&&l&&!c&&e.inherit!==!1&&(o===void 0&&(o=t.initial),s===void 0&&(s=t.animate));let u=n?n.initial===!1:!1;u||=o===!1;let d=u?s:o;if(d&&typeof d!=`boolean`&&!Ug(d)){let t=Array.isArray(d)?d:[d];for(let n=0;n<t.length;n++){let r=ih(e,t[n]);if(r){let{transitionEnd:e,transition:t,...n}=r;for(let e in n){let t=n[e];if(Array.isArray(t)){let e=u?t.length-1:0;t=t[e]}t!==null&&(i[e]=t)}for(let t in e)i[t]=e[t]}}}return i}var fv=e=>(t,n)=>{let r=(0,g.useContext)(K_),i=(0,g.useContext)(Su),a=()=>uv(e,t,r,i);return n?a():bu(a)},pv=fv({scrapeMotionValuesFromProps:u_,createRenderState:X_}),mv=fv({scrapeMotionValuesFromProps:g_,createRenderState:tv}),hv=Symbol.for(`motionComponentSymbol`);function gv(e,t,n){let r=(0,g.useRef)(n);(0,g.useInsertionEffect)(()=>{r.current=n});let i=(0,g.useRef)(null);return(0,g.useCallback)(n=>{n&&e.onMount?.(n),t&&(n?t.mount(n):t.unmount());let a=r.current;if(typeof a==`function`){if(n){let e=a(n);typeof e==`function`&&(i.current=e)}else i.current?(i.current(),i.current=null):a(n)}else a&&(a.current=n)},[t])}var _v=(0,g.createContext)({});function vv(e){return e&&typeof e==`object`&&Object.prototype.hasOwnProperty.call(e,`current`)}function yv(e,t,n,r,i,a){let{visualElement:o}=(0,g.useContext)(K_),s=(0,g.useContext)(R_),c=(0,g.useContext)(Su),l=(0,g.useContext)(E_),u=l.reducedMotion,d=l.skipAnimations,f=(0,g.useRef)(null),p=(0,g.useRef)(!1);r||=s.renderer,!f.current&&r&&(f.current=r(e,{visualState:t,parent:o,props:n,presenceContext:c,blockInitialAnimation:c?c.initial===!1:!1,reducedMotionConfig:u,skipAnimations:d,isSVG:a}),p.current&&f.current&&(f.current.manuallyAnimateOnMount=!0));let m=f.current,h=(0,g.useContext)(_v);m&&!m.projection&&i&&(m.type===`html`||m.type===`svg`)&&bv(f.current,n,i,h);let _=(0,g.useRef)(!1);(0,g.useInsertionEffect)(()=>{m&&_.current&&m.update(n,c)});let v=n[gh],y=(0,g.useRef)(!!v&&typeof window<`u`&&!window.MotionHandoffIsComplete?.(v)&&window.MotionHasOptimisedAnimation?.(v));return xu(()=>{p.current&&m&&(m.animationState?.animateChanges(),m.enteringChildren=void 0)},[]),xu(()=>{p.current=!0,m&&(_.current=!0,window.MotionIsMounted=!0,m.updateFeatures(),m.scheduleRenderMicrotask(),y.current&&m.animationState&&m.animationState.animateChanges())}),(0,g.useEffect)(()=>{m&&(!y.current&&m.animationState&&m.animationState.animateChanges(),y.current&&=(queueMicrotask(()=>{window.MotionHandoffMarkAsComplete?.(v)}),!1),m.enteringChildren=void 0)}),m}function bv(e,t,n,r){let{layoutId:i,layout:a,drag:o,dragConstraints:s,layoutScroll:c,layoutRoot:l,layoutAnchor:u,layoutCrossfade:d}=t;e.projection=new n(e.latestValues,t[`data-framer-portal-id`]?void 0:xv(e.parent)),e.projection.setOptions({layoutId:i,layout:a,alwaysMeasureLayout:!!o||s&&vv(s),visualElement:e,animationType:typeof a==`string`?a:`both`,initialPromotionConfig:r,crossfade:d,layoutScroll:c,layoutRoot:l,layoutAnchor:u})}function xv(e){if(e)return e.options.allowProjection===!1?xv(e.parent):e.projection}function Sv(e,{forwardMotionProps:t=!1,type:n}={},r,i){r&&U_(r);let a=n?n===`svg`:cv(e),o=a?mv:pv;function s(n,s){let c,l={...(0,g.useContext)(E_),...n,layoutId:Cv(n)},{isStatic:u,isValidProp:d}=l,f=J_(n),p=o(n,u);if(!u&&typeof window<`u`){wv(l,r);let t=Tv(l);c=t.MeasureLayout,f.visualElement=yv(e,p,l,i,t.ProjectionNode,a)}return(0,J.jsxs)(K_.Provider,{value:f,children:[c&&f.visualElement?(0,J.jsx)(c,{visualElement:f.visualElement,...l}):null,lv(e,n,gv(p,f.visualElement,s),p,u,t,a,d)]})}s.displayName=`motion.${typeof e==`string`?e:`create(${e.displayName??e.name??``})`}`;let c=(0,g.forwardRef)(s);return c[hv]=e,c}function Cv({layoutId:e}){let t=(0,g.useContext)(yu).id;return t&&e!==void 0?t+`-`+e:e}function wv(e,t){(0,g.useContext)(R_).strict}function Tv(e){let{drag:t,layout:n}=H_();if(!t&&!n)return{};let r={...t,...n};return{MeasureLayout:t?.isEnabled(e)||n?.isEnabled(e)?r.MeasureLayout:void 0,ProjectionNode:r.ProjectionNode}}function Ev(e,t){if(typeof Proxy>`u`)return Sv;let n=new Map,r=(n,r)=>Sv(n,r,e,t);return new Proxy((e,t)=>r(e,t),{get:(i,a)=>a===`create`?r:(n.has(a)||n.set(a,Sv(a,void 0,e,t)),n.get(a))})}var Dv=Ev(),Ov=(e,t)=>t.isSVG??cv(e)?new __(t):new f_(t,{allowProjection:e!==g.Fragment}),kv=class extends o_{constructor(e){super(e),e.animationState||=b_(e)}updateAnimationControlsSubscription(){let{animate:e}=this.node.getProps();Ug(e)&&(this.unmountControls=e.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){let{animate:e}=this.node.getProps(),{animate:t}=this.node.prevProps||{};e!==t&&this.updateAnimationControlsSubscription()}unmount(){this.node.animationState.reset(),this.unmountControls?.()}},Av=0,jv={animation:{Feature:kv},exit:{Feature:class extends o_{constructor(){super(...arguments),this.id=Av++}update(){let{presenceContext:e,prevPresenceContext:t,animationState:n}=this.node;if(!e||!n)return;let{isPresent:r,onExitComplete:i}=e,a=t?.isPresent;if(r===a)return;if(r&&a===!1){if(this.exit===!0){let{initial:e}=this.node.getProps();if(e&&!Array.isArray(e)){let{transition:t,transitionEnd:n,...r}=ah(this.node,e)||{};for(let e in r)this.node.getValue(e)?.jump(r[e])}this.node.blockInitialAnimation=!1,n.reset(),n.animateChanges()}else n.setActive(`exit`,!1);this.exit=void 0;return}let o=this.exit=n.setActive(`exit`,!r);i&&!r&&o.then(()=>{this.exit===o&&(this.exit=!0,i(this.id))})}mount(){let{register:e,onExitComplete:t}=this.node.presenceContext||{};t&&t(this.id),e&&(this.unmount=e(this.id))}unmount(){}}}};function Mv(e){return{point:{x:e.pageX,y:e.pageY}}}function Nv(e,t,n){let{props:r}=e;e.animationState&&r.whileHover&&e.animationState.setActive(`whileHover`,n===`Start`);let i=r[`onHover`+n];i&&Af.postRender(()=>i(t,Mv(t)))}var Pv=class extends o_{mount(){let{current:e}=this.node;e&&(this.unmount=Dg(e,(e,t)=>(Nv(this.node,t,`Start`),e=>Nv(this.node,e,`End`))))}unmount(){}},Fv=class extends o_{constructor(){super(...arguments),this.isActive=!1}onFocus(){let e=!1;try{e=this.node.current.matches(`:focus-visible`)}catch{e=!0}e&&this.node.animationState&&(this.node.animationState.setActive(`whileFocus`,!0),this.isActive=!0)}onBlur(){this.isActive&&this.node.animationState&&(this.node.animationState.setActive(`whileFocus`,!1),this.isActive=!1)}mount(){this.unmount=Mu(w_(this.node.current,`focus`,()=>this.onFocus()),w_(this.node.current,`blur`,()=>this.onBlur()))}unmount(){}};function Iv(e,t,n){let{props:r}=e;if(e.current instanceof HTMLButtonElement&&e.current.disabled)return;e.animationState&&r.whileTap&&e.animationState.setActive(`whileTap`,n===`Start`);let i=r[`onTap`+(n===`End`?``:n)];i&&Af.postRender(()=>i(t,Mv(t)))}var Lv=class extends o_{mount(){let{current:e}=this.node;if(!e)return;let{globalTapTarget:t,propagate:n}=this.node.props;this.unmount=Rg(e,(e,t)=>(Iv(this.node,t,`Start`),(e,{success:t})=>Iv(this.node,e,t?`End`:`Cancel`)),{useGlobalTarget:t,stopPropagation:n?.tap===!1})}unmount(){}},Rv=new WeakMap,zv=new WeakMap,Bv=e=>{let t=Rv.get(e.target);t&&t(e)},Vv=e=>{e.forEach(Bv)};function Hv({root:e,...t}){let n=e||document;zv.has(n)||zv.set(n,{});let r=zv.get(n),i=JSON.stringify(t);return r[i]||(r[i]=new IntersectionObserver(Vv,{root:e,...t})),r[i]}function Uv(e,t,n){let r=Hv(t);return Rv.set(e,n),r.observe(e),()=>{Rv.delete(e),r.unobserve(e)}}var Wv={some:0,all:1},Gv=class extends o_{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.stopObserver?.();let{viewport:e={}}=this.node.getProps(),{root:t,margin:n,amount:r=`some`,once:i}=e,a={root:t?t.current:void 0,rootMargin:n,threshold:typeof r==`number`?r:Wv[r]},o=e=>{let{isIntersecting:t}=e;if(this.isInView===t||(this.isInView=t,i&&!t&&this.hasEnteredView))return;t&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive(`whileInView`,t);let{onViewportEnter:n,onViewportLeave:r}=this.node.getProps(),a=t?n:r;a&&a(e)};this.stopObserver=Uv(this.node.current,a,o)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>`u`)return;let{props:e,prevProps:t}=this.node;[`amount`,`margin`,`root`].some(Kv(e,t))&&this.startObserver()}unmount(){this.stopObserver?.(),this.hasEnteredView=!1,this.isInView=!1}};function Kv({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}var qv={inView:{Feature:Gv},tap:{Feature:Lv},focus:{Feature:Fv},hover:{Feature:Pv}};function Jv(e){return(0,g.useEffect)(()=>()=>e(),[])}var Yv={renderer:Ov,...jv,...qv};function Xv(e){let t=bu(()=>Um(e)),{isStatic:n}=(0,g.useContext)(E_);if(n){let[,n]=(0,g.useState)(e);(0,g.useEffect)(()=>t.on(`change`,n),[])}return t}function Zv(e,t){let n=Xv(t()),r=()=>n.set(t());return r(),xu(()=>{let t=()=>Af.preRender(r,!1,!0),n=e.map(e=>e.on(`change`,t));return()=>{n.forEach(e=>e()),jf(r)}}),n}function Qv(e){Vm.current=[],e();let t=Zv(Vm.current,e);return Vm.current=void 0,t}function $v(e,t,n,r){if(typeof e==`function`)return Qv(e);if(n!==void 0&&!Array.isArray(n)&&typeof t!=`function`)return ty(e,t,n,r);let i=typeof t==`function`?t:zg(t,n,r),a=Array.isArray(e)?ey(e,i):ey([e],([e])=>i(e)),o=Array.isArray(e)?void 0:e.accelerate;if(o&&!o.isTransformed&&typeof t!=`function`&&Array.isArray(n)&&r?.clamp!==!1){let e=r?.ease;a.accelerate={...o,times:[0,...t,1],keyframes:[n[0],...n,n[n.length-1]],isTransformed:!0,...e?{ease:Array.isArray(e)?[e[0],...e]:e}:{}}}return a}function ey(e,t){let n=bu(()=>[]);return Zv(e,()=>{n.length=0;let r=e.length;for(let t=0;t<r;t++)n[t]=e[t].get();return t(n)})}function ty(e,t,n,r){let i=bu(()=>Object.keys(n)),a=bu(()=>({}));for(let o of i)a[o]=$v(e,t,n[o],r);return a}function ny(){!Zg.current&&$g();let[e]=(0,g.useState)(Xg.current);return e}function ry(){let e=ny(),{reducedMotion:t}=(0,g.useContext)(E_);return t===`never`?!1:t===`always`||e}function iy(e){return typeof e==`object`&&!Array.isArray(e)}function ay(e,t,n,r){return e==null?[]:typeof e==`string`&&iy(t)?Vh(e,n,r):e instanceof NodeList?Array.from(e):Array.isArray(e)?e.filter(e=>e!=null):[e]}function oy(e,t,n){return e*(t+1)+n*t}function sy(e,t,n,r){return typeof t==`number`?t:t.startsWith(`-`)||t.startsWith(`+`)?Math.max(0,e+parseFloat(t)):t===`<`?n:t.startsWith(`<`)?Math.max(0,n+parseFloat(t.slice(1))):r.get(t)??e}function cy(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];i.at>t&&i.at<n&&(wu(e,i),r--)}}function ly(e,t,n,r,i,a){cy(e,i,a);for(let o=0;o<t.length;o++)e.push({value:t[o],at:lf(i,a,r[o]),easing:rd(n,o)})}function uy(e,t,n=0){let r=t+1+t*n;for(let t=0;t<e.length;t++)e[t]=e[t]/r}function dy(e,t){return e.at===t.at?e.value===null?1:t.value===null?-1:0:e.at-t.at}var fy=`easeInOut`,py=20;function my(e,{defaultTransition:t={},...n}={},r,i){let a=t.duration||.3,o=new Map,s=new Map,c={},l=new Map,u=0,d=0,f=0;for(let n=0;n<e.length;n++){let o=e[n];if(typeof o==`string`){l.set(o,d);continue}if(!Array.isArray(o)){l.set(o.name,sy(d,o.at,u,l));continue}let[p,m,h={}]=o;h.at!==void 0&&(d=sy(d,h.at,u,l));let g=0,_=(e,n,r,o=0,s=0)=>{let c=_y(e),{delay:l=0,times:u=ep(c),type:p=t.type||`keyframes`,repeat:m,repeatType:h,repeatDelay:_=0,...v}=n,{ease:y=t.ease||`easeOut`,duration:b}=n,x=typeof l==`function`?l(o,s):l,S=c.length,C=hm(p)?p:i?.[p||`keyframes`];if(S<=2&&C){let e=100;if(S===2&&by(c)){let t=c[1]-c[0];e=Math.abs(t)}let n={...t,...v};b!==void 0&&(n.duration=Fu(b));let r=Lf(n,e,C);y=r.ease,b=r.duration}b??=a;let w=d+x;u.length===1&&u[0]===0&&(u[1]=1);let T=u.length-c.length;if(T>0&&$f(u,T),c.length===1&&c.unshift(null),m&&`${m}${py}`,m&&m<py){let e=b>0?_/b:0;b=oy(b,m,_);let t=[...c],n=[...u];y=Array.isArray(y)?[...y]:[y];let r=[...y],i=h===`reverse`||h===`mirror`,a=t,o=r;i&&(a=[...t].reverse(),h===`reverse`&&(o=[...r].reverse().map(e=>typeof e==`function`?Gu(e):e)));for(let s=0;s<m;s++){let l=i&&s%2==0,d=l?a:t,f=l?o:r,p=(s+1)*(1+e);e>0&&(c.push(c[c.length-1]),u.push(p),y.push(`linear`)),c.push(...d);for(let e=0;e<d.length;e++)u.push(n[e]+p),y.push(e===0?`linear`:rd(f,e-1))}uy(u,m,e)}let E=w+b;ly(r,c,y,u,w,E),g=Math.max(x+b,g),f=Math.max(E,f)};if(fh(p)){let e=hy(p,s);_(m,h,gy(`default`,e))}else{let e=ay(p,m,r,c),t=e.length;for(let n=0;n<t;n++){m=m,h=h;let r=e[n],i=hy(r,s);for(let e in m)_(m[e],vy(h,e),gy(e,i),n,t)}}u=d,d+=g}return s.forEach((e,r)=>{for(let i in e){let a=e[i];a.sort(dy);let s=[],c=[],l=[];for(let e=0;e<a.length;e++){let{at:t,value:n,easing:r}=a[e];s.push(n),c.push(Nu(0,f,t)),l.push(r||`easeOut`)}c[0]!==0&&(c.unshift(0),s.unshift(s[0]),l.unshift(fy)),c[c.length-1]!==1&&(c.push(1),s.push(null)),o.has(r)||o.set(r,{keyframes:{},transition:{}});let u=o.get(r);u.keyframes[i]=s;let{type:d,...p}=t;u.transition[i]={...p,duration:f,ease:l,times:c,...n}}}),o}function hy(e,t){return!t.has(e)&&t.set(e,{}),t.get(e)}function gy(e,t){return t[e]||(t[e]=[]),t[e]}function _y(e){return Array.isArray(e)?e:[e]}function vy(e,t){return e&&e[t]?{...e,...e[t]}:{...e}}var yy=e=>typeof e==`number`,by=e=>e.every(yy);function xy(e,t){return fh(e)||typeof e==`number`||typeof e==`string`&&!iy(t)}function Sy(e,t,n,r){let i=[];if(xy(e,t))i.push(C_(e,iy(t)&&t.default||t,n&&(n.default||n)));else{if(e==null)return i;let a=ay(e,t,r),o=a.length;for(let e=0;e<o;e++){let r=a[e],s={...n};`delay`in s&&typeof s.delay==`function`&&(s.delay=s.delay(e,o)),r instanceof Element?i.push(...yg(r,t,s,Hg.get(r))):i.push(...Ih(Ph(r)??bg,r,t,s))}}return i}function Cy(e,t,n){let r=[];return my(e.map(e=>{if(Array.isArray(e)&&typeof e[0]==`function`){let t=e[0],n=Um(0);return n.on(`change`,t),e.length===1?[n,[0,1]]:e.length===2?[n,[0,1],e[1]]:[n,e[1],e[2]]}return e}),t,n,{spring:Yf}).forEach(({keyframes:e,transition:t},n)=>{r.push(...Sy(n,e,t))}),r}function wy(e){return Array.isArray(e)&&e.some(Array.isArray)}function Ty(e={}){let{scope:t,reduceMotion:n,skipAnimations:r}=e;function i(e,i,a){let o=[],s,c={};if(n!==void 0&&(c.reduceMotion=n),r!==void 0&&(c.skipAnimations=r),wy(e)){let{onComplete:n,...r}=i||{};typeof n==`function`&&(s=n),o=Cy(e,{...c,...r},t)}else{let{onComplete:n,...r}=a||{};typeof n==`function`&&(s=n),o=Sy(e,i,{...c,...r},t)}let l=new Lm(o);return s&&l.finished.then(s),t&&(t.animations.push(l),l.finished.then(()=>{wu(t.animations,l)})),l}return i}var Ey=Object.assign(Ty(),{addEffect:Mh,removeEffect:Nh});function Dy(){let e=bu(()=>({current:null,animations:[]})),t=ry()??void 0,{skipAnimations:n}=(0,g.useContext)(E_),r=(0,g.useMemo)(()=>Ty({scope:e,reduceMotion:t,skipAnimations:n}),[e,t,n]);return Jv(()=>{e.animations.forEach(e=>e.stop()),e.animations.length=0}),[e,r]}var Oy=Dv,ky=(0,g.createContext)({disableAnimations:!1});function Ay(){return(0,g.use)(ky)}var jy=`(prefers-reduced-motion: reduce)`;function My(){let e=tu(jy),{disableAnimations:t}=Ay();return t||e}var Ny=`text-[2.5rem]`,Py={indicator:`text-primary`,track:`text-primary-soft`},Fy={indicator:`text-current`,track:`text-current/20`};function Iy({colors:e,reduced:t}){return(0,J.jsxs)(`svg`,{width:`1em`,height:`1em`,viewBox:`0 0 40 40`,fill:`none`,stroke:`currentColor`,strokeWidth:`4`,strokeLinecap:`round`,"aria-hidden":`true`,className:Z(`size-[1em] stroke-4!`,e.indicator),children:[(0,J.jsx)(`circle`,{cx:`20`,cy:`20`,r:`16`,className:e.track}),t?(0,J.jsx)(`circle`,{cx:`20`,cy:`20`,r:`16`,pathLength:1,strokeDasharray:`0.25 0.75`}):(0,J.jsx)(Oy.circle,{cx:`20`,cy:`20`,r:`16`,pathLength:1,strokeDasharray:`0.25 0.75`,initial:{strokeDashoffset:0},animate:{strokeDashoffset:-1},transition:{duration:.9,repeat:1/0,ease:`linear`}})]})}var Ly=12,Ry=1.2;function zy({colors:e,reduced:t}){return(0,J.jsx)(`svg`,{width:`1em`,height:`1em`,viewBox:`0 0 40 40`,fill:`currentColor`,"aria-hidden":`true`,className:Z(`size-[1em]`,e.indicator),children:Array.from({length:Ly},(e,n)=>{let r={x:18,y:2,width:4,height:6,rx:2,transform:`rotate(${360/Ly*n} 20 20)`};return t?(0,J.jsx)(`rect`,{...r,opacity:.25},n):(0,J.jsx)(Oy.rect,{...r,initial:{opacity:0},animate:{opacity:[0,1,.5,0]},transition:{duration:Ry,repeat:1/0,ease:`linear`,delay:n/Ly*Ry-Ry,times:[0,.1,.5,1]}},n)})})}var By=`M12.846 3.581C12.711 3.231 12.375 3 12 3C11.625 3 11.278 3.263 11.154 3.581C10.604 5.011 10.054 6.442 9.504 7.872C8.752 8.16 8.159 8.752 7.871 9.504C6.441 10.054 5.011 10.604 3.581 11.154C3.41 11.22 3.263 11.336 3.159 11.487C3.055 11.638 3 11.817 3 12C3 12.183 3.056 12.362 3.159 12.513C3.262 12.664 3.41 12.78 3.581 12.846C5.011 13.396 6.442 13.946 7.872 14.496C8.16 15.248 8.752 15.841 9.504 16.129C10.054 17.559 10.604 18.989 11.154 20.419C11.22 20.59 11.336 20.737 11.487 20.841C11.638 20.945 11.817 21 12 21C12.183 21 12.362 20.945 12.513 20.841C12.664 20.737 12.78 20.59 12.846 20.419C13.396 18.989 13.946 17.559 14.496 16.129C15.248 15.841 15.841 15.248 16.129 14.496C17.559 13.946 18.989 13.396 20.419 12.846C20.59 12.78 20.737 12.664 20.841 12.513C20.945 12.362 21 12.183 21 12C21 11.817 20.945 11.638 20.841 11.487C20.737 11.336 20.59 11.22 20.419 11.154C18.989 10.604 17.559 10.054 16.129 9.504C15.841 8.752 15.248 8.16 14.496 7.871C13.946 6.441 13.396 5.011 12.846 3.581Z`,Vy=`M12.704 5C12.469 5 12.235 5 12 5C11.765 5 11.531 5 11.296 5C10.161 5.053 9.025 5.106 7.889 5.159C6.979 6.069 6.069 6.979 5.159 7.889C5.106 9.025 5.053 10.161 5 11.296C5 11.395 5 11.494 5 11.593C5 11.729 5 11.864 5 12C5 12.136 5 12.271 5 12.407C5 12.506 5 12.605 5 12.704C5.053 13.839 5.106 14.975 5.159 16.111C6.069 17.021 6.979 17.931 7.889 18.841C9.025 18.894 10.161 18.947 11.296 19C11.395 19 11.494 19 11.593 19C11.729 19 11.864 19 12 19C12.136 19 12.271 19 12.407 19C12.506 19 12.605 19 12.704 19C13.839 18.947 14.975 18.894 16.111 18.841C17.021 17.931 17.931 17.021 18.841 16.111C18.894 14.975 18.947 13.839 19 12.704C19 12.605 19 12.506 19 12.407C19 12.271 19 12.136 19 12C19 11.864 19 11.729 19 11.593C19 11.494 19 11.395 19 11.296C18.947 10.161 18.894 9.025 18.841 7.889C17.931 6.979 17.021 6.069 16.111 5.159C14.975 5.106 13.839 5.053 12.704 5Z`;function Hy(e){return e.match(/-?\d+(?:\.\d+)?/g)?.map(Number)??[]}var Uy=Hy(By),Wy=Hy(Vy),Gy=(Uy.length-2)/6;function Ky(e){let t=`M${e[0]} ${e[1]}`;for(let n=0;n<Gy;n++){let r=2+n*6;t+=`C${e[r]} ${e[r+1]} ${e[r+2]} ${e[r+3]} ${e[r+4]} ${e[r+5]}`}return t+`Z`}function qy(e,t,n){return e+(t-e)*n}function Jy(e){return e<.5?2*e*e:1-(-2*e+2)**2/2}var Yy=2.5,Xy=.4;function Zy({colors:e,reduced:t}){let n=Xv(0);g.useEffect(()=>{if(t)return;let e=Ey(n,1,{duration:Yy,repeat:1/0,ease:`linear`});return()=>e.stop()},[t,n]);let r=$v(n,e=>{if(e<Xy/2){let t=Jy(e/(Xy/2));return Ky(Uy.map((e,n)=>qy(e,Wy[n],t)))}if(e<Xy){let t=Jy((e-Xy/2)/(Xy/2));return Ky(Wy.map((e,n)=>qy(e,Uy[n],t)))}return By}),i=$v(n,e=>e<Xy?Jy(e/Xy)*360:360);return(0,J.jsx)(`svg`,{width:`1em`,height:`1em`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinejoin:`round`,strokeLinecap:`round`,"aria-hidden":`true`,className:Z(`size-[1em]`,e.indicator),children:t?(0,J.jsx)(`path`,{d:By}):(0,J.jsx)(Oy.path,{d:r,style:{transformOrigin:`12px 12px`,rotate:i}})})}var Qy={circular:Iy,dots:zy,sparkle:Zy};function $y({variant:e=`circular`,currentColor:t=!1,"aria-label":n=`Loading`,className:r,...i}){let a=My(),o=t?Fy:Py,s=Qy[e],c=(0,J.jsx)(s,{colors:o,reduced:a});return(0,J.jsx)(`span`,{"data-slot":`spinner`,role:`status`,"aria-label":n,className:Z(`inline-flex shrink-0 items-center justify-center align-middle`,Ny,r),...i,children:a?c:(0,J.jsx)(W_,{features:Yv,strict:!0,children:c})})}function eb(e,{storage:t=`local`}={}){let[n,r,i]=$l(t,e,``,{serializer:e=>e,deserializer:e=>e}),a=n!==`1`,o=(0,g.useCallback)(()=>r(`1`),[r]),s=(0,g.useCallback)(()=>i(),[i]);return(0,g.useMemo)(()=>({open:a,dismiss:o,reset:s}),[a,o,s])}var tb=Sl(Z(`group/alert relative rounded-xl border p-5 text-foreground backdrop-blur-xl`,`grid w-full items-start`,`[grid-template-columns:auto_1fr_auto] [grid-template-areas:'icon_title_close'_'._description_.'_'._actions_actions']`,`@min-[460px]:data-[layout=inline]:items-center`,`@min-[460px]:data-[layout=inline]:[grid-template-columns:auto_auto_1fr_auto_auto]`,`@min-[460px]:data-[layout=inline]:[grid-template-areas:'icon_title_description_actions_close']`),{variants:{variant:{default:`bg-background border-border`,primary:`bg-primary-subtle border-primary-soft`,secondary:`bg-secondary-subtle border-secondary-soft`,error:`bg-error-subtle border-error-soft`,success:`bg-success-subtle border-success-soft`,warning:`bg-warning-subtle border-warning-soft`,info:`bg-info-subtle border-info-soft`}},defaultVariants:{variant:`default`}}),nb={default:`text-foreground-intense`,primary:`text-primary`,secondary:`text-secondary-emphasis`,error:`text-error-emphasis`,success:`text-success-emphasis`,warning:`text-warning-emphasis`,info:`text-info-emphasis`},rb=g.createContext(`default`),ib={opacity:0,scale:.88,filter:`blur(12px)`,height:0},ab={opacity:0},ob={default:{duration:.32,ease:[.4,0,.2,1]},height:{duration:.3,ease:[.4,0,.2,1],delay:.18}};function sb({variant:e,layout:t=`block`,dismissible:n=!1,open:r,onOpenChange:i,persistKey:a,persistStorage:o=`local`,closeLabel:s=`Dismiss`,role:c=`alert`,className:l,children:u,style:d,...f}){let p=My(),[m,h]=g.useState(!0),_=eb(a??``,{storage:o}),v=r!==void 0,y=!v&&a!=null,b=v?r:y?_.open:m,x=g.useCallback(()=>{if(v){i?.(!1);return}y?_.dismiss():h(!1),i?.(!1)},[v,y,_,i]);return(0,J.jsx)(rb.Provider,{value:e??`default`,children:(0,J.jsx)(W_,{features:Yv,strict:!0,children:(0,J.jsx)(L_,{initial:!1,children:b&&(0,J.jsx)(Oy.div,{initial:!1,exit:p?ab:ib,transition:p?{duration:0}:ob,className:`@container overflow-hidden`,children:(0,J.jsxs)(`div`,{role:c,"data-slot":`alert`,"data-layout":t,style:d,className:Z(tb({variant:e}),l),...f,children:[u,n&&(0,J.jsx)(`button`,{type:`button`,"aria-label":s,"data-slot":`alert-close`,onClick:x,className:Z(`text-foreground-muted cursor-pointer rounded-md p-1 transition-colors outline-none [grid-area:close]`,`hover:text-foreground-intense`,`focus-visible:ring-ring focus-visible:ring-2`,`self-start @min-[460px]:group-data-[layout=inline]/alert:self-center`,`ms-3 -me-1 -mt-1 @min-[460px]:group-data-[layout=inline]/alert:my-0`),children:(0,J.jsx)(cb,{})})]})},`alert`)})})})}function cb(){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 16 16`,fill:`currentColor`,"aria-hidden":`true`,className:`size-4`,children:(0,J.jsx)(`path`,{d:`M11.523 3.522c.264-.264.691-.264.955 0s.264.691 0 .955L8.955 8l3.522 3.522c.264.264.264.691 0 .955s-.691.264-.955 0L8 8.955l-3.522 3.522c-.264.264-.691.264-.955 0s-.264-.691 0-.955L7.045 8 3.522 4.478c-.264-.264-.264-.691 0-.955s.691-.264.955 0L8 7.045l3.523-3.522z`})})}function lb({className:e,...t}){let n=g.useContext(rb);return(0,J.jsx)(`span`,{"data-slot":`alert-icon`,className:Z(`me-3 flex h-lh shrink-0 items-center [grid-area:icon] [&_svg:not([class*='size-'])]:size-5`,nb[n],e),...t})}function ub({className:e,as:t=`h5`,...n}){return(0,J.jsx)(t,{"data-slot":`alert-title`,className:Z(`text-foreground-intense self-center font-semibold [grid-area:title]`,`text-base @min-[460px]:group-data-[layout=inline]/alert:me-3 @min-[460px]:group-data-[layout=inline]/alert:text-sm`,e),...n})}function db({className:e,...t}){return(0,J.jsx)(`p`,{"data-slot":`alert-description`,className:Z(`text-foreground text-sm [grid-area:description]`,`mt-2 @min-[460px]:group-data-[layout=inline]/alert:mt-0`,e),...t})}var fb=`zh-Hans`;function pb(e){let t=String(e??``).trim().replace(/_/g,`-`).toLowerCase();if(!t)return null;let n=t.split(`-`),r=n[0];return r===`zh`?n.slice(1).some(e=>e===`hant`||e===`tw`||e===`hk`||e===`mo`)?`zh-Hant`:`zh-Hans`:r===`en`?`en`:r===`ja`?`ja`:r===`ko`?`ko`:null}var mb=null;function hb(){try{let e=typeof navigator>`u`?null:navigator;if(!e)return[];if(Array.isArray(e.languages)&&e.languages.length>0)return e.languages;if(typeof e.language==`string`&&e.language)return[e.language]}catch{}return[]}function gb(){if(mb)return mb;for(let e of hb()){let t=pb(e);if(t)return mb=t,mb}return mb=`en`,mb}function _b(e,t){return t?e.replace(/\{([a-zA-Z0-9_]+)\}/g,(e,n)=>{let r=t[n];return r==null?e:String(r)}):e}function vb(e){let t={};for(let n of e)Object.assign(t,n);return t}function yb(e,t,n,r){let i=e[t]?.[n]||e[fb]?.[n];return typeof i!=`string`||i.length===0?n:_b(i,r)}var bb=[{"zh-Hans":{"panel.common.show":`显示`,"panel.common.hide":`隐藏`,"panel.common.close":`关闭`,"panel.common.none":`暂无`,"panel.common.cores":`核`,"panel.shell.deviceAllowed":`已允许新设备绑定。`,"panel.shell.deviceDenied":`已停止接收新设备,已绑定的手机照常可用。`},"zh-Hant":{"panel.common.show":`顯示`,"panel.common.hide":`隱藏`,"panel.common.close":`關閉`,"panel.common.none":`暫無`,"panel.common.cores":`核`,"panel.shell.deviceAllowed":`已允許新裝置綁定。`,"panel.shell.deviceDenied":`已停止接收新裝置,已綁定的手機照常可用。`},en:{"panel.common.show":`Show`,"panel.common.hide":`Hide`,"panel.common.close":`Close`,"panel.common.none":`None`,"panel.common.cores":`cores`,"panel.shell.deviceAllowed":`New devices can pair now.`,"panel.shell.deviceDenied":`New devices are refused; phones already paired keep working.`},ja:{"panel.common.show":`表示`,"panel.common.hide":`隠す`,"panel.common.close":`閉じる`,"panel.common.none":`なし`,"panel.common.cores":`コア`,"panel.shell.deviceAllowed":`新しいデバイスのペアリングを許可しました。`,"panel.shell.deviceDenied":`新しいデバイスの受け付けを停止しました。既にペアリング済みのスマートフォンはそのまま使えます。`},ko:{"panel.common.show":`표시`,"panel.common.hide":`숨기기`,"panel.common.close":`닫기`,"panel.common.none":`없음`,"panel.common.cores":`코어`,"panel.shell.deviceAllowed":`새 기기 페어링을 허용했습니다.`,"panel.shell.deviceDenied":`새 기기 수신을 중지했습니다. 이미 페어링된 휴대폰은 그대로 사용할 수 있습니다.`}},{"zh-Hans":{"panel.status.connected":`已连接`,"panel.status.connecting":`连接中`,"panel.status.error":`被关闭`,"panel.status.off":`未启用`,"panel.lan.off":`未启用`,"panel.lan.listening":`正在监听`,"panel.lan.error":`启动失败`,"panel.sidecar.healthy":`运行中`,"panel.sidecar.starting":`启动中`,"panel.sidecar.restarting":`正在重启`,"panel.sidecar.error":`异常`,"panel.sidecar.stopped":`已停止`,"panel.ago.justNow":`刚刚`,"panel.ago.minutes":`{count} 分钟前`,"panel.ago.hours":`{count} 小时前`,"panel.ago.days":`{count} 天前`,"panel.shell.deviceAllowed":`已允许新设备绑定。`,"panel.shell.deviceDenied":`已停止接收新设备,已绑定的手机照常可用。`},"zh-Hant":{"panel.status.connected":`已連線`,"panel.status.connecting":`連線中`,"panel.status.error":`被關閉`,"panel.status.off":`未啟用`,"panel.lan.off":`未啟用`,"panel.lan.listening":`正在監聽`,"panel.lan.error":`啟動失敗`,"panel.sidecar.healthy":`執行中`,"panel.sidecar.starting":`啟動中`,"panel.sidecar.restarting":`正在重新啟動`,"panel.sidecar.error":`異常`,"panel.sidecar.stopped":`已停止`,"panel.ago.justNow":`剛剛`,"panel.ago.minutes":`{count} 分鐘前`,"panel.ago.hours":`{count} 小時前`,"panel.ago.days":`{count} 天前`,"panel.shell.deviceAllowed":`已允許新裝置綁定。`,"panel.shell.deviceDenied":`已停止接收新裝置,已綁定的手機照常可用。`},en:{"panel.status.connected":`Connected`,"panel.status.connecting":`Connecting`,"panel.status.error":`Shut down`,"panel.status.off":`Off`,"panel.lan.off":`Off`,"panel.lan.listening":`Listening`,"panel.lan.error":`Failed to start`,"panel.sidecar.healthy":`Running`,"panel.sidecar.starting":`Starting`,"panel.sidecar.restarting":`Restarting`,"panel.sidecar.error":`Error`,"panel.sidecar.stopped":`Stopped`,"panel.ago.justNow":`just now`,"panel.ago.minutes":`{count} min ago`,"panel.ago.hours":`{count} h ago`,"panel.ago.days":`{count} d ago`,"panel.shell.deviceAllowed":`New devices can pair now.`,"panel.shell.deviceDenied":`New devices are refused; phones already paired keep working.`},ja:{"panel.status.connected":`接続済み`,"panel.status.connecting":`接続中`,"panel.status.error":`閉じられました`,"panel.status.off":`オフ`,"panel.lan.off":`オフ`,"panel.lan.listening":`待ち受け中`,"panel.lan.error":`起動に失敗`,"panel.sidecar.healthy":`実行中`,"panel.sidecar.starting":`起動中`,"panel.sidecar.restarting":`再起動中`,"panel.sidecar.error":`異常`,"panel.sidecar.stopped":`停止済み`,"panel.ago.justNow":`たった今`,"panel.ago.minutes":`{count} 分前`,"panel.ago.hours":`{count} 時間前`,"panel.ago.days":`{count} 日前`,"panel.shell.deviceAllowed":`新しいデバイスのペアリングを許可しました。`,"panel.shell.deviceDenied":`新しいデバイスの受け付けを停止しました。既にペアリング済みのスマートフォンはそのまま使えます。`},ko:{"panel.status.connected":`연결됨`,"panel.status.connecting":`연결 중`,"panel.status.error":`종료됨`,"panel.status.off":`꺼짐`,"panel.lan.off":`꺼짐`,"panel.lan.listening":`수신 대기 중`,"panel.lan.error":`시작 실패`,"panel.sidecar.healthy":`실행 중`,"panel.sidecar.starting":`시작 중`,"panel.sidecar.restarting":`재시작 중`,"panel.sidecar.error":`오류`,"panel.sidecar.stopped":`중지됨`,"panel.ago.justNow":`방금`,"panel.ago.minutes":`{count}분 전`,"panel.ago.hours":`{count}시간 전`,"panel.ago.days":`{count}일 전`,"panel.shell.deviceAllowed":`새 기기 페어링을 허용했습니다.`,"panel.shell.deviceDenied":`새 기기 수신을 중지했습니다. 이미 페어링된 휴대폰은 그대로 사용할 수 있습니다.`}},{"zh-Hans":{"panel.shell.remoteEnabled":`已启用远程控制。`,"panel.shell.remoteDisabled":`已停用远程控制,手机将断开。`,"panel.shell.pairingRegenerated":`配对码已重新生成,之前截图的二维码作废。`,"panel.shell.reconnecting":`已发起重连。`,"panel.shell.sidecarRestarted":`旁挂进程已重启。`,"panel.shell.revokeConfirm":`吊销全部设备授权?所有手机都要重新配对,这一步不能撤销。`,"panel.shell.revoked":`已吊销 {count} 个授权`,"panel.shell.revokedRelay":`(中转侧 {count} 个)`,"panel.shell.configSaved":`配置已保存。`,"panel.shell.lanSaved":`局域网配置已保存。`,"panel.shell.preferredAddress":`手机优先使用 {address}。`,"panel.shell.preferredAuto":`已改回按网卡顺序自动选。`,"panel.shell.unknownVersion":`未知版本`,"panel.shell.title":`移动端`,"panel.shell.subtitle":`把手机连上这台电脑上的 DSH`,"panel.shell.statusFailed":`读不到插件状态`,"panel.shell.readingStatus":`正在读取状态…`,"panel.shell.busy":`处理中…`,"panel.shell.deviceAllowed":`已允许新设备绑定。`,"panel.shell.deviceDenied":`已停止接收新设备,已绑定的手机照常可用。`},"zh-Hant":{"panel.shell.remoteEnabled":`已啟用遠端控制。`,"panel.shell.remoteDisabled":`已停用遠端控制,手機將斷開。`,"panel.shell.pairingRegenerated":`配對碼已重新產生,之前截圖的 QR 碼作廢。`,"panel.shell.reconnecting":`已發起重新連線。`,"panel.shell.sidecarRestarted":`旁掛程序已重新啟動。`,"panel.shell.revokeConfirm":`吊銷全部裝置授權?所有手機都要重新配對,這一步不能撤銷。`,"panel.shell.revoked":`已吊銷 {count} 個授權`,"panel.shell.revokedRelay":`(中轉側 {count} 個)`,"panel.shell.configSaved":`設定已儲存。`,"panel.shell.lanSaved":`區域網路設定已儲存。`,"panel.shell.preferredAddress":`手機優先使用 {address}。`,"panel.shell.preferredAuto":`已改回依網卡順序自動選。`,"panel.shell.unknownVersion":`未知版本`,"panel.shell.title":`行動端`,"panel.shell.subtitle":`把手機連上這台電腦上的 DSH`,"panel.shell.statusFailed":`讀不到外掛狀態`,"panel.shell.readingStatus":`正在讀取狀態…`,"panel.shell.busy":`處理中…`,"panel.shell.deviceAllowed":`已允許新裝置綁定。`,"panel.shell.deviceDenied":`已停止接收新裝置,已綁定的手機照常可用。`},en:{"panel.shell.remoteEnabled":`Remote control enabled.`,"panel.shell.remoteDisabled":`Remote control disabled — your phone will disconnect.`,"panel.shell.pairingRegenerated":`Pairing code regenerated; previously screenshotted QR codes no longer work.`,"panel.shell.reconnecting":`Reconnecting.`,"panel.shell.sidecarRestarted":`Sidecar process restarted.`,"panel.shell.revokeConfirm":`Revoke all device authorisations? Every phone has to be paired again, and this cannot be undone.`,"panel.shell.revoked":`Revoked {count} authorisation(s)`,"panel.shell.revokedRelay":` ({count} on the relay)`,"panel.shell.configSaved":`Configuration saved.`,"panel.shell.lanSaved":`Local-network settings saved.`,"panel.shell.preferredAddress":`Your phone will prefer {address}.`,"panel.shell.preferredAuto":`Back to automatic order by network interface.`,"panel.shell.unknownVersion":`Unknown version`,"panel.shell.title":`Mobile`,"panel.shell.subtitle":`Connect your phone to DSH on this computer`,"panel.shell.statusFailed":`Could not read plugin status`,"panel.shell.readingStatus":`Reading status…`,"panel.shell.busy":`Working…`,"panel.shell.deviceAllowed":`New devices can pair now.`,"panel.shell.deviceDenied":`New devices are refused; phones already paired keep working.`},ja:{"panel.shell.remoteEnabled":`リモート操作をオンにしました。`,"panel.shell.remoteDisabled":`リモート操作をオフにしました。スマートフォンは切断されます。`,"panel.shell.pairingRegenerated":`ペアリングコードを再生成しました。以前スクリーンショットした QR コードは無効です。`,"panel.shell.reconnecting":`再接続を開始しました。`,"panel.shell.sidecarRestarted":`サイドカープロセスを再起動しました。`,"panel.shell.revokeConfirm":`すべてのデバイス認証を取り消しますか?すべてのスマートフォンで再ペアリングが必要になり、元に戻せません。`,"panel.shell.revoked":`{count} 件の認証を取り消しました`,"panel.shell.revokedRelay":`(リレー側 {count} 件)`,"panel.shell.configSaved":`設定を保存しました。`,"panel.shell.lanSaved":`LAN 設定を保存しました。`,"panel.shell.preferredAddress":`スマートフォンは {address} を優先します。`,"panel.shell.preferredAuto":`ネットワークインターフェース順の自動選択に戻しました。`,"panel.shell.unknownVersion":`不明なバージョン`,"panel.shell.title":`モバイル`,"panel.shell.subtitle":`このパソコンの DSH にスマートフォンをつなぐ`,"panel.shell.statusFailed":`プラグインの状態を取得できません`,"panel.shell.readingStatus":`状態を読み込み中…`,"panel.shell.busy":`処理中…`,"panel.shell.deviceAllowed":`新しいデバイスのペアリングを許可しました。`,"panel.shell.deviceDenied":`新しいデバイスの受け付けを停止しました。既にペアリング済みのスマートフォンはそのまま使えます。`},ko:{"panel.shell.remoteEnabled":`원격 제어를 켰습니다.`,"panel.shell.remoteDisabled":`원격 제어를 껐습니다. 휴대폰 연결이 끊깁니다.`,"panel.shell.pairingRegenerated":`페어링 코드를 재생성했습니다. 이전에 캡처한 QR 코드는 무효입니다.`,"panel.shell.reconnecting":`재연결을 시작했습니다.`,"panel.shell.sidecarRestarted":`사이드카 프로세스를 재시작했습니다.`,"panel.shell.revokeConfirm":`모든 기기 인증을 취소할까요? 모든 휴대폰을 다시 페어링해야 하며 되돌릴 수 없습니다.`,"panel.shell.revoked":`인증 {count}개를 취소했습니다`,"panel.shell.revokedRelay":` (릴레이 측 {count}개)`,"panel.shell.configSaved":`설정을 저장했습니다.`,"panel.shell.lanSaved":`LAN 설정을 저장했습니다.`,"panel.shell.preferredAddress":`휴대폰이 {address}을(를) 우선 사용합니다.`,"panel.shell.preferredAuto":`네트워크 인터페이스 순서 자동 선택으로 되돌렸습니다.`,"panel.shell.unknownVersion":`알 수 없는 버전`,"panel.shell.title":`모바일`,"panel.shell.subtitle":`이 컴퓨터의 DSH에 휴대폰을 연결`,"panel.shell.statusFailed":`플러그인 상태를 읽을 수 없습니다`,"panel.shell.readingStatus":`상태를 읽는 중…`,"panel.shell.busy":`처리 중…`,"panel.shell.deviceAllowed":`새 기기 페어링을 허용했습니다.`,"panel.shell.deviceDenied":`새 기기 수신을 중지했습니다. 이미 페어링된 휴대폰은 그대로 사용할 수 있습니다.`}},{"zh-Hans":{"panel.connection.enabled":`已启用`,"panel.connection.disabled":`已停用`,"panel.connection.remoteControl":`远程控制`,"panel.connection.pluginVersion":`插件版本`,"panel.connection.deviceName":`设备名`,"panel.connection.instanceId":`实例 ID`,"panel.connection.platform":`平台`,"panel.connection.relayUrl":`中转地址`,"panel.connection.tunnel":`中转隧道`,"panel.connection.lan":`局域网直连`,"panel.connection.viewLan":`查看局域网直连`,"panel.connection.sidecar":`旁挂进程`,"panel.connection.sidecarRestarts":`已重启 {count} 次`,"panel.connection.mirror":`会话镜像`,"panel.connection.mirrorOk":`推送正常`,"panel.connection.mirrorOff":`未推送`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.connection.enabled":`已啟用`,"panel.connection.disabled":`已停用`,"panel.connection.remoteControl":`遠端控制`,"panel.connection.pluginVersion":`外掛版本`,"panel.connection.deviceName":`裝置名稱`,"panel.connection.instanceId":`實例 ID`,"panel.connection.platform":`平台`,"panel.connection.relayUrl":`中轉位址`,"panel.connection.tunnel":`中轉通道`,"panel.connection.lan":`區域網路直連`,"panel.connection.viewLan":`查看區域網路直連`,"panel.connection.sidecar":`旁掛程序`,"panel.connection.sidecarRestarts":`已重新啟動 {count} 次`,"panel.connection.mirror":`會話鏡像`,"panel.connection.mirrorOk":`推送正常`,"panel.connection.mirrorOff":`未推送`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.connection.enabled":`Enabled`,"panel.connection.disabled":`Disabled`,"panel.connection.remoteControl":`Remote control`,"panel.connection.pluginVersion":`Plugin version`,"panel.connection.deviceName":`Device name`,"panel.connection.instanceId":`Instance ID`,"panel.connection.platform":`Platform`,"panel.connection.relayUrl":`Relay address`,"panel.connection.tunnel":`Relay tunnel`,"panel.connection.lan":`LAN direct`,"panel.connection.viewLan":`View LAN direct`,"panel.connection.sidecar":`Sidecar process`,"panel.connection.sidecarRestarts":`restarted {count} time(s)`,"panel.connection.mirror":`Session mirror`,"panel.connection.mirrorOk":`Pushing`,"panel.connection.mirrorOff":`Not pushing`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.connection.enabled":`有効`,"panel.connection.disabled":`無効`,"panel.connection.remoteControl":`リモート操作`,"panel.connection.pluginVersion":`プラグインのバージョン`,"panel.connection.deviceName":`デバイス名`,"panel.connection.instanceId":`インスタンス ID`,"panel.connection.platform":`プラットフォーム`,"panel.connection.relayUrl":`リレーのアドレス`,"panel.connection.tunnel":`リレートンネル`,"panel.connection.lan":`LAN 直結`,"panel.connection.viewLan":`LAN 直結を見る`,"panel.connection.sidecar":`サイドカープロセス`,"panel.connection.sidecarRestarts":`{count} 回再起動しました`,"panel.connection.mirror":`セッションのミラー`,"panel.connection.mirrorOk":`送信中`,"panel.connection.mirrorOff":`送信していません`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.connection.enabled":`사용 중`,"panel.connection.disabled":`사용 안 함`,"panel.connection.remoteControl":`원격 제어`,"panel.connection.pluginVersion":`플러그인 버전`,"panel.connection.deviceName":`기기 이름`,"panel.connection.instanceId":`인스턴스 ID`,"panel.connection.platform":`플랫폼`,"panel.connection.relayUrl":`릴레이 주소`,"panel.connection.tunnel":`릴레이 터널`,"panel.connection.lan":`LAN 직접 연결`,"panel.connection.viewLan":`LAN 직접 연결 보기`,"panel.connection.sidecar":`사이드카 프로세스`,"panel.connection.sidecarRestarts":`{count}회 재시작됨`,"panel.connection.mirror":`세션 미러`,"panel.connection.mirrorOk":`전송 중`,"panel.connection.mirrorOff":`전송 안 함`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.pairing.policyDeny":`一律拒绝新设备`,"panel.pairing.policyCode":`凭配对码允许`,"panel.pairing.copyCode":`复制配对码`,"panel.pairing.copied":`已复制`,"panel.pairing.noQr":`还没取到二维码`,"panel.pairing.qr":`二维码`,"panel.pairing.policy":`配对策略`,"panel.pairing.port":`局域网端口`,"panel.pairing.phoneAddress":`手机优先用的地址`,"panel.pairing.hidden":`已隐藏`,"panel.pairing.noAddress":`还没取到地址`,"panel.pairing.cardTitle":`配对与二维码`,"panel.pairing.code":`配对码`,"panel.pairing.qrFailed":`拿不到二维码`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.pairing.policyDeny":`一律拒絕新裝置`,"panel.pairing.policyCode":`憑配對碼允許`,"panel.pairing.copyCode":`複製配對碼`,"panel.pairing.copied":`已複製`,"panel.pairing.noQr":`還沒取得 QR 碼`,"panel.pairing.qr":`QR 碼`,"panel.pairing.policy":`配對策略`,"panel.pairing.port":`區域網路連接埠`,"panel.pairing.phoneAddress":`手機優先使用的位址`,"panel.pairing.hidden":`已隱藏`,"panel.pairing.noAddress":`還沒取得位址`,"panel.pairing.cardTitle":`配對與 QR 碼`,"panel.pairing.code":`配對碼`,"panel.pairing.qrFailed":`拿不到 QR 碼`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.pairing.policyDeny":`Refuse all new devices`,"panel.pairing.policyCode":`Allow with pairing code`,"panel.pairing.copyCode":`Copy pairing code`,"panel.pairing.copied":`Copied`,"panel.pairing.noQr":`QR code not loaded yet`,"panel.pairing.qr":`QR code`,"panel.pairing.policy":`Pairing policy`,"panel.pairing.port":`LAN port`,"panel.pairing.phoneAddress":`Address the phone prefers`,"panel.pairing.hidden":`Hidden`,"panel.pairing.noAddress":`Address not available yet`,"panel.pairing.cardTitle":`Pairing & QR code`,"panel.pairing.code":`Pairing code`,"panel.pairing.qrFailed":`Could not get the QR code`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.pairing.policyDeny":`新しいデバイスをすべて拒否`,"panel.pairing.policyCode":`ペアリングコードで許可`,"panel.pairing.copyCode":`ペアリングコードをコピー`,"panel.pairing.copied":`コピーしました`,"panel.pairing.noQr":`QR コードをまだ取得していません`,"panel.pairing.qr":`QR コード`,"panel.pairing.policy":`ペアリングポリシー`,"panel.pairing.port":`LAN ポート`,"panel.pairing.phoneAddress":`スマートフォンが優先して使うアドレス`,"panel.pairing.hidden":`非表示`,"panel.pairing.noAddress":`アドレスをまだ取得していません`,"panel.pairing.cardTitle":`ペアリングと QR コード`,"panel.pairing.code":`ペアリングコード`,"panel.pairing.qrFailed":`QR コードを取得できません`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.pairing.policyDeny":`새 기기 모두 거부`,"panel.pairing.policyCode":`페어링 코드로 허용`,"panel.pairing.copyCode":`페어링 코드 복사`,"panel.pairing.copied":`복사됨`,"panel.pairing.noQr":`QR 코드를 아직 가져오지 못했습니다`,"panel.pairing.qr":`QR 코드`,"panel.pairing.policy":`페어링 정책`,"panel.pairing.port":`LAN 포트`,"panel.pairing.phoneAddress":`휴대폰이 우선 사용할 주소`,"panel.pairing.hidden":`숨김`,"panel.pairing.noAddress":`주소를 아직 가져오지 못했습니다`,"panel.pairing.cardTitle":`페어링 및 QR 코드`,"panel.pairing.code":`페어링 코드`,"panel.pairing.qrFailed":`QR 코드를 가져올 수 없습니다`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.address.lan":`局域网地址`,"panel.address.ipv6":`IPv6 直连`,"panel.address.public":`公网地址`,"panel.address.empty":`还没取到地址`,"panel.address.ipv6Hint":`(手机按实测择优)`,"panel.address.publicHint":`(不在二维码里)`,"panel.address.hint":`手机先试选中的那条,试不通会自动换下一条。`,"panel.address.pick":`手机优先用这条`,"panel.lanDialog.state":`状态`,"panel.lanDialog.port":`当前端口`,"panel.lanDialog.unchanged":`留空表示不改动`,"panel.relay.namePlaceholder":`手机里显示的名字`,"panel.relay.selected":`已选`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.address.lan":`區域網路位址`,"panel.address.ipv6":`IPv6 直連`,"panel.address.public":`公網位址`,"panel.address.empty":`還沒取得位址`,"panel.address.ipv6Hint":`(手機依實測擇優)`,"panel.address.publicHint":`(不在 QR 碼裡)`,"panel.address.hint":`手機先試選中的那條,試不通會自動換下一條。`,"panel.address.pick":`手機優先使用這條`,"panel.lanDialog.state":`狀態`,"panel.lanDialog.port":`目前連接埠`,"panel.lanDialog.unchanged":`留空表示不改動`,"panel.relay.namePlaceholder":`手機裡顯示的名稱`,"panel.relay.selected":`已選`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.address.lan":`LAN address`,"panel.address.ipv6":`IPv6 direct`,"panel.address.public":`Public address`,"panel.address.empty":`Address not available yet`,"panel.address.ipv6Hint":` (phone picks the fastest)`,"panel.address.publicHint":` (not in the QR code)`,"panel.address.hint":`Your phone tries the selected one first and falls back automatically.`,"panel.address.pick":`Prefer this one on the phone`,"panel.lanDialog.state":`Status`,"panel.lanDialog.port":`Current port`,"panel.lanDialog.unchanged":`Leave blank to keep it`,"panel.relay.namePlaceholder":`The name shown on your phone`,"panel.relay.selected":`Selected`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.address.lan":`LAN アドレス`,"panel.address.ipv6":`IPv6 直結`,"panel.address.public":`パブリックアドレス`,"panel.address.empty":`アドレスをまだ取得していません`,"panel.address.ipv6Hint":`(スマートフォンが実測で選択)`,"panel.address.publicHint":`(QR コードには入りません)`,"panel.address.hint":`スマートフォンは選択したものを先に試し、通らなければ自動で次に切り替えます。`,"panel.address.pick":`スマートフォンで優先する`,"panel.lanDialog.state":`状態`,"panel.lanDialog.port":`現在のポート`,"panel.lanDialog.unchanged":`空欄なら変更しません`,"panel.relay.namePlaceholder":`スマートフォンに表示される名前`,"panel.relay.selected":`選択済み`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.address.lan":`LAN 주소`,"panel.address.ipv6":`IPv6 직접 연결`,"panel.address.public":`공인 주소`,"panel.address.empty":`주소를 아직 가져오지 못했습니다`,"panel.address.ipv6Hint":` (휴대폰이 실측으로 선택)`,"panel.address.publicHint":` (QR 코드에 없음)`,"panel.address.hint":`휴대폰은 선택한 주소를 먼저 시도하고, 안 되면 자동으로 다음으로 넘어갑니다.`,"panel.address.pick":`휴대폰에서 우선 사용`,"panel.lanDialog.state":`상태`,"panel.lanDialog.port":`현재 포트`,"panel.lanDialog.unchanged":`비우면 변경하지 않습니다`,"panel.relay.namePlaceholder":`휴대폰에 표시되는 이름`,"panel.relay.selected":`선택됨`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.links.android":`安卓`,"panel.links.apple":`苹果`,"panel.links.distPlatform":`APP 分发平台`,"panel.links.domesticRecommended":`国内下载推荐`,"panel.links.overseasRecommended":`海外下载推荐`,"panel.links.appStore":`正式版,随系统自动更新`,"panel.links.testFlight":`测试版,比商店版先拿到新版本`,"panel.links.publicRelay":`公用中转 1`,"panel.links.wechatQrAlt":`微信群二维码:用微信或企业微信扫码加入`,"panel.links.joinGroup":`加入交流群`,"panel.theme.toDay":`切换到日间模式`,"panel.theme.toNight":`切换到夜间模式`,"panel.net.requestFailed":`请求失败(HTTP {status})`,"panel.net.requestFailedNoStatus":`请求失败`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.links.android":`Android`,"panel.links.apple":`Apple`,"panel.links.distPlatform":`APP 分發平台`,"panel.links.domesticRecommended":`國內下載推薦`,"panel.links.overseasRecommended":`海外下載推薦`,"panel.links.appStore":`正式版,隨系統自動更新`,"panel.links.testFlight":`測試版,比商店版先拿到新版本`,"panel.links.publicRelay":`公用中轉 1`,"panel.links.wechatQrAlt":`微信群 QR 碼:用微信或企業微信掃碼加入`,"panel.links.joinGroup":`加入交流群`,"panel.theme.toDay":`切換到日間模式`,"panel.theme.toNight":`切換到夜間模式`,"panel.net.requestFailed":`請求失敗(HTTP {status})`,"panel.net.requestFailedNoStatus":`請求失敗`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.links.android":`Android`,"panel.links.apple":`Apple`,"panel.links.distPlatform":`App distribution platform`,"panel.links.domesticRecommended":`Recommended in China`,"panel.links.overseasRecommended":`Recommended overseas`,"panel.links.appStore":`Release build, updates with the system`,"panel.links.testFlight":`Beta build, gets new versions before the store`,"panel.links.publicRelay":`Public relay 1`,"panel.links.wechatQrAlt":`WeChat group QR code: scan with WeChat or WeCom`,"panel.links.joinGroup":`Join the group`,"panel.theme.toDay":`Switch to light mode`,"panel.theme.toNight":`Switch to dark mode`,"panel.net.requestFailed":`Request failed (HTTP {status})`,"panel.net.requestFailedNoStatus":`Request failed`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.links.android":`Android`,"panel.links.apple":`Apple`,"panel.links.distPlatform":`アプリ配布プラットフォーム`,"panel.links.domesticRecommended":`中国国内向けの推奨`,"panel.links.overseasRecommended":`海外向けの推奨`,"panel.links.appStore":`正式版。システムと一緒に更新されます`,"panel.links.testFlight":`ベータ版。ストア版より早く新バージョンを取得できます`,"panel.links.publicRelay":`共用リレー 1`,"panel.links.wechatQrAlt":`WeChat グループの QR コード:WeChat または WeCom でスキャン`,"panel.links.joinGroup":`グループに参加`,"panel.theme.toDay":`ライトモードに切り替え`,"panel.theme.toNight":`ダークモードに切り替え`,"panel.net.requestFailed":`リクエストに失敗しました(HTTP {status})`,"panel.net.requestFailedNoStatus":`リクエストに失敗しました`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.links.android":`Android`,"panel.links.apple":`Apple`,"panel.links.distPlatform":`앱 배포 플랫폼`,"panel.links.domesticRecommended":`중국 내 다운로드 권장`,"panel.links.overseasRecommended":`해외 다운로드 권장`,"panel.links.appStore":`정식 버전, 시스템과 함께 자동 업데이트`,"panel.links.testFlight":`베타 버전, 스토어보다 먼저 새 버전 제공`,"panel.links.publicRelay":`공용 릴레이 1`,"panel.links.wechatQrAlt":`WeChat 그룹 QR 코드: WeChat 또는 WeCom으로 스캔`,"panel.links.joinGroup":`그룹 참여`,"panel.theme.toDay":`라이트 모드로 전환`,"panel.theme.toNight":`다크 모드로 전환`,"panel.net.requestFailed":`요청 실패 (HTTP {status})`,"panel.net.requestFailedNoStatus":`요청 실패`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.inbox.title":`收件文件`,"panel.inbox.reading":`正在读收件目录…`,"panel.inbox.unreadableTitle":`这一版读不到收件目录`,"panel.inbox.unreadableBody":`这台宿主上的插件还没有这两条接口,更新插件后重启 DSH 就能看到占用并清理。`,"panel.inbox.used":`占用`,"panel.inbox.usedValue":`{bytes} · {count} 个文件`,"panel.inbox.deletable":`可清理`,"panel.inbox.deletableValue":`{bytes} · {count} 个`,"panel.inbox.keep":`保留期`,"panel.inbox.keepValue":`{hours} 小时`,"panel.inbox.keepValueOldest":`{hours} 小时(最老那份已放 {age})`,"panel.inbox.hint":`手机传上来的文件落在固定的收件目录里,那里不认识对话,所以归档或删掉对话都带不走它们;只能按时间清。今天传的、还在用的不在清理范围内。`,"panel.inbox.staging":`其中 {bytes} 是上传中途断掉留下的残片({count} 个),一并清掉。`,"panel.inbox.auto":`自动清理`,"panel.inbox.autoA11y":`自动清理收件文件`,"panel.inbox.autoHint":`打开后,{hours} 小时以上的文件会在 DSH 启动时自动删掉;关着就只能手动清。`,"panel.inbox.clearing":`正在清理…`,"panel.inbox.clear":`清理收件文件`,"panel.inbox.confirmTitle":`清理收件文件?`,"panel.inbox.confirmDetail":`会删掉 {count} 个满 {hours} 小时的文件,释放 {bytes};不满这个时间的会留着。`,"panel.inbox.confirmNothing":`目前没有满 {hours} 小时的文件,点了什么都不会删。`,"panel.inbox.confirmIrreversible":`这个动作不可恢复。`,"panel.inbox.cleared":`收件文件已清理:释放了 {bytes}({count} 个文件)`,"panel.inbox.clearedSomeFailed":`,{count} 个没删掉`,"panel.inbox.nothingToClear":`没有满保留期的文件可清。`,"panel.inbox.clearFailed":`清理收件文件失败:{message}`,"panel.inbox.autoFailed":`自动清理开关没改成功:{message}`,"panel.inbox.ageLessThanHour":`不到 1 小时`,"panel.inbox.ageHours":`{hours} 小时`,"panel.inbox.ageDays":`{days} 天`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.inbox.title":`收件檔案`,"panel.inbox.reading":`正在讀取收件目錄…`,"panel.inbox.unreadableTitle":`這一版讀不到收件目錄`,"panel.inbox.unreadableBody":`這台宿主上的外掛還沒有這兩條介面,更新外掛後重新啟動 DSH 就能看到佔用並清理。`,"panel.inbox.used":`佔用`,"panel.inbox.usedValue":`{bytes} · {count} 個檔案`,"panel.inbox.deletable":`可清理`,"panel.inbox.deletableValue":`{bytes} · {count} 個`,"panel.inbox.keep":`保留期`,"panel.inbox.keepValue":`{hours} 小時`,"panel.inbox.keepValueOldest":`{hours} 小時(最舊那份已放 {age})`,"panel.inbox.hint":`手機上傳的檔案會落在固定的收件目錄裡,那裡不認得對話,所以封存或刪掉對話都帶不走它們;只能按時間清理。今天上傳的、還在用的不在清理範圍內。`,"panel.inbox.staging":`其中 {bytes} 是上傳中途斷掉留下的殘片({count} 個),一併清掉。`,"panel.inbox.auto":`自動清理`,"panel.inbox.autoA11y":`自動清理收件檔案`,"panel.inbox.autoHint":`開啟後,{hours} 小時以上的檔案會在 DSH 啟動時自動刪掉;關著就只能手動清。`,"panel.inbox.clearing":`正在清理…`,"panel.inbox.clear":`清理收件檔案`,"panel.inbox.confirmTitle":`清理收件檔案?`,"panel.inbox.confirmDetail":`會刪掉 {count} 個滿 {hours} 小時的檔案,釋放 {bytes};不滿這個時間的會留著。`,"panel.inbox.confirmNothing":`目前沒有滿 {hours} 小時的檔案,點了什麼都不會刪。`,"panel.inbox.confirmIrreversible":`這個動作不可恢復。`,"panel.inbox.cleared":`收件檔案已清理:釋放了 {bytes}({count} 個檔案)`,"panel.inbox.clearedSomeFailed":`,{count} 個沒刪掉`,"panel.inbox.nothingToClear":`沒有滿保留期的檔案可清。`,"panel.inbox.clearFailed":`清理收件檔案失敗:{message}`,"panel.inbox.autoFailed":`自動清理開關沒有改成功:{message}`,"panel.inbox.ageLessThanHour":`不到 1 小時`,"panel.inbox.ageHours":`{hours} 小時`,"panel.inbox.ageDays":`{days} 天`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.inbox.title":`Received files`,"panel.inbox.reading":`Reading the inbox directory…`,"panel.inbox.unreadableTitle":`This build cannot read the inbox directory`,"panel.inbox.unreadableBody":`The plugin on this host does not have these two endpoints yet. Update the plugin and restart DSH to see usage and clean up.`,"panel.inbox.used":`Used`,"panel.inbox.usedValue":`{bytes} · {count} files`,"panel.inbox.deletable":`Cleanable`,"panel.inbox.deletableValue":`{bytes} · {count}`,"panel.inbox.keep":`Retention`,"panel.inbox.keepValue":`{hours} hours`,"panel.inbox.keepValueOldest":`{hours} hours (oldest kept for {age})`,"panel.inbox.hint":`Files sent from your phone land in a fixed inbox directory on the computer. That directory knows nothing about chats, so archiving or deleting a chat does not take them with it — they can only be cleaned by age. Files uploaded today and still in use are out of scope.`,"panel.inbox.staging":`{bytes} of that are fragments left by interrupted uploads ({count}), which are cleared too.`,"panel.inbox.auto":`Auto cleanup`,"panel.inbox.autoA11y":`Automatically clean received files`,"panel.inbox.autoHint":`When on, files older than {hours} hours are deleted when DSH starts; when off you can only clean manually.`,"panel.inbox.clearing":`Cleaning…`,"panel.inbox.clear":`Clean received files`,"panel.inbox.confirmTitle":`Clean received files?`,"panel.inbox.confirmDetail":`This deletes {count} file(s) older than {hours} hours and frees {bytes}; newer ones stay.`,"panel.inbox.confirmNothing":`No files are older than {hours} hours, so nothing will be deleted.`,"panel.inbox.confirmIrreversible":`This cannot be undone.`,"panel.inbox.cleared":`Received files cleaned: freed {bytes} ({count} files)`,"panel.inbox.clearedSomeFailed":`, {count} could not be deleted`,"panel.inbox.nothingToClear":`No files older than the retention window to clean.`,"panel.inbox.clearFailed":`Could not clean received files: {message}`,"panel.inbox.autoFailed":`Could not change the auto-cleanup switch: {message}`,"panel.inbox.ageLessThanHour":`less than 1 hour`,"panel.inbox.ageHours":`{hours} hours`,"panel.inbox.ageDays":`{days} days`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.inbox.title":`受信ファイル`,"panel.inbox.reading":`受信ディレクトリを読み込み中…`,"panel.inbox.unreadableTitle":`この版では受信ディレクトリを読めません`,"panel.inbox.unreadableBody":`このホストのプラグインにはまだこの 2 つの API がありません。プラグインを更新して DSH を再起動すると、使用量の確認とクリーンアップができます。`,"panel.inbox.used":`使用量`,"panel.inbox.usedValue":`{bytes} · {count} ファイル`,"panel.inbox.deletable":`削除可能`,"panel.inbox.deletableValue":`{bytes} · {count} 個`,"panel.inbox.keep":`保存期間`,"panel.inbox.keepValue":`{hours} 時間`,"panel.inbox.keepValueOldest":`{hours} 時間(最も古いものは {age} 前)`,"panel.inbox.hint":`スマートフォンから送ったファイルはパソコン上の固定の受信ディレクトリに置かれます。そこは会話を認識しないため、会話をアーカイブ・削除してもファイルは消えません。時間でのみ整理できます。今日送ったものや使用中のものは対象外です。`,"panel.inbox.staging":`うち {bytes} はアップロード中断で残った断片({count} 個)で、これも一緒に削除されます。`,"panel.inbox.auto":`自動クリーンアップ`,"panel.inbox.autoA11y":`受信ファイルを自動でクリーンアップ`,"panel.inbox.autoHint":`オンにすると、{hours} 時間を超えたファイルは DSH 起動時に自動で削除されます。オフの場合は手動のみです。`,"panel.inbox.clearing":`クリーンアップ中…`,"panel.inbox.clear":`受信ファイルをクリーンアップ`,"panel.inbox.confirmTitle":`受信ファイルをクリーンアップしますか?`,"panel.inbox.confirmDetail":`{hours} 時間を超えた {count} 個のファイルを削除し、{bytes} を解放します。それより新しいものは残します。`,"panel.inbox.confirmNothing":`{hours} 時間を超えたファイルがないため、何も削除されません。`,"panel.inbox.confirmIrreversible":`この操作は元に戻せません。`,"panel.inbox.cleared":`受信ファイルを整理しました:{bytes} を解放({count} ファイル)`,"panel.inbox.clearedSomeFailed":`、{count} 個は削除できませんでした`,"panel.inbox.nothingToClear":`保存期間を超えたファイルはありません。`,"panel.inbox.clearFailed":`受信ファイルの整理に失敗しました:{message}`,"panel.inbox.autoFailed":`自動クリーンアップの切り替えに失敗しました:{message}`,"panel.inbox.ageLessThanHour":`1 時間未満`,"panel.inbox.ageHours":`{hours} 時間`,"panel.inbox.ageDays":`{days} 日`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.inbox.title":`받은 파일`,"panel.inbox.reading":`수신 디렉터리를 읽는 중…`,"panel.inbox.unreadableTitle":`이 버전에서는 수신 디렉터리를 읽을 수 없습니다`,"panel.inbox.unreadableBody":`이 호스트의 플러그인에는 아직 이 두 API가 없습니다. 플러그인을 업데이트하고 DSH를 재시작하면 사용량 확인과 정리가 가능합니다.`,"panel.inbox.used":`사용량`,"panel.inbox.usedValue":`{bytes} · 파일 {count}개`,"panel.inbox.deletable":`정리 가능`,"panel.inbox.deletableValue":`{bytes} · {count}개`,"panel.inbox.keep":`보존 기간`,"panel.inbox.keepValue":`{hours}시간`,"panel.inbox.keepValueOldest":`{hours}시간(가장 오래된 것은 {age} 전)`,"panel.inbox.hint":`휴대폰에서 보낸 파일은 컴퓨터의 고정된 수신 디렉터리에 저장됩니다. 그 디렉터리는 대화를 알지 못하므로 대화를 보관하거나 삭제해도 파일은 사라지지 않습니다. 시간 기준으로만 정리할 수 있으며, 오늘 보낸 파일과 사용 중인 파일은 대상이 아닙니다.`,"panel.inbox.staging":`그중 {bytes}는 업로드가 중단되어 남은 조각({count}개)이며 함께 삭제됩니다.`,"panel.inbox.auto":`자동 정리`,"panel.inbox.autoA11y":`받은 파일 자동 정리`,"panel.inbox.autoHint":`켜면 {hours}시간이 지난 파일은 DSH 시작 시 자동으로 삭제됩니다. 끄면 수동으로만 정리할 수 있습니다.`,"panel.inbox.clearing":`정리 중…`,"panel.inbox.clear":`받은 파일 정리`,"panel.inbox.confirmTitle":`받은 파일을 정리할까요?`,"panel.inbox.confirmDetail":`{hours}시간이 지난 파일 {count}개를 삭제하고 {bytes}를 확보합니다. 그보다 최근 파일은 남습니다.`,"panel.inbox.confirmNothing":`{hours}시간이 지난 파일이 없어 아무것도 삭제되지 않습니다.`,"panel.inbox.confirmIrreversible":`이 작업은 되돌릴 수 없습니다.`,"panel.inbox.cleared":`받은 파일을 정리했습니다: {bytes} 확보(파일 {count}개)`,"panel.inbox.clearedSomeFailed":`, {count}개는 삭제하지 못했습니다`,"panel.inbox.nothingToClear":`보존 기간이 지난 파일이 없습니다.`,"panel.inbox.clearFailed":`받은 파일 정리에 실패했습니다: {message}`,"panel.inbox.autoFailed":`자동 정리 스위치를 변경하지 못했습니다: {message}`,"panel.inbox.ageLessThanHour":`1시간 미만`,"panel.inbox.ageHours":`{hours}시간`,"panel.inbox.ageDays":`{days}일`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.onboarding.title":`用移动设备连上这台 DSH`,"panel.onboarding.statusFailed":`读不到插件状态`,"panel.onboarding.stepFailed":`这一步没成功`,"panel.onboarding.qrAfterRelay":`填好下面的中转地址后`,"panel.onboarding.qrAfterRelayLine2":`这里才会生成二维码`,"panel.onboarding.qrAfterAddress":`这个地址连上之后,这里才会生成二维码`,"panel.onboarding.noQr":`没取到二维码`,"panel.onboarding.preview":`这是按你填的地址生成的预览,点「进入插件」才会把这个地址存进配置。`,"panel.onboarding.relayNotConnected":`中转还没连上,连上之后扫码才有用。`,"panel.onboarding.direct":`直连`,"panel.onboarding.thisAddress":`这个地址`,"panel.onboarding.lanFailed":`没能开始直连`,"panel.onboarding.relayFailed":`中转没连上`,"panel.onboarding.lanErrorWithPort":`{error}(端口可能被占用,到主页的「局域网直连」里换一个。)`,"panel.onboarding.lanNoStart":`直连没起来,端口可能被别的程序占了。`,"panel.onboarding.tunnelErrorHint":`{error}(检查中转地址填对没有、那台中转是不是在跑。)`,"panel.onboarding.tunnelNoStart":`隧道没建起来,检查中转地址。`,"panel.onboarding.pickAddress":`手机连哪条地址`,"panel.onboarding.relayAddressHint":`中转地址`,"panel.onboarding.recheckSaved":`这台机器正在用的中转地址 {url} 现在连不上,先确认那台中转在不在跑。`,"panel.onboarding.relayNoAnswer":`中转地址 {value} 上没有中转在应答。确认域名写对、那台 dsh-relay 在运行。`,"panel.onboarding.relayNoAnswerUnsaved":`中转地址 {value} 上没有中转在应答,配置没改。确认域名写对、那台 dsh-relay 在运行。`,"panel.onboarding.probe.empty":`还没填地址`,"panel.onboarding.probe.busy":`检测中`,"panel.onboarding.probe.ok":`连得通,还没存进配置`,"panel.onboarding.probe.failed":`连不上`,"panel.onboarding.probe.idle":`还没检测`,"panel.onboarding.probe.okWithHint":`这个地址连得通,二维码已按它生成(还没存进配置)。`,"panel.onboarding.checkFirewall":`连不上?检查防火墙`,"panel.onboarding.lanDirect":`局域网直连`,"panel.onboarding.chooseAddress":`选择地址`,"panel.onboarding.publicRelay":`公用中转`,"panel.onboarding.publicRelayTemporary":`建议临时使用`,"panel.onboarding.ownRelay":`自建中转`,"panel.onboarding.githubRepo":`GitHub 仓库`,"panel.onboarding.currentLan":`当前选择的局域网地址`,"panel.onboarding.public":`公网`,"panel.onboarding.ipv6More":`另有 {count} 条 IPv6 地址,手机按实测择优`,"panel.onboarding.collapse":`收起`,"panel.onboarding.expand":`展开`,"panel.onboarding.relayListTitle":`公用中转地址(按实测耗时排)`,"panel.onboarding.probing":`测速中…`,"panel.onboarding.autoBest":`自动优选`,"panel.onboarding.autoBestHint":`取最快的那条`,"panel.onboarding.probeUnreachable":`测不通`,"panel.onboarding.check":`检测`,"panel.onboarding.enterPlugin":`进入插件`,"panel.onboarding.connecting":`正在连接…`,"panel.onboarding.fixFirst":`先解决上面的问题`,"panel.onboarding.fillRelayFirst":`先填中转地址`,"panel.onboarding.opening":`正在打开…`,"panel.onboarding.openDirect":`打开直连`,"panel.onboarding.connectRelay":`连接中转`,"panel.onboarding.firewallTitle":`检查防火墙`,"panel.onboarding.firewallIntro":`手机连不上这台电脑的直连端口时,多半是电脑这边把端口挡了。直连默认端口`,"panel.onboarding.firewallIntroTail":`(首页「局域网直连」里可以改),下面按系统查。`,"panel.onboarding.copiedOk":`已复制,粘贴给你的 AI 就行。`,"panel.onboarding.copiedFailed":`复制失败,可以手动选中内容复制。`,"panel.onboarding.gotIt":`知道了`,"panel.onboarding.lanDialogTitle":`选择局域网地址`,"panel.onboarding.lanDialogHint":`手机先试选中的这条,其余继续排在后面兜底。`,"panel.onboarding.lanGroupA11y":`局域网地址`,"panel.onboarding.lan":`局域网`,"panel.onboarding.copyPromptHint":`点我复制内容,让自己的 AI 去检查`,"panel.onboarding.copyPrompt":`复制这段排查提示词`,"panel.onboarding.linuxStep1":`1. 看防火墙状态(firewalld 或 ufw,装哪个查哪个):`,"panel.onboarding.linuxStep2":`2. 放行直连端口:`,"panel.onboarding.linuxStep3":`3. 云服务器还要去服务商控制台的安全组里放行同一个端口 —— 这台机器上查不到。`,"panel.onboarding.macStep1":`1. 看应用防火墙是不是开着:`,"panel.onboarding.macStep2":`2. 开着的话,在「系统设置 → 网络 → 防火墙 → 选项」里把 DSH / node 设成「允许传入连接」;排查时可以整个关掉:`,"panel.onboarding.macStep3":`3. 同一 Wi-Fi 还连不上:确认手机和电脑真在同一个网段,别连到访客网络。`,"panel.onboarding.winStep1":`1. 在 PowerShell(管理员)里看防火墙配置文件:`,"panel.onboarding.winStep2":`2. 放行直连端口:`,"panel.onboarding.winStep3":`3. 如果以前给 node 配过拒绝规则,记得把那条 Block 删掉;网络类型选「专用」而不是「公用」。`,"panel.onboarding.prompt.intro":`帮我排查一个问题。`,"panel.onboarding.prompt.situation":`我的情况:电脑上装了 DSH(DeepSeek Harness)的移动端插件,手机 App 通过局域网直连连不上这台电脑。`,"panel.onboarding.prompt.address":`手机上填的地址是这台电脑的局域网地址加端口(具体的地址和端口你需要到移动端插件的那个网页里看,注意是局域网地址)。`,"panel.onboarding.prompt.guess":`电脑这边显示插件已经在监听,但手机连不上。我判断是电脑的防火墙(或者云服务器的安全组)把这个端口挡了。`,"panel.onboarding.prompt.ask":`请你:`,"panel.onboarding.prompt.ask1":`1. 先确认我的系统是 Linux、macOS 还是 Windows(不确定就问我,或者告诉我怎么确认)。`,"panel.onboarding.prompt.ask2":`2. 按属于我这一套的步骤逐条检查,告诉我那个端口现在通不通、卡在哪一步。`,"panel.onboarding.prompt.ask3":`3. 给出具体该执行的命令或点击路径,把端口放行;需要管理员权限的地方明确说明。`,"panel.onboarding.prompt.ask4":`4. 最后告诉我怎么验证已经通了(比如用哪条命令从本机、从手机分别确认)。`,"panel.onboarding.prompt.extra":`补充:如果这台电脑是云服务器,服务商控制台里的安全组/防火墙也要放行同一个端口,这一项在本机查不到。`,"panel.onboarding.relayPlaceholder":`https://你的中转域名`},"zh-Hant":{"panel.onboarding.title":`用行動裝置連上這台 DSH`,"panel.onboarding.statusFailed":`讀不到外掛狀態`,"panel.onboarding.stepFailed":`這一步沒有成功`,"panel.onboarding.qrAfterRelay":`填好下面的中轉位址後`,"panel.onboarding.qrAfterRelayLine2":`這裡才會產生 QR 碼`,"panel.onboarding.qrAfterAddress":`這個位址連上之後,這裡才會產生 QR 碼`,"panel.onboarding.noQr":`沒取得 QR 碼`,"panel.onboarding.preview":`這是依你填的位址產生的預覽,點「進入外掛」才會把這個位址存進設定。`,"panel.onboarding.relayNotConnected":`中轉還沒連上,連上之後掃碼才有用。`,"panel.onboarding.direct":`直連`,"panel.onboarding.thisAddress":`這個位址`,"panel.onboarding.lanFailed":`沒能開始直連`,"panel.onboarding.relayFailed":`中轉沒連上`,"panel.onboarding.lanErrorWithPort":`{error}(連接埠可能被佔用,到主頁的「區域網路直連」裡換一個。)`,"panel.onboarding.lanNoStart":`直連沒起來,連接埠可能被別的程式佔用。`,"panel.onboarding.tunnelErrorHint":`{error}(檢查中轉位址填對沒有、那台中轉是不是在跑。)`,"panel.onboarding.tunnelNoStart":`通道沒建起來,檢查中轉位址。`,"panel.onboarding.pickAddress":`手機連哪條位址`,"panel.onboarding.relayAddressHint":`中轉位址`,"panel.onboarding.recheckSaved":`這台機器正在用的中轉位址 {url} 現在連不上,先確認那台中轉在不在跑。`,"panel.onboarding.relayNoAnswer":`中轉位址 {value} 上沒有中轉在應答。確認網域名稱寫對、那台 dsh-relay 在執行。`,"panel.onboarding.relayNoAnswerUnsaved":`中轉位址 {value} 上沒有中轉在應答,設定沒改。確認網域名稱寫對、那台 dsh-relay 在執行。`,"panel.onboarding.probe.empty":`還沒填位址`,"panel.onboarding.probe.busy":`檢查中`,"panel.onboarding.probe.ok":`連得通,還沒存進設定`,"panel.onboarding.probe.failed":`連不上`,"panel.onboarding.probe.idle":`還沒檢查`,"panel.onboarding.probe.okWithHint":`這個位址連得通,QR 碼已依它產生(還沒存進設定)。`,"panel.onboarding.checkFirewall":`連不上?檢查防火牆`,"panel.onboarding.lanDirect":`區域網路直連`,"panel.onboarding.chooseAddress":`選擇位址`,"panel.onboarding.publicRelay":`公用中轉`,"panel.onboarding.publicRelayTemporary":`建議臨時使用`,"panel.onboarding.ownRelay":`自建中轉`,"panel.onboarding.githubRepo":`GitHub 儲存庫`,"panel.onboarding.currentLan":`目前選擇的區域網路位址`,"panel.onboarding.public":`公網`,"panel.onboarding.ipv6More":`另有 {count} 條 IPv6 位址,手機依實測擇優`,"panel.onboarding.collapse":`收合`,"panel.onboarding.expand":`展開`,"panel.onboarding.relayListTitle":`公用中轉位址(依實測耗時排)`,"panel.onboarding.probing":`測速中…`,"panel.onboarding.autoBest":`自動優選`,"panel.onboarding.autoBestHint":`取最快的那條`,"panel.onboarding.probeUnreachable":`測不通`,"panel.onboarding.check":`檢查`,"panel.onboarding.enterPlugin":`進入外掛`,"panel.onboarding.connecting":`正在連線…`,"panel.onboarding.fixFirst":`先解決上面的問題`,"panel.onboarding.fillRelayFirst":`先填中轉位址`,"panel.onboarding.opening":`正在開啟…`,"panel.onboarding.openDirect":`開啟直連`,"panel.onboarding.connectRelay":`連線中轉`,"panel.onboarding.firewallTitle":`檢查防火牆`,"panel.onboarding.firewallIntro":`手機連不上這台電腦的直連連接埠時,多半是電腦這邊把連接埠擋了。直連預設連接埠`,"panel.onboarding.firewallIntroTail":`(首頁「區域網路直連」裡可以改),下面依系統查。`,"panel.onboarding.copiedOk":`已複製,貼給你的 AI 就行。`,"panel.onboarding.copiedFailed":`複製失敗,可以手動選取內容複製。`,"panel.onboarding.gotIt":`知道了`,"panel.onboarding.lanDialogTitle":`選擇區域網路位址`,"panel.onboarding.lanDialogHint":`手機先試選中的這條,其餘繼續排在後面兜底。`,"panel.onboarding.lanGroupA11y":`區域網路位址`,"panel.onboarding.lan":`區域網路`,"panel.onboarding.copyPromptHint":`點我複製內容,讓自己的 AI 去檢查`,"panel.onboarding.copyPrompt":`複製這段排查提示詞`,"panel.onboarding.linuxStep1":`1. 看防火牆狀態(firewalld 或 ufw,裝哪個查哪個):`,"panel.onboarding.linuxStep2":`2. 放行直連連接埠:`,"panel.onboarding.linuxStep3":`3. 雲端伺服器還要去服務商主控台的安全群組裡放行同一個連接埠 —— 這台機器上查不到。`,"panel.onboarding.macStep1":`1. 看應用程式防火牆是不是開著:`,"panel.onboarding.macStep2":`2. 開著的話,在「系統設定 → 網路 → 防火牆 → 選項」裡把 DSH / node 設成「允許傳入連線」;排查時可以整個關掉:`,"panel.onboarding.macStep3":`3. 同一 Wi-Fi 還連不上:確認手機和電腦真在同一個網段,別連到訪客網路。`,"panel.onboarding.winStep1":`1. 在 PowerShell(系統管理員)裡看防火牆設定檔:`,"panel.onboarding.winStep2":`2. 放行直連連接埠:`,"panel.onboarding.winStep3":`3. 如果以前給 node 設過拒絕規則,記得把那條 Block 刪掉;網路類型選「專用」而不是「公用」。`,"panel.onboarding.prompt.intro":`幫我排查一個問題。`,"panel.onboarding.prompt.situation":`我的情況:電腦上裝了 DSH(DeepSeek Harness)的行動端外掛,手機 App 透過區域網路直連連不上這台電腦。`,"panel.onboarding.prompt.address":`手機上填的位址是這台電腦的區域網路位址加連接埠(具體的位址和連接埠你需要到行動端外掛的那個網頁裡看,注意是區域網路位址)。`,"panel.onboarding.prompt.guess":`電腦這邊顯示外掛已經在監聽,但手機連不上。我判斷是電腦的防火牆(或者雲端伺服器的安全群組)把這個連接埠擋了。`,"panel.onboarding.prompt.ask":`請你:`,"panel.onboarding.prompt.ask1":`1. 先確認我的系統是 Linux、macOS 還是 Windows(不確定就問我,或者告訴我怎麼確認)。`,"panel.onboarding.prompt.ask2":`2. 依屬於我這一套的步驟逐條檢查,告訴我那個連接埠現在通不通、卡在哪一步。`,"panel.onboarding.prompt.ask3":`3. 給出具體該執行的命令或點擊路徑,把連接埠放行;需要系統管理員權限的地方明確說明。`,"panel.onboarding.prompt.ask4":`4. 最後告訴我怎麼驗證已經通了(比如用哪條命令從本機、從手機分別確認)。`,"panel.onboarding.prompt.extra":`補充:如果這台電腦是雲端伺服器,服務商主控台裡的安全群組/防火牆也要放行同一個連接埠,這一項在本機查不到。`,"panel.onboarding.relayPlaceholder":`https://你的中轉網域`},en:{"panel.onboarding.title":`Connect your phone to this DSH`,"panel.onboarding.statusFailed":`Could not read plugin status`,"panel.onboarding.stepFailed":`That step did not succeed`,"panel.onboarding.qrAfterRelay":`Once you fill in the relay address below`,"panel.onboarding.qrAfterRelayLine2":`the QR code appears here`,"panel.onboarding.qrAfterAddress":`Once this address connects, the QR code appears here`,"panel.onboarding.noQr":`No QR code yet`,"panel.onboarding.preview":`This preview uses the address you typed. Tapping “Enter plugin” saves it to the configuration.`,"panel.onboarding.relayNotConnected":`The relay is not connected yet; scanning only works once it is.`,"panel.onboarding.direct":`Direct`,"panel.onboarding.thisAddress":`This address`,"panel.onboarding.lanFailed":`Could not start direct connection`,"panel.onboarding.relayFailed":`Relay not connected`,"panel.onboarding.lanErrorWithPort":`{error} (the port may be taken — pick another under “LAN direct” on the main page.)`,"panel.onboarding.lanNoStart":`The direct listener did not start; another program may be holding the port.`,"panel.onboarding.tunnelErrorHint":`{error} (check that the relay address is correct and that the relay is running.)`,"panel.onboarding.tunnelNoStart":`The tunnel did not come up; check the relay address.`,"panel.onboarding.pickAddress":`Which address your phone uses`,"panel.onboarding.relayAddressHint":`Relay address`,"panel.onboarding.recheckSaved":`The relay this machine uses, {url}, is unreachable right now. Check that the relay is running.`,"panel.onboarding.relayNoAnswer":`Nothing is answering at {value}. Check the domain and that dsh-relay is running.`,"panel.onboarding.relayNoAnswerUnsaved":`Nothing is answering at {value}; the configuration was not changed. Check the domain and that dsh-relay is running.`,"panel.onboarding.probe.empty":`No address yet`,"panel.onboarding.probe.busy":`Testing`,"panel.onboarding.probe.ok":`Reachable, not saved yet`,"panel.onboarding.probe.failed":`Unreachable`,"panel.onboarding.probe.idle":`Not tested yet`,"panel.onboarding.probe.okWithHint":`This address is reachable and the QR code was generated from it (not saved to the configuration yet).`,"panel.onboarding.checkFirewall":`Cannot connect? Check the firewall`,"panel.onboarding.lanDirect":`LAN direct`,"panel.onboarding.chooseAddress":`Choose address`,"panel.onboarding.publicRelay":`Public relay`,"panel.onboarding.publicRelayTemporary":`For temporary use`,"panel.onboarding.ownRelay":`Self-hosted relay`,"panel.onboarding.githubRepo":`GitHub repository`,"panel.onboarding.currentLan":`Currently selected LAN address`,"panel.onboarding.public":`Public`,"panel.onboarding.ipv6More":`{count} more IPv6 addresses; your phone picks the fastest`,"panel.onboarding.collapse":`Collapse`,"panel.onboarding.expand":`Expand`,"panel.onboarding.relayListTitle":`Public relay addresses (by measured latency)`,"panel.onboarding.probing":`Measuring…`,"panel.onboarding.autoBest":`Auto (fastest)`,"panel.onboarding.autoBestHint":`Use the fastest one`,"panel.onboarding.probeUnreachable":`Unreachable`,"panel.onboarding.check":`Test`,"panel.onboarding.enterPlugin":`Enter plugin`,"panel.onboarding.connecting":`Connecting…`,"panel.onboarding.fixFirst":`Fix the problems above first`,"panel.onboarding.fillRelayFirst":`Enter the relay address first`,"panel.onboarding.opening":`Opening…`,"panel.onboarding.openDirect":`Open direct connection`,"panel.onboarding.connectRelay":`Connect relay`,"panel.onboarding.firewallTitle":`Check the firewall`,"panel.onboarding.firewallIntro":`When your phone cannot reach this computer’s direct port, the port is usually blocked on the computer. The default direct port is`,"panel.onboarding.firewallIntroTail":` (you can change it under “LAN direct” on the main page). Check it per system below.`,"panel.onboarding.copiedOk":`Copied — paste it into your AI.`,"panel.onboarding.copiedFailed":`Copy failed; select the text and copy it manually.`,"panel.onboarding.gotIt":`Got it`,"panel.onboarding.lanDialogTitle":`Choose a LAN address`,"panel.onboarding.lanDialogHint":`Your phone tries the selected one first and falls back to the rest.`,"panel.onboarding.lanGroupA11y":`LAN addresses`,"panel.onboarding.lan":`LAN`,"panel.onboarding.copyPromptHint":`Tap to copy — let your own AI check it`,"panel.onboarding.copyPrompt":`Copy this troubleshooting prompt`,"panel.onboarding.linuxStep1":`1. Check the firewall status (firewalld or ufw — whichever is installed):`,"panel.onboarding.linuxStep2":`2. Allow the direct port:`,"panel.onboarding.linuxStep3":`3. On a cloud server also allow the same port in your provider’s console security group — it cannot be checked from this machine.`,"panel.onboarding.macStep1":`1. Check whether the application firewall is on:`,"panel.onboarding.macStep2":`2. If it is on, set DSH / node to “Allow incoming connections” under System Settings → Network → Firewall → Options; for troubleshooting you can turn it off entirely:`,"panel.onboarding.macStep3":`3. Still failing on the same Wi-Fi: make sure the phone and computer are really on the same subnet, not a guest network.`,"panel.onboarding.winStep1":`1. In PowerShell (administrator) list the firewall profiles:`,"panel.onboarding.winStep2":`2. Allow the direct port:`,"panel.onboarding.winStep3":`3. If you previously created a block rule for node, delete it; set the network type to Private rather than Public.`,"panel.onboarding.prompt.intro":`Help me troubleshoot a problem.`,"panel.onboarding.prompt.situation":`My situation: I have the DSH (DeepSeek Harness) mobile plugin installed on my computer, and the phone app cannot reach this computer over a direct LAN connection.`,"panel.onboarding.prompt.address":`The address entered on the phone is this computer’s LAN address plus port (you will need to read the exact address and port from the mobile plugin’s web page — note it must be the LAN address).`,"panel.onboarding.prompt.guess":`The computer side shows the plugin is listening, but the phone cannot connect. I believe the computer’s firewall (or a cloud security group) is blocking that port.`,"panel.onboarding.prompt.ask":`Please:`,"panel.onboarding.prompt.ask1":`1. First confirm whether my system is Linux, macOS or Windows (ask me if you are unsure, or tell me how to check).`,"panel.onboarding.prompt.ask2":`2. Walk me through the steps for my setup one by one and tell me whether that port is currently open and where it gets stuck.`,"panel.onboarding.prompt.ask3":`3. Give me the exact commands or click paths to allow the port, and say clearly where administrator rights are needed.`,"panel.onboarding.prompt.ask4":`4. Finally tell me how to verify it works (for example which command to run on the computer and on the phone).`,"panel.onboarding.prompt.extra":`Note: if this computer is a cloud server, the security group or firewall in the provider’s console must allow the same port too, and that cannot be checked locally.`,"panel.onboarding.relayPlaceholder":`https://your-relay.example`},ja:{"panel.onboarding.title":`この DSH にスマートフォンをつなぐ`,"panel.onboarding.statusFailed":`プラグインの状態を取得できません`,"panel.onboarding.stepFailed":`この手順は完了しませんでした`,"panel.onboarding.qrAfterRelay":`下のリレーのアドレスを入力すると`,"panel.onboarding.qrAfterRelayLine2":`ここに QR コードが表示されます`,"panel.onboarding.qrAfterAddress":`このアドレスに接続できると、ここに QR コードが表示されます`,"panel.onboarding.noQr":`QR コードを取得できません`,"panel.onboarding.preview":`入力したアドレスによるプレビューです。「プラグインに入る」を押すとこのアドレスが設定に保存されます。`,"panel.onboarding.relayNotConnected":`リレーにまだ接続していません。接続後にスキャンが有効になります。`,"panel.onboarding.direct":`直結`,"panel.onboarding.thisAddress":`このアドレス`,"panel.onboarding.lanFailed":`直結を開始できませんでした`,"panel.onboarding.relayFailed":`リレーに接続できません`,"panel.onboarding.lanErrorWithPort":`{error}(ポートが使用中の可能性があります。メイン画面の「LAN 直結」で別のポートに変更してください。)`,"panel.onboarding.lanNoStart":`直結が起動しませんでした。別のアプリがポートを使用している可能性があります。`,"panel.onboarding.tunnelErrorHint":`{error}(リレーのアドレスが正しいか、リレーが動いているかを確認してください。)`,"panel.onboarding.tunnelNoStart":`トンネルが確立しませんでした。リレーのアドレスを確認してください。`,"panel.onboarding.pickAddress":`スマートフォンが使うアドレス`,"panel.onboarding.relayAddressHint":`リレーのアドレス`,"panel.onboarding.recheckSaved":`このマシンが使っているリレー {url} に現在つながりません。リレーが動いているか確認してください。`,"panel.onboarding.relayNoAnswer":`リレーのアドレス {value} に応答がありません。ドメイン名と dsh-relay の稼働を確認してください。`,"panel.onboarding.relayNoAnswerUnsaved":`リレーのアドレス {value} に応答がないため、設定は変更していません。ドメイン名と dsh-relay の稼働を確認してください。`,"panel.onboarding.probe.empty":`アドレス未入力`,"panel.onboarding.probe.busy":`確認中`,"panel.onboarding.probe.ok":`接続できます(未保存)`,"panel.onboarding.probe.failed":`接続できません`,"panel.onboarding.probe.idle":`未確認`,"panel.onboarding.probe.okWithHint":`このアドレスに接続できます。QR コードはこのアドレスで生成済みです(設定には未保存)。`,"panel.onboarding.checkFirewall":`つながらない場合はファイアウォールを確認`,"panel.onboarding.lanDirect":`LAN 直結`,"panel.onboarding.chooseAddress":`アドレスを選択`,"panel.onboarding.publicRelay":`共用リレー`,"panel.onboarding.publicRelayTemporary":`一時利用に推奨`,"panel.onboarding.ownRelay":`自前のリレー`,"panel.onboarding.githubRepo":`GitHub リポジトリ`,"panel.onboarding.currentLan":`現在選択中の LAN アドレス`,"panel.onboarding.public":`パブリック`,"panel.onboarding.ipv6More":`ほかに IPv6 アドレスが {count} 件。スマートフォンが実測で選択します`,"panel.onboarding.collapse":`たたむ`,"panel.onboarding.expand":`展開`,"panel.onboarding.relayListTitle":`共用リレーのアドレス(実測の所要時間順)`,"panel.onboarding.probing":`測定中…`,"panel.onboarding.autoBest":`自動(最速)`,"panel.onboarding.autoBestHint":`最も速いものを使用`,"panel.onboarding.probeUnreachable":`到達できません`,"panel.onboarding.check":`確認`,"panel.onboarding.enterPlugin":`プラグインに入る`,"panel.onboarding.connecting":`接続中…`,"panel.onboarding.fixFirst":`まず上の問題を解決してください`,"panel.onboarding.fillRelayFirst":`先にリレーのアドレスを入力`,"panel.onboarding.opening":`開いています…`,"panel.onboarding.openDirect":`直結を開く`,"panel.onboarding.connectRelay":`リレーに接続`,"panel.onboarding.firewallTitle":`ファイアウォールを確認`,"panel.onboarding.firewallIntro":`スマートフォンからこのパソコンの直結ポートにつながらない場合、多くはパソコン側でポートが塞がれています。直結の既定ポートは`,"panel.onboarding.firewallIntroTail":`(メイン画面の「LAN 直結」で変更できます)。以下をシステム別に確認してください。`,"panel.onboarding.copiedOk":`コピーしました。AI に貼り付けてください。`,"panel.onboarding.copiedFailed":`コピーに失敗しました。テキストを選択して手動でコピーしてください。`,"panel.onboarding.gotIt":`了解`,"panel.onboarding.lanDialogTitle":`LAN アドレスを選択`,"panel.onboarding.lanDialogHint":`スマートフォンは選択したものを先に試し、残りは後続の候補になります。`,"panel.onboarding.lanGroupA11y":`LAN アドレス`,"panel.onboarding.lan":`LAN`,"panel.onboarding.copyPromptHint":`クリックでコピー。自分の AI に確認させられます`,"panel.onboarding.copyPrompt":`このトラブルシュート用プロンプトをコピー`,"panel.onboarding.linuxStep1":`1. ファイアウォールの状態を確認(firewalld か ufw、入っている方):`,"panel.onboarding.linuxStep2":`2. 直結ポートを許可:`,"panel.onboarding.linuxStep3":`3. クラウドサーバーの場合は、事業者コンソールのセキュリティグループでも同じポートを許可してください(このマシンからは確認できません)。`,"panel.onboarding.macStep1":`1. アプリケーションファイアウォールが有効か確認:`,"panel.onboarding.macStep2":`2. 有効な場合は「システム設定 → ネットワーク → ファイアウォール → オプション」で DSH / node を「着信接続を許可」に設定。切り分け時は丸ごと切ることもできます:`,"panel.onboarding.macStep3":`3. 同じ Wi-Fi でもつながらない場合: スマートフォンとパソコンが同じサブネットにあるか(ゲストネットワークでないか)を確認してください。`,"panel.onboarding.winStep1":`1. PowerShell(管理者)でファイアウォールプロファイルを確認:`,"panel.onboarding.winStep2":`2. 直結ポートを許可:`,"panel.onboarding.winStep3":`3. 以前 node に拒否規則を作った場合はそれを削除し、ネットワークの種類を「パブリック」ではなく「プライベート」にしてください。`,"panel.onboarding.prompt.intro":`問題の切り分けを手伝ってください。`,"panel.onboarding.prompt.situation":`状況: パソコンに DSH(DeepSeek Harness)のモバイルプラグインを入れており、スマートフォンのアプリから LAN 直結でこのパソコンにつながりません。`,"panel.onboarding.prompt.address":`スマートフォンに入力したアドレスは、このパソコンの LAN アドレスとポートです(正確なアドレスとポートはモバイルプラグインの Web ページで確認してください。LAN アドレスである点に注意)。`,"panel.onboarding.prompt.guess":`パソコン側ではプラグインが待ち受けていると表示されていますが、スマートフォンからはつながりません。パソコンのファイアウォール(またはクラウドのセキュリティグループ)がこのポートを塞いでいると思います。`,"panel.onboarding.prompt.ask":`お願いします:`,"panel.onboarding.prompt.ask1":`1. まず私の環境が Linux / macOS / Windows のどれかを確認してください(不明なら私に聞くか、確認方法を教えてください)。`,"panel.onboarding.prompt.ask2":`2. 私の環境に合った手順を 1 つずつ確認し、そのポートが今通るのか、どこで止まっているのかを教えてください。`,"panel.onboarding.prompt.ask3":`3. ポートを許可するための具体的なコマンドやクリック手順を示してください。管理者権限が必要な箇所は明記してください。`,"panel.onboarding.prompt.ask4":`4. 最後に、通ったことを確認する方法(パソコン側とスマートフォン側それぞれで実行するコマンドなど)を教えてください。`,"panel.onboarding.prompt.extra":`補足: このパソコンがクラウドサーバーの場合、事業者コンソールのセキュリティグループ/ファイアウォールでも同じポートを許可する必要があり、それはローカルでは確認できません。`,"panel.onboarding.relayPlaceholder":`https://リレーのドメイン`},ko:{"panel.onboarding.title":`이 DSH에 휴대폰 연결하기`,"panel.onboarding.statusFailed":`플러그인 상태를 읽을 수 없습니다`,"panel.onboarding.stepFailed":`이 단계가 완료되지 않았습니다`,"panel.onboarding.qrAfterRelay":`아래에 릴레이 주소를 입력하면`,"panel.onboarding.qrAfterRelayLine2":`여기에 QR 코드가 생성됩니다`,"panel.onboarding.qrAfterAddress":`이 주소에 연결되면 여기에 QR 코드가 생성됩니다`,"panel.onboarding.noQr":`QR 코드를 가져오지 못했습니다`,"panel.onboarding.preview":`입력한 주소로 만든 미리보기입니다. 「플러그인 들어가기」를 눌러야 이 주소가 설정에 저장됩니다.`,"panel.onboarding.relayNotConnected":`릴레이에 아직 연결되지 않았습니다. 연결된 뒤에야 스캔이 동작합니다.`,"panel.onboarding.direct":`직접 연결`,"panel.onboarding.thisAddress":`이 주소`,"panel.onboarding.lanFailed":`직접 연결을 시작하지 못했습니다`,"panel.onboarding.relayFailed":`릴레이에 연결되지 않았습니다`,"panel.onboarding.lanErrorWithPort":`{error} (포트가 사용 중일 수 있습니다. 메인 화면의 「LAN 직접 연결」에서 다른 포트로 바꾸세요.)`,"panel.onboarding.lanNoStart":`직접 연결이 시작되지 않았습니다. 다른 프로그램이 포트를 쓰고 있을 수 있습니다.`,"panel.onboarding.tunnelErrorHint":`{error} (릴레이 주소가 맞는지, 릴레이가 실행 중인지 확인하세요.)`,"panel.onboarding.tunnelNoStart":`터널이 만들어지지 않았습니다. 릴레이 주소를 확인하세요.`,"panel.onboarding.pickAddress":`휴대폰이 사용할 주소`,"panel.onboarding.relayAddressHint":`릴레이 주소`,"panel.onboarding.recheckSaved":`이 컴퓨터가 쓰는 릴레이 {url}에 지금 연결할 수 없습니다. 릴레이가 실행 중인지 확인하세요.`,"panel.onboarding.relayNoAnswer":`릴레이 주소 {value}에서 응답이 없습니다. 도메인과 dsh-relay 실행 여부를 확인하세요.`,"panel.onboarding.relayNoAnswerUnsaved":`릴레이 주소 {value}에서 응답이 없어 설정을 변경하지 않았습니다. 도메인과 dsh-relay 실행 여부를 확인하세요.`,"panel.onboarding.probe.empty":`주소를 아직 입력하지 않았습니다`,"panel.onboarding.probe.busy":`확인 중`,"panel.onboarding.probe.ok":`연결됩니다 (저장 전)`,"panel.onboarding.probe.failed":`연결되지 않습니다`,"panel.onboarding.probe.idle":`아직 확인하지 않았습니다`,"panel.onboarding.probe.okWithHint":`이 주소로 연결됩니다. QR 코드가 이 주소로 생성되었습니다(설정에는 아직 저장되지 않음).`,"panel.onboarding.checkFirewall":`연결되지 않나요? 방화벽을 확인하세요`,"panel.onboarding.lanDirect":`LAN 직접 연결`,"panel.onboarding.chooseAddress":`주소 선택`,"panel.onboarding.publicRelay":`공용 릴레이`,"panel.onboarding.publicRelayTemporary":`임시 사용 권장`,"panel.onboarding.ownRelay":`자가 호스팅 릴레이`,"panel.onboarding.githubRepo":`GitHub 저장소`,"panel.onboarding.currentLan":`현재 선택된 LAN 주소`,"panel.onboarding.public":`공인`,"panel.onboarding.ipv6More":`IPv6 주소가 {count}개 더 있습니다. 휴대폰이 실측으로 선택합니다`,"panel.onboarding.collapse":`접기`,"panel.onboarding.expand":`펼치기`,"panel.onboarding.relayListTitle":`공용 릴레이 주소(실측 지연 순)`,"panel.onboarding.probing":`측정 중…`,"panel.onboarding.autoBest":`자동(가장 빠른 것)`,"panel.onboarding.autoBestHint":`가장 빠른 것을 사용`,"panel.onboarding.probeUnreachable":`연결되지 않음`,"panel.onboarding.check":`확인`,"panel.onboarding.enterPlugin":`플러그인 들어가기`,"panel.onboarding.connecting":`연결 중…`,"panel.onboarding.fixFirst":`위 문제를 먼저 해결하세요`,"panel.onboarding.fillRelayFirst":`릴레이 주소를 먼저 입력하세요`,"panel.onboarding.opening":`여는 중…`,"panel.onboarding.openDirect":`직접 연결 열기`,"panel.onboarding.connectRelay":`릴레이 연결`,"panel.onboarding.firewallTitle":`방화벽 확인`,"panel.onboarding.firewallIntro":`휴대폰에서 이 컴퓨터의 직접 연결 포트로 접속되지 않을 때는 대개 컴퓨터 쪽에서 포트가 막혀 있습니다. 기본 직접 연결 포트는`,"panel.onboarding.firewallIntroTail":` (메인 화면의 「LAN 직접 연결」에서 바꿀 수 있습니다). 아래에서 시스템별로 확인하세요.`,"panel.onboarding.copiedOk":`복사했습니다. AI에 붙여 넣으세요.`,"panel.onboarding.copiedFailed":`복사하지 못했습니다. 텍스트를 선택해 직접 복사하세요.`,"panel.onboarding.gotIt":`확인`,"panel.onboarding.lanDialogTitle":`LAN 주소 선택`,"panel.onboarding.lanDialogHint":`휴대폰은 선택한 주소를 먼저 시도하고 나머지는 뒤에서 대비합니다.`,"panel.onboarding.lanGroupA11y":`LAN 주소`,"panel.onboarding.lan":`LAN`,"panel.onboarding.copyPromptHint":`클릭하여 복사하고 자기 AI에게 확인시키세요`,"panel.onboarding.copyPrompt":`이 문제 진단 프롬프트 복사`,"panel.onboarding.linuxStep1":`1. 방화벽 상태 확인(firewalld 또는 ufw, 설치된 것):`,"panel.onboarding.linuxStep2":`2. 직접 연결 포트 허용:`,"panel.onboarding.linuxStep3":`3. 클라우드 서버라면 사업자 콘솔의 보안 그룹에서도 같은 포트를 허용해야 합니다 — 이 컴퓨터에서는 확인할 수 없습니다.`,"panel.onboarding.macStep1":`1. 애플리케이션 방화벽이 켜져 있는지 확인:`,"panel.onboarding.macStep2":`2. 켜져 있다면 시스템 설정 → 네트워크 → 방화벽 → 옵션에서 DSH / node를 「수신 연결 허용」으로 설정하세요. 진단 중에는 아예 꺼도 됩니다:`,"panel.onboarding.macStep3":`3. 같은 Wi-Fi에서도 안 되면 휴대폰과 컴퓨터가 실제로 같은 서브넷인지(게스트 네트워크가 아닌지) 확인하세요.`,"panel.onboarding.winStep1":`1. PowerShell(관리자)에서 방화벽 프로필 확인:`,"panel.onboarding.winStep2":`2. 직접 연결 포트 허용:`,"panel.onboarding.winStep3":`3. 예전에 node에 차단 규칙을 만들었다면 그 Block 규칙을 삭제하고, 네트워크 종류를 「공용」이 아닌 「전용」으로 설정하세요.`,"panel.onboarding.prompt.intro":`문제 하나를 진단해 주세요.`,"panel.onboarding.prompt.situation":`상황: 컴퓨터에 DSH(DeepSeek Harness) 모바일 플러그인이 설치되어 있고, 휴대폰 앱에서 LAN 직접 연결로 이 컴퓨터에 접속되지 않습니다.`,"panel.onboarding.prompt.address":`휴대폰에 입력한 주소는 이 컴퓨터의 LAN 주소와 포트입니다(정확한 주소와 포트는 모바일 플러그인의 웹 페이지에서 확인해야 하며, LAN 주소여야 합니다).`,"panel.onboarding.prompt.guess":`컴퓨터 쪽에서는 플러그인이 수신 대기 중이라고 표시되지만 휴대폰에서는 접속되지 않습니다. 컴퓨터 방화벽(또는 클라우드 보안 그룹)이 그 포트를 막고 있다고 생각합니다.`,"panel.onboarding.prompt.ask":`요청 사항:`,"panel.onboarding.prompt.ask1":`1. 먼저 제 시스템이 Linux / macOS / Windows 중 무엇인지 확인해 주세요(모르면 저에게 물어보거나 확인 방법을 알려주세요).`,"panel.onboarding.prompt.ask2":`2. 제 환경에 맞는 절차를 하나씩 확인하고, 그 포트가 지금 열려 있는지 어디서 막히는지 알려주세요.`,"panel.onboarding.prompt.ask3":`3. 포트를 허용할 구체적인 명령이나 클릭 경로를 제시하고, 관리자 권한이 필요한 곳은 분명히 알려주세요.`,"panel.onboarding.prompt.ask4":`4. 마지막으로 잘 되는지 확인하는 방법(컴퓨터와 휴대폰에서 각각 실행할 명령 등)을 알려주세요.`,"panel.onboarding.prompt.extra":`참고: 이 컴퓨터가 클라우드 서버라면 사업자 콘솔의 보안 그룹/방화벽에서도 같은 포트를 허용해야 하며, 이는 로컬에서 확인할 수 없습니다.`,"panel.onboarding.relayPlaceholder":`https://릴레이-도메인`}},{"zh-Hans":{"panel.update.title":`插件更新`,"panel.update.unknownVersion":`未知版本`,"panel.update.reading":`正在读更新状态…`,"panel.update.runningVersion":`运行中版本`,"panel.update.diskVersion":`盘上的版本`,"panel.update.latestOnline":`线上最新`,"panel.update.notChecked":`还没查过`,"panel.update.neverUpdated":`还没更新过`,"panel.update.source":`安装来源`,"panel.update.action":`更新操作`,"panel.update.switching":`正在切换…`,"panel.update.idle":`空闲`,"panel.update.lastCheck":`最近一次检查`,"panel.update.lastApply":`最近一次更新`,"panel.update.hasNew":`线上有新版本。`,"panel.update.nothingToInstall":`这台宿主的面板里不装新代码(当前这份实现是直接被挂载的):无头 / 源码同步部署到服务器上同步源码 + 重启宿主服务;桌面端旧版到「设置 → 插件 → 本插件」里更新一版。`,"panel.update.noMarketTitle":`这台机器上没有可用的插件市场`,"panel.update.noMarketBody":`插件从 npm 分发,更新由 DSH 的插件市场负责:到「设置 → 插件」里更新本插件(或装上插件市场)。`,"panel.update.autoUpdate":`自动更新`,"panel.update.shellChangedTitle":`这次更新里外壳也换了`,"panel.update.shellChangedBody":`它有极少数改动要等下次启动 DSH 才生效(更新本身已经生效,不用管)。`,"panel.update.restartSidecar":`重启 sidecar`,"panel.update.checking":`正在检查…`,"panel.update.check":`检查更新`,"panel.update.updating":`正在更新…`,"panel.update.updateNow":`立即更新`,"panel.update.forceHint":`强制更新(有对话在跑、或刚发布的,也照装)`,"panel.update.resultHasNew":`有新版可以装`,"panel.update.resultUpToDate":`已经是最新版`,"panel.update.otaSection":`本机调试 OTA`,"panel.update.otaLocalOnly":`仅本机`,"panel.update.otaVersion":`当前 OTA 版本`,"panel.update.otaAbsorbState":`正式版覆盖状态`,"panel.update.otaAbsorbed":`已被正式版 {version} 覆盖`,"panel.update.otaNotAbsorbed":`尚未被正式版覆盖`,"panel.update.otaNothing":`无待吸收的 OTA`,"panel.update.otaCheck":`检查紧急 OTA`,"panel.update.otaInstall":`立即安装`,"panel.update.otaBusy":`处理中…`,"panel.update.otaNone":`无`,"panel.update.otaFound":`发现紧急 OTA {version}。`,"panel.update.otaNotFound":`没有可安装的紧急 OTA。`,"panel.update.debugInstalled":`已安装调试 OTA {version}。`,"panel.update.debugNone":`没有安装新的调试 OTA。`,"panel.update.applyUpToDate":`已经是最新版({version}),没有改动任何文件。`,"panel.update.applyUpToDatePlain":`已经是最新版,没有改动任何文件。`,"panel.update.applyDiskUnchanged":`装了但盘上的版本没变(还是 {version}),这次不算数,可以再点一次。`,"panel.update.applyFailedRetry":`这次更新没成,可以再点一次。`,"panel.update.applySwitched":`已就地切到 {version},无需重启。`,"panel.update.applySwitchedPlain":`已就地切到新版本,无需重启。`,"panel.update.autoOn":`自动更新已开启:每 {minutes} 分钟查一次,有新版会直接装好并就地生效。`,"panel.update.autoOff":`自动更新已关闭,之后只在点「检查更新」时才问市场。`,"panel.update.autoToggleFailed":`自动更新开关没保存成功:{message}`,"panel.update.versionDrift":`这两个版本对不上:面板报的 {version} 是进程启动时读进内存的,外壳实际装载的是 {shell}。一般是外壳刚换过代、页面还没重新读取;刷新一下这一页就一致了。`,"panel.update.checkResult":`检查结果`,"panel.update.applyFailed":`这次更新没成:{message}`,"panel.update.finishingInFlight":`正在收尾在飞请求({count} 个)…`},"zh-Hant":{"panel.update.title":`外掛更新`,"panel.update.unknownVersion":`未知版本`,"panel.update.reading":`正在讀取更新狀態…`,"panel.update.runningVersion":`執行中版本`,"panel.update.diskVersion":`磁碟上版本`,"panel.update.latestOnline":`線上最新`,"panel.update.notChecked":`還沒查過`,"panel.update.neverUpdated":`還沒更新過`,"panel.update.source":`安裝來源`,"panel.update.action":`更新操作`,"panel.update.switching":`正在切換…`,"panel.update.idle":`閒置`,"panel.update.lastCheck":`最近一次檢查`,"panel.update.lastApply":`最近一次更新`,"panel.update.hasNew":`線上已有新版本。`,"panel.update.nothingToInstall":`這台宿主的面板裡不裝新程式碼(目前這份實作是直接被掛載的):無頭 / 原始碼同步部署到伺服器上同步原始碼 + 重新啟動宿主服務;桌面端舊版到「設定 → 外掛 → 本外掛」裡更新一版。`,"panel.update.noMarketTitle":`這台機器上沒有可用的外掛市場`,"panel.update.noMarketBody":`外掛從 npm 發佈,更新由 DSH 的外掛市場負責:到「設定 → 外掛」裡更新本外掛(或裝上外掛市場)。`,"panel.update.autoUpdate":`自動更新`,"panel.update.shellChangedTitle":`這次更新裡外殼也換了`,"panel.update.shellChangedBody":`它有極少數改動要等下次啟動 DSH 才生效(更新本身已經生效,不用管)。`,"panel.update.restartSidecar":`重新啟動 sidecar`,"panel.update.checking":`正在檢查…`,"panel.update.check":`檢查更新`,"panel.update.updating":`正在更新…`,"panel.update.updateNow":`立即更新`,"panel.update.forceHint":`強制更新(有對話在跑、或剛發佈的,也照裝)`,"panel.update.resultHasNew":`有新版可以裝`,"panel.update.resultUpToDate":`已經是最新版`,"panel.update.otaSection":`本機偵錯 OTA`,"panel.update.otaLocalOnly":`僅本機`,"panel.update.otaVersion":`目前 OTA 版本`,"panel.update.otaAbsorbState":`正式版覆蓋狀態`,"panel.update.otaAbsorbed":`已被正式版 {version} 覆蓋`,"panel.update.otaNotAbsorbed":`尚未被正式版覆蓋`,"panel.update.otaNothing":`無待吸收的 OTA`,"panel.update.otaCheck":`檢查緊急 OTA`,"panel.update.otaInstall":`立即安裝`,"panel.update.otaBusy":`處理中…`,"panel.update.otaNone":`無`,"panel.update.otaFound":`發現緊急 OTA {version}。`,"panel.update.otaNotFound":`沒有可安裝的緊急 OTA。`,"panel.update.debugInstalled":`已安裝偵錯 OTA {version}。`,"panel.update.debugNone":`沒有安裝新的偵錯 OTA。`,"panel.update.applyUpToDate":`已經是最新版({version}),沒有改動任何檔案。`,"panel.update.applyUpToDatePlain":`已經是最新版,沒有改動任何檔案。`,"panel.update.applyDiskUnchanged":`裝了但磁碟上的版本沒變(還是 {version}),這次不算數,可以再點一次。`,"panel.update.applyFailedRetry":`這次更新沒成,可以再點一次。`,"panel.update.applySwitched":`已就地切到 {version},無需重新啟動。`,"panel.update.applySwitchedPlain":`已就地切到新版本,無需重新啟動。`,"panel.update.autoOn":`自動更新已開啟:每 {minutes} 分鐘查一次,有新版會直接裝好並就地生效。`,"panel.update.autoOff":`自動更新已關閉,之後只在點「檢查更新」時才問市場。`,"panel.update.autoToggleFailed":`自動更新開關沒有儲存成功:{message}`,"panel.update.versionDrift":`這兩個版本對不上:面板報的 {version} 是程序啟動時讀進記憶體的,外殼實際裝載的是 {shell}。一般是外殼剛換過代、頁面還沒重新讀取;重新整理這一頁就一致了。`,"panel.update.checkResult":`檢查結果`,"panel.update.finishingInFlight":`正在收尾在飛請求({count} 個)…`,"panel.update.applyFailed":`這次更新沒成:{message}`},en:{"panel.update.title":`Plugin update`,"panel.update.unknownVersion":`Unknown version`,"panel.update.reading":`Reading update status…`,"panel.update.runningVersion":`Running version`,"panel.update.diskVersion":`Installed version`,"panel.update.latestOnline":`Latest online`,"panel.update.notChecked":`Not checked yet`,"panel.update.neverUpdated":`Never updated`,"panel.update.source":`Installed from`,"panel.update.action":`Update action`,"panel.update.switching":`Switching…`,"panel.update.idle":`Idle`,"panel.update.lastCheck":`Last check`,"panel.update.lastApply":`Last update`,"panel.update.hasNew":`A new version is available online.`,"panel.update.nothingToInstall":`This host’s panel does not install new code (this implementation is mounted directly): for headless or source-synced deployments, sync the source and restart the host service; on an older desktop build, update it under Settings → Plugins → This plugin.`,"panel.update.noMarketTitle":`No usable plugin marketplace on this machine`,"panel.update.noMarketBody":`The plugin is distributed via npm and updated by DSH’s plugin marketplace: go to Settings → Plugins to update it (or install the marketplace).`,"panel.update.autoUpdate":`Auto-update`,"panel.update.shellChangedTitle":`This update also changed the shell`,"panel.update.shellChangedBody":`A few of its changes take effect the next time DSH starts (the update itself is already in effect — nothing to do).`,"panel.update.restartSidecar":`Restart sidecar`,"panel.update.checking":`Checking…`,"panel.update.check":`Check for updates`,"panel.update.updating":`Updating…`,"panel.update.updateNow":`Update now`,"panel.update.forceHint":`Forced update (installs even with chats running or right after release)`,"panel.update.resultHasNew":`A new version is available`,"panel.update.resultUpToDate":`Already up to date`,"panel.update.otaSection":`Local debug OTA`,"panel.update.otaLocalOnly":`This machine only`,"panel.update.otaVersion":`Current OTA version`,"panel.update.otaAbsorbState":`Release coverage`,"panel.update.otaAbsorbed":`Superseded by release {version}`,"panel.update.otaNotAbsorbed":`Not yet superseded by the release`,"panel.update.otaNothing":`No OTA to absorb`,"panel.update.otaCheck":`Check for urgent OTA`,"panel.update.otaInstall":`Install now`,"panel.update.otaBusy":`Working…`,"panel.update.otaNone":`None`,"panel.update.otaFound":`Urgent OTA {version} found.`,"panel.update.otaNotFound":`No urgent OTA to install.`,"panel.update.debugInstalled":`Debug OTA {version} installed.`,"panel.update.debugNone":`No new debug OTA installed.`,"panel.update.applyUpToDate":`Already up to date ({version}); no files changed.`,"panel.update.applyUpToDatePlain":`Already up to date; no files changed.`,"panel.update.applyDiskUnchanged":`Installed but the on-disk version is unchanged ({version}); this attempt did not count — try again.`,"panel.update.applyFailedRetry":`This update did not go through; try again.`,"panel.update.applySwitched":`Switched to {version} in place; no restart needed.`,"panel.update.applySwitchedPlain":`Switched to the new version in place; no restart needed.`,"panel.update.autoOn":`Auto-update on: checks every {minutes} minutes and installs new versions in place.`,"panel.update.autoOff":`Auto-update off: the marketplace is only asked when you tap “Check for updates”.`,"panel.update.autoToggleFailed":`Could not save the auto-update switch: {message}`,"panel.update.versionDrift":`These two versions disagree: the panel reports {version} (read into memory at process start) while the shell actually loaded {shell}. Usually the shell was just replaced and this page has not re-read it; refresh the page.`,"panel.update.checkResult":`Result`,"panel.update.finishingInFlight":`Finishing {count} in-flight request(s)…`,"panel.update.applyFailed":`This update did not go through: {message}`},ja:{"panel.update.title":`プラグインの更新`,"panel.update.unknownVersion":`不明なバージョン`,"panel.update.reading":`更新状態を読み込み中…`,"panel.update.runningVersion":`実行中のバージョン`,"panel.update.diskVersion":`ディスク上のバージョン`,"panel.update.latestOnline":`オンライン最新`,"panel.update.notChecked":`まだ確認していません`,"panel.update.neverUpdated":`まだ更新していません`,"panel.update.source":`インストール元`,"panel.update.action":`更新操作`,"panel.update.switching":`切り替え中…`,"panel.update.idle":`待機中`,"panel.update.lastCheck":`最後の確認`,"panel.update.lastApply":`最後の更新`,"panel.update.hasNew":`オンラインに新しい版があります。`,"panel.update.nothingToInstall":`このホストのパネルでは新しいコードをインストールしません(現在の実装は直接マウントされています)。ヘッドレス/ソース同期配備ではソースを同期してホストサービスを再起動してください。古いデスクトップ版では「設定 → プラグイン → 本プラグイン」から更新してください。`,"panel.update.noMarketTitle":`このマシンには利用可能なプラグインマーケットがありません`,"panel.update.noMarketBody":`プラグインは npm で配布され、更新は DSH のプラグインマーケットが担います。「設定 → プラグイン」から更新してください(またはマーケットを入れてください)。`,"panel.update.autoUpdate":`自動更新`,"panel.update.shellChangedTitle":`この更新では外側も変わりました`,"panel.update.shellChangedBody":`ごく一部の変更は次に DSH を起動したときに有効になります(更新自体は既に有効です。何もする必要はありません)。`,"panel.update.restartSidecar":`サイドカーを再起動`,"panel.update.checking":`確認中…`,"panel.update.check":`更新を確認`,"panel.update.updating":`更新中…`,"panel.update.updateNow":`今すぐ更新`,"panel.update.forceHint":`強制更新(会話が実行中でも、公開直後でもインストールします)`,"panel.update.resultHasNew":`新しい版をインストールできます`,"panel.update.resultUpToDate":`最新版です`,"panel.update.otaSection":`ローカルデバッグ OTA`,"panel.update.otaLocalOnly":`このマシンのみ`,"panel.update.otaVersion":`現在の OTA バージョン`,"panel.update.otaAbsorbState":`正式版による上書き状態`,"panel.update.otaAbsorbed":`正式版 {version} で上書き済み`,"panel.update.otaNotAbsorbed":`まだ正式版で上書きされていません`,"panel.update.otaNothing":`取り込む OTA はありません`,"panel.update.otaCheck":`緊急 OTA を確認`,"panel.update.otaInstall":`今すぐインストール`,"panel.update.otaBusy":`処理中…`,"panel.update.otaNone":`なし`,"panel.update.otaFound":`緊急 OTA {version} が見つかりました。`,"panel.update.otaNotFound":`インストールできる緊急 OTA はありません。`,"panel.update.debugInstalled":`デバッグ OTA {version} をインストールしました。`,"panel.update.debugNone":`新しいデバッグ OTA はインストールしていません。`,"panel.update.applyUpToDate":`最新版({version})です。ファイルは変更していません。`,"panel.update.applyUpToDatePlain":`最新版です。ファイルは変更していません。`,"panel.update.applyDiskUnchanged":`インストールしましたがディスク上のバージョンが変わりません({version})。今回は反映されていないので、もう一度お試しください。`,"panel.update.applyFailedRetry":`今回の更新は完了しませんでした。もう一度お試しください。`,"panel.update.applySwitched":`{version} にその場で切り替えました。再起動は不要です。`,"panel.update.applySwitchedPlain":`新しい版にその場で切り替えました。再起動は不要です。`,"panel.update.autoOn":`自動更新をオンにしました。{minutes} 分ごとに確認し、新しい版があれば自動でインストールして反映します。`,"panel.update.autoOff":`自動更新をオフにしました。以降は「更新を確認」を押したときだけマーケットに問い合わせます。`,"panel.update.autoToggleFailed":`自動更新の切り替えを保存できませんでした:{message}`,"panel.update.versionDrift":`この 2 つのバージョンが一致しません。パネルが報告している {version} はプロセス起動時に読み込んだ値で、実際に読み込まれた外側は {shell} です。多くの場合、外側が入れ替わった直後でページが再読み込みされていないだけです。このページを再読み込みしてください。`,"panel.update.checkResult":`確認結果`,"panel.update.finishingInFlight":`実行中のリクエストを収束中({count} 件)…`,"panel.update.applyFailed":`今回の更新は完了しませんでした:{message}`},ko:{"panel.update.title":`플러그인 업데이트`,"panel.update.unknownVersion":`알 수 없는 버전`,"panel.update.reading":`업데이트 상태를 읽는 중…`,"panel.update.runningVersion":`실행 중 버전`,"panel.update.diskVersion":`디스크 버전`,"panel.update.latestOnline":`온라인 최신`,"panel.update.notChecked":`아직 확인하지 않았습니다`,"panel.update.neverUpdated":`업데이트한 적 없습니다`,"panel.update.source":`설치 출처`,"panel.update.action":`업데이트 작업`,"panel.update.switching":`전환 중…`,"panel.update.idle":`대기 중`,"panel.update.lastCheck":`마지막 확인`,"panel.update.lastApply":`마지막 업데이트`,"panel.update.hasNew":`온라인에 새 버전이 있습니다.`,"panel.update.nothingToInstall":`이 호스트의 패널은 새 코드를 설치하지 않습니다(현재 구현은 직접 마운트됩니다). 헤드리스 또는 소스 동기화 배포에서는 소스를 동기화하고 호스트 서비스를 재시작하세요. 이전 데스크톱 버전에서는 설정 → 플러그인 → 이 플러그인에서 업데이트하세요.`,"panel.update.noMarketTitle":`이 컴퓨터에는 사용 가능한 플러그인 마켓이 없습니다`,"panel.update.noMarketBody":`플러그인은 npm으로 배포되며 DSH의 플러그인 마켓에서 업데이트합니다. 설정 → 플러그인에서 업데이트하세요(또는 마켓을 설치하세요).`,"panel.update.autoUpdate":`자동 업데이트`,"panel.update.shellChangedTitle":`이 업데이트에서 외형도 바뀌었습니다`,"panel.update.shellChangedBody":`일부 변경은 DSH를 다음에 시작할 때 적용됩니다(업데이트 자체는 이미 적용되었으니 신경 쓰지 않으셔도 됩니다).`,"panel.update.restartSidecar":`사이드카 재시작`,"panel.update.checking":`확인 중…`,"panel.update.check":`업데이트 확인`,"panel.update.updating":`업데이트 중…`,"panel.update.updateNow":`지금 업데이트`,"panel.update.forceHint":`강제 업데이트(대화가 실행 중이거나 방금 배포된 경우에도 설치)`,"panel.update.resultHasNew":`새 버전을 설치할 수 있습니다`,"panel.update.resultUpToDate":`이미 최신 버전입니다`,"panel.update.otaSection":`로컬 디버그 OTA`,"panel.update.otaLocalOnly":`이 컴퓨터만`,"panel.update.otaVersion":`현재 OTA 버전`,"panel.update.otaAbsorbState":`정식 버전 덮어쓰기 상태`,"panel.update.otaAbsorbed":`정식 버전 {version}(으)로 대체됨`,"panel.update.otaNotAbsorbed":`아직 정식 버전으로 대체되지 않음`,"panel.update.otaNothing":`흡수할 OTA가 없습니다`,"panel.update.otaCheck":`긴급 OTA 확인`,"panel.update.otaInstall":`지금 설치`,"panel.update.otaBusy":`처리 중…`,"panel.update.otaNone":`없음`,"panel.update.otaFound":`긴급 OTA {version}을(를) 찾았습니다.`,"panel.update.otaNotFound":`설치할 긴급 OTA가 없습니다.`,"panel.update.debugInstalled":`디버그 OTA {version}을(를) 설치했습니다.`,"panel.update.debugNone":`새 디버그 OTA를 설치하지 않았습니다.`,"panel.update.applyUpToDate":`이미 최신 버전({version})이며 파일을 변경하지 않았습니다.`,"panel.update.applyUpToDatePlain":`이미 최신 버전이며 파일을 변경하지 않았습니다.`,"panel.update.applyDiskUnchanged":`설치했지만 디스크 버전이 그대로입니다({version}). 이번 시도는 반영되지 않았으니 다시 시도하세요.`,"panel.update.applyFailedRetry":`이번 업데이트가 완료되지 않았습니다. 다시 시도하세요.`,"panel.update.applySwitched":`{version}(으)로 즉시 전환했습니다. 재시작이 필요 없습니다.`,"panel.update.applySwitchedPlain":`새 버전으로 즉시 전환했습니다. 재시작이 필요 없습니다.`,"panel.update.autoOn":`자동 업데이트를 켰습니다. {minutes}분마다 확인하고 새 버전이 있으면 바로 설치해 적용합니다.`,"panel.update.autoOff":`자동 업데이트를 껐습니다. 이후에는 「업데이트 확인」을 눌렀을 때만 마켓에 문의합니다.`,"panel.update.autoToggleFailed":`자동 업데이트 스위치를 저장하지 못했습니다: {message}`,"panel.update.versionDrift":`두 버전이 일치하지 않습니다. 패널이 보고하는 {version}은 프로세스 시작 시 읽은 값이고, 실제로 로드된 외형은 {shell}입니다. 보통 외형이 막 교체되어 페이지가 다시 읽지 않은 경우이니 이 페이지를 새로 고치세요.`,"panel.update.checkResult":`확인 결과`,"panel.update.finishingInFlight":`진행 중인 요청 {count}개 마무리 중…`,"panel.update.applyFailed":`이번 업데이트가 완료되지 않았습니다: {message}`}},{"zh-Hans":{"panel.devices.title":`已绑定的设备`,"panel.devices.unknown":`未知设备`,"panel.devices.unknownPlatform":`未知平台`,"panel.devices.legacy":`旧式`,"panel.devices.boundAt":`绑定于 {time}`,"panel.devices.online":`在线`,"panel.devices.noRecord":`无记录`,"panel.devices.channelRelay":`经中转`,"panel.devices.channelLan":`局域网`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`加密`,"panel.devices.plain":`明文`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`刚刚`,"panel.devices.minutesAgo":`{count} 分钟前`,"panel.devices.hoursAgo":`{count} 小时前`,"panel.devices.daysAgo":`{count} 天前`,"panel.devices.cancel":`取消`,"panel.devices.unbind":`解除绑定`,"panel.devices.unbinding":`解除中…`,"panel.devices.unbindTitle":`解除绑定`,"panel.devices.unbindConfirm":`确定要解除「{name}」的绑定?`,"panel.devices.unbindDone":`已解除「{name}」的绑定({count} 条凭据)。`,"panel.devices.unbindDoneClosed":`已解除「{name}」的绑定({count} 条凭据,断开 {closed} 条连接)。`,"panel.devices.unbindFailed":`解除绑定失败:{message}`,"panel.devices.effectIdentity":`下次请求起失效。`,"panel.devices.effectLegacy":`只吊销凭据,旧的通行证仍可能在到期前可用;要立即失效请用『吊销全部』。`,"panel.devices.allowTitle":`允许新设备绑定`,"panel.devices.allowOn":`已允许`,"panel.devices.allowOff":`已关闭`,"panel.devices.allowOnHint":`新手机扫码后可以直接绑上`,"panel.devices.allowOffHint":`不再接受新的配对请求`,"panel.devices.allowOffNote":`关掉后这台电脑不收新设备,已绑定的手机照常用`,"panel.devices.policyAllowed":`已允许新设备绑定。`,"panel.devices.policyDenied":`已停止接收新设备,已绑定的手机照常可用。`},"zh-Hant":{"panel.devices.title":`已綁定的裝置`,"panel.devices.unknown":`未知裝置`,"panel.devices.unknownPlatform":`未知平台`,"panel.devices.legacy":`舊式`,"panel.devices.boundAt":`綁定於 {time}`,"panel.devices.online":`線上`,"panel.devices.noRecord":`無紀錄`,"panel.devices.channelRelay":`經中轉`,"panel.devices.channelLan":`區域網路`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`加密`,"panel.devices.plain":`明文`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`剛剛`,"panel.devices.minutesAgo":`{count} 分鐘前`,"panel.devices.hoursAgo":`{count} 小時前`,"panel.devices.daysAgo":`{count} 天前`,"panel.devices.cancel":`取消`,"panel.devices.unbind":`解除綁定`,"panel.devices.unbinding":`解除中…`,"panel.devices.unbindTitle":`解除綁定`,"panel.devices.unbindConfirm":`確定要解除「{name}」的綁定?`,"panel.devices.unbindDone":`已解除「{name}」的綁定({count} 條憑證)。`,"panel.devices.unbindDoneClosed":`已解除「{name}」的綁定({count} 條憑證,斷開 {closed} 條連線)。`,"panel.devices.unbindFailed":`解除綁定失敗:{message}`,"panel.devices.effectIdentity":`下次請求起失效。`,"panel.devices.effectLegacy":`只吊銷憑證,舊的通行證仍可能在到期前可用;要立即失效請用『吊銷全部』。`,"panel.devices.allowTitle":`允許新裝置綁定`,"panel.devices.allowOn":`已允許`,"panel.devices.allowOff":`已關閉`,"panel.devices.allowOnHint":`新手機掃碼後可以直接綁上`,"panel.devices.allowOffHint":`不再接受新的配對請求`,"panel.devices.allowOffNote":`關掉後這台電腦不收新裝置,已綁定的手機照常用`,"panel.devices.policyAllowed":`已允許新裝置綁定。`,"panel.devices.policyDenied":`已停止接收新裝置,已綁定的手機照常可用。`},en:{"panel.devices.title":`Paired devices`,"panel.devices.unknown":`Unknown device`,"panel.devices.unknownPlatform":`Unknown platform`,"panel.devices.legacy":`Legacy`,"panel.devices.boundAt":`Paired {time}`,"panel.devices.online":`Online`,"panel.devices.noRecord":`No record`,"panel.devices.channelRelay":`Via relay`,"panel.devices.channelLan":`LAN`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`Encrypted`,"panel.devices.plain":`Plaintext`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`just now`,"panel.devices.minutesAgo":`{count} min ago`,"panel.devices.hoursAgo":`{count} h ago`,"panel.devices.daysAgo":`{count} d ago`,"panel.devices.cancel":`Cancel`,"panel.devices.unbind":`Unbind`,"panel.devices.unbinding":`Unbinding…`,"panel.devices.unbindTitle":`Unbind device`,"panel.devices.unbindConfirm":`Unbind “{name}”?`,"panel.devices.unbindDone":`Unbound “{name}” ({count} credentials).`,"panel.devices.unbindDoneClosed":`Unbound “{name}” ({count} credentials, {closed} connections closed).`,"panel.devices.unbindFailed":`Could not unbind: {message}`,"panel.devices.effectIdentity":`Takes effect from the next request.`,"panel.devices.effectLegacy":`This revokes the stored credential only; the old pass may still work until it expires. Use “Revoke all” to cut it off immediately.`,"panel.devices.allowTitle":`Allow new devices to pair`,"panel.devices.allowOn":`Allowed`,"panel.devices.allowOff":`Off`,"panel.devices.allowOnHint":`A new phone can pair right after scanning`,"panel.devices.allowOffHint":`New pairing requests are refused`,"panel.devices.allowOffNote":`While off, this computer accepts no new devices; already-paired phones keep working.`,"panel.devices.policyAllowed":`New devices may now pair.`,"panel.devices.policyDenied":`New devices are now refused; already-paired phones keep working.`},ja:{"panel.devices.title":`ペアリング済みのデバイス`,"panel.devices.unknown":`不明なデバイス`,"panel.devices.unknownPlatform":`不明なプラットフォーム`,"panel.devices.legacy":`旧形式`,"panel.devices.boundAt":`{time}にペアリング`,"panel.devices.online":`オンライン`,"panel.devices.noRecord":`記録なし`,"panel.devices.channelRelay":`リレー経由`,"panel.devices.channelLan":`LAN`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`暗号化`,"panel.devices.plain":`平文`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`たった今`,"panel.devices.minutesAgo":`{count} 分前`,"panel.devices.hoursAgo":`{count} 時間前`,"panel.devices.daysAgo":`{count} 日前`,"panel.devices.cancel":`キャンセル`,"panel.devices.unbind":`バインド解除`,"panel.devices.unbinding":`解除中…`,"panel.devices.unbindTitle":`バインド解除`,"panel.devices.unbindConfirm":`「{name}」のバインドを解除しますか?`,"panel.devices.unbindDone":`「{name}」のバインドを解除しました(資格情報 {count} 件)。`,"panel.devices.unbindDoneClosed":`「{name}」のバインドを解除しました(資格情報 {count} 件、接続 {closed} 件を切断)。`,"panel.devices.unbindFailed":`バインド解除に失敗しました:{message}`,"panel.devices.effectIdentity":`次のリクエストから無効になります。`,"panel.devices.effectLegacy":`取り消されるのは保存された資格情報だけです。古いパスは有効期限まで使える可能性があります。即時に切るには「すべて取り消す」を使ってください。`,"panel.devices.allowTitle":`新しいデバイスのバインドを許可`,"panel.devices.allowOn":`許可中`,"panel.devices.allowOff":`停止中`,"panel.devices.allowOnHint":`新しいスマートフォンはスキャン後すぐにバインドできます`,"panel.devices.allowOffHint":`新しいペアリング要求は拒否されます`,"panel.devices.allowOffNote":`停止中はこのコンピューターは新しいデバイスを受け付けません。バインド済みのスマートフォンはそのまま使えます。`,"panel.devices.policyAllowed":`新しいデバイスのバインドを許可しました。`,"panel.devices.policyDenied":`新しいデバイスの受け付けを停止しました。バインド済みのスマートフォンはそのまま使えます。`},ko:{"panel.devices.title":`페어링된 기기`,"panel.devices.unknown":`알 수 없는 기기`,"panel.devices.unknownPlatform":`알 수 없는 플랫폼`,"panel.devices.legacy":`구형`,"panel.devices.boundAt":`{time}에 페어링`,"panel.devices.online":`온라인`,"panel.devices.noRecord":`기록 없음`,"panel.devices.channelRelay":`릴레이 경유`,"panel.devices.channelLan":`LAN`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`암호화`,"panel.devices.plain":`평문`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`방금`,"panel.devices.minutesAgo":`{count}분 전`,"panel.devices.hoursAgo":`{count}시간 전`,"panel.devices.daysAgo":`{count}일 전`,"panel.devices.cancel":`취소`,"panel.devices.unbind":`바인딩 해제`,"panel.devices.unbinding":`해제 중…`,"panel.devices.unbindTitle":`바인딩 해제`,"panel.devices.unbindConfirm":`「{name}」의 바인딩을 해제하시겠습니까?`,"panel.devices.unbindDone":`「{name}」의 바인딩을 해제했습니다(자격 증명 {count}개).`,"panel.devices.unbindDoneClosed":`「{name}」의 바인딩을 해제했습니다(자격 증명 {count}개, 연결 {closed}개 종료).`,"panel.devices.unbindFailed":`바인딩 해제에 실패했습니다: {message}`,"panel.devices.effectIdentity":`다음 요청부터 무효가 됩니다.`,"panel.devices.effectLegacy":`저장된 자격 증명만 취소됩니다. 예전 통행증은 만료 전까지 계속 쓸 수 있습니다. 즉시 끊으려면 「모두 취소」를 사용하세요.`,"panel.devices.allowTitle":`새 기기 바인딩 허용`,"panel.devices.allowOn":`허용됨`,"panel.devices.allowOff":`꺼짐`,"panel.devices.allowOnHint":`새 휴대폰은 스캔 후 바로 바인딩할 수 있습니다`,"panel.devices.allowOffHint":`새 페어링 요청을 거부합니다`,"panel.devices.allowOffNote":`꺼져 있으면 이 컴퓨터는 새 기기를 받지 않습니다. 이미 바인딩된 휴대폰은 그대로 쓸 수 있습니다.`,"panel.devices.policyAllowed":`새 기기 바인딩을 허용했습니다.`,"panel.devices.policyDenied":`새 기기 받기를 중지했습니다. 이미 바인딩된 휴대폰은 그대로 쓸 수 있습니다.`}}],xb=(()=>{let e={"zh-Hans":{},"zh-Hant":{},en:{},ja:{},ko:{}};for(let t of Object.keys(e))e[t]=vb(bb.map(e=>e[t]??{}));return e})();function $(e,t){return yb(xb,gb(),e,t)}function Sb(e){return Ar(e.defaultTagName??`div`,e,e)}var Cb=[`before:pointer-events-none`,`before:absolute`,`before:inset-0`,`before:-z-1`,`before:rounded-[inherit]`,`[a,button]:before:transition-[opacity,background-color,border-color]`,`[a,button]:before:duration-250`,`motion-reduce:[a,button]:before:transition-none`],wb=Sl(`relative isolate inline-flex shrink-0 items-center justify-center rounded-full whitespace-nowrap outline-offset-1 select-none [&_svg]:shrink-0 [a,button]:transform-gpu [a,button]:cursor-pointer [a,button]:transition [a,button]:duration-250 [a,button]:ease-[cubic-bezier(0.175,0.885,0.32,1.5)] [a,button]:not-data-popup-open:active:translate-y-px [a,button]:not-data-popup-open:active:scale-[0.97] [a,button]:not-data-popup-open:active:duration-100 [a,button]:not-data-popup-open:active:ease-in-out motion-reduce:[a,button]:transition-none`,{variants:{variant:{primary:Z(Cb,`bg-primary text-primary-foreground outline-ring-primary [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--primary)_0%,var(--primary-muted)_75%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),"primary-outline":Z(Cb,`text-primary before:border before:border-primary outline-ring-primary`,`[a,button]:hover:before:bg-primary [a,button]:hover:text-primary-foreground`,`[a,button]:data-pressed:before:bg-primary [a,button]:data-pressed:text-primary-foreground`,`[a,button]:data-popup-open:before:bg-primary [a,button]:data-popup-open:text-primary-foreground`),secondary:Z(Cb,`bg-secondary-muted text-secondary-foreground outline-ring-secondary [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--secondary)_0%,var(--secondary-muted)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),soft:Z(Cb,`text-foreground-intense before:bg-background-muted before:backdrop-blur-md [a,button]:before:border [a,button]:before:border-transparent outline-ring`,`data-[slot=breadcrumb-link]:not-data-active:text-foreground-muted data-[slot=breadcrumb-link]:hover:text-foreground-intense`,`[a,button]:hover:before:bg-background-subtle [a,button]:hover:before:border-border`,`[a,button]:data-pressed:before:bg-background-subtle [a,button]:data-pressed:before:border-border`,`[a,button]:data-popup-open:before:bg-background-subtle [a,button]:data-popup-open:before:border-border`,`data-active:before:bg-background-subtle data-active:border data-active:before:border-border`),outline:Z(Cb,`bg-background text-foreground-intense before:bg-background before:border-border before:border outline-ring`,`data-[slot=breadcrumb-link]:not-data-active:text-foreground-muted data-[slot=breadcrumb-link]:hover:text-foreground-intense`,`[a,button]:hover:before:bg-background-subtle [a,button]:hover:before:border-border-strong`,`[a,button]:data-pressed:before:bg-background-subtle [a,button]:data-pressed:before:border-border-strong`,`[a,button]:data-popup-open:before:bg-background-subtle [a,button]:data-popup-open:before:border-border-strong`,`data-active:before:bg-background-subtle data-active:before:border-border-strong`),error:Z(Cb,`bg-error-muted text-error-foreground outline-ring-error [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--error-muted)_0%,rgba(255,255,255,.5)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),success:Z(Cb,`bg-success-muted text-success-foreground outline-ring-success [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--success-muted)_0%,rgba(255,255,255,.5)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),warning:Z(Cb,`bg-warning-muted text-warning-foreground outline-ring-warning [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--warning-muted)_0%,rgba(255,255,255,.5)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),info:Z(Cb,`bg-info-muted text-info-foreground outline-ring-info [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--info-muted)_0%,rgba(255,255,255,.5)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),light:Z(Cb,`text-white before:bg-white/10 before:border-white/10 before:border before:backdrop-blur-md outline-ring-light`,`[a,button]:hover:before:bg-white/15 [a,button]:hover:before:border-white/15`,`[a,button]:data-pressed:before:bg-white/15 [a,button]:data-pressed:before:border-white/15`,`[a,button]:data-popup-open:before:bg-white/15 [a,button]:data-popup-open:before:border-white/15`,`data-active:before:bg-white/15 data-active:before:border-white/15`)},size:{xs:`h-4 w-fit gap-0.5 px-1.5 text-[.625rem] has-data-[icon=end]:pe-1.25 has-data-[icon=start]:ps-1.25 [&_svg:not([class*='size-'])]:size-2.5 [&_svg:not([class*='stroke-'])]:stroke-2`,sm:`h-5 w-fit gap-0.5 px-2 text-xs has-data-[icon=end]:pe-1.5 has-data-[icon=start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3 [&_svg:not([class*='stroke-'])]:stroke-[1.85]`,md:`h-6 w-fit gap-0.75 px-2.5 text-xs has-data-[icon=end]:pe-1.75 has-data-[icon=start]:ps-1.75 [&_svg:not([class*='size-'])]:size-3.5 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`,lg:`h-7 w-fit gap-1 px-3 text-sm has-data-[icon=end]:pe-2.25 has-data-[icon=start]:ps-2.25 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`,"icon-sm":`h-5 w-5 [&_svg:not([class*='size-'])]:size-3 [&_svg:not([class*='stroke-'])]:stroke-[1.85]`,"icon-md":`h-6 w-6 [&_svg:not([class*='size-'])]:size-3.5 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`,"icon-lg":`h-7 w-7 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`}},defaultVariants:{variant:`primary`,size:`md`}});function Tb({className:e,variant:t,size:n,render:r,...i}){let a=g.isValidElement(r)?r.props:void 0,o=g.isValidElement(r)&&(r.type===`a`||r.type===`button`)||i.onClick!=null||a?.href!=null||a?.onClick!=null||a?.tabIndex!=null;return Sb({defaultTagName:`span`,render:r,state:{variant:t,size:n},props:gr({"data-slot":`badge`,...o?yl():{},className:Z(wb({variant:t,size:n}),e)},i)})}var Eb=g.forwardRef(function(e,t){let{render:n,className:r,disabled:i=!1,focusableWhenDisabled:a=!1,nativeButton:o=!0,style:s,...c}=e,{getButtonProps:l,buttonRef:u}=Mi({disabled:i,focusableWhenDisabled:a,native:o});return Ar(`button`,e,{state:{disabled:i},ref:[t,u],props:[c,l]})}),Db=g.createContext(null);function Ob({className:e,variant:t,size:n,disabled:r,...i}){let a=g.useContext(Db),o=t??a?.variant,s=n??a?.size,c=r||a?.disabled;return(0,J.jsx)(Eb,{"data-slot":`button`,disabled:c,className:Z(wl({variant:o,size:s}),e),...i})}function kb(e,t,n,r,i){return g.isValidElement(t)?g.cloneElement(t,{...i,...t.props,className:Z(n,t.props.className,r)}):g.createElement(e,{...i,className:Z(n,r)})}var Ab=`[--card-radius:var(--radius-xl)]`,jb=`rounded-[calc(var(--card-radius)*4/3)]`,Mb={none:`rounded-(--card-radius)`,solid:Z(jb,`bg-background-muted/60 p-2 backdrop-blur-xl dark:bg-background-subtle`),glass:Z(jb,`border border-white/15 bg-white/10 p-2 backdrop-blur-sm`)},Nb={none:`border`,solid:`border-border-muted border`,glass:``};function Pb({frame:e=!1,inset:t=!0,className:n,contentProps:r,render:i,children:a,...o}){let s=e===!0?`solid`:e===!1?`none`:e;return kb(`div`,i,Z(`group/card flex flex-col`,Ab,Mb[s]),n,{"data-slot":`card`,"data-frame":s,...t?{"data-inset":``}:{},...o,children:(0,J.jsx)(`div`,{"data-slot":`card-content`,...r,className:Z(`bg-background flex min-h-0 flex-1 flex-col overflow-hidden rounded-(--card-radius)`,t&&`p-2`,Nb[s],r?.className),children:a})})}function Fb({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`card-header`,className:Z(`flex flex-1 flex-col gap-1.5 p-6 group-data-inset/card:px-4`,e),...t})}function Ib({className:e,render:t,...n}){return kb(`h3`,t,`text-foreground-intense text-lg font-semibold`,e,{"data-slot":`card-title`,...n})}function Lb({controlled:e,default:t,name:n,state:r=`value`}){let{current:i}=g.useRef(e!==void 0),[a,o]=g.useState(t);return[i&&e!==void 0?e:a,g.useCallback(e=>{i||o(e)},[])]}function Rb(e){return xi(e,`base-ui`)}var zb=g.createContext(void 0);function Bb(){let e=g.useContext(zb);if(e===void 0)throw Error(S(63));return e}var Vb=`data-valid`,Hb=`data-invalid`,Ub={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valid:null,valueMissing:!1},Wb={disabled:!1,valid:null,touched:!1,dirty:!1,filled:!1,focused:!1},Gb={valid(e){return e===null?null:e?{[Vb]:``}:{[Hb]:``}}},Kb=`data-checked`,qb=`data-unchecked`,Jb={...Gb,checked(e){return e?{[Kb]:``}:{[qb]:``}}},Yb={invalid:void 0,name:void 0,validityData:{state:Ub,errors:[],error:``,value:``,initialValue:null},setValidityData:p,disabled:void 0,setTouched:p,setDirty:p,setFilled:p,setFocused:p,validationMode:`onSubmit`,shouldValidateOnChange:()=>!1,state:Wb,registerFieldControl:p,validation:{getValidationProps:(e,t=h)=>t,inputRef:{current:null},registeredInputs:new Map,registerInput:p,getInputControl:()=>null,commit:async()=>{},change:p}},Xb=g.createContext(Yb);function Zb(e=!0){let t=g.useContext(Xb);if(t.setValidityData===p&&!e)throw Error(S(28));return t}function Qb(e,t,n,r,i=!0,a){let{registerFieldControl:o}=Zb(),s=y(()=>Symbol());b(()=>{let c=s.current;if(!i){o(c,void 0);return}o(c,{controlRef:e,getValue:r,id:t,name:a,value:n})},[e,i,r,t,a,o,s,n]),b(()=>{let e=s.current;return()=>{o(e,void 0)}},[o,s])}var $b=g.createContext({elementRef:{current:null},formRef:{current:{fields:new Map}},errors:{},clearErrors:p,validationMode:`onSubmit`,submitCountRef:{current:0}});function ex(){return g.useContext($b)}var tx=g.createContext({controlId:void 0,registerControlId:p,resetControlId:p,labelId:void 0,setLabelId:p,messageIds:[],setMessageIds:p,getDescriptionProps:e=>e});function nx(){return g.useContext(tx)}function rx(e,t,n,r=!0,i){let[a,o]=g.useState(),s=Rb(i?`${i}-label`:void 0),c=e??t??a;return b(()=>{let i=e||t||!r?void 0:ix(n.current,s);a!==i&&o(i)}),c}function ix(e,t){let n=ax(e);if(n)return!n.id&&t&&(n.id=t),n.id||void 0}function ax(e){if(!e)return;let t=e.parentElement;if(t&&t.tagName===`LABEL`)return t;let n=e.id;if(n){let t=e.nextElementSibling;if(t&&t.htmlFor===n)return t}let r=e.labels;return r&&r[0]}function ox(e={}){let{id:t,enabled:n=!0}=e,{controlId:r,registerControlId:i,resetControlId:a}=nx(),o=Rb(),s=y(()=>Symbol()),c=g.useRef(!1),l=g.useRef(!1),u=G(()=>{c.current&&i!==p&&(c.current=!1,i(s.current,void 0))});return b(()=>{if(!n||i===p){u();return}let e;if(t!==void 0)l.current=!0,e=t;else if(l.current)e=o;else{a();return}if(e===void 0){u();return}c.current=!0,i(s.current,e)},[t,n,i,a,o,s,u]),b(()=>u,[u]),(n?r:void 0)??t??o}function sx(e,t){let n=g.useRef(e),r=G(t);b(()=>{n.current!==e&&r(n.current),n.current=e},[e,r])}var cx=g.forwardRef(function(e,t){let{checked:n,className:r,defaultChecked:i,"aria-labelledby":a,form:o,id:s,inputRef:c,name:l,nativeButton:u=!1,onCheckedChange:d,readOnly:f=!1,required:p=!1,disabled:m=!1,render:_,uncheckedValue:v,value:y,style:x,...S}=e,{clearErrors:C}=ex(),{state:w,setTouched:T,setDirty:E,validityData:D,setFilled:O,setFocused:k,validationMode:A,disabled:j,name:M,validation:N}=Zb(),{labelId:P}=nx(),F=j||m,I=M??l,L=g.useRef(null),R=ir(L,c,N.inputRef),z=g.useRef(null),B=Rb(),V=ox({id:s}),H=u?void 0:V,[ee,U]=Lb({controlled:n,default:!!i,name:`Switch`,state:`checked`});Qb(z,B,ee,void 0,!F,l),b(()=>{O(ee)},[ee,O]),sx(ee,()=>{C(I),E(ee!==D.initialValue),N.change(ee)});let{getButtonProps:te,buttonRef:W}=Mi({disabled:F,native:u}),ne=rx(a,P,L,!u,H),G={id:u?V:B,role:`switch`,"aria-checked":ee,"aria-readonly":f||void 0,"aria-required":p||void 0,"aria-labelledby":ne,onFocus(){F||k(!0)},onBlur(){let e=L.current;e&&!F&&(T(!0),k(!1),A===`onBlur`&&N.commit(e.checked))},onClick(e){if(f||F)return;e.preventDefault();let t=L.current;t&&ji(t,e)}},K={...N.getValidationProps(F),checked:ee,disabled:F,form:o,id:H,name:I,required:p,style:I?nr:tr,tabIndex:-1,type:`checkbox`,"aria-hidden":!0,ref:R,onChange(e){if(e.nativeEvent.defaultPrevented)return;if(f){e.preventDefault();return}let t=e.currentTarget.checked,n=Ji(Li,e.nativeEvent);d?.(t,n),!n.isCanceled&&U(t)},onClick(e){e.stopPropagation()},onFocus(){z.current?.focus()},...y===void 0?h:{value:y}},q=g.useMemo(()=>({...w,checked:ee,disabled:F,readOnly:f,required:p}),[w,ee,F,f,p]),re=Ar(`span`,e,{state:q,ref:[t,z,W],props:[G,S,te,e=>N.getValidationProps(F,e)],stateAttributesMapping:Jb});return(0,J.jsxs)(zb.Provider,{value:q,children:[re,!ee&&I&&v!==void 0&&(0,J.jsx)(`input`,{type:`hidden`,form:o,name:I,value:v,disabled:F}),(0,J.jsx)(`input`,{...K,suppressHydrationWarning:!0})]})}),lx=g.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e;return Ar(`span`,e,{state:Bb(),ref:t,stateAttributesMapping:Jb,props:a})}),ux={sm:{root:`h-4 w-7.5`,thumb:`size-3`,thumbWidthKeyframes:[`0.75rem`,`1.25rem`,`0.75rem`],thumbXKeyframes:[0,`0.3125rem`,`0.875rem`],check:`size-2.5`},md:{root:`h-5 w-9.5`,thumb:`size-4`,thumbWidthKeyframes:[`1rem`,`1.6875rem`,`1rem`],thumbXKeyframes:[0,`0.4375rem`,`1.125rem`],check:`size-3`},lg:{root:`h-6 w-11.5`,thumb:`size-5`,thumbWidthKeyframes:[`1.25rem`,`2.125rem`,`1.25rem`],thumbXKeyframes:[0,`0.5rem`,`1.375rem`],check:`size-4`}},dx={duration:.25,ease:[.4,0,.2,1]};function fx(e,t){return t===1?[...e]:e.map(e=>typeof e==`number`?-e:`-${e}`)}function px({renderProps:e,state:t,dirSign:n,sizeConfig:r,reduced:i}){let{checked:a}=t,{ref:o,onDrag:s,onDragStart:c,onDragEnd:l,onAnimationStart:u,onAnimationEnd:d,...f}=e,p=g.useMemo(()=>{let e=fx(r.thumbXKeyframes,n);return a?e:e.reverse()},[a,n,r]),m=p[p.length-1],[h,_]=Dy(),v=vl(o,h),y=g.useRef(a);return g.useEffect(()=>{let e=y.current!==a;y.current=a,e&&!i?_(h.current,{x:p,width:r.thumbWidthKeyframes},dx):_(h.current,{x:m},{duration:0})},[a,r,_,h,i,p,m]),(0,J.jsx)(Oy.span,{...f,ref:v,initial:{x:m},children:(0,J.jsx)(Oy.svg,{className:Z(`text-foreground-intense`,r.check),xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 12 12`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{strokeDasharray:12},initial:!1,animate:{strokeDashoffset:a?0:12},transition:i?{duration:0}:{strokeDashoffset:{duration:a?.3:0,ease:`easeOut`,delay:a?.25:0}},children:(0,J.jsx)(`path`,{d:`M3 6l2 2 4-4`})})})}function mx({className:e,size:t=`md`,...n}){let r=Ss()===`rtl`?-1:1,i=ux[t],a=My(),o=n[`aria-invalid`],s=o===!0||o===`true`;return(0,J.jsx)(W_,{features:Yv,strict:!0,children:(0,J.jsx)(cx,{"data-slot":`switch`,className:Z(`bg-background-strong outline-ring flex shrink-0 rounded-full border border-transparent p-px outline-offset-1`,i.root,`transition-background duration-200 motion-reduce:transition-none`,`data-checked:bg-primary data-checked:outline-ring-primary`,`data-disabled:not-data-checked:border-border-strong data-disabled:opacity-disabled data-disabled:cursor-not-allowed data-disabled:not-data-checked:border-dashed`,`data-invalid:border-error data-invalid:not-data-checked:bg-error-subtle data-invalid:outline-ring-error`,e),...n,...s?{"data-invalid":``}:{},children:(0,J.jsx)(lx,{"data-slot":`switch-thumb`,className:Z(`group flex items-center justify-center rounded-full bg-white shadow-2xs`,i.thumb,`data-checked:bg-primary-foreground`),render:(e,t)=>(0,J.jsx)(px,{renderProps:e,state:t,dirSign:r,sizeConfig:i,reduced:a})})})})}function hx(...e){return e.filter(Boolean).join(` `)}var gx={ok:`bg-success`,warn:`bg-warning`,error:`bg-error`,off:`bg-foreground-subtle`},_x={ok:`text-success`,warn:`text-warning`,error:`text-error`,off:`text-foreground-muted`};function vx(e){if(e==null||e===0||e===``)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?String(e):t.toLocaleString(`zh-CN`,{hour12:!1})}function yx(e){return e===`connected`?`ok`:e===`error`?`error`:e===`connecting`?`warn`:`off`}function bx(e){let t={connected:`panel.status.connected`,connecting:`panel.status.connecting`,error:`panel.status.error`,off:`panel.status.off`};return t[e]?$(t[e]):e}function xx(e,t){return t?e===`listening`?`ok`:e===`error`?`error`:`warn`:`off`}function Sx(e,t){return t?e===`listening`?$(`panel.lan.listening`):e===`error`?$(`panel.lan.error`):e:$(`panel.lan.off`)}function Cx(e){let t={healthy:`panel.sidecar.healthy`,starting:`panel.sidecar.starting`,restarting:`panel.sidecar.restarting`,error:`panel.sidecar.error`,stopped:`panel.sidecar.stopped`};return t[e]?$(t[e]):e}function wx({tone:e}){return(0,J.jsx)(`span`,{className:hx(`inline-block size-2 shrink-0 rounded-full`,gx[e]),"aria-hidden":!0})}function Tx({label:e,tone:t,mono:n,children:r}){return(0,J.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 border-b border-border-muted py-2 last:border-b-0`,children:[(0,J.jsx)(`dt`,{className:`shrink-0 text-sm text-foreground-muted`,children:e}),(0,J.jsx)(`dd`,{className:hx(`min-w-0 text-right text-sm break-all`,n?`font-mono text-xs text-foreground-strong`:`text-foreground`,t&&_x[t]),children:r})]})}function Ex({children:e}){return(0,J.jsx)(`dl`,{className:`mt-1`,children:e})}function Dx({tone:e,text:t,detail:n}){return(0,J.jsxs)(`span`,{className:`inline-flex flex-wrap items-center justify-end gap-x-2`,children:[(0,J.jsx)(wx,{tone:e}),(0,J.jsx)(`span`,{children:t}),n?(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:n}):null]})}function Ox({on:e,what:t,label:n,className:r,disabled:i,onClick:a}){let o=n??$(e?`panel.common.hide`:`panel.common.show`);return(0,J.jsx)(Ob,{variant:`ghost`,size:`sm`,className:r,"aria-label":`${o}${t}`,disabled:i,onClick:a,children:o})}function kx({status:e,busy:t,onToggle:n,onOpenLan:r}){let i=e.tunnel,a=e.enabled,[o,s]=g.useState(!1);return(0,J.jsxs)(Pb,{frame:`solid`,children:[(0,J.jsx)(Fb,{children:(0,J.jsxs)(Ib,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`span`,{children:$(`panel.connection.state`)}),(0,J.jsx)(Tb,{variant:a?`success`:`secondary`,size:`sm`,children:$(a?`panel.connection.enabled`:`panel.connection.disabled`)})]})}),(0,J.jsxs)(`label`,{className:`flex items-center justify-between gap-4 border-b border-border-muted py-3`,children:[(0,J.jsx)(`span`,{className:`text-sm text-foreground-muted`,children:$(`panel.connection.remoteControl`)}),(0,J.jsx)(mx,{size:`md`,checked:a,disabled:t!==``,onCheckedChange:e=>n(e),"aria-label":$(`panel.connection.remoteControl`)})]}),(0,J.jsxs)(Ex,{children:[(0,J.jsx)(Tx,{label:$(`panel.connection.pluginVersion`),mono:!0,children:e.appVersion||`—`}),(0,J.jsx)(Tx,{label:$(`panel.connection.deviceName`),children:e.name||`—`}),(0,J.jsx)(Tx,{label:$(`panel.connection.instanceId`),mono:!0,children:e.instanceId||`—`}),(0,J.jsxs)(Tx,{label:$(`panel.connection.platform`),children:[e.platform,` `,e.osVersion,` · `,e.arch]}),(0,J.jsx)(Tx,{label:$(`panel.connection.relayUrl`),children:(0,J.jsxs)(`span`,{className:`inline-flex min-w-0 flex-wrap items-center justify-end gap-x-2 gap-y-1`,children:[o?(0,J.jsx)(`span`,{className:`min-w-0 font-mono text-xs text-foreground-strong`,children:e.relayUrl||`—`}):(0,J.jsx)(`span`,{className:`text-xs text-foreground-subtle`,children:$(`panel.common.hide`)}),(0,J.jsx)(Ox,{on:o,what:$(`panel.connection.relayUrl`),label:$(o?`panel.common.hide`:`panel.common.show`),onClick:()=>s(e=>!e)})]})}),(0,J.jsx)(Tx,{label:$(`panel.connection.tunnel`),tone:yx(i.state),...i.state===`error`&&i.error?{"data-error":i.error}:{},children:(0,J.jsx)(Dx,{tone:yx(i.state),text:bx(i.state),...i.error?{detail:i.error}:{}})}),(0,J.jsx)(Tx,{label:$(`panel.connection.lan`),children:(0,J.jsx)(Ob,{variant:`outline`,size:`sm`,disabled:t!==``,onClick:r,"aria-label":$(`panel.connection.viewLan`),children:`查看`})}),(0,J.jsx)(Tx,{label:$(`panel.connection.sidecar`),children:(0,J.jsx)(Dx,{tone:e.sidecar.state===`healthy`?`ok`:`warn`,text:Cx(e.sidecar.state),...e.sidecar.restarts>0?{detail:$(`panel.connection.sidecarRestarts`,{count:e.sidecar.restarts})}:{}})}),(0,J.jsx)(Tx,{label:$(`panel.connection.mirror`),children:(0,J.jsx)(Dx,{tone:e.mirror.ok?`ok`:e.mirror.error?`error`:`warn`,text:e.mirror.ok?$(`panel.connection.mirrorOk`):$(`panel.connection.mirrorOff`),detail:vx(e.mirror.pushedAt)})})]}),(0,J.jsx)(Ax,{status:e})]})}function Ax({status:e}){let t=e.tunnel.admissionHint;return t?t===`register-secret`?(0,J.jsxs)(sb,{variant:`warning`,className:`mt-3`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.connection.relayNeedsSecret`)}),(0,J.jsx)(db,{children:`中转服务器开了准入,当前连接被拒绝。向中转的部署者索取注册密钥,填进上面的「中转配置 → 注册密钥」并保存。`})]}):(0,J.jsxs)(sb,{variant:`warning`,className:`mt-3`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.connection.relayRejected`)}),(0,J.jsx)(db,{children:`中转开了实例白名单,而上面的实例 ID 不在名单里。把这个实例 ID 交给中转的部署者,让他加进 instances.json。`})]}):null}var jx={},Mx={},Nx=``;function Px(e,t){return me(e)?e:t}function Fx(e,t,n){return/hidden|clip/.test(e.getComputedStyle(Px(t,n)).overflowY)}function Ix(e){if(typeof document>`u`)return!1;let t=Me(e);return ce(t).innerWidth-t.documentElement.clientWidth>0}function Lx(e){if(!(typeof CSS<`u`&&CSS.supports&&CSS.supports(`scrollbar-gutter`,`stable`))||typeof document>`u`)return!1;let t=Me(e),n=t.documentElement,r=t.body,i=Px(n,r),a=i.style.overflowY,o=n.style.scrollbarGutter;n.style.scrollbarGutter=`stable`,i.style.overflowY=`scroll`;let s=i.offsetWidth;i.style.overflowY=`hidden`;let c=i.offsetWidth;return i.style.overflowY=a,n.style.scrollbarGutter=o,s===c}function Rx(e){let t=Me(e),n=t.documentElement,r=t.body,i=Px(n,r),a={overflowY:i.style.overflowY,overflowX:i.style.overflowX};return Object.assign(i.style,{overflowY:`hidden`,overflowX:`hidden`}),()=>{Object.assign(i.style,a)}}function zx(e){let t=Me(e),n=t.documentElement,r=t.body,i=ce(n),a=0,o=0,s=!1,c=Ie.create();if(tt&&(i.visualViewport?.scale??1)!==1)return()=>{};function l(){let t=i.getComputedStyle(n),c=i.getComputedStyle(r),l=(t.scrollbarGutter||``).includes(`both-edges`)?`stable both-edges`:`stable`;a=n.scrollTop,o=n.scrollLeft,jx={scrollbarGutter:n.style.scrollbarGutter,overflowY:n.style.overflowY,overflowX:n.style.overflowX},Nx=n.style.scrollBehavior,Mx={position:r.style.position,height:r.style.height,width:r.style.width,boxSizing:r.style.boxSizing,overflowY:r.style.overflowY,overflowX:r.style.overflowX,scrollBehavior:r.style.scrollBehavior};let u=n.scrollHeight>n.clientHeight,d=n.scrollWidth>n.clientWidth,f=t.overflowY===`scroll`||c.overflowY===`scroll`,p=t.overflowX===`scroll`||c.overflowX===`scroll`,m=Math.max(0,i.innerWidth-r.clientWidth),h=Math.max(0,i.innerHeight-r.clientHeight),g=parseFloat(c.marginTop)+parseFloat(c.marginBottom),_=parseFloat(c.marginLeft)+parseFloat(c.marginRight),v=Px(n,r);if(s=Lx(e),s){n.style.scrollbarGutter=l,v.style.overflowY=`hidden`,v.style.overflowX=`hidden`;return}Object.assign(n.style,{scrollbarGutter:l,overflowY:`hidden`,overflowX:`hidden`}),(u||f)&&(n.style.overflowY=`scroll`),(d||p)&&(n.style.overflowX=`scroll`),Object.assign(r.style,{position:`relative`,height:g||h?`calc(100dvh - ${g+h}px)`:`100dvh`,width:_||m?`calc(100vw - ${_+m}px)`:`100vw`,boxSizing:`border-box`,overflowY:`hidden`,overflowX:`hidden`,scrollBehavior:`unset`}),r.scrollTop=a,r.scrollLeft=o,n.setAttribute(`data-base-ui-scroll-locked`,``),n.style.scrollBehavior=`unset`}function u(){Object.assign(n.style,jx),Object.assign(r.style,Mx),s||(n.scrollTop=a,n.scrollLeft=o,n.removeAttribute(`data-base-ui-scroll-locked`),n.style.scrollBehavior=Nx)}function d(){u(),c.request(l)}l();let f=Ne(i,`resize`,d);return()=>{c.cancel(),u(),typeof i.removeEventListener==`function`&&f()}}var Bx=new class{lockCount=0;restore=null;timeoutLock=ze.create();timeoutUnlock=ze.create();acquire(e){return this.lockCount+=1,this.lockCount===1&&this.restore===null&&this.timeoutLock.start(0,()=>this.lock(e)),this.release}release=()=>{--this.lockCount,this.lockCount===0&&this.restore&&this.timeoutUnlock.start(0,this.unlock)};unlock=()=>{this.lockCount===0&&this.restore&&(this.restore?.(),this.restore=null)};lock(e){if(this.lockCount===0||this.restore!==null)return;let t=Me(e),n=t.documentElement,r=t.body,i=ce(n);if(Fx(i,n,r)){let t=new i.MutationObserver(()=>{Fx(i,n,r)||(t.disconnect(),this.restore=null,this.lock(e))}),a={attributes:!0};t.observe(n,a),t.observe(r,a),this.restore=()=>t.disconnect();return}let a=Xe||!Ix(e);this.restore=a?Rx(e):zx(e)}};function Vx(e=!0,t=null){b(()=>{if(e)return Bx.acquire(t)},[e,t])}function Hx({store:e,parentContext:t,isDrawer:n}){let r=e.useState(`open`),i=e.useState(`disablePointerDismissal`),a=e.useState(`modal`),o=e.useState(`popupElement`),s=e.useState(`floatingRootContext`),[c,l]=g.useState(0),[u,d]=g.useState(0),f=c===0,p=Ia(s,{outsidePressEvent(){return e.context.internalBackdropRef.current||e.context.backdropRef.current?`intentional`:{mouse:a===`trap-focus`?`sloppy`:`intentional`,touch:`sloppy`}},outsidePress(t){if(!e.context.outsidePressEnabledRef.current||`button`in t&&t.button!==0)return!1;if(`touches`in t){if(t.type===`touchend`){if(t.changedTouches.length!==1||t.touches.length!==0)return!1}else if(t.touches.length!==1)return!1}let n=ot(t);if(f&&!i){if(a){let t=e.context.internalBackdropRef.current,r=e.context.backdropRef.current;return t||r?t===n||r===n||at(n,o)&&!n?.hasAttribute(`data-base-ui-portal`):!0}return!0}return!1},escapeKey:f});return Vx(r&&a===!0,o),e.useContextCallback(`onNestedDialogOpen`,(e,t)=>{l(e),d(t)}),b(()=>(t?.onNestedDialogOpen&&(r?t.onNestedDialogOpen(c+1,u+ +!!n):t.onNestedDialogOpen(0,0)),()=>{t?.onNestedDialogOpen&&r&&t.onNestedDialogOpen(0,0)}),[n,r,c,u,t]),$o(e,{activeTriggerProps:p.reference,inactiveTriggerProps:p.trigger,popupProps:p.floating,nestedOpenDialogCount:c,nestedOpenDrawerCount:u}),null}var Ux=g.createContext(void 0);function Wx(e){let t=g.useContext(Ux);if(!e&&t===void 0)throw Error(S(27));return t}var Gx=class extends re{setState(e){}update(e){}set(e,t){}notifyAll(){}},Kx={...cs,modal:e=>e.modal,nested:e=>e.nested,nestedOpenDialogCount:e=>e.nestedOpenDialogCount,nestedOpenDrawerCount:e=>e.nestedOpenDrawerCount,disablePointerDismissal:e=>e.disablePointerDismissal,openMethod:e=>e.openMethod,descriptionElementId:e=>e.descriptionElementId,titleElementId:e=>e.titleElementId,viewportElement:e=>e.viewportElement,role:e=>e.role},qx=class extends re{constructor(e,t,n){let r=new ts,i=Yx(e,r,t,n);super(i,Xx(r),Kx)}setOpen=(e,t)=>{t.preventUnmountOnClose=()=>{this.set(`preventUnmountingOnClose`,!0)},!e&&t.trigger==null&&this.state.activeTriggerId!=null&&(t.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,t),!t.isCanceled&&(this.state.floatingRootContext.dispatchOpenChange(e,t),this.update(Xo(this.state,e,t.trigger)))}};function Jx(){let e=new ts;return new Gx(Object.freeze(Yx(void 0,e)),Object.freeze(Xx(e)),Kx)}function Yx(e,t,n,r=!1){return{...ns(t,n,r),modal:!0,disablePointerDismissal:!1,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,nestedOpenDrawerCount:0,role:`dialog`,...e}}function Xx(e){return{popupRef:g.createRef(),backdropRef:g.createRef(),internalBackdropRef:g.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:e,onOpenChange:void 0,onOpenChangeComplete:void 0}}function Zx(e,t){let{children:n,open:r,defaultOpen:i=!1,onOpenChange:a,onOpenChangeComplete:o,disablePointerDismissal:s=!1,modal:c=!0,actionsRef:l,handle:u,triggerId:d,defaultTriggerId:f=null}=t,p=e===`drawer`,m=e===`alert-dialog`,h=m?!0:c,_=m||s,v=m?`alertdialog`:`dialog`,y=Wx(!0),b={modal:h,disablePointerDismissal:_,nested:y!=null,role:v},x=Jo((e,t)=>new qx({open:i,openProp:r,activeTriggerId:f,triggerIdProp:d,...b},e,t),!0);x.useControlledProp(`openProp`,r),x.useControlledProp(`triggerIdProp`,d),x.useSyncedValues(b),x.useContextCallback(`onOpenChange`,a),x.useContextCallback(`onOpenChangeComplete`,o);let S=x.useState(`open`),C=x.useState(`mounted`),w=x.useState(`payload`);es(x,S),Zo(x);let{forceUnmount:T}=Qo(S,x);g.useImperativeHandle(l,()=>({unmount:T,close:()=>x.setOpen(!1,Ji(Ki))}),[T,x]);let E=S||C;return(0,J.jsxs)(Ux.Provider,{value:x,children:[u&&(0,J.jsx)(Yo,{handle:u,store:x}),E&&(0,J.jsx)(Hx,{store:x,parentContext:y?.context,isDrawer:p}),typeof n==`function`?n({payload:w}):n]})}function Qx(e){return Zx(`alert-dialog`,e)}var $x=g.forwardRef(function(e,t){let{render:n,className:r,style:i,forceRender:a=!1,...o}=e,s=Wx(),c=s.useState(`open`),l=s.useState(`nested`),u=s.useState(`mounted`);return Ar(`div`,e,{state:{open:c,transitionStatus:s.useState(`transitionStatus`)},ref:[s.context.backdropRef,t],stateAttributesMapping:At,props:[{role:`presentation`,hidden:!u,style:{userSelect:`none`,WebkitUserSelect:`none`}},o],enabled:a||!l})}),eS=g.forwardRef(function(e,t){let{render:n,className:r,style:i,disabled:a=!1,nativeButton:o=!0,...s}=e,c=Wx(),l=c.useState(`open`),{getButtonProps:u,buttonRef:d}=Mi({disabled:a,native:o}),f={disabled:a};function p(e){l&&c.setOpen(!1,Ji(Vi,e.nativeEvent))}return Ar(`button`,e,{state:f,ref:[t,d],props:[{onClick:p},s,u]})}),tS=g.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,...o}=e,s=Wx(),c=Rb(a);return s.useSyncedValueWithCleanup(`descriptionElementId`,c),Ar(`p`,e,{ref:t,props:[{id:c},o]})}),nS=g.createContext(void 0);function rS(){let e=g.useContext(nS);if(e===void 0)throw Error(S(26));return e}var iS=`ArrowUp`,aS=`ArrowDown`,oS=`ArrowLeft`,sS=`ArrowRight`,cS=new Set([iS,aS,oS,sS,`Home`,`End`]),lS=`Shift`,uS=[lS,`Control`,`Alt`,`Meta`];function dS(e){return fe(e)&&e.tagName===`INPUT`}function fS(e){return!!(dS(e)&&e.selectionStart!=null||fe(e)&&e.tagName===`TEXTAREA`)}function pS(e,t,n,r){if(!e||!t||!t.scrollTo)return;let i=e.scrollLeft,a=e.scrollTop,o=e.clientWidth<e.scrollWidth,s=e.clientHeight<e.scrollHeight;if(o&&r!==`vertical`){let r=mS(e,t,`left`),a=hS(e),o=hS(t);n===`ltr`&&(r+t.offsetWidth+o.scrollMarginRight>e.scrollLeft+e.clientWidth-a.scrollPaddingRight?i=r+t.offsetWidth+o.scrollMarginRight-e.clientWidth+a.scrollPaddingRight:r-o.scrollMarginLeft<e.scrollLeft+a.scrollPaddingLeft&&(i=r-o.scrollMarginLeft-a.scrollPaddingLeft)),n===`rtl`&&(r-o.scrollMarginLeft<e.scrollLeft+a.scrollPaddingLeft?i=r-o.scrollMarginLeft-a.scrollPaddingLeft:r+t.offsetWidth+o.scrollMarginRight>e.scrollLeft+e.clientWidth-a.scrollPaddingRight&&(i=r+t.offsetWidth+o.scrollMarginRight-e.clientWidth+a.scrollPaddingRight))}if(s&&r!==`horizontal`){let n=mS(e,t,`top`),r=hS(e),i=hS(t);n-i.scrollMarginTop<e.scrollTop+r.scrollPaddingTop?a=n-i.scrollMarginTop-r.scrollPaddingTop:n+t.offsetHeight+i.scrollMarginBottom>e.scrollTop+e.clientHeight-r.scrollPaddingBottom&&(a=n+t.offsetHeight+i.scrollMarginBottom-e.clientHeight+r.scrollPaddingBottom)}e.scrollTo({left:i,top:a,behavior:`auto`})}function mS(e,t,n){let r=n===`left`?`offsetLeft`:`offsetTop`,i=0;for(;t.offsetParent&&(i+=t[r],t.offsetParent!==e);)t=t.offsetParent;return i}function hS(e){let t=getComputedStyle(e);return{scrollMarginTop:parseFloat(t.scrollMarginTop)||0,scrollMarginRight:parseFloat(t.scrollMarginRight)||0,scrollMarginBottom:parseFloat(t.scrollMarginBottom)||0,scrollMarginLeft:parseFloat(t.scrollMarginLeft)||0,scrollPaddingTop:parseFloat(t.scrollPaddingTop)||0,scrollPaddingRight:parseFloat(t.scrollPaddingRight)||0,scrollPaddingBottom:parseFloat(t.scrollPaddingBottom)||0,scrollPaddingLeft:parseFloat(t.scrollPaddingLeft)||0}}var gS=`--nested-dialogs`,_S=`data-nested-dialog-open`,vS={...kt,...gt,nestedDialogOpen(e){return e?{[_S]:``}:null}},yS=g.forwardRef(function(e,t){let{render:n,className:r,style:i,finalFocus:a,initialFocus:o,...s}=e,c=Wx(),l=c.useState(`descriptionElementId`),u=c.useState(`disablePointerDismissal`),d=c.useState(`floatingRootContext`),f=c.useState(`popupProps`),p=c.useState(`modal`),m=c.useState(`mounted`),h=c.useState(`nested`),g=c.useState(`nestedOpenDialogCount`),_=c.useState(`open`),v=c.useState(`openMethod`),y=c.useState(`titleElementId`),b=c.useState(`transitionStatus`),x=c.useState(`role`),S=d.useState(`floatingId`);rS(),qr({open:_,ref:c.context.popupRef,onComplete(){_&&c.context.onOpenChangeComplete?.(!0)}});let C=o===void 0?qo(c.context.popupRef):o,w=g>0,T=c.useStateSetter(`popupElement`),E=Ar(`div`,e,{state:{open:_,nested:h,transitionStatus:b,nestedDialogOpen:w},props:[f,{id:S,"aria-labelledby":y,"aria-describedby":l,role:x,...Ko,hidden:!m,onKeyDown(e){cS.has(e.key)&&e.stopPropagation()},style:{[gS]:g}},s],ref:[t,c.context.popupRef,T],stateAttributesMapping:vS});return(0,J.jsx)(Ma,{context:d,openInteractionType:v,disabled:!m,closeOnFocusOut:!u,initialFocus:C,returnFocus:a,modal:p!==!1,restoreFocus:`popup`,children:E})}),bS=g.forwardRef(function(e,t){let{cutout:n,...r}=e,i;if(n){let e=n.getBoundingClientRect();i=`polygon(0% 0%,100% 0%,100% 100%,0% 100%,0% 0%,${e.left}px ${e.top}px,${e.left}px ${e.bottom}px,${e.right}px ${e.bottom}px,${e.right}px ${e.top}px,${e.left}px ${e.top}px)`}return(0,J.jsx)(`div`,{ref:t,role:`presentation`,"data-base-ui-inert":``,...r,style:{position:`fixed`,inset:0,userSelect:`none`,WebkitUserSelect:`none`,clipPath:i}})}),xS=g.forwardRef(function(e,t){let{keepMounted:n=!1,...r}=e,i=Wx(),a=i.useState(`mounted`),o=i.useState(`modal`),s=i.useState(`open`);return a||n?(0,J.jsx)(nS.Provider,{value:n,children:(0,J.jsxs)(ea,{ref:t,...r,children:[a&&o===!0&&(0,J.jsx)(bS,{ref:i.context.internalBackdropRef,inert:zr(!s)}),e.children]})}):null}),SS=g.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,...o}=e,s=Wx(),c=Rb(a);return s.useSyncedValueWithCleanup(`titleElementId`,c),Ar(`h2`,e,{ref:t,props:[{id:c},o]})});function CS(e){let t=g.useRef(``),n=g.useCallback(n=>{n.defaultPrevented||(t.current=n.pointerType,e(n,n.pointerType))},[e]);return{onClick:g.useCallback(n=>{if(n.detail===0){e(n,`keyboard`);return}`pointerType`in n?e(n,n.pointerType):e(n,t.current),t.current=``},[e]),onPointerDown:n}}function wS(e,t){let{onClick:n,onPointerDown:r}=CS(G((n,r)=>{(typeof e==`function`?e():e)||t(r||(Xe?`touch`:``))}));return g.useMemo(()=>({onClick:n,onPointerDown:r}),[n,r])}function TS(e){let[t,n]=g.useState(null),r=wS(e,n);return sx(e,t=>{t&&!e&&n(null)}),g.useMemo(()=>({openMethod:t,triggerProps:r}),[t,r])}var ES=g.forwardRef(function(e,t){let{render:n,className:r,style:i,children:a,...o}=e,s=rS(),c=Wx(),l=c.useState(`open`),u=c.useState(`nested`),d=c.useState(`transitionStatus`),f=c.useState(`nestedOpenDialogCount`),p=c.useState(`mounted`),m=c.useStateSetter(`viewportElement`);return Ar(`div`,e,{enabled:s||p,state:{open:l,nested:u,transitionStatus:d,nestedDialogOpen:f>0},ref:[t,m],stateAttributesMapping:vS,props:[{role:`presentation`,hidden:!p,style:{pointerEvents:l?void 0:`none`},children:a},o]})}),DS=class extends Vo{constructor(){super(Jx(),`Dialog`,!1)}open(e){this.openByTrigger(e)}openWithPayload(e){let t=this.attachedStore;t!==null&&(t.set(`payload`,e),t.setOpen(!0,Ji(Ki)))}close(){this.closePopup()}get isOpen(){return this.attachedStore?.select(`open`)??!1}};function OS(){return new DS}var kS=class extends DS{};function AS(){return new kS}var jS=[`container`,`keepMounted`];function MS(e){let{portalProps:t,...n}=e,r={...t},i={};for(let e of Object.keys(n)){let t=n[e];jS.includes(e)?t!==void 0&&(r[e]=t):i[e]=t}return{portal:r,popup:i}}var NS=Object.assign(function(e){return(0,J.jsx)(Qx,{...e})},{createHandle:AS});function PS({className:e,children:t,backdrop:n=!0,frame:r=!0,backdropProps:i,viewportProps:a,...o}){let{portal:s,popup:c}=MS(o),l=i?.forceRender===!0,u=r&&n;return(0,J.jsxs)(xS,{...s,children:[n&&(0,J.jsx)($x,{"data-slot":`alert-dialog-backdrop`,...i,className:Z(`fixed inset-0 z-50 bg-black/30 backdrop-blur-sm supports-[-webkit-touch-callout:none]:absolute`,`motion-safe:transition-opacity motion-safe:duration-250 motion-safe:ease-out`,`data-ending-style:motion-safe:opacity-0 data-starting-style:motion-safe:opacity-0`,i?.className)}),(0,J.jsx)(ES,{"data-slot":`alert-dialog-viewport`,...a,className:Z(`fixed inset-0 z-50 flex items-center justify-center overflow-hidden p-4`,a?.className),children:(0,J.jsx)(yS,{"data-slot":`alert-dialog-popup`,...u?{"data-frame":``}:{},className:Z(`group/alert-dialog-popup relative flex max-h-full min-h-0 w-100 max-w-full flex-col`,`rounded-2xl border`,u?Z(`border-white/15 bg-white/10 p-1.5 backdrop-blur-sm`,!l&&`data-nested:border-border-overlay data-nested:bg-background data-nested:p-0 data-nested:shadow-2xl data-nested:backdrop-blur-none`):`bg-background border-border-overlay`,!u&&`shadow-2xl`,`isolate transform-gpu outline-none`,`motion-safe:transition-[opacity,scale] motion-safe:duration-250 motion-safe:ease-[cubic-bezier(0.175,0.885,0.32,1.5)]`,`data-starting-style:motion-safe:scale-95 data-starting-style:motion-safe:opacity-0`,`data-ending-style:motion-safe:scale-95 data-ending-style:motion-safe:opacity-0 data-ending-style:motion-safe:duration-100 data-ending-style:motion-safe:ease-out`,e),...c,children:(0,J.jsx)(`div`,{"data-slot":`alert-dialog-content`,className:Z(`flex min-h-0 flex-col overflow-hidden not-has-[>[data-slot=alert-dialog-footer]]:pb-6 not-has-[>[data-slot=alert-dialog-header]]:pt-6 [&>[data-slot=alert-dialog-header]+[data-slot=alert-dialog-footer]]:pt-0`,u&&Z(`bg-background rounded-[calc(var(--radius-2xl)*5/6)]`,!l&&`group-data-nested/alert-dialog-popup:rounded-none group-data-nested/alert-dialog-popup:bg-transparent`)),children:t})})})]})}function FS({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`alert-dialog-header`,className:Z(`flex shrink-0 flex-col gap-2 p-6`,e),...t})}function IS({className:e,...t}){return(0,J.jsx)(SS,{"data-slot":`alert-dialog-title`,className:Z(`text-foreground-intense text-xl font-semibold`,e),...t})}function LS({className:e,...t}){return(0,J.jsx)(tS,{"data-slot":`alert-dialog-description`,className:Z(`text-foreground-muted text-sm`,e),...t})}function RS({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`alert-dialog-body`,className:Z(`min-h-0 flex-1 px-6`,e),...t})}function zS({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`alert-dialog-footer`,className:Z(`flex flex-col-reverse gap-2 p-6 sm:flex-row sm:justify-end`,e),...t})}var BS=class extends Error{code;status;constructor(e,t,n){super(e),this.name=`ApiError`,this.code=t,this.status=n}};async function VS(e){let t=null;try{t=await e.json()}catch{t=null}let n=t?.error;if(typeof n==`string`&&n)return new BS(n,`http_${e.status}`,e.status);if(n&&typeof n==`object`){let t=n,r=typeof t.code==`string`&&t.code?t.code:`http_${e.status}`;return new BS(typeof t.message==`string`&&t.message?t.message:$(`panel.net.requestFailed`,{status:e.status}),r,e.status)}return new BS($(`panel.net.requestFailed`,{status:e.status}),`http_${e.status}`,e.status)}async function HS(e){let t=await fetch(e,{headers:{accept:`application/json`}});if(!t.ok)throw await VS(t);return await t.json()}async function US(e,t){let n=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`,accept:`application/json`},body:JSON.stringify(t??{})});if(!n.ok)throw await VS(n);return await n.json()}function WS(e){return e instanceof BS?e.message:e instanceof Error?e.message||$(`panel.net.requestFailedNoStatus`):String(e)}var GS={ok:4e3,soft:6e3,error:9e3};function KS(){let e=(0,g.useRef)(Ul());return e.current=Ul(),(0,g.useCallback)((t,n)=>{e.current.add({title:n,type:t,timeout:GS[t],priority:t===`error`?`high`:`low`})},[])}function qS(e,t){if(!e)return``;let n=Math.max(0,t-e);if(n<6e4)return $(`panel.devices.justNow`);let r=Math.floor(n/6e4);if(r<60)return $(`panel.devices.minutesAgo`,{count:r});let i=Math.floor(r/60);return i<24?$(`panel.devices.hoursAgo`,{count:i}):$(`panel.devices.daysAgo`,{count:Math.floor(i/24)})}function JS(e,t){return e?YS(e,t)?$(`panel.devices.online`):qS(e,t):$(`panel.devices.noRecord`)}function YS(e,t){return e>0&&t-e<=3e5}function XS(e){return{ios:`iOS`,android:`Android`,linux:`Linux`,darwin:`macOS`,win32:`Windows`}[e]??(e||$(`panel.devices.unknownPlatform`))}function ZS(e){return $(e===`relay`?`panel.devices.channelRelay`:e===`lan`?`panel.devices.channelLan`:`panel.devices.channelUnknown`)}function QS(){let e=KS(),[t,n]=(0,g.useState)(null),[r,i]=(0,g.useState)(null),[a,o]=(0,g.useState)(!1),s=(0,g.useCallback)(async()=>{try{n(await HS(`/api/relay/devices`))}catch{}},[]);(0,g.useEffect)(()=>{let e=()=>{document.hidden||s()};e();let t=window.setInterval(e,3e3);return document.addEventListener(`visibilitychange`,e),()=>{window.clearInterval(t),document.removeEventListener(`visibilitychange`,e)}},[s]);let c=t?.devices??[],l=t?.serverNow??0,u=e=>e?.name||$(`panel.devices.unknown`);async function d(t){o(!0);try{let n=await US(`/api/relay/devices/revoke`,{deviceId:t.deviceId});i(null),await s(),e(`soft`,$(n.closed>0?`panel.devices.unbindDoneClosed`:`panel.devices.unbindDone`,{name:u(t),count:n.revoked,closed:n.closed}))}catch(t){e(`error`,$(`panel.devices.unbindFailed`,{message:WS(t)}))}finally{o(!1)}}return c.length===0?null:(0,J.jsxs)(Pb,{frame:`solid`,children:[(0,J.jsx)(Fb,{children:(0,J.jsxs)(Ib,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`span`,{children:$(`panel.devices.title`)}),(0,J.jsx)(Tb,{variant:`secondary`,size:`sm`,children:c.length})]})}),(0,J.jsx)(`div`,{className:`mt-1`,children:c.map(e=>{let t=YS(e.lastSeenAt,l);return(0,J.jsxs)(`div`,{className:`flex items-start justify-between gap-3 border-b border-border-muted py-3 last:border-b-0`,children:[(0,J.jsxs)(`div`,{className:`min-w-0`,children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-1`,children:[(0,J.jsx)(`span`,{className:`text-sm text-foreground-strong`,children:u(e)}),e.legacy?(0,J.jsx)(Tb,{variant:`warning`,size:`xs`,children:$(`panel.devices.legacy`)}):null,(0,J.jsxs)(`span`,{className:`text-xs text-foreground-muted`,children:[XS(e.platform),e.osVersion?` ${e.osVersion}`:``,e.appVersion?$(`panel.devices.appVersion`,{version:e.appVersion}):``]})]}),(0,J.jsxs)(`div`,{className:`mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-foreground-muted`,children:[(0,J.jsx)(`span`,{children:$(`panel.devices.boundAt`,{time:qS(e.boundAt,l)||`—`})}),(0,J.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[t?(0,J.jsx)(wx,{tone:`ok`}):null,JS(e.lastSeenAt,l)]}),(0,J.jsx)(`span`,{children:ZS(e.lastChannel)}),(0,J.jsx)(`span`,{children:e.encrypted?$(`panel.devices.encrypted`):$(`panel.devices.plain`)})]})]}),(0,J.jsx)(Ob,{variant:`outline`,size:`sm`,onClick:()=>i(e),children:$(`panel.devices.unbind`)})]},e.deviceId)})}),(0,J.jsx)(NS,{open:r!==null,onOpenChange:e=>{!e&&!a&&i(null)},children:(0,J.jsxs)(PS,{children:[(0,J.jsx)(FS,{children:(0,J.jsx)(IS,{children:$(`panel.devices.unbindTitle`)})}),(0,J.jsxs)(RS,{className:`flex flex-col gap-2 text-sm`,children:[(0,J.jsx)(LS,{children:$(`panel.devices.unbindConfirm`,{name:u(r)})}),(0,J.jsx)(`p`,{className:`text-foreground-muted`,children:$(r?.legacy?`panel.devices.effectLegacy`:`panel.devices.effectIdentity`)})]}),(0,J.jsxs)(zS,{className:`flex justify-end gap-2`,children:[(0,J.jsx)(Ob,{variant:`outline`,disabled:a,onClick:()=>i(null),children:$(`panel.devices.cancel`)}),(0,J.jsx)(Ob,{variant:`destructive`,disabled:a,onClick:()=>{r&&d(r)},children:a?(0,J.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,J.jsx)($y,{}),$(`panel.devices.unbinding`)]}):$(`panel.devices.unbind`)})]})]})})]})}var $S=F(function(e){return Zx(`dialog`,e)}),eC=Object.assign(function(e){return(0,J.jsx)($S,{...e})},{createHandle:OS});function tC({className:e,children:t,closeButton:n=!0,closeLabel:r=`Close`,backdrop:i=!0,frame:a=!0,backdropProps:o,viewportProps:s,...c}){let l=a&&i,{portal:u,popup:d}=MS(c);return(0,J.jsxs)(xS,{...u,children:[i&&(0,J.jsx)($x,{"data-slot":`dialog-backdrop`,...o,className:Z(`fixed inset-0 z-50 bg-black/30 backdrop-blur-sm supports-[-webkit-touch-callout:none]:absolute`,`motion-safe:transition-opacity motion-safe:duration-250 motion-safe:ease-out`,`data-ending-style:motion-safe:opacity-0 data-starting-style:motion-safe:opacity-0`,o?.className)}),(0,J.jsx)(ES,{"data-slot":`dialog-viewport`,...s,className:Z(`fixed inset-0 z-50 flex items-center justify-center overflow-hidden p-4`,s?.className),children:(0,J.jsx)(yS,{"data-slot":`dialog-popup`,...l?{"data-frame":``}:{},className:Z(`group/dialog-popup relative flex max-h-full min-h-0 w-150 max-w-full flex-col`,`rounded-2xl border`,l?`border-white/15 bg-white/10 p-1.5 backdrop-blur-sm`:`bg-background border-border-overlay`,!l&&`shadow-2xl`,`isolate transform-gpu outline-none`,`motion-safe:transition-[opacity,scale] motion-safe:duration-250 motion-safe:ease-[cubic-bezier(0.175,0.885,0.32,1.5)]`,`data-starting-style:motion-safe:scale-95 data-starting-style:motion-safe:opacity-0`,`data-ending-style:motion-safe:scale-95 data-ending-style:motion-safe:opacity-0 data-ending-style:motion-safe:duration-100 data-ending-style:motion-safe:ease-out`,`data-nested-dialog-open:pointer-events-none data-nested-dialog-open:scale-95 data-nested-dialog-open:opacity-0`,e),...d,children:(0,J.jsxs)(`div`,{"data-slot":`dialog-content`,className:Z(`relative flex min-h-0 flex-col overflow-hidden not-has-[>[data-slot=dialog-footer]]:pb-6 not-has-[>[data-slot=dialog-header]]:pt-6 [&>[data-slot=dialog-header]+[data-slot=dialog-footer]]:pt-0`,l&&`bg-background rounded-[calc(var(--radius-2xl)*5/6)]`),children:[t,n&&(0,J.jsx)(eS,{"aria-label":r,"data-slot":`dialog-close-button`,className:Z(wl({variant:`outline`,size:`icon-sm`}),`absolute inset-e-3 top-3 z-10`),children:(0,J.jsx)(oC,{})})]})})})]})}function nC({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`dialog-header`,className:Z(`flex shrink-0 flex-col gap-2 p-6`,e),...t})}function rC({className:e,...t}){return(0,J.jsx)(SS,{"data-slot":`dialog-title`,className:Z(`text-foreground-intense text-2xl font-semibold`,e),...t})}function iC({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`dialog-body`,className:Z(`min-h-0 flex-1 px-6`,e),...t})}function aC({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`dialog-footer`,className:Z(`flex flex-col-reverse gap-2 p-6 sm:flex-row sm:justify-end`,e),...t})}function oC(e){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 16 16`,fill:`currentColor`,"aria-hidden":`true`,...e,children:(0,J.jsx)(`path`,{d:`M11.594 3.594c.225-.225.588-.225.813 0s.225.588 0 .812L8.813 8l3.594 3.594c.225.225.225.588 0 .813s-.588.225-.812 0L8 8.812l-3.594 3.594c-.225.225-.588.225-.812 0s-.225-.588 0-.812L7.188 8 3.594 4.406c-.225-.225-.225-.588 0-.812s.588-.225.813 0L8 7.187l3.594-3.594z`})})}var sC=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxgAAAMYAQAAAABgBnzJAAAGdElEQVR42u2dXY7yOBBFbyY8IoWlsICWiPQtYFY8UtCwAJYCEo8deR4gxPFPOgE62MzJQ0Q3kNOmnL5UuVxVGP368ZdgwIABAwYMGDBg5MjYF86xevhywUu987M6F7V0LupidS5qSVKx6k/9s847mFcwYMCA8cMRk4rKdCfdIhHGPvXPDt+BPV7CKI11NE9dMHCpN+t5sRqc7N91om4/y30OAwYMGE/r+VDDPXl3XoI9XsnYP+uae076KoXPytHu3it3PPXBE8wrGDBgwHiFng+9ck/lrSewB4yJDEesPVHvg+7E22HAgAHjGT3vDkesTUzjibfDmLx+7i+Y96LuRSTQcxgwYMB43j8PL5iHHXL0/KX22JmXXdO9VIL+uZct10k+9zkMGDBg/Ip/7mfLSQZ7vNoebfGyCwYulUJ++8wT8woGDBgwns5vn3XCHk8exf+hrsEgKW7kR/QcBgwYMNAPGG9nOOvivkQ7YXUvq90X+sHedewBAwYMGOg5jIUYA+22ve1IWD3sswerzWAPGDBgwEDPYSzpnw+S1x1h9orK+JF3L+iOfw4DBgwY6DmMBfU8ugXNqejqFIQLP3I0HnvAgAEDBnoOYyk99/ehhfamOYF4T8/xz2HAgAEDPYeh966fe3vNf6jjai+Ye+lxVgYd9oABAwYM9BzGQuvn/rp4OAavSXXkBu469oABAwYM9BzG4no+Vpf9HOs8M7KbLcHP6ryR2lX2Nm83/TnncRxuVsl8HG034zd5j+Nwv03yHkcdeJShnp/76VR+Z2yPo6TKmJOkNjl7yEw+rsO4DmRnZhxLjeNk/1kq+x9P2vXPft8H3Q3o9hKVxpjbqftx8N605tVFqq6PTtIl3/vjKG2vj6qZN0ha46hVNreHTd76se4ebOcpSFLjaO/TSlpf/wnnao/7dCoz9s/PG0vE9/UcRU/X59zme58f+9tcWs/6x7vgOEKNzH/sgzp0yOPtWZKyR21PpvJzYjJ1tuNoPjBG1hBPfC+jzaPe66Cb+Wjp9ttx+tt+XeCVVvnXlL6XtCsZ5u6Ceq5Am/O4nt9jvGN73TJYPz+cP8Pmda56XnIPps04ZjuOOg89D7U5t6SvqX/ukx5p2ZJgvL3/vnv5iPvjK+V6MtGtatcQiWWB859TO2XpPEk9t766H5uqqfOcV2v7H9YfaXvMcxyldaOf7aB1fvf55R4iXUvltqizHEdzv0E22kr6Z7KkpzWO+6JH21nnkpieV7Ee5oM+K+uRFmwa7YmeqA5euvBVm+W8Kp2//DjZJ1k+3h7dV3690ZtDIRVjnVNDu96S6D84uNHbWoW0TnFdbdb33YPt4taTvywmd59fp0vdfG0kqWoy6msZOnbNSmrLU+b+x1Fqpcs6dz/qIjUbHU+55l810q655l6dZP5NK/9qRl5f0afzzYu+JzevvtJd55SVBeeks90e9fOqtHP8qmHKXJ8U56TRJZcPp+3XZ8RFJ+seMWSxfv7oG7cfMY7tHIukvF/tuGXfHYxp/nm0I+qkejIKlJJh/zkMGDBgoIMwlq736ihxOG9disfbw11XsQcMGDBgoOcwlu6vNtJuLdol1W147mx4wx4wYMCAgZ7DeE99uEgR95CKO0+8Jx8OBgwYMNBz7IGe+6Ve/YXwUPlXb5ubUwUe/xwGDBgw0HMYy+8/9/PcxtfKbSfd2XWedP12GDBgwEDPYbyasS/6Y/XWeLvjXo80T3NS5qL14bA5DBgwYPyenu8tn2tY3R17vIdR9oUDkhmHHzj3MuOcNDr0HAYMGDD0RJ2iynhlYO1CsE5d2OgFsMcDDNuzDrjX85z0VVqflVMfLuKLRxLgyG+HAQMGjAf1/C7bVbCmu1/gVQo0dMEecxmlU5fv4WNnvpPTc8cDd75xTCg5072DeQUDBgwYs/zzcAc180M/Fuu32OMBe9yWL+Z1mh8ebZHeZ+WsqQ889fAietzLZ17BgAEDxkQ9r0zEU/c7uBjto98KsMfv9mmIueYpflahlPWo9+5vPR/E5ZlXMGDAgDFHz6ON1/y+qpFeq9gDhrzaMeOL46GFdfafw4ABA8ZD/mCnyaOL46GFdTeXDns8YI+d+fDPypHtaS8euPDMKxgwYMCYE991g+4TX1yh54/bI7bynf9nFaod44Tap1abYV7BgAEDxvx4eyjUHorBB+Py2EPU94EBAwYMGDBgwIDx1PEfwPfvNJna2O0AAAAASUVORK5CYII=`,cC=()=>$(`panel.links.wechatQrAlt`);function lC(){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,className:`stroke-0`,fill:`currentColor`,"aria-hidden":`true`,children:(0,J.jsx)(`path`,{d:`M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z`})})}function uC(){let[e,t]=(0,g.useState)(!1);return(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`div`,{className:`pointer-events-none fixed end-6 bottom-6 z-40`,children:(0,J.jsxs)(Ob,{variant:`primary`,size:`lg`,className:`pointer-events-auto rounded-full shadow-lg`,onClick:()=>t(!0),children:[(0,J.jsx)(lC,{}),$(`panel.links.joinGroup`)]})}),(0,J.jsx)(eC,{open:e,onOpenChange:t,children:(0,J.jsxs)(tC,{className:`max-w-sm`,children:[(0,J.jsx)(rC,{className:`sr-only`,children:$(`panel.links.joinGroup`)}),(0,J.jsx)(iC,{className:`flex justify-center`,children:(0,J.jsx)(`img`,{src:sC,alt:cC(),className:`w-full rounded-md`})})]})})]})}var dC=g.createContext(void 0);function fC(e=!1){let t=g.useContext(dC);if(!t&&!e)throw Error(S(86));return t}var pC=function(e){let t=Rb(),[n,r]=g.useState(t),[i,a]=g.useState(),[o,s]=g.useState([]),c=n===void 0?t:n,l=y(()=>new Map),{messageIds:u}=nx(),d=G((e,t)=>{let n=l.current;t===void 0?n.delete(e):n.set(e,t),r(e=>{if(n.size===0)return e;let t;for(let r of n.values()){if(r===e)return e;t===void 0&&(t=r)}return t})}),f=G(()=>{l.current.size===0&&r(t)}),p=g.useCallback(e=>{let t=e[`aria-describedby`]?e[`aria-describedby`].split(` `):[];return t.push(...u,...o),{...e,"aria-describedby":Array.from(new Set(t)).join(` `)||void 0}},[u,o]),m=g.useMemo(()=>({controlId:c,registerControlId:d,resetControlId:f,labelId:i,setLabelId:a,messageIds:o,setMessageIds:s,getDescriptionProps:p}),[c,d,f,i,a,o,s,p]);return(0,J.jsx)(tx.Provider,{value:m,children:e.children})};function mC(e,t){let n=Rb(e);return b(()=>(t(n),()=>{t(e=>e===n?void 0:e)}),[n,t]),n}function hC(e={}){let{id:t,fallbackControlId:n,native:r=!1,setLabelId:i,focusControl:a}=e,{controlId:o,setLabelId:s}=nx(),c=mC(t,G(e=>{s(e),i?.(e)})),l=o??n;function u(e){if(a){a(e,l);return}if(!l)return;let t=Me(e.currentTarget).getElementById(l);fe(t)&&gC(t)}function d(e){ot(e.nativeEvent)?.closest(`button,input,select,textarea`)||(!e.defaultPrevented&&e.detail>1&&e.preventDefault(),!r&&u(e))}return r?{id:c,htmlFor:l,onMouseDown:d}:{id:c,onClick:d,onPointerDown(e){e.preventDefault()}}}function gC(e){e.focus({focusVisible:!0})}function _C(e,t){return{...e,state:{...e.state,valid:!t&&e.state.valid}}}var vC=Object.keys(Ub);function yC(e,t){return e.matches(`:disabled`)?!1:!t||e.form===t||e.form===null&&!e.hasAttribute(`form`)}function bC(e,t){let n=null;for(let r of e.keys())if(yC(r,t)){if(!r.validity.valid)return r;n??=r}return n}function xC(e){return{...Ub,valid:!e,customError:e}}function SC(e){return e&&e.validationMessage?[e.validationMessage]:[]}function CC(e){let{elementRef:t,formRef:n}=ex(),{setValidityData:r,validate:i,validityData:a,validationDebounceTime:o,invalid:s,markedDirtyRef:c,state:l,shouldValidateOnChange:u,validationMode:d,registeredFieldIdRef:f}=e,{controlId:p,getDescriptionProps:m}=nx(),_=Be(),v=g.useRef(null),b=y(()=>new Map).current,x=g.useRef(0),S=g.useRef(null),C=g.useCallback((e,t)=>(b.set(e,t),()=>{b.delete(e)}),[b]),w=G(()=>{let e=bC(b,t.current);return e&&b.get(e)?.controlRef.current||null}),T=G(async(e,o=!1)=>{x.current+=1;let m=x.current;function h(e,t=s){let r=f.current??p;if(r==null)return;let i=n.current.fields.get(r);if(!i)return;let a=_C(e,t);n.current.fields.set(r,{...i,validityData:a})}function g(t,n){let r=t.valid===!1?n:[];return{value:e,state:t,error:r[0]??``,errors:r,initialValue:a.initialValue}}function y(e,t){let n=e.validity.customError?e.validationMessage:``,r=t.replace(/\r\n?/g,`
23
+ `),()=>{s.current?.removeAttribute(`data-motion-pop-id`),b.contains(y)&&b.removeChild(y)}},[t]),(0,J.jsx)(A_,{isPresent:t,childRef:s,sizeRef:c,pop:a,children:a===!1?e:g.cloneElement(e,{ref:u})})}var M_=({children:e,initial:t,isPresent:n,onExitComplete:r,custom:i,presenceAffectsLayout:a,mode:o,anchorX:s,anchorY:c,root:l})=>{let u=bu(N_),d=(0,g.useId)(),f=(0,g.useRef)(n),p=(0,g.useRef)(r);xu(()=>{f.current=n,p.current=r});let m=!0,h=(0,g.useMemo)(()=>(m=!1,{id:d,initial:t,isPresent:n,custom:i,onExitComplete:e=>{u.set(e,!0);for(let e of u.values())if(!e)return;r&&r()},register:e=>(u.set(e,!1),()=>{u.delete(e),!f.current&&!u.size&&p.current?.()})}),[n,u,r]);return a&&m&&(h={...h}),(0,g.useMemo)(()=>{u.forEach((e,t)=>u.set(t,!1))},[n]),g.useEffect(()=>{!n&&!u.size&&r&&r()},[n]),e=(0,J.jsx)(j_,{pop:o===`popLayout`,isPresent:n,anchorX:s,anchorY:c,root:l,children:e}),(0,J.jsx)(Su.Provider,{value:h,children:e})};function N_(){return new Map}function P_(e=!0){let t=(0,g.useContext)(Su);if(t===null)return[!0,null];let{isPresent:n,onExitComplete:r,register:i}=t,a=(0,g.useId)();(0,g.useEffect)(()=>{if(e)return i(a)},[e]);let o=(0,g.useCallback)(()=>e&&r&&r(a),[a,r,e]);return!n&&r?[!1,o]:[!0]}var F_=e=>e.key||``;function I_(e){let t=[];return g.Children.forEach(e,e=>{(0,g.isValidElement)(e)&&t.push(e)}),t}var L_=({children:e,custom:t,initial:n=!0,onExitComplete:r,presenceAffectsLayout:i=!0,mode:a=`sync`,propagate:o=!1,anchorX:s=`left`,anchorY:c=`top`,root:l})=>{let[u,d]=P_(o),f=(0,g.useMemo)(()=>I_(e),[e]),p=o&&!u?[]:f.map(F_),m=(0,g.useRef)(!0),h=bu(()=>new Map),_=(0,g.useRef)(new Set),[v,y]=(0,g.useState)(f),[b,x]=(0,g.useState)(f);xu(()=>{o&&!u&&!b.length&&d?.()},[u,o,b.length,d]),xu(()=>{m.current=!1;for(let e=0;e<b.length;e++){let t=F_(b[e]);p.includes(t)?(h.delete(t),_.current.delete(t)):h.get(t)!==!0&&h.set(t,!1)}},[b,p.length,p.join(`-`)]);let S=[];if(f!==v){let e=[...f],t=0;for(let n of b){let r=p.indexOf(F_(n));r===-1?(e.splice(t++,0,n),S.push(n)):t=r+S.length+1}return S.every(e=>h.get(F_(e)))?e=f:a===`wait`&&(e=S),x(I_(e)),y(f),null}let{forceRender:C}=(0,g.useContext)(yu);return(0,J.jsx)(J.Fragment,{children:b.map(e=>{let g=F_(e),v=o&&!u?!1:f===b||p.includes(g);return(0,J.jsx)(M_,{isPresent:v,initial:!m.current||n?void 0:!1,custom:t,presenceAffectsLayout:i,mode:a,root:l,onExitComplete:v?void 0:()=>{if(_.current.has(g))return;if(h.has(g))_.current.add(g),h.set(g,!0);else return;let e=!0;h.forEach(t=>{t||(e=!1)}),e&&(C?.(),y([]),o&&d?.(),r&&r())},anchorX:s,anchorY:c,children:e},g)})})},R_=(0,g.createContext)({strict:!1}),z_={animation:[`animate`,`variants`,`whileHover`,`whileTap`,`exit`,`whileInView`,`whileFocus`,`whileDrag`],exit:[`exit`],drag:[`drag`,`dragControls`],focus:[`whileFocus`],hover:[`whileHover`,`onHoverStart`,`onHoverEnd`],tap:[`whileTap`,`onTap`,`onTapStart`,`onTapCancel`],pan:[`onPan`,`onPanStart`,`onPanSessionStart`,`onPanEnd`],inView:[`whileInView`,`onViewportEnter`,`onViewportLeave`],layout:[`layout`,`layoutId`]},B_=!1;function V_(){if(B_)return;let e={};for(let t in z_)e[t]={isEnabled:e=>z_[t].some(t=>!!e[t])};n_(e),B_=!0}function H_(){return V_(),r_()}function U_(e){let t=H_();for(let n in e)t[n]={...t[n],...e[n]};n_(t)}function W_({children:e,features:t,strict:n=!1}){let[,r]=(0,g.useState)(!G_(t)),i=(0,g.useRef)(void 0);if(!G_(t)){let{renderer:e,...n}=t;i.current=e,U_(n)}return(0,g.useEffect)(()=>{G_(t)&&t().then(({renderer:e,...t})=>{U_(t),i.current=e,r(!0)})},[]),(0,J.jsx)(R_.Provider,{value:{renderer:i.current,strict:n},children:e})}function G_(e){return typeof e==`function`}var K_=(0,g.createContext)({});function q_(e,t){if(qg(e)){let{initial:t,animate:n}=e;return{initial:t===!1||Wg(t)?t:void 0,animate:Wg(n)?n:void 0}}return e.inherit===!1?{}:t}function J_(e){let{initial:t,animate:n}=q_(e,(0,g.useContext)(K_));return(0,g.useMemo)(()=>({initial:t,animate:n}),[Y_(t),Y_(n)])}function Y_(e){return Array.isArray(e)?e.join(` `):e}var X_=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function Z_(e,t,n){for(let r in t)!fh(t[r])&&!l_(r,n)&&(e[r]=t[r])}function Q_({transformTemplate:e},t){return(0,g.useMemo)(()=>{let n=X_();return ng(n,t,e),Object.assign({},n.vars,n.style)},[t])}function $_(e,t){let n=e.style||{},r={};return Z_(r,n,e),Object.assign(r,Q_(e,t)),r}function ev(e,t){let n={},r=$_(e,t);return e.drag&&e.dragListener!==!1&&(n.draggable=!1,r.userSelect=r.WebkitUserSelect=r.WebkitTouchCallout=`none`,r.touchAction=e.drag===!0?`none`:`pan-${e.drag===`x`?`y`:`x`}`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(n.tabIndex=0),n.style=r,n}var tv=()=>({...X_(),attrs:{}});function nv(e,t,n,r){let i=(0,g.useMemo)(()=>{let n=tv();return sg(n,t,m_(r),e.transformTemplate,e.style),{...n.attrs,style:{...n.style}}},[t]);if(e.style){let t={};Z_(t,e.style,e),i.style={...t,...i.style}}return i}var rv=new Set(`animate.exit.variants.initial.style.values.transition.transformTemplate.custom.inherit.onBeforeLayoutMeasure.onAnimationStart.onAnimationComplete.onUpdate.onDragStart.onDrag.onDragEnd.onMeasureDragConstraints.onDirectionLock.onDragTransitionEnd._dragX._dragY.onHoverStart.onHoverEnd.onViewportEnter.onViewportLeave.globalTapTarget.propagate.ignoreStrict.viewport`.split(`.`));function iv(e){return e.startsWith(`while`)||e.startsWith(`drag`)&&e!==`draggable`||e.startsWith(`layout`)||e.startsWith(`onTap`)||e.startsWith(`onPan`)||e.startsWith(`onLayout`)||rv.has(e)}function av(e,t){return e.startsWith(`on`)?!iv(e):t?.(e)??!iv(e)}function ov(e,t,n,r){let i={};for(let a in e)(a!==`values`||typeof e.values!=`object`)&&(fh(e[a])||(av(a,r)||n===!0&&iv(a)||!t&&!iv(a)||e.draggable&&a.startsWith(`onDrag`))&&(i[a]=e[a]));return i}var sv=[`animate`,`circle`,`defs`,`desc`,`ellipse`,`g`,`image`,`line`,`filter`,`marker`,`mask`,`metadata`,`path`,`pattern`,`polygon`,`polyline`,`rect`,`stop`,`switch`,`symbol`,`svg`,`text`,`tspan`,`use`,`view`];function cv(e){return typeof e!=`string`||e.includes(`-`)?!1:!!(sv.indexOf(e)>-1||/[A-Z]/u.test(e))}function lv(e,t,n,{latestValues:r},i,a=!1,o,s){let c=(o??cv(e)?nv:ev)(t,r,i,e),l=ov(t,typeof e==`string`,a,s),u=e===g.Fragment?{}:{...l,...c,ref:n},{children:d}=t,f=(0,g.useMemo)(()=>fh(d)?d.get():d,[d]);return(0,g.createElement)(e,{...u,children:f})}function uv({scrapeMotionValuesFromProps:e,createRenderState:t},n,r,i){return{latestValues:dv(n,r,i,e),renderState:t()}}function dv(e,t,n,r){let i={},a=r(e,{});for(let e in a)i[e]=T_(a[e]);let{initial:o,animate:s}=e,c=qg(e),l=Jg(e);t&&l&&!c&&e.inherit!==!1&&(o===void 0&&(o=t.initial),s===void 0&&(s=t.animate));let u=n?n.initial===!1:!1;u||=o===!1;let d=u?s:o;if(d&&typeof d!=`boolean`&&!Ug(d)){let t=Array.isArray(d)?d:[d];for(let n=0;n<t.length;n++){let r=ih(e,t[n]);if(r){let{transitionEnd:e,transition:t,...n}=r;for(let e in n){let t=n[e];if(Array.isArray(t)){let e=u?t.length-1:0;t=t[e]}t!==null&&(i[e]=t)}for(let t in e)i[t]=e[t]}}}return i}var fv=e=>(t,n)=>{let r=(0,g.useContext)(K_),i=(0,g.useContext)(Su),a=()=>uv(e,t,r,i);return n?a():bu(a)},pv=fv({scrapeMotionValuesFromProps:u_,createRenderState:X_}),mv=fv({scrapeMotionValuesFromProps:g_,createRenderState:tv}),hv=Symbol.for(`motionComponentSymbol`);function gv(e,t,n){let r=(0,g.useRef)(n);(0,g.useInsertionEffect)(()=>{r.current=n});let i=(0,g.useRef)(null);return(0,g.useCallback)(n=>{n&&e.onMount?.(n),t&&(n?t.mount(n):t.unmount());let a=r.current;if(typeof a==`function`){if(n){let e=a(n);typeof e==`function`&&(i.current=e)}else i.current?(i.current(),i.current=null):a(n)}else a&&(a.current=n)},[t])}var _v=(0,g.createContext)({});function vv(e){return e&&typeof e==`object`&&Object.prototype.hasOwnProperty.call(e,`current`)}function yv(e,t,n,r,i,a){let{visualElement:o}=(0,g.useContext)(K_),s=(0,g.useContext)(R_),c=(0,g.useContext)(Su),l=(0,g.useContext)(E_),u=l.reducedMotion,d=l.skipAnimations,f=(0,g.useRef)(null),p=(0,g.useRef)(!1);r||=s.renderer,!f.current&&r&&(f.current=r(e,{visualState:t,parent:o,props:n,presenceContext:c,blockInitialAnimation:c?c.initial===!1:!1,reducedMotionConfig:u,skipAnimations:d,isSVG:a}),p.current&&f.current&&(f.current.manuallyAnimateOnMount=!0));let m=f.current,h=(0,g.useContext)(_v);m&&!m.projection&&i&&(m.type===`html`||m.type===`svg`)&&bv(f.current,n,i,h);let _=(0,g.useRef)(!1);(0,g.useInsertionEffect)(()=>{m&&_.current&&m.update(n,c)});let v=n[gh],y=(0,g.useRef)(!!v&&typeof window<`u`&&!window.MotionHandoffIsComplete?.(v)&&window.MotionHasOptimisedAnimation?.(v));return xu(()=>{p.current&&m&&(m.animationState?.animateChanges(),m.enteringChildren=void 0)},[]),xu(()=>{p.current=!0,m&&(_.current=!0,window.MotionIsMounted=!0,m.updateFeatures(),m.scheduleRenderMicrotask(),y.current&&m.animationState&&m.animationState.animateChanges())}),(0,g.useEffect)(()=>{m&&(!y.current&&m.animationState&&m.animationState.animateChanges(),y.current&&=(queueMicrotask(()=>{window.MotionHandoffMarkAsComplete?.(v)}),!1),m.enteringChildren=void 0)}),m}function bv(e,t,n,r){let{layoutId:i,layout:a,drag:o,dragConstraints:s,layoutScroll:c,layoutRoot:l,layoutAnchor:u,layoutCrossfade:d}=t;e.projection=new n(e.latestValues,t[`data-framer-portal-id`]?void 0:xv(e.parent)),e.projection.setOptions({layoutId:i,layout:a,alwaysMeasureLayout:!!o||s&&vv(s),visualElement:e,animationType:typeof a==`string`?a:`both`,initialPromotionConfig:r,crossfade:d,layoutScroll:c,layoutRoot:l,layoutAnchor:u})}function xv(e){if(e)return e.options.allowProjection===!1?xv(e.parent):e.projection}function Sv(e,{forwardMotionProps:t=!1,type:n}={},r,i){r&&U_(r);let a=n?n===`svg`:cv(e),o=a?mv:pv;function s(n,s){let c,l={...(0,g.useContext)(E_),...n,layoutId:Cv(n)},{isStatic:u,isValidProp:d}=l,f=J_(n),p=o(n,u);if(!u&&typeof window<`u`){wv(l,r);let t=Tv(l);c=t.MeasureLayout,f.visualElement=yv(e,p,l,i,t.ProjectionNode,a)}return(0,J.jsxs)(K_.Provider,{value:f,children:[c&&f.visualElement?(0,J.jsx)(c,{visualElement:f.visualElement,...l}):null,lv(e,n,gv(p,f.visualElement,s),p,u,t,a,d)]})}s.displayName=`motion.${typeof e==`string`?e:`create(${e.displayName??e.name??``})`}`;let c=(0,g.forwardRef)(s);return c[hv]=e,c}function Cv({layoutId:e}){let t=(0,g.useContext)(yu).id;return t&&e!==void 0?t+`-`+e:e}function wv(e,t){(0,g.useContext)(R_).strict}function Tv(e){let{drag:t,layout:n}=H_();if(!t&&!n)return{};let r={...t,...n};return{MeasureLayout:t?.isEnabled(e)||n?.isEnabled(e)?r.MeasureLayout:void 0,ProjectionNode:r.ProjectionNode}}function Ev(e,t){if(typeof Proxy>`u`)return Sv;let n=new Map,r=(n,r)=>Sv(n,r,e,t);return new Proxy((e,t)=>r(e,t),{get:(i,a)=>a===`create`?r:(n.has(a)||n.set(a,Sv(a,void 0,e,t)),n.get(a))})}var Dv=Ev(),Ov=(e,t)=>t.isSVG??cv(e)?new __(t):new f_(t,{allowProjection:e!==g.Fragment}),kv=class extends o_{constructor(e){super(e),e.animationState||=b_(e)}updateAnimationControlsSubscription(){let{animate:e}=this.node.getProps();Ug(e)&&(this.unmountControls=e.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){let{animate:e}=this.node.getProps(),{animate:t}=this.node.prevProps||{};e!==t&&this.updateAnimationControlsSubscription()}unmount(){this.node.animationState.reset(),this.unmountControls?.()}},Av=0,jv={animation:{Feature:kv},exit:{Feature:class extends o_{constructor(){super(...arguments),this.id=Av++}update(){let{presenceContext:e,prevPresenceContext:t,animationState:n}=this.node;if(!e||!n)return;let{isPresent:r,onExitComplete:i}=e,a=t?.isPresent;if(r===a)return;if(r&&a===!1){if(this.exit===!0){let{initial:e}=this.node.getProps();if(e&&!Array.isArray(e)){let{transition:t,transitionEnd:n,...r}=ah(this.node,e)||{};for(let e in r)this.node.getValue(e)?.jump(r[e])}this.node.blockInitialAnimation=!1,n.reset(),n.animateChanges()}else n.setActive(`exit`,!1);this.exit=void 0;return}let o=this.exit=n.setActive(`exit`,!r);i&&!r&&o.then(()=>{this.exit===o&&(this.exit=!0,i(this.id))})}mount(){let{register:e,onExitComplete:t}=this.node.presenceContext||{};t&&t(this.id),e&&(this.unmount=e(this.id))}unmount(){}}}};function Mv(e){return{point:{x:e.pageX,y:e.pageY}}}function Nv(e,t,n){let{props:r}=e;e.animationState&&r.whileHover&&e.animationState.setActive(`whileHover`,n===`Start`);let i=r[`onHover`+n];i&&Af.postRender(()=>i(t,Mv(t)))}var Pv=class extends o_{mount(){let{current:e}=this.node;e&&(this.unmount=Dg(e,(e,t)=>(Nv(this.node,t,`Start`),e=>Nv(this.node,e,`End`))))}unmount(){}},Fv=class extends o_{constructor(){super(...arguments),this.isActive=!1}onFocus(){let e=!1;try{e=this.node.current.matches(`:focus-visible`)}catch{e=!0}e&&this.node.animationState&&(this.node.animationState.setActive(`whileFocus`,!0),this.isActive=!0)}onBlur(){this.isActive&&this.node.animationState&&(this.node.animationState.setActive(`whileFocus`,!1),this.isActive=!1)}mount(){this.unmount=Mu(w_(this.node.current,`focus`,()=>this.onFocus()),w_(this.node.current,`blur`,()=>this.onBlur()))}unmount(){}};function Iv(e,t,n){let{props:r}=e;if(e.current instanceof HTMLButtonElement&&e.current.disabled)return;e.animationState&&r.whileTap&&e.animationState.setActive(`whileTap`,n===`Start`);let i=r[`onTap`+(n===`End`?``:n)];i&&Af.postRender(()=>i(t,Mv(t)))}var Lv=class extends o_{mount(){let{current:e}=this.node;if(!e)return;let{globalTapTarget:t,propagate:n}=this.node.props;this.unmount=Rg(e,(e,t)=>(Iv(this.node,t,`Start`),(e,{success:t})=>Iv(this.node,e,t?`End`:`Cancel`)),{useGlobalTarget:t,stopPropagation:n?.tap===!1})}unmount(){}},Rv=new WeakMap,zv=new WeakMap,Bv=e=>{let t=Rv.get(e.target);t&&t(e)},Vv=e=>{e.forEach(Bv)};function Hv({root:e,...t}){let n=e||document;zv.has(n)||zv.set(n,{});let r=zv.get(n),i=JSON.stringify(t);return r[i]||(r[i]=new IntersectionObserver(Vv,{root:e,...t})),r[i]}function Uv(e,t,n){let r=Hv(t);return Rv.set(e,n),r.observe(e),()=>{Rv.delete(e),r.unobserve(e)}}var Wv={some:0,all:1},Gv=class extends o_{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.stopObserver?.();let{viewport:e={}}=this.node.getProps(),{root:t,margin:n,amount:r=`some`,once:i}=e,a={root:t?t.current:void 0,rootMargin:n,threshold:typeof r==`number`?r:Wv[r]},o=e=>{let{isIntersecting:t}=e;if(this.isInView===t||(this.isInView=t,i&&!t&&this.hasEnteredView))return;t&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive(`whileInView`,t);let{onViewportEnter:n,onViewportLeave:r}=this.node.getProps(),a=t?n:r;a&&a(e)};this.stopObserver=Uv(this.node.current,a,o)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>`u`)return;let{props:e,prevProps:t}=this.node;[`amount`,`margin`,`root`].some(Kv(e,t))&&this.startObserver()}unmount(){this.stopObserver?.(),this.hasEnteredView=!1,this.isInView=!1}};function Kv({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}var qv={inView:{Feature:Gv},tap:{Feature:Lv},focus:{Feature:Fv},hover:{Feature:Pv}};function Jv(e){return(0,g.useEffect)(()=>()=>e(),[])}var Yv={renderer:Ov,...jv,...qv};function Xv(e){let t=bu(()=>Um(e)),{isStatic:n}=(0,g.useContext)(E_);if(n){let[,n]=(0,g.useState)(e);(0,g.useEffect)(()=>t.on(`change`,n),[])}return t}function Zv(e,t){let n=Xv(t()),r=()=>n.set(t());return r(),xu(()=>{let t=()=>Af.preRender(r,!1,!0),n=e.map(e=>e.on(`change`,t));return()=>{n.forEach(e=>e()),jf(r)}}),n}function Qv(e){Vm.current=[],e();let t=Zv(Vm.current,e);return Vm.current=void 0,t}function $v(e,t,n,r){if(typeof e==`function`)return Qv(e);if(n!==void 0&&!Array.isArray(n)&&typeof t!=`function`)return ty(e,t,n,r);let i=typeof t==`function`?t:zg(t,n,r),a=Array.isArray(e)?ey(e,i):ey([e],([e])=>i(e)),o=Array.isArray(e)?void 0:e.accelerate;if(o&&!o.isTransformed&&typeof t!=`function`&&Array.isArray(n)&&r?.clamp!==!1){let e=r?.ease;a.accelerate={...o,times:[0,...t,1],keyframes:[n[0],...n,n[n.length-1]],isTransformed:!0,...e?{ease:Array.isArray(e)?[e[0],...e]:e}:{}}}return a}function ey(e,t){let n=bu(()=>[]);return Zv(e,()=>{n.length=0;let r=e.length;for(let t=0;t<r;t++)n[t]=e[t].get();return t(n)})}function ty(e,t,n,r){let i=bu(()=>Object.keys(n)),a=bu(()=>({}));for(let o of i)a[o]=$v(e,t,n[o],r);return a}function ny(){!Zg.current&&$g();let[e]=(0,g.useState)(Xg.current);return e}function ry(){let e=ny(),{reducedMotion:t}=(0,g.useContext)(E_);return t===`never`?!1:t===`always`||e}function iy(e){return typeof e==`object`&&!Array.isArray(e)}function ay(e,t,n,r){return e==null?[]:typeof e==`string`&&iy(t)?Vh(e,n,r):e instanceof NodeList?Array.from(e):Array.isArray(e)?e.filter(e=>e!=null):[e]}function oy(e,t,n){return e*(t+1)+n*t}function sy(e,t,n,r){return typeof t==`number`?t:t.startsWith(`-`)||t.startsWith(`+`)?Math.max(0,e+parseFloat(t)):t===`<`?n:t.startsWith(`<`)?Math.max(0,n+parseFloat(t.slice(1))):r.get(t)??e}function cy(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];i.at>t&&i.at<n&&(wu(e,i),r--)}}function ly(e,t,n,r,i,a){cy(e,i,a);for(let o=0;o<t.length;o++)e.push({value:t[o],at:lf(i,a,r[o]),easing:rd(n,o)})}function uy(e,t,n=0){let r=t+1+t*n;for(let t=0;t<e.length;t++)e[t]=e[t]/r}function dy(e,t){return e.at===t.at?e.value===null?1:t.value===null?-1:0:e.at-t.at}var fy=`easeInOut`,py=20;function my(e,{defaultTransition:t={},...n}={},r,i){let a=t.duration||.3,o=new Map,s=new Map,c={},l=new Map,u=0,d=0,f=0;for(let n=0;n<e.length;n++){let o=e[n];if(typeof o==`string`){l.set(o,d);continue}if(!Array.isArray(o)){l.set(o.name,sy(d,o.at,u,l));continue}let[p,m,h={}]=o;h.at!==void 0&&(d=sy(d,h.at,u,l));let g=0,_=(e,n,r,o=0,s=0)=>{let c=_y(e),{delay:l=0,times:u=ep(c),type:p=t.type||`keyframes`,repeat:m,repeatType:h,repeatDelay:_=0,...v}=n,{ease:y=t.ease||`easeOut`,duration:b}=n,x=typeof l==`function`?l(o,s):l,S=c.length,C=hm(p)?p:i?.[p||`keyframes`];if(S<=2&&C){let e=100;if(S===2&&by(c)){let t=c[1]-c[0];e=Math.abs(t)}let n={...t,...v};b!==void 0&&(n.duration=Fu(b));let r=Lf(n,e,C);y=r.ease,b=r.duration}b??=a;let w=d+x;u.length===1&&u[0]===0&&(u[1]=1);let T=u.length-c.length;if(T>0&&$f(u,T),c.length===1&&c.unshift(null),m&&`${m}${py}`,m&&m<py){let e=b>0?_/b:0;b=oy(b,m,_);let t=[...c],n=[...u];y=Array.isArray(y)?[...y]:[y];let r=[...y],i=h===`reverse`||h===`mirror`,a=t,o=r;i&&(a=[...t].reverse(),h===`reverse`&&(o=[...r].reverse().map(e=>typeof e==`function`?Gu(e):e)));for(let s=0;s<m;s++){let l=i&&s%2==0,d=l?a:t,f=l?o:r,p=(s+1)*(1+e);e>0&&(c.push(c[c.length-1]),u.push(p),y.push(`linear`)),c.push(...d);for(let e=0;e<d.length;e++)u.push(n[e]+p),y.push(e===0?`linear`:rd(f,e-1))}uy(u,m,e)}let E=w+b;ly(r,c,y,u,w,E),g=Math.max(x+b,g),f=Math.max(E,f)};if(fh(p)){let e=hy(p,s);_(m,h,gy(`default`,e))}else{let e=ay(p,m,r,c),t=e.length;for(let n=0;n<t;n++){m=m,h=h;let r=e[n],i=hy(r,s);for(let e in m)_(m[e],vy(h,e),gy(e,i),n,t)}}u=d,d+=g}return s.forEach((e,r)=>{for(let i in e){let a=e[i];a.sort(dy);let s=[],c=[],l=[];for(let e=0;e<a.length;e++){let{at:t,value:n,easing:r}=a[e];s.push(n),c.push(Nu(0,f,t)),l.push(r||`easeOut`)}c[0]!==0&&(c.unshift(0),s.unshift(s[0]),l.unshift(fy)),c[c.length-1]!==1&&(c.push(1),s.push(null)),o.has(r)||o.set(r,{keyframes:{},transition:{}});let u=o.get(r);u.keyframes[i]=s;let{type:d,...p}=t;u.transition[i]={...p,duration:f,ease:l,times:c,...n}}}),o}function hy(e,t){return!t.has(e)&&t.set(e,{}),t.get(e)}function gy(e,t){return t[e]||(t[e]=[]),t[e]}function _y(e){return Array.isArray(e)?e:[e]}function vy(e,t){return e&&e[t]?{...e,...e[t]}:{...e}}var yy=e=>typeof e==`number`,by=e=>e.every(yy);function xy(e,t){return fh(e)||typeof e==`number`||typeof e==`string`&&!iy(t)}function Sy(e,t,n,r){let i=[];if(xy(e,t))i.push(C_(e,iy(t)&&t.default||t,n&&(n.default||n)));else{if(e==null)return i;let a=ay(e,t,r),o=a.length;for(let e=0;e<o;e++){let r=a[e],s={...n};`delay`in s&&typeof s.delay==`function`&&(s.delay=s.delay(e,o)),r instanceof Element?i.push(...yg(r,t,s,Hg.get(r))):i.push(...Ih(Ph(r)??bg,r,t,s))}}return i}function Cy(e,t,n){let r=[];return my(e.map(e=>{if(Array.isArray(e)&&typeof e[0]==`function`){let t=e[0],n=Um(0);return n.on(`change`,t),e.length===1?[n,[0,1]]:e.length===2?[n,[0,1],e[1]]:[n,e[1],e[2]]}return e}),t,n,{spring:Yf}).forEach(({keyframes:e,transition:t},n)=>{r.push(...Sy(n,e,t))}),r}function wy(e){return Array.isArray(e)&&e.some(Array.isArray)}function Ty(e={}){let{scope:t,reduceMotion:n,skipAnimations:r}=e;function i(e,i,a){let o=[],s,c={};if(n!==void 0&&(c.reduceMotion=n),r!==void 0&&(c.skipAnimations=r),wy(e)){let{onComplete:n,...r}=i||{};typeof n==`function`&&(s=n),o=Cy(e,{...c,...r},t)}else{let{onComplete:n,...r}=a||{};typeof n==`function`&&(s=n),o=Sy(e,i,{...c,...r},t)}let l=new Lm(o);return s&&l.finished.then(s),t&&(t.animations.push(l),l.finished.then(()=>{wu(t.animations,l)})),l}return i}var Ey=Object.assign(Ty(),{addEffect:Mh,removeEffect:Nh});function Dy(){let e=bu(()=>({current:null,animations:[]})),t=ry()??void 0,{skipAnimations:n}=(0,g.useContext)(E_),r=(0,g.useMemo)(()=>Ty({scope:e,reduceMotion:t,skipAnimations:n}),[e,t,n]);return Jv(()=>{e.animations.forEach(e=>e.stop()),e.animations.length=0}),[e,r]}var Oy=Dv,ky=(0,g.createContext)({disableAnimations:!1});function Ay(){return(0,g.use)(ky)}var jy=`(prefers-reduced-motion: reduce)`;function My(){let e=tu(jy),{disableAnimations:t}=Ay();return t||e}var Ny=`text-[2.5rem]`,Py={indicator:`text-primary`,track:`text-primary-soft`},Fy={indicator:`text-current`,track:`text-current/20`};function Iy({colors:e,reduced:t}){return(0,J.jsxs)(`svg`,{width:`1em`,height:`1em`,viewBox:`0 0 40 40`,fill:`none`,stroke:`currentColor`,strokeWidth:`4`,strokeLinecap:`round`,"aria-hidden":`true`,className:Z(`size-[1em] stroke-4!`,e.indicator),children:[(0,J.jsx)(`circle`,{cx:`20`,cy:`20`,r:`16`,className:e.track}),t?(0,J.jsx)(`circle`,{cx:`20`,cy:`20`,r:`16`,pathLength:1,strokeDasharray:`0.25 0.75`}):(0,J.jsx)(Oy.circle,{cx:`20`,cy:`20`,r:`16`,pathLength:1,strokeDasharray:`0.25 0.75`,initial:{strokeDashoffset:0},animate:{strokeDashoffset:-1},transition:{duration:.9,repeat:1/0,ease:`linear`}})]})}var Ly=12,Ry=1.2;function zy({colors:e,reduced:t}){return(0,J.jsx)(`svg`,{width:`1em`,height:`1em`,viewBox:`0 0 40 40`,fill:`currentColor`,"aria-hidden":`true`,className:Z(`size-[1em]`,e.indicator),children:Array.from({length:Ly},(e,n)=>{let r={x:18,y:2,width:4,height:6,rx:2,transform:`rotate(${360/Ly*n} 20 20)`};return t?(0,J.jsx)(`rect`,{...r,opacity:.25},n):(0,J.jsx)(Oy.rect,{...r,initial:{opacity:0},animate:{opacity:[0,1,.5,0]},transition:{duration:Ry,repeat:1/0,ease:`linear`,delay:n/Ly*Ry-Ry,times:[0,.1,.5,1]}},n)})})}var By=`M12.846 3.581C12.711 3.231 12.375 3 12 3C11.625 3 11.278 3.263 11.154 3.581C10.604 5.011 10.054 6.442 9.504 7.872C8.752 8.16 8.159 8.752 7.871 9.504C6.441 10.054 5.011 10.604 3.581 11.154C3.41 11.22 3.263 11.336 3.159 11.487C3.055 11.638 3 11.817 3 12C3 12.183 3.056 12.362 3.159 12.513C3.262 12.664 3.41 12.78 3.581 12.846C5.011 13.396 6.442 13.946 7.872 14.496C8.16 15.248 8.752 15.841 9.504 16.129C10.054 17.559 10.604 18.989 11.154 20.419C11.22 20.59 11.336 20.737 11.487 20.841C11.638 20.945 11.817 21 12 21C12.183 21 12.362 20.945 12.513 20.841C12.664 20.737 12.78 20.59 12.846 20.419C13.396 18.989 13.946 17.559 14.496 16.129C15.248 15.841 15.841 15.248 16.129 14.496C17.559 13.946 18.989 13.396 20.419 12.846C20.59 12.78 20.737 12.664 20.841 12.513C20.945 12.362 21 12.183 21 12C21 11.817 20.945 11.638 20.841 11.487C20.737 11.336 20.59 11.22 20.419 11.154C18.989 10.604 17.559 10.054 16.129 9.504C15.841 8.752 15.248 8.16 14.496 7.871C13.946 6.441 13.396 5.011 12.846 3.581Z`,Vy=`M12.704 5C12.469 5 12.235 5 12 5C11.765 5 11.531 5 11.296 5C10.161 5.053 9.025 5.106 7.889 5.159C6.979 6.069 6.069 6.979 5.159 7.889C5.106 9.025 5.053 10.161 5 11.296C5 11.395 5 11.494 5 11.593C5 11.729 5 11.864 5 12C5 12.136 5 12.271 5 12.407C5 12.506 5 12.605 5 12.704C5.053 13.839 5.106 14.975 5.159 16.111C6.069 17.021 6.979 17.931 7.889 18.841C9.025 18.894 10.161 18.947 11.296 19C11.395 19 11.494 19 11.593 19C11.729 19 11.864 19 12 19C12.136 19 12.271 19 12.407 19C12.506 19 12.605 19 12.704 19C13.839 18.947 14.975 18.894 16.111 18.841C17.021 17.931 17.931 17.021 18.841 16.111C18.894 14.975 18.947 13.839 19 12.704C19 12.605 19 12.506 19 12.407C19 12.271 19 12.136 19 12C19 11.864 19 11.729 19 11.593C19 11.494 19 11.395 19 11.296C18.947 10.161 18.894 9.025 18.841 7.889C17.931 6.979 17.021 6.069 16.111 5.159C14.975 5.106 13.839 5.053 12.704 5Z`;function Hy(e){return e.match(/-?\d+(?:\.\d+)?/g)?.map(Number)??[]}var Uy=Hy(By),Wy=Hy(Vy),Gy=(Uy.length-2)/6;function Ky(e){let t=`M${e[0]} ${e[1]}`;for(let n=0;n<Gy;n++){let r=2+n*6;t+=`C${e[r]} ${e[r+1]} ${e[r+2]} ${e[r+3]} ${e[r+4]} ${e[r+5]}`}return t+`Z`}function qy(e,t,n){return e+(t-e)*n}function Jy(e){return e<.5?2*e*e:1-(-2*e+2)**2/2}var Yy=2.5,Xy=.4;function Zy({colors:e,reduced:t}){let n=Xv(0);g.useEffect(()=>{if(t)return;let e=Ey(n,1,{duration:Yy,repeat:1/0,ease:`linear`});return()=>e.stop()},[t,n]);let r=$v(n,e=>{if(e<Xy/2){let t=Jy(e/(Xy/2));return Ky(Uy.map((e,n)=>qy(e,Wy[n],t)))}if(e<Xy){let t=Jy((e-Xy/2)/(Xy/2));return Ky(Wy.map((e,n)=>qy(e,Uy[n],t)))}return By}),i=$v(n,e=>e<Xy?Jy(e/Xy)*360:360);return(0,J.jsx)(`svg`,{width:`1em`,height:`1em`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinejoin:`round`,strokeLinecap:`round`,"aria-hidden":`true`,className:Z(`size-[1em]`,e.indicator),children:t?(0,J.jsx)(`path`,{d:By}):(0,J.jsx)(Oy.path,{d:r,style:{transformOrigin:`12px 12px`,rotate:i}})})}var Qy={circular:Iy,dots:zy,sparkle:Zy};function $y({variant:e=`circular`,currentColor:t=!1,"aria-label":n=`Loading`,className:r,...i}){let a=My(),o=t?Fy:Py,s=Qy[e],c=(0,J.jsx)(s,{colors:o,reduced:a});return(0,J.jsx)(`span`,{"data-slot":`spinner`,role:`status`,"aria-label":n,className:Z(`inline-flex shrink-0 items-center justify-center align-middle`,Ny,r),...i,children:a?c:(0,J.jsx)(W_,{features:Yv,strict:!0,children:c})})}function eb(e,{storage:t=`local`}={}){let[n,r,i]=$l(t,e,``,{serializer:e=>e,deserializer:e=>e}),a=n!==`1`,o=(0,g.useCallback)(()=>r(`1`),[r]),s=(0,g.useCallback)(()=>i(),[i]);return(0,g.useMemo)(()=>({open:a,dismiss:o,reset:s}),[a,o,s])}var tb=Sl(Z(`group/alert relative rounded-xl border p-5 text-foreground backdrop-blur-xl`,`grid w-full items-start`,`[grid-template-columns:auto_1fr_auto] [grid-template-areas:'icon_title_close'_'._description_.'_'._actions_actions']`,`@min-[460px]:data-[layout=inline]:items-center`,`@min-[460px]:data-[layout=inline]:[grid-template-columns:auto_auto_1fr_auto_auto]`,`@min-[460px]:data-[layout=inline]:[grid-template-areas:'icon_title_description_actions_close']`),{variants:{variant:{default:`bg-background border-border`,primary:`bg-primary-subtle border-primary-soft`,secondary:`bg-secondary-subtle border-secondary-soft`,error:`bg-error-subtle border-error-soft`,success:`bg-success-subtle border-success-soft`,warning:`bg-warning-subtle border-warning-soft`,info:`bg-info-subtle border-info-soft`}},defaultVariants:{variant:`default`}}),nb={default:`text-foreground-intense`,primary:`text-primary`,secondary:`text-secondary-emphasis`,error:`text-error-emphasis`,success:`text-success-emphasis`,warning:`text-warning-emphasis`,info:`text-info-emphasis`},rb=g.createContext(`default`),ib={opacity:0,scale:.88,filter:`blur(12px)`,height:0},ab={opacity:0},ob={default:{duration:.32,ease:[.4,0,.2,1]},height:{duration:.3,ease:[.4,0,.2,1],delay:.18}};function sb({variant:e,layout:t=`block`,dismissible:n=!1,open:r,onOpenChange:i,persistKey:a,persistStorage:o=`local`,closeLabel:s=`Dismiss`,role:c=`alert`,className:l,children:u,style:d,...f}){let p=My(),[m,h]=g.useState(!0),_=eb(a??``,{storage:o}),v=r!==void 0,y=!v&&a!=null,b=v?r:y?_.open:m,x=g.useCallback(()=>{if(v){i?.(!1);return}y?_.dismiss():h(!1),i?.(!1)},[v,y,_,i]);return(0,J.jsx)(rb.Provider,{value:e??`default`,children:(0,J.jsx)(W_,{features:Yv,strict:!0,children:(0,J.jsx)(L_,{initial:!1,children:b&&(0,J.jsx)(Oy.div,{initial:!1,exit:p?ab:ib,transition:p?{duration:0}:ob,className:`@container overflow-hidden`,children:(0,J.jsxs)(`div`,{role:c,"data-slot":`alert`,"data-layout":t,style:d,className:Z(tb({variant:e}),l),...f,children:[u,n&&(0,J.jsx)(`button`,{type:`button`,"aria-label":s,"data-slot":`alert-close`,onClick:x,className:Z(`text-foreground-muted cursor-pointer rounded-md p-1 transition-colors outline-none [grid-area:close]`,`hover:text-foreground-intense`,`focus-visible:ring-ring focus-visible:ring-2`,`self-start @min-[460px]:group-data-[layout=inline]/alert:self-center`,`ms-3 -me-1 -mt-1 @min-[460px]:group-data-[layout=inline]/alert:my-0`),children:(0,J.jsx)(cb,{})})]})},`alert`)})})})}function cb(){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 16 16`,fill:`currentColor`,"aria-hidden":`true`,className:`size-4`,children:(0,J.jsx)(`path`,{d:`M11.523 3.522c.264-.264.691-.264.955 0s.264.691 0 .955L8.955 8l3.522 3.522c.264.264.264.691 0 .955s-.691.264-.955 0L8 8.955l-3.522 3.522c-.264.264-.691.264-.955 0s-.264-.691 0-.955L7.045 8 3.522 4.478c-.264-.264-.264-.691 0-.955s.691-.264.955 0L8 7.045l3.523-3.522z`})})}function lb({className:e,...t}){let n=g.useContext(rb);return(0,J.jsx)(`span`,{"data-slot":`alert-icon`,className:Z(`me-3 flex h-lh shrink-0 items-center [grid-area:icon] [&_svg:not([class*='size-'])]:size-5`,nb[n],e),...t})}function ub({className:e,as:t=`h5`,...n}){return(0,J.jsx)(t,{"data-slot":`alert-title`,className:Z(`text-foreground-intense self-center font-semibold [grid-area:title]`,`text-base @min-[460px]:group-data-[layout=inline]/alert:me-3 @min-[460px]:group-data-[layout=inline]/alert:text-sm`,e),...n})}function db({className:e,...t}){return(0,J.jsx)(`p`,{"data-slot":`alert-description`,className:Z(`text-foreground text-sm [grid-area:description]`,`mt-2 @min-[460px]:group-data-[layout=inline]/alert:mt-0`,e),...t})}var fb=`zh-Hans`;function pb(e){let t=String(e??``).trim().replace(/_/g,`-`).toLowerCase();if(!t)return null;let n=t.split(`-`),r=n[0];return r===`zh`?n.slice(1).some(e=>e===`hant`||e===`tw`||e===`hk`||e===`mo`)?`zh-Hant`:`zh-Hans`:r===`en`?`en`:r===`ja`?`ja`:r===`ko`?`ko`:null}var mb=null;function hb(){try{let e=typeof navigator>`u`?null:navigator;if(!e)return[];if(Array.isArray(e.languages)&&e.languages.length>0)return e.languages;if(typeof e.language==`string`&&e.language)return[e.language]}catch{}return[]}function gb(){if(mb)return mb;for(let e of hb()){let t=pb(e);if(t)return mb=t,mb}return mb=`en`,mb}function _b(e,t){return t?e.replace(/\{([a-zA-Z0-9_]+)\}/g,(e,n)=>{let r=t[n];return r==null?e:String(r)}):e}function vb(e){let t={};for(let n of e)Object.assign(t,n);return t}function yb(e,t,n,r){let i=e[t]?.[n]||e[fb]?.[n];return typeof i!=`string`||i.length===0?n:_b(i,r)}var bb=[{"zh-Hans":{"panel.common.show":`显示`,"panel.common.hide":`隐藏`,"panel.common.close":`关闭`,"panel.common.none":`暂无`,"panel.common.cores":`核`,"panel.shell.deviceAllowed":`已允许新设备绑定。`,"panel.shell.deviceDenied":`已停止接收新设备,已绑定的手机照常可用。`},"zh-Hant":{"panel.common.show":`顯示`,"panel.common.hide":`隱藏`,"panel.common.close":`關閉`,"panel.common.none":`暫無`,"panel.common.cores":`核`,"panel.shell.deviceAllowed":`已允許新裝置綁定。`,"panel.shell.deviceDenied":`已停止接收新裝置,已綁定的手機照常可用。`},en:{"panel.common.show":`Show`,"panel.common.hide":`Hide`,"panel.common.close":`Close`,"panel.common.none":`None`,"panel.common.cores":`cores`,"panel.shell.deviceAllowed":`New devices can pair now.`,"panel.shell.deviceDenied":`New devices are refused; phones already paired keep working.`},ja:{"panel.common.show":`表示`,"panel.common.hide":`隠す`,"panel.common.close":`閉じる`,"panel.common.none":`なし`,"panel.common.cores":`コア`,"panel.shell.deviceAllowed":`新しいデバイスのペアリングを許可しました。`,"panel.shell.deviceDenied":`新しいデバイスの受け付けを停止しました。既にペアリング済みのスマートフォンはそのまま使えます。`},ko:{"panel.common.show":`표시`,"panel.common.hide":`숨기기`,"panel.common.close":`닫기`,"panel.common.none":`없음`,"panel.common.cores":`코어`,"panel.shell.deviceAllowed":`새 기기 페어링을 허용했습니다.`,"panel.shell.deviceDenied":`새 기기 수신을 중지했습니다. 이미 페어링된 휴대폰은 그대로 사용할 수 있습니다.`}},{"zh-Hans":{"panel.status.connected":`已连接`,"panel.status.connecting":`连接中`,"panel.status.error":`被关闭`,"panel.status.off":`未启用`,"panel.lan.off":`未启用`,"panel.lan.listening":`正在监听`,"panel.lan.error":`启动失败`,"panel.sidecar.healthy":`运行中`,"panel.sidecar.starting":`启动中`,"panel.sidecar.restarting":`正在重启`,"panel.sidecar.error":`异常`,"panel.sidecar.stopped":`已停止`,"panel.ago.justNow":`刚刚`,"panel.ago.minutes":`{count} 分钟前`,"panel.ago.hours":`{count} 小时前`,"panel.ago.days":`{count} 天前`,"panel.shell.deviceAllowed":`已允许新设备绑定。`,"panel.shell.deviceDenied":`已停止接收新设备,已绑定的手机照常可用。`},"zh-Hant":{"panel.status.connected":`已連線`,"panel.status.connecting":`連線中`,"panel.status.error":`被關閉`,"panel.status.off":`未啟用`,"panel.lan.off":`未啟用`,"panel.lan.listening":`正在監聽`,"panel.lan.error":`啟動失敗`,"panel.sidecar.healthy":`執行中`,"panel.sidecar.starting":`啟動中`,"panel.sidecar.restarting":`正在重新啟動`,"panel.sidecar.error":`異常`,"panel.sidecar.stopped":`已停止`,"panel.ago.justNow":`剛剛`,"panel.ago.minutes":`{count} 分鐘前`,"panel.ago.hours":`{count} 小時前`,"panel.ago.days":`{count} 天前`,"panel.shell.deviceAllowed":`已允許新裝置綁定。`,"panel.shell.deviceDenied":`已停止接收新裝置,已綁定的手機照常可用。`},en:{"panel.status.connected":`Connected`,"panel.status.connecting":`Connecting`,"panel.status.error":`Shut down`,"panel.status.off":`Off`,"panel.lan.off":`Off`,"panel.lan.listening":`Listening`,"panel.lan.error":`Failed to start`,"panel.sidecar.healthy":`Running`,"panel.sidecar.starting":`Starting`,"panel.sidecar.restarting":`Restarting`,"panel.sidecar.error":`Error`,"panel.sidecar.stopped":`Stopped`,"panel.ago.justNow":`just now`,"panel.ago.minutes":`{count} min ago`,"panel.ago.hours":`{count} h ago`,"panel.ago.days":`{count} d ago`,"panel.shell.deviceAllowed":`New devices can pair now.`,"panel.shell.deviceDenied":`New devices are refused; phones already paired keep working.`},ja:{"panel.status.connected":`接続済み`,"panel.status.connecting":`接続中`,"panel.status.error":`閉じられました`,"panel.status.off":`オフ`,"panel.lan.off":`オフ`,"panel.lan.listening":`待ち受け中`,"panel.lan.error":`起動に失敗`,"panel.sidecar.healthy":`実行中`,"panel.sidecar.starting":`起動中`,"panel.sidecar.restarting":`再起動中`,"panel.sidecar.error":`異常`,"panel.sidecar.stopped":`停止済み`,"panel.ago.justNow":`たった今`,"panel.ago.minutes":`{count} 分前`,"panel.ago.hours":`{count} 時間前`,"panel.ago.days":`{count} 日前`,"panel.shell.deviceAllowed":`新しいデバイスのペアリングを許可しました。`,"panel.shell.deviceDenied":`新しいデバイスの受け付けを停止しました。既にペアリング済みのスマートフォンはそのまま使えます。`},ko:{"panel.status.connected":`연결됨`,"panel.status.connecting":`연결 중`,"panel.status.error":`종료됨`,"panel.status.off":`꺼짐`,"panel.lan.off":`꺼짐`,"panel.lan.listening":`수신 대기 중`,"panel.lan.error":`시작 실패`,"panel.sidecar.healthy":`실행 중`,"panel.sidecar.starting":`시작 중`,"panel.sidecar.restarting":`재시작 중`,"panel.sidecar.error":`오류`,"panel.sidecar.stopped":`중지됨`,"panel.ago.justNow":`방금`,"panel.ago.minutes":`{count}분 전`,"panel.ago.hours":`{count}시간 전`,"panel.ago.days":`{count}일 전`,"panel.shell.deviceAllowed":`새 기기 페어링을 허용했습니다.`,"panel.shell.deviceDenied":`새 기기 수신을 중지했습니다. 이미 페어링된 휴대폰은 그대로 사용할 수 있습니다.`}},{"zh-Hans":{"panel.shell.remoteEnabled":`已启用远程控制。`,"panel.shell.remoteDisabled":`已停用远程控制,手机将断开。`,"panel.shell.pairingRegenerated":`配对码已重新生成,之前截图的二维码作废。`,"panel.shell.reconnecting":`已发起重连。`,"panel.shell.sidecarRestarted":`旁挂进程已重启。`,"panel.shell.revokeConfirm":`吊销全部设备授权?所有手机都要重新配对,这一步不能撤销。`,"panel.shell.revoked":`已吊销 {count} 个授权`,"panel.shell.revokedRelay":`(中转侧 {count} 个)`,"panel.shell.configSaved":`配置已保存。`,"panel.shell.lanSaved":`局域网配置已保存。`,"panel.shell.preferredAddress":`手机优先使用 {address}。`,"panel.shell.preferredAuto":`已改回按网卡顺序自动选。`,"panel.shell.unknownVersion":`未知版本`,"panel.shell.title":`移动端`,"panel.shell.subtitle":`把手机连上这台电脑上的 DSH`,"panel.shell.statusFailed":`读不到插件状态`,"panel.shell.readingStatus":`正在读取状态…`,"panel.shell.busy":`处理中…`,"panel.shell.deviceAllowed":`已允许新设备绑定。`,"panel.shell.deviceDenied":`已停止接收新设备,已绑定的手机照常可用。`},"zh-Hant":{"panel.shell.remoteEnabled":`已啟用遠端控制。`,"panel.shell.remoteDisabled":`已停用遠端控制,手機將斷開。`,"panel.shell.pairingRegenerated":`配對碼已重新產生,之前截圖的 QR 碼作廢。`,"panel.shell.reconnecting":`已發起重新連線。`,"panel.shell.sidecarRestarted":`旁掛程序已重新啟動。`,"panel.shell.revokeConfirm":`吊銷全部裝置授權?所有手機都要重新配對,這一步不能撤銷。`,"panel.shell.revoked":`已吊銷 {count} 個授權`,"panel.shell.revokedRelay":`(中轉側 {count} 個)`,"panel.shell.configSaved":`設定已儲存。`,"panel.shell.lanSaved":`區域網路設定已儲存。`,"panel.shell.preferredAddress":`手機優先使用 {address}。`,"panel.shell.preferredAuto":`已改回依網卡順序自動選。`,"panel.shell.unknownVersion":`未知版本`,"panel.shell.title":`行動端`,"panel.shell.subtitle":`把手機連上這台電腦上的 DSH`,"panel.shell.statusFailed":`讀不到外掛狀態`,"panel.shell.readingStatus":`正在讀取狀態…`,"panel.shell.busy":`處理中…`,"panel.shell.deviceAllowed":`已允許新裝置綁定。`,"panel.shell.deviceDenied":`已停止接收新裝置,已綁定的手機照常可用。`},en:{"panel.shell.remoteEnabled":`Remote control enabled.`,"panel.shell.remoteDisabled":`Remote control disabled — your phone will disconnect.`,"panel.shell.pairingRegenerated":`Pairing code regenerated; previously screenshotted QR codes no longer work.`,"panel.shell.reconnecting":`Reconnecting.`,"panel.shell.sidecarRestarted":`Sidecar process restarted.`,"panel.shell.revokeConfirm":`Revoke all device authorisations? Every phone has to be paired again, and this cannot be undone.`,"panel.shell.revoked":`Revoked {count} authorisation(s)`,"panel.shell.revokedRelay":` ({count} on the relay)`,"panel.shell.configSaved":`Configuration saved.`,"panel.shell.lanSaved":`Local-network settings saved.`,"panel.shell.preferredAddress":`Your phone will prefer {address}.`,"panel.shell.preferredAuto":`Back to automatic order by network interface.`,"panel.shell.unknownVersion":`Unknown version`,"panel.shell.title":`Mobile`,"panel.shell.subtitle":`Connect your phone to DSH on this computer`,"panel.shell.statusFailed":`Could not read plugin status`,"panel.shell.readingStatus":`Reading status…`,"panel.shell.busy":`Working…`,"panel.shell.deviceAllowed":`New devices can pair now.`,"panel.shell.deviceDenied":`New devices are refused; phones already paired keep working.`},ja:{"panel.shell.remoteEnabled":`リモート操作をオンにしました。`,"panel.shell.remoteDisabled":`リモート操作をオフにしました。スマートフォンは切断されます。`,"panel.shell.pairingRegenerated":`ペアリングコードを再生成しました。以前スクリーンショットした QR コードは無効です。`,"panel.shell.reconnecting":`再接続を開始しました。`,"panel.shell.sidecarRestarted":`サイドカープロセスを再起動しました。`,"panel.shell.revokeConfirm":`すべてのデバイス認証を取り消しますか?すべてのスマートフォンで再ペアリングが必要になり、元に戻せません。`,"panel.shell.revoked":`{count} 件の認証を取り消しました`,"panel.shell.revokedRelay":`(リレー側 {count} 件)`,"panel.shell.configSaved":`設定を保存しました。`,"panel.shell.lanSaved":`LAN 設定を保存しました。`,"panel.shell.preferredAddress":`スマートフォンは {address} を優先します。`,"panel.shell.preferredAuto":`ネットワークインターフェース順の自動選択に戻しました。`,"panel.shell.unknownVersion":`不明なバージョン`,"panel.shell.title":`モバイル`,"panel.shell.subtitle":`このパソコンの DSH にスマートフォンをつなぐ`,"panel.shell.statusFailed":`プラグインの状態を取得できません`,"panel.shell.readingStatus":`状態を読み込み中…`,"panel.shell.busy":`処理中…`,"panel.shell.deviceAllowed":`新しいデバイスのペアリングを許可しました。`,"panel.shell.deviceDenied":`新しいデバイスの受け付けを停止しました。既にペアリング済みのスマートフォンはそのまま使えます。`},ko:{"panel.shell.remoteEnabled":`원격 제어를 켰습니다.`,"panel.shell.remoteDisabled":`원격 제어를 껐습니다. 휴대폰 연결이 끊깁니다.`,"panel.shell.pairingRegenerated":`페어링 코드를 재생성했습니다. 이전에 캡처한 QR 코드는 무효입니다.`,"panel.shell.reconnecting":`재연결을 시작했습니다.`,"panel.shell.sidecarRestarted":`사이드카 프로세스를 재시작했습니다.`,"panel.shell.revokeConfirm":`모든 기기 인증을 취소할까요? 모든 휴대폰을 다시 페어링해야 하며 되돌릴 수 없습니다.`,"panel.shell.revoked":`인증 {count}개를 취소했습니다`,"panel.shell.revokedRelay":` (릴레이 측 {count}개)`,"panel.shell.configSaved":`설정을 저장했습니다.`,"panel.shell.lanSaved":`LAN 설정을 저장했습니다.`,"panel.shell.preferredAddress":`휴대폰이 {address}을(를) 우선 사용합니다.`,"panel.shell.preferredAuto":`네트워크 인터페이스 순서 자동 선택으로 되돌렸습니다.`,"panel.shell.unknownVersion":`알 수 없는 버전`,"panel.shell.title":`모바일`,"panel.shell.subtitle":`이 컴퓨터의 DSH에 휴대폰을 연결`,"panel.shell.statusFailed":`플러그인 상태를 읽을 수 없습니다`,"panel.shell.readingStatus":`상태를 읽는 중…`,"panel.shell.busy":`처리 중…`,"panel.shell.deviceAllowed":`새 기기 페어링을 허용했습니다.`,"panel.shell.deviceDenied":`새 기기 수신을 중지했습니다. 이미 페어링된 휴대폰은 그대로 사용할 수 있습니다.`}},{"zh-Hans":{"panel.connection.enabled":`已启用`,"panel.connection.disabled":`已停用`,"panel.connection.remoteControl":`远程控制`,"panel.connection.pluginVersion":`插件版本`,"panel.connection.deviceName":`设备名`,"panel.connection.instanceId":`实例 ID`,"panel.connection.platform":`平台`,"panel.connection.relayUrl":`中转地址`,"panel.connection.tunnel":`中转隧道`,"panel.connection.lan":`局域网直连`,"panel.connection.viewLan":`查看局域网直连`,"panel.connection.sidecar":`旁挂进程`,"panel.connection.sidecarRestarts":`已重启 {count} 次`,"panel.connection.mirror":`会话镜像`,"panel.connection.mirrorOk":`推送正常`,"panel.connection.mirrorOff":`未推送`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.connection.enabled":`已啟用`,"panel.connection.disabled":`已停用`,"panel.connection.remoteControl":`遠端控制`,"panel.connection.pluginVersion":`外掛版本`,"panel.connection.deviceName":`裝置名稱`,"panel.connection.instanceId":`實例 ID`,"panel.connection.platform":`平台`,"panel.connection.relayUrl":`中轉位址`,"panel.connection.tunnel":`中轉通道`,"panel.connection.lan":`區域網路直連`,"panel.connection.viewLan":`查看區域網路直連`,"panel.connection.sidecar":`旁掛程序`,"panel.connection.sidecarRestarts":`已重新啟動 {count} 次`,"panel.connection.mirror":`會話鏡像`,"panel.connection.mirrorOk":`推送正常`,"panel.connection.mirrorOff":`未推送`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.connection.enabled":`Enabled`,"panel.connection.disabled":`Disabled`,"panel.connection.remoteControl":`Remote control`,"panel.connection.pluginVersion":`Plugin version`,"panel.connection.deviceName":`Device name`,"panel.connection.instanceId":`Instance ID`,"panel.connection.platform":`Platform`,"panel.connection.relayUrl":`Relay address`,"panel.connection.tunnel":`Relay tunnel`,"panel.connection.lan":`LAN direct`,"panel.connection.viewLan":`View LAN direct`,"panel.connection.sidecar":`Sidecar process`,"panel.connection.sidecarRestarts":`restarted {count} time(s)`,"panel.connection.mirror":`Session mirror`,"panel.connection.mirrorOk":`Pushing`,"panel.connection.mirrorOff":`Not pushing`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.connection.enabled":`有効`,"panel.connection.disabled":`無効`,"panel.connection.remoteControl":`リモート操作`,"panel.connection.pluginVersion":`プラグインのバージョン`,"panel.connection.deviceName":`デバイス名`,"panel.connection.instanceId":`インスタンス ID`,"panel.connection.platform":`プラットフォーム`,"panel.connection.relayUrl":`リレーのアドレス`,"panel.connection.tunnel":`リレートンネル`,"panel.connection.lan":`LAN 直結`,"panel.connection.viewLan":`LAN 直結を見る`,"panel.connection.sidecar":`サイドカープロセス`,"panel.connection.sidecarRestarts":`{count} 回再起動しました`,"panel.connection.mirror":`セッションのミラー`,"panel.connection.mirrorOk":`送信中`,"panel.connection.mirrorOff":`送信していません`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.connection.enabled":`사용 중`,"panel.connection.disabled":`사용 안 함`,"panel.connection.remoteControl":`원격 제어`,"panel.connection.pluginVersion":`플러그인 버전`,"panel.connection.deviceName":`기기 이름`,"panel.connection.instanceId":`인스턴스 ID`,"panel.connection.platform":`플랫폼`,"panel.connection.relayUrl":`릴레이 주소`,"panel.connection.tunnel":`릴레이 터널`,"panel.connection.lan":`LAN 직접 연결`,"panel.connection.viewLan":`LAN 직접 연결 보기`,"panel.connection.sidecar":`사이드카 프로세스`,"panel.connection.sidecarRestarts":`{count}회 재시작됨`,"panel.connection.mirror":`세션 미러`,"panel.connection.mirrorOk":`전송 중`,"panel.connection.mirrorOff":`전송 안 함`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.pairing.policyDeny":`一律拒绝新设备`,"panel.pairing.policyCode":`凭配对码允许`,"panel.pairing.copyCode":`复制配对码`,"panel.pairing.copied":`已复制`,"panel.pairing.noQr":`还没取到二维码`,"panel.pairing.qr":`二维码`,"panel.pairing.policy":`配对策略`,"panel.pairing.port":`局域网端口`,"panel.pairing.phoneAddress":`手机优先用的地址`,"panel.pairing.hidden":`已隐藏`,"panel.pairing.noAddress":`还没取到地址`,"panel.pairing.cardTitle":`配对与二维码`,"panel.pairing.code":`配对码`,"panel.pairing.qrFailed":`拿不到二维码`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.pairing.policyDeny":`一律拒絕新裝置`,"panel.pairing.policyCode":`憑配對碼允許`,"panel.pairing.copyCode":`複製配對碼`,"panel.pairing.copied":`已複製`,"panel.pairing.noQr":`還沒取得 QR 碼`,"panel.pairing.qr":`QR 碼`,"panel.pairing.policy":`配對策略`,"panel.pairing.port":`區域網路連接埠`,"panel.pairing.phoneAddress":`手機優先使用的位址`,"panel.pairing.hidden":`已隱藏`,"panel.pairing.noAddress":`還沒取得位址`,"panel.pairing.cardTitle":`配對與 QR 碼`,"panel.pairing.code":`配對碼`,"panel.pairing.qrFailed":`拿不到 QR 碼`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.pairing.policyDeny":`Refuse all new devices`,"panel.pairing.policyCode":`Allow with pairing code`,"panel.pairing.copyCode":`Copy pairing code`,"panel.pairing.copied":`Copied`,"panel.pairing.noQr":`QR code not loaded yet`,"panel.pairing.qr":`QR code`,"panel.pairing.policy":`Pairing policy`,"panel.pairing.port":`LAN port`,"panel.pairing.phoneAddress":`Address the phone prefers`,"panel.pairing.hidden":`Hidden`,"panel.pairing.noAddress":`Address not available yet`,"panel.pairing.cardTitle":`Pairing & QR code`,"panel.pairing.code":`Pairing code`,"panel.pairing.qrFailed":`Could not get the QR code`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.pairing.policyDeny":`新しいデバイスをすべて拒否`,"panel.pairing.policyCode":`ペアリングコードで許可`,"panel.pairing.copyCode":`ペアリングコードをコピー`,"panel.pairing.copied":`コピーしました`,"panel.pairing.noQr":`QR コードをまだ取得していません`,"panel.pairing.qr":`QR コード`,"panel.pairing.policy":`ペアリングポリシー`,"panel.pairing.port":`LAN ポート`,"panel.pairing.phoneAddress":`スマートフォンが優先して使うアドレス`,"panel.pairing.hidden":`非表示`,"panel.pairing.noAddress":`アドレスをまだ取得していません`,"panel.pairing.cardTitle":`ペアリングと QR コード`,"panel.pairing.code":`ペアリングコード`,"panel.pairing.qrFailed":`QR コードを取得できません`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.pairing.policyDeny":`새 기기 모두 거부`,"panel.pairing.policyCode":`페어링 코드로 허용`,"panel.pairing.copyCode":`페어링 코드 복사`,"panel.pairing.copied":`복사됨`,"panel.pairing.noQr":`QR 코드를 아직 가져오지 못했습니다`,"panel.pairing.qr":`QR 코드`,"panel.pairing.policy":`페어링 정책`,"panel.pairing.port":`LAN 포트`,"panel.pairing.phoneAddress":`휴대폰이 우선 사용할 주소`,"panel.pairing.hidden":`숨김`,"panel.pairing.noAddress":`주소를 아직 가져오지 못했습니다`,"panel.pairing.cardTitle":`페어링 및 QR 코드`,"panel.pairing.code":`페어링 코드`,"panel.pairing.qrFailed":`QR 코드를 가져올 수 없습니다`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.address.lan":`局域网地址`,"panel.address.ipv6":`IPv6 直连`,"panel.address.public":`公网地址`,"panel.address.empty":`还没取到地址`,"panel.address.ipv6Hint":`(手机按实测择优)`,"panel.address.publicHint":`(不在二维码里)`,"panel.address.hint":`手机先试选中的那条,试不通会自动换下一条。`,"panel.address.pick":`手机优先用这条`,"panel.lanDialog.state":`状态`,"panel.lanDialog.port":`当前端口`,"panel.lanDialog.unchanged":`留空表示不改动`,"panel.relay.namePlaceholder":`手机里显示的名字`,"panel.relay.selected":`已选`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.address.lan":`區域網路位址`,"panel.address.ipv6":`IPv6 直連`,"panel.address.public":`公網位址`,"panel.address.empty":`還沒取得位址`,"panel.address.ipv6Hint":`(手機依實測擇優)`,"panel.address.publicHint":`(不在 QR 碼裡)`,"panel.address.hint":`手機先試選中的那條,試不通會自動換下一條。`,"panel.address.pick":`手機優先使用這條`,"panel.lanDialog.state":`狀態`,"panel.lanDialog.port":`目前連接埠`,"panel.lanDialog.unchanged":`留空表示不改動`,"panel.relay.namePlaceholder":`手機裡顯示的名稱`,"panel.relay.selected":`已選`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.address.lan":`LAN address`,"panel.address.ipv6":`IPv6 direct`,"panel.address.public":`Public address`,"panel.address.empty":`Address not available yet`,"panel.address.ipv6Hint":` (phone picks the fastest)`,"panel.address.publicHint":` (not in the QR code)`,"panel.address.hint":`Your phone tries the selected one first and falls back automatically.`,"panel.address.pick":`Prefer this one on the phone`,"panel.lanDialog.state":`Status`,"panel.lanDialog.port":`Current port`,"panel.lanDialog.unchanged":`Leave blank to keep it`,"panel.relay.namePlaceholder":`The name shown on your phone`,"panel.relay.selected":`Selected`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.address.lan":`LAN アドレス`,"panel.address.ipv6":`IPv6 直結`,"panel.address.public":`パブリックアドレス`,"panel.address.empty":`アドレスをまだ取得していません`,"panel.address.ipv6Hint":`(スマートフォンが実測で選択)`,"panel.address.publicHint":`(QR コードには入りません)`,"panel.address.hint":`スマートフォンは選択したものを先に試し、通らなければ自動で次に切り替えます。`,"panel.address.pick":`スマートフォンで優先する`,"panel.lanDialog.state":`状態`,"panel.lanDialog.port":`現在のポート`,"panel.lanDialog.unchanged":`空欄なら変更しません`,"panel.relay.namePlaceholder":`スマートフォンに表示される名前`,"panel.relay.selected":`選択済み`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.address.lan":`LAN 주소`,"panel.address.ipv6":`IPv6 직접 연결`,"panel.address.public":`공인 주소`,"panel.address.empty":`주소를 아직 가져오지 못했습니다`,"panel.address.ipv6Hint":` (휴대폰이 실측으로 선택)`,"panel.address.publicHint":` (QR 코드에 없음)`,"panel.address.hint":`휴대폰은 선택한 주소를 먼저 시도하고, 안 되면 자동으로 다음으로 넘어갑니다.`,"panel.address.pick":`휴대폰에서 우선 사용`,"panel.lanDialog.state":`상태`,"panel.lanDialog.port":`현재 포트`,"panel.lanDialog.unchanged":`비우면 변경하지 않습니다`,"panel.relay.namePlaceholder":`휴대폰에 표시되는 이름`,"panel.relay.selected":`선택됨`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.links.android":`安卓`,"panel.links.apple":`苹果`,"panel.links.distPlatform":`APP 分发平台`,"panel.links.domesticRecommended":`国内下载推荐`,"panel.links.overseasRecommended":`海外下载推荐`,"panel.links.appStore":`正式版,随系统自动更新`,"panel.links.testFlight":`测试版,比商店版先拿到新版本`,"panel.links.publicRelay":`公用中转 1`,"panel.links.wechatQrAlt":`微信群二维码:用微信或企业微信扫码加入`,"panel.links.joinGroup":`加入交流群`,"panel.theme.toDay":`切换到日间模式`,"panel.theme.toNight":`切换到夜间模式`,"panel.net.requestFailed":`请求失败(HTTP {status})`,"panel.net.requestFailedNoStatus":`请求失败`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.links.android":`Android`,"panel.links.apple":`Apple`,"panel.links.distPlatform":`APP 分發平台`,"panel.links.domesticRecommended":`國內下載推薦`,"panel.links.overseasRecommended":`海外下載推薦`,"panel.links.appStore":`正式版,隨系統自動更新`,"panel.links.testFlight":`測試版,比商店版先拿到新版本`,"panel.links.publicRelay":`公用中轉 1`,"panel.links.wechatQrAlt":`微信群 QR 碼:用微信或企業微信掃碼加入`,"panel.links.joinGroup":`加入交流群`,"panel.theme.toDay":`切換到日間模式`,"panel.theme.toNight":`切換到夜間模式`,"panel.net.requestFailed":`請求失敗(HTTP {status})`,"panel.net.requestFailedNoStatus":`請求失敗`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.links.android":`Android`,"panel.links.apple":`Apple`,"panel.links.distPlatform":`App distribution platform`,"panel.links.domesticRecommended":`Recommended in China`,"panel.links.overseasRecommended":`Recommended overseas`,"panel.links.appStore":`Release build, updates with the system`,"panel.links.testFlight":`Beta build, gets new versions before the store`,"panel.links.publicRelay":`Public relay 1`,"panel.links.wechatQrAlt":`WeChat group QR code: scan with WeChat or WeCom`,"panel.links.joinGroup":`Join the group`,"panel.theme.toDay":`Switch to light mode`,"panel.theme.toNight":`Switch to dark mode`,"panel.net.requestFailed":`Request failed (HTTP {status})`,"panel.net.requestFailedNoStatus":`Request failed`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.links.android":`Android`,"panel.links.apple":`Apple`,"panel.links.distPlatform":`アプリ配布プラットフォーム`,"panel.links.domesticRecommended":`中国国内向けの推奨`,"panel.links.overseasRecommended":`海外向けの推奨`,"panel.links.appStore":`正式版。システムと一緒に更新されます`,"panel.links.testFlight":`ベータ版。ストア版より早く新バージョンを取得できます`,"panel.links.publicRelay":`共用リレー 1`,"panel.links.wechatQrAlt":`WeChat グループの QR コード:WeChat または WeCom でスキャン`,"panel.links.joinGroup":`グループに参加`,"panel.theme.toDay":`ライトモードに切り替え`,"panel.theme.toNight":`ダークモードに切り替え`,"panel.net.requestFailed":`リクエストに失敗しました(HTTP {status})`,"panel.net.requestFailedNoStatus":`リクエストに失敗しました`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.links.android":`Android`,"panel.links.apple":`Apple`,"panel.links.distPlatform":`앱 배포 플랫폼`,"panel.links.domesticRecommended":`중국 내 다운로드 권장`,"panel.links.overseasRecommended":`해외 다운로드 권장`,"panel.links.appStore":`정식 버전, 시스템과 함께 자동 업데이트`,"panel.links.testFlight":`베타 버전, 스토어보다 먼저 새 버전 제공`,"panel.links.publicRelay":`공용 릴레이 1`,"panel.links.wechatQrAlt":`WeChat 그룹 QR 코드: WeChat 또는 WeCom으로 스캔`,"panel.links.joinGroup":`그룹 참여`,"panel.theme.toDay":`라이트 모드로 전환`,"panel.theme.toNight":`다크 모드로 전환`,"panel.net.requestFailed":`요청 실패 (HTTP {status})`,"panel.net.requestFailedNoStatus":`요청 실패`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.inbox.title":`收件文件`,"panel.inbox.reading":`正在读收件目录…`,"panel.inbox.unreadableTitle":`这一版读不到收件目录`,"panel.inbox.unreadableBody":`这台宿主上的插件还没有这两条接口,更新插件后重启 DSH 就能看到占用并清理。`,"panel.inbox.used":`占用`,"panel.inbox.usedValue":`{bytes} · {count} 个文件`,"panel.inbox.deletable":`可清理`,"panel.inbox.deletableValue":`{bytes} · {count} 个`,"panel.inbox.keep":`保留期`,"panel.inbox.keepValue":`{hours} 小时`,"panel.inbox.keepValueOldest":`{hours} 小时(最老那份已放 {age})`,"panel.inbox.hint":`手机传上来的文件落在固定的收件目录里,那里不认识对话,所以归档或删掉对话都带不走它们;只能按时间清。今天传的、还在用的不在清理范围内。`,"panel.inbox.staging":`其中 {bytes} 是上传中途断掉留下的残片({count} 个),一并清掉。`,"panel.inbox.auto":`自动清理`,"panel.inbox.autoA11y":`自动清理收件文件`,"panel.inbox.autoHint":`打开后,{hours} 小时以上的文件会在 DSH 启动时自动删掉;关着就只能手动清。`,"panel.inbox.clearing":`正在清理…`,"panel.inbox.clear":`清理收件文件`,"panel.inbox.confirmTitle":`清理收件文件?`,"panel.inbox.confirmDetail":`会删掉 {count} 个满 {hours} 小时的文件,释放 {bytes};不满这个时间的会留着。`,"panel.inbox.confirmNothing":`目前没有满 {hours} 小时的文件,点了什么都不会删。`,"panel.inbox.confirmIrreversible":`这个动作不可恢复。`,"panel.inbox.cleared":`收件文件已清理:释放了 {bytes}({count} 个文件)`,"panel.inbox.clearedSomeFailed":`,{count} 个没删掉`,"panel.inbox.nothingToClear":`没有满保留期的文件可清。`,"panel.inbox.clearFailed":`清理收件文件失败:{message}`,"panel.inbox.autoFailed":`自动清理开关没改成功:{message}`,"panel.inbox.ageLessThanHour":`不到 1 小时`,"panel.inbox.ageHours":`{hours} 小时`,"panel.inbox.ageDays":`{days} 天`,"panel.connection.state":`连接状态`,"panel.connection.relayNeedsSecret":`中转要求注册密钥`,"panel.connection.relayRejected":`这台设备不被中转接受`,"panel.pairing.qrHidden":`二维码已隐藏`,"panel.pairing.portFallback":`(首选端口被占用,已自动改用)`,"panel.pairing.sidecarRestartFailed":`上次重启 sidecar 失败`,"panel.onboarding.lanOff":`局域网直连已关闭`,"panel.connection.registerSecret":`注册密钥`,"panel.connection.lanPort":`局域网端口`},"zh-Hant":{"panel.inbox.title":`收件檔案`,"panel.inbox.reading":`正在讀取收件目錄…`,"panel.inbox.unreadableTitle":`這一版讀不到收件目錄`,"panel.inbox.unreadableBody":`這台宿主上的外掛還沒有這兩條介面,更新外掛後重新啟動 DSH 就能看到佔用並清理。`,"panel.inbox.used":`佔用`,"panel.inbox.usedValue":`{bytes} · {count} 個檔案`,"panel.inbox.deletable":`可清理`,"panel.inbox.deletableValue":`{bytes} · {count} 個`,"panel.inbox.keep":`保留期`,"panel.inbox.keepValue":`{hours} 小時`,"panel.inbox.keepValueOldest":`{hours} 小時(最舊那份已放 {age})`,"panel.inbox.hint":`手機上傳的檔案會落在固定的收件目錄裡,那裡不認得對話,所以封存或刪掉對話都帶不走它們;只能按時間清理。今天上傳的、還在用的不在清理範圍內。`,"panel.inbox.staging":`其中 {bytes} 是上傳中途斷掉留下的殘片({count} 個),一併清掉。`,"panel.inbox.auto":`自動清理`,"panel.inbox.autoA11y":`自動清理收件檔案`,"panel.inbox.autoHint":`開啟後,{hours} 小時以上的檔案會在 DSH 啟動時自動刪掉;關著就只能手動清。`,"panel.inbox.clearing":`正在清理…`,"panel.inbox.clear":`清理收件檔案`,"panel.inbox.confirmTitle":`清理收件檔案?`,"panel.inbox.confirmDetail":`會刪掉 {count} 個滿 {hours} 小時的檔案,釋放 {bytes};不滿這個時間的會留著。`,"panel.inbox.confirmNothing":`目前沒有滿 {hours} 小時的檔案,點了什麼都不會刪。`,"panel.inbox.confirmIrreversible":`這個動作不可恢復。`,"panel.inbox.cleared":`收件檔案已清理:釋放了 {bytes}({count} 個檔案)`,"panel.inbox.clearedSomeFailed":`,{count} 個沒刪掉`,"panel.inbox.nothingToClear":`沒有滿保留期的檔案可清。`,"panel.inbox.clearFailed":`清理收件檔案失敗:{message}`,"panel.inbox.autoFailed":`自動清理開關沒有改成功:{message}`,"panel.inbox.ageLessThanHour":`不到 1 小時`,"panel.inbox.ageHours":`{hours} 小時`,"panel.inbox.ageDays":`{days} 天`,"panel.connection.state":`連線狀態`,"panel.connection.relayNeedsSecret":`中轉要求註冊金鑰`,"panel.connection.relayRejected":`這台裝置不被中轉接受`,"panel.pairing.qrHidden":`QR 碼已隱藏`,"panel.pairing.portFallback":`(首選連接埠被佔用,已自動改用)`,"panel.pairing.sidecarRestartFailed":`上次重新啟動 sidecar 失敗`,"panel.onboarding.lanOff":`區域網路直連已關閉`,"panel.connection.registerSecret":`註冊金鑰`,"panel.connection.lanPort":`區域網路連接埠`},en:{"panel.inbox.title":`Received files`,"panel.inbox.reading":`Reading the inbox directory…`,"panel.inbox.unreadableTitle":`This build cannot read the inbox directory`,"panel.inbox.unreadableBody":`The plugin on this host does not have these two endpoints yet. Update the plugin and restart DSH to see usage and clean up.`,"panel.inbox.used":`Used`,"panel.inbox.usedValue":`{bytes} · {count} files`,"panel.inbox.deletable":`Cleanable`,"panel.inbox.deletableValue":`{bytes} · {count}`,"panel.inbox.keep":`Retention`,"panel.inbox.keepValue":`{hours} hours`,"panel.inbox.keepValueOldest":`{hours} hours (oldest kept for {age})`,"panel.inbox.hint":`Files sent from your phone land in a fixed inbox directory on the computer. That directory knows nothing about chats, so archiving or deleting a chat does not take them with it — they can only be cleaned by age. Files uploaded today and still in use are out of scope.`,"panel.inbox.staging":`{bytes} of that are fragments left by interrupted uploads ({count}), which are cleared too.`,"panel.inbox.auto":`Auto cleanup`,"panel.inbox.autoA11y":`Automatically clean received files`,"panel.inbox.autoHint":`When on, files older than {hours} hours are deleted when DSH starts; when off you can only clean manually.`,"panel.inbox.clearing":`Cleaning…`,"panel.inbox.clear":`Clean received files`,"panel.inbox.confirmTitle":`Clean received files?`,"panel.inbox.confirmDetail":`This deletes {count} file(s) older than {hours} hours and frees {bytes}; newer ones stay.`,"panel.inbox.confirmNothing":`No files are older than {hours} hours, so nothing will be deleted.`,"panel.inbox.confirmIrreversible":`This cannot be undone.`,"panel.inbox.cleared":`Received files cleaned: freed {bytes} ({count} files)`,"panel.inbox.clearedSomeFailed":`, {count} could not be deleted`,"panel.inbox.nothingToClear":`No files older than the retention window to clean.`,"panel.inbox.clearFailed":`Could not clean received files: {message}`,"panel.inbox.autoFailed":`Could not change the auto-cleanup switch: {message}`,"panel.inbox.ageLessThanHour":`less than 1 hour`,"panel.inbox.ageHours":`{hours} hours`,"panel.inbox.ageDays":`{days} days`,"panel.connection.state":`Connection status`,"panel.connection.relayNeedsSecret":`The relay requires a registration secret`,"panel.connection.relayRejected":`This device is rejected by the relay`,"panel.pairing.qrHidden":`QR code hidden`,"panel.pairing.portFallback":` (preferred port was taken; switched automatically)`,"panel.pairing.sidecarRestartFailed":`Last sidecar restart failed`,"panel.onboarding.lanOff":`LAN direct is off`,"panel.connection.registerSecret":`Registration secret`,"panel.connection.lanPort":`LAN port`},ja:{"panel.inbox.title":`受信ファイル`,"panel.inbox.reading":`受信ディレクトリを読み込み中…`,"panel.inbox.unreadableTitle":`この版では受信ディレクトリを読めません`,"panel.inbox.unreadableBody":`このホストのプラグインにはまだこの 2 つの API がありません。プラグインを更新して DSH を再起動すると、使用量の確認とクリーンアップができます。`,"panel.inbox.used":`使用量`,"panel.inbox.usedValue":`{bytes} · {count} ファイル`,"panel.inbox.deletable":`削除可能`,"panel.inbox.deletableValue":`{bytes} · {count} 個`,"panel.inbox.keep":`保存期間`,"panel.inbox.keepValue":`{hours} 時間`,"panel.inbox.keepValueOldest":`{hours} 時間(最も古いものは {age} 前)`,"panel.inbox.hint":`スマートフォンから送ったファイルはパソコン上の固定の受信ディレクトリに置かれます。そこは会話を認識しないため、会話をアーカイブ・削除してもファイルは消えません。時間でのみ整理できます。今日送ったものや使用中のものは対象外です。`,"panel.inbox.staging":`うち {bytes} はアップロード中断で残った断片({count} 個)で、これも一緒に削除されます。`,"panel.inbox.auto":`自動クリーンアップ`,"panel.inbox.autoA11y":`受信ファイルを自動でクリーンアップ`,"panel.inbox.autoHint":`オンにすると、{hours} 時間を超えたファイルは DSH 起動時に自動で削除されます。オフの場合は手動のみです。`,"panel.inbox.clearing":`クリーンアップ中…`,"panel.inbox.clear":`受信ファイルをクリーンアップ`,"panel.inbox.confirmTitle":`受信ファイルをクリーンアップしますか?`,"panel.inbox.confirmDetail":`{hours} 時間を超えた {count} 個のファイルを削除し、{bytes} を解放します。それより新しいものは残します。`,"panel.inbox.confirmNothing":`{hours} 時間を超えたファイルがないため、何も削除されません。`,"panel.inbox.confirmIrreversible":`この操作は元に戻せません。`,"panel.inbox.cleared":`受信ファイルを整理しました:{bytes} を解放({count} ファイル)`,"panel.inbox.clearedSomeFailed":`、{count} 個は削除できませんでした`,"panel.inbox.nothingToClear":`保存期間を超えたファイルはありません。`,"panel.inbox.clearFailed":`受信ファイルの整理に失敗しました:{message}`,"panel.inbox.autoFailed":`自動クリーンアップの切り替えに失敗しました:{message}`,"panel.inbox.ageLessThanHour":`1 時間未満`,"panel.inbox.ageHours":`{hours} 時間`,"panel.inbox.ageDays":`{days} 日`,"panel.connection.state":`接続状態`,"panel.connection.relayNeedsSecret":`リレーが登録シークレットを要求します`,"panel.connection.relayRejected":`このデバイスはリレーに拒否されています`,"panel.pairing.qrHidden":`QR コードは非表示です`,"panel.pairing.portFallback":`(優先ポートが使用中のため自動で切り替え)`,"panel.pairing.sidecarRestartFailed":`前回のサイドカー再起動に失敗しました`,"panel.onboarding.lanOff":`LAN 直結はオフです`,"panel.connection.registerSecret":`登録シークレット`,"panel.connection.lanPort":`LAN ポート`},ko:{"panel.inbox.title":`받은 파일`,"panel.inbox.reading":`수신 디렉터리를 읽는 중…`,"panel.inbox.unreadableTitle":`이 버전에서는 수신 디렉터리를 읽을 수 없습니다`,"panel.inbox.unreadableBody":`이 호스트의 플러그인에는 아직 이 두 API가 없습니다. 플러그인을 업데이트하고 DSH를 재시작하면 사용량 확인과 정리가 가능합니다.`,"panel.inbox.used":`사용량`,"panel.inbox.usedValue":`{bytes} · 파일 {count}개`,"panel.inbox.deletable":`정리 가능`,"panel.inbox.deletableValue":`{bytes} · {count}개`,"panel.inbox.keep":`보존 기간`,"panel.inbox.keepValue":`{hours}시간`,"panel.inbox.keepValueOldest":`{hours}시간(가장 오래된 것은 {age} 전)`,"panel.inbox.hint":`휴대폰에서 보낸 파일은 컴퓨터의 고정된 수신 디렉터리에 저장됩니다. 그 디렉터리는 대화를 알지 못하므로 대화를 보관하거나 삭제해도 파일은 사라지지 않습니다. 시간 기준으로만 정리할 수 있으며, 오늘 보낸 파일과 사용 중인 파일은 대상이 아닙니다.`,"panel.inbox.staging":`그중 {bytes}는 업로드가 중단되어 남은 조각({count}개)이며 함께 삭제됩니다.`,"panel.inbox.auto":`자동 정리`,"panel.inbox.autoA11y":`받은 파일 자동 정리`,"panel.inbox.autoHint":`켜면 {hours}시간이 지난 파일은 DSH 시작 시 자동으로 삭제됩니다. 끄면 수동으로만 정리할 수 있습니다.`,"panel.inbox.clearing":`정리 중…`,"panel.inbox.clear":`받은 파일 정리`,"panel.inbox.confirmTitle":`받은 파일을 정리할까요?`,"panel.inbox.confirmDetail":`{hours}시간이 지난 파일 {count}개를 삭제하고 {bytes}를 확보합니다. 그보다 최근 파일은 남습니다.`,"panel.inbox.confirmNothing":`{hours}시간이 지난 파일이 없어 아무것도 삭제되지 않습니다.`,"panel.inbox.confirmIrreversible":`이 작업은 되돌릴 수 없습니다.`,"panel.inbox.cleared":`받은 파일을 정리했습니다: {bytes} 확보(파일 {count}개)`,"panel.inbox.clearedSomeFailed":`, {count}개는 삭제하지 못했습니다`,"panel.inbox.nothingToClear":`보존 기간이 지난 파일이 없습니다.`,"panel.inbox.clearFailed":`받은 파일 정리에 실패했습니다: {message}`,"panel.inbox.autoFailed":`자동 정리 스위치를 변경하지 못했습니다: {message}`,"panel.inbox.ageLessThanHour":`1시간 미만`,"panel.inbox.ageHours":`{hours}시간`,"panel.inbox.ageDays":`{days}일`,"panel.connection.state":`연결 상태`,"panel.connection.relayNeedsSecret":`릴레이가 등록 시크릿을 요구합니다`,"panel.connection.relayRejected":`이 기기는 릴레이에서 거부되었습니다`,"panel.pairing.qrHidden":`QR 코드 숨김`,"panel.pairing.portFallback":` (선호 포트가 사용 중이어서 자동 전환됨)`,"panel.pairing.sidecarRestartFailed":`지난 사이드카 재시작 실패`,"panel.onboarding.lanOff":`LAN 직접 연결이 꺼져 있습니다`,"panel.connection.registerSecret":`등록 시크릿`,"panel.connection.lanPort":`LAN 포트`}},{"zh-Hans":{"panel.onboarding.title":`用移动设备连上这台 DSH`,"panel.onboarding.statusFailed":`读不到插件状态`,"panel.onboarding.stepFailed":`这一步没成功`,"panel.onboarding.qrAfterRelay":`填好下面的中转地址后`,"panel.onboarding.qrAfterRelayLine2":`这里才会生成二维码`,"panel.onboarding.qrAfterAddress":`这个地址连上之后,这里才会生成二维码`,"panel.onboarding.noQr":`没取到二维码`,"panel.onboarding.preview":`这是按你填的地址生成的预览,点「进入插件」才会把这个地址存进配置。`,"panel.onboarding.relayNotConnected":`中转还没连上,连上之后扫码才有用。`,"panel.onboarding.direct":`直连`,"panel.onboarding.thisAddress":`这个地址`,"panel.onboarding.lanFailed":`没能开始直连`,"panel.onboarding.relayFailed":`中转没连上`,"panel.onboarding.lanErrorWithPort":`{error}(端口可能被占用,到主页的「局域网直连」里换一个。)`,"panel.onboarding.lanNoStart":`直连没起来,端口可能被别的程序占了。`,"panel.onboarding.tunnelErrorHint":`{error}(检查中转地址填对没有、那台中转是不是在跑。)`,"panel.onboarding.tunnelNoStart":`隧道没建起来,检查中转地址。`,"panel.onboarding.pickAddress":`手机连哪条地址`,"panel.onboarding.relayAddressHint":`中转地址`,"panel.onboarding.recheckSaved":`这台机器正在用的中转地址 {url} 现在连不上,先确认那台中转在不在跑。`,"panel.onboarding.relayNoAnswer":`中转地址 {value} 上没有中转在应答。确认域名写对、那台 dsh-relay 在运行。`,"panel.onboarding.relayNoAnswerUnsaved":`中转地址 {value} 上没有中转在应答,配置没改。确认域名写对、那台 dsh-relay 在运行。`,"panel.onboarding.probe.empty":`还没填地址`,"panel.onboarding.probe.busy":`检测中`,"panel.onboarding.probe.ok":`连得通,还没存进配置`,"panel.onboarding.probe.failed":`连不上`,"panel.onboarding.probe.idle":`还没检测`,"panel.onboarding.probe.okWithHint":`这个地址连得通,二维码已按它生成(还没存进配置)。`,"panel.onboarding.checkFirewall":`连不上?检查防火墙`,"panel.onboarding.lanDirect":`局域网直连`,"panel.onboarding.chooseAddress":`选择地址`,"panel.onboarding.publicRelay":`公用中转`,"panel.onboarding.publicRelayTemporary":`建议临时使用`,"panel.onboarding.ownRelay":`自建中转`,"panel.onboarding.githubRepo":`GitHub 仓库`,"panel.onboarding.currentLan":`当前选择的局域网地址`,"panel.onboarding.public":`公网`,"panel.onboarding.ipv6More":`另有 {count} 条 IPv6 地址,手机按实测择优`,"panel.onboarding.collapse":`收起`,"panel.onboarding.expand":`展开`,"panel.onboarding.relayListTitle":`公用中转地址(按实测耗时排)`,"panel.onboarding.probing":`测速中…`,"panel.onboarding.autoBest":`自动优选`,"panel.onboarding.autoBestHint":`取最快的那条`,"panel.onboarding.probeUnreachable":`测不通`,"panel.onboarding.check":`检测`,"panel.onboarding.enterPlugin":`进入插件`,"panel.onboarding.connecting":`正在连接…`,"panel.onboarding.fixFirst":`先解决上面的问题`,"panel.onboarding.fillRelayFirst":`先填中转地址`,"panel.onboarding.opening":`正在打开…`,"panel.onboarding.openDirect":`打开直连`,"panel.onboarding.connectRelay":`连接中转`,"panel.onboarding.firewallTitle":`检查防火墙`,"panel.onboarding.firewallIntro":`手机连不上这台电脑的直连端口时,多半是电脑这边把端口挡了。直连默认端口`,"panel.onboarding.firewallIntroTail":`(首页「局域网直连」里可以改),下面按系统查。`,"panel.onboarding.copiedOk":`已复制,粘贴给你的 AI 就行。`,"panel.onboarding.copiedFailed":`复制失败,可以手动选中内容复制。`,"panel.onboarding.gotIt":`知道了`,"panel.onboarding.lanDialogTitle":`选择局域网地址`,"panel.onboarding.lanDialogHint":`手机先试选中的这条,其余继续排在后面兜底。`,"panel.onboarding.lanGroupA11y":`局域网地址`,"panel.onboarding.lan":`局域网`,"panel.onboarding.copyPromptHint":`点我复制内容,让自己的 AI 去检查`,"panel.onboarding.copyPrompt":`复制这段排查提示词`,"panel.onboarding.linuxStep1":`1. 看防火墙状态(firewalld 或 ufw,装哪个查哪个):`,"panel.onboarding.linuxStep2":`2. 放行直连端口:`,"panel.onboarding.linuxStep3":`3. 云服务器还要去服务商控制台的安全组里放行同一个端口 —— 这台机器上查不到。`,"panel.onboarding.macStep1":`1. 看应用防火墙是不是开着:`,"panel.onboarding.macStep2":`2. 开着的话,在「系统设置 → 网络 → 防火墙 → 选项」里把 DSH / node 设成「允许传入连接」;排查时可以整个关掉:`,"panel.onboarding.macStep3":`3. 同一 Wi-Fi 还连不上:确认手机和电脑真在同一个网段,别连到访客网络。`,"panel.onboarding.winStep1":`1. 在 PowerShell(管理员)里看防火墙配置文件:`,"panel.onboarding.winStep2":`2. 放行直连端口:`,"panel.onboarding.winStep3":`3. 如果以前给 node 配过拒绝规则,记得把那条 Block 删掉;网络类型选「专用」而不是「公用」。`,"panel.onboarding.prompt.intro":`帮我排查一个问题。`,"panel.onboarding.prompt.situation":`我的情况:电脑上装了 DSH(DeepSeek Harness)的移动端插件,手机 App 通过局域网直连连不上这台电脑。`,"panel.onboarding.prompt.address":`手机上填的地址是这台电脑的局域网地址加端口(具体的地址和端口你需要到移动端插件的那个网页里看,注意是局域网地址)。`,"panel.onboarding.prompt.guess":`电脑这边显示插件已经在监听,但手机连不上。我判断是电脑的防火墙(或者云服务器的安全组)把这个端口挡了。`,"panel.onboarding.prompt.ask":`请你:`,"panel.onboarding.prompt.ask1":`1. 先确认我的系统是 Linux、macOS 还是 Windows(不确定就问我,或者告诉我怎么确认)。`,"panel.onboarding.prompt.ask2":`2. 按属于我这一套的步骤逐条检查,告诉我那个端口现在通不通、卡在哪一步。`,"panel.onboarding.prompt.ask3":`3. 给出具体该执行的命令或点击路径,把端口放行;需要管理员权限的地方明确说明。`,"panel.onboarding.prompt.ask4":`4. 最后告诉我怎么验证已经通了(比如用哪条命令从本机、从手机分别确认)。`,"panel.onboarding.prompt.extra":`补充:如果这台电脑是云服务器,服务商控制台里的安全组/防火墙也要放行同一个端口,这一项在本机查不到。`,"panel.onboarding.relayPlaceholder":`https://你的中转域名`},"zh-Hant":{"panel.onboarding.title":`用行動裝置連上這台 DSH`,"panel.onboarding.statusFailed":`讀不到外掛狀態`,"panel.onboarding.stepFailed":`這一步沒有成功`,"panel.onboarding.qrAfterRelay":`填好下面的中轉位址後`,"panel.onboarding.qrAfterRelayLine2":`這裡才會產生 QR 碼`,"panel.onboarding.qrAfterAddress":`這個位址連上之後,這裡才會產生 QR 碼`,"panel.onboarding.noQr":`沒取得 QR 碼`,"panel.onboarding.preview":`這是依你填的位址產生的預覽,點「進入外掛」才會把這個位址存進設定。`,"panel.onboarding.relayNotConnected":`中轉還沒連上,連上之後掃碼才有用。`,"panel.onboarding.direct":`直連`,"panel.onboarding.thisAddress":`這個位址`,"panel.onboarding.lanFailed":`沒能開始直連`,"panel.onboarding.relayFailed":`中轉沒連上`,"panel.onboarding.lanErrorWithPort":`{error}(連接埠可能被佔用,到主頁的「區域網路直連」裡換一個。)`,"panel.onboarding.lanNoStart":`直連沒起來,連接埠可能被別的程式佔用。`,"panel.onboarding.tunnelErrorHint":`{error}(檢查中轉位址填對沒有、那台中轉是不是在跑。)`,"panel.onboarding.tunnelNoStart":`通道沒建起來,檢查中轉位址。`,"panel.onboarding.pickAddress":`手機連哪條位址`,"panel.onboarding.relayAddressHint":`中轉位址`,"panel.onboarding.recheckSaved":`這台機器正在用的中轉位址 {url} 現在連不上,先確認那台中轉在不在跑。`,"panel.onboarding.relayNoAnswer":`中轉位址 {value} 上沒有中轉在應答。確認網域名稱寫對、那台 dsh-relay 在執行。`,"panel.onboarding.relayNoAnswerUnsaved":`中轉位址 {value} 上沒有中轉在應答,設定沒改。確認網域名稱寫對、那台 dsh-relay 在執行。`,"panel.onboarding.probe.empty":`還沒填位址`,"panel.onboarding.probe.busy":`檢查中`,"panel.onboarding.probe.ok":`連得通,還沒存進設定`,"panel.onboarding.probe.failed":`連不上`,"panel.onboarding.probe.idle":`還沒檢查`,"panel.onboarding.probe.okWithHint":`這個位址連得通,QR 碼已依它產生(還沒存進設定)。`,"panel.onboarding.checkFirewall":`連不上?檢查防火牆`,"panel.onboarding.lanDirect":`區域網路直連`,"panel.onboarding.chooseAddress":`選擇位址`,"panel.onboarding.publicRelay":`公用中轉`,"panel.onboarding.publicRelayTemporary":`建議臨時使用`,"panel.onboarding.ownRelay":`自建中轉`,"panel.onboarding.githubRepo":`GitHub 儲存庫`,"panel.onboarding.currentLan":`目前選擇的區域網路位址`,"panel.onboarding.public":`公網`,"panel.onboarding.ipv6More":`另有 {count} 條 IPv6 位址,手機依實測擇優`,"panel.onboarding.collapse":`收合`,"panel.onboarding.expand":`展開`,"panel.onboarding.relayListTitle":`公用中轉位址(依實測耗時排)`,"panel.onboarding.probing":`測速中…`,"panel.onboarding.autoBest":`自動優選`,"panel.onboarding.autoBestHint":`取最快的那條`,"panel.onboarding.probeUnreachable":`測不通`,"panel.onboarding.check":`檢查`,"panel.onboarding.enterPlugin":`進入外掛`,"panel.onboarding.connecting":`正在連線…`,"panel.onboarding.fixFirst":`先解決上面的問題`,"panel.onboarding.fillRelayFirst":`先填中轉位址`,"panel.onboarding.opening":`正在開啟…`,"panel.onboarding.openDirect":`開啟直連`,"panel.onboarding.connectRelay":`連線中轉`,"panel.onboarding.firewallTitle":`檢查防火牆`,"panel.onboarding.firewallIntro":`手機連不上這台電腦的直連連接埠時,多半是電腦這邊把連接埠擋了。直連預設連接埠`,"panel.onboarding.firewallIntroTail":`(首頁「區域網路直連」裡可以改),下面依系統查。`,"panel.onboarding.copiedOk":`已複製,貼給你的 AI 就行。`,"panel.onboarding.copiedFailed":`複製失敗,可以手動選取內容複製。`,"panel.onboarding.gotIt":`知道了`,"panel.onboarding.lanDialogTitle":`選擇區域網路位址`,"panel.onboarding.lanDialogHint":`手機先試選中的這條,其餘繼續排在後面兜底。`,"panel.onboarding.lanGroupA11y":`區域網路位址`,"panel.onboarding.lan":`區域網路`,"panel.onboarding.copyPromptHint":`點我複製內容,讓自己的 AI 去檢查`,"panel.onboarding.copyPrompt":`複製這段排查提示詞`,"panel.onboarding.linuxStep1":`1. 看防火牆狀態(firewalld 或 ufw,裝哪個查哪個):`,"panel.onboarding.linuxStep2":`2. 放行直連連接埠:`,"panel.onboarding.linuxStep3":`3. 雲端伺服器還要去服務商主控台的安全群組裡放行同一個連接埠 —— 這台機器上查不到。`,"panel.onboarding.macStep1":`1. 看應用程式防火牆是不是開著:`,"panel.onboarding.macStep2":`2. 開著的話,在「系統設定 → 網路 → 防火牆 → 選項」裡把 DSH / node 設成「允許傳入連線」;排查時可以整個關掉:`,"panel.onboarding.macStep3":`3. 同一 Wi-Fi 還連不上:確認手機和電腦真在同一個網段,別連到訪客網路。`,"panel.onboarding.winStep1":`1. 在 PowerShell(系統管理員)裡看防火牆設定檔:`,"panel.onboarding.winStep2":`2. 放行直連連接埠:`,"panel.onboarding.winStep3":`3. 如果以前給 node 設過拒絕規則,記得把那條 Block 刪掉;網路類型選「專用」而不是「公用」。`,"panel.onboarding.prompt.intro":`幫我排查一個問題。`,"panel.onboarding.prompt.situation":`我的情況:電腦上裝了 DSH(DeepSeek Harness)的行動端外掛,手機 App 透過區域網路直連連不上這台電腦。`,"panel.onboarding.prompt.address":`手機上填的位址是這台電腦的區域網路位址加連接埠(具體的位址和連接埠你需要到行動端外掛的那個網頁裡看,注意是區域網路位址)。`,"panel.onboarding.prompt.guess":`電腦這邊顯示外掛已經在監聽,但手機連不上。我判斷是電腦的防火牆(或者雲端伺服器的安全群組)把這個連接埠擋了。`,"panel.onboarding.prompt.ask":`請你:`,"panel.onboarding.prompt.ask1":`1. 先確認我的系統是 Linux、macOS 還是 Windows(不確定就問我,或者告訴我怎麼確認)。`,"panel.onboarding.prompt.ask2":`2. 依屬於我這一套的步驟逐條檢查,告訴我那個連接埠現在通不通、卡在哪一步。`,"panel.onboarding.prompt.ask3":`3. 給出具體該執行的命令或點擊路徑,把連接埠放行;需要系統管理員權限的地方明確說明。`,"panel.onboarding.prompt.ask4":`4. 最後告訴我怎麼驗證已經通了(比如用哪條命令從本機、從手機分別確認)。`,"panel.onboarding.prompt.extra":`補充:如果這台電腦是雲端伺服器,服務商主控台裡的安全群組/防火牆也要放行同一個連接埠,這一項在本機查不到。`,"panel.onboarding.relayPlaceholder":`https://你的中轉網域`},en:{"panel.onboarding.title":`Connect your phone to this DSH`,"panel.onboarding.statusFailed":`Could not read plugin status`,"panel.onboarding.stepFailed":`That step did not succeed`,"panel.onboarding.qrAfterRelay":`Once you fill in the relay address below`,"panel.onboarding.qrAfterRelayLine2":`the QR code appears here`,"panel.onboarding.qrAfterAddress":`Once this address connects, the QR code appears here`,"panel.onboarding.noQr":`No QR code yet`,"panel.onboarding.preview":`This preview uses the address you typed. Tapping “Enter plugin” saves it to the configuration.`,"panel.onboarding.relayNotConnected":`The relay is not connected yet; scanning only works once it is.`,"panel.onboarding.direct":`Direct`,"panel.onboarding.thisAddress":`This address`,"panel.onboarding.lanFailed":`Could not start direct connection`,"panel.onboarding.relayFailed":`Relay not connected`,"panel.onboarding.lanErrorWithPort":`{error} (the port may be taken — pick another under “LAN direct” on the main page.)`,"panel.onboarding.lanNoStart":`The direct listener did not start; another program may be holding the port.`,"panel.onboarding.tunnelErrorHint":`{error} (check that the relay address is correct and that the relay is running.)`,"panel.onboarding.tunnelNoStart":`The tunnel did not come up; check the relay address.`,"panel.onboarding.pickAddress":`Which address your phone uses`,"panel.onboarding.relayAddressHint":`Relay address`,"panel.onboarding.recheckSaved":`The relay this machine uses, {url}, is unreachable right now. Check that the relay is running.`,"panel.onboarding.relayNoAnswer":`Nothing is answering at {value}. Check the domain and that dsh-relay is running.`,"panel.onboarding.relayNoAnswerUnsaved":`Nothing is answering at {value}; the configuration was not changed. Check the domain and that dsh-relay is running.`,"panel.onboarding.probe.empty":`No address yet`,"panel.onboarding.probe.busy":`Testing`,"panel.onboarding.probe.ok":`Reachable, not saved yet`,"panel.onboarding.probe.failed":`Unreachable`,"panel.onboarding.probe.idle":`Not tested yet`,"panel.onboarding.probe.okWithHint":`This address is reachable and the QR code was generated from it (not saved to the configuration yet).`,"panel.onboarding.checkFirewall":`Cannot connect? Check the firewall`,"panel.onboarding.lanDirect":`LAN direct`,"panel.onboarding.chooseAddress":`Choose address`,"panel.onboarding.publicRelay":`Public relay`,"panel.onboarding.publicRelayTemporary":`For temporary use`,"panel.onboarding.ownRelay":`Self-hosted relay`,"panel.onboarding.githubRepo":`GitHub repository`,"panel.onboarding.currentLan":`Currently selected LAN address`,"panel.onboarding.public":`Public`,"panel.onboarding.ipv6More":`{count} more IPv6 addresses; your phone picks the fastest`,"panel.onboarding.collapse":`Collapse`,"panel.onboarding.expand":`Expand`,"panel.onboarding.relayListTitle":`Public relay addresses (by measured latency)`,"panel.onboarding.probing":`Measuring…`,"panel.onboarding.autoBest":`Auto (fastest)`,"panel.onboarding.autoBestHint":`Use the fastest one`,"panel.onboarding.probeUnreachable":`Unreachable`,"panel.onboarding.check":`Test`,"panel.onboarding.enterPlugin":`Enter plugin`,"panel.onboarding.connecting":`Connecting…`,"panel.onboarding.fixFirst":`Fix the problems above first`,"panel.onboarding.fillRelayFirst":`Enter the relay address first`,"panel.onboarding.opening":`Opening…`,"panel.onboarding.openDirect":`Open direct connection`,"panel.onboarding.connectRelay":`Connect relay`,"panel.onboarding.firewallTitle":`Check the firewall`,"panel.onboarding.firewallIntro":`When your phone cannot reach this computer’s direct port, the port is usually blocked on the computer. The default direct port is`,"panel.onboarding.firewallIntroTail":` (you can change it under “LAN direct” on the main page). Check it per system below.`,"panel.onboarding.copiedOk":`Copied — paste it into your AI.`,"panel.onboarding.copiedFailed":`Copy failed; select the text and copy it manually.`,"panel.onboarding.gotIt":`Got it`,"panel.onboarding.lanDialogTitle":`Choose a LAN address`,"panel.onboarding.lanDialogHint":`Your phone tries the selected one first and falls back to the rest.`,"panel.onboarding.lanGroupA11y":`LAN addresses`,"panel.onboarding.lan":`LAN`,"panel.onboarding.copyPromptHint":`Tap to copy — let your own AI check it`,"panel.onboarding.copyPrompt":`Copy this troubleshooting prompt`,"panel.onboarding.linuxStep1":`1. Check the firewall status (firewalld or ufw — whichever is installed):`,"panel.onboarding.linuxStep2":`2. Allow the direct port:`,"panel.onboarding.linuxStep3":`3. On a cloud server also allow the same port in your provider’s console security group — it cannot be checked from this machine.`,"panel.onboarding.macStep1":`1. Check whether the application firewall is on:`,"panel.onboarding.macStep2":`2. If it is on, set DSH / node to “Allow incoming connections” under System Settings → Network → Firewall → Options; for troubleshooting you can turn it off entirely:`,"panel.onboarding.macStep3":`3. Still failing on the same Wi-Fi: make sure the phone and computer are really on the same subnet, not a guest network.`,"panel.onboarding.winStep1":`1. In PowerShell (administrator) list the firewall profiles:`,"panel.onboarding.winStep2":`2. Allow the direct port:`,"panel.onboarding.winStep3":`3. If you previously created a block rule for node, delete it; set the network type to Private rather than Public.`,"panel.onboarding.prompt.intro":`Help me troubleshoot a problem.`,"panel.onboarding.prompt.situation":`My situation: I have the DSH (DeepSeek Harness) mobile plugin installed on my computer, and the phone app cannot reach this computer over a direct LAN connection.`,"panel.onboarding.prompt.address":`The address entered on the phone is this computer’s LAN address plus port (you will need to read the exact address and port from the mobile plugin’s web page — note it must be the LAN address).`,"panel.onboarding.prompt.guess":`The computer side shows the plugin is listening, but the phone cannot connect. I believe the computer’s firewall (or a cloud security group) is blocking that port.`,"panel.onboarding.prompt.ask":`Please:`,"panel.onboarding.prompt.ask1":`1. First confirm whether my system is Linux, macOS or Windows (ask me if you are unsure, or tell me how to check).`,"panel.onboarding.prompt.ask2":`2. Walk me through the steps for my setup one by one and tell me whether that port is currently open and where it gets stuck.`,"panel.onboarding.prompt.ask3":`3. Give me the exact commands or click paths to allow the port, and say clearly where administrator rights are needed.`,"panel.onboarding.prompt.ask4":`4. Finally tell me how to verify it works (for example which command to run on the computer and on the phone).`,"panel.onboarding.prompt.extra":`Note: if this computer is a cloud server, the security group or firewall in the provider’s console must allow the same port too, and that cannot be checked locally.`,"panel.onboarding.relayPlaceholder":`https://your-relay.example`},ja:{"panel.onboarding.title":`この DSH にスマートフォンをつなぐ`,"panel.onboarding.statusFailed":`プラグインの状態を取得できません`,"panel.onboarding.stepFailed":`この手順は完了しませんでした`,"panel.onboarding.qrAfterRelay":`下のリレーのアドレスを入力すると`,"panel.onboarding.qrAfterRelayLine2":`ここに QR コードが表示されます`,"panel.onboarding.qrAfterAddress":`このアドレスに接続できると、ここに QR コードが表示されます`,"panel.onboarding.noQr":`QR コードを取得できません`,"panel.onboarding.preview":`入力したアドレスによるプレビューです。「プラグインに入る」を押すとこのアドレスが設定に保存されます。`,"panel.onboarding.relayNotConnected":`リレーにまだ接続していません。接続後にスキャンが有効になります。`,"panel.onboarding.direct":`直結`,"panel.onboarding.thisAddress":`このアドレス`,"panel.onboarding.lanFailed":`直結を開始できませんでした`,"panel.onboarding.relayFailed":`リレーに接続できません`,"panel.onboarding.lanErrorWithPort":`{error}(ポートが使用中の可能性があります。メイン画面の「LAN 直結」で別のポートに変更してください。)`,"panel.onboarding.lanNoStart":`直結が起動しませんでした。別のアプリがポートを使用している可能性があります。`,"panel.onboarding.tunnelErrorHint":`{error}(リレーのアドレスが正しいか、リレーが動いているかを確認してください。)`,"panel.onboarding.tunnelNoStart":`トンネルが確立しませんでした。リレーのアドレスを確認してください。`,"panel.onboarding.pickAddress":`スマートフォンが使うアドレス`,"panel.onboarding.relayAddressHint":`リレーのアドレス`,"panel.onboarding.recheckSaved":`このマシンが使っているリレー {url} に現在つながりません。リレーが動いているか確認してください。`,"panel.onboarding.relayNoAnswer":`リレーのアドレス {value} に応答がありません。ドメイン名と dsh-relay の稼働を確認してください。`,"panel.onboarding.relayNoAnswerUnsaved":`リレーのアドレス {value} に応答がないため、設定は変更していません。ドメイン名と dsh-relay の稼働を確認してください。`,"panel.onboarding.probe.empty":`アドレス未入力`,"panel.onboarding.probe.busy":`確認中`,"panel.onboarding.probe.ok":`接続できます(未保存)`,"panel.onboarding.probe.failed":`接続できません`,"panel.onboarding.probe.idle":`未確認`,"panel.onboarding.probe.okWithHint":`このアドレスに接続できます。QR コードはこのアドレスで生成済みです(設定には未保存)。`,"panel.onboarding.checkFirewall":`つながらない場合はファイアウォールを確認`,"panel.onboarding.lanDirect":`LAN 直結`,"panel.onboarding.chooseAddress":`アドレスを選択`,"panel.onboarding.publicRelay":`共用リレー`,"panel.onboarding.publicRelayTemporary":`一時利用に推奨`,"panel.onboarding.ownRelay":`自前のリレー`,"panel.onboarding.githubRepo":`GitHub リポジトリ`,"panel.onboarding.currentLan":`現在選択中の LAN アドレス`,"panel.onboarding.public":`パブリック`,"panel.onboarding.ipv6More":`ほかに IPv6 アドレスが {count} 件。スマートフォンが実測で選択します`,"panel.onboarding.collapse":`たたむ`,"panel.onboarding.expand":`展開`,"panel.onboarding.relayListTitle":`共用リレーのアドレス(実測の所要時間順)`,"panel.onboarding.probing":`測定中…`,"panel.onboarding.autoBest":`自動(最速)`,"panel.onboarding.autoBestHint":`最も速いものを使用`,"panel.onboarding.probeUnreachable":`到達できません`,"panel.onboarding.check":`確認`,"panel.onboarding.enterPlugin":`プラグインに入る`,"panel.onboarding.connecting":`接続中…`,"panel.onboarding.fixFirst":`まず上の問題を解決してください`,"panel.onboarding.fillRelayFirst":`先にリレーのアドレスを入力`,"panel.onboarding.opening":`開いています…`,"panel.onboarding.openDirect":`直結を開く`,"panel.onboarding.connectRelay":`リレーに接続`,"panel.onboarding.firewallTitle":`ファイアウォールを確認`,"panel.onboarding.firewallIntro":`スマートフォンからこのパソコンの直結ポートにつながらない場合、多くはパソコン側でポートが塞がれています。直結の既定ポートは`,"panel.onboarding.firewallIntroTail":`(メイン画面の「LAN 直結」で変更できます)。以下をシステム別に確認してください。`,"panel.onboarding.copiedOk":`コピーしました。AI に貼り付けてください。`,"panel.onboarding.copiedFailed":`コピーに失敗しました。テキストを選択して手動でコピーしてください。`,"panel.onboarding.gotIt":`了解`,"panel.onboarding.lanDialogTitle":`LAN アドレスを選択`,"panel.onboarding.lanDialogHint":`スマートフォンは選択したものを先に試し、残りは後続の候補になります。`,"panel.onboarding.lanGroupA11y":`LAN アドレス`,"panel.onboarding.lan":`LAN`,"panel.onboarding.copyPromptHint":`クリックでコピー。自分の AI に確認させられます`,"panel.onboarding.copyPrompt":`このトラブルシュート用プロンプトをコピー`,"panel.onboarding.linuxStep1":`1. ファイアウォールの状態を確認(firewalld か ufw、入っている方):`,"panel.onboarding.linuxStep2":`2. 直結ポートを許可:`,"panel.onboarding.linuxStep3":`3. クラウドサーバーの場合は、事業者コンソールのセキュリティグループでも同じポートを許可してください(このマシンからは確認できません)。`,"panel.onboarding.macStep1":`1. アプリケーションファイアウォールが有効か確認:`,"panel.onboarding.macStep2":`2. 有効な場合は「システム設定 → ネットワーク → ファイアウォール → オプション」で DSH / node を「着信接続を許可」に設定。切り分け時は丸ごと切ることもできます:`,"panel.onboarding.macStep3":`3. 同じ Wi-Fi でもつながらない場合: スマートフォンとパソコンが同じサブネットにあるか(ゲストネットワークでないか)を確認してください。`,"panel.onboarding.winStep1":`1. PowerShell(管理者)でファイアウォールプロファイルを確認:`,"panel.onboarding.winStep2":`2. 直結ポートを許可:`,"panel.onboarding.winStep3":`3. 以前 node に拒否規則を作った場合はそれを削除し、ネットワークの種類を「パブリック」ではなく「プライベート」にしてください。`,"panel.onboarding.prompt.intro":`問題の切り分けを手伝ってください。`,"panel.onboarding.prompt.situation":`状況: パソコンに DSH(DeepSeek Harness)のモバイルプラグインを入れており、スマートフォンのアプリから LAN 直結でこのパソコンにつながりません。`,"panel.onboarding.prompt.address":`スマートフォンに入力したアドレスは、このパソコンの LAN アドレスとポートです(正確なアドレスとポートはモバイルプラグインの Web ページで確認してください。LAN アドレスである点に注意)。`,"panel.onboarding.prompt.guess":`パソコン側ではプラグインが待ち受けていると表示されていますが、スマートフォンからはつながりません。パソコンのファイアウォール(またはクラウドのセキュリティグループ)がこのポートを塞いでいると思います。`,"panel.onboarding.prompt.ask":`お願いします:`,"panel.onboarding.prompt.ask1":`1. まず私の環境が Linux / macOS / Windows のどれかを確認してください(不明なら私に聞くか、確認方法を教えてください)。`,"panel.onboarding.prompt.ask2":`2. 私の環境に合った手順を 1 つずつ確認し、そのポートが今通るのか、どこで止まっているのかを教えてください。`,"panel.onboarding.prompt.ask3":`3. ポートを許可するための具体的なコマンドやクリック手順を示してください。管理者権限が必要な箇所は明記してください。`,"panel.onboarding.prompt.ask4":`4. 最後に、通ったことを確認する方法(パソコン側とスマートフォン側それぞれで実行するコマンドなど)を教えてください。`,"panel.onboarding.prompt.extra":`補足: このパソコンがクラウドサーバーの場合、事業者コンソールのセキュリティグループ/ファイアウォールでも同じポートを許可する必要があり、それはローカルでは確認できません。`,"panel.onboarding.relayPlaceholder":`https://リレーのドメイン`},ko:{"panel.onboarding.title":`이 DSH에 휴대폰 연결하기`,"panel.onboarding.statusFailed":`플러그인 상태를 읽을 수 없습니다`,"panel.onboarding.stepFailed":`이 단계가 완료되지 않았습니다`,"panel.onboarding.qrAfterRelay":`아래에 릴레이 주소를 입력하면`,"panel.onboarding.qrAfterRelayLine2":`여기에 QR 코드가 생성됩니다`,"panel.onboarding.qrAfterAddress":`이 주소에 연결되면 여기에 QR 코드가 생성됩니다`,"panel.onboarding.noQr":`QR 코드를 가져오지 못했습니다`,"panel.onboarding.preview":`입력한 주소로 만든 미리보기입니다. 「플러그인 들어가기」를 눌러야 이 주소가 설정에 저장됩니다.`,"panel.onboarding.relayNotConnected":`릴레이에 아직 연결되지 않았습니다. 연결된 뒤에야 스캔이 동작합니다.`,"panel.onboarding.direct":`직접 연결`,"panel.onboarding.thisAddress":`이 주소`,"panel.onboarding.lanFailed":`직접 연결을 시작하지 못했습니다`,"panel.onboarding.relayFailed":`릴레이에 연결되지 않았습니다`,"panel.onboarding.lanErrorWithPort":`{error} (포트가 사용 중일 수 있습니다. 메인 화면의 「LAN 직접 연결」에서 다른 포트로 바꾸세요.)`,"panel.onboarding.lanNoStart":`직접 연결이 시작되지 않았습니다. 다른 프로그램이 포트를 쓰고 있을 수 있습니다.`,"panel.onboarding.tunnelErrorHint":`{error} (릴레이 주소가 맞는지, 릴레이가 실행 중인지 확인하세요.)`,"panel.onboarding.tunnelNoStart":`터널이 만들어지지 않았습니다. 릴레이 주소를 확인하세요.`,"panel.onboarding.pickAddress":`휴대폰이 사용할 주소`,"panel.onboarding.relayAddressHint":`릴레이 주소`,"panel.onboarding.recheckSaved":`이 컴퓨터가 쓰는 릴레이 {url}에 지금 연결할 수 없습니다. 릴레이가 실행 중인지 확인하세요.`,"panel.onboarding.relayNoAnswer":`릴레이 주소 {value}에서 응답이 없습니다. 도메인과 dsh-relay 실행 여부를 확인하세요.`,"panel.onboarding.relayNoAnswerUnsaved":`릴레이 주소 {value}에서 응답이 없어 설정을 변경하지 않았습니다. 도메인과 dsh-relay 실행 여부를 확인하세요.`,"panel.onboarding.probe.empty":`주소를 아직 입력하지 않았습니다`,"panel.onboarding.probe.busy":`확인 중`,"panel.onboarding.probe.ok":`연결됩니다 (저장 전)`,"panel.onboarding.probe.failed":`연결되지 않습니다`,"panel.onboarding.probe.idle":`아직 확인하지 않았습니다`,"panel.onboarding.probe.okWithHint":`이 주소로 연결됩니다. QR 코드가 이 주소로 생성되었습니다(설정에는 아직 저장되지 않음).`,"panel.onboarding.checkFirewall":`연결되지 않나요? 방화벽을 확인하세요`,"panel.onboarding.lanDirect":`LAN 직접 연결`,"panel.onboarding.chooseAddress":`주소 선택`,"panel.onboarding.publicRelay":`공용 릴레이`,"panel.onboarding.publicRelayTemporary":`임시 사용 권장`,"panel.onboarding.ownRelay":`자가 호스팅 릴레이`,"panel.onboarding.githubRepo":`GitHub 저장소`,"panel.onboarding.currentLan":`현재 선택된 LAN 주소`,"panel.onboarding.public":`공인`,"panel.onboarding.ipv6More":`IPv6 주소가 {count}개 더 있습니다. 휴대폰이 실측으로 선택합니다`,"panel.onboarding.collapse":`접기`,"panel.onboarding.expand":`펼치기`,"panel.onboarding.relayListTitle":`공용 릴레이 주소(실측 지연 순)`,"panel.onboarding.probing":`측정 중…`,"panel.onboarding.autoBest":`자동(가장 빠른 것)`,"panel.onboarding.autoBestHint":`가장 빠른 것을 사용`,"panel.onboarding.probeUnreachable":`연결되지 않음`,"panel.onboarding.check":`확인`,"panel.onboarding.enterPlugin":`플러그인 들어가기`,"panel.onboarding.connecting":`연결 중…`,"panel.onboarding.fixFirst":`위 문제를 먼저 해결하세요`,"panel.onboarding.fillRelayFirst":`릴레이 주소를 먼저 입력하세요`,"panel.onboarding.opening":`여는 중…`,"panel.onboarding.openDirect":`직접 연결 열기`,"panel.onboarding.connectRelay":`릴레이 연결`,"panel.onboarding.firewallTitle":`방화벽 확인`,"panel.onboarding.firewallIntro":`휴대폰에서 이 컴퓨터의 직접 연결 포트로 접속되지 않을 때는 대개 컴퓨터 쪽에서 포트가 막혀 있습니다. 기본 직접 연결 포트는`,"panel.onboarding.firewallIntroTail":` (메인 화면의 「LAN 직접 연결」에서 바꿀 수 있습니다). 아래에서 시스템별로 확인하세요.`,"panel.onboarding.copiedOk":`복사했습니다. AI에 붙여 넣으세요.`,"panel.onboarding.copiedFailed":`복사하지 못했습니다. 텍스트를 선택해 직접 복사하세요.`,"panel.onboarding.gotIt":`확인`,"panel.onboarding.lanDialogTitle":`LAN 주소 선택`,"panel.onboarding.lanDialogHint":`휴대폰은 선택한 주소를 먼저 시도하고 나머지는 뒤에서 대비합니다.`,"panel.onboarding.lanGroupA11y":`LAN 주소`,"panel.onboarding.lan":`LAN`,"panel.onboarding.copyPromptHint":`클릭하여 복사하고 자기 AI에게 확인시키세요`,"panel.onboarding.copyPrompt":`이 문제 진단 프롬프트 복사`,"panel.onboarding.linuxStep1":`1. 방화벽 상태 확인(firewalld 또는 ufw, 설치된 것):`,"panel.onboarding.linuxStep2":`2. 직접 연결 포트 허용:`,"panel.onboarding.linuxStep3":`3. 클라우드 서버라면 사업자 콘솔의 보안 그룹에서도 같은 포트를 허용해야 합니다 — 이 컴퓨터에서는 확인할 수 없습니다.`,"panel.onboarding.macStep1":`1. 애플리케이션 방화벽이 켜져 있는지 확인:`,"panel.onboarding.macStep2":`2. 켜져 있다면 시스템 설정 → 네트워크 → 방화벽 → 옵션에서 DSH / node를 「수신 연결 허용」으로 설정하세요. 진단 중에는 아예 꺼도 됩니다:`,"panel.onboarding.macStep3":`3. 같은 Wi-Fi에서도 안 되면 휴대폰과 컴퓨터가 실제로 같은 서브넷인지(게스트 네트워크가 아닌지) 확인하세요.`,"panel.onboarding.winStep1":`1. PowerShell(관리자)에서 방화벽 프로필 확인:`,"panel.onboarding.winStep2":`2. 직접 연결 포트 허용:`,"panel.onboarding.winStep3":`3. 예전에 node에 차단 규칙을 만들었다면 그 Block 규칙을 삭제하고, 네트워크 종류를 「공용」이 아닌 「전용」으로 설정하세요.`,"panel.onboarding.prompt.intro":`문제 하나를 진단해 주세요.`,"panel.onboarding.prompt.situation":`상황: 컴퓨터에 DSH(DeepSeek Harness) 모바일 플러그인이 설치되어 있고, 휴대폰 앱에서 LAN 직접 연결로 이 컴퓨터에 접속되지 않습니다.`,"panel.onboarding.prompt.address":`휴대폰에 입력한 주소는 이 컴퓨터의 LAN 주소와 포트입니다(정확한 주소와 포트는 모바일 플러그인의 웹 페이지에서 확인해야 하며, LAN 주소여야 합니다).`,"panel.onboarding.prompt.guess":`컴퓨터 쪽에서는 플러그인이 수신 대기 중이라고 표시되지만 휴대폰에서는 접속되지 않습니다. 컴퓨터 방화벽(또는 클라우드 보안 그룹)이 그 포트를 막고 있다고 생각합니다.`,"panel.onboarding.prompt.ask":`요청 사항:`,"panel.onboarding.prompt.ask1":`1. 먼저 제 시스템이 Linux / macOS / Windows 중 무엇인지 확인해 주세요(모르면 저에게 물어보거나 확인 방법을 알려주세요).`,"panel.onboarding.prompt.ask2":`2. 제 환경에 맞는 절차를 하나씩 확인하고, 그 포트가 지금 열려 있는지 어디서 막히는지 알려주세요.`,"panel.onboarding.prompt.ask3":`3. 포트를 허용할 구체적인 명령이나 클릭 경로를 제시하고, 관리자 권한이 필요한 곳은 분명히 알려주세요.`,"panel.onboarding.prompt.ask4":`4. 마지막으로 잘 되는지 확인하는 방법(컴퓨터와 휴대폰에서 각각 실행할 명령 등)을 알려주세요.`,"panel.onboarding.prompt.extra":`참고: 이 컴퓨터가 클라우드 서버라면 사업자 콘솔의 보안 그룹/방화벽에서도 같은 포트를 허용해야 하며, 이는 로컬에서 확인할 수 없습니다.`,"panel.onboarding.relayPlaceholder":`https://릴레이-도메인`}},{"zh-Hans":{"panel.update.title":`插件更新`,"panel.update.unknownVersion":`未知版本`,"panel.update.reading":`正在读更新状态…`,"panel.update.runningVersion":`运行中版本`,"panel.update.diskVersion":`盘上的版本`,"panel.update.latestOnline":`线上最新`,"panel.update.notChecked":`还没查过`,"panel.update.neverUpdated":`还没更新过`,"panel.update.source":`安装来源`,"panel.update.action":`更新操作`,"panel.update.switching":`正在切换…`,"panel.update.idle":`空闲`,"panel.update.lastCheck":`最近一次检查`,"panel.update.lastApply":`最近一次更新`,"panel.update.hasNew":`线上有新版本。`,"panel.update.nothingToInstall":`这台宿主的面板里不装新代码(当前这份实现是直接被挂载的):无头 / 源码同步部署到服务器上同步源码 + 重启宿主服务;桌面端旧版到「设置 → 插件 → 本插件」里更新一版。`,"panel.update.noMarketTitle":`这台机器上没有可用的插件市场`,"panel.update.noMarketBody":`插件从 npm 分发,更新由 DSH 的插件市场负责:到「设置 → 插件」里更新本插件(或装上插件市场)。`,"panel.update.autoUpdate":`自动更新`,"panel.update.shellChangedTitle":`这次更新里外壳也换了`,"panel.update.shellChangedBody":`它有极少数改动要等下次启动 DSH 才生效(更新本身已经生效,不用管)。`,"panel.update.restartSidecar":`重启 sidecar`,"panel.update.checking":`正在检查…`,"panel.update.check":`检查更新`,"panel.update.updating":`正在更新…`,"panel.update.updateNow":`立即更新`,"panel.update.forceHint":`强制更新(有对话在跑、或刚发布的,也照装)`,"panel.update.resultHasNew":`有新版可以装`,"panel.update.resultUpToDate":`已经是最新版`,"panel.update.otaSection":`本机调试 OTA`,"panel.update.otaLocalOnly":`仅本机`,"panel.update.otaVersion":`当前 OTA 版本`,"panel.update.otaAbsorbState":`正式版覆盖状态`,"panel.update.otaAbsorbed":`已被正式版 {version} 覆盖`,"panel.update.otaNotAbsorbed":`尚未被正式版覆盖`,"panel.update.otaNothing":`无待吸收的 OTA`,"panel.update.otaCheck":`检查紧急 OTA`,"panel.update.otaInstall":`立即安装`,"panel.update.otaBusy":`处理中…`,"panel.update.otaNone":`无`,"panel.update.otaFound":`发现紧急 OTA {version}。`,"panel.update.otaNotFound":`没有可安装的紧急 OTA。`,"panel.update.debugInstalled":`已安装调试 OTA {version}。`,"panel.update.debugNone":`没有安装新的调试 OTA。`,"panel.update.applyUpToDate":`已经是最新版({version}),没有改动任何文件。`,"panel.update.applyUpToDatePlain":`已经是最新版,没有改动任何文件。`,"panel.update.applyDiskUnchanged":`装了但盘上的版本没变(还是 {version}),这次不算数,可以再点一次。`,"panel.update.applyFailedRetry":`这次更新没成,可以再点一次。`,"panel.update.applySwitched":`已就地切到 {version},无需重启。`,"panel.update.applySwitchedPlain":`已就地切到新版本,无需重启。`,"panel.update.autoOn":`自动更新已开启:每 {minutes} 分钟查一次,有新版直接装好并就地生效,不等正在跑的对话结束。`,"panel.update.autoOff":`自动更新已关闭,之后只在点「检查更新」时才问市场。`,"panel.update.autoToggleFailed":`自动更新开关没保存成功:{message}`,"panel.update.versionDrift":`这两个版本对不上:面板报的 {version} 是进程启动时读进内存的,外壳实际装载的是 {shell}。一般是外壳刚换过代、页面还没重新读取;刷新一下这一页就一致了。`,"panel.update.checkResult":`检查结果`,"panel.update.applyFailed":`这次更新没成:{message}`,"panel.update.finishingInFlight":`正在收尾在飞请求({count} 个)…`},"zh-Hant":{"panel.update.title":`外掛更新`,"panel.update.unknownVersion":`未知版本`,"panel.update.reading":`正在讀取更新狀態…`,"panel.update.runningVersion":`執行中版本`,"panel.update.diskVersion":`磁碟上版本`,"panel.update.latestOnline":`線上最新`,"panel.update.notChecked":`還沒查過`,"panel.update.neverUpdated":`還沒更新過`,"panel.update.source":`安裝來源`,"panel.update.action":`更新操作`,"panel.update.switching":`正在切換…`,"panel.update.idle":`閒置`,"panel.update.lastCheck":`最近一次檢查`,"panel.update.lastApply":`最近一次更新`,"panel.update.hasNew":`線上已有新版本。`,"panel.update.nothingToInstall":`這台宿主的面板裡不裝新程式碼(目前這份實作是直接被掛載的):無頭 / 原始碼同步部署到伺服器上同步原始碼 + 重新啟動宿主服務;桌面端舊版到「設定 → 外掛 → 本外掛」裡更新一版。`,"panel.update.noMarketTitle":`這台機器上沒有可用的外掛市場`,"panel.update.noMarketBody":`外掛從 npm 發佈,更新由 DSH 的外掛市場負責:到「設定 → 外掛」裡更新本外掛(或裝上外掛市場)。`,"panel.update.autoUpdate":`自動更新`,"panel.update.shellChangedTitle":`這次更新裡外殼也換了`,"panel.update.shellChangedBody":`它有極少數改動要等下次啟動 DSH 才生效(更新本身已經生效,不用管)。`,"panel.update.restartSidecar":`重新啟動 sidecar`,"panel.update.checking":`正在檢查…`,"panel.update.check":`檢查更新`,"panel.update.updating":`正在更新…`,"panel.update.updateNow":`立即更新`,"panel.update.forceHint":`強制更新(有對話在跑、或剛發佈的,也照裝)`,"panel.update.resultHasNew":`有新版可以裝`,"panel.update.resultUpToDate":`已經是最新版`,"panel.update.otaSection":`本機偵錯 OTA`,"panel.update.otaLocalOnly":`僅本機`,"panel.update.otaVersion":`目前 OTA 版本`,"panel.update.otaAbsorbState":`正式版覆蓋狀態`,"panel.update.otaAbsorbed":`已被正式版 {version} 覆蓋`,"panel.update.otaNotAbsorbed":`尚未被正式版覆蓋`,"panel.update.otaNothing":`無待吸收的 OTA`,"panel.update.otaCheck":`檢查緊急 OTA`,"panel.update.otaInstall":`立即安裝`,"panel.update.otaBusy":`處理中…`,"panel.update.otaNone":`無`,"panel.update.otaFound":`發現緊急 OTA {version}。`,"panel.update.otaNotFound":`沒有可安裝的緊急 OTA。`,"panel.update.debugInstalled":`已安裝偵錯 OTA {version}。`,"panel.update.debugNone":`沒有安裝新的偵錯 OTA。`,"panel.update.applyUpToDate":`已經是最新版({version}),沒有改動任何檔案。`,"panel.update.applyUpToDatePlain":`已經是最新版,沒有改動任何檔案。`,"panel.update.applyDiskUnchanged":`裝了但磁碟上的版本沒變(還是 {version}),這次不算數,可以再點一次。`,"panel.update.applyFailedRetry":`這次更新沒成,可以再點一次。`,"panel.update.applySwitched":`已就地切到 {version},無需重新啟動。`,"panel.update.applySwitchedPlain":`已就地切到新版本,無需重新啟動。`,"panel.update.autoOn":`自動更新已開啟:每 {minutes} 分鐘查一次,有新版直接裝好並就地生效,不等正在跑的對話結束。`,"panel.update.autoOff":`自動更新已關閉,之後只在點「檢查更新」時才問市場。`,"panel.update.autoToggleFailed":`自動更新開關沒有儲存成功:{message}`,"panel.update.versionDrift":`這兩個版本對不上:面板報的 {version} 是程序啟動時讀進記憶體的,外殼實際裝載的是 {shell}。一般是外殼剛換過代、頁面還沒重新讀取;重新整理這一頁就一致了。`,"panel.update.checkResult":`檢查結果`,"panel.update.finishingInFlight":`正在收尾在飛請求({count} 個)…`,"panel.update.applyFailed":`這次更新沒成:{message}`},en:{"panel.update.title":`Plugin update`,"panel.update.unknownVersion":`Unknown version`,"panel.update.reading":`Reading update status…`,"panel.update.runningVersion":`Running version`,"panel.update.diskVersion":`Installed version`,"panel.update.latestOnline":`Latest online`,"panel.update.notChecked":`Not checked yet`,"panel.update.neverUpdated":`Never updated`,"panel.update.source":`Installed from`,"panel.update.action":`Update action`,"panel.update.switching":`Switching…`,"panel.update.idle":`Idle`,"panel.update.lastCheck":`Last check`,"panel.update.lastApply":`Last update`,"panel.update.hasNew":`A new version is available online.`,"panel.update.nothingToInstall":`This host’s panel does not install new code (this implementation is mounted directly): for headless or source-synced deployments, sync the source and restart the host service; on an older desktop build, update it under Settings → Plugins → This plugin.`,"panel.update.noMarketTitle":`No usable plugin marketplace on this machine`,"panel.update.noMarketBody":`The plugin is distributed via npm and updated by DSH’s plugin marketplace: go to Settings → Plugins to update it (or install the marketplace).`,"panel.update.autoUpdate":`Auto-update`,"panel.update.shellChangedTitle":`This update also changed the shell`,"panel.update.shellChangedBody":`A few of its changes take effect the next time DSH starts (the update itself is already in effect — nothing to do).`,"panel.update.restartSidecar":`Restart sidecar`,"panel.update.checking":`Checking…`,"panel.update.check":`Check for updates`,"panel.update.updating":`Updating…`,"panel.update.updateNow":`Update now`,"panel.update.forceHint":`Forced update (installs even with chats running or right after release)`,"panel.update.resultHasNew":`A new version is available`,"panel.update.resultUpToDate":`Already up to date`,"panel.update.otaSection":`Local debug OTA`,"panel.update.otaLocalOnly":`This machine only`,"panel.update.otaVersion":`Current OTA version`,"panel.update.otaAbsorbState":`Release coverage`,"panel.update.otaAbsorbed":`Superseded by release {version}`,"panel.update.otaNotAbsorbed":`Not yet superseded by the release`,"panel.update.otaNothing":`No OTA to absorb`,"panel.update.otaCheck":`Check for urgent OTA`,"panel.update.otaInstall":`Install now`,"panel.update.otaBusy":`Working…`,"panel.update.otaNone":`None`,"panel.update.otaFound":`Urgent OTA {version} found.`,"panel.update.otaNotFound":`No urgent OTA to install.`,"panel.update.debugInstalled":`Debug OTA {version} installed.`,"panel.update.debugNone":`No new debug OTA installed.`,"panel.update.applyUpToDate":`Already up to date ({version}); no files changed.`,"panel.update.applyUpToDatePlain":`Already up to date; no files changed.`,"panel.update.applyDiskUnchanged":`Installed but the on-disk version is unchanged ({version}); this attempt did not count — try again.`,"panel.update.applyFailedRetry":`This update did not go through; try again.`,"panel.update.applySwitched":`Switched to {version} in place; no restart needed.`,"panel.update.applySwitchedPlain":`Switched to the new version in place; no restart needed.`,"panel.update.autoOn":`Auto-update on: checks every {minutes} minutes and installs new versions in place without waiting for running conversations to finish.`,"panel.update.autoOff":`Auto-update off: the marketplace is only asked when you tap “Check for updates”.`,"panel.update.autoToggleFailed":`Could not save the auto-update switch: {message}`,"panel.update.versionDrift":`These two versions disagree: the panel reports {version} (read into memory at process start) while the shell actually loaded {shell}. Usually the shell was just replaced and this page has not re-read it; refresh the page.`,"panel.update.checkResult":`Result`,"panel.update.finishingInFlight":`Finishing {count} in-flight request(s)…`,"panel.update.applyFailed":`This update did not go through: {message}`},ja:{"panel.update.title":`プラグインの更新`,"panel.update.unknownVersion":`不明なバージョン`,"panel.update.reading":`更新状態を読み込み中…`,"panel.update.runningVersion":`実行中のバージョン`,"panel.update.diskVersion":`ディスク上のバージョン`,"panel.update.latestOnline":`オンライン最新`,"panel.update.notChecked":`まだ確認していません`,"panel.update.neverUpdated":`まだ更新していません`,"panel.update.source":`インストール元`,"panel.update.action":`更新操作`,"panel.update.switching":`切り替え中…`,"panel.update.idle":`待機中`,"panel.update.lastCheck":`最後の確認`,"panel.update.lastApply":`最後の更新`,"panel.update.hasNew":`オンラインに新しい版があります。`,"panel.update.nothingToInstall":`このホストのパネルでは新しいコードをインストールしません(現在の実装は直接マウントされています)。ヘッドレス/ソース同期配備ではソースを同期してホストサービスを再起動してください。古いデスクトップ版では「設定 → プラグイン → 本プラグイン」から更新してください。`,"panel.update.noMarketTitle":`このマシンには利用可能なプラグインマーケットがありません`,"panel.update.noMarketBody":`プラグインは npm で配布され、更新は DSH のプラグインマーケットが担います。「設定 → プラグイン」から更新してください(またはマーケットを入れてください)。`,"panel.update.autoUpdate":`自動更新`,"panel.update.shellChangedTitle":`この更新では外側も変わりました`,"panel.update.shellChangedBody":`ごく一部の変更は次に DSH を起動したときに有効になります(更新自体は既に有効です。何もする必要はありません)。`,"panel.update.restartSidecar":`サイドカーを再起動`,"panel.update.checking":`確認中…`,"panel.update.check":`更新を確認`,"panel.update.updating":`更新中…`,"panel.update.updateNow":`今すぐ更新`,"panel.update.forceHint":`強制更新(会話が実行中でも、公開直後でもインストールします)`,"panel.update.resultHasNew":`新しい版をインストールできます`,"panel.update.resultUpToDate":`最新版です`,"panel.update.otaSection":`ローカルデバッグ OTA`,"panel.update.otaLocalOnly":`このマシンのみ`,"panel.update.otaVersion":`現在の OTA バージョン`,"panel.update.otaAbsorbState":`正式版による上書き状態`,"panel.update.otaAbsorbed":`正式版 {version} で上書き済み`,"panel.update.otaNotAbsorbed":`まだ正式版で上書きされていません`,"panel.update.otaNothing":`取り込む OTA はありません`,"panel.update.otaCheck":`緊急 OTA を確認`,"panel.update.otaInstall":`今すぐインストール`,"panel.update.otaBusy":`処理中…`,"panel.update.otaNone":`なし`,"panel.update.otaFound":`緊急 OTA {version} が見つかりました。`,"panel.update.otaNotFound":`インストールできる緊急 OTA はありません。`,"panel.update.debugInstalled":`デバッグ OTA {version} をインストールしました。`,"panel.update.debugNone":`新しいデバッグ OTA はインストールしていません。`,"panel.update.applyUpToDate":`最新版({version})です。ファイルは変更していません。`,"panel.update.applyUpToDatePlain":`最新版です。ファイルは変更していません。`,"panel.update.applyDiskUnchanged":`インストールしましたがディスク上のバージョンが変わりません({version})。今回は反映されていないので、もう一度お試しください。`,"panel.update.applyFailedRetry":`今回の更新は完了しませんでした。もう一度お試しください。`,"panel.update.applySwitched":`{version} にその場で切り替えました。再起動は不要です。`,"panel.update.applySwitchedPlain":`新しい版にその場で切り替えました。再起動は不要です。`,"panel.update.autoOn":`自動更新をオンにしました。{minutes} 分ごとに確認し、新しい版があれば実行中の会話の終了を待たずに自動でインストールして反映します。`,"panel.update.autoOff":`自動更新をオフにしました。以降は「更新を確認」を押したときだけマーケットに問い合わせます。`,"panel.update.autoToggleFailed":`自動更新の切り替えを保存できませんでした:{message}`,"panel.update.versionDrift":`この 2 つのバージョンが一致しません。パネルが報告している {version} はプロセス起動時に読み込んだ値で、実際に読み込まれた外側は {shell} です。多くの場合、外側が入れ替わった直後でページが再読み込みされていないだけです。このページを再読み込みしてください。`,"panel.update.checkResult":`確認結果`,"panel.update.finishingInFlight":`実行中のリクエストを収束中({count} 件)…`,"panel.update.applyFailed":`今回の更新は完了しませんでした:{message}`},ko:{"panel.update.title":`플러그인 업데이트`,"panel.update.unknownVersion":`알 수 없는 버전`,"panel.update.reading":`업데이트 상태를 읽는 중…`,"panel.update.runningVersion":`실행 중 버전`,"panel.update.diskVersion":`디스크 버전`,"panel.update.latestOnline":`온라인 최신`,"panel.update.notChecked":`아직 확인하지 않았습니다`,"panel.update.neverUpdated":`업데이트한 적 없습니다`,"panel.update.source":`설치 출처`,"panel.update.action":`업데이트 작업`,"panel.update.switching":`전환 중…`,"panel.update.idle":`대기 중`,"panel.update.lastCheck":`마지막 확인`,"panel.update.lastApply":`마지막 업데이트`,"panel.update.hasNew":`온라인에 새 버전이 있습니다.`,"panel.update.nothingToInstall":`이 호스트의 패널은 새 코드를 설치하지 않습니다(현재 구현은 직접 마운트됩니다). 헤드리스 또는 소스 동기화 배포에서는 소스를 동기화하고 호스트 서비스를 재시작하세요. 이전 데스크톱 버전에서는 설정 → 플러그인 → 이 플러그인에서 업데이트하세요.`,"panel.update.noMarketTitle":`이 컴퓨터에는 사용 가능한 플러그인 마켓이 없습니다`,"panel.update.noMarketBody":`플러그인은 npm으로 배포되며 DSH의 플러그인 마켓에서 업데이트합니다. 설정 → 플러그인에서 업데이트하세요(또는 마켓을 설치하세요).`,"panel.update.autoUpdate":`자동 업데이트`,"panel.update.shellChangedTitle":`이 업데이트에서 외형도 바뀌었습니다`,"panel.update.shellChangedBody":`일부 변경은 DSH를 다음에 시작할 때 적용됩니다(업데이트 자체는 이미 적용되었으니 신경 쓰지 않으셔도 됩니다).`,"panel.update.restartSidecar":`사이드카 재시작`,"panel.update.checking":`확인 중…`,"panel.update.check":`업데이트 확인`,"panel.update.updating":`업데이트 중…`,"panel.update.updateNow":`지금 업데이트`,"panel.update.forceHint":`강제 업데이트(대화가 실행 중이거나 방금 배포된 경우에도 설치)`,"panel.update.resultHasNew":`새 버전을 설치할 수 있습니다`,"panel.update.resultUpToDate":`이미 최신 버전입니다`,"panel.update.otaSection":`로컬 디버그 OTA`,"panel.update.otaLocalOnly":`이 컴퓨터만`,"panel.update.otaVersion":`현재 OTA 버전`,"panel.update.otaAbsorbState":`정식 버전 덮어쓰기 상태`,"panel.update.otaAbsorbed":`정식 버전 {version}(으)로 대체됨`,"panel.update.otaNotAbsorbed":`아직 정식 버전으로 대체되지 않음`,"panel.update.otaNothing":`흡수할 OTA가 없습니다`,"panel.update.otaCheck":`긴급 OTA 확인`,"panel.update.otaInstall":`지금 설치`,"panel.update.otaBusy":`처리 중…`,"panel.update.otaNone":`없음`,"panel.update.otaFound":`긴급 OTA {version}을(를) 찾았습니다.`,"panel.update.otaNotFound":`설치할 긴급 OTA가 없습니다.`,"panel.update.debugInstalled":`디버그 OTA {version}을(를) 설치했습니다.`,"panel.update.debugNone":`새 디버그 OTA를 설치하지 않았습니다.`,"panel.update.applyUpToDate":`이미 최신 버전({version})이며 파일을 변경하지 않았습니다.`,"panel.update.applyUpToDatePlain":`이미 최신 버전이며 파일을 변경하지 않았습니다.`,"panel.update.applyDiskUnchanged":`설치했지만 디스크 버전이 그대로입니다({version}). 이번 시도는 반영되지 않았으니 다시 시도하세요.`,"panel.update.applyFailedRetry":`이번 업데이트가 완료되지 않았습니다. 다시 시도하세요.`,"panel.update.applySwitched":`{version}(으)로 즉시 전환했습니다. 재시작이 필요 없습니다.`,"panel.update.applySwitchedPlain":`새 버전으로 즉시 전환했습니다. 재시작이 필요 없습니다.`,"panel.update.autoOn":`자동 업데이트를 켰습니다. {minutes}분마다 확인하고 새 버전이 있으면 실행 중인 대화가 끝나기를 기다리지 않고 바로 설치해 적용합니다.`,"panel.update.autoOff":`자동 업데이트를 껐습니다. 이후에는 「업데이트 확인」을 눌렀을 때만 마켓에 문의합니다.`,"panel.update.autoToggleFailed":`자동 업데이트 스위치를 저장하지 못했습니다: {message}`,"panel.update.versionDrift":`두 버전이 일치하지 않습니다. 패널이 보고하는 {version}은 프로세스 시작 시 읽은 값이고, 실제로 로드된 외형은 {shell}입니다. 보통 외형이 막 교체되어 페이지가 다시 읽지 않은 경우이니 이 페이지를 새로 고치세요.`,"panel.update.checkResult":`확인 결과`,"panel.update.finishingInFlight":`진행 중인 요청 {count}개 마무리 중…`,"panel.update.applyFailed":`이번 업데이트가 완료되지 않았습니다: {message}`}},{"zh-Hans":{"panel.devices.title":`已绑定的设备`,"panel.devices.unknown":`未知设备`,"panel.devices.unknownPlatform":`未知平台`,"panel.devices.legacy":`旧式`,"panel.devices.boundAt":`绑定于 {time}`,"panel.devices.online":`在线`,"panel.devices.noRecord":`无记录`,"panel.devices.channelRelay":`经中转`,"panel.devices.channelLan":`局域网`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`加密`,"panel.devices.plain":`明文`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`刚刚`,"panel.devices.minutesAgo":`{count} 分钟前`,"panel.devices.hoursAgo":`{count} 小时前`,"panel.devices.daysAgo":`{count} 天前`,"panel.devices.cancel":`取消`,"panel.devices.unbind":`解除绑定`,"panel.devices.unbinding":`解除中…`,"panel.devices.unbindTitle":`解除绑定`,"panel.devices.unbindConfirm":`确定要解除「{name}」的绑定?`,"panel.devices.unbindDone":`已解除「{name}」的绑定({count} 条凭据)。`,"panel.devices.unbindDoneClosed":`已解除「{name}」的绑定({count} 条凭据,断开 {closed} 条连接)。`,"panel.devices.unbindFailed":`解除绑定失败:{message}`,"panel.devices.effectIdentity":`下次请求起失效。`,"panel.devices.effectLegacy":`只吊销凭据,旧的通行证仍可能在到期前可用;要立即失效请用『吊销全部』。`,"panel.devices.allowTitle":`允许新设备绑定`,"panel.devices.allowOn":`已允许`,"panel.devices.allowOff":`已关闭`,"panel.devices.allowOnHint":`新手机扫码后可以直接绑上`,"panel.devices.allowOffHint":`不再接受新的配对请求`,"panel.devices.allowOffNote":`关掉后这台电脑不收新设备,已绑定的手机照常用`,"panel.devices.policyAllowed":`已允许新设备绑定。`,"panel.devices.policyDenied":`已停止接收新设备,已绑定的手机照常可用。`},"zh-Hant":{"panel.devices.title":`已綁定的裝置`,"panel.devices.unknown":`未知裝置`,"panel.devices.unknownPlatform":`未知平台`,"panel.devices.legacy":`舊式`,"panel.devices.boundAt":`綁定於 {time}`,"panel.devices.online":`線上`,"panel.devices.noRecord":`無紀錄`,"panel.devices.channelRelay":`經中轉`,"panel.devices.channelLan":`區域網路`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`加密`,"panel.devices.plain":`明文`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`剛剛`,"panel.devices.minutesAgo":`{count} 分鐘前`,"panel.devices.hoursAgo":`{count} 小時前`,"panel.devices.daysAgo":`{count} 天前`,"panel.devices.cancel":`取消`,"panel.devices.unbind":`解除綁定`,"panel.devices.unbinding":`解除中…`,"panel.devices.unbindTitle":`解除綁定`,"panel.devices.unbindConfirm":`確定要解除「{name}」的綁定?`,"panel.devices.unbindDone":`已解除「{name}」的綁定({count} 條憑證)。`,"panel.devices.unbindDoneClosed":`已解除「{name}」的綁定({count} 條憑證,斷開 {closed} 條連線)。`,"panel.devices.unbindFailed":`解除綁定失敗:{message}`,"panel.devices.effectIdentity":`下次請求起失效。`,"panel.devices.effectLegacy":`只吊銷憑證,舊的通行證仍可能在到期前可用;要立即失效請用『吊銷全部』。`,"panel.devices.allowTitle":`允許新裝置綁定`,"panel.devices.allowOn":`已允許`,"panel.devices.allowOff":`已關閉`,"panel.devices.allowOnHint":`新手機掃碼後可以直接綁上`,"panel.devices.allowOffHint":`不再接受新的配對請求`,"panel.devices.allowOffNote":`關掉後這台電腦不收新裝置,已綁定的手機照常用`,"panel.devices.policyAllowed":`已允許新裝置綁定。`,"panel.devices.policyDenied":`已停止接收新裝置,已綁定的手機照常可用。`},en:{"panel.devices.title":`Paired devices`,"panel.devices.unknown":`Unknown device`,"panel.devices.unknownPlatform":`Unknown platform`,"panel.devices.legacy":`Legacy`,"panel.devices.boundAt":`Paired {time}`,"panel.devices.online":`Online`,"panel.devices.noRecord":`No record`,"panel.devices.channelRelay":`Via relay`,"panel.devices.channelLan":`LAN`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`Encrypted`,"panel.devices.plain":`Plaintext`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`just now`,"panel.devices.minutesAgo":`{count} min ago`,"panel.devices.hoursAgo":`{count} h ago`,"panel.devices.daysAgo":`{count} d ago`,"panel.devices.cancel":`Cancel`,"panel.devices.unbind":`Unbind`,"panel.devices.unbinding":`Unbinding…`,"panel.devices.unbindTitle":`Unbind device`,"panel.devices.unbindConfirm":`Unbind “{name}”?`,"panel.devices.unbindDone":`Unbound “{name}” ({count} credentials).`,"panel.devices.unbindDoneClosed":`Unbound “{name}” ({count} credentials, {closed} connections closed).`,"panel.devices.unbindFailed":`Could not unbind: {message}`,"panel.devices.effectIdentity":`Takes effect from the next request.`,"panel.devices.effectLegacy":`This revokes the stored credential only; the old pass may still work until it expires. Use “Revoke all” to cut it off immediately.`,"panel.devices.allowTitle":`Allow new devices to pair`,"panel.devices.allowOn":`Allowed`,"panel.devices.allowOff":`Off`,"panel.devices.allowOnHint":`A new phone can pair right after scanning`,"panel.devices.allowOffHint":`New pairing requests are refused`,"panel.devices.allowOffNote":`While off, this computer accepts no new devices; already-paired phones keep working.`,"panel.devices.policyAllowed":`New devices may now pair.`,"panel.devices.policyDenied":`New devices are now refused; already-paired phones keep working.`},ja:{"panel.devices.title":`ペアリング済みのデバイス`,"panel.devices.unknown":`不明なデバイス`,"panel.devices.unknownPlatform":`不明なプラットフォーム`,"panel.devices.legacy":`旧形式`,"panel.devices.boundAt":`{time}にペアリング`,"panel.devices.online":`オンライン`,"panel.devices.noRecord":`記録なし`,"panel.devices.channelRelay":`リレー経由`,"panel.devices.channelLan":`LAN`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`暗号化`,"panel.devices.plain":`平文`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`たった今`,"panel.devices.minutesAgo":`{count} 分前`,"panel.devices.hoursAgo":`{count} 時間前`,"panel.devices.daysAgo":`{count} 日前`,"panel.devices.cancel":`キャンセル`,"panel.devices.unbind":`バインド解除`,"panel.devices.unbinding":`解除中…`,"panel.devices.unbindTitle":`バインド解除`,"panel.devices.unbindConfirm":`「{name}」のバインドを解除しますか?`,"panel.devices.unbindDone":`「{name}」のバインドを解除しました(資格情報 {count} 件)。`,"panel.devices.unbindDoneClosed":`「{name}」のバインドを解除しました(資格情報 {count} 件、接続 {closed} 件を切断)。`,"panel.devices.unbindFailed":`バインド解除に失敗しました:{message}`,"panel.devices.effectIdentity":`次のリクエストから無効になります。`,"panel.devices.effectLegacy":`取り消されるのは保存された資格情報だけです。古いパスは有効期限まで使える可能性があります。即時に切るには「すべて取り消す」を使ってください。`,"panel.devices.allowTitle":`新しいデバイスのバインドを許可`,"panel.devices.allowOn":`許可中`,"panel.devices.allowOff":`停止中`,"panel.devices.allowOnHint":`新しいスマートフォンはスキャン後すぐにバインドできます`,"panel.devices.allowOffHint":`新しいペアリング要求は拒否されます`,"panel.devices.allowOffNote":`停止中はこのコンピューターは新しいデバイスを受け付けません。バインド済みのスマートフォンはそのまま使えます。`,"panel.devices.policyAllowed":`新しいデバイスのバインドを許可しました。`,"panel.devices.policyDenied":`新しいデバイスの受け付けを停止しました。バインド済みのスマートフォンはそのまま使えます。`},ko:{"panel.devices.title":`페어링된 기기`,"panel.devices.unknown":`알 수 없는 기기`,"panel.devices.unknownPlatform":`알 수 없는 플랫폼`,"panel.devices.legacy":`구형`,"panel.devices.boundAt":`{time}에 페어링`,"panel.devices.online":`온라인`,"panel.devices.noRecord":`기록 없음`,"panel.devices.channelRelay":`릴레이 경유`,"panel.devices.channelLan":`LAN`,"panel.devices.channelUnknown":`—`,"panel.devices.encrypted":`암호화`,"panel.devices.plain":`평문`,"panel.devices.appVersion":` · App {version}`,"panel.devices.justNow":`방금`,"panel.devices.minutesAgo":`{count}분 전`,"panel.devices.hoursAgo":`{count}시간 전`,"panel.devices.daysAgo":`{count}일 전`,"panel.devices.cancel":`취소`,"panel.devices.unbind":`바인딩 해제`,"panel.devices.unbinding":`해제 중…`,"panel.devices.unbindTitle":`바인딩 해제`,"panel.devices.unbindConfirm":`「{name}」의 바인딩을 해제하시겠습니까?`,"panel.devices.unbindDone":`「{name}」의 바인딩을 해제했습니다(자격 증명 {count}개).`,"panel.devices.unbindDoneClosed":`「{name}」의 바인딩을 해제했습니다(자격 증명 {count}개, 연결 {closed}개 종료).`,"panel.devices.unbindFailed":`바인딩 해제에 실패했습니다: {message}`,"panel.devices.effectIdentity":`다음 요청부터 무효가 됩니다.`,"panel.devices.effectLegacy":`저장된 자격 증명만 취소됩니다. 예전 통행증은 만료 전까지 계속 쓸 수 있습니다. 즉시 끊으려면 「모두 취소」를 사용하세요.`,"panel.devices.allowTitle":`새 기기 바인딩 허용`,"panel.devices.allowOn":`허용됨`,"panel.devices.allowOff":`꺼짐`,"panel.devices.allowOnHint":`새 휴대폰은 스캔 후 바로 바인딩할 수 있습니다`,"panel.devices.allowOffHint":`새 페어링 요청을 거부합니다`,"panel.devices.allowOffNote":`꺼져 있으면 이 컴퓨터는 새 기기를 받지 않습니다. 이미 바인딩된 휴대폰은 그대로 쓸 수 있습니다.`,"panel.devices.policyAllowed":`새 기기 바인딩을 허용했습니다.`,"panel.devices.policyDenied":`새 기기 받기를 중지했습니다. 이미 바인딩된 휴대폰은 그대로 쓸 수 있습니다.`}}],xb=(()=>{let e={"zh-Hans":{},"zh-Hant":{},en:{},ja:{},ko:{}};for(let t of Object.keys(e))e[t]=vb(bb.map(e=>e[t]??{}));return e})();function $(e,t){return yb(xb,gb(),e,t)}function Sb(e){return Ar(e.defaultTagName??`div`,e,e)}var Cb=[`before:pointer-events-none`,`before:absolute`,`before:inset-0`,`before:-z-1`,`before:rounded-[inherit]`,`[a,button]:before:transition-[opacity,background-color,border-color]`,`[a,button]:before:duration-250`,`motion-reduce:[a,button]:before:transition-none`],wb=Sl(`relative isolate inline-flex shrink-0 items-center justify-center rounded-full whitespace-nowrap outline-offset-1 select-none [&_svg]:shrink-0 [a,button]:transform-gpu [a,button]:cursor-pointer [a,button]:transition [a,button]:duration-250 [a,button]:ease-[cubic-bezier(0.175,0.885,0.32,1.5)] [a,button]:not-data-popup-open:active:translate-y-px [a,button]:not-data-popup-open:active:scale-[0.97] [a,button]:not-data-popup-open:active:duration-100 [a,button]:not-data-popup-open:active:ease-in-out motion-reduce:[a,button]:transition-none`,{variants:{variant:{primary:Z(Cb,`bg-primary text-primary-foreground outline-ring-primary [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--primary)_0%,var(--primary-muted)_75%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),"primary-outline":Z(Cb,`text-primary before:border before:border-primary outline-ring-primary`,`[a,button]:hover:before:bg-primary [a,button]:hover:text-primary-foreground`,`[a,button]:data-pressed:before:bg-primary [a,button]:data-pressed:text-primary-foreground`,`[a,button]:data-popup-open:before:bg-primary [a,button]:data-popup-open:text-primary-foreground`),secondary:Z(Cb,`bg-secondary-muted text-secondary-foreground outline-ring-secondary [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--secondary)_0%,var(--secondary-muted)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),soft:Z(Cb,`text-foreground-intense before:bg-background-muted before:backdrop-blur-md [a,button]:before:border [a,button]:before:border-transparent outline-ring`,`data-[slot=breadcrumb-link]:not-data-active:text-foreground-muted data-[slot=breadcrumb-link]:hover:text-foreground-intense`,`[a,button]:hover:before:bg-background-subtle [a,button]:hover:before:border-border`,`[a,button]:data-pressed:before:bg-background-subtle [a,button]:data-pressed:before:border-border`,`[a,button]:data-popup-open:before:bg-background-subtle [a,button]:data-popup-open:before:border-border`,`data-active:before:bg-background-subtle data-active:border data-active:before:border-border`),outline:Z(Cb,`bg-background text-foreground-intense before:bg-background before:border-border before:border outline-ring`,`data-[slot=breadcrumb-link]:not-data-active:text-foreground-muted data-[slot=breadcrumb-link]:hover:text-foreground-intense`,`[a,button]:hover:before:bg-background-subtle [a,button]:hover:before:border-border-strong`,`[a,button]:data-pressed:before:bg-background-subtle [a,button]:data-pressed:before:border-border-strong`,`[a,button]:data-popup-open:before:bg-background-subtle [a,button]:data-popup-open:before:border-border-strong`,`data-active:before:bg-background-subtle data-active:before:border-border-strong`),error:Z(Cb,`bg-error-muted text-error-foreground outline-ring-error [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--error-muted)_0%,rgba(255,255,255,.5)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),success:Z(Cb,`bg-success-muted text-success-foreground outline-ring-success [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--success-muted)_0%,rgba(255,255,255,.5)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),warning:Z(Cb,`bg-warning-muted text-warning-foreground outline-ring-warning [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--warning-muted)_0%,rgba(255,255,255,.5)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),info:Z(Cb,`bg-info-muted text-info-foreground outline-ring-info [a,button]:before:bg-[radial-gradient(138.15%_78.13%_at_52.05%_50%,var(--info-muted)_0%,rgba(255,255,255,.5)_95%)] [a,button]:before:opacity-0`,`[a,button]:hover:before:opacity-100`,`[a,button]:data-pressed:before:opacity-100`,`[a,button]:data-popup-open:before:opacity-100`),light:Z(Cb,`text-white before:bg-white/10 before:border-white/10 before:border before:backdrop-blur-md outline-ring-light`,`[a,button]:hover:before:bg-white/15 [a,button]:hover:before:border-white/15`,`[a,button]:data-pressed:before:bg-white/15 [a,button]:data-pressed:before:border-white/15`,`[a,button]:data-popup-open:before:bg-white/15 [a,button]:data-popup-open:before:border-white/15`,`data-active:before:bg-white/15 data-active:before:border-white/15`)},size:{xs:`h-4 w-fit gap-0.5 px-1.5 text-[.625rem] has-data-[icon=end]:pe-1.25 has-data-[icon=start]:ps-1.25 [&_svg:not([class*='size-'])]:size-2.5 [&_svg:not([class*='stroke-'])]:stroke-2`,sm:`h-5 w-fit gap-0.5 px-2 text-xs has-data-[icon=end]:pe-1.5 has-data-[icon=start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3 [&_svg:not([class*='stroke-'])]:stroke-[1.85]`,md:`h-6 w-fit gap-0.75 px-2.5 text-xs has-data-[icon=end]:pe-1.75 has-data-[icon=start]:ps-1.75 [&_svg:not([class*='size-'])]:size-3.5 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`,lg:`h-7 w-fit gap-1 px-3 text-sm has-data-[icon=end]:pe-2.25 has-data-[icon=start]:ps-2.25 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`,"icon-sm":`h-5 w-5 [&_svg:not([class*='size-'])]:size-3 [&_svg:not([class*='stroke-'])]:stroke-[1.85]`,"icon-md":`h-6 w-6 [&_svg:not([class*='size-'])]:size-3.5 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`,"icon-lg":`h-7 w-7 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`}},defaultVariants:{variant:`primary`,size:`md`}});function Tb({className:e,variant:t,size:n,render:r,...i}){let a=g.isValidElement(r)?r.props:void 0,o=g.isValidElement(r)&&(r.type===`a`||r.type===`button`)||i.onClick!=null||a?.href!=null||a?.onClick!=null||a?.tabIndex!=null;return Sb({defaultTagName:`span`,render:r,state:{variant:t,size:n},props:gr({"data-slot":`badge`,...o?yl():{},className:Z(wb({variant:t,size:n}),e)},i)})}var Eb=g.forwardRef(function(e,t){let{render:n,className:r,disabled:i=!1,focusableWhenDisabled:a=!1,nativeButton:o=!0,style:s,...c}=e,{getButtonProps:l,buttonRef:u}=Mi({disabled:i,focusableWhenDisabled:a,native:o});return Ar(`button`,e,{state:{disabled:i},ref:[t,u],props:[c,l]})}),Db=g.createContext(null);function Ob({className:e,variant:t,size:n,disabled:r,...i}){let a=g.useContext(Db),o=t??a?.variant,s=n??a?.size,c=r||a?.disabled;return(0,J.jsx)(Eb,{"data-slot":`button`,disabled:c,className:Z(wl({variant:o,size:s}),e),...i})}function kb(e,t,n,r,i){return g.isValidElement(t)?g.cloneElement(t,{...i,...t.props,className:Z(n,t.props.className,r)}):g.createElement(e,{...i,className:Z(n,r)})}var Ab=`[--card-radius:var(--radius-xl)]`,jb=`rounded-[calc(var(--card-radius)*4/3)]`,Mb={none:`rounded-(--card-radius)`,solid:Z(jb,`bg-background-muted/60 p-2 backdrop-blur-xl dark:bg-background-subtle`),glass:Z(jb,`border border-white/15 bg-white/10 p-2 backdrop-blur-sm`)},Nb={none:`border`,solid:`border-border-muted border`,glass:``};function Pb({frame:e=!1,inset:t=!0,className:n,contentProps:r,render:i,children:a,...o}){let s=e===!0?`solid`:e===!1?`none`:e;return kb(`div`,i,Z(`group/card flex flex-col`,Ab,Mb[s]),n,{"data-slot":`card`,"data-frame":s,...t?{"data-inset":``}:{},...o,children:(0,J.jsx)(`div`,{"data-slot":`card-content`,...r,className:Z(`bg-background flex min-h-0 flex-1 flex-col overflow-hidden rounded-(--card-radius)`,t&&`p-2`,Nb[s],r?.className),children:a})})}function Fb({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`card-header`,className:Z(`flex flex-1 flex-col gap-1.5 p-6 group-data-inset/card:px-4`,e),...t})}function Ib({className:e,render:t,...n}){return kb(`h3`,t,`text-foreground-intense text-lg font-semibold`,e,{"data-slot":`card-title`,...n})}function Lb({controlled:e,default:t,name:n,state:r=`value`}){let{current:i}=g.useRef(e!==void 0),[a,o]=g.useState(t);return[i&&e!==void 0?e:a,g.useCallback(e=>{i||o(e)},[])]}function Rb(e){return xi(e,`base-ui`)}var zb=g.createContext(void 0);function Bb(){let e=g.useContext(zb);if(e===void 0)throw Error(S(63));return e}var Vb=`data-valid`,Hb=`data-invalid`,Ub={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valid:null,valueMissing:!1},Wb={disabled:!1,valid:null,touched:!1,dirty:!1,filled:!1,focused:!1},Gb={valid(e){return e===null?null:e?{[Vb]:``}:{[Hb]:``}}},Kb=`data-checked`,qb=`data-unchecked`,Jb={...Gb,checked(e){return e?{[Kb]:``}:{[qb]:``}}},Yb={invalid:void 0,name:void 0,validityData:{state:Ub,errors:[],error:``,value:``,initialValue:null},setValidityData:p,disabled:void 0,setTouched:p,setDirty:p,setFilled:p,setFocused:p,validationMode:`onSubmit`,shouldValidateOnChange:()=>!1,state:Wb,registerFieldControl:p,validation:{getValidationProps:(e,t=h)=>t,inputRef:{current:null},registeredInputs:new Map,registerInput:p,getInputControl:()=>null,commit:async()=>{},change:p}},Xb=g.createContext(Yb);function Zb(e=!0){let t=g.useContext(Xb);if(t.setValidityData===p&&!e)throw Error(S(28));return t}function Qb(e,t,n,r,i=!0,a){let{registerFieldControl:o}=Zb(),s=y(()=>Symbol());b(()=>{let c=s.current;if(!i){o(c,void 0);return}o(c,{controlRef:e,getValue:r,id:t,name:a,value:n})},[e,i,r,t,a,o,s,n]),b(()=>{let e=s.current;return()=>{o(e,void 0)}},[o,s])}var $b=g.createContext({elementRef:{current:null},formRef:{current:{fields:new Map}},errors:{},clearErrors:p,validationMode:`onSubmit`,submitCountRef:{current:0}});function ex(){return g.useContext($b)}var tx=g.createContext({controlId:void 0,registerControlId:p,resetControlId:p,labelId:void 0,setLabelId:p,messageIds:[],setMessageIds:p,getDescriptionProps:e=>e});function nx(){return g.useContext(tx)}function rx(e,t,n,r=!0,i){let[a,o]=g.useState(),s=Rb(i?`${i}-label`:void 0),c=e??t??a;return b(()=>{let i=e||t||!r?void 0:ix(n.current,s);a!==i&&o(i)}),c}function ix(e,t){let n=ax(e);if(n)return!n.id&&t&&(n.id=t),n.id||void 0}function ax(e){if(!e)return;let t=e.parentElement;if(t&&t.tagName===`LABEL`)return t;let n=e.id;if(n){let t=e.nextElementSibling;if(t&&t.htmlFor===n)return t}let r=e.labels;return r&&r[0]}function ox(e={}){let{id:t,enabled:n=!0}=e,{controlId:r,registerControlId:i,resetControlId:a}=nx(),o=Rb(),s=y(()=>Symbol()),c=g.useRef(!1),l=g.useRef(!1),u=G(()=>{c.current&&i!==p&&(c.current=!1,i(s.current,void 0))});return b(()=>{if(!n||i===p){u();return}let e;if(t!==void 0)l.current=!0,e=t;else if(l.current)e=o;else{a();return}if(e===void 0){u();return}c.current=!0,i(s.current,e)},[t,n,i,a,o,s,u]),b(()=>u,[u]),(n?r:void 0)??t??o}function sx(e,t){let n=g.useRef(e),r=G(t);b(()=>{n.current!==e&&r(n.current),n.current=e},[e,r])}var cx=g.forwardRef(function(e,t){let{checked:n,className:r,defaultChecked:i,"aria-labelledby":a,form:o,id:s,inputRef:c,name:l,nativeButton:u=!1,onCheckedChange:d,readOnly:f=!1,required:p=!1,disabled:m=!1,render:_,uncheckedValue:v,value:y,style:x,...S}=e,{clearErrors:C}=ex(),{state:w,setTouched:T,setDirty:E,validityData:D,setFilled:O,setFocused:k,validationMode:A,disabled:j,name:M,validation:N}=Zb(),{labelId:P}=nx(),F=j||m,I=M??l,L=g.useRef(null),R=ir(L,c,N.inputRef),z=g.useRef(null),B=Rb(),V=ox({id:s}),H=u?void 0:V,[ee,U]=Lb({controlled:n,default:!!i,name:`Switch`,state:`checked`});Qb(z,B,ee,void 0,!F,l),b(()=>{O(ee)},[ee,O]),sx(ee,()=>{C(I),E(ee!==D.initialValue),N.change(ee)});let{getButtonProps:te,buttonRef:W}=Mi({disabled:F,native:u}),ne=rx(a,P,L,!u,H),G={id:u?V:B,role:`switch`,"aria-checked":ee,"aria-readonly":f||void 0,"aria-required":p||void 0,"aria-labelledby":ne,onFocus(){F||k(!0)},onBlur(){let e=L.current;e&&!F&&(T(!0),k(!1),A===`onBlur`&&N.commit(e.checked))},onClick(e){if(f||F)return;e.preventDefault();let t=L.current;t&&ji(t,e)}},K={...N.getValidationProps(F),checked:ee,disabled:F,form:o,id:H,name:I,required:p,style:I?nr:tr,tabIndex:-1,type:`checkbox`,"aria-hidden":!0,ref:R,onChange(e){if(e.nativeEvent.defaultPrevented)return;if(f){e.preventDefault();return}let t=e.currentTarget.checked,n=Ji(Li,e.nativeEvent);d?.(t,n),!n.isCanceled&&U(t)},onClick(e){e.stopPropagation()},onFocus(){z.current?.focus()},...y===void 0?h:{value:y}},q=g.useMemo(()=>({...w,checked:ee,disabled:F,readOnly:f,required:p}),[w,ee,F,f,p]),re=Ar(`span`,e,{state:q,ref:[t,z,W],props:[G,S,te,e=>N.getValidationProps(F,e)],stateAttributesMapping:Jb});return(0,J.jsxs)(zb.Provider,{value:q,children:[re,!ee&&I&&v!==void 0&&(0,J.jsx)(`input`,{type:`hidden`,form:o,name:I,value:v,disabled:F}),(0,J.jsx)(`input`,{...K,suppressHydrationWarning:!0})]})}),lx=g.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e;return Ar(`span`,e,{state:Bb(),ref:t,stateAttributesMapping:Jb,props:a})}),ux={sm:{root:`h-4 w-7.5`,thumb:`size-3`,thumbWidthKeyframes:[`0.75rem`,`1.25rem`,`0.75rem`],thumbXKeyframes:[0,`0.3125rem`,`0.875rem`],check:`size-2.5`},md:{root:`h-5 w-9.5`,thumb:`size-4`,thumbWidthKeyframes:[`1rem`,`1.6875rem`,`1rem`],thumbXKeyframes:[0,`0.4375rem`,`1.125rem`],check:`size-3`},lg:{root:`h-6 w-11.5`,thumb:`size-5`,thumbWidthKeyframes:[`1.25rem`,`2.125rem`,`1.25rem`],thumbXKeyframes:[0,`0.5rem`,`1.375rem`],check:`size-4`}},dx={duration:.25,ease:[.4,0,.2,1]};function fx(e,t){return t===1?[...e]:e.map(e=>typeof e==`number`?-e:`-${e}`)}function px({renderProps:e,state:t,dirSign:n,sizeConfig:r,reduced:i}){let{checked:a}=t,{ref:o,onDrag:s,onDragStart:c,onDragEnd:l,onAnimationStart:u,onAnimationEnd:d,...f}=e,p=g.useMemo(()=>{let e=fx(r.thumbXKeyframes,n);return a?e:e.reverse()},[a,n,r]),m=p[p.length-1],[h,_]=Dy(),v=vl(o,h),y=g.useRef(a);return g.useEffect(()=>{let e=y.current!==a;y.current=a,e&&!i?_(h.current,{x:p,width:r.thumbWidthKeyframes},dx):_(h.current,{x:m},{duration:0})},[a,r,_,h,i,p,m]),(0,J.jsx)(Oy.span,{...f,ref:v,initial:{x:m},children:(0,J.jsx)(Oy.svg,{className:Z(`text-foreground-intense`,r.check),xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 12 12`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{strokeDasharray:12},initial:!1,animate:{strokeDashoffset:a?0:12},transition:i?{duration:0}:{strokeDashoffset:{duration:a?.3:0,ease:`easeOut`,delay:a?.25:0}},children:(0,J.jsx)(`path`,{d:`M3 6l2 2 4-4`})})})}function mx({className:e,size:t=`md`,...n}){let r=Ss()===`rtl`?-1:1,i=ux[t],a=My(),o=n[`aria-invalid`],s=o===!0||o===`true`;return(0,J.jsx)(W_,{features:Yv,strict:!0,children:(0,J.jsx)(cx,{"data-slot":`switch`,className:Z(`bg-background-strong outline-ring flex shrink-0 rounded-full border border-transparent p-px outline-offset-1`,i.root,`transition-background duration-200 motion-reduce:transition-none`,`data-checked:bg-primary data-checked:outline-ring-primary`,`data-disabled:not-data-checked:border-border-strong data-disabled:opacity-disabled data-disabled:cursor-not-allowed data-disabled:not-data-checked:border-dashed`,`data-invalid:border-error data-invalid:not-data-checked:bg-error-subtle data-invalid:outline-ring-error`,e),...n,...s?{"data-invalid":``}:{},children:(0,J.jsx)(lx,{"data-slot":`switch-thumb`,className:Z(`group flex items-center justify-center rounded-full bg-white shadow-2xs`,i.thumb,`data-checked:bg-primary-foreground`),render:(e,t)=>(0,J.jsx)(px,{renderProps:e,state:t,dirSign:r,sizeConfig:i,reduced:a})})})})}function hx(...e){return e.filter(Boolean).join(` `)}var gx={ok:`bg-success`,warn:`bg-warning`,error:`bg-error`,off:`bg-foreground-subtle`},_x={ok:`text-success`,warn:`text-warning`,error:`text-error`,off:`text-foreground-muted`};function vx(e){if(e==null||e===0||e===``)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?String(e):t.toLocaleString(`zh-CN`,{hour12:!1})}function yx(e){return e===`connected`?`ok`:e===`error`?`error`:e===`connecting`?`warn`:`off`}function bx(e){let t={connected:`panel.status.connected`,connecting:`panel.status.connecting`,error:`panel.status.error`,off:`panel.status.off`};return t[e]?$(t[e]):e}function xx(e,t){return t?e===`listening`?`ok`:e===`error`?`error`:`warn`:`off`}function Sx(e,t){return t?e===`listening`?$(`panel.lan.listening`):e===`error`?$(`panel.lan.error`):e:$(`panel.lan.off`)}function Cx(e){let t={healthy:`panel.sidecar.healthy`,starting:`panel.sidecar.starting`,restarting:`panel.sidecar.restarting`,error:`panel.sidecar.error`,stopped:`panel.sidecar.stopped`};return t[e]?$(t[e]):e}function wx({tone:e}){return(0,J.jsx)(`span`,{className:hx(`inline-block size-2 shrink-0 rounded-full`,gx[e]),"aria-hidden":!0})}function Tx({label:e,tone:t,mono:n,children:r}){return(0,J.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 border-b border-border-muted py-2 last:border-b-0`,children:[(0,J.jsx)(`dt`,{className:`shrink-0 text-sm text-foreground-muted`,children:e}),(0,J.jsx)(`dd`,{className:hx(`min-w-0 text-right text-sm break-all`,n?`font-mono text-xs text-foreground-strong`:`text-foreground`,t&&_x[t]),children:r})]})}function Ex({children:e}){return(0,J.jsx)(`dl`,{className:`mt-1`,children:e})}function Dx({tone:e,text:t,detail:n}){return(0,J.jsxs)(`span`,{className:`inline-flex flex-wrap items-center justify-end gap-x-2`,children:[(0,J.jsx)(wx,{tone:e}),(0,J.jsx)(`span`,{children:t}),n?(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:n}):null]})}function Ox({on:e,what:t,label:n,className:r,disabled:i,onClick:a}){let o=n??$(e?`panel.common.hide`:`panel.common.show`);return(0,J.jsx)(Ob,{variant:`ghost`,size:`sm`,className:r,"aria-label":`${o}${t}`,disabled:i,onClick:a,children:o})}function kx({status:e,busy:t,onToggle:n,onOpenLan:r}){let i=e.tunnel,a=e.enabled,[o,s]=g.useState(!1);return(0,J.jsxs)(Pb,{frame:`solid`,children:[(0,J.jsx)(Fb,{children:(0,J.jsxs)(Ib,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`span`,{children:$(`panel.connection.state`)}),(0,J.jsx)(Tb,{variant:a?`success`:`secondary`,size:`sm`,children:$(a?`panel.connection.enabled`:`panel.connection.disabled`)})]})}),(0,J.jsxs)(`label`,{className:`flex items-center justify-between gap-4 border-b border-border-muted py-3`,children:[(0,J.jsx)(`span`,{className:`text-sm text-foreground-muted`,children:$(`panel.connection.remoteControl`)}),(0,J.jsx)(mx,{size:`md`,checked:a,disabled:t!==``,onCheckedChange:e=>n(e),"aria-label":$(`panel.connection.remoteControl`)})]}),(0,J.jsxs)(Ex,{children:[(0,J.jsx)(Tx,{label:$(`panel.connection.pluginVersion`),mono:!0,children:e.appVersion||`—`}),(0,J.jsx)(Tx,{label:$(`panel.connection.deviceName`),children:e.name||`—`}),(0,J.jsx)(Tx,{label:$(`panel.connection.instanceId`),mono:!0,children:e.instanceId||`—`}),(0,J.jsxs)(Tx,{label:$(`panel.connection.platform`),children:[e.platform,` `,e.osVersion,` · `,e.arch]}),(0,J.jsx)(Tx,{label:$(`panel.connection.relayUrl`),children:(0,J.jsxs)(`span`,{className:`inline-flex min-w-0 flex-wrap items-center justify-end gap-x-2 gap-y-1`,children:[o?(0,J.jsx)(`span`,{className:`min-w-0 font-mono text-xs text-foreground-strong`,children:e.relayUrl||`—`}):(0,J.jsx)(`span`,{className:`text-xs text-foreground-subtle`,children:$(`panel.common.hide`)}),(0,J.jsx)(Ox,{on:o,what:$(`panel.connection.relayUrl`),label:$(o?`panel.common.hide`:`panel.common.show`),onClick:()=>s(e=>!e)})]})}),(0,J.jsx)(Tx,{label:$(`panel.connection.tunnel`),tone:yx(i.state),...i.state===`error`&&i.error?{"data-error":i.error}:{},children:(0,J.jsx)(Dx,{tone:yx(i.state),text:bx(i.state),...i.error?{detail:i.error}:{}})}),(0,J.jsx)(Tx,{label:$(`panel.connection.lan`),children:(0,J.jsx)(Ob,{variant:`outline`,size:`sm`,disabled:t!==``,onClick:r,"aria-label":$(`panel.connection.viewLan`),children:`查看`})}),(0,J.jsx)(Tx,{label:$(`panel.connection.sidecar`),children:(0,J.jsx)(Dx,{tone:e.sidecar.state===`healthy`?`ok`:`warn`,text:Cx(e.sidecar.state),...e.sidecar.restarts>0?{detail:$(`panel.connection.sidecarRestarts`,{count:e.sidecar.restarts})}:{}})}),(0,J.jsx)(Tx,{label:$(`panel.connection.mirror`),children:(0,J.jsx)(Dx,{tone:e.mirror.ok?`ok`:e.mirror.error?`error`:`warn`,text:e.mirror.ok?$(`panel.connection.mirrorOk`):$(`panel.connection.mirrorOff`),detail:vx(e.mirror.pushedAt)})})]}),(0,J.jsx)(Ax,{status:e})]})}function Ax({status:e}){let t=e.tunnel.admissionHint;return t?t===`register-secret`?(0,J.jsxs)(sb,{variant:`warning`,className:`mt-3`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.connection.relayNeedsSecret`)}),(0,J.jsx)(db,{children:`中转服务器开了准入,当前连接被拒绝。向中转的部署者索取注册密钥,填进上面的「中转配置 → 注册密钥」并保存。`})]}):(0,J.jsxs)(sb,{variant:`warning`,className:`mt-3`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.connection.relayRejected`)}),(0,J.jsx)(db,{children:`中转开了实例白名单,而上面的实例 ID 不在名单里。把这个实例 ID 交给中转的部署者,让他加进 instances.json。`})]}):null}var jx={},Mx={},Nx=``;function Px(e,t){return me(e)?e:t}function Fx(e,t,n){return/hidden|clip/.test(e.getComputedStyle(Px(t,n)).overflowY)}function Ix(e){if(typeof document>`u`)return!1;let t=Me(e);return ce(t).innerWidth-t.documentElement.clientWidth>0}function Lx(e){if(!(typeof CSS<`u`&&CSS.supports&&CSS.supports(`scrollbar-gutter`,`stable`))||typeof document>`u`)return!1;let t=Me(e),n=t.documentElement,r=t.body,i=Px(n,r),a=i.style.overflowY,o=n.style.scrollbarGutter;n.style.scrollbarGutter=`stable`,i.style.overflowY=`scroll`;let s=i.offsetWidth;i.style.overflowY=`hidden`;let c=i.offsetWidth;return i.style.overflowY=a,n.style.scrollbarGutter=o,s===c}function Rx(e){let t=Me(e),n=t.documentElement,r=t.body,i=Px(n,r),a={overflowY:i.style.overflowY,overflowX:i.style.overflowX};return Object.assign(i.style,{overflowY:`hidden`,overflowX:`hidden`}),()=>{Object.assign(i.style,a)}}function zx(e){let t=Me(e),n=t.documentElement,r=t.body,i=ce(n),a=0,o=0,s=!1,c=Ie.create();if(tt&&(i.visualViewport?.scale??1)!==1)return()=>{};function l(){let t=i.getComputedStyle(n),c=i.getComputedStyle(r),l=(t.scrollbarGutter||``).includes(`both-edges`)?`stable both-edges`:`stable`;a=n.scrollTop,o=n.scrollLeft,jx={scrollbarGutter:n.style.scrollbarGutter,overflowY:n.style.overflowY,overflowX:n.style.overflowX},Nx=n.style.scrollBehavior,Mx={position:r.style.position,height:r.style.height,width:r.style.width,boxSizing:r.style.boxSizing,overflowY:r.style.overflowY,overflowX:r.style.overflowX,scrollBehavior:r.style.scrollBehavior};let u=n.scrollHeight>n.clientHeight,d=n.scrollWidth>n.clientWidth,f=t.overflowY===`scroll`||c.overflowY===`scroll`,p=t.overflowX===`scroll`||c.overflowX===`scroll`,m=Math.max(0,i.innerWidth-r.clientWidth),h=Math.max(0,i.innerHeight-r.clientHeight),g=parseFloat(c.marginTop)+parseFloat(c.marginBottom),_=parseFloat(c.marginLeft)+parseFloat(c.marginRight),v=Px(n,r);if(s=Lx(e),s){n.style.scrollbarGutter=l,v.style.overflowY=`hidden`,v.style.overflowX=`hidden`;return}Object.assign(n.style,{scrollbarGutter:l,overflowY:`hidden`,overflowX:`hidden`}),(u||f)&&(n.style.overflowY=`scroll`),(d||p)&&(n.style.overflowX=`scroll`),Object.assign(r.style,{position:`relative`,height:g||h?`calc(100dvh - ${g+h}px)`:`100dvh`,width:_||m?`calc(100vw - ${_+m}px)`:`100vw`,boxSizing:`border-box`,overflowY:`hidden`,overflowX:`hidden`,scrollBehavior:`unset`}),r.scrollTop=a,r.scrollLeft=o,n.setAttribute(`data-base-ui-scroll-locked`,``),n.style.scrollBehavior=`unset`}function u(){Object.assign(n.style,jx),Object.assign(r.style,Mx),s||(n.scrollTop=a,n.scrollLeft=o,n.removeAttribute(`data-base-ui-scroll-locked`),n.style.scrollBehavior=Nx)}function d(){u(),c.request(l)}l();let f=Ne(i,`resize`,d);return()=>{c.cancel(),u(),typeof i.removeEventListener==`function`&&f()}}var Bx=new class{lockCount=0;restore=null;timeoutLock=ze.create();timeoutUnlock=ze.create();acquire(e){return this.lockCount+=1,this.lockCount===1&&this.restore===null&&this.timeoutLock.start(0,()=>this.lock(e)),this.release}release=()=>{--this.lockCount,this.lockCount===0&&this.restore&&this.timeoutUnlock.start(0,this.unlock)};unlock=()=>{this.lockCount===0&&this.restore&&(this.restore?.(),this.restore=null)};lock(e){if(this.lockCount===0||this.restore!==null)return;let t=Me(e),n=t.documentElement,r=t.body,i=ce(n);if(Fx(i,n,r)){let t=new i.MutationObserver(()=>{Fx(i,n,r)||(t.disconnect(),this.restore=null,this.lock(e))}),a={attributes:!0};t.observe(n,a),t.observe(r,a),this.restore=()=>t.disconnect();return}let a=Xe||!Ix(e);this.restore=a?Rx(e):zx(e)}};function Vx(e=!0,t=null){b(()=>{if(e)return Bx.acquire(t)},[e,t])}function Hx({store:e,parentContext:t,isDrawer:n}){let r=e.useState(`open`),i=e.useState(`disablePointerDismissal`),a=e.useState(`modal`),o=e.useState(`popupElement`),s=e.useState(`floatingRootContext`),[c,l]=g.useState(0),[u,d]=g.useState(0),f=c===0,p=Ia(s,{outsidePressEvent(){return e.context.internalBackdropRef.current||e.context.backdropRef.current?`intentional`:{mouse:a===`trap-focus`?`sloppy`:`intentional`,touch:`sloppy`}},outsidePress(t){if(!e.context.outsidePressEnabledRef.current||`button`in t&&t.button!==0)return!1;if(`touches`in t){if(t.type===`touchend`){if(t.changedTouches.length!==1||t.touches.length!==0)return!1}else if(t.touches.length!==1)return!1}let n=ot(t);if(f&&!i){if(a){let t=e.context.internalBackdropRef.current,r=e.context.backdropRef.current;return t||r?t===n||r===n||at(n,o)&&!n?.hasAttribute(`data-base-ui-portal`):!0}return!0}return!1},escapeKey:f});return Vx(r&&a===!0,o),e.useContextCallback(`onNestedDialogOpen`,(e,t)=>{l(e),d(t)}),b(()=>(t?.onNestedDialogOpen&&(r?t.onNestedDialogOpen(c+1,u+ +!!n):t.onNestedDialogOpen(0,0)),()=>{t?.onNestedDialogOpen&&r&&t.onNestedDialogOpen(0,0)}),[n,r,c,u,t]),$o(e,{activeTriggerProps:p.reference,inactiveTriggerProps:p.trigger,popupProps:p.floating,nestedOpenDialogCount:c,nestedOpenDrawerCount:u}),null}var Ux=g.createContext(void 0);function Wx(e){let t=g.useContext(Ux);if(!e&&t===void 0)throw Error(S(27));return t}var Gx=class extends re{setState(e){}update(e){}set(e,t){}notifyAll(){}},Kx={...cs,modal:e=>e.modal,nested:e=>e.nested,nestedOpenDialogCount:e=>e.nestedOpenDialogCount,nestedOpenDrawerCount:e=>e.nestedOpenDrawerCount,disablePointerDismissal:e=>e.disablePointerDismissal,openMethod:e=>e.openMethod,descriptionElementId:e=>e.descriptionElementId,titleElementId:e=>e.titleElementId,viewportElement:e=>e.viewportElement,role:e=>e.role},qx=class extends re{constructor(e,t,n){let r=new ts,i=Yx(e,r,t,n);super(i,Xx(r),Kx)}setOpen=(e,t)=>{t.preventUnmountOnClose=()=>{this.set(`preventUnmountingOnClose`,!0)},!e&&t.trigger==null&&this.state.activeTriggerId!=null&&(t.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,t),!t.isCanceled&&(this.state.floatingRootContext.dispatchOpenChange(e,t),this.update(Xo(this.state,e,t.trigger)))}};function Jx(){let e=new ts;return new Gx(Object.freeze(Yx(void 0,e)),Object.freeze(Xx(e)),Kx)}function Yx(e,t,n,r=!1){return{...ns(t,n,r),modal:!0,disablePointerDismissal:!1,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,nestedOpenDrawerCount:0,role:`dialog`,...e}}function Xx(e){return{popupRef:g.createRef(),backdropRef:g.createRef(),internalBackdropRef:g.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:e,onOpenChange:void 0,onOpenChangeComplete:void 0}}function Zx(e,t){let{children:n,open:r,defaultOpen:i=!1,onOpenChange:a,onOpenChangeComplete:o,disablePointerDismissal:s=!1,modal:c=!0,actionsRef:l,handle:u,triggerId:d,defaultTriggerId:f=null}=t,p=e===`drawer`,m=e===`alert-dialog`,h=m?!0:c,_=m||s,v=m?`alertdialog`:`dialog`,y=Wx(!0),b={modal:h,disablePointerDismissal:_,nested:y!=null,role:v},x=Jo((e,t)=>new qx({open:i,openProp:r,activeTriggerId:f,triggerIdProp:d,...b},e,t),!0);x.useControlledProp(`openProp`,r),x.useControlledProp(`triggerIdProp`,d),x.useSyncedValues(b),x.useContextCallback(`onOpenChange`,a),x.useContextCallback(`onOpenChangeComplete`,o);let S=x.useState(`open`),C=x.useState(`mounted`),w=x.useState(`payload`);es(x,S),Zo(x);let{forceUnmount:T}=Qo(S,x);g.useImperativeHandle(l,()=>({unmount:T,close:()=>x.setOpen(!1,Ji(Ki))}),[T,x]);let E=S||C;return(0,J.jsxs)(Ux.Provider,{value:x,children:[u&&(0,J.jsx)(Yo,{handle:u,store:x}),E&&(0,J.jsx)(Hx,{store:x,parentContext:y?.context,isDrawer:p}),typeof n==`function`?n({payload:w}):n]})}function Qx(e){return Zx(`alert-dialog`,e)}var $x=g.forwardRef(function(e,t){let{render:n,className:r,style:i,forceRender:a=!1,...o}=e,s=Wx(),c=s.useState(`open`),l=s.useState(`nested`),u=s.useState(`mounted`);return Ar(`div`,e,{state:{open:c,transitionStatus:s.useState(`transitionStatus`)},ref:[s.context.backdropRef,t],stateAttributesMapping:At,props:[{role:`presentation`,hidden:!u,style:{userSelect:`none`,WebkitUserSelect:`none`}},o],enabled:a||!l})}),eS=g.forwardRef(function(e,t){let{render:n,className:r,style:i,disabled:a=!1,nativeButton:o=!0,...s}=e,c=Wx(),l=c.useState(`open`),{getButtonProps:u,buttonRef:d}=Mi({disabled:a,native:o}),f={disabled:a};function p(e){l&&c.setOpen(!1,Ji(Vi,e.nativeEvent))}return Ar(`button`,e,{state:f,ref:[t,d],props:[{onClick:p},s,u]})}),tS=g.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,...o}=e,s=Wx(),c=Rb(a);return s.useSyncedValueWithCleanup(`descriptionElementId`,c),Ar(`p`,e,{ref:t,props:[{id:c},o]})}),nS=g.createContext(void 0);function rS(){let e=g.useContext(nS);if(e===void 0)throw Error(S(26));return e}var iS=`ArrowUp`,aS=`ArrowDown`,oS=`ArrowLeft`,sS=`ArrowRight`,cS=new Set([iS,aS,oS,sS,`Home`,`End`]),lS=`Shift`,uS=[lS,`Control`,`Alt`,`Meta`];function dS(e){return fe(e)&&e.tagName===`INPUT`}function fS(e){return!!(dS(e)&&e.selectionStart!=null||fe(e)&&e.tagName===`TEXTAREA`)}function pS(e,t,n,r){if(!e||!t||!t.scrollTo)return;let i=e.scrollLeft,a=e.scrollTop,o=e.clientWidth<e.scrollWidth,s=e.clientHeight<e.scrollHeight;if(o&&r!==`vertical`){let r=mS(e,t,`left`),a=hS(e),o=hS(t);n===`ltr`&&(r+t.offsetWidth+o.scrollMarginRight>e.scrollLeft+e.clientWidth-a.scrollPaddingRight?i=r+t.offsetWidth+o.scrollMarginRight-e.clientWidth+a.scrollPaddingRight:r-o.scrollMarginLeft<e.scrollLeft+a.scrollPaddingLeft&&(i=r-o.scrollMarginLeft-a.scrollPaddingLeft)),n===`rtl`&&(r-o.scrollMarginLeft<e.scrollLeft+a.scrollPaddingLeft?i=r-o.scrollMarginLeft-a.scrollPaddingLeft:r+t.offsetWidth+o.scrollMarginRight>e.scrollLeft+e.clientWidth-a.scrollPaddingRight&&(i=r+t.offsetWidth+o.scrollMarginRight-e.clientWidth+a.scrollPaddingRight))}if(s&&r!==`horizontal`){let n=mS(e,t,`top`),r=hS(e),i=hS(t);n-i.scrollMarginTop<e.scrollTop+r.scrollPaddingTop?a=n-i.scrollMarginTop-r.scrollPaddingTop:n+t.offsetHeight+i.scrollMarginBottom>e.scrollTop+e.clientHeight-r.scrollPaddingBottom&&(a=n+t.offsetHeight+i.scrollMarginBottom-e.clientHeight+r.scrollPaddingBottom)}e.scrollTo({left:i,top:a,behavior:`auto`})}function mS(e,t,n){let r=n===`left`?`offsetLeft`:`offsetTop`,i=0;for(;t.offsetParent&&(i+=t[r],t.offsetParent!==e);)t=t.offsetParent;return i}function hS(e){let t=getComputedStyle(e);return{scrollMarginTop:parseFloat(t.scrollMarginTop)||0,scrollMarginRight:parseFloat(t.scrollMarginRight)||0,scrollMarginBottom:parseFloat(t.scrollMarginBottom)||0,scrollMarginLeft:parseFloat(t.scrollMarginLeft)||0,scrollPaddingTop:parseFloat(t.scrollPaddingTop)||0,scrollPaddingRight:parseFloat(t.scrollPaddingRight)||0,scrollPaddingBottom:parseFloat(t.scrollPaddingBottom)||0,scrollPaddingLeft:parseFloat(t.scrollPaddingLeft)||0}}var gS=`--nested-dialogs`,_S=`data-nested-dialog-open`,vS={...kt,...gt,nestedDialogOpen(e){return e?{[_S]:``}:null}},yS=g.forwardRef(function(e,t){let{render:n,className:r,style:i,finalFocus:a,initialFocus:o,...s}=e,c=Wx(),l=c.useState(`descriptionElementId`),u=c.useState(`disablePointerDismissal`),d=c.useState(`floatingRootContext`),f=c.useState(`popupProps`),p=c.useState(`modal`),m=c.useState(`mounted`),h=c.useState(`nested`),g=c.useState(`nestedOpenDialogCount`),_=c.useState(`open`),v=c.useState(`openMethod`),y=c.useState(`titleElementId`),b=c.useState(`transitionStatus`),x=c.useState(`role`),S=d.useState(`floatingId`);rS(),qr({open:_,ref:c.context.popupRef,onComplete(){_&&c.context.onOpenChangeComplete?.(!0)}});let C=o===void 0?qo(c.context.popupRef):o,w=g>0,T=c.useStateSetter(`popupElement`),E=Ar(`div`,e,{state:{open:_,nested:h,transitionStatus:b,nestedDialogOpen:w},props:[f,{id:S,"aria-labelledby":y,"aria-describedby":l,role:x,...Ko,hidden:!m,onKeyDown(e){cS.has(e.key)&&e.stopPropagation()},style:{[gS]:g}},s],ref:[t,c.context.popupRef,T],stateAttributesMapping:vS});return(0,J.jsx)(Ma,{context:d,openInteractionType:v,disabled:!m,closeOnFocusOut:!u,initialFocus:C,returnFocus:a,modal:p!==!1,restoreFocus:`popup`,children:E})}),bS=g.forwardRef(function(e,t){let{cutout:n,...r}=e,i;if(n){let e=n.getBoundingClientRect();i=`polygon(0% 0%,100% 0%,100% 100%,0% 100%,0% 0%,${e.left}px ${e.top}px,${e.left}px ${e.bottom}px,${e.right}px ${e.bottom}px,${e.right}px ${e.top}px,${e.left}px ${e.top}px)`}return(0,J.jsx)(`div`,{ref:t,role:`presentation`,"data-base-ui-inert":``,...r,style:{position:`fixed`,inset:0,userSelect:`none`,WebkitUserSelect:`none`,clipPath:i}})}),xS=g.forwardRef(function(e,t){let{keepMounted:n=!1,...r}=e,i=Wx(),a=i.useState(`mounted`),o=i.useState(`modal`),s=i.useState(`open`);return a||n?(0,J.jsx)(nS.Provider,{value:n,children:(0,J.jsxs)(ea,{ref:t,...r,children:[a&&o===!0&&(0,J.jsx)(bS,{ref:i.context.internalBackdropRef,inert:zr(!s)}),e.children]})}):null}),SS=g.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,...o}=e,s=Wx(),c=Rb(a);return s.useSyncedValueWithCleanup(`titleElementId`,c),Ar(`h2`,e,{ref:t,props:[{id:c},o]})});function CS(e){let t=g.useRef(``),n=g.useCallback(n=>{n.defaultPrevented||(t.current=n.pointerType,e(n,n.pointerType))},[e]);return{onClick:g.useCallback(n=>{if(n.detail===0){e(n,`keyboard`);return}`pointerType`in n?e(n,n.pointerType):e(n,t.current),t.current=``},[e]),onPointerDown:n}}function wS(e,t){let{onClick:n,onPointerDown:r}=CS(G((n,r)=>{(typeof e==`function`?e():e)||t(r||(Xe?`touch`:``))}));return g.useMemo(()=>({onClick:n,onPointerDown:r}),[n,r])}function TS(e){let[t,n]=g.useState(null),r=wS(e,n);return sx(e,t=>{t&&!e&&n(null)}),g.useMemo(()=>({openMethod:t,triggerProps:r}),[t,r])}var ES=g.forwardRef(function(e,t){let{render:n,className:r,style:i,children:a,...o}=e,s=rS(),c=Wx(),l=c.useState(`open`),u=c.useState(`nested`),d=c.useState(`transitionStatus`),f=c.useState(`nestedOpenDialogCount`),p=c.useState(`mounted`),m=c.useStateSetter(`viewportElement`);return Ar(`div`,e,{enabled:s||p,state:{open:l,nested:u,transitionStatus:d,nestedDialogOpen:f>0},ref:[t,m],stateAttributesMapping:vS,props:[{role:`presentation`,hidden:!p,style:{pointerEvents:l?void 0:`none`},children:a},o]})}),DS=class extends Vo{constructor(){super(Jx(),`Dialog`,!1)}open(e){this.openByTrigger(e)}openWithPayload(e){let t=this.attachedStore;t!==null&&(t.set(`payload`,e),t.setOpen(!0,Ji(Ki)))}close(){this.closePopup()}get isOpen(){return this.attachedStore?.select(`open`)??!1}};function OS(){return new DS}var kS=class extends DS{};function AS(){return new kS}var jS=[`container`,`keepMounted`];function MS(e){let{portalProps:t,...n}=e,r={...t},i={};for(let e of Object.keys(n)){let t=n[e];jS.includes(e)?t!==void 0&&(r[e]=t):i[e]=t}return{portal:r,popup:i}}var NS=Object.assign(function(e){return(0,J.jsx)(Qx,{...e})},{createHandle:AS});function PS({className:e,children:t,backdrop:n=!0,frame:r=!0,backdropProps:i,viewportProps:a,...o}){let{portal:s,popup:c}=MS(o),l=i?.forceRender===!0,u=r&&n;return(0,J.jsxs)(xS,{...s,children:[n&&(0,J.jsx)($x,{"data-slot":`alert-dialog-backdrop`,...i,className:Z(`fixed inset-0 z-50 bg-black/30 backdrop-blur-sm supports-[-webkit-touch-callout:none]:absolute`,`motion-safe:transition-opacity motion-safe:duration-250 motion-safe:ease-out`,`data-ending-style:motion-safe:opacity-0 data-starting-style:motion-safe:opacity-0`,i?.className)}),(0,J.jsx)(ES,{"data-slot":`alert-dialog-viewport`,...a,className:Z(`fixed inset-0 z-50 flex items-center justify-center overflow-hidden p-4`,a?.className),children:(0,J.jsx)(yS,{"data-slot":`alert-dialog-popup`,...u?{"data-frame":``}:{},className:Z(`group/alert-dialog-popup relative flex max-h-full min-h-0 w-100 max-w-full flex-col`,`rounded-2xl border`,u?Z(`border-white/15 bg-white/10 p-1.5 backdrop-blur-sm`,!l&&`data-nested:border-border-overlay data-nested:bg-background data-nested:p-0 data-nested:shadow-2xl data-nested:backdrop-blur-none`):`bg-background border-border-overlay`,!u&&`shadow-2xl`,`isolate transform-gpu outline-none`,`motion-safe:transition-[opacity,scale] motion-safe:duration-250 motion-safe:ease-[cubic-bezier(0.175,0.885,0.32,1.5)]`,`data-starting-style:motion-safe:scale-95 data-starting-style:motion-safe:opacity-0`,`data-ending-style:motion-safe:scale-95 data-ending-style:motion-safe:opacity-0 data-ending-style:motion-safe:duration-100 data-ending-style:motion-safe:ease-out`,e),...c,children:(0,J.jsx)(`div`,{"data-slot":`alert-dialog-content`,className:Z(`flex min-h-0 flex-col overflow-hidden not-has-[>[data-slot=alert-dialog-footer]]:pb-6 not-has-[>[data-slot=alert-dialog-header]]:pt-6 [&>[data-slot=alert-dialog-header]+[data-slot=alert-dialog-footer]]:pt-0`,u&&Z(`bg-background rounded-[calc(var(--radius-2xl)*5/6)]`,!l&&`group-data-nested/alert-dialog-popup:rounded-none group-data-nested/alert-dialog-popup:bg-transparent`)),children:t})})})]})}function FS({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`alert-dialog-header`,className:Z(`flex shrink-0 flex-col gap-2 p-6`,e),...t})}function IS({className:e,...t}){return(0,J.jsx)(SS,{"data-slot":`alert-dialog-title`,className:Z(`text-foreground-intense text-xl font-semibold`,e),...t})}function LS({className:e,...t}){return(0,J.jsx)(tS,{"data-slot":`alert-dialog-description`,className:Z(`text-foreground-muted text-sm`,e),...t})}function RS({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`alert-dialog-body`,className:Z(`min-h-0 flex-1 px-6`,e),...t})}function zS({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`alert-dialog-footer`,className:Z(`flex flex-col-reverse gap-2 p-6 sm:flex-row sm:justify-end`,e),...t})}var BS=class extends Error{code;status;constructor(e,t,n){super(e),this.name=`ApiError`,this.code=t,this.status=n}};async function VS(e){let t=null;try{t=await e.json()}catch{t=null}let n=t?.error;if(typeof n==`string`&&n)return new BS(n,`http_${e.status}`,e.status);if(n&&typeof n==`object`){let t=n,r=typeof t.code==`string`&&t.code?t.code:`http_${e.status}`;return new BS(typeof t.message==`string`&&t.message?t.message:$(`panel.net.requestFailed`,{status:e.status}),r,e.status)}return new BS($(`panel.net.requestFailed`,{status:e.status}),`http_${e.status}`,e.status)}async function HS(e){let t=await fetch(e,{headers:{accept:`application/json`}});if(!t.ok)throw await VS(t);return await t.json()}async function US(e,t){let n=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`,accept:`application/json`},body:JSON.stringify(t??{})});if(!n.ok)throw await VS(n);return await n.json()}function WS(e){return e instanceof BS?e.message:e instanceof Error?e.message||$(`panel.net.requestFailedNoStatus`):String(e)}var GS={ok:4e3,soft:6e3,error:9e3};function KS(){let e=(0,g.useRef)(Ul());return e.current=Ul(),(0,g.useCallback)((t,n)=>{e.current.add({title:n,type:t,timeout:GS[t],priority:t===`error`?`high`:`low`})},[])}function qS(e,t){if(!e)return``;let n=Math.max(0,t-e);if(n<6e4)return $(`panel.devices.justNow`);let r=Math.floor(n/6e4);if(r<60)return $(`panel.devices.minutesAgo`,{count:r});let i=Math.floor(r/60);return i<24?$(`panel.devices.hoursAgo`,{count:i}):$(`panel.devices.daysAgo`,{count:Math.floor(i/24)})}function JS(e,t){return e?YS(e,t)?$(`panel.devices.online`):qS(e,t):$(`panel.devices.noRecord`)}function YS(e,t){return e>0&&t-e<=3e5}function XS(e){return{ios:`iOS`,android:`Android`,linux:`Linux`,darwin:`macOS`,win32:`Windows`}[e]??(e||$(`panel.devices.unknownPlatform`))}function ZS(e){return $(e===`relay`?`panel.devices.channelRelay`:e===`lan`?`panel.devices.channelLan`:`panel.devices.channelUnknown`)}function QS(){let e=KS(),[t,n]=(0,g.useState)(null),[r,i]=(0,g.useState)(null),[a,o]=(0,g.useState)(!1),s=(0,g.useCallback)(async()=>{try{n(await HS(`/api/relay/devices`))}catch{}},[]);(0,g.useEffect)(()=>{let e=()=>{document.hidden||s()};e();let t=window.setInterval(e,3e3);return document.addEventListener(`visibilitychange`,e),()=>{window.clearInterval(t),document.removeEventListener(`visibilitychange`,e)}},[s]);let c=t?.devices??[],l=t?.serverNow??0,u=e=>e?.name||$(`panel.devices.unknown`);async function d(t){o(!0);try{let n=await US(`/api/relay/devices/revoke`,{deviceId:t.deviceId});i(null),await s(),e(`soft`,$(n.closed>0?`panel.devices.unbindDoneClosed`:`panel.devices.unbindDone`,{name:u(t),count:n.revoked,closed:n.closed}))}catch(t){e(`error`,$(`panel.devices.unbindFailed`,{message:WS(t)}))}finally{o(!1)}}return c.length===0?null:(0,J.jsxs)(Pb,{frame:`solid`,children:[(0,J.jsx)(Fb,{children:(0,J.jsxs)(Ib,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`span`,{children:$(`panel.devices.title`)}),(0,J.jsx)(Tb,{variant:`secondary`,size:`sm`,children:c.length})]})}),(0,J.jsx)(`div`,{className:`mt-1`,children:c.map(e=>{let t=YS(e.lastSeenAt,l);return(0,J.jsxs)(`div`,{className:`flex items-start justify-between gap-3 border-b border-border-muted py-3 last:border-b-0`,children:[(0,J.jsxs)(`div`,{className:`min-w-0`,children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-1`,children:[(0,J.jsx)(`span`,{className:`text-sm text-foreground-strong`,children:u(e)}),e.legacy?(0,J.jsx)(Tb,{variant:`warning`,size:`xs`,children:$(`panel.devices.legacy`)}):null,(0,J.jsxs)(`span`,{className:`text-xs text-foreground-muted`,children:[XS(e.platform),e.osVersion?` ${e.osVersion}`:``,e.appVersion?$(`panel.devices.appVersion`,{version:e.appVersion}):``]})]}),(0,J.jsxs)(`div`,{className:`mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-foreground-muted`,children:[(0,J.jsx)(`span`,{children:$(`panel.devices.boundAt`,{time:qS(e.boundAt,l)||`—`})}),(0,J.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[t?(0,J.jsx)(wx,{tone:`ok`}):null,JS(e.lastSeenAt,l)]}),(0,J.jsx)(`span`,{children:ZS(e.lastChannel)}),(0,J.jsx)(`span`,{children:e.encrypted?$(`panel.devices.encrypted`):$(`panel.devices.plain`)})]})]}),(0,J.jsx)(Ob,{variant:`outline`,size:`sm`,onClick:()=>i(e),children:$(`panel.devices.unbind`)})]},e.deviceId)})}),(0,J.jsx)(NS,{open:r!==null,onOpenChange:e=>{!e&&!a&&i(null)},children:(0,J.jsxs)(PS,{children:[(0,J.jsx)(FS,{children:(0,J.jsx)(IS,{children:$(`panel.devices.unbindTitle`)})}),(0,J.jsxs)(RS,{className:`flex flex-col gap-2 text-sm`,children:[(0,J.jsx)(LS,{children:$(`panel.devices.unbindConfirm`,{name:u(r)})}),(0,J.jsx)(`p`,{className:`text-foreground-muted`,children:$(r?.legacy?`panel.devices.effectLegacy`:`panel.devices.effectIdentity`)})]}),(0,J.jsxs)(zS,{className:`flex justify-end gap-2`,children:[(0,J.jsx)(Ob,{variant:`outline`,disabled:a,onClick:()=>i(null),children:$(`panel.devices.cancel`)}),(0,J.jsx)(Ob,{variant:`destructive`,disabled:a,onClick:()=>{r&&d(r)},children:a?(0,J.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,J.jsx)($y,{}),$(`panel.devices.unbinding`)]}):$(`panel.devices.unbind`)})]})]})})]})}var $S=F(function(e){return Zx(`dialog`,e)}),eC=Object.assign(function(e){return(0,J.jsx)($S,{...e})},{createHandle:OS});function tC({className:e,children:t,closeButton:n=!0,closeLabel:r=`Close`,backdrop:i=!0,frame:a=!0,backdropProps:o,viewportProps:s,...c}){let l=a&&i,{portal:u,popup:d}=MS(c);return(0,J.jsxs)(xS,{...u,children:[i&&(0,J.jsx)($x,{"data-slot":`dialog-backdrop`,...o,className:Z(`fixed inset-0 z-50 bg-black/30 backdrop-blur-sm supports-[-webkit-touch-callout:none]:absolute`,`motion-safe:transition-opacity motion-safe:duration-250 motion-safe:ease-out`,`data-ending-style:motion-safe:opacity-0 data-starting-style:motion-safe:opacity-0`,o?.className)}),(0,J.jsx)(ES,{"data-slot":`dialog-viewport`,...s,className:Z(`fixed inset-0 z-50 flex items-center justify-center overflow-hidden p-4`,s?.className),children:(0,J.jsx)(yS,{"data-slot":`dialog-popup`,...l?{"data-frame":``}:{},className:Z(`group/dialog-popup relative flex max-h-full min-h-0 w-150 max-w-full flex-col`,`rounded-2xl border`,l?`border-white/15 bg-white/10 p-1.5 backdrop-blur-sm`:`bg-background border-border-overlay`,!l&&`shadow-2xl`,`isolate transform-gpu outline-none`,`motion-safe:transition-[opacity,scale] motion-safe:duration-250 motion-safe:ease-[cubic-bezier(0.175,0.885,0.32,1.5)]`,`data-starting-style:motion-safe:scale-95 data-starting-style:motion-safe:opacity-0`,`data-ending-style:motion-safe:scale-95 data-ending-style:motion-safe:opacity-0 data-ending-style:motion-safe:duration-100 data-ending-style:motion-safe:ease-out`,`data-nested-dialog-open:pointer-events-none data-nested-dialog-open:scale-95 data-nested-dialog-open:opacity-0`,e),...d,children:(0,J.jsxs)(`div`,{"data-slot":`dialog-content`,className:Z(`relative flex min-h-0 flex-col overflow-hidden not-has-[>[data-slot=dialog-footer]]:pb-6 not-has-[>[data-slot=dialog-header]]:pt-6 [&>[data-slot=dialog-header]+[data-slot=dialog-footer]]:pt-0`,l&&`bg-background rounded-[calc(var(--radius-2xl)*5/6)]`),children:[t,n&&(0,J.jsx)(eS,{"aria-label":r,"data-slot":`dialog-close-button`,className:Z(wl({variant:`outline`,size:`icon-sm`}),`absolute inset-e-3 top-3 z-10`),children:(0,J.jsx)(oC,{})})]})})})]})}function nC({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`dialog-header`,className:Z(`flex shrink-0 flex-col gap-2 p-6`,e),...t})}function rC({className:e,...t}){return(0,J.jsx)(SS,{"data-slot":`dialog-title`,className:Z(`text-foreground-intense text-2xl font-semibold`,e),...t})}function iC({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`dialog-body`,className:Z(`min-h-0 flex-1 px-6`,e),...t})}function aC({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`dialog-footer`,className:Z(`flex flex-col-reverse gap-2 p-6 sm:flex-row sm:justify-end`,e),...t})}function oC(e){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 16 16`,fill:`currentColor`,"aria-hidden":`true`,...e,children:(0,J.jsx)(`path`,{d:`M11.594 3.594c.225-.225.588-.225.813 0s.225.588 0 .812L8.813 8l3.594 3.594c.225.225.225.588 0 .813s-.588.225-.812 0L8 8.812l-3.594 3.594c-.225.225-.588.225-.812 0s-.225-.588 0-.812L7.188 8 3.594 4.406c-.225-.225-.225-.588 0-.812s.588-.225.813 0L8 7.187l3.594-3.594z`})})}var sC=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxgAAAMYAQAAAABgBnzJAAAGdElEQVR42u2dXY7yOBBFbyY8IoWlsICWiPQtYFY8UtCwAJYCEo8deR4gxPFPOgE62MzJQ0Q3kNOmnL5UuVxVGP368ZdgwIABAwYMGDBg5MjYF86xevhywUu987M6F7V0LupidS5qSVKx6k/9s847mFcwYMCA8cMRk4rKdCfdIhHGPvXPDt+BPV7CKI11NE9dMHCpN+t5sRqc7N91om4/y30OAwYMGE/r+VDDPXl3XoI9XsnYP+uae076KoXPytHu3it3PPXBE8wrGDBgwHiFng+9ck/lrSewB4yJDEesPVHvg+7E22HAgAHjGT3vDkesTUzjibfDmLx+7i+Y96LuRSTQcxgwYMB43j8PL5iHHXL0/KX22JmXXdO9VIL+uZct10k+9zkMGDBg/Ip/7mfLSQZ7vNoebfGyCwYulUJ++8wT8woGDBgwns5vn3XCHk8exf+hrsEgKW7kR/QcBgwYMNAPGG9nOOvivkQ7YXUvq90X+sHedewBAwYMGOg5jIUYA+22ve1IWD3sswerzWAPGDBgwEDPYSzpnw+S1x1h9orK+JF3L+iOfw4DBgwY6DmMBfU8ugXNqejqFIQLP3I0HnvAgAEDBnoOYyk99/ehhfamOYF4T8/xz2HAgAEDPYeh966fe3vNf6jjai+Ye+lxVgYd9oABAwYM9BzGQuvn/rp4OAavSXXkBu469oABAwYM9BzG4no+Vpf9HOs8M7KbLcHP6ryR2lX2Nm83/TnncRxuVsl8HG034zd5j+Nwv03yHkcdeJShnp/76VR+Z2yPo6TKmJOkNjl7yEw+rsO4DmRnZhxLjeNk/1kq+x9P2vXPft8H3Q3o9hKVxpjbqftx8N605tVFqq6PTtIl3/vjKG2vj6qZN0ha46hVNreHTd76se4ebOcpSFLjaO/TSlpf/wnnao/7dCoz9s/PG0vE9/UcRU/X59zme58f+9tcWs/6x7vgOEKNzH/sgzp0yOPtWZKyR21PpvJzYjJ1tuNoPjBG1hBPfC+jzaPe66Cb+Wjp9ttx+tt+XeCVVvnXlL6XtCsZ5u6Ceq5Am/O4nt9jvGN73TJYPz+cP8Pmda56XnIPps04ZjuOOg89D7U5t6SvqX/ukx5p2ZJgvL3/vnv5iPvjK+V6MtGtatcQiWWB859TO2XpPEk9t766H5uqqfOcV2v7H9YfaXvMcxyldaOf7aB1fvf55R4iXUvltqizHEdzv0E22kr6Z7KkpzWO+6JH21nnkpieV7Ee5oM+K+uRFmwa7YmeqA5euvBVm+W8Kp2//DjZJ1k+3h7dV3690ZtDIRVjnVNDu96S6D84uNHbWoW0TnFdbdb33YPt4taTvywmd59fp0vdfG0kqWoy6msZOnbNSmrLU+b+x1Fqpcs6dz/qIjUbHU+55l810q655l6dZP5NK/9qRl5f0afzzYu+JzevvtJd55SVBeeks90e9fOqtHP8qmHKXJ8U56TRJZcPp+3XZ8RFJ+seMWSxfv7oG7cfMY7tHIukvF/tuGXfHYxp/nm0I+qkejIKlJJh/zkMGDBgoIMwlq736ihxOG9disfbw11XsQcMGDBgoOcwlu6vNtJuLdol1W147mx4wx4wYMCAgZ7DeE99uEgR95CKO0+8Jx8OBgwYMNBz7IGe+6Ve/YXwUPlXb5ubUwUe/xwGDBgw0HMYy+8/9/PcxtfKbSfd2XWedP12GDBgwEDPYbyasS/6Y/XWeLvjXo80T3NS5qL14bA5DBgwYPyenu8tn2tY3R17vIdR9oUDkhmHHzj3MuOcNDr0HAYMGDD0RJ2iynhlYO1CsE5d2OgFsMcDDNuzDrjX85z0VVqflVMfLuKLRxLgyG+HAQMGjAf1/C7bVbCmu1/gVQo0dMEecxmlU5fv4WNnvpPTc8cDd75xTCg5072DeQUDBgwYs/zzcAc180M/Fuu32OMBe9yWL+Z1mh8ebZHeZ+WsqQ889fAietzLZ17BgAEDxkQ9r0zEU/c7uBjto98KsMfv9mmIueYpflahlPWo9+5vPR/E5ZlXMGDAgDFHz6ON1/y+qpFeq9gDhrzaMeOL46GFdfafw4ABA8ZD/mCnyaOL46GFdTeXDns8YI+d+fDPypHtaS8euPDMKxgwYMCYE991g+4TX1yh54/bI7bynf9nFaod44Tap1abYV7BgAEDxvx4eyjUHorBB+Py2EPU94EBAwYMGDBgwIDx1PEfwPfvNJna2O0AAAAASUVORK5CYII=`,cC=()=>$(`panel.links.wechatQrAlt`);function lC(){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,className:`stroke-0`,fill:`currentColor`,"aria-hidden":`true`,children:(0,J.jsx)(`path`,{d:`M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z`})})}function uC(){let[e,t]=(0,g.useState)(!1);return(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`div`,{className:`pointer-events-none fixed end-6 bottom-6 z-40`,children:(0,J.jsxs)(Ob,{variant:`primary`,size:`lg`,className:`pointer-events-auto rounded-full shadow-lg`,onClick:()=>t(!0),children:[(0,J.jsx)(lC,{}),$(`panel.links.joinGroup`)]})}),(0,J.jsx)(eC,{open:e,onOpenChange:t,children:(0,J.jsxs)(tC,{className:`max-w-sm`,children:[(0,J.jsx)(rC,{className:`sr-only`,children:$(`panel.links.joinGroup`)}),(0,J.jsx)(iC,{className:`flex justify-center`,children:(0,J.jsx)(`img`,{src:sC,alt:cC(),className:`w-full rounded-md`})})]})})]})}var dC=g.createContext(void 0);function fC(e=!1){let t=g.useContext(dC);if(!t&&!e)throw Error(S(86));return t}var pC=function(e){let t=Rb(),[n,r]=g.useState(t),[i,a]=g.useState(),[o,s]=g.useState([]),c=n===void 0?t:n,l=y(()=>new Map),{messageIds:u}=nx(),d=G((e,t)=>{let n=l.current;t===void 0?n.delete(e):n.set(e,t),r(e=>{if(n.size===0)return e;let t;for(let r of n.values()){if(r===e)return e;t===void 0&&(t=r)}return t})}),f=G(()=>{l.current.size===0&&r(t)}),p=g.useCallback(e=>{let t=e[`aria-describedby`]?e[`aria-describedby`].split(` `):[];return t.push(...u,...o),{...e,"aria-describedby":Array.from(new Set(t)).join(` `)||void 0}},[u,o]),m=g.useMemo(()=>({controlId:c,registerControlId:d,resetControlId:f,labelId:i,setLabelId:a,messageIds:o,setMessageIds:s,getDescriptionProps:p}),[c,d,f,i,a,o,s,p]);return(0,J.jsx)(tx.Provider,{value:m,children:e.children})};function mC(e,t){let n=Rb(e);return b(()=>(t(n),()=>{t(e=>e===n?void 0:e)}),[n,t]),n}function hC(e={}){let{id:t,fallbackControlId:n,native:r=!1,setLabelId:i,focusControl:a}=e,{controlId:o,setLabelId:s}=nx(),c=mC(t,G(e=>{s(e),i?.(e)})),l=o??n;function u(e){if(a){a(e,l);return}if(!l)return;let t=Me(e.currentTarget).getElementById(l);fe(t)&&gC(t)}function d(e){ot(e.nativeEvent)?.closest(`button,input,select,textarea`)||(!e.defaultPrevented&&e.detail>1&&e.preventDefault(),!r&&u(e))}return r?{id:c,htmlFor:l,onMouseDown:d}:{id:c,onClick:d,onPointerDown(e){e.preventDefault()}}}function gC(e){e.focus({focusVisible:!0})}function _C(e,t){return{...e,state:{...e.state,valid:!t&&e.state.valid}}}var vC=Object.keys(Ub);function yC(e,t){return e.matches(`:disabled`)?!1:!t||e.form===t||e.form===null&&!e.hasAttribute(`form`)}function bC(e,t){let n=null;for(let r of e.keys())if(yC(r,t)){if(!r.validity.valid)return r;n??=r}return n}function xC(e){return{...Ub,valid:!e,customError:e}}function SC(e){return e&&e.validationMessage?[e.validationMessage]:[]}function CC(e){let{elementRef:t,formRef:n}=ex(),{setValidityData:r,validate:i,validityData:a,validationDebounceTime:o,invalid:s,markedDirtyRef:c,state:l,shouldValidateOnChange:u,validationMode:d,registeredFieldIdRef:f}=e,{controlId:p,getDescriptionProps:m}=nx(),_=Be(),v=g.useRef(null),b=y(()=>new Map).current,x=g.useRef(0),S=g.useRef(null),C=g.useCallback((e,t)=>(b.set(e,t),()=>{b.delete(e)}),[b]),w=G(()=>{let e=bC(b,t.current);return e&&b.get(e)?.controlRef.current||null}),T=G(async(e,o=!1)=>{x.current+=1;let m=x.current;function h(e,t=s){let r=f.current??p;if(r==null)return;let i=n.current.fields.get(r);if(!i)return;let a=_C(e,t);n.current.fields.set(r,{...i,validityData:a})}function g(t,n){let r=t.valid===!1?n:[];return{value:e,state:t,error:r[0]??``,errors:r,initialValue:a.initialValue}}function y(e,t){let n=e.validity.customError?e.validationMessage:``,r=t.replace(/\r\n?/g,`
24
24
  `);e.setCustomValidity(r),S.current=[e,r,n]}function C(){let e=S.current;S.current=null,e&&(!e[0].willValidate||e[0].validationMessage===e[1])&&e[0].setCustomValidity(e[2])}function w(e,t,n){let i=g(e,t);h(i,n),r(i)}function T(e){let t=vC.reduce((t,n)=>(t[n]=e.validity[n],t),{}),n=!1;for(let e of vC)if(e!==`valid`){if(e===`valueMissing`&&t[e])n=!0;else if(t[e])return t}return n&&!c.current&&(t.valid=!0,t.valueMissing=!1),t}function E(){return b.size>0?bC(b,t.current):v.current}let D=E();function O(){return D=E(),D?.willValidate?T(D):xC(!1)}if(o){if(l.valid!==!1||!D)return;if(!D.validity.valueMissing){C();let e=E(),t=e?.validity.customError?SC(e):[];w(xC(t.length>0),t,!1);return}for(let e of vC)if(e!==`valid`&&e!==`valueMissing`&&e!==`customError`&&D.validity[e])return}_.clear(),C();let k=O(),A=SC(D),j=u();if(A.length===0||j){let t=Array.from(n.current.fields.values()).reduce((e,t)=>(t.name&&(e[t.name]=t.getValue()),e),{}),r=i(e,t),o;if(typeof r==`object`&&r&&`then`in r){if(k.valid===!1?w(k,A):(d===`onSubmit`||!a.state.customError)&&(k.valid=null,w(k,A)),o=await r,m!==x.current)return;k=O()}else o=r;A=o?[].concat(o).filter(Boolean):[],A.length>0?(k.valid=!1,k.customError=!0,D?.willValidate&&y(D,A.join(`
25
25
  `))):A=SC(D)}w(k,A)}),E=G((e,t=!1)=>{if(_.clear(),x.current+=1,t)return;let n=u();n&&e!==``&&o?_.start(o,()=>{T(e)}):T(e,!n)}),D=g.useCallback((e,t={})=>gr(m(t),l.valid===!1&&!l.disabled&&!e?{"aria-invalid":!0}:h),[m,l.disabled,l.valid]);return g.useMemo(()=>({getValidationProps:D,inputRef:v,registeredInputs:b,registerInput:C,getInputControl:w,commit:T,change:E}),[D,b,C,w,T,E])}function wC(e){let{change:t,commit:n,invalid:r,markedDirtyRef:i,name:a,setRegisteredFieldName:o,registeredFieldIdRef:s,setValidityData:c,validityData:l}=e,{formRef:u}=ex(),d=g.useRef(null),f=g.useRef(null),p=g.useRef(!1),m=G(()=>{let e=f.current;if(e)return e.getValue?e.getValue():e.value});function h(e){return e.value===void 0?m():e.value}let _=G(()=>{let e=f.current;if(i.current=!0,!e){n(l.value);return}n(h(e))});function v(){let e=f.current;e&&e.id&&u.current.fields.set(e.id,{getValue:m,name:a??e.name,controlRef:e.controlRef,validityData:_C(l,r),validate:_})}function y(e=f.current?.id){e&&u.current.fields.delete(e)}function x(e){if(p.current)return;p.current=!0;let t=h(e);c(e=>e.initialValue===t?e:{...e,initialValue:t})}return b(()=>{let e=f.current;e&&e.id&&(o(a?void 0:e.name),u.current.fields.set(e.id,{getValue:m,name:a??e.name,controlRef:e.controlRef,validityData:_C(l,r),validate:_}))},[u,m,r,a,o,_,l]),b(()=>{let e=u.current.fields;return()=>{let t=f.current?.id;t&&e.delete(t)}},[u]),[_,G((e,n)=>{if(!n){d.current===e&&(d.current=null,t(void 0,!0),y(),f.current=null,o(void 0),s.current=void 0);return}let r=f.current?.id,i=d.current;i&&i!==e&&t(void 0,!0),d.current=e,f.current=n,a||o(n.name),s.current=n.id,r&&r!==n.id&&y(r),x(n),v()})]}var TC=g.forwardRef(function(e,t){let{errors:n,validationMode:r,submitCountRef:i}=ex(),{render:a,className:o,validate:s,validationDebounceTime:c=0,validationMode:l=r,name:u,disabled:d=!1,invalid:f,dirty:p,touched:m,actionsRef:h,style:_,...v}=e,y=fC(!0)?.disabled,x=G(s||(()=>null)),S=y||d,[C,w]=g.useState(!1),[T,E]=g.useState(!1),[D,O]=g.useState(!1),[k,A]=g.useState(!1),j=p??T,M=m??C,N=g.useRef(j),P=g.useRef(void 0),[F,I]=g.useState(),L=u??F;b(()=>{p!==void 0&&(N.current=p)},[p]);let R=G(e=>{p===void 0&&(e&&(N.current=!0),E(e))}),z=G(e=>{m===void 0&&w(e)}),B=G(()=>l===`onChange`||l===`onSubmit`&&i.current>0),V=L&&Object.hasOwn(n,L)?n[L]:null,H=!!(Array.isArray(V)?V.length:V),ee=f===!0||H,[U,te]=g.useState({state:Ub,error:``,errors:[],value:null,initialValue:null}),W=!ee&&(S?null:U.state.valid),ne=g.useMemo(()=>({disabled:S,touched:M,dirty:j,valid:W,filled:D,focused:k}),[S,M,j,W,D,k]),K=CC({setValidityData:te,validate:x,validityData:U,validationDebounceTime:c,invalid:ee,markedDirtyRef:N,state:ne,shouldValidateOnChange:B,validationMode:l,registeredFieldIdRef:P}),[q,re]=wC({change:K.change,commit:K.commit,invalid:ee,markedDirtyRef:N,name:u,setRegisteredFieldName:I,registeredFieldIdRef:P,setValidityData:te,validityData:U});g.useImperativeHandle(h,()=>({validate:q}),[q]);let ie=g.useMemo(()=>({invalid:ee,name:L,validityData:U,setValidityData:te,disabled:S,setTouched:z,setDirty:R,setFilled:O,setFocused:A,validationMode:l,shouldValidateOnChange:B,state:ne,registerFieldControl:re,validation:K}),[ee,L,U,S,z,R,O,A,l,B,ne,re,K]),ae=Ar(`div`,e,{ref:t,state:ne,props:v,stateAttributesMapping:Gb});return(0,J.jsx)(Xb.Provider,{value:ie,children:ae})}),EC=g.forwardRef(function(e,t){return(0,J.jsx)(pC,{children:(0,J.jsx)(TC,{...e,ref:t})})}),DC=g.createContext({disabled:!1});function OC(){return g.useContext(DC)}var kC=g.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,nativeLabel:o=!0,...s}=e,c=Zb(!1),l=OC(),{labelId:u}=nx(),d={...c.state,disabled:c.disabled||l.disabled},f=g.useRef(null),p=hC({id:u??a,native:o});return Ar(`label`,e,{ref:[t,f],state:d,props:[p,s],stateAttributesMapping:Gb})}),AC=g.forwardRef(function(e,t){let{render:n,className:r,id:i,name:a,value:o,disabled:s=!1,onValueChange:c,defaultValue:l,autoFocus:u=!1,style:d,...f}=e,{state:p,name:m,disabled:h,setTouched:_,setDirty:v,validityData:y,setFocused:x,setFilled:S,validationMode:C,validation:w}=Zb(),{clearErrors:T,elementRef:E,submitCountRef:D}=ex(),O=h||s,k=m??a,A={...p,disabled:O},{labelId:j}=nx(),M=ox({id:i}),[N]=Lb({controlled:o,default:l,name:`FieldControl`,state:`value`}),P=o!==void 0,F=P?N:void 0,I=F==null?void 0:String(F),L=G(()=>w.inputRef.current?.value);Qb(w.inputRef,M,I,L,!O,a),b(()=>{let e=I??w.inputRef.current?.value;e!==void 0&&S(e!==``)},[I,w.inputRef,S]),sx(I,()=>{I!==void 0&&(T(k),v(I!==(y.initialValue??``)),w.change(I))});let R=g.useRef(null),z=Be();return b(()=>{u&&R.current===it(Me(R.current))&&x(!0)},[u,x]),Ar(`input`,e,{ref:[t,R],state:A,props:[{id:M,disabled:O,name:k,ref:w.inputRef,"aria-labelledby":j,autoFocus:u,...P?{value:F}:{defaultValue:l},onChange(e){let t=e.currentTarget.value,n=Ji(Li,e.nativeEvent);c?.(t,n),!P&&(v(t!==(y.initialValue??``)),S(t!==``),!e.nativeEvent.defaultPrevented&&!n.isCanceled&&(T(k),w.change(t)))},onFocus(){x(!0)},onBlur(e){if(_(!0),x(!1),C===`onBlur`){let t=e.currentTarget.value;w.commit(t),P&&queueMicrotask(()=>{let e=w.inputRef.current?.value;e!==void 0&&e!==t&&e!==(y.initialValue??``)&&w.commit(e)})}},onKeyDown(e){if(e.currentTarget.tagName===`INPUT`&&e.key===`Enter`){_(!0);let t=e.currentTarget.value,n=e.currentTarget.form;if(n&&n===E.current&&!e.defaultPrevented){let t=e.currentTarget,n=D.current;z.start(0,()=>{D.current===n&&w.commit(t.value)})}else w.commit(t)}}},f,e=>w.getValidationProps(O,e)],stateAttributesMapping:Gb})});function jC({className:e,...t}){return(0,J.jsx)(EC,{"data-slot":`field`,className:Z(e),...t})}function MC({className:e,...t}){return(0,J.jsx)(kC,{"data-slot":`field-label`,className:Z(`text-foreground-intense mb-1.5 flex w-fit items-center text-sm font-medium select-none`,`data-disabled:opacity-disabled`,e),...t})}var NC=g.forwardRef(function(e,t){return(0,J.jsx)(AC,{ref:t,...e})}),PC=Sl(`w-full border text-foreground outline-none transition-[background-color,border-color,box-shadow] duration-200 motion-reduce:transition-none [&_svg]:pointer-events-none [&_svg]:shrink-0`,{variants:{variant:{outline:`bg-background border-border-strong hover:not-focus:not-focus-visible:not-has-focus:not-has-focus-visible:not-data-popup-open:not-has-data-popup-open:not-data-pressed:not-has-data-pressed:not-data-invalid:not-has-data-invalid:border-border-emphasis`,soft:`bg-background-muted border-transparent hover:not-focus:not-focus-visible:not-has-focus:not-has-focus-visible:not-data-popup-open:not-has-data-popup-open:not-data-pressed:not-has-data-pressed:not-data-invalid:not-has-data-invalid:border-border-strong`},size:{sm:`h-8 px-3 text-xs pointer-coarse:text-base rounded-sm gap-1.5 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`,md:`h-10 px-3.5 text-sm pointer-coarse:text-base rounded-md gap-2 [&_svg:not([class*='size-'])]:size-4.5 [&_svg:not([class*='stroke-'])]:stroke-[1.65]`,lg:`h-12 px-4 text-base rounded-lg gap-2 [&_svg:not([class*='size-'])]:size-5 [&_svg:not([class*='stroke-'])]:stroke-[1.65]`},state:{self:Z(`focus-visible:ring-3 focus-visible:ring-ring-input focus-visible:border-transparent focus-visible:bg-background`,`data-popup-open:ring-3 data-popup-open:ring-ring-input data-popup-open:border-transparent data-popup-open:bg-background`,`data-pressed:ring-3 data-pressed:ring-ring-input data-pressed:border-transparent data-pressed:bg-background`,`data-invalid:bg-error-subtle data-invalid:border-error`,`data-invalid:focus-visible:border-transparent data-invalid:focus-visible:ring-ring-error data-invalid:focus-visible:bg-background`,`data-invalid:data-popup-open:border-transparent data-invalid:data-popup-open:ring-ring-error data-invalid:data-popup-open:bg-background`,`data-invalid:data-pressed:border-transparent data-invalid:data-pressed:ring-ring-error data-invalid:data-pressed:bg-background`,`data-disabled:border-border-strong! data-disabled:bg-background-subtle! data-disabled:cursor-not-allowed data-disabled:border-dashed data-disabled:opacity-disabled`),within:Z(`flex items-center`,`has-focus:ring-[3px] has-focus:ring-ring-input has-focus:border-transparent has-focus:bg-background`,`has-data-popup-open:ring-3 has-data-popup-open:ring-ring-input has-data-popup-open:border-transparent has-data-popup-open:bg-background`,`has-data-pressed:ring-3 has-data-pressed:ring-ring-input has-data-pressed:border-transparent has-data-pressed:bg-background`,`data-invalid:bg-error-subtle data-invalid:border-error data-invalid:has-focus:border-transparent data-invalid:has-focus:ring-ring-error data-invalid:has-focus:bg-background`,`data-invalid:has-data-popup-open:border-transparent data-invalid:has-data-popup-open:ring-ring-error data-invalid:has-data-popup-open:bg-background`,`data-invalid:has-data-pressed:border-transparent data-invalid:has-data-pressed:ring-ring-error data-invalid:has-data-pressed:bg-background`,`has-data-invalid:bg-error-subtle has-data-invalid:border-error has-data-invalid:has-focus:border-transparent has-data-invalid:has-focus:ring-ring-error has-data-invalid:has-focus:bg-background`,`has-data-invalid:has-data-popup-open:border-transparent has-data-invalid:has-data-popup-open:ring-ring-error has-data-invalid:has-data-popup-open:bg-background`,`has-data-invalid:has-data-pressed:border-transparent has-data-invalid:has-data-pressed:ring-ring-error has-data-invalid:has-data-pressed:bg-background`,`has-[input:disabled]:border-border-strong! has-[input:disabled]:bg-background-subtle! has-[input:disabled]:cursor-not-allowed has-[input:disabled]:border-dashed has-[input:disabled]:opacity-disabled`)}},defaultVariants:{variant:`outline`,size:`md`,state:`self`}});function FC(e,t){(Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,`value`)?.set)?.call(e,t),e.dispatchEvent(new Event(`input`,{bubbles:!0}))}function IC({className:e,variant:t=`outline`,inputSize:n=`md`,clearable:r,startSlot:i,endSlot:a,onClear:o,inputProps:s,ref:c,...l}){let u=g.useRef(null),d=!!(r||i||a),f=l[`aria-invalid`],p=f===!0||f===`true`,m=vl(c,u),h=()=>{u.current&&l.value===void 0&&FC(u.current,``),u.current?.focus(),o?.()};return d?(0,J.jsxs)(`div`,{"data-slot":`input-wrapper`,className:Z(PC({variant:t,size:n,state:`within`}),e),...p?{"data-invalid":``}:{},children:[i&&(0,J.jsx)(`div`,{"data-slot":`input-start`,className:`-ms-1 flex shrink-0 items-center`,children:i}),(0,J.jsx)(NC,{"data-slot":`input`,ref:m,placeholder:l.placeholder??` `,...s,className:Z(`peer text-foreground placeholder:text-foreground-subtle h-full min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed`,s?.className),...l}),r&&(0,J.jsx)(`button`,{"data-slot":`input-clear`,type:`button`,onClick:h,className:`text-foreground-subtle hover:text-foreground pointer-events-none shrink-0 cursor-pointer opacity-0 transition-[opacity,color] duration-200 peer-not-placeholder-shown:pointer-events-auto peer-not-placeholder-shown:opacity-100`,tabIndex:-1,"aria-label":`Clear input`,children:(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`2 2 16 16`,fill:`currentColor`,className:`size-[1em]`,children:(0,J.jsx)(`path`,{d:`M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z`})})}),a&&(0,J.jsx)(`div`,{"data-slot":`input-end`,className:`-me-1 flex shrink-0 items-center`,children:a})]}):(0,J.jsx)(NC,{"data-slot":`input`,ref:m,...s,className:Z(PC({variant:t,size:n,state:`self`}),`placeholder:text-foreground-subtle`,s?.className,e),...l,...p?{"data-invalid":``}:{}})}var LC=`data-checked`,RC=`data-unchecked`,zC={checked(e){return e?{[LC]:``}:{[RC]:``}},...gt,...Gb},BC=`data-composite-item-active`,VC=g.createContext({register:()=>{},unregister:()=>{},subscribeMapChange:()=>()=>{},nextIndexRef:{current:0}});function HC(){return g.useContext(VC)}function UC(e={}){let{guess:t,label:n,metadata:r,textRef:i,index:a}=e,{register:o,unregister:s,subscribeMapChange:c,nextIndexRef:l}=HC(),u=g.useRef(-1),[d,f]=g.useState(a==null&&t?()=>{if(u.current===-1){let e=l.current;l.current+=1,u.current=e}return u.current}:-1),p=a??d,m=g.useRef(null),h=g.useCallback(e=>{let t=m.current;t&&s(t),m.current=e,e&&o(e,{metadata:r??null,index:a??null,label:n,textRef:i})},[a,o,s,r,n,i]);return b(()=>{if(a==null)return c(e=>{let t=m.current?e.get(m.current)?.index:null;t!=null&&f(t)})},[a,c]),{ref:h,index:p}}function WC(e={}){let{highlightItemOnHover:t,highlightedIndex:n,onHighlightedIndexChange:r}=ki(),{ref:i,index:a}=UC(e),o=n===a,s=g.useRef(null),c=ir(i,s);return{compositeProps:{tabIndex:o?0:-1,onFocus(){r(a)},onMouseMove(){let e=s.current;if(!t||!e)return;let n=e.hasAttribute(`disabled`)||e.ariaDisabled===`true`;!o&&!n&&e.focus()}},compositeRef:c,index:a}}function GC(e){let{render:t,className:n,style:r,state:i=h,props:a=m,refs:o=m,metadata:s,stateAttributesMapping:c,tag:l=`div`,...u}=e,{compositeProps:d,compositeRef:f}=WC({metadata:s});return Ar(l,e,{state:i,ref:[f,...o],props:[d,...a,u],stateAttributesMapping:c})}var KC=g.createContext(void 0);function qC(){return g.useContext(KC)}function JC(e){if(e==null)return``;if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}var YC=g.createContext(void 0);function XC(){let e=g.useContext(YC);if(e===void 0)throw Error(S(52));return e}var ZC=g.forwardRef(function(e,t){let{render:n,className:r,disabled:i=!1,readOnly:a=!1,required:o=!1,"aria-labelledby":s,value:c,inputRef:l,nativeButton:u=!1,id:d,style:f,...m}=e,_=qC(),{disabled:v,readOnly:y,required:x,form:S,checkedValue:C,touched:w=!1,validation:T,name:E,setCheckedValue:D=p,setTouched:O=p,registerInputRef:k=p}=_??{},{setTouched:A,setFilled:j,state:M,disabled:N}=Zb(),P=OC(),{labelId:F,getDescriptionProps:I}=nx(),L=N||P.disabled||v||i,R=y||a,z=x||o,B=S,V=_?C===c:c===``,H=g.useRef(null),ee=g.useRef(null),U=T?.registerInput,te=ir(l,ee,k,g.useCallback(e=>U?.(e,{controlRef:H,value:void 0}),[U]));b(()=>{ee.current?.checked&&j(!0)},[j]),b(()=>{if(ee.current){if(L&&V){k(null);return}k(ee.current)}},[V,L,k]);let W=Rb(),ne=ox({id:d}),G=u?void 0:ne,K={role:`radio`,"aria-checked":V,"aria-labelledby":rx(s,F,ee,!u,G),[BC]:V?``:void 0,id:u?ne:W,onKeyDown(e){e.key===`Enter`&&e.preventDefault()},onClick(e){if(e.defaultPrevented||L||R)return;e.preventDefault();let t=ee.current;t&&ji(t,e)},onFocus(e){e.defaultPrevented||L||R||!w||(ee.current?.click(),O(!1))}},{getButtonProps:q,buttonRef:re}=Mi({disabled:L,native:u,composite:!1}),ie={type:`radio`,ref:te,form:B,id:G,name:E,tabIndex:-1,style:E?nr:tr,"aria-hidden":!0,...c===void 0?h:{value:JC(c)},disabled:L,checked:V,required:z,readOnly:R,onChange(e){if(e.nativeEvent.defaultPrevented||L||R||c===void 0)return;let t=Ji(Li,e.nativeEvent);D(c,t),!t.isCanceled&&A(!0)},onClick(e){e.stopPropagation()},onFocus(){H.current?.focus()}},ae=g.useMemo(()=>({...M,required:z,disabled:L,readOnly:R,checked:V}),[M,L,R,V,z]),oe=ae,se=_!==void 0,ce=[t,H,re],le=[K,m,q,I,T?e=>T.getValidationProps(L,e):h],ue=Ar(`span`,e,{enabled:!se,state:ae,ref:ce,props:le,stateAttributesMapping:zC});return(0,J.jsxs)(YC.Provider,{value:oe,children:[se?(0,J.jsx)(GC,{tag:`span`,render:n,className:r,style:f,state:ae,refs:ce,props:le,stateAttributesMapping:zC}):ue,(0,J.jsx)(`input`,{...ie,suppressHydrationWarning:!0})]})}),QC=g.forwardRef(function(e,t){let{render:n,className:r,style:i,keepMounted:a=!1,...o}=e,s=XC(),c=s.checked,{mounted:l,transitionStatus:u,setMounted:d}=Go(c),f={...s,transitionStatus:u},p=g.useRef(null),m=a||l,h=Ar(`span`,e,{ref:[t,p],state:f,props:o,stateAttributesMapping:zC});return qr({batch:!0,enabled:!c,open:c,ref:p,onComplete(){c||d(!1)}}),m?h:null}),$C={duration:.3,ease:[.4,0,.2,1]},ew={duration:.3,ease:[.4,0,.2,1]},tw={duration:0};function nw({checked:e,reduced:t}){return(0,J.jsx)(QC,{"data-slot":`radio-indicator`,className:`flex items-center justify-center`,keepMounted:!0,children:(0,J.jsx)(Oy.span,{className:`bg-primary-foreground size-[0.5em] min-h-2 min-w-2 rounded-full`,initial:!1,animate:{scale:+!!e},transition:t?tw:ew})})}function rw({renderProps:e,state:t,reduced:n}){let{checked:r}=t,{ref:i,...a}=e,[o,s]=Dy(),c=vl(i,o),l=g.useRef(r);return g.useEffect(()=>{let e=l.current!==r;l.current=r,e&&!n&&s(o.current,{scale:[1,.8,1.1,1]},$C)},[r,s,o,n]),(0,J.jsx)(`span`,{"data-slot":`radio`,...a,ref:c,children:(0,J.jsx)(nw,{checked:r,reduced:n})})}function iw({className:e,...t}){let n=My(),r=t[`aria-invalid`],i=r===!0||r===`true`;return(0,J.jsx)(W_,{features:Yv,strict:!0,children:(0,J.jsx)(ZC,{...t,...i?{"data-invalid":``}:{},className:Z(`flex size-[1em] min-h-4 min-w-4 shrink-0 cursor-default items-center justify-center`,`bg-background border-border-strong outline-ring-input rounded-full border outline-offset-1`,`transition-[background-color,border-color,box-shadow] duration-200 motion-reduce:transition-none`,`hover:not-data-checked:not-data-disabled:not-data-invalid:border-border-emphasis`,`data-checked:bg-primary data-checked:outline-ring-primary data-checked:border-transparent`,`data-disabled:not-data-checked:bg-background-subtle data-disabled:data-checked:opacity-disabled data-disabled:cursor-not-allowed data-disabled:not-data-checked:border-dashed`,`data-invalid:border-error data-invalid:not-data-checked:bg-error-subtle data-invalid:outline-ring-error`,e),render:(e,t)=>(0,J.jsx)(rw,{renderProps:e,state:t,reduced:n})})})}function aw(e){let{children:t,elementsRef:n,labelsRef:r,onMapChange:i}=e,a=G(i),[,o]=g.useState(!1),s=y(sw).current,c=y(ow).current,l=g.useRef(0),u=g.useRef(!0),d=g.useRef(null),f=g.useRef(null),p=G(()=>{u.current||(u.current=!0,o(e=>!e))}),m=G((e,t)=>{c.set(e,t),p()}),h=G(e=>{c.delete(e),p()}),_=G(e=>{let t=new Map;return n.current.length=0,r&&(r.current.length=0),e.forEach(e=>{t.set(e.element,{...e.registration.metadata??{},index:e.index}),n.current[e.index]=e.element,r&&(r.current[e.index]=e.registration.label===void 0?e.registration.textRef?.current?.textContent??e.element.textContent:e.registration.label)}),l.current=n.current.length,t});function v(e){if(f.current?.disconnect(),f.current=null,typeof MutationObserver!=`function`||e.length<2)return;let t=new MutationObserver(n=>{if(!uw(n))return;let r=null;for(let n of e)if(n.isConnected){if(r&&dw(r,n)>0){t.disconnect(),p();return}r=n}});f.current=t;let n=new Set;for(let t=1;t<e.length;t+=1){let r=lw(e[t-1],e[t]);r&&n.add(r)}n.forEach(e=>t.observe(e,{childList:!0}))}let x=G(()=>{let[e,t]=cw(c),n=_(e),r=d.current,i=!r||r.length!==e.length||e.some((e,t)=>{let n=r[t];return e.index!==n.index||e.element!==n.element||e.registration.index!==n.registration.index||e.registration.metadata!==n.registration.metadata});v(t),d.current=e,u.current=!1,i&&(s.forEach(e=>e(n)),a(n))});b(()=>(!u.current&&d.current&&_(d.current),()=>{n.current=[],r&&(r.current=[])}),[n,r,_]),b(()=>{u.current&&x()}),b(()=>()=>{f.current?.disconnect(),u.current=!0},[]);let S=G(e=>(s.add(e),()=>{s.delete(e)})),C=g.useMemo(()=>({register:m,unregister:h,subscribeMapChange:S,nextIndexRef:l}),[m,h,S,l]);return(0,J.jsx)(VC.Provider,{value:C,children:t})}function ow(){return new Map}function sw(){return new Set}function cw(e){let t=new Set,n=[],r=[];e.forEach((e,i)=>{if(!i.isConnected)return;let a=e.index,o={index:a??-1,element:i,registration:e};a===null?r.push(o):a>=0&&(t.add(a),n.push(o))});let i=0;return r.sort((e,t)=>dw(e.element,t.element)),r.forEach(e=>{for(;t.has(i);)i+=1;e.index=i,n.push(e),i+=1}),t.size>0&&n.sort((e,t)=>e.index-t.index),[n,r.map(e=>e.element)]}function lw(e,t){let n=e.parentElement;for(;n&&!n.contains(t);)n=n.parentElement;return n}function uw(e){for(let t of e)for(let e=0;e<t.removedNodes.length;e+=1)if(t.removedNodes[e].isConnected)return!0;return!1}function dw(e,t){return e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}function fw(e){return e==null||e.hasAttribute(`disabled`)||e.getAttribute(`aria-disabled`)===`true`}function pw(e){let{loopFocus:t=!0,orientation:n=`both`,grid:r,onLoop:i,direction:a,highlightedIndex:o,onHighlightedIndexChange:s,rootRef:c,enableHomeAndEndKeys:l=!1,stopEventPropagation:u,disabledIndices:d,modifierKeys:f=m}=e,[p,h]=g.useState(0),_=r!=null,v=g.useRef(null),y=ir(v,c),x=g.useRef([]),S=g.useRef(!1),C=g.useRef(null),w=o??p,T=G((e,t=!1)=>{if(C.current=x.current[e]??null,(s??h)(e),t){let t=x.current[e];pS(v.current,t,a,n)}}),E=G(e=>{if(e.size===0)return;if(S.current){let e=x.current,t=e.indexOf(C.current);if(t===-1){let t=e[w];!t||Cn(e,w,d)?T(mw(e,d)):C.current=t}else t!==w&&T(t);return}S.current=!0;let t=Array.from(e.keys()),r=t.find(e=>e?.hasAttribute(`data-composite-item-active`))??null,i=r?e.get(r)?.index??-1:-1;if(i!==-1)T(i);else if(Cn(t,w,d)){let e=Sn(t,{disabledIndices:d});yn(t,e)||T(e)}pS(v.current,r,a,n)});b(()=>{if(d==null||o!=null||!S.current)return;let e=x.current;if(Cn(e,w,d)){let t=Sn(e,{disabledIndices:d});yn(e,t)||T(t)}},[d,o,w,x,T]);let D=G((e,t,n)=>i?i(e,t,n,x):n),O=G(e=>{let o=e.key===`Home`||e.key===`End`;if(!cS.has(e.key)||!l&&o||hw(e,f)||!v.current)return;let s=a===`rtl`,c=s?oS:sS,p=s?sS:oS,m=n===`vertical`?aS:c,h=n===`vertical`?iS:p,g=ot(e.nativeEvent);if(g!=null&&fS(g)&&!fw(g)){let t=g.selectionStart,n=g.selectionEnd,r=g.value;if(t==null||e.shiftKey||t!==n||e.key!==h&&t<r.length||e.key!==m&&t>0)return}let y=w,b=bn(x,d),S=xn(x,d);r!=null&&(y=r({disabledIndices:d,elementsRef:x,event:e,highlightedIndex:w,loopFocus:t,maxIndex:S,minIndex:b,onLoop:D,orientation:n,rtl:s}));let C=n!==`vertical`&&e.key===c||n!==`horizontal`&&e.key===`ArrowDown`,E=n!==`vertical`&&e.key===p||n!==`horizontal`&&e.key===`ArrowUp`;l&&(e.key===`Home`?y=b:e.key===`End`&&(y=S)),y===w&&(C||E)&&(t&&y===S&&C?(y=b,i&&(y=i(e,w,y,x))):t&&y===b&&E?(y=S,i&&(y=i(e,w,y,x))):y=Sn(x.current,{startingIndex:y,decrement:E,disabledIndices:d})),y!==w&&!yn(x.current,y)&&(u&&e.stopPropagation(),(_||o||C||E)&&e.preventDefault(),T(y,!0),queueMicrotask(()=>{x.current[y]?.focus()}))});return{props:{ref:y,onFocus(e){let t=v.current,n=ot(e.nativeEvent);t&&n!=null&&fS(n)&&n.setSelectionRange(0,n.value.length)},onKeyDown:O},highlightedIndex:w,onHighlightedIndexChange:T,elementsRef:x,onMapChange:E,relayKeyboardEvent:O}}function mw(e,t){let n=-1;for(let r=0;r<e.length;r+=1){let i=e[r];if(i&&!Cn(e,r,t)){if(i.hasAttribute(`data-composite-item-active`))return r;n===-1&&(n=r)}}return Math.max(n,0)}function hw(e,t){for(let n of uS)if(!t.includes(n)&&e.getModifierState(n))return!0;return!1}function gw(e){let{render:t,className:n,style:r,refs:i=m,props:a=m,state:o=h,stateAttributesMapping:s,highlightedIndex:c,onHighlightedIndexChange:l,orientation:u,grid:d,loopFocus:f,onLoop:p,enableHomeAndEndKeys:_,onMapChange:v,stopEventPropagation:y=!0,rootRef:b,disabledIndices:x,modifierKeys:S,highlightItemOnHover:C=!1,tag:w=`div`,...T}=e,{props:E,highlightedIndex:D,onHighlightedIndexChange:O,elementsRef:k,onMapChange:A,relayKeyboardEvent:j}=pw({grid:d,loopFocus:f,onLoop:p,orientation:u,highlightedIndex:c,onHighlightedIndexChange:l,rootRef:b,stopEventPropagation:y,enableHomeAndEndKeys:_,direction:Ss(),disabledIndices:x,modifierKeys:S}),M=Ar(w,e,{state:o,ref:i,props:[E,...a,T],stateAttributesMapping:s}),N=g.useMemo(()=>({highlightedIndex:D,onHighlightedIndexChange:O,highlightItemOnHover:C,relayKeyboardEvent:j}),[D,O,C,j]);return(0,J.jsx)(Oi.Provider,{value:N,children:(0,J.jsx)(aw,{elementsRef:k,onMapChange:e=>{v?.(e),A(e)},children:M})})}var _w=[lS],vw=g.forwardRef(function(e,t){let{render:n,className:r,disabled:i,readOnly:a,required:o,onValueChange:s,value:c,defaultValue:l,form:u,name:d,inputRef:f,id:p,style:m,...h}=e,{setTouched:_,setFocused:v,validationMode:y,name:b,disabled:x,state:S,validation:C,setDirty:w,setFilled:T,validityData:E}=Zb(),{labelId:D}=nx(),{clearErrors:O,elementRef:k}=ex(),A=fC(!0),j=x||i,M=b??d,N=Rb(p),[P,F]=Lb({controlled:c,default:l,name:`RadioGroup`,state:`value`}),[I,L]=g.useState(!1),R=G((e,t)=>{s?.(e,t),!t.isCanceled&&F(e)}),z=C.getInputControl,B=g.useMemo(()=>({get current(){return z()}}),[z]),V=g.useRef(null),H=g.useRef(null);function ee(e){let t;return f&&(typeof f==`function`?t=f(e):f.current=e),V.current=e,t}let U=G(e=>{if(!e||e.disabled)return;H.current||=e;let t=V.current,n=e.checked||t==null||t.disabled?ee(e):void 0;return()=>{H.current===e&&(H.current=null),V.current===e?n?(n(),V.current=null):ee(null):n?.()}}),te=G(()=>{let e=k.current;if(!e)return P??null;for(let t of C.registeredInputs.keys())if(t.checked&&yC(t,e))return P??null;return null});Qb(B,N,P??null,te,!j,d),sx(P,()=>{O(M),w(P!==E.initialValue),T(P!=null),C.change(P);let e=H.current;P==null&&e&&!e.disabled&&ee(e)});let W=D??A?.legendId,ne={...S,disabled:j??!1,required:o??!1,readOnly:a??!1},K=g.useMemo(()=>({checkedValue:P,disabled:j,form:u,validation:C,name:M,readOnly:a,registerInputRef:U,required:o,setCheckedValue:R,setTouched:L,touched:I}),[P,j,u,C,M,a,U,o,R,L,I]),q={id:p,role:`radiogroup`,"aria-required":o||void 0,"aria-disabled":j||void 0,"aria-readonly":a||void 0,"aria-labelledby":W,onFocus(){v(!0)},onBlur(e){at(e.currentTarget,e.relatedTarget)||(_(!0),v(!1),y===`onBlur`&&C.commit(P))},onKeyDownCapture(e){e.key.startsWith(`Arrow`)&&(L(!0),v(!0))}};return(0,J.jsx)(KC.Provider,{value:K,children:(0,J.jsx)(gw,{render:n,className:r,style:m,state:ne,props:[q,h,e=>C.getValidationProps(j??!1,e)],refs:[t],stateAttributesMapping:Gb,enableHomeAndEndKeys:!1,modifierKeys:_w})})});function yw({className:e,orientation:t=`vertical`,...n}){return(0,J.jsx)(vw,{"data-slot":`radio-group`,"aria-orientation":t,className:Z(`flex`,t===`horizontal`?`flex-wrap gap-4`:`flex-col gap-2`,e),...n})}function bw(e){return e?e.lan.length>0?e.lan:e.public:[]}function xw(e){return!e||e.lan.length===0?[]:e.public}function Sw(e){return e?.ipv6??[]}function Cw(e,t){let n=$(e===`lan`?`panel.address.lan`:e===`ipv6`?`panel.address.ipv6`:`panel.address.public`);return t?`${n} · ${t}`:n}function ww(e,t){return`http://${e.includes(`:`)?`[${e}]`:e}:${String(t??``)}`}function Tw({book:e,port:t,value:n,busy:r=!1,onChange:i,fallbackUrls:a=[]}){let o=String(t??``),s=bw(e),c=xw(e),l=Sw(e),u=e&&e.lan.length>0?`lan`:`public`,d=s.some(e=>e.address===n)?n:s[0]?.address??``;return s.length===0?l.length===0&&a.length>0?(0,J.jsx)(`span`,{className:`flex flex-col items-end gap-0.5`,children:a.map(e=>(0,J.jsx)(`span`,{children:e},e))}):l.length===0?(0,J.jsx)(`span`,{className:`font-sans text-foreground-muted`,children:$(`panel.address.empty`)}):(0,J.jsx)(`span`,{className:`flex w-full flex-col items-end gap-1`,children:l.map(e=>(0,J.jsxs)(`span`,{className:`inline-flex flex-wrap items-baseline justify-end gap-x-2`,children:[(0,J.jsx)(`span`,{className:`font-mono text-xs text-foreground-muted`,children:ww(e.address,o)}),(0,J.jsx)(`span`,{className:`shrink-0 font-sans text-xs text-foreground-subtle`,children:`${Cw(`ipv6`,e.interface)}${$(`panel.address.ipv6Hint`)}`})]},e.address))}):(0,J.jsxs)(`span`,{className:`flex w-full flex-col items-end gap-1`,children:[s.length>1?(0,J.jsx)(yw,{className:hx(`w-full items-end gap-1`,r&&`pointer-events-none opacity-60`),value:d,onValueChange:e=>{typeof e==`string`&&e!==d&&i(e)},children:s.map(e=>(0,J.jsxs)(`label`,{className:`flex w-full cursor-pointer flex-wrap items-baseline justify-end gap-x-2`,children:[(0,J.jsx)(iw,{value:e.address,"aria-label":ww(e.address,o)}),(0,J.jsx)(`span`,{className:`font-mono text-xs text-foreground`,children:ww(e.address,o)}),(0,J.jsx)(`span`,{className:`shrink-0 font-sans text-xs text-foreground-muted`,children:Cw(u,e.interface)})]},e.address))}):(0,J.jsxs)(`span`,{className:`inline-flex flex-wrap items-baseline justify-end gap-x-2`,children:[(0,J.jsx)(`span`,{className:`font-mono`,children:ww(s[0].address,o)}),(0,J.jsx)(`span`,{className:`shrink-0 font-sans text-xs text-foreground-muted`,children:Cw(u,s[0].interface)})]}),c.map(e=>(0,J.jsxs)(`span`,{className:`inline-flex flex-wrap items-baseline justify-end gap-x-2`,children:[(0,J.jsx)(`span`,{className:`font-mono text-xs text-foreground-muted`,children:ww(e.address,o)}),(0,J.jsx)(`span`,{className:`shrink-0 font-sans text-xs text-foreground-subtle`,children:`${Cw(`public`,e.interface)}${$(`panel.address.publicHint`)}`})]},e.address)),l.map(e=>(0,J.jsxs)(`span`,{className:`inline-flex flex-wrap items-baseline justify-end gap-x-2`,children:[(0,J.jsx)(`span`,{className:`font-mono text-xs text-foreground-muted`,children:ww(e.address,o)}),(0,J.jsx)(`span`,{className:`shrink-0 font-sans text-xs text-foreground-subtle`,children:`${Cw(`ipv6`,e.interface)}(手机按实测择优)`})]},e.address)),s.length>1?(0,J.jsx)(`span`,{className:`text-end font-sans text-xs text-foreground-muted`,children:$(`panel.address.hint`)}):null]})}var Ew=1024,Dw=65535;function Ow({open:e,onOpenChange:t,status:n,lanUrls:r,addressBook:i,busy:a,onSave:o,onSavePreferred:s}){let[c,l]=(0,g.useState)(String(n.lan.requestedPort)),[u,d]=(0,g.useState)(!1);(0,g.useEffect)(()=>{e&&(l(String(n.lan.requestedPort)),d(!1))},[e]);let f=c.trim(),p=f===``?null:Number(f),m=(p===null||Number.isInteger(p)&&p>=Ew&&p<=Dw)&&a===``;function h(){l(String(n.lan.requestedPort)),d(!1)}function _(){if(!m)return;let e={};p!==null&&(e.lanPort=p),o(e)}return(0,J.jsx)(eC,{open:e,onOpenChange:t,children:(0,J.jsxs)(tC,{className:`max-w-xl`,children:[(0,J.jsx)(nC,{children:(0,J.jsx)(rC,{children:$(`panel.connection.lan`)})}),(0,J.jsxs)(iC,{className:`flex flex-col gap-4`,children:[(0,J.jsxs)(Ex,{children:[(0,J.jsx)(Tx,{label:$(`panel.lanDialog.state`),tone:xx(n.lan.state,n.lan.enabled),children:(0,J.jsx)(Dx,{tone:xx(n.lan.state,n.lan.enabled),text:Sx(n.lan.state,n.lan.enabled),...n.lan.error?{detail:n.lan.error}:{}})}),(0,J.jsx)(Tx,{label:$(`panel.pairing.phoneAddress`),children:n.lan.enabled?(0,J.jsx)(Tw,{book:i,port:n.lan.port,value:i?.preferred??``,busy:a!==``,onChange:s,fallbackUrls:r}):(0,J.jsx)(`span`,{className:`font-sans text-foreground-muted`,children:$(`panel.onboarding.lanOff`)})}),(0,J.jsx)(Tx,{label:$(`panel.lanDialog.port`),mono:!0,children:(0,J.jsxs)(`span`,{className:`inline-flex flex-wrap items-center justify-end gap-2`,children:[(0,J.jsx)(`span`,{children:n.lan.enabled?n.lan.port:`—`}),n.lan.enabled&&n.lan.adjusted?(0,J.jsx)(`span`,{className:`font-sans text-xs text-foreground-muted`,children:$(`panel.pairing.portFallback`)}):null,u?null:(0,J.jsx)(Ob,{variant:`ghost`,size:`sm`,onClick:()=>d(!0),children:`修改`})]})})]}),u?(0,J.jsxs)(jC,{children:[(0,J.jsx)(MC,{htmlFor:`relay-lan-port`,children:$(`panel.connection.lanPort`)}),(0,J.jsx)(IC,{inputProps:{id:`relay-lan-port`,inputMode:`numeric`},value:c,placeholder:$(`panel.lanDialog.unchanged`),onChange:e=>l(e.target.value)})]}):null]}),u?(0,J.jsxs)(aC,{className:`flex justify-end gap-2`,children:[(0,J.jsx)(Ob,{variant:`outline`,disabled:a===`lan`,onClick:h,children:`取消`}),(0,J.jsx)(Ob,{variant:`primary`,disabled:!m,onClick:_,children:`保存`})]}):null]})})}var kw=`M4.3 12.55 L9.25 17.5 L19.7 6.5`,Aw={xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":!0};async function jw(e){if(typeof e==`string`)return e;if(typeof e==`function`)return await e();let t=e.current;if(!t)throw Error("CopyButton: the `value` ref is not attached to an element");return t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement?t.value:t.textContent??``}async function Mw(e){if(navigator.clipboard?.writeText){await navigator.clipboard.writeText(e);return}let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();try{if(!document.execCommand(`copy`))throw Error(`Copying to clipboard is not supported`)}finally{t.remove()}}function Nw({value:e,timeout:t=2e3,label:n=`Copy`,copiedLabel:r=`Copied`,onCopy:i,onCopyError:a,icon:o,onClick:s,variant:c=`ghost`,size:l=`icon-sm`,className:u,children:d,...f}){let[p,m]=g.useState(!1),h=g.useRef(void 0);return g.useEffect(()=>()=>clearTimeout(h.current),[]),(0,J.jsxs)(Ob,{"data-slot":`copy-button`,"data-copied":p||void 0,type:`button`,variant:c,size:l,"aria-label":p?r:n,onClick:async n=>{if(s?.(n),n.defaultPrevented)return;let r;try{r=await jw(e),await Mw(r)}catch(e){a?.(e);return}i?.(r),m(!0),clearTimeout(h.current),h.current=setTimeout(()=>m(!1),t)},className:Z(`group/copy`,u),...f,children:[(0,J.jsxs)(`span`,{"data-icon":d==null?void 0:`start`,className:`grid place-items-center *:[grid-area:1/1]`,children:[(0,J.jsx)(`span`,{className:Z(`grid place-items-center transition-[opacity,scale] delay-150 duration-150 ease-out group-data-copied/copy:delay-0`,`group-data-copied/copy:scale-50 group-data-copied/copy:opacity-0`,`motion-reduce:transition-none`),children:o??(0,J.jsx)(`svg`,{...Aw,children:(0,J.jsx)(`path`,{d:`M4.012 16.737c-.307-.175-.562-.427-.739-.732S3.001 15.353 3 15V5c0-1.1.9-2 2-2h10c.75 0 1.158.385 1.5 1M7 9.667c0-.707.281-1.386.781-1.886S8.96 7 9.667 7h8.666c.35 0 .697.069 1.021.203s.618.33.865.578.444.542.578.865A2.67 2.67 0 0 1 21 9.667v8.666a2.67 2.67 0 0 1-.781 1.886 2.67 2.67 0 0 1-1.886.781H9.667a2.67 2.67 0 0 1-1.021-.203c-.324-.134-.618-.331-.865-.578s-.444-.542-.578-.865S7 18.683 7 18.333V9.667z`})})}),(0,J.jsx)(`svg`,{...Aw,children:(0,J.jsx)(`path`,{d:kw,pathLength:1,strokeDasharray:`1 2`,className:Z(`[stroke-dashoffset:1.02] group-data-copied/copy:[stroke-dashoffset:0]`,`transition-[stroke-dashoffset] duration-200 ease-in`,`group-data-copied/copy:delay-100 group-data-copied/copy:duration-350 group-data-copied/copy:ease-out`,`motion-reduce:transition-none`)})})]}),typeof d==`string`&&p?r:d,(0,J.jsx)(`span`,{role:`status`,className:`sr-only`,children:p?r:``})]})}var Pw=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAnP0lEQVR42u19eZhV1ZXvWnuf6d5bd6gJqKIoJkVBQAw4hGesoK2i8nz6UJN0px/a2qaN2PnsaMxLYoja3Rk6xjh0OmWi8TMOL5ikE4dEjYYPRyIQoNRShmIogRqo4Y517z3D3u8P9tHN4Zx7q6DAAu/+vvPVdOsOZ631W/NaAJVTOZVTOZVTOZVTOZVTOZVTOZVTOZVTOZXziThY+fwHHP5JuwH0E/Z5ibiwBLHlx1TOcSLlBzA6IgIhBFpbW9WWlhajpaXFaG1tVSmlgIh+DIEVFXBsfjYCAA4AAOecNExpOCmfzM8qFovTHcdp4JxHOecEABxCiEMISRFCujRN2xWLxbace+65HY8++miBc+4yAj/e1AQex1DPEBHmzJkzbseOHRfl8/nPOo7TzDnXBBEtALDF5XiISxCxqCjKXsMw1tfU1LzS2dm5U2IEVmGAsW3XOAsXLoxu2LDh/xSLxUsZY7UAkBeXS2wmfXUEI8i/Y+K5dEppTtO0NVOnTv1te3t7t3TfeIUBxpjkIyKrrq4+I51Of9O27akAkAWAgkQsl+AysV0UkJGAS0jBAcCglKYjkcivM5nMnwQa4LHOBOR4knxEZOFw+AuDg4Ottm1PAoCkILAiLgww7tDzN/ln93FZx3HUTDp9dSgUuq61tVUVxMeKGzg2iO8YhvFP+Xz+G5zznJBqRZJQHoB8QX+X1YT7OwcACpZlnbxq1aoJDzzwwIZnn32WHctMgMcL8cPh8BdyudxdANDvQ0AmXTLscwn6ZdXgfbzjURsFAIiHw+FX8vn8z4UnwSoI8DFZ+/X19fNSqdR9ADAkuX/cA+Xcx3jjh4AErnE4ZFnW9FgsNlQsFjuk16zYAEcTva688kqtv7//Ds65KjG1HM1zGYL66Hzv49z/px4Dz2svcPG7QiaTuay5+eQGwRhYQYCj+97Zzp3bv2ia1t8DQMpDOD8Dz6v7/dChFCJ4/8YAIGwWclGHOeuORQYgx7D0s1NPPTVRKJg3Cv9elSRaRgHiI+1E+uwojEXiY/37PQdKz08BIF8wC6c2NzdPkZChggBHw+VLJpM3Wpa1BAAyns+CAcaun85Hn7970aMcCqiFQiHMGFtfQYCjZPg1NTU1FovF6wAgJ6QffXR7EAKgpOtpAHJQn8f6oQEBgIJpmnOampqmH2soQI/VaN/Q0NDtjuO0DFP6sUQiBz2RP6+NIKODLPVeD0GzilZY2AIVBDiC79cZP378TNu2vwgAaY/0k4BL9gS8ko8+f/d7rBJgW7i/yxfMwimNjY0nHksocKwhABJCeD6fv5sxNk8Yf8THig9CAe/lp+/RJwDEpa8goYCMDAwADNM0Q4yxdRUVcITcvng8/pl8Pn+nkH4/6PcS2M8V9HsMSNE/FQBCABAHgGoAiEhh5SJ8FEWU1QcFgCJjbHxTU9OWdDo9cCwEh44lv5VwzkFV1T/atv0/hN/v1d9y+NbvZ+752ZVwU/wcBYA68VXzxBVc4g8CwB4A2CGY0FVNtniesK7rfzVN878451hhgFHM8VdVVV2WzWZXwv54PwkgLPNIM/Mx8pinDiAEAA2C8OAT/vVWGaHwPrYBQLsUhAIAcBCRjxs37u6enp6dY72AhB4rId9ly5bp69evf5hznhCEIwF6H0vAPvGx7McDQDMA6FLCB0qoExc1FABoBIDJsL9mYFB6TsO27cixYAvQYyXos2XLlmtM07zOI21QxtiDEsYfCALWegw8LBH08R5L2AvThK2wW6gJZIyNmzx58rvJZDI5lm0BegxIP58zZ051V1fXQ6Kej4F/EQcEoEFQ4cc4AIgJ4uMw1GGpGIIJADUAMBX2F6H0AEDUNE3Vtu0NI6gcQp+AVhBDfyIYgCIiS6VSX7Us6397Ej5BSRwsY/kzAEh4iD9Swvsli2xhOE4TDPGBbdtNPigQFKkMCjfzMkEseji9DDjGgz68sbGxqaur603OuSHp/nIFmUE3zhJEqhUEQx8h4MPICjKf6KBsOOoA8BYAtIfD4Q35fP5nfh6B24OAiICIYNs2veCCC4xkMml0d3froVBINwwDCoUCICJHxGJdXV3Btu3Cm2++WaSUMlGbCO5XT/qalUMeZSzDPyKyffv23co5HycsfyUgXFuKsVGS0KjQ1SB0NwidTUokiyBAArkPA7gnDwDzAcDI5/POzJkzm9vb2ztnzZpVlUqlGrLZ7CTLsqYxxhoZYxMZYwkAqFYUReOc6wCgcM51RNRkVcM5L2zdurXIOS+oqpomhPRTSnsJIR8oirIjGo1uPf/883c9+ugvC5wzb7SXHUsIQAHASSTGzU2l9q3mnFsenQslqnz8Pp8DABFCSJ+maT+jnP7FQWe8bdtX27Z9gWu4lUACP2LzALThnoDSrnA4/J/FYvFnZ599dtPbb78903GcicVisclxnBrO+XjG2DjOeS0AJDjnUcHojmCkInyUeyCeuISc57ARMU0p3UspfU9V1Tdra2v/0tnZ2V2qsWXMMoDo1HnStu3LhGFFD0FPuzBoUEp3nHDCCZdv2bLFbfAAQghomvb1YrH4Xc55oQQS8BKqhZdgAhsANIK4Y87cuZdt2rRpj1cFuGrg5ZdfVpYtW1afzWabC7nCTItZpzmOM5dzPo1zHpb6GrxMZnvcV7e2gRFCBlRVfSsWi/2qr69vk19jC45d6U+0pFKpP3DOM2USK7xMpy8iotZQ1/DZvfv2bhQ2gGv8cUKIo6rqD4vF4ldhf7En8YF1v0CStyaABzScWABQret6q2VZX2OMqZ5sIvjpakSEK664Qlu1atUp2Wz2XNM0lzDGZorny0r/78DBha2W+J4AgI6IpqZpL0+cOPGB7du398pMMBYzVnzlypU0m81+22PYQIkCDj897ZZxJzRNe7irr2ujkA5T7gRijNHrr7/+m4SQdwVzjCRqFxRilqOQCAADpmleVV9fP1tqNPE2oxxQe8A5p0899ZTZ19e3oVgs3n3jjTcujkaj/6goSpswYolP5ZLrEaiSvZTlnJvFYvHCnTt3PhiPx0+TmGPMIYAb8r0im80+IQw/OgJieP1zBRGzkyZNOquzs7NbUgl+r3l5Npv9LXyUYfST9CCo98sxMInAFgDENE172rbtLzHGhhselt1XBwBg1apVysUXX3xDoVC4hXNuSgzFPK9pe35nivthx+PxW5PJ5CYAIGSsBX2uvPLKUD6f/7rHOocR3izX8IsZhnF3Z2dnV4mYvAMAJJPJ/J4Q8hoAGD6p31K6HgJcQRmaAQAGLMv6bG1t7amyBA6DqZmksuiiRYucQqFwfzQavR4R5Y6noDoI928KAJiccy2TyXyjpaWlCgA4GWuVPs8+++w1juOcJvQcOcTIFxNW/8YlS5b8bBgJGUREVlWVuDPA/+dlvAII8AJkJrA450oqlbrWZwbBcBHObXVXM5nMC+Fw+B4pgeWNfvqVx6sAkHccZ/Jbb711ASKOGQZAAGALFiyoLRaL/wL7y7yUErq/nAfAAEAPh8P/9tRTT+WHEYp1AIBks8k/EUJeAICwJLkQ4P5BGd3veDKOXKDAZxoaGuaNAAX8Pq/NOScLFix4mBCyV6AWeKqcgqqjFQAwTdM8ixAyZoxAgoi8ra3tJsbYVGGNDzd66Q33MgBIKIryYiaT+T1IQyLKMSFjDOLx+F2IaPv4zXwYRh/3Ib5soVucc+zv77+GHJ725QDAX3vttSwhZDPsT2f7Faz6lbq5/1//rW99SyFjpcq3ubl5imVZ/+SJ9+MIBjjJbp8dj8fvRMSRdO86AEBTqdQbiPg7gQJ2Ccvf73de6JftAfe5UqZpfqqurm7uYaCAHP7FEpXNflXRLjMUv/Od74wJFYCEEN7V1fV/GWN1wqo9VO/EBoBqVVUfHxgYWOda+CMyHhiDmpqaf0fEovh/XobwzKOjnQA0YJItwFOp1BcPAwUQAGDBggUxxtgpwsIPaonza4lXCSE9lFKHjAW3r6am5jTLsr7gE/HjnkBPqRk9HABUROxvbGz83iGWYzkAQAcGBjaoqvqUqAW0h2EA+nUWOwHIAACQM01zwQg9goMSZe3t7X/DGGuWGCCo5/GgSuZwOPwqY+xjtwE4IQRSqdTtItvHSuj4crlwBwASuq7/565du3YdRikWZ4xhNBr9N0R0m05KuX8swPjzTh6R5xHZnPNiJpO5TKAAH6H0O62trWo+n79FICYNcIW9jS0cACKU0o558+a9BgBIPu4q36qqqgts274koNKnXMGHLIEhQsjmU0455f7D7NdnAEAGBwffV1X1cYECTkAUkh8iEzAASBeLxVPr6urmwMj6CHDx4sX6jTfe+BPHcT4lPCZSoiTugG4oRNRjsdh9q1evLnycDIAAwFtbW9VcLnc7l3KXw0zt+nX9VEUike+vX78+NQqzezhjDBOJxPcRMSmFVXmA4efHBH5M4TKBJVDASafTl4wABRAA2NatW8dRSiOEkA7YX9OoSqoEA4JBDADqDcN4MJlMvu4KIPk4Lf9bbrnl847jLJS4uBwT+I15YQAQo5S+/vTTTz8xSlW4DADIvn37tmua9gsRbHFKRAWDKo8dn9Cs7BFki8XizKamplklUAClziQCALSjo+MD27b/du7cuZ+tqqq6lRDSJ6qcnADJ5wAwzjCMR4vF4gOcc/pxJYM+fEMtLS1VuVzuNk/s/ZCqlxAQE4nEnYsWLbJHcXIX55zjpEmTfoSIvZKUBY2dKVWizgNiBDbnnPf29l7kY7SipLcdke//MLTsOI66cePGfblc7ifTp0+/UFXVl0WxC/OxA+oMw3jYsqw7pDwEP5oMIAcgCCKytWvXflm4MEOe98FHaLVXq5r628HBwT8fittXDgU6Ojp2a5r2oFRDCCV0v/cKihbKCaOhYrE4Y8qUKSdJKIAAwBHROf3002urq6sv0XX9y4Zh3JRIJJbMnj17PCJagku1rVu37nnxxRc/r2naH2B/car7+mFEDIfD4W+bpnmn4zgHFYWQozSnl7W0tBhnnnnmFADgTU1NjYVC4StSexcfhqT7MYaCiOm6urq7GGNHoguHcc5x5syZ9xFCdohaP1YiMRQUGeQ+TSsuM9mcc7Onq+fSVatWfWhrLFu2zNB1/dvr169fk0wmVxaLxXvy+fx/pFKpx9vb21/RNO27Z5xxRky4gOqiRYvsiy66aDml1I0MVhNCemtra6/J5/O/EJJ/kBt9JKuCqRjXyqurqxcODAzMNQxjx759+7JDQ4XvOI59gY8FO5KKHxsAanVdvy+VSq10X+9IfI6enp6sruua8FYyHvtjOB6ANzpoS2liQEQtFA5t7ezsfGfbtm12U1NTzeuvv/4by7KuFqphSLqKnHPDcZyW7u7uRdOmTXtpcHBwEADUzZs3DyUSiT3FYvFqVVUfmzd93vUdH3S8V+rekCMk9Yo7rtUwjDssy5qradqLbW1tvY2NjbNt27wW9nfS0BFY+16GMAghOydPnvyjIzymjXHO8cwzz/yZiLsbHqmGEvkBb7wAJWYgAFClqmqmvr7+kVwu9/Dzzz9vcs5pd3f3g4yxRQCwVzALlYZdusTscRxnzq5dux5ZsmSJm7wiJ5100uq6uroLHMe5af2W9X3l1CIeiVJuROSxWOy8oaGh2w3D+Hk2m32Mc04IIYwQ8rht258XDEDKlGKXCvnWh0KhL+fz+dZR1v2lBlHemM/nfyQaP4jXrfP53pVyt3DDLfAklNLBcDj82plnnvnMSy+9lBLEtSORyOdzudxjANAtVS6DT+DJbVYdFwqFVhSLxXsYY9QTsyh7L0cTARQhLaBp2n9ks9n/UhTltkwm85jb0ROPx892HGepFPIdSRuWbJxVEULWfu1rX/vFUWq+ZJxzPPvssx+hlL4rEkWsTKEI9ynoiCKipev6yydOPPGObDb7mCA+cV+jWCwu8/GMgu6JCgBZ0zT/7rrrrgtLrzPs0fY4Wq4dIrKGhoaTuru7HwOA0PTp0y/cunXrHokxuKqqf7Jt+xyP3+9XVePt/OHekG80Gr0sk8n88ShI/wEoEIlErs1ms/cCQK94b7bnsqRWcTdMSyile3Vd/3NjY+PzHR0duz2l2gAAfOrsqeN3te96kzEWDeha8m2BR0ScOG7iJbt7dr8zUoEgowH5hBAWCoWu6erq2kQI6V+6dOnpgviuhc+i0egVtm2fKyx/MkwmRJ/6/mpFUf6Yy+WOJvFdFCBLly59nBCy0VM0gp7OYRQh5DCl9INIJNI6derUr+Tz+Z9v27Ztt7BZ0DuHKNebG8c5j/gQPygC6r4vI1PITDjald4UAGD+/PlxVVVbAYArivKoiDLJqUeybNkyQ9y0POwv9ByUrgHxu3JXHwD0IWKmrq7utI+pt5ECAMRiMdeG2SyudwBgIwC0AUA7Iq5RVfW+eDx+3uLFi3WpBMxbwXuAINbX15+AiF3CxugWX3sE2vSK33UJ43A3AHQCwA5E7K6urv700bwnCgDAhAkTZhFCXgcArqrqA2T/B0VJwikAQCgUWi64vU/o/6REfJcBBsowQw8AMFVV7xc3lH5MOQy89957dUVRXhYE2Cy+biWE/MkwwrfW1tae5Mn1U59xtXDTTTfpDdOmNQtXD66//vowpXSjuA8yA7hM4DKGzAC7CSHtc+fOHXe0EEBBRIjFYosJIdsF8X9KKQWfCZzk5JNPrkXEnWKiRlJk/bwM4L28DNEHAElCSNfEiRObPEwGHwcKRKPR/4mIg4SQdaqq3huJRM5vaWmpkgiPkuv24S8JITBx4sQTdV2/TlGU3ymK8vTixYv1/X8ioOv63cJ+2CMR3YsCLgPsBICUpmmPiNclR8MQgnA4fA0iDgAAUxTlyZUrV1KfgA5FRNB1/V+F9PdLxE96VMBgGYboBQBmGMYtH6P0H3BaWlqMWCx24bRp08Z5pF2RxtZ+SPQTTjihKRKJ/K2iKA8h4loAeB8A1gNAW01Nzfnic5Hm5uZpSMgewfR7S6iB3QCwGxF76uvrTz3SkV03lwyGYXxVSHOWEPLqwoULoz4SSQAAm5ubpyJiv7D6Uz7wPzgM4veJ12qbO3duZIyucVPgo6FSHxJ98uTJE6qqqq5UFOVBRFwHAB0A8J4g/F8A4A0A2Kgoyq9FGFhBRIjH40sRMSs+/25B8B6J+B8AwD4EHBLCeOSJLxopbxfwtA8Rd02aNGl6gOFBEREURXnILYcWDJAKkHz5Zy8D9AAAj0QinxtDQy1chte8ki6IvlRV1Z8i4gYJqt8FgA3i+isArIP9MwTWAEB7KBT6skASFREhGo1eSgjZKlzKnCQ8OQAwCSEdsUjsC4eLiDhMnW+rqvpN0zTvEFxYH4lErs7lck+6ESxvnV9tbe2CgYGB10T7EpQprgwK+NgAME5RlEcty7oaEclRdPuCiA7yeyCEwPjx45sH0+nP2MXiuYyxBYyxceIxQ9IIOvSZUMakQRXj6+rqbuvv718pdh9Y8+fPr2tvb/+iZVktnPMmIVjdiqKsGjdu3GNlOp5GhQEURLSNcPif87nc3UIHVSuK8hJj7FJP6FG6J4QRQp6zbfsiye/nw5jDL98gAwCqFEVZefnll1/91FNPFY7yqjb0FFQwt2uXMUYmTJgwK5lMnuM4zmdFG7c7bConiO4Nx3p7B93egxAiyWua+nw0Gn2kr69vqzwW12Wye+65RwcAuPnmm4uMsQOE7UjNCaSI6MRisaXpdPpxznlKvPl4PB6/JJVK+eXfKQA40Wj04kwm84zU3hU0WMHbGk1FKlMnhOwMhUI/yufz94sPfDSGLgZK+Zw5cxI7d+5cUCgUWizLOptzfoIY5mAKSbd8Ipc8oBhEEzWMfbqu/yGRSDzZ09PzvkRY2ZZSpGoiOcXuHMn7QSQ/v0tY8N0AkCGEbFixYoUWVLG7P+lD34T93T39Pv6+eyWFcViQQpqDlNLVkUhk+YwZM+rwo7gCHuF6hQNWyiEicM6xoaHh5HA4fI2iKL8Q7eNJwdR9bhAGALaLr+732wBgKwBsETGC90WgqN19nKIoL0YikZumT58+SfIgiE9/34cMKEUPj46uW7FihaYoyioBaa4VaimK8v8CfE7XS/iXcgkSBLQRMUMI2UkpfU3TtNZoNPoPEyZMmCniCUeqXiGQ4JRSOPHEEydGo9Eluq5/n1L6CiJ2CwbNAcA+KfjSKb7/QHy/Sxh6O4Slv00Q/j3BFF2I+J6maY8kEolLlyxZEvaJDh606Fow4ad0Xf9uLBY740i4elgi9XlDPp+/X3xwVUBOjaZpT9i2vcxH/yMA8Hg8vsi27XmmacYBIE4ppY7j2AAwpKpqlhDSp6K6RzGUvc3NzXs2btzYxxjzTrlSRgHi/NrFDxjNMmvWrPGdnZ1zTdNcaNv2pxljMxlj9eL1iwLa7TL7hOTLbSJR9ut2ZIi4xTCMF2Kx2O96e3vbPfqbeQtcERGWL1+uP/HEE5/OZrPnm6Y5nXOuU6puevLJx++66qqr2GhCPwYNZnz33XfXCGvWlizNCKW03bbtMwQH+1r0AkIPWMXu/hww9YNKxRLsMIl90PO4BG+cPn1iuqdnTrFYPMtxnDMYY7M45+NFutoUuQoz4P6wgHFxjkx0AdldiqKsNgzjmXPOOeeV5557bkjq4yOewk3HfY8zZ86csHv37nPy+fwiy7KahF1REO8pWl1dfc/g4OBro5kCR5+Ahh0Oh/9haGjoQaHrVA/nR2Ox2N9nMpmV4sZZnptCfHLZOMIBiOXeL/Fxqw4g9nnnnRdpa2ubms1m59q2Pd9xnE8xxk4Ui6RdghckAwvLbBT1Dprm0lh5QgjpIYT8Rdf15yZPnvzn999/v9sj7d4NpOBK+8qVK+elUqm/MU1zgUgFF4Xa4fJ8Q0rprmuvvfYbDz74oD1aKIABLtx/27Z9MfhP5lQRMZ9IJJYmk8nXBGfToGFHh/GevBB+EDq4xL744ovD69evbx4aGpplmuaptm3PdZgzgzPeyDmvEs/hSpPlM3YNygyHlF9bE0RHQkgXIWStpml/aGhoWLVjx44PPERH73AHRIRfsV/Rm5tunp1KpRYWCoWFjuNMFkZeRnp/3ssGgEg8Hr8vlUqtGi0U8FrxfP78+eG//vWv6zjnkwLGtHB38lQoFPrhKaec0rpu3bp+n0mVfv+HZYYtsYDxHYCI8PLLLys33HBD/cDAwJRsNj/DccxZjLGTGWPTGGONnPOYuPFuQUZRClKREkMleYnCCyJiEgYA2ISQ3YSQNbquv5BINLzS1bV9t0R0Oc3ryLGD5cuX67/5zW9mpdPpMwuFwpmO45wgELQglYpxT12Bd6y9qqpq5zXXXPP10UKBgxhgxowZdVu3bn1LBDZsOLByR+ZoAgAxQkiHqqrPhcPhFxoaGjZs3ry5m3MOASNMwW9Uqvz90qVLQ2+//XZiYGCg3rKsJsuyJluWNV0QebLQ2dWimdStyClKlTgwjGwh94F7uXDThXaKiDlE3EYpfcMwjBcnTpz45ubNm2WG96oj7rpurpFp2/YZpmnOchxnotSVYw1jxoC3ytgSKviBdDr94migwEEM0NLSYrzyyitvcc6nDWNQkyNuVBgRLUTsQcQPKKU7EfEDROxVFCVj23ZOeAJIKSWqquq2bYcopXHLsmKO49QiYj1jrI5zXg37J2bGACDEOVek1zIlQjsQ3BFbrsbQa3+4BpwGAA4hpJsQskFRlNWRSOSV5cuXt915552mD9EPUHmEEJgwYcJpAwMDF4oI4amc8zqR788JiHfjH0Ml9hnL4+OYZ+KXQintPv3007+6Zs2aw46Oot+ETkVRfmWa5hUieKMMo2HDLWHSpBl19BA6cWwJ7hyfOf44zJn+QXMEHSlPrwtY54jYj4ibKaVrDMN4LZFIrNuzZ89eGclK2DkEAHhtbe2CZDL5Q8bY6ZzzkGS8WRJiEskITIv4yj7pPQW1nsnTxiwAiCUSiZ8mk8nfH244GP0GNsTj8fNSqdTzgluVEUSggqx7DIDcUiPeIWBlCx/mnGAmPUYRxNaEukkh4nZK6VpN014Nh8N/6e/v7/AQnEgQW8pbIQDAxo8ff0pvb+9GzrmLVKRE4asc0EmLYNKAVDnE5c4hnwETlFLafdFFF9387LPP5g8HBfxGpRPTNLfrul7jOM65UjyfjMAf95tUhSV2+JVajlCyxdyTYOHSpMwqd/mTiDq+oyjKM6FQ6IFoNHrXrbfe+oNVq1Y9Y5rm20NDQ4OSN0PK7A3yY3o6NDTUo2ma7jjOIs/QhiAGd587BPsXVRHBDLxMvz8X8/7G7d27N22a5ns+7XWHFQlEAMDW1lZ60003/USsaRmS5ujiKCVmcIRLGfyQxc3Ja24PvzDaeoCQzRRxk67r6yKRyMZ9+/bt9Ei4LAD8MI0pAgB88uTJ4zs7OzcKO8YuE1fwIpUi3O6twvaSoZ159hfaAgX6zz777K+sXr06d6goUGoCByeEgGEY1xUKhW8yxqaIFx7ymW+LZdyqcm1e5dQHFVItb/B0PiQ2QAel9F1VVdtUVX2ntra2Y+fOnakyBOejnE2jiOjour6iUCh8Rxh6agDhg7KjVBB/q1C/mo876DKqCQDRSCTyUC6XW3moHgEOp+Fj4sSJNf39/X9nmubnGGNzhIUOnkYINoJAkHfQMZVSn161ZCJiRiRU+gkhHxBC3qOUbjYMY0ttbe2u7du3p32ILffX86PQPYQAALNmzap+77332sSSC6vM5nI/5ncFaBt8NCuZBcwjQEppavbs2cs3bdqUOhQUwOFO8nKDMYlEYlahUPi0ZVmf4pzPZIxN4pzXiIYGbZjP+WHPHCLmASCHiCkA6FcUpQ8J6aaEdGma1q0oSl80Gu1DRFZdXb1nw4YNXT55c/RxzfjHVBtoa5r2VdM0fyjsJzqM8LJfEymITGKvlBzztqOZokvqIbf/cqSMjjCyQomDMmpnnXVWtLOzczyltCqbzdbYth1TVdUYGhpSXdgmhCCllGma5hQKBQcRHU3TbER0ENFyADgFoJZlqYyxsOM4YdM0qznnCcZYlDEWo5SSxprGb3T2du7ysc75WNpxuHDhwqo1a9a0McaaJI+Al6mK8kudo0gx7wtYlOk2mqZnzZp1w9tvv50cKQrgIRo8RLaSRR3Aly3LWkII6WSMUbHmxQYAqqqqwhjTGWMGYywMABGxG8cQwR5N3nQhGTs5dxVKdXX1jQMDA++N9U2cLgqEtNA/5838vQIFlDJSX2okLQokGJTC3N7ZBLFwOPxLsZxqRPcHR8PwicVi56XT6ZdKhH1ZQAOlJV2253tHqB41kUjcOjg4+PpR7gU8LBRoaWmJvPrqqxuE8WyWiIOU2kYiXzul+krHk6BCQkhx9uzZ17W1te0bCQrQw/2gc+bMSezevftpYQOkhRXr7rcZElKcE9/nhTtZ8Anrekeq2AAQr6qq+m4mk3nxGCH+hyiwa9eugqZpluM4l0puHQxzCIafJxSVClS8U0AdznkinU5zx3HeGsmmUnK48/03b978PcbYdPHm1ICgjrfCNmiWjssMRQCIGobxxFBu6LcigXKsEB+kaR2/lKaKOIc5HZwCwCTJ0JZHxykAkC8WixfNmDGjcSSDJ8nhzPiNRqOLLcv6R6luwFvpW2qIouMzU99lgrCiKOvvvffeexhnY13nBxGMtLW15QzD+IFkAwwnwhlUCOuuoZsAB45/d79njLHqzs7Oq8SU9CM2HwABgC9cuDCazWZ/LIw9v5Up3nFofvPz/WbnISFkYOrUqSu+9KUvWUe5F2DUUeDaa699nBDyjgj5OiWWWg9rRrCYOzBOQgV5UVS+WCwunj59etNwh1DTQ93n29vbe6dt2//LI/3lJmg6AcsVHGkYYigWi3177969bUdw8tfROuStt96yQqFQ1rKspT6j8LHMzsPAbSji+4LPsIjY0NAQdRznjeGE7MmhQH9tbe180zS/Iq124WWmZrIA4jNPRW3cMIzH0un0qmPM6CuJArfeeuuvRN9/yKe4NKgEjpfIl7gLsCOSGnAbVAvFonnhcFGAHspyB9M0f+I4jjzls9SoVD/o927WsgEgpCjKhvvvv//2Z5555liFfV8hW716tR2JRPpN0/ychALDTajxEvkDQxjM/MBaA54oFAoDYnV9SY9gJAjg5r1Ptm37PGnQU6ndOcOdnk0IIenm5uZjXe8HosDDDz/835TSdR4UGE6iDAMWZrhET3gMQhUAHNM0PyOmgzqjpQIIAEAymTxP9MRZZcakOj5XEDMY8Xj8u9u3b+88DvS+L2GvuuoqJxQKfS+gWLZkmV5AAQyX+gwjnv2AwBibcuKJJ9aW8zpGwgAcEUFAf1DggvvsznEC3EIumChuGMYTyWTyheNE75dCgd8RQtZIHkHJmowy5W4HLMsQ6sBFAOCch4aGhmpGkwHcUw3l16mxgNJm+WsRACKKoqy77bbbfnyEx72OGRSIRCL/7ukFDLL6g5ZUBRHUkAJDBAB0x3GUIxEHKAxjXLpTorSZiTCwRgjpb25u/vYdd9xhHmd6PxAFHnrooT9QSt/wWUUznBnJUKY20ZD6Es1IJFI2LzDS3bygKMo2H8sfAvx+P2QwRf9/IRaL3Sz0/vEu/QegQCwW+xoishLwD2W6pYKYwjUEQ4SQXR0dHfvKeRtkhJMyIRwOPy+2aZVKZQb5+yYAhAkhqWg0ujyZTLYdp0ZfybV0yWTydV3X7wpYSwcBm7+Ggw4uDap0Xf+9CAmT0VIBDADIwMDAelVVn4H9mymKJULAMjO4Wb8Epcr7TU1N16ZSqY3HsdFXTpCoaZp3GIbxC9i/iYQFrMwr1QHtpxIsAKhVFGXdFVdc8Wv4qEJq9AJBnHNoPKHxjVwydyHnvFnEA5yABI/rKoYQ0dY07ZeXX37ZN9988819nyDYD1pIRDjnv9M0rUrsBlB9egRLLaxkPsupagkhexoaGq559dVXe0eSFh7x+JgpU6ZMVhTlWaEO0rB/qOEu+GhKxg4A6EDEtaqq/jgej8/zTMX4pB+36Bai0egSQsg6icCWiLJmxb1NSaN2+uDAiaHdYoZyr6IoKydMmDB5JPcYD2ftGyEEwuHwZYVCYQljbAYAVHHOHURMEUK2a5q2NhKJrOrv69/GOIORzLH/BB0KAM6KFSuUH/zgB5dYlnUpY2wOANSIvkiOiFzsVjzgElvEBlVV3aTr+rPZbPZPomB22OiKh7v7T25/Xrt2bSSfz7N58+YVHn300YKnzQo+yZA/HCaQi20XLFgQy2azB/jxlFLuGebAN27cmCaEMOle45EuCg2yIxwfBsGjVJN/vKgEEnAvD5UGR4UBYARt2ZVzZGhTudeVUzmVUzmVUzmVUzmVUzmVUzmVUzmVUzmVUzmVUzmVUzmVUzmVUzmVUzmVUzmVUzmVs//8fzjsXcePS1GRAAAAAElFTkSuQmCC`,Fw=[{platform:`android`,channels:[{nameKey:`panel.links.distPlatform`,hintKey:`panel.links.domesticRecommended`,url:`https://app.wnluo.com/public/apps/14`},{name:`GitHub`,hintKey:`panel.links.overseasRecommended`,url:`https://github.com/WNLUO/dsh-mobile-plugin/releases/latest/download/ai-hub-android.apk`}]},{platform:`apple`,channels:[{name:`App Store`,hintKey:`panel.links.appStore`,url:`https://apps.apple.com/cn/app/ai-hub/id6821681438`},{name:`TestFlight`,hintKey:`panel.links.testFlight`,url:`https://testflight.apple.com/join/4fn5PCMD`}]}],Iw=[{nameKey:`panel.links.publicRelay`,url:`https://ai-hub-de-1.wnluo.com`}];Iw[0].url;function Lw(e){return e.name===`GitHub`?(0,J.jsx)(Uw,{}):e.name===`App Store`?(0,J.jsx)(Hw,{}):e.name===`TestFlight`?(0,J.jsx)(Gw,{}):(0,J.jsx)(Ww,{})}function Rw(e){return e===`android`?(0,J.jsx)(Vw,{}):(0,J.jsx)(Hw,{})}function zw({channel:e}){return(0,J.jsxs)(`a`,{className:`flex items-center gap-3 rounded-lg border border-border-muted px-3 py-2.5 transition-colors hover:bg-background-muted`,href:e.url,target:`_blank`,rel:`noreferrer noopener`,children:[(0,J.jsx)(`span`,{className:`flex size-9 shrink-0 items-center justify-center rounded-lg bg-background-muted text-foreground`,children:Lw(e)}),(0,J.jsxs)(`span`,{className:`flex min-w-0 flex-col gap-0.5`,children:[(0,J.jsx)(`span`,{className:`text-sm text-foreground-intense`,children:e.name??(e.nameKey?$(e.nameKey):``)}),(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:$(e.hintKey)})]})]})}function Bw({size:e=`md`}){let[t,n]=(0,g.useState)(!1),r=(0,g.useRef)(null);return(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(Ob,{variant:`outline`,size:e,onClick:()=>n(!0),children:`下载 APP`}),(0,J.jsx)(eC,{open:t,onOpenChange:n,children:(0,J.jsxs)(tC,{className:`max-w-xl`,closeLabel:$(`panel.common.close`),initialFocus:r,children:[(0,J.jsx)(nC,{children:(0,J.jsxs)(rC,{className:`flex items-center gap-2.5`,children:[(0,J.jsx)(`img`,{src:Pw,alt:``,className:`size-8 rounded-lg bg-white p-0.5`}),`下载 AI-HUB`]})}),(0,J.jsx)(`div`,{ref:r,tabIndex:-1,className:`outline-none`,children:(0,J.jsx)(iC,{className:`grid grid-cols-1 gap-4 sm:grid-cols-2`,children:Fw.map(e=>(0,J.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-center gap-1.5 pb-0.5 text-xs text-foreground-muted`,children:[Rw(e.platform),(0,J.jsx)(`span`,{children:$(e.platform===`android`?`panel.links.android`:`panel.links.apple`)})]}),e.channels.map(e=>(0,J.jsx)(zw,{channel:e},e.url))]},e.platform))})})]})})]})}function Vw(){return(0,J.jsx)(`svg`,{viewBox:`0 0 24 24`,className:`size-3.5 stroke-0`,fill:`currentColor`,"aria-hidden":`true`,children:(0,J.jsx)(`path`,{d:`M17.523 15.3414c-.5511 0-.9993-.4486-.9993-.9997s.4483-.9993.9993-.9993c.5511 0 .9993.4483.9993.9993.0001.5511-.4482.9997-.9993.9997m-11.046 0c-.5511 0-.9993-.4486-.9993-.9997s.4482-.9993.9993-.9993c.551 0 .9993.4483.9993.9993 0 .5511-.4483.9997-.9993.9997m11.4045-6.02 1.9973-3.4592a.416.416 0 0 0-.1521-.5676.416.416 0 0 0-.5676.1521l-2.0223 3.503C15.5902 8.2439 13.8533 7.8508 12 7.8508s-3.5902.3931-5.1367 1.0989L4.841 5.4467a.4161.4161 0 0 0-.5677-.1521.4157.4157 0 0 0-.1521.5676l1.9973 3.4592C2.6889 11.1867.3432 14.6589 0 18.761h24c-.3435-4.1021-2.6892-7.5743-6.1185-9.4396`})})}function Hw(){return(0,J.jsx)(`svg`,{viewBox:`0 0 24 24`,className:`size-4 stroke-0`,fill:`currentColor`,"aria-hidden":`true`,children:(0,J.jsx)(`path`,{d:`M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701`})})}function Uw(){return(0,J.jsx)(`svg`,{viewBox:`0 0 24 24`,className:`size-[18px] stroke-0`,fill:`currentColor`,"aria-hidden":`true`,children:(0,J.jsx)(`path`,{d:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`})})}function Ww(){return(0,J.jsxs)(`svg`,{viewBox:`0 0 24 24`,className:`size-[18px]`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.85`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,J.jsx)(`path`,{d:`M12 4v10`}),(0,J.jsx)(`path`,{d:`m8 10.5 4 4 4-4`}),(0,J.jsx)(`path`,{d:`M4 18.5h16`})]})}function Gw(){return(0,J.jsxs)(`svg`,{viewBox:`0 0 24 24`,className:`size-[18px]`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.85`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,J.jsx)(`path`,{d:`M21 3 3 10.5l7.5 3L14 21l7-18Z`}),(0,J.jsx)(`path`,{d:`M21 3 10.5 13.5`})]})}function Kw({status:e,pairing:t,addressBook:n,busy:r,error:i,restartError:a,onOpenConfig:o,onRegenerate:s,onReconnect:c,onRevokeAll:l,onSavePreferred:u}){let d=r!==``,f=e.pairingPolicy===`deny`?$(`panel.pairing.policyDeny`):$(`panel.pairing.policyCode`),p=t?.relayUrl||e.relayUrl||`—`,m=qw(n,t),[h,_]=g.useState({qr:!1,relay:!1,phone:!1}),v=e=>_(t=>({...t,[e]:!t[e]}));return(0,J.jsxs)(Pb,{frame:`solid`,children:[(0,J.jsx)(Fb,{children:(0,J.jsx)(Ib,{children:$(`panel.pairing.cardTitle`)})}),(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 rounded-md bg-background-muted px-3 py-2`,children:[(0,J.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,J.jsx)(`span`,{className:`text-sm text-foreground-muted`,children:$(`panel.pairing.code`)}),(0,J.jsx)(`span`,{className:`font-mono text-xl tracking-[0.2em] text-foreground-intense`,children:t?.pairingCode||e.pairingCode||`—`})]}),(0,J.jsx)(Nw,{value:t?.pairingCode||e.pairingCode||``,variant:`secondary`,size:`sm`,label:$(`panel.pairing.copyCode`),copiedLabel:$(`panel.pairing.copied`)})]}),i?(0,J.jsxs)(sb,{variant:`warning`,className:`mt-3`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.pairing.qrFailed`)}),(0,J.jsx)(db,{children:i})]}):null,(0,J.jsxs)(`div`,{className:`mt-3 flex flex-col gap-4 sm:flex-row`,children:[(0,J.jsxs)(`div`,{className:`flex shrink-0 flex-col items-center gap-3`,children:[(0,J.jsxs)(`div`,{className:`relative`,children:[!h.qr&&t?.svg?(0,J.jsxs)(`div`,{className:`flex size-[224px] flex-col items-center justify-center gap-1 rounded-md border border-border-muted bg-background-muted text-foreground-subtle`,children:[(0,J.jsx)(`span`,{className:`text-xs`,children:$(`panel.pairing.qrHidden`)}),(0,J.jsx)(Ox,{what:$(`panel.pairing.qr`),label:$(`panel.common.show`),onClick:()=>v(`qr`)})]}):(0,J.jsx)(`div`,{className:`flex items-start justify-center overflow-hidden rounded-md border border-border-muted bg-white p-3`,children:t?.svg?(0,J.jsx)(`div`,{className:`size-[200px] [&_svg]:h-full [&_svg]:w-full`,dangerouslySetInnerHTML:{__html:t.svg}}):(0,J.jsx)(`div`,{className:`flex size-[200px] items-center justify-center text-foreground-subtle`,children:r===`pairing`?(0,J.jsx)($y,{}):$(`panel.pairing.noQr`)})}),!h.qr&&t?.svg?null:(0,J.jsx)(Ox,{on:!0,what:$(`panel.pairing.qr`),label:$(`panel.pairing.hidden`),className:`absolute end-2 top-2`,disabled:!t?.svg,onClick:()=>v(`qr`)})]}),(0,J.jsx)(Ob,{variant:`outline`,size:`md`,disabled:d,onClick:s,children:`重新生成配对码`})]}),(0,J.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col`,children:[(0,J.jsxs)(Ex,{children:[(0,J.jsx)(Tx,{label:$(`panel.pairing.policy`),children:f}),(0,J.jsx)(Tx,{label:$(`panel.connection.relayUrl`),children:(0,J.jsxs)(`span`,{className:`inline-flex min-w-0 flex-wrap items-center justify-end gap-x-2 gap-y-1`,children:[h.relay?(0,J.jsx)(`span`,{className:`min-w-0 font-mono text-xs text-foreground-strong`,children:p}):(0,J.jsx)(`span`,{className:`text-xs text-foreground-subtle`,children:$(`panel.pairing.hidden`)}),(0,J.jsx)(Ox,{on:h.relay,what:$(`panel.connection.relayUrl`),label:h.relay?$(`panel.common.hide`):$(`panel.common.show`),onClick:()=>v(`relay`)})]})}),(0,J.jsxs)(Tx,{label:$(`panel.pairing.port`),mono:!0,children:[t?.lanPort??e.lan.port,t?.lanPortAdjusted?(0,J.jsx)(`span`,{className:`ml-2 font-sans text-xs text-foreground-muted`,children:$(`panel.pairing.portFallback`)}):null]}),(0,J.jsx)(Tx,{label:$(`panel.pairing.phoneAddress`),children:h.phone?(0,J.jsxs)(`span`,{className:`inline-flex min-w-0 flex-col items-end gap-1`,children:[(0,J.jsx)(Tw,{book:n,port:t?.lanPort??e.lan.port,value:n?.preferred??``,busy:d,onChange:u,fallbackUrls:t?.lanUrls??[]}),(0,J.jsx)(Ox,{on:!0,what:$(`panel.pairing.phoneAddress`),label:$(`panel.common.hide`),onClick:()=>v(`phone`)})]}):(0,J.jsxs)(`span`,{className:`inline-flex flex-wrap items-center justify-end gap-x-2 gap-y-1`,children:[(0,J.jsx)(`span`,{className:`text-xs text-foreground-subtle`,children:$(m?`panel.pairing.hidden`:`panel.pairing.noAddress`)}),(0,J.jsx)(Ox,{on:!1,what:$(`panel.pairing.phoneAddress`),label:$(`panel.common.show`),onClick:()=>v(`phone`)})]})})]}),(0,J.jsx)(`div`,{className:`mt-3 flex justify-end`,children:(0,J.jsx)(Ob,{variant:`outline`,size:`md`,disabled:d,onClick:o,children:`中转配置`})})]})]}),a?(0,J.jsxs)(sb,{variant:`error`,className:`mt-3`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.pairing.sidecarRestartFailed`)}),(0,J.jsx)(db,{children:a})]}):null,(0,J.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center justify-end gap-2`,children:[(0,J.jsx)(Bw,{}),(0,J.jsx)(Ob,{variant:`secondary`,size:`md`,disabled:d,onClick:c,children:`重新连接`}),(0,J.jsx)(Ob,{variant:`outline`,size:`md`,disabled:d,onClick:l,children:`吊销全部设备授权`})]})]})}function qw(e,t){return e&&e.lan.length+e.public.length>0?`book`:t?.lanUrls?.[0]??``}function Jw({status:e,busy:t,onChange:n}){let r=e.pairingPolicy===`code`,i=t!==``;return(0,J.jsxs)(Pb,{frame:`solid`,children:[(0,J.jsx)(Fb,{children:(0,J.jsxs)(Ib,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`span`,{children:$(`panel.devices.allowTitle`)}),(0,J.jsx)(Tb,{variant:r?`success`:`secondary`,size:`sm`,children:$(r?`panel.devices.allowOn`:`panel.devices.allowOff`)}),t===`policy`?(0,J.jsx)($y,{}):null]})}),(0,J.jsxs)(`label`,{className:`flex items-start justify-between gap-4 pt-1`,children:[(0,J.jsxs)(`span`,{className:`min-w-0`,children:[(0,J.jsx)(`span`,{className:`block text-sm text-foreground`,children:$(r?`panel.devices.allowOnHint`:`panel.devices.allowOffHint`)}),r?null:(0,J.jsx)(`span`,{className:`mt-0.5 block text-xs text-foreground-muted`,children:$(`panel.devices.allowOffNote`)})]}),(0,J.jsx)(`span`,{className:`flex shrink-0 items-center`,children:(0,J.jsx)(mx,{size:`md`,checked:r,disabled:i,onCheckedChange:e=>n(e?`code`:`deny`),"aria-label":$(`panel.devices.allowTitle`)})})]})]})}function Yw(e){let t=g.useRef(!0);t.current&&(t.current=!1,e())}function Xw(e){let[t,n]=g.useState({current:e,previous:null});return Object.is(e,t.current)||n({current:e,previous:t.current}),t.previous}var Zw=g.createContext(void 0),Qw=g.createContext(void 0),$w=g.createContext(void 0);function eT(){let e=g.useContext(Zw);if(e===void 0)throw Error(S(60));return e}function tT(){let e=g.useContext(Qw);if(e===void 0)throw Error(S(101));return e}function nT(){let e=g.useContext($w);if(e===void 0)throw Error(S(61));return e}function rT(e,t,n=Object.is){let{length:r}=e;if(r!==t.length)return!1;for(let i=0;i<r;i+=1)if(!n(e[i],t[i]))return!1;return!0}var iT=(e,t)=>Object.is(e,t);function aT(e,t,n){return e==null||t==null?Object.is(e,t):n(e,t)}function oT(e,t,n){return Array.isArray(e)&&Array.isArray(t)?!rT(e,t,(e,t)=>aT(e,t,n)):e!==t}function sT(e,t,n){return e?e.some(e=>e!==void 0&&aT(t,e,n)):!1}function cT(e,t,n){return e?e.findIndex(e=>e!==void 0&&aT(e,t,n)):-1}function lT(e,t){if(t!==iT)return n=>sT(e,n,t);let n=new Set(e);return n.delete(void 0),t=>n.has(t)&&(t!==0||e.some(e=>Object.is(t,e)))}function uT(e,t,n,r){let i=r&&Array.isArray(t)?e.findIndex(lT(t,n)):cT(e,t,n);return i===-1?null:i}function dT(e,t,n,r,i,a){return sT(r,t,i)?a!=null&&e>a&&sT(r,n[a],i)?a:e:e===a?uT(n,r,i,!0):a}function fT(e,t,n){return e.filter(e=>!aT(t,e,n))}function pT(e){return typeof e==`object`&&!!e&&Array.isArray(e.items)}function mT(e){return pT(e?.[0])}function hT(e){return mT(e)?e.flatMap(e=>e.items):e}function gT(e){if(!Array.isArray(e))return e!=null&&`null`in e;let t=e;if(mT(t)){for(let e of t)for(let t of e.items)if(t&&t.value==null&&t.label!=null)return!0;return!1}for(let e of t)if(e&&e.value==null&&e.label!=null)return!0;return!1}function _T(e,t){if(t&&e!=null)return t(e)??``;if(e&&typeof e==`object`){if(`label`in e&&e.label!=null)return String(e.label);if(`value`in e)return String(e.value)}return JC(e)}function vT(e,t){return t&&e!=null?t(e)??``:e&&typeof e==`object`&&`value`in e&&`label`in e?JC(e.value):JC(e)}function yT(e,t,n){function r(){return _T(e,n)}if(n&&e!=null)return n(e);if(e&&typeof e==`object`&&`label`in e&&e.label!=null)return e.label;if(t&&!Array.isArray(t))return(Object.hasOwn(t,e)?t[e]:void 0)??r();if(Array.isArray(t)){let n=hT(t);if(typeof e!=`object`||!e){let t=n.find(t=>t.value===e);return t&&t.label!=null?t.label:r()}if(`value`in e){let t=n.find(t=>t&&t.value===e.value);if(t&&t.label!=null)return t.label}}return r()}function bT(e,t,n){return e.reduce((e,r,i)=>(i>0&&e.push(`, `),e.push((0,J.jsx)(g.Fragment,{children:yT(r,t,n)},i)),e),[])}var xT={id:e=>e.id,labelId:e=>e.labelId,modal:e=>e.modal,items:e=>e.items,itemToStringLabel:e=>e.itemToStringLabel,isItemEqualToValue:e=>e.isItemEqualToValue,value:e=>e.value,hasSelectedValue:e=>{let{value:t,multiple:n,itemToStringValue:r}=e;return t==null?!1:n&&Array.isArray(t)?t.length>0:vT(t,r)!==``},hasNullItemLabel:(e,t)=>t?gT(e.items):!1,open:e=>e.open,mounted:e=>e.mounted,forceMount:e=>e.forceMount,transitionStatus:e=>e.transitionStatus,openMethod:e=>e.openMethod,activeIndex:e=>e.activeIndex,selectedIndex:e=>e.selectedIndex,isActive:(e,t)=>e.activeIndex===t,isSelected:(e,t)=>{let n=e.isItemEqualToValue,r=e.value;return e.multiple?Array.isArray(r)&&r.some(e=>aT(t,e,n)):aT(t,r,n)},isSelectedByFocus:(e,t)=>e.selectedIndex===t,popupProps:e=>e.popupProps,triggerProps:e=>e.triggerProps,triggerElement:e=>e.triggerElement,positionerElement:e=>e.positionerElement,listElement:e=>e.listElement,popupSide:e=>e.popupSide,scrollUpArrowVisible:e=>e.scrollUpArrowVisible,scrollDownArrowVisible:e=>e.scrollDownArrowVisible,hasScrollArrows:e=>e.hasScrollArrows};function ST(e,t){return Math.max(0,e-t)}function CT(e,t){if(t<=0)return 0;let n=ti(e,0,t),r=n,i=t-n,a=r<=1,o=i<=1;return a&&o?r<=i?0:t:a?0:o?t:n}function wT(e){let{id:t,value:n,defaultValue:r=null,onValueChange:i,open:a,defaultOpen:o=!1,onOpenChange:s,name:c,form:l,autoComplete:u,disabled:d=!1,readOnly:f=!1,required:_=!1,modal:v=!0,actionsRef:x,inputRef:S,onOpenChangeComplete:C,items:w,multiple:T=!1,itemToStringLabel:E,itemToStringValue:D,isItemEqualToValue:O=iT,highlightItemOnHover:k=!0,children:A}=e,{clearErrors:j}=ex(),{setDirty:M,setTouched:N,setFocused:P,validityData:F,setFilled:I,name:L,disabled:R,validation:z,validationMode:B}=Zb(),V=ox({id:t}),H=R||d,ee=L??c,[U,te]=Lb({controlled:n,default:T?r??m:r,name:`Select`,state:`value`}),[W,ne]=Lb({controlled:a,default:o,name:`Select`,state:`open`}),K=g.useRef([]),q=g.useRef([]),ie=g.useRef(null),ae=g.useRef(null),oe=g.useRef(0),se=g.useRef(null),ce=g.useRef([]),le=g.useRef(!1),ue=g.useRef(null),de=g.useRef(null),fe=g.useRef({allowSelectedMouseUp:!1,allowUnselectedMouseUp:!1,dragY:0}),pe=g.useRef(!1),me=g.useRef(U),{mounted:he,setMounted:ge,transitionStatus:_e}=Go(W),{openMethod:ve,triggerProps:ye}=TS(W),be=y(()=>new re({id:V,labelId:void 0,modal:v,multiple:T,itemToStringLabel:E,itemToStringValue:D,isItemEqualToValue:O,value:U,open:W,mounted:he,transitionStatus:_e,items:w,forceMount:!1,openMethod:null,activeIndex:null,selectedIndex:null,popupProps:h,triggerProps:h,triggerElement:null,positionerElement:null,listElement:null,popupSide:null,scrollUpArrowVisible:!1,scrollDownArrowVisible:!1,hasScrollArrows:!1},{setValue:p,setOpen:p,handleScrollArrowVisibility:p,onOpenChangeComplete:p,listRef:K,popupRef:ie,scrollHandlerRef:ae,scrollArrowsMountedCountRef:oe,valueRef:se,valuesRef:ce,labelsRef:q,typingRef:le,selectionRef:fe,firstItemTextRef:ue,selectedItemTextRef:de,alignItemWithTriggerActiveRef:pe,initialValueRef:me},xT)).current,xe=be.useState(`activeIndex`),Se=be.useState(`selectedIndex`),Ce=be.useState(`triggerElement`),we=be.useState(`positionerElement`),Te=Xw(ve),Ee=ve??Te,De=g.useMemo(()=>T?``:vT(U,D),[T,U,D]),Oe=g.useMemo(()=>T&&Array.isArray(U)?U.map(e=>vT(e,D)):vT(U,D),[T,U,D]);Qb(ra(Ce),V,U,G(()=>Oe),!H,c);let ke=T?Array.isArray(U)&&U.length>0:U!=null&&De!==``;b(()=>{I(ke)},[ke,I]),b(function(){let e=uT(ce.current,U,O,T);e===null&&(de.current=null),!W&&be.set(`selectedIndex`,e)},[T,W,U,O,be]),sx(U,()=>{j(ee),M(oT(U,F.initialValue,O)),z.change(U)});let Ae=G((e,t)=>{s?.(e,t),!t.isCanceled&&(ne(e),!e&&(t.reason===`focus-out`||t.reason===`outside-press`)&&(N(!0),P(!1),B===`onBlur`&&z.commit(U)))}),je=G(()=>{ge(!1),be.update({activeIndex:null,openMethod:null,scrollUpArrowVisible:!1,scrollDownArrowVisible:!1}),C?.(!1)});qr({enabled:!x,open:W,ref:ie,onComplete(){W||je()}}),g.useImperativeHandle(x,()=>({unmount:je}),[je]);let Me=G((e,t)=>{i?.(e,t),!t.isCanceled&&te(e)}),Ne=G(e=>{let t=ST(e.scrollHeight,e.clientHeight),n=CT(e.scrollTop,t),r=n>0,i=n<t;be.set(`scrollUpArrowVisible`,r),be.set(`scrollDownArrowVisible`,i)}),Pe=ls({open:W,onOpenChange:Ae,elements:{reference:Ce,floating:we}}),Fe=Na(Pe,{enabled:!H,event:`mousedown`}),Ie=Ia(Pe),Le=ys(Pe,{enabled:!H,listRef:K,activeIndex:xe,selectedIndex:Se,disabledIndices:m,onNavigate(e){(e!==null||W)&&be.set(`activeIndex`,e)},focusItemOnHover:k}),Re=bs(Pe,{enabled:!H&&(W||!f&&!T),listRef:q,activeIndex:xe,selectedIndex:Se,disabledIndices:e=>fw(K.current[e]),onMatch(e){W?be.set(`activeIndex`,e):Me(ce.current[e],Ji(Li))},onTyping(e){le.current=e}}),ze=g.useMemo(()=>gr(Re.reference,Le.reference,Ie.reference,Fe.reference,ye),[Fe.reference,Re.reference,Le.reference,Ie.reference,ye]),Be=g.useMemo(()=>gr(Ko,Re.floating,Le.floating,Ie.floating),[Re.floating,Le.floating,Ie.floating]),Ve=Le.item??h;be.useContextCallback(`setValue`,Me),be.useContextCallback(`setOpen`,Ae),be.useContextCallback(`handleScrollArrowVisibility`,Ne),be.useContextCallback(`onOpenChangeComplete`,C),Yw(()=>{be.update({popupProps:Be,triggerProps:ze})}),be.useSyncedValues({id:V,modal:v,multiple:T,value:U,open:W,mounted:he,transitionStatus:_e,popupProps:Be,triggerProps:ze,items:w,itemToStringLabel:E,itemToStringValue:D,isItemEqualToValue:O,openMethod:Ee});let He=g.useMemo(()=>({disabled:H,readOnly:f,required:_,multiple:T,highlightItemOnHover:k,itemProps:Ve}),[H,f,_,T,k,Ve]),Ue=ir(S,z.inputRef),We=T?void 0:ee,Ge=g.useMemo(()=>!T||!Array.isArray(U)||!ee?null:U.map(e=>{let t=vT(e,D);return(0,J.jsx)(`input`,{type:`hidden`,form:l,name:ee,value:t,disabled:H},t)}),[T,U,l,ee,D,H]);return(0,J.jsxs)(Zw.Provider,{value:be,children:[(0,J.jsx)(Qw.Provider,{value:He,children:(0,J.jsx)($w.Provider,{value:Pe,children:A})}),(0,J.jsx)(`input`,{...z.getValidationProps(H,{onFocus(){be.state.triggerElement?.focus({focusVisible:!0})},onChange(e){if(e.nativeEvent.defaultPrevented||H||f)return;let t=e.currentTarget.value,n=Ji(Li,e.nativeEvent);function r(){if(T)return;let e=t.toLowerCase(),r=ce.current.findIndex(t=>vT(t,D).toLowerCase()===e||_T(t,E).toLowerCase()===e);r===-1&&(r=ce.current.findIndex((t,n)=>{let r=q.current[n];return r!=null&&r.toLowerCase()===e}));let i=ce.current[r];i!=null&&Me(i,n)}be.set(`forceMount`,!0),queueMicrotask(r)}}),id:V&&We==null?`${V}-hidden-input`:void 0,form:l,name:We,autoComplete:u,value:De,disabled:H,required:_&&!(T&&ke),readOnly:f,ref:Ue,style:ee?nr:tr,tabIndex:-1,"aria-hidden":!0,suppressHydrationWarning:!0}),Ge]})}function TT(e,t){return e??t}var ET=5;function DT(e,t){let n=OT(t);return e.clientX>=n.left-ET&&e.clientX<=n.right+ET&&e.clientY>=n.top-ET&&e.clientY<=n.bottom+ET}function OT(e){let t=e.getBoundingClientRect(),n=ce(e);if(rt)return t;let r=n.getComputedStyle(e,`::before`),i=n.getComputedStyle(e,`::after`);if(r.content===`none`&&i.content===`none`)return t;let a=parseFloat(r.width)||0,o=parseFloat(r.height)||0,s=parseFloat(i.width)||0,c=parseFloat(i.height)||0,l=Math.max(t.width,a,s),u=Math.max(t.height,o,c),d=l-t.width,f=u-t.height;return{left:t.left-d/2,right:t.right+d/2,top:t.top-f/2,bottom:t.bottom+f/2}}var kT=`data-popup-side`,AT=400,jT={...Ot,...Gb,popupSide:e=>e?{[kT]:e}:null,value:()=>null},MT=g.forwardRef(function(e,t){let{render:n,className:r,id:i,disabled:a=!1,nativeButton:o=!0,style:s,...c}=e,{setTouched:l,setFocused:u,validationMode:d,validation:f,state:p,disabled:m}=Zb(),{labelId:h}=nx(),_=eT(),{readOnly:v,required:y,disabled:b}=tT(),x=m||b||a,S=_.useState(`open`),C=_.useState(`mounted`),w=_.useState(`value`),T=_.useState(`triggerProps`),E=_.useState(`positionerElement`),D=_.useState(`listElement`),O=_.useState(`popupSide`),k=_.useState(`id`),A=_.useState(`labelId`),j=_.useState(`hasSelectedValue`),M=C&&E?O:null,N=i??k,P=TT(h,A);ox({id:i});let F=ra(E),I=g.useRef(null),{getButtonProps:L,buttonRef:R}=Mi({disabled:x,native:o}),z=_.useStateSetter(`triggerElement`),B=Be(),V=Be(),H=Be();g.useEffect(()=>{if(S)return H.start(AT,()=>{_.context.selectionRef.current.allowUnselectedMouseUp=!0,_.context.selectionRef.current.allowSelectedMouseUp=!0}),()=>{H.clear()};_.context.selectionRef.current={allowSelectedMouseUp:!1,allowUnselectedMouseUp:!1,dragY:0},V.clear()},[S,_,V,H]);let ee=gr(T,{id:N,role:`combobox`,"aria-expanded":S,"aria-haspopup":`listbox`,"aria-controls":S?D?.id??It(E)?.id:void 0,"aria-labelledby":P,"aria-readonly":v||void 0,"aria-required":y||void 0,tabIndex:x?-1:0,onFocus(e){u(!0),S&&_.context.alignItemWithTriggerActiveRef.current&&_.context.setOpen(!1,Ji(Li,e.nativeEvent)),B.start(0,()=>{_.set(`forceMount`,!0)})},onBlur(e){at(E,e.relatedTarget)||(l(!0),u(!1),d===`onBlur`&&f.commit(w))},onMouseDown(e){if(S)return;let t=Me(e.currentTarget);function n(e){if(!I.current)return;let t=e.target;at(I.current,t)||at(F.current,t)||DT(e,I.current)||_.context.setOpen(!1,Ji(Gi,e))}V.start(0,()=>{t.addEventListener(`mouseup`,n,{once:!0})})}},c,L),U=f.getValidationProps(x,ee);U.role=`combobox`;let te={...p,open:S,disabled:x,value:w,readOnly:v,popupSide:M,placeholder:!j};return Ar(`button`,e,{ref:[t,I,R,z],state:te,stateAttributesMapping:jT,props:U})}),NT={value:()=>null},PT=g.forwardRef(function(e,t){let{className:n,render:r,children:i,placeholder:a,style:o,...s}=e,c=eT(),l=c.useState(`value`),u=c.useState(`items`),d=c.useState(`itemToStringLabel`),f=c.useState(`hasSelectedValue`),p=!f&&a!=null&&i==null,m=c.useState(`hasNullItemLabel`,p),h={value:l,placeholder:!f},g=null;return g=typeof i==`function`?i(l):i??(p&&!m?a:Array.isArray(l)?bT(l,u,d):yT(l,u,d)),Ar(`span`,e,{state:h,ref:[t,c.context.valueRef],props:[{children:g},s],stateAttributesMapping:NT})}),FT=g.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e;return Ar(`span`,e,{state:{open:eT().useState(`open`)},ref:t,props:[{"aria-hidden":!0,children:`▼`},a],stateAttributesMapping:Dt})}),IT=g.forwardRef(function(e,t){let n=eT(),r=n.useState(`mounted`),i=n.useState(`forceMount`);return r||i?(0,J.jsx)(ea,{ref:t,...e}):null}),LT=g.createContext(void 0);function RT(){let e=g.useContext(LT);if(!e)throw Error(S(59));return e}function zT(e,t){e&&Object.assign(e.style,t)}var BT={position:`relative`,maxHeight:`100%`,overflowX:`hidden`,overflowY:`auto`},VT=20;function HT(e,t,n,r){let[i,a]=g.useState(!1);b(()=>{if(!e||!t||n==null){a(!1);return}let r=Me(n).documentElement.clientWidth,i=n.offsetWidth;a(r>0&&i>0&&i>=r-VT)},[e,t,n]),Vx(e&&(!t||i),r)}var UT={position:`fixed`},WT=g.forwardRef(function(e,t){let{anchor:n,className:r,render:i,positionMethod:a,side:o,align:s,sideOffset:c,alignOffset:l,collisionBoundary:u=`clipping-ancestors`,collisionPadding:d,arrowPadding:f,sticky:p,disableAnchorTracking:m,alignItemWithTrigger:h=!0,collisionAvoidance:_=$r,style:v,...y}=e,x=eT(),S=nT(),C=x.useState(`open`),w=x.useState(`mounted`),T=x.useState(`modal`),E=x.useState(`value`),D=x.useState(`openMethod`),O=x.useState(`positionerElement`),k=x.useState(`triggerElement`),A=x.useState(`isItemEqualToValue`),j=x.useState(`transitionStatus`),M=g.useRef(null),N=g.useRef(null),[P,F]=g.useState(h),I=w&&P&&D!==`touch`;!w&&P!==h&&F(h),g.useImperativeHandle(x.context.alignItemWithTriggerActiveRef,()=>I),HT((I||T)&&C,D===`touch`,O,k);let L=Is({anchor:n,floatingRootContext:S,positionMethod:a,mounted:w,side:o,sideOffset:c,align:s,alignOffset:l,arrowPadding:f,collisionBoundary:u,collisionPadding:d,sticky:p,disableAnchorTracking:m??I,collisionAvoidance:_,keepMounted:!0}),R=I?`none`:L.side,z=I?UT:L.positionerStyles,B={open:C,side:R,align:L.align,anchorHidden:L.anchorHidden};b(()=>{x.set(`popupSide`,L.side)},[x,L.side]);let V=Bs(e,B,{styles:z,transitionStatus:j,props:y,refs:[t,x.useStateSetter(`positionerElement`)],hidden:!w,inert:!C}),H=g.useRef(0),ee=G(e=>{if(x.context.valuesRef.current.length===0)return;let t=H.current;H.current=e.size;let n=Ji(Li);if(t!==0&&!x.state.multiple&&E!==null&&cT(x.context.valuesRef.current,E,A)===-1){let e=x.context.initialValueRef.current,t=e!=null&&cT(x.context.valuesRef.current,e,A)!==-1?e:null;x.context.setValue(t,n),t===null&&(x.set(`selectedIndex`,null),x.context.selectedItemTextRef.current=null)}if(t!==0&&x.state.multiple&&Array.isArray(E)){let e=E.filter(e=>cT(x.context.valuesRef.current,e,A)!==-1);e.length!==E.length&&(x.context.setValue(e,n),e.length===0&&(x.set(`selectedIndex`,null),x.context.selectedItemTextRef.current=null))}if(C&&I){x.update({scrollUpArrowVisible:!1,scrollDownArrowVisible:!1});let e={height:``};zT(O,e),zT(x.context.popupRef.current,e)}}),U=g.useMemo(()=>({...L,side:R,alignItemWithTriggerActive:I,setControlledAlignItemWithTrigger:F,scrollUpArrowRef:M,scrollDownArrowRef:N}),[L,R,I,F]);return(0,J.jsx)(aw,{elementsRef:x.context.listRef,labelsRef:x.context.labelsRef,onMapChange:ee,children:(0,J.jsxs)(LT.Provider,{value:U,children:[w&&T&&(0,J.jsx)(bS,{inert:zr(!C),cutout:k}),V]})})}),GT=`base-ui-disable-scrollbar`,KT={className:GT,getElement(e){return(0,J.jsx)(`style`,{nonce:e,href:GT,precedence:`base-ui:low`,children:`.${GT}{scrollbar-width:none}.${GT}::-webkit-scrollbar{display:none}`})}},qT=g.createContext(void 0);function JT(e){let t=g.useContext(qT);if(t===void 0&&!e)throw Error(S(69));return t}var YT=g.createContext(void 0),XT={disableStyleElements:!1};function ZT(){return g.useContext(YT)??XT}var QT=`--transform-origin`,$T={...kt,...gt},eE=g.forwardRef(function(e,t){let{render:n,className:r,style:i,finalFocus:a,...o}=e,s=eT(),{multiple:c,readOnly:l,highlightItemOnHover:u}=tT(),d=nT(),{side:f,align:p,alignItemWithTriggerActive:m,isPositioned:h,setControlledAlignItemWithTrigger:_}=RT(),v=JT(!0)!=null,y=Ss(),{nonce:x,disableStyleElements:S}=ZT(),C=s.useState(`id`),w=s.useState(`open`),T=s.useState(`openMethod`),E=s.useState(`mounted`),D=s.useState(`popupProps`),O=s.useState(`transitionStatus`),k=s.useState(`triggerElement`),A=s.useState(`positionerElement`),j=s.useState(`listElement`),M=g.useRef(!1),N=g.useRef(!1),P=g.useRef({}),F=Le(),I=G(e=>{if(!A||!s.context.popupRef.current||!N.current)return;let t=A.style.top===`0px`,n=A.style.bottom===`0px`;if(M.current||!m||!t&&!n){s.context.handleScrollArrowVisibility(e);return}let r=rE(A),i=iE(A.getBoundingClientRect().height,`y`,r),a=Me(A),o=ce(A),c=o.getComputedStyle(A),l=parseFloat(c.marginTop),u=parseFloat(c.marginBottom),d=tE(o.getComputedStyle(s.context.popupRef.current)),f=Math.min(a.documentElement.clientHeight-l-u,d),p=e.scrollTop,h=nE(e),g=null,_=e=>{A.style.height=`${e}px`},v=t?h-p:p,y=Math.min(i+v,f);if(v<=1){let n=ti(v,0,f-i);n>0&&_(i+n),e.scrollTop=t?h:0,f-(i+n)<=1&&(M.current=!0),s.context.handleScrollArrowVisibility(e);return}f-y>1?g=t?1/0:0:n&&p<h&&(g=p-(v-(i+v-f)));let b=Math.ceil(y);if(b!==0&&_(b),g!=null){let t=ti(g,0,nE(e));Math.abs(e.scrollTop-t)>1&&(e.scrollTop=t)}b>=f-1&&(M.current=!0),s.context.handleScrollArrowVisibility(e)});g.useImperativeHandle(s.context.scrollHandlerRef,()=>I,[I]),qr({open:w,ref:s.context.popupRef,onComplete(){w&&s.context.onOpenChangeComplete(!0)}});let L={open:w,transitionStatus:O,side:f,align:p};b(()=>{A&&s.context.popupRef.current&&!Object.keys(P.current).length&&(P.current={top:A.style.top||`0`,left:A.style.left||`0`,right:A.style.right,height:A.style.height,bottom:A.style.bottom,minHeight:A.style.minHeight,maxHeight:A.style.maxHeight,marginTop:A.style.marginTop,marginBottom:A.style.marginBottom})},[s,A]),b(()=>{w||m||(N.current=!1,M.current=!1,zT(A,P.current))},[w,m,A]),b(()=>{let e=s.context.popupRef.current;if(!w||!k||!A||!e||m&&!h||s.state.transitionStatus===`ending`)return;if(N.current=!0,e.style.removeProperty(QT),!m){F.request(()=>s.context.handleScrollArrowVisibility(j||e));return}let t=sE(e);try{let t=s.context.selectedItemTextRef.current;t?.isConnected||(t=!s.select(`hasSelectedValue`)&&s.context.firstItemTextRef.current?.isConnected?s.context.firstItemTextRef.current:null);let n=s.context.valueRef.current,r=ce(A),i=r.getComputedStyle(A),a=r.getComputedStyle(e),o=Me(k),c=rE(k),l=aE(k.getBoundingClientRect(),c),d=aE(A.getBoundingClientRect(),c),f=l.height,p=j||e,m=p.scrollHeight,h=parseFloat(a.borderBottomWidth),g=parseFloat(i.marginTop)||10,v=parseFloat(i.marginBottom)||10,b=parseFloat(i.minHeight)||100,x=tE(a),S=o.documentElement.clientHeight-g-v,C=o.documentElement.clientWidth,w=S-l.bottom+f,T,E=y===`rtl`?l.right-d.width:l.left,D=0;if(t&&n){let e=aE(n.getBoundingClientRect(),c);T=aE(t.getBoundingClientRect(),c),E=d.left+(y===`rtl`?e.right-T.right:e.left-T.left);let r=e.top-l.top+e.height/2;D=T.top-d.top+T.height/2-r}let O=w+D+v+h,N=Math.min(S,O),F=S-g-v,I=O-N,L=C-5;A.style.left=`${ti(E,5,L-d.width)}px`,A.style.height=`${N}px`,A.style.maxHeight=`none`,A.style.marginTop=`${g}px`,A.style.marginBottom=`${v}px`,e.style.height=`100%`;let R=nE(p),z=I>=R-1;z&&(N=Math.min(S,d.height)-(I-R));let B=l.top<20||l.bottom>S-20||Math.ceil(N)+1<Math.min(m,b),V=(r.visualViewport?.scale??1)!==1&&tt;if(B||V){zT(A,P.current),_(!1);return}let H=Math.max(b,N);if(z){let e=Math.max(0,S-O);A.style.top=d.height>=F?`0`:`${e}px`,A.style.height=`${N}px`,p.scrollTop=nE(p)}else A.style.bottom=`0`,p.scrollTop=I;if(T){let t=d.top,n=d.height,r=T.top+T.height/2,i=ti(n>0?(r-t)/n*100:50,0,100);e.style.setProperty(QT,`50% ${i}%`)}(H===S||N>=x)&&(M.current=!0),s.context.handleScrollArrowVisibility(p),u&&s.state.selectedIndex===null&&s.state.activeIndex===null&&s.context.listRef.current[0]!=null&&s.set(`activeIndex`,0)}finally{t()}},[s,w,A,k,m,_,F,j,u,y,h]),g.useEffect(()=>{if(!m||!A||!w)return;let e=ce(A);function t(e){s.context.setOpen(!1,Ji(qi,e))}return Ne(e,`resize`,t)},[s,m,A,w]);let R={...j?{role:`presentation`}:{role:`listbox`,"aria-multiselectable":c||void 0,"aria-readonly":l||void 0,id:`${C}-list`},onKeyDown(e){v&&cS.has(e.key)&&e.stopPropagation()},onScroll(e){j||I(e.currentTarget)},...m&&{style:j?{height:`100%`}:BT},className:!j&&m?KT.className:void 0},z=Ar(`div`,e,{ref:[t,s.context.popupRef],state:L,stateAttributesMapping:$T,props:[D,R,zs(O),o]});return(0,J.jsxs)(g.Fragment,{children:[!S&&KT.getElement(x),(0,J.jsx)(Ma,{context:d,modal:!1,disabled:!E,openInteractionType:T,returnFocus:a,restoreFocus:!0,children:z})]})});function tE(e){let t=e.maxHeight;return t.endsWith(`px`)&&parseFloat(t)||1/0}function nE(e){return ST(e.scrollHeight,e.clientHeight)}function rE(e){return bo.getScale(e)}function iE(e,t,n){return e/n[t]}function aE(e,t){return vn({x:iE(e.x,`x`,t),y:iE(e.y,`y`,t),width:iE(e.width,`x`,t),height:iE(e.height,`y`,t)})}var oE=[[`transform`,`none`],[`scale`,`1`],[`translate`,`0 0`]];function sE(e){let{style:t}=e,n={};for(let[e,r]of oE)n[e]=t.getPropertyValue(e),t.setProperty(e,r,`important`);return()=>{for(let[e]of oE){let r=n[e];r?t.setProperty(e,r):t.removeProperty(e)}}}var cE=g.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,o=eT(),{multiple:s,readOnly:c}=tT(),{alignItemWithTriggerActive:l}=RT(),u=o.useState(`hasScrollArrows`),d=o.useState(`openMethod`),f={id:`${o.useState(`id`)}-list`,role:`listbox`,"aria-multiselectable":s||void 0,"aria-readonly":c||void 0,onScroll(e){o.context.scrollHandlerRef.current?.(e.currentTarget)},...l&&{style:BT},className:u&&d!==`touch`?KT.className:void 0};return Ar(`div`,e,{ref:[t,o.useStateSetter(`listElement`)],props:[f,a]})}),lE=g.createContext(void 0);function uE(){let e=g.useContext(lE);if(!e)throw Error(S(57));return e}var dE=g.memo(g.forwardRef(function(e,t){let{render:n,className:r,style:i,value:a=null,label:o,disabled:s=!1,nativeButton:c=!1,...l}=e,u=g.useRef(null),d=UC({guess:!0,label:o,textRef:u}),f=eT(),{itemProps:p,multiple:m,disabled:h,readOnly:_}=tT(),v=h||s,y=f.useState(`isActive`,d.index),x=f.useState(`open`),S=f.useState(`isSelected`,a),C=f.useState(`isSelectedByFocus`,d.index),w=f.useState(`isItemEqualToValue`),T=d.index,E=g.useRef(null);b(()=>{let e=f.context.valuesRef.current;return e[T]=a,()=>{delete e[T]}},[T,a,f]),b(()=>{let e=f.state.value,t=f.state.selectedIndex,n=t,r;m&&Array.isArray(e)?(n=dT(T,a,f.context.valuesRef.current,e,w,t),r=n===T,T===t&&!r&&(f.context.selectedItemTextRef.current=null)):(r=e!==void 0&&aT(a,e,w),r&&(n=T)),f.set(`selectedIndex`,n),r&&u.current&&(f.context.selectedItemTextRef.current=u.current)},[T,m,w,f,a]);let D=g.useRef(`mouse`),O=g.useRef(!1),{getButtonProps:k,buttonRef:A}=Mi({disabled:v,focusableWhenDisabled:!0,native:c,composite:!0}),j={disabled:v,selected:S,highlighted:y};function M(e){if(h||_)return;let t=f.state.value;if(m){let n=Array.isArray(t)?t:[],r=S?fT(n,a,w):[...n,a];f.context.setValue(r,Ji(Bi,e))}else f.context.setValue(a,Ji(Bi,e)),f.context.setOpen(!1,Ji(Bi,e))}function N(){f.context.selectionRef.current.dragY=0}let P={role:`option`,"aria-selected":S,tabIndex:x&&y?0:-1,onKeyDown(e){f.set(`activeIndex`,T),e.key===` `&&f.context.typingRef.current&&e.preventDefault()},onClick(e){let t=D.current!==`touch`,n=e.nativeEvent.pointerType,r=t&&Vt(e.nativeEvent)&&(n!==void 0||y),i=t&&!r&&!O.current;O.current=!1,!(v||i)&&M(e.nativeEvent)},onPointerEnter(e){D.current=e.pointerType},onPointerMove(e){if(e.pointerType===`mouse`&&e.buttons===1){let t=f.context.selectionRef.current;t.dragY+=e.movementY,t.dragY**2>=64&&(t.allowUnselectedMouseUp=!0)}},onPointerDown(e){D.current=e.pointerType,O.current=!0,N()},onMouseUp(){if(N(),v||D.current===`touch`||O.current)return;let e=!f.context.selectionRef.current.allowSelectedMouseUp&&S,t=!f.context.selectionRef.current.allowUnselectedMouseUp&&!S;e||t||(O.current=!0,E.current?.click(),O.current=!1)}},F=Ar(`div`,e,{ref:[A,t,d.ref,E],state:j,props:[p,P,l,k]}),I=g.useMemo(()=>({selected:S,index:T,textRef:u,selectedByFocus:C}),[S,T,u,C]);return(0,J.jsx)(lE.Provider,{value:I,children:F})})),fE=g.forwardRef(function(e,t){let{selected:n}=uE();return e.keepMounted||n?(0,J.jsx)(pE,{...e,ref:t}):null}),pE=g.memo(g.forwardRef((e,t)=>{let{render:n,className:r,style:i,keepMounted:a,...o}=e,{selected:s}=uE(),c=g.useRef(null),{transitionStatus:l,setMounted:u}=Go(s),d=Ar(`span`,e,{ref:[t,c],state:{selected:s,transitionStatus:l},props:[{"aria-hidden":!0,children:`✔️`},o],stateAttributesMapping:gt});return qr({batch:!0,enabled:!s,open:s,ref:c,onComplete(){s||u(!1)}}),d})),mE=g.memo(g.forwardRef(function(e,t){let{index:n,textRef:r,selectedByFocus:i}=uE(),a=eT(),{render:o,className:s,style:c,...l}=e;return Ar(`div`,e,{ref:[g.useCallback(e=>{e&&(n===0&&(a.context.firstItemTextRef.current=e),i&&(a.context.selectedItemTextRef.current=e))},[a,n,i]),t,r],props:l})})),hE=g.forwardRef(function(e,t){let{render:n,className:r,style:i,direction:a,keepMounted:o,...s}=e,c=a===`up`,l=eT(),{side:u,scrollDownArrowRef:d,scrollUpArrowRef:f}=RT(),p=c?`scrollUpArrowVisible`:`scrollDownArrowVisible`,m=l.useState(p),h=l.useState(`openMethod`),g=m&&h!==`touch`,_=Be(),v=c?f:d,{mounted:y,transitionStatus:x,setMounted:S}=Go(g);b(()=>(l.context.scrollArrowsMountedCountRef.current+=1,l.set(`hasScrollArrows`,!0),()=>{l.context.scrollArrowsMountedCountRef.current=Math.max(0,l.context.scrollArrowsMountedCountRef.current-1),l.context.scrollArrowsMountedCountRef.current===0&&l.set(`hasScrollArrows`,!1)}),[l]),qr({open:g,ref:v,onComplete(){g||S(!1)}});let C=Ar(`div`,e,{ref:[t,v],state:{direction:a,visible:g,side:u,transitionStatus:x},props:[{"aria-hidden":!0,children:c?`▲`:`▼`,style:{position:`absolute`},onMouseMove(e){if(e.movementX===0&&e.movementY===0||_.isStarted())return;l.set(`activeIndex`,null);function t(){let e=l.state.listElement??l.context.popupRef.current;if(!e)return;l.set(`activeIndex`,null),l.context.handleScrollArrowVisibility(e);let n=ST(e.scrollHeight,e.clientHeight),r=CT(e.scrollTop,n),i=r===(c?0:n),a=l.context.listRef.current;if(r!==e.scrollTop&&(e.scrollTop=r),i){_.clear();return}if(a.length>0){let t=v.current?.offsetHeight||0;e.scrollTop=gE(a,c,r,e.clientHeight,t,n)}_.start(40,t)}_.start(40,t)},onMouseLeave(){_.clear()}},s],stateAttributesMapping:gt});return y||o?C:null});function gE(e,t,n,r,i,a){if(t){let t=0,r=n+i-1;for(let n=0;n<e.length;n+=1){let i=e[n];if(i&&i.offsetTop>=r){t=n;break}}let o=Math.max(0,t-1),s=e[o];return o<t&&s?CT(s.offsetTop-i,a):0}let o=e.length-1,s=n+r-i+1;for(let t=0;t<e.length;t+=1){let n=e[t];if(n&&n.offsetTop+n.offsetHeight>s){o=Math.max(0,t-1);break}}let c=Math.min(e.length-1,o+1),l=e[c];return c>o&&l?CT(l.offsetTop+l.offsetHeight-r+i,a):a}var _E=g.forwardRef(function(e,t){return(0,J.jsx)(hE,{...e,ref:t,direction:`down`})}),vE=g.forwardRef(function(e,t){return(0,J.jsx)(hE,{...e,ref:t,direction:`up`})}),yE=[`side`,`sideOffset`,`align`,`alignOffset`,`anchor`,`positionMethod`,`collisionBoundary`,`collisionPadding`,`collisionAvoidance`,`sticky`,`arrowPadding`,`disableAnchorTracking`],bE=[`container`,`keepMounted`];function xE(e){let{positionerProps:t,portalProps:n,...r}=e,i={...t},a={...n},o={};for(let e of Object.keys(r)){let t=r[e];yE.includes(e)?t!==void 0&&(i[e]=t):bE.includes(e)?t!==void 0&&(a[e]=t):o[e]=t}return{positioner:i,portal:a,popup:o}}var SE=g.createContext(null);function CE(){let e=g.useContext(SE);if(!e)throw Error(`Select sub-components must be rendered inside <Select>`);return e}function wE({size:e=`md`,variant:t=`outline`,alignItemWithTrigger:n=!0,value:r,defaultValue:i,onValueChange:a,multiple:o=!1,children:s,...c}){let l=My(),u=r!==void 0,[d,f]=g.useState(i??(o?[]:null)),p=u?r:d,m=o?Array.isArray(p)&&p.length>0:p!=null&&p!==``,h=g.useCallback((e,t)=>{u||f(e),a?.(e,t)},[u,a]),_=g.useCallback(e=>{let t=o?[]:null,n={reason:`none`,event:e?.nativeEvent??new Event(`clear`),trigger:void 0,cancel:()=>{},allowPropagation:()=>{},isCanceled:!1,isPropagationAllowed:!1};h(t,n)},[o,h]),v=g.useMemo(()=>({size:e,variant:t,alignItemWithTrigger:n,hasValue:m,clear:_,multiple:o,reducedMotion:l}),[e,t,n,m,_,o,l]);return(0,J.jsx)(SE.Provider,{value:v,children:(0,J.jsx)(wT,{value:p,onValueChange:h,multiple:o,...c,children:s})})}var TE={sm:`size-4`,md:`size-4.5`,lg:`size-5`};function EE({className:e,clearable:t,startSlot:n,endSlot:r,children:i,onKeyDown:a,...o}){let{size:s,variant:c,alignItemWithTrigger:l,hasValue:u,clear:d}=CE(),f=TE[s],p=o[`aria-invalid`],m=p===!0||p===`true`,h=t&&u,g=e=>{a?.(e),!e.defaultPrevented&&h&&(e.key===`Delete`||e.key===`Backspace`)&&(e.preventDefault(),d(e))};return(0,J.jsxs)(MT,{"data-slot":`select-trigger`,className:Z(PC({variant:c,size:s,state:`self`}),`data-placeholder:text-foreground-subtle flex items-center justify-between`,e),...o,onKeyDown:g,...m?{"data-invalid":``}:{},children:[n&&(0,J.jsx)(`span`,{"data-slot":`select-trigger-start`,className:`-ms-1 shrink-0`,children:n}),(0,J.jsx)(`span`,{className:`flex min-w-0 flex-1 items-center truncate text-start`,children:i}),h?(0,J.jsx)(`span`,{"data-slot":`select-clear`,"aria-hidden":`true`,onPointerDown:e=>{e.stopPropagation(),e.nativeEvent.stopImmediatePropagation(),e.preventDefault(),d(e)},onClick:e=>{e.stopPropagation(),e.nativeEvent.stopImmediatePropagation()},className:`text-foreground-subtle hover:text-foreground shrink-0 cursor-pointer transition-colors duration-200 motion-reduce:transition-none`,children:(0,J.jsx)(zE,{className:`size-[1em]`})}):null,r&&(0,J.jsx)(`span`,{"data-slot":`select-trigger-end`,className:`shrink-0`,children:r}),(0,J.jsx)(FT,{"data-slot":`select-icon`,className:`text-foreground -me-1 shrink-0`,render:l?(0,J.jsx)(LE,{className:f}):(0,J.jsx)(IE,{className:Z(f,`motion-safe:transition-transform motion-safe:duration-200`,`data-popup-open:rotate-180`)})})]})}function DE({className:e,...t}){return(0,J.jsx)(PT,{"data-slot":`select-value`,className:Z(`min-w-0 flex-1 truncate text-start`,e),...t})}var OE={sm:`rounded-md`,md:`rounded-lg`,lg:`rounded-xl`};function kE({className:e,alignItemWithTrigger:t,children:n,...r}){let{size:i,alignItemWithTrigger:a}=CE(),o=t??a,{positioner:s,portal:c,popup:l}=xE(r);return(0,J.jsx)(IT,{...c,children:(0,J.jsx)(WT,{sideOffset:6,...s,alignItemWithTrigger:o,className:Z(`isolate z-50`,s.className),children:(0,J.jsxs)(eE,{"data-slot":`select-content`,"data-align-trigger":o||void 0,className:Z(`bg-background border-border-overlay flex flex-col border shadow-2xl outline-none`,OE[i],`min-w-36`,o?`w-[calc(var(--anchor-width)+1rem)]`:`w-(--anchor-width)`,o?`origin-center`:`origin-(--transform-origin)`,`motion-safe:transition-[opacity,scale] motion-safe:duration-200 motion-safe:ease-[cubic-bezier(0.175,0.885,0.32,1.5)]`,`data-starting-style:motion-safe:scale-90 data-starting-style:motion-safe:opacity-0`,`data-ending-style:motion-safe:scale-95 data-ending-style:motion-safe:opacity-0 data-ending-style:motion-safe:duration-100 data-ending-style:motion-safe:ease-out`,e),...l,children:[(0,J.jsx)(jE,{}),(0,J.jsx)(cE,{className:`flex max-h-(--available-height) flex-col gap-0.5 overflow-y-auto p-2`,children:n}),(0,J.jsx)(ME,{})]})})})}var AE=Z(`bg-background text-foreground z-1 flex h-6 w-[calc(100%-var(--border-width)*2)] cursor-default items-center justify-center`);function jE(){let{size:e}=CE();return(0,J.jsx)(vE,{"data-slot":`select-scroll-up`,"aria-hidden":`true`,className:Z(AE,OE[e],`top-px rounded-b-none`),children:(0,J.jsx)(IE,{className:Z(TE[e],`rotate-180`)})})}function ME(){let{size:e}=CE();return(0,J.jsx)(_E,{"data-slot":`select-scroll-down`,"aria-hidden":`true`,className:Z(AE,OE[e],`bottom-px rounded-t-none`),children:(0,J.jsx)(IE,{className:TE[e]})})}var NE={sm:`gap-1 rounded-xs py-1.5 px-2.5 text-xs has-data-[icon=end]:pe-1.5 has-data-[icon=start]:ps-1.5 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='stroke-'])]:stroke-[1.75]`,md:`gap-1.5 rounded-sm py-2 px-3 text-sm has-data-[icon=end]:pe-2 has-data-[icon=start]:ps-2 [&_svg:not([class*='size-'])]:size-4.5 [&_svg:not([class*='stroke-'])]:stroke-[1.65]`,lg:`gap-1.5 rounded-md py-2.5 px-3.5 text-base has-data-[icon=end]:pe-2.5 has-data-[icon=start]:ps-2.5 [&_svg:not([class*='size-'])]:size-5 [&_svg:not([class*='stroke-'])]:stroke-[1.65]`},PE={sm:`gap-1`,md:`gap-1.5`,lg:`gap-1.5`};function FE({className:e,children:t,...n}){let{size:r,reducedMotion:i}=CE();return(0,J.jsxs)(dE,{"data-slot":`select-item`,className:Z(`text-foreground relative isolate flex w-full cursor-default items-center justify-between outline-hidden select-none [&_svg]:pointer-events-none [&_svg]:shrink-0`,`before:bg-background-muted before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:opacity-0`,`active:translate-y-px active:scale-[0.98]`,`data-highlighted:not-data-disabled:text-foreground-intense data-highlighted:not-data-disabled:before:opacity-100`,`motion-safe:transition motion-safe:duration-250 motion-safe:ease-[cubic-bezier(0.175,0.885,0.32,1.5)]`,`motion-safe:active:duration-100 motion-safe:active:ease-in-out`,`motion-safe:before:transition-opacity motion-safe:before:duration-200 motion-safe:before:ease-out`,`data-disabled:opacity-disabled data-disabled:pointer-events-none`,NE[r],e),...n,children:[(0,J.jsx)(mE,{className:Z(`flex items-center text-start`,PE[r]),children:t}),(0,J.jsx)(fE,{"data-slot":`select-item-indicator`,keepMounted:!i,className:`group/check text-foreground-intense shrink-0`,children:(0,J.jsx)(RE,{"data-icon":`end`,className:`me-0.5 size-[1.125em]`})})]})}function IE(e){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 16 16`,fill:`currentColor`,"aria-hidden":`true`,...e,children:(0,J.jsx)(`path`,{d:`M11.594 5.594c.225-.225.588-.225.813 0s.225.588 0 .813l-4 4c-.225.225-.588.225-.812 0l-4-4c-.225-.225-.225-.588 0-.812s.588-.225.812 0L8 9.187l3.594-3.594z`})})}function LE(e){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 16 16`,fill:`currentColor`,"aria-hidden":`true`,...e,children:(0,J.jsx)(`path`,{d:`M10.26 9.593c.225-.224.589-.224.814 0s.224.589 0 .813l-2.667 2.667c-.225.224-.589.224-.813 0l-2.666-2.667c-.225-.225-.225-.589 0-.813s.588-.224.813 0l2.26 2.26 2.261-2.26zM7.593 2.927c.225-.225.589-.225.813 0l2.667 2.666c.224.224.224.589 0 .813s-.589.225-.814 0L7.999 4.146 5.74 6.407c-.225.224-.588.224-.812 0s-.225-.589 0-.813l2.666-2.666z`})})}function RE({className:e,...t}){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,className:Z(`stroke-2`,e),...t,children:(0,J.jsx)(`path`,{d:`M4.3 12.55 L9.25 17.5 L19.7 6.5`,pathLength:1,strokeDasharray:`1 2`,className:Z(`opacity-0 [stroke-dashoffset:1.02]`,`group-data-selected/check:opacity-100 group-data-selected/check:[stroke-dashoffset:0]`,`motion-safe:transition-[opacity,stroke-dashoffset] motion-safe:ease-out`,`motion-safe:delay-[0ms,150ms] motion-safe:duration-[150ms,0ms]`,`motion-safe:group-data-selected/check:delay-[0ms] motion-safe:group-data-selected/check:duration-[0ms,300ms]`)})})}function zE(e){return(0,J.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`2 2 16 16`,fill:`currentColor`,"aria-hidden":`true`,...e,children:(0,J.jsx)(`path`,{d:`M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z`})})}var BE=[{value:`code`,labelKey:`panel.pairing.policyCode`},{value:`deny`,labelKey:`panel.pairing.policyDeny`}];function VE({open:e,onOpenChange:t,status:n,busy:r,onSave:i}){let[a,o]=(0,g.useState)(n.name),[s,c]=(0,g.useState)(n.relayUrl),[l,u]=(0,g.useState)(n.lan.enabled),[d,f]=(0,g.useState)(n.pairingPolicy),[p,m]=(0,g.useState)(``),h=(0,g.useRef)(null);(0,g.useEffect)(()=>{e&&(o(n.name),c(n.relayUrl),u(n.lan.enabled),f(n.pairingPolicy),m(``))},[e]);let _=p.trim()!==``,v=a.trim()!==``&&r===``;function y(){if(!v)return;let e={name:a.trim(),relayUrl:s.trim(),lanEnabled:l,pairingPolicy:d};_&&(e.registerSecret=p.trim()),i(e)}return(0,J.jsx)(eC,{open:e,onOpenChange:t,children:(0,J.jsxs)(tC,{className:`max-w-xl`,initialFocus:h,children:[(0,J.jsx)(nC,{children:(0,J.jsx)(rC,{children:$(`panel.connection.relayUrl`)})}),(0,J.jsx)(`div`,{ref:h,tabIndex:-1,className:`outline-none`,children:(0,J.jsxs)(iC,{className:`flex flex-col gap-4`,children:[(0,J.jsxs)(jC,{children:[(0,J.jsx)(MC,{htmlFor:`relay-name`,children:$(`panel.connection.deviceName`)}),(0,J.jsx)(IC,{inputProps:{id:`relay-name`},value:a,placeholder:$(`panel.relay.namePlaceholder`),onChange:e=>o(e.target.value)})]}),(0,J.jsxs)(jC,{children:[(0,J.jsx)(MC,{htmlFor:`relay-url`,children:$(`panel.connection.relayUrl`)}),(0,J.jsx)(IC,{inputProps:{id:`relay-url`,className:`font-mono`},value:s,placeholder:`https://example.com`,onChange:e=>c(e.target.value)}),(0,J.jsxs)(`div`,{className:`mt-1.5 rounded-md bg-background-muted px-3 py-2`,children:[(0,J.jsx)(`p`,{className:`text-xs text-foreground-muted`,children:$(`panel.links.publicRelay`)}),(0,J.jsx)(`div`,{className:`mt-1 max-h-[112px] overflow-y-auto`,children:(0,J.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:Iw.map(e=>{let t=s.trim()===e.url;return(0,J.jsxs)(`button`,{type:`button`,onClick:()=>c(e.url),className:`flex w-full items-baseline justify-between gap-3 rounded px-1.5 py-1 text-left ${t?`bg-background`:`hover:bg-background`}`,children:[(0,J.jsx)(`span`,{className:`font-mono text-xs text-foreground`,children:e.url}),(0,J.jsx)(`span`,{className:`shrink-0 text-xs text-foreground-muted`,children:$(t?`panel.relay.selected`:e.nameKey)})]},e.url)})})}),(0,J.jsx)(`button`,{type:`button`,onClick:()=>c(``),disabled:s.trim()===``,className:`mt-1.5 text-xs text-foreground-muted underline-offset-2 hover:underline disabled:opacity-40`,children:`清空(只走局域网直连)`})]})]}),(0,J.jsxs)(`div`,{className:`flex items-center justify-between gap-4 rounded-md bg-background-muted px-3 py-2`,children:[(0,J.jsx)(`div`,{className:`text-sm text-foreground`,children:$(`panel.connection.lan`)}),(0,J.jsx)(mx,{size:`md`,checked:l,onCheckedChange:u,"aria-label":$(`panel.connection.lan`)})]}),(0,J.jsxs)(jC,{children:[(0,J.jsx)(MC,{children:$(`panel.pairing.policy`)}),(0,J.jsxs)(wE,{items:BE.map(e=>({value:e.value,label:$(e.labelKey)})),value:d,onValueChange:e=>f(e),children:[(0,J.jsx)(EE,{children:(0,J.jsx)(DE,{})}),(0,J.jsxs)(kE,{children:[(0,J.jsx)(FE,{value:`code`,children:$(`panel.pairing.policyCode`)}),(0,J.jsx)(FE,{value:`deny`,children:$(`panel.pairing.policyDeny`)})]})]})]}),(0,J.jsxs)(jC,{children:[(0,J.jsx)(MC,{htmlFor:`relay-register-secret`,children:$(`panel.connection.registerSecret`)}),(0,J.jsx)(IC,{type:`password`,inputProps:{id:`relay-register-secret`},value:p,placeholder:$(`panel.lanDialog.unchanged`),onChange:e=>m(e.target.value),clearable:!0,onClear:()=>m(``)})]})]})}),(0,J.jsxs)(aC,{className:`flex justify-end gap-2`,children:[(0,J.jsx)(Ob,{variant:`outline`,disabled:r===`config`,onClick:()=>t(!1),children:`取消`}),(0,J.jsx)(Ob,{variant:`primary`,disabled:!v,onClick:y,children:`保存配置`})]})]})})}var HE=`/dsh-market/api/v1`,UE=`dsh-mobile-plugin`,WE=class extends Error{status;code;constructor(e,t,n){super(n),this.name=`MarketError`,this.status=e,this.code=t}},GE=e=>e&&typeof e==`object`?e:{},KE=e=>typeof e==`string`&&e!==``?e:null;async function qE(e,t){let n;try{n=await fetch(`${HE}${e}`,{credentials:`same-origin`,...t})}catch(e){throw new WE(0,`market_unreachable`,`连不上插件市场:${String(e?.message||e)}`)}let r=await n.json().catch(()=>null);if(!n.ok){let e=GE(r),t=GE(e.failure),i=KE(t.code)??(typeof e.error==`string`?e.error:`HTTP ${n.status}`),a=KE(t.message)??KE(e.error)??`插件市场返回 HTTP ${n.status}`;throw new WE(n.status,i,a)}return r}async function JE(){try{return{available:!0,restartSupported:GE(GE(await qE(`/capabilities`)).restart).supported===!0}}catch{return{available:!1,restartSupported:!1}}}async function YE(e=UE,t=!1){let n=GE(await qE(`/updates${`?name=${encodeURIComponent(e)}${t?`&force=1`:``}`}`)),r=GE(n.package??n);return{installedVersion:KE(r.installedVersion),latestVersion:KE(r.latestVersion),updateAvailable:r.updateAvailable===!0,source:KE(r.source)}}var XE={status:`/api/relay/update/status`,check:`/api/relay/update/check`,apply:`/api/relay/update/apply`,auto:`/api/relay/update/auto`,otaStatus:`/api/relay/update/ota/status`,otaCheck:`/api/relay/update/ota/check`,otaApply:`/api/relay/update/ota/apply`};async function ZE(e,t=`GET`){let n=await aD(e,t===`POST`?{method:t,body:JSON.stringify({})}:{method:t});return n.data??n}var QE=()=>ZE(XE.otaStatus),$E=()=>ZE(XE.otaCheck,`POST`),eD=()=>ZE(XE.otaApply,`POST`),tD=e=>e&&typeof e==`object`?e:{},nD=e=>typeof e==`string`&&e!==``?e:null,rD=e=>typeof e==`boolean`?e:null,iD=e=>typeof e==`number`&&Number.isFinite(e)?e:null;async function aD(e,t){let n=await fetch(e,{credentials:`same-origin`,headers:{accept:`application/json`,...t?.body?{"content-type":`application/json`}:{}},...t}),r=null;try{r=await n.json()}catch{r=null}let i=tD(r),a=tD(i.error);if(!n.ok){let e=nD(a.code)??`http_${n.status}`;throw new BS(nD(a.message)??`宿主返回 HTTP ${n.status}`,e,n.status)}return i}function oD(e){return e instanceof BS?e.status===404:e instanceof SyntaxError}function sD(e){return e instanceof BS&&e.code===`update_unavailable`}function cD(e){let t=tD(e);return Object.keys(t).length===0?null:{installedVersion:nD(t.installedVersion),latestVersion:nD(t.latestVersion),updateAvailable:t.updateAvailable===!0,source:nD(t.source),checkedAt:nD(t.checkedAt)}}function lD(e){let t=tD(e),n=tD(t.failure),r=nD(n.code);return{installed:rD(t.installed),skipped:rD(t.skipped),state:nD(t.state),beforeVersion:nD(t.beforeVersion),installedVersion:nD(t.installedVersion),swapped:rD(t.swapped),restartRequired:rD(t.restartRequired),refreshRequired:rD(t.refreshRequired),failure:r?{code:r,message:nD(n.message)??r}:null}}function uD(e){let t=tD(e);return{available:t.available===!0,version:nD(t.version),installedVersion:nD(t.installedVersion),source:nD(t.source),previousVersion:nD(t.previousVersion),activatedAt:nD(t.activatedAt),lastError:nD(t.lastError),inFlight:iD(t.inFlight)??0,swapping:t.swapping===!0,autoUpdate:t.autoUpdate===!0,autoIntervalMs:iD(t.autoIntervalMs)??6e5,marketBase:nD(t.marketBase),marketLastCheckedAt:nD(t.marketLastCheckedAt),marketLastError:nD(t.marketLastError),marketResult:cD(t.marketResult),lastApply:t.lastApply?lD(t.lastApply):null,appliedAt:nD(t.appliedAt),runningShellHash:nD(t.runningShellHash),installedShellHash:nD(t.installedShellHash),shellChanged:t.shellChanged===!0}}async function dD(){return uD((await aD(XE.status)).data)}async function fD(){let e=tD((await aD(XE.check,{method:`POST`,body:JSON.stringify({})})).data);return{update:cD(e.update),status:e.status?uD(e.status):null}}async function pD(e=!1){let t=tD((await aD(XE.apply,{method:`POST`,body:JSON.stringify({force:e})})).data),n=tD(t.status);return{...lD(t),status:Object.keys(n).length>0?uD(n):null}}async function mD(e){let t=tD((await aD(XE.auto,{method:`POST`,body:JSON.stringify({enabled:e})})).data);return{enabled:t.enabled===!0,status:t.status?uD(t.status):null}}function hD(e){return e?e.swapping?`swapping`:e.inFlight>0?`in-flight`:`idle`:`idle`}var gD=new Set([`OPERATION_BUSY`,`RELEASE_TOO_FRESH`,`VERSION_UNCHANGED`,`PLUGIN_NOT_INSTALLED`,`AGENTS_RUNNING`]);function _D(e,t){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleString(void 0,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}function vD(e){let t=e.installedVersion??e.beforeVersion;return e.failure?{text:$(`panel.update.applyFailed`,{message:e.failure.message}),ok:!1}:e.installed===!1?e.skipped?{text:t?$(`panel.update.applyUpToDate`,{version:t}):$(`panel.update.applyUpToDatePlain`),ok:!0}:{text:t?$(`panel.update.applyDiskUnchanged`,{version:t}):$(`panel.update.applyFailedRetry`),ok:!1}:{text:t?$(`panel.update.applySwitched`,{version:t}):$(`panel.update.applySwitchedPlain`),ok:!0}}function yD({version:e,busy:t,onRestartSidecar:n}){let[r,i]=(0,g.useState)(null),[a,o]=(0,g.useState)(!1),[s,c]=(0,g.useState)(!1),[l,u]=(0,g.useState)(null),[d,f]=(0,g.useState)(null),[p,m]=(0,g.useState)(``),h=KS(),[_,v]=(0,g.useState)(null),[y,b]=(0,g.useState)(!0),[x,S]=(0,g.useState)(!1),[C,w]=(0,g.useState)(!1),[T,E]=(0,g.useState)(!1),D=(0,g.useCallback)(async()=>{try{let e=await QE();v(e),S(e.available),b(!0)}catch(e){e instanceof Error&&`status`in e&&e.status===404&&(b(!1),v(null))}},[]);(0,g.useEffect)(()=>{D()},[D]);let O=(0,g.useCallback)(async e=>{w(!0);try{if(e===`check`){let e=await $E();v(e.status),S(e.update.available),h(`soft`,e.update.available?$(`panel.update.otaFound`,{version:e.update.version??``}):$(`panel.update.otaNotFound`))}else{let e=await eD();v(e.status),S(!1),h(`soft`,e.installed?$(`panel.update.debugInstalled`,{version:e.version??``}):$(`panel.update.debugNone`))}}catch(e){h(`error`,WS(e))}finally{w(!1)}},[h]),k=(0,g.useCallback)(e=>{e&&i(t=>({...e,available:e.available===!0||t?.available===!0}))},[]),A=r!==null&&r.available&&!s,j=t!==``||p!==``,M=(0,g.useCallback)(async()=>{try{let e=await dD();i(e),c(e.available!==!0)}catch(e){i(null),c(sD(e))}finally{o(!0)}},[]);(0,g.useEffect)(()=>{M()},[M]),(0,g.useEffect)(()=>{if(!a)return;let e=!0;return fD().then(t=>{e&&(t.update&&f(t.update),t.status&&k(t.status))}).catch(()=>{}),()=>{e=!1}},[a]);let N=r?.swapping===!0;(0,g.useEffect)(()=>{if(!N)return;let e=window.setInterval(()=>void M(),1500);return()=>window.clearInterval(e)},[N,M]),(0,g.useEffect)(()=>{if(A||!a)return;let e=!0;return JE().then(t=>{e&&u(t)}),()=>{e=!1}},[A,a]);let P=(0,g.useCallback)(e=>{if(e instanceof WE&&gD.has(e.code)){h(`soft`,`${e.message}(${e.code})`);return}h(`error`,WS(e))},[]),F=(0,g.useCallback)(async()=>{m(`check`);try{let e=await fD();e.status&&k(e.status),e.update&&f(e.update)}catch(e){oD(e)||sD(e)?await M():h(`error`,WS(e))}finally{m(``)}},[M]),I=(0,g.useCallback)(async e=>{m(`apply`);try{let t=await pD(e);t.status&&k(t.status);let n=vD(t),r=t.failure!==null&&gD.has(t.failure.code);n.ok||r?h(`soft`,n.text):h(`error`,n.text)}catch(e){oD(e)||sD(e)?await M():h(`error`,WS(e))}finally{m(``)}},[M]),L=(0,g.useCallback)(async()=>{m(`check`);try{let e=await fD();e.status&&k(e.status),f(e.update)}catch(e){if(!oD(e))f(null),h(`error`,WS(e));else try{f(await YE(void 0,!0))}catch(e){f(null),P(e)}}finally{m(``)}},[P]),R=(0,g.useCallback)(async e=>{E(!0);try{let t=await mD(e);t.status&&k(t.status);let n=Math.round((t.status?.autoIntervalMs??r?.autoIntervalMs??6e5)/6e4);h(`soft`,t.enabled?$(`panel.update.autoOn`,{minutes:n}):$(`panel.update.autoOff`))}catch(e){h(`error`,$(`panel.update.autoToggleFailed`,{message:WS(e)})),await M()}finally{E(!1)}},[r?.autoIntervalMs,M]),z=d?.latestVersion??r?.marketResult?.latestVersion??null,B=d?.source??r?.marketResult?.source??null,V=B===`linked`||B===`file`||B===`workspace`,H=d?.updateAvailable??r?.marketResult?.updateAvailable??!1,ee=r?.installedVersion??null,U=r?.lastApply?vD(r.lastApply):null,te=hD(r),W=e||`—`,ne=r?.version??null,G=A&&!!ne&&!!e&&ne!==e;return(0,J.jsxs)(Pb,{frame:`solid`,children:[(0,J.jsx)(Fb,{children:(0,J.jsxs)(Ib,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`span`,{children:$(`panel.update.title`)}),(0,J.jsx)(Tb,{variant:`soft`,size:`sm`,children:e||$(`panel.update.unknownVersion`)})]})}),a?null:(0,J.jsxs)(`div`,{className:`flex items-center gap-2 py-2 text-sm text-foreground-muted`,children:[(0,J.jsx)($y,{}),$(`panel.update.reading`)]}),s?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(Ex,{children:[(0,J.jsx)(Tx,{label:$(`panel.update.runningVersion`),mono:!0,children:W}),(0,J.jsx)(Tx,{label:$(`panel.update.latestOnline`),mono:!0,children:z??$(`panel.update.notChecked`)})]}),(0,J.jsxs)(`p`,{className:`mt-3 text-xs text-foreground-muted`,children:[H?$(`panel.update.hasNew`):``,$(`panel.update.nothingToInstall`)]})]}):null,a&&!A&&!s&&l!==null&&!l.available?(0,J.jsxs)(sb,{variant:`info`,className:`mt-3`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.update.noMarketTitle`)}),(0,J.jsx)(db,{children:$(`panel.update.noMarketBody`)})]}):null,A&&r?(0,J.jsxs)(J.Fragment,{children:[V?null:(0,J.jsxs)(`label`,{className:`mt-1 flex items-start justify-between gap-4 border-b border-border-muted py-3`,children:[(0,J.jsx)(`span`,{className:`min-w-0`,children:(0,J.jsx)(`span`,{className:`block text-sm text-foreground`,children:$(`panel.update.autoUpdate`)})}),(0,J.jsxs)(`span`,{className:`flex shrink-0 items-center gap-2`,children:[T?(0,J.jsx)($y,{}):null,(0,J.jsx)(mx,{size:`md`,checked:r.autoUpdate,disabled:j||T,onCheckedChange:e=>void R(e),"aria-label":$(`panel.update.autoUpdate`)})]})]}),(0,J.jsxs)(Ex,{children:[(0,J.jsx)(Tx,{label:$(`panel.update.runningVersion`),mono:!0,children:W}),(0,J.jsx)(Tx,{label:$(`panel.update.diskVersion`),mono:!0,children:ee??`—`}),(0,J.jsx)(Tx,{label:$(`panel.update.latestOnline`),mono:!0,children:z??$(`panel.update.notChecked`)}),(0,J.jsx)(Tx,{label:$(`panel.update.source`),children:B??`—`}),(0,J.jsx)(Tx,{label:$(`panel.update.action`),children:te===`swapping`?$(`panel.update.switching`):te===`in-flight`?$(`panel.update.finishingInFlight`,{count:r.inFlight}):$(`panel.update.idle`)}),(0,J.jsx)(Tx,{label:$(`panel.update.lastCheck`),children:_D(d?.checkedAt??r.marketLastCheckedAt,$(`panel.update.notChecked`))}),(0,J.jsx)(Tx,{label:$(`panel.update.lastApply`),children:r.lastApply?_D(r.appliedAt,$(`panel.update.neverUpdated`)):$(`panel.update.neverUpdated`)})]}),G?(0,J.jsx)(`p`,{className:`mt-2 text-xs text-foreground-muted`,children:$(`panel.update.versionDrift`,{version:e??``,shell:ne??``})}):null,r.shellChanged?(0,J.jsxs)(sb,{variant:`info`,className:`mt-3`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.update.shellChangedTitle`)}),(0,J.jsx)(db,{children:$(`panel.update.shellChangedBody`)})]}):null,r.lastError?(0,J.jsx)(`p`,{className:`mt-2 text-xs text-foreground-muted`,children:`最近一次出过错:${r.lastError}`}):null,(0,J.jsxs)(`div`,{className:`mt-3 flex flex-wrap justify-end gap-2`,children:[(0,J.jsx)(Ob,{variant:`outline`,size:`md`,disabled:j,onClick:n,children:$(`panel.update.restartSidecar`)}),(0,J.jsx)(Ob,{variant:`outline`,size:`md`,disabled:j,onClick:()=>void F(),children:$(p===`check`?`panel.update.checking`:`panel.update.check`)}),V?null:(0,J.jsx)(Ob,{variant:`primary`,size:`md`,disabled:j,onClick:()=>void I(!1),children:$(p===`apply`?`panel.update.updating`:`panel.update.updateNow`)})]}),!V&&(H||U!==null&&!U.ok)?(0,J.jsx)(`div`,{className:`mt-2 flex justify-end`,children:(0,J.jsx)(Ob,{variant:`ghost`,size:`sm`,disabled:j,onClick:()=>void I(!0),children:$(`panel.update.forceHint`)})}):null]}):null,a&&!A&&!s&&l?.available?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(Ex,{children:[(0,J.jsx)(Tx,{label:$(`panel.update.runningVersion`),mono:!0,children:W}),(0,J.jsx)(Tx,{label:$(`panel.update.latestOnline`),mono:!0,children:z??$(`panel.update.notChecked`)}),(0,J.jsx)(Tx,{label:$(`panel.update.source`),children:B??`—`}),(0,J.jsx)(Tx,{label:$(`panel.update.checkResult`),children:$(H?`panel.update.resultHasNew`:`panel.update.resultUpToDate`)})]}),(0,J.jsxs)(`div`,{className:`mt-3 flex flex-wrap justify-end gap-2`,children:[(0,J.jsx)(Ob,{variant:`outline`,size:`md`,disabled:j,onClick:n,children:$(`panel.update.restartSidecar`)}),(0,J.jsx)(Ob,{variant:`outline`,size:`md`,disabled:j,onClick:()=>void L(),children:$(p===`check`?`panel.update.checking`:`panel.update.check`)}),r!==null&&!V?(0,J.jsx)(Ob,{variant:`primary`,size:`md`,disabled:j,onClick:()=>void I(!1),children:$(p===`apply`?`panel.update.updating`:`panel.update.updateNow`)}):null]})]}):null,y?(0,J.jsxs)(`section`,{className:`mt-4 border-t border-border-muted pt-3`,"aria-label":$(`panel.update.otaSection`),children:[(0,J.jsxs)(`div`,{className:`mb-2 flex items-center gap-2`,children:[(0,J.jsx)(`strong`,{className:`text-sm`,children:$(`panel.update.otaSection`)}),(0,J.jsx)(Tb,{variant:`soft`,size:`sm`,children:$(`panel.update.otaLocalOnly`)})]}),(0,J.jsxs)(Ex,{children:[(0,J.jsx)(Tx,{label:$(`panel.update.otaVersion`),mono:!0,children:_?.otaVersion??$(`panel.update.otaNone`)}),(0,J.jsx)(Tx,{label:$(`panel.update.otaAbsorbState`),children:_?.otaVersion?_.absorbed?$(`panel.update.otaAbsorbed`,{version:_.officialVersion??``}):$(`panel.update.otaNotAbsorbed`):$(`panel.update.otaNothing`)})]}),(0,J.jsxs)(`div`,{className:`mt-3 flex justify-end gap-2`,children:[(0,J.jsx)(Ob,{variant:`outline`,size:`md`,disabled:C,onClick:()=>void O(`check`),children:$(C?`panel.update.otaBusy`:`panel.update.otaCheck`)}),(0,J.jsx)(Ob,{variant:`primary`,size:`md`,disabled:C||!x&&!_?.otaVersion||_?.absorbed===!0,onClick:()=>void O(`apply`),children:$(`panel.update.otaInstall`)})]})]}):null]})}function bD(e){let t=Number.isFinite(e)&&e>0?e:0;return t===0?`0 MB`:t<1048576?`${Math.max(1,Math.round(t/1024))} KB`:`${(t/1024/1024).toFixed(1)} MB`}function xD(e,t=Date.now()){if(!e)return``;let n=Math.floor((t-e)/36e5);return n<1?$(`panel.inbox.ageLessThanHour`):n<24?$(`panel.inbox.ageHours`,{hours:n}):$(`panel.inbox.ageDays`,{days:Math.floor(n/24)})}function SD(){let e=KS(),[t,n]=(0,g.useState)(null),[r,i]=(0,g.useState)(!1),[a,o]=(0,g.useState)(!1),[s,c]=(0,g.useState)(!1),l=(0,g.useCallback)(async()=>{try{n(await HS(`/api/relay/inbox/status`))}catch{n(null)}finally{i(!0)}},[]);(0,g.useEffect)(()=>{l()},[l]);let u=t?.deletableFiles??0,d=xD(t?.oldestAt??null),f=t?.stagingFiles??0;async function p(t){if(!s){c(!0);try{let e=await US(`/api/relay/inbox/auto`,{enabled:t});n(t=>t&&{...t,autoClear:e.data.autoClear})}catch(t){e(`error`,$(`panel.inbox.autoFailed`,{message:WS(t)}))}finally{c(!1)}}}async function m(){if(a)return;let n=u>0?$(`panel.inbox.confirmDetail`,{count:u,hours:t?.keepHours??24,bytes:bD(t?.deletableBytes??0)}):$(`panel.inbox.confirmNothing`,{hours:t?.keepHours??24});if(window.confirm(`${$(`panel.inbox.confirmTitle`)}\n\n${n}\n\n${$(`panel.inbox.confirmIrreversible`)}`)){o(!0);try{let t=await US(`/api/relay/inbox/clear`),n=bD(t.freedBytes);e(t.failedFiles>0?`soft`:`ok`,t.deletedFiles>0?`${$(`panel.inbox.cleared`,{bytes:n,count:t.deletedFiles})}${t.failedFiles>0?$(`panel.inbox.clearedSomeFailed`,{count:t.failedFiles}):``}`:$(`panel.inbox.nothingToClear`)),await l()}catch(t){e(`error`,$(`panel.inbox.clearFailed`,{message:WS(t)}))}finally{o(!1)}}}return(0,J.jsxs)(Pb,{frame:`solid`,children:[(0,J.jsx)(Fb,{children:(0,J.jsx)(Ib,{className:`flex items-center gap-2`,children:(0,J.jsx)(`span`,{children:$(`panel.inbox.title`)})})}),r?null:(0,J.jsxs)(`div`,{className:`flex items-center gap-2 py-2 text-sm text-foreground-muted`,children:[(0,J.jsx)($y,{}),$(`panel.inbox.reading`)]}),r&&t===null?(0,J.jsxs)(sb,{variant:`info`,className:`mt-2`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.inbox.unreadableTitle`)}),(0,J.jsx)(db,{children:$(`panel.inbox.unreadableBody`)})]}):null,t===null?null:(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`dl`,{className:`mt-1`,children:[(0,J.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 border-b border-border-muted py-2`,children:[(0,J.jsx)(`dt`,{className:`shrink-0 text-sm text-foreground-muted`,children:$(`panel.inbox.used`)}),(0,J.jsx)(`dd`,{className:`min-w-0 text-right text-sm break-all`,children:$(`panel.inbox.usedValue`,{bytes:bD(t.bytes),count:t.files})})]}),(0,J.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 border-b border-border-muted py-2`,children:[(0,J.jsx)(`dt`,{className:`shrink-0 text-sm text-foreground-muted`,children:$(`panel.inbox.deletable`)}),(0,J.jsx)(`dd`,{className:`min-w-0 text-right text-sm break-all`,children:u>0?$(`panel.inbox.deletableValue`,{bytes:bD(t.deletableBytes),count:u}):$(`panel.common.none`)})]}),(0,J.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 py-2`,children:[(0,J.jsx)(`dt`,{className:`shrink-0 text-sm text-foreground-muted`,children:$(`panel.inbox.keep`)}),(0,J.jsx)(`dd`,{className:`min-w-0 text-right text-sm break-all`,children:d?$(`panel.inbox.keepValueOldest`,{hours:t.keepHours,age:d}):$(`panel.inbox.keepValue`,{hours:t.keepHours})})]})]}),(0,J.jsx)(`p`,{className:`mt-2 text-xs text-foreground-muted`,children:$(`panel.inbox.hint`)}),f>0?(0,J.jsx)(`p`,{className:`mt-1 text-xs text-foreground-muted`,children:$(`panel.inbox.staging`,{bytes:bD(t.stagingBytes??0),count:t.stagingFiles??0})}):null,(0,J.jsxs)(`label`,{className:`mt-3 flex items-start justify-between gap-4 border-t border-border-muted pt-3`,children:[(0,J.jsxs)(`span`,{className:`min-w-0`,children:[(0,J.jsx)(`span`,{className:`block text-sm text-foreground`,children:$(`panel.inbox.auto`)}),(0,J.jsx)(`span`,{className:`mt-0.5 block text-xs text-foreground-muted`,children:$(`panel.inbox.autoHint`,{hours:t.keepHours})})]}),(0,J.jsxs)(`span`,{className:`flex shrink-0 items-center gap-2`,children:[s?(0,J.jsx)($y,{}):null,(0,J.jsx)(mx,{size:`md`,checked:t.autoClear===!0,disabled:a||s,onCheckedChange:e=>void p(e),"aria-label":$(`panel.inbox.autoA11y`)})]})]}),(0,J.jsx)(`div`,{className:`mt-3 flex justify-end`,children:(0,J.jsx)(Ob,{variant:u>0?`primary`:`outline`,size:`md`,disabled:a,onClick:()=>void m(),children:$(a?`panel.inbox.clearing`:`panel.inbox.clear`)})})]})]})}function CD(){let[e,t]=(0,g.useState)(null),[n,r]=(0,g.useState)(``),i=KS(),[a,o]=(0,g.useState)(``),[s,c]=(0,g.useState)(null),[l,u]=(0,g.useState)(``),[d,f]=(0,g.useState)(!1),[p,m]=(0,g.useState)(!1),[h,_]=(0,g.useState)(null),v=(0,g.useCallback)(async()=>{try{t(await HS(`/api/relay/status`)),r(``)}catch(e){r(WS(e))}},[]),y=(0,g.useCallback)(async()=>{try{c(await HS(`/api/relay/pairing`)),u(``)}catch(e){c(null),u(WS(e))}},[]),b=(0,g.useCallback)(async()=>{try{_(await HS(`/api/relay/addresses`))}catch{_(null)}},[]);(0,g.useEffect)(()=>{let e=()=>{document.hidden||v()};e();let t=window.setInterval(e,3e3);return document.addEventListener(`visibilitychange`,e),()=>{window.clearInterval(t),document.removeEventListener(`visibilitychange`,e)}},[v]),(0,g.useEffect)(()=>{!e?.enabled||s||l||y()},[e?.enabled,s,l,y]),(0,g.useEffect)(()=>{p&&e?.enabled&&(y(),b())},[p,e?.enabled,y,b]),(0,g.useEffect)(()=>{e?.enabled&&b()},[e?.enabled,s,b]);let x=(0,g.useCallback)(async(e,t)=>{o(e);try{await t()}catch(e){i(`error`,WS(e))}finally{o(``)}},[]),S=e=>x(`toggle`,async()=>{t(await US(`/api/relay/toggle`,{enabled:e})),e?await y():(c(null),u(``)),i(`soft`,$(e?`panel.shell.remoteEnabled`:`panel.shell.remoteDisabled`))}),C=()=>x(`pairing`,async()=>{t(await US(`/api/relay/regenerate`)),await y(),i(`soft`,$(`panel.shell.pairingRegenerated`))}),w=()=>x(`reconnect`,async()=>{t(await US(`/api/relay/reconnect`)),i(`soft`,$(`panel.shell.reconnecting`))}),T=()=>x(`restart`,async()=>{let e=await US(`/api/relay/restart-sidecar`);t(e.status),i(`soft`,$(`panel.shell.sidecarRestarted`))}),E=()=>{window.confirm($(`panel.shell.revokeConfirm`))&&x(`revoke`,async()=>{let e=await US(`/api/relay/revoke-all`);await v(),await y(),i(`soft`,`${$(`panel.shell.revoked`,{count:e.revoked})}${e.revokedRelay?$(`panel.shell.revokedRelay`,{count:e.revokedRelay}):``}`)})},D=e=>x(`config`,async()=>{t(await US(`/api/relay/config`,e)),f(!1),await y(),i(`soft`,$(`panel.shell.configSaved`))}),O=e=>x(`policy`,async()=>{t(await US(`/api/relay/config`,{pairingPolicy:e})),i(`soft`,$(e===`code`?`panel.shell.deviceAllowed`:`panel.shell.deviceDenied`))}),k=e=>x(`lan`,async()=>{t(await US(`/api/relay/config`,e)),m(!1),await y(),i(`soft`,$(`panel.shell.lanSaved`))}),A=e=>x(`lan`,async()=>{t(await US(`/api/relay/config`,{preferredLanAddress:e})),await Promise.all([y(),b()]),i(`soft`,e?$(`panel.shell.preferredAddress`,{address:e}):$(`panel.shell.preferredAuto`))});return e?(0,J.jsxs)(`main`,{className:`mx-auto flex w-full max-w-6xl flex-col gap-4 p-6`,children:[(0,J.jsxs)(`header`,{className:`flex flex-wrap items-center gap-2`,children:[(0,J.jsx)(`h1`,{className:`text-lg font-semibold text-foreground-intense`,children:$(`panel.shell.title`)}),(0,J.jsx)(Tb,{variant:`soft`,size:`sm`,children:e.appVersion||$(`panel.shell.unknownVersion`)}),a?(0,J.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 text-xs text-foreground-muted`,children:[(0,J.jsx)($y,{}),$(`panel.shell.busy`)]}):null]}),n?(0,J.jsxs)(sb,{variant:`error`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.shell.statusFailed`)}),(0,J.jsx)(db,{children:n})]}):null,(0,J.jsxs)(`div`,{className:`flex flex-col gap-4 lg:flex-row lg:items-start`,children:[(0,J.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-4`,children:[(0,J.jsx)(Jw,{status:e,busy:a,onChange:e=>void O(e)}),(0,J.jsx)(Kw,{status:e,pairing:s,addressBook:h,busy:a,error:l,restartError:e.sidecar.restartError,onOpenConfig:()=>f(!0),onRegenerate:()=>void C(),onReconnect:()=>void w(),onRevokeAll:E,onSavePreferred:e=>void A(e)}),(0,J.jsx)(QS,{}),(0,J.jsx)(yD,{version:e.appVersion||``,busy:a,onRestartSidecar:()=>void T()}),(0,J.jsx)(SD,{})]}),(0,J.jsx)(`aside`,{className:`max-lg:order-first lg:sticky lg:top-4 lg:max-h-[calc(100vh-2rem)] lg:w-[340px] lg:shrink-0 lg:overflow-y-auto`,children:(0,J.jsx)(kx,{status:e,busy:a,onToggle:S,onOpenLan:()=>m(!0)})})]}),(0,J.jsx)(VE,{open:d,onOpenChange:f,status:e,busy:a,onSave:e=>void D(e)}),(0,J.jsx)(Ow,{open:p,onOpenChange:m,status:e,lanUrls:s?.lanUrls??[],addressBook:h,busy:a,onSave:e=>void k(e),onSavePreferred:e=>void A(e)}),(0,J.jsx)(uC,{})]}):(0,J.jsx)(`main`,{className:`mx-auto flex w-full max-w-3xl flex-col gap-4 p-6`,children:n?(0,J.jsxs)(sb,{variant:`error`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.shell.statusFailed`)}),(0,J.jsx)(db,{children:n})]}):(0,J.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-foreground-muted`,children:[(0,J.jsx)($y,{}),$(`panel.shell.readingStatus`)]})})}var wD=`public-relay`,TD=`own-relay`,ED=`lan-direct`,DD=`https://github.com/WNLUO/dsh-mobile-server`,OD=Iw;function kD(e){let t=(e.preferred||``).trim();return t&&e.lan.some(e=>e.address===t)?t:e.lan[0]?.address??``}function AD({onDone:e}){let[t,n]=(0,g.useState)(null),[r,i]=(0,g.useState)(``),[a,o]=(0,g.useState)(``),[s,c]=(0,g.useState)(!1),[l,u]=(0,g.useState)(null),[d,f]=(0,g.useState)(null),[p,m]=(0,g.useState)(``),[h,_]=(0,g.useState)(``),[v,y]=(0,g.useState)(``),[b,x]=(0,g.useState)([]),[S,C]=(0,g.useState)(``),[w,T]=(0,g.useState)(!1),[E,D]=(0,g.useState)(`idle`),[O,k]=(0,g.useState)(!1),[A,j]=(0,g.useState)(!1),[M,N]=(0,g.useState)(null),[P,F]=(0,g.useState)(``),I=(0,g.useRef)(!0);(0,g.useEffect)(()=>(I.current=!0,()=>{I.current=!1}),[]),(0,g.useEffect)(()=>{(async()=>{try{let e=await HS(`/api/relay/addresses`);u(e);let n=kD(e);m(n),_(e=>e||(t?.relayUrl?wD:ED))}catch{u(null)}})()},[]),(0,g.useEffect)(()=>{(async()=>{try{n(await HS(`/api/relay/status`))}catch(e){i(WS(e))}await R()})()},[]);let L=(0,g.useRef)(!1);(0,g.useEffect)(()=>{L.current||l!==null&&(L.current=!0,!(t&&t.enabled)&&ae())},[l,t]);async function R(){try{f(await HS(`/api/relay/pairing`))}catch{}}(0,g.useEffect)(()=>{if(h!==wD)return;let e=!1;return x(OD.map(e=>({...e,ms:null}))),(async()=>{try{let t=await US(`/api/relay/probe-relays`,{urls:OD.map(e=>e.url)});if(e)return;let n=new Map(t.results.map(e=>[e.url,e.ms]));x(e=>e.map(e=>({...e,ms:n.get(e.url)??null})).sort((e,t)=>(e.ms??1/0)-(t.ms??1/0)))}catch{if(e)return;x(e=>e.map(e=>({...e,ms:1/0})))}})(),()=>{e=!0}},[h]),(0,g.useEffect)(()=>{if(h!==TD)return;let e=S.trim().replace(/\/+$/,``);if(!e){D(`idle`);return}if(!/^https?:\/\/[^\s]+$/i.test(e))return;if(e===(t?.relayUrl??``).trim().replace(/\/+$/,``)&&t?.tunnel.state===`connected`){D(`ok`);return}let n=window.setTimeout(()=>{ee(e)},600);return()=>window.clearTimeout(n)},[S,h]),(0,g.useEffect)(()=>{let e=(t?.relayUrl??``).trim();if(!e||M!==null)return;let n=!1;return(async()=>{let t=await B(e.replace(/\/+$/,``));n||(N(t),t||o($(`panel.onboarding.recheckSaved`,{url:e})))})(),()=>{n=!0}},[t?.relayUrl]);let z=v||b.find(e=>e.ms!==null&&Number.isFinite(e.ms))?.url||b[0]?.url||``;async function B(e){try{let t=await Promise.race([US(`/api/relay/probe-relays`,{urls:[e]}),new Promise(e=>window.setTimeout(()=>e(null),8e3))]);return t?!!(t.results[0]&&t.results[0].ms!==null):!1}catch{return!1}}async function V(){let e=S.trim().replace(/\/+$/,``);if(!/^https?:\/\/[^\s]+$/i.test(e)){D(`failed`);return}D(`busy`),D(await B(e)?`ok`:`failed`)}function H(e){C(e),D(`idle`)}async function ee(e){D(`busy`),o(``);let t=await B(e);if(S.trim().replace(/\/+$/,``)===e){if(!t){F(``),D(`failed`),o($(`panel.onboarding.relayNoAnswer`,{value:e}));return}D(`ok`);try{let t=await HS(`/api/relay/pairing?relayUrl=${encodeURIComponent(e)}`);F(t.svg??``)}catch{F(``)}}}let U=String(t?.lan.port||l?.port||18787),[te,W]=(0,g.useState)(``),ne=e=>W(e?`ok`:`failed`),G=h===wD||h===TD,K=h===wD&&M===!1,q=t!==null&&(G?t.tunnel.state===`connected`:t.lan.state===`listening`);async function re(e=G){let t=Date.now();for(;I.current&&Date.now()-t<2e4;){if(await new Promise(e=>window.setTimeout(e,1500)),!I.current)return;let t;try{t=await HS(`/api/relay/status`)}catch{continue}n(t);let r=e?t.tunnel.state:t.lan.state;if(r===`listening`||r===`connected`||r===`error`)return}}async function ie(e,t){if(s)return;c(!0),o(``);let r=e===wD,i={relayUrl:(r&&(z||Iw[0]?.url)||``).trim(),lanEnabled:!0,pairingPolicy:`code`};p&&(i.preferredLanAddress=p);try{n(await US(`/api/relay/config`,i)),t&&(n(await US(`/api/relay/toggle`,{enabled:!0})),await US(`/api/relay/onboarded`,{}).catch(()=>void 0)),_(e),await R(),t&&re(r)}catch(e){o(WS(e))}finally{c(!1)}}async function ae(){await ie(h,!0)}function oe(){e?e():window.location.assign(`/`)}async function se(){let e=S.trim().replace(/\/+$/,``);if(!e)return;let r=(t?.relayUrl??``).trim().replace(/\/+$/,``);if(h===TD&&e===r&&t?.tunnel.state===`connected`){oe();return}if(!s){c(!0),o(``);try{if(!await B(e)){D(`failed`),F(``),o($(`panel.onboarding.relayNoAnswerUnsaved`,{value:e}));return}D(`ok`);let t={relayUrl:e,lanEnabled:!0,pairingPolicy:`code`};p&&(t.preferredLanAddress=p),n(await US(`/api/relay/config`,t)),n(await US(`/api/relay/toggle`,{enabled:!0})),await US(`/api/relay/onboarded`,{}).catch(()=>void 0),_(TD),await R(),oe()}catch(e){o(WS(e))}finally{c(!1)}}}async function ce(e){if(e===TD){_(e),o(``);return}await ie(e,!0)}async function le(e){let t={preferredLanAddress:e};G&&(t.relayUrl=``),m(e),_(ED),o(``);try{await US(`/api/relay/config`,t)}catch(e){o(WS(e))}j(!1),await R()}let ue=l?.lan??[],de=(()=>{let e=p||ue[0]?.address||``;return ue.find(t=>t.address===e)?.url??e})(),fe=h===TD&&S.trim()===``,pe=h===TD&&S.trim()!==``&&S.trim().replace(/\/+$/,``)!==(t?.relayUrl??``).trim().replace(/\/+$/,``),me=fe||pe&&!P,he=h===TD&&pe&&P!==``,ge=he?P:d?.svg??``,_e=(()=>{let e=S.trim().replace(/\/+$/,``);if(e===``)return{tone:`off`,text:$(`panel.onboarding.probe.empty`)};if(E===`busy`)return{tone:`warn`,text:$(`panel.onboarding.probe.busy`)};if(e===(t?.relayUrl??``).trim().replace(/\/+$/,``)){let e=t?.tunnel.state??`off`;return{tone:yx(e),text:bx(e)}}return E===`ok`?{tone:`ok`,text:$(`panel.onboarding.probe.ok`)}:E===`failed`?{tone:`error`,text:$(`panel.onboarding.probe.failed`)}:{tone:`off`,text:$(`panel.onboarding.probe.idle`)}})(),ve=l?.public??[],ye=l?.ipv6??[];return(0,J.jsxs)(`main`,{className:`flex min-h-screen flex-col items-center justify-center gap-4 p-6`,children:[r?(0,J.jsxs)(sb,{className:`w-full max-w-2xl`,variant:`error`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.onboarding.statusFailed`)}),(0,J.jsx)(db,{children:r})]}):null,a?(0,J.jsxs)(sb,{className:`w-full max-w-2xl`,variant:`error`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(`panel.onboarding.stepFailed`)}),(0,J.jsx)(db,{children:a})]}):null,(0,J.jsxs)(Pb,{frame:`solid`,className:`w-full max-w-2xl`,children:[(0,J.jsx)(Fb,{children:(0,J.jsx)(Ib,{children:$(`panel.onboarding.title`)})}),(0,J.jsxs)(`div`,{className:`grid gap-6 px-4 pb-2 md:grid-cols-[212px_1fr]`,children:[(0,J.jsxs)(`div`,{className:`flex flex-col items-center gap-3`,children:[me?(0,J.jsx)(`div`,{className:`flex size-[200px] flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border-muted px-5 text-center`,children:fe?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:$(`panel.onboarding.qrAfterRelay`)}),(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:$(`panel.onboarding.qrAfterRelayLine2`)})]}):(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:$(`panel.onboarding.qrAfterAddress`)})}):ge?(0,J.jsx)(`div`,{className:`size-[200px] rounded-lg bg-white p-2 [&_svg]:h-full [&_svg]:w-full`,dangerouslySetInnerHTML:{__html:ge}}):(0,J.jsx)(`div`,{className:`flex size-[200px] items-center justify-center rounded-lg border border-border-muted text-xs text-foreground-muted`,children:s?(0,J.jsx)($y,{}):$(`panel.onboarding.noQr`)}),me?null:(0,J.jsx)(`p`,{className:`font-mono text-lg tracking-[0.25em] text-foreground-intense`,children:d?.pairingCode??t?.pairingCode??`—`}),he?(0,J.jsx)(`p`,{className:`text-center text-xs text-foreground-muted`,children:$(`panel.onboarding.preview`)}):G&&!q&&!me?(0,J.jsx)(`p`,{className:`text-center text-xs text-foreground-muted`,children:$(`panel.onboarding.relayNotConnected`)}):null,(0,J.jsx)(`div`,{className:`w-full`,children:(0,J.jsx)(Ex,{children:G?h===TD?(0,J.jsx)(Tx,{label:$(`panel.onboarding.thisAddress`),children:(0,J.jsx)(Dx,{tone:_e.tone,text:_e.text})}):(0,J.jsx)(Tx,{label:$(`panel.connection.tunnel`),children:(0,J.jsx)(Dx,{tone:yx(t?.tunnel.state??`off`),text:bx(t?.tunnel.state??`off`)})}):(0,J.jsx)(Tx,{label:$(`panel.onboarding.direct`),children:(0,J.jsx)(Dx,{tone:xx(t?.lan.state??`off`,!0),text:Sx(t?.lan.state??`off`,!0)})})})}),t!==null&&(G?t.tunnel.state===`error`:t.lan.state===`error`)?(0,J.jsxs)(sb,{variant:`error`,children:[(0,J.jsx)(lb,{}),(0,J.jsx)(ub,{children:$(G?`panel.onboarding.relayFailed`:`panel.onboarding.lanFailed`)}),(0,J.jsx)(db,{children:G?t.tunnel.error?$(`panel.onboarding.tunnelErrorHint`,{error:t.tunnel.error}):$(`panel.onboarding.tunnelNoStart`):t.lan.error?$(`panel.onboarding.lanErrorWithPort`,{error:t.lan.error}):$(`panel.onboarding.lanNoStart`)})]}):null]}),(0,J.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-3`,children:[(0,J.jsxs)(`div`,{className:`rounded-lg border border-border-muted`,children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-baseline justify-between gap-x-3 gap-y-1 border-b border-border-muted px-3 py-2`,children:[(0,J.jsx)(`p`,{className:`text-xs text-foreground-muted`,children:$(`panel.onboarding.pickAddress`)}),(0,J.jsx)(`button`,{type:`button`,className:`cursor-pointer text-xs text-foreground-intense underline underline-offset-2 hover:text-foreground-strong`,onClick:()=>{W(``),T(!0)},children:$(`panel.onboarding.checkFirewall`)})]}),(0,J.jsxs)(`div`,{className:`px-3 py-2.5`,children:[(0,J.jsxs)(yw,{className:`gap-1`,value:h,onValueChange:e=>void ce(String(e)),children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-x-3`,children:[(0,J.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-1.5`,children:[(0,J.jsx)(iw,{value:ED,"aria-label":$(`panel.onboarding.lanDirect`)}),(0,J.jsx)(`span`,{className:`text-sm text-foreground`,children:$(`panel.onboarding.lanDirect`)})]}),(0,J.jsx)(Ob,{variant:`outline`,size:`sm`,disabled:ue.length===0,onClick:()=>j(!0),children:$(`panel.onboarding.chooseAddress`)})]}),(0,J.jsxs)(`label`,{className:`flex cursor-pointer flex-wrap items-baseline justify-between gap-x-3`,children:[(0,J.jsxs)(`span`,{className:`flex items-baseline gap-1.5`,children:[(0,J.jsx)(iw,{value:wD,"aria-label":$(`panel.onboarding.publicRelay`)}),(0,J.jsx)(`span`,{className:`text-sm text-foreground`,children:$(`panel.onboarding.publicRelay`)})]}),(0,J.jsx)(`span`,{className:`shrink-0 text-xs text-foreground-muted`,children:$(`panel.onboarding.publicRelayTemporary`)})]}),(0,J.jsxs)(`label`,{className:`flex cursor-pointer flex-wrap items-baseline justify-between gap-x-3`,children:[(0,J.jsxs)(`span`,{className:`flex items-baseline gap-1.5`,children:[(0,J.jsx)(iw,{value:TD,"aria-label":$(`panel.onboarding.ownRelay`)}),(0,J.jsx)(`span`,{className:`text-sm text-foreground`,children:$(`panel.onboarding.ownRelay`)})]}),(0,J.jsx)(`a`,{className:wl({variant:`outline`,size:`sm`}),href:DD,target:`_blank`,rel:`noreferrer noopener`,onClick:e=>e.stopPropagation(),children:$(`panel.onboarding.githubRepo`)})]})]}),h===ED?(0,J.jsxs)(`div`,{className:`mt-3 border-t border-border-muted pt-2.5`,children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-baseline justify-between gap-x-3`,children:[(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:$(`panel.onboarding.currentLan`)}),(0,J.jsx)(`span`,{className:`min-w-0 text-right font-mono text-xs break-all text-foreground`,children:de||`—`})]}),ve.length>0||ye.length>0?(0,J.jsxs)(`div`,{className:`mt-2`,children:[ve.length>0?(0,J.jsx)(`ul`,{className:`mt-1 flex flex-col gap-1`,children:ve.map(e=>(0,J.jsxs)(`li`,{className:`grid grid-cols-[minmax(0,1fr)_auto] items-baseline gap-x-3`,children:[(0,J.jsx)(`span`,{className:`min-w-0 font-mono text-xs break-all text-foreground-muted`,children:e.url}),(0,J.jsx)(`span`,{className:`shrink-0 text-xs text-foreground-muted`,children:e.interface??$(`panel.onboarding.public`)})]},e.address))}):null,ye.length>0?(0,J.jsxs)(`div`,{className:`mt-1`,children:[(0,J.jsxs)(`button`,{type:`button`,className:`flex w-full cursor-pointer items-baseline justify-between gap-3 rounded px-1 py-1 text-left hover:bg-background-muted`,"aria-expanded":O,onClick:()=>k(e=>!e),children:[(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:$(`panel.onboarding.ipv6More`,{count:ye.length})}),(0,J.jsx)(`span`,{className:`shrink-0 text-xs text-foreground-intense`,children:$(O?`panel.onboarding.collapse`:`panel.onboarding.expand`)})]}),O?(0,J.jsx)(`ul`,{className:`mt-1 flex flex-col gap-1`,children:ye.map(e=>(0,J.jsxs)(`li`,{className:`grid grid-cols-[minmax(0,1fr)_auto] items-baseline gap-x-3`,children:[(0,J.jsx)(`span`,{className:`min-w-0 font-mono text-xs break-all text-foreground-muted`,children:e.url}),(0,J.jsx)(`span`,{className:`shrink-0 text-xs text-foreground-muted`,children:e.interface??`IPv6`})]},e.address))}):null]}):null]}):null]}):null]})]}),h===wD?(0,J.jsxs)(`div`,{className:`rounded-md bg-background-muted px-3 py-2`,children:[(0,J.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,J.jsx)(`p`,{className:`text-xs text-foreground-muted`,children:$(`panel.onboarding.relayListTitle`)}),b.some(e=>e.ms===null)?(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:$(`panel.onboarding.probing`)}):null]}),(0,J.jsx)(`div`,{className:`mt-1.5 max-h-[168px] overflow-y-auto`,children:(0,J.jsxs)(yw,{className:`gap-1`,value:v,onValueChange:e=>y(String(e)),children:[(0,J.jsxs)(`label`,{className:`flex cursor-pointer flex-wrap items-baseline justify-between gap-x-3`,children:[(0,J.jsxs)(`span`,{className:`flex items-baseline gap-1.5`,children:[(0,J.jsx)(iw,{value:``,"aria-label":$(`panel.onboarding.autoBest`)}),(0,J.jsx)(`span`,{className:`text-xs text-foreground`,children:$(`panel.onboarding.autoBest`)})]}),(0,J.jsx)(`span`,{className:`shrink-0 text-xs text-foreground-muted`,children:$(`panel.onboarding.autoBestHint`)})]}),b.map(e=>(0,J.jsxs)(`label`,{className:`flex cursor-pointer flex-wrap items-baseline justify-between gap-x-3`,children:[(0,J.jsxs)(`span`,{className:`flex items-baseline gap-1.5`,children:[(0,J.jsx)(iw,{value:e.url,"aria-label":e.url}),(0,J.jsx)(`span`,{className:`font-mono text-xs text-foreground`,children:e.url})]}),(0,J.jsx)(`span`,{className:`shrink-0 text-xs text-foreground-muted`,children:e.ms===null?$(`panel.onboarding.probing`):Number.isFinite(e.ms)?`${e.ms} ms`:$(`panel.onboarding.probeUnreachable`)})]},e.url))]})})]}):null,h===TD?(0,J.jsxs)(jC,{children:[(0,J.jsx)(MC,{htmlFor:`ob-own-relay`,children:$(`panel.onboarding.relayAddressHint`)}),(0,J.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,J.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,J.jsx)(IC,{inputProps:{id:`ob-own-relay`,className:`font-mono`},value:S,placeholder:$(`panel.onboarding.relayPlaceholder`),onChange:e=>H(e.target.value)})}),(0,J.jsx)(Ob,{className:`shrink-0`,variant:`outline`,disabled:E===`busy`,onClick:()=>void V(),children:$(E===`busy`?`panel.onboarding.probe.busy`:`panel.onboarding.check`)})]}),E===`ok`?(0,J.jsx)(`p`,{className:`text-xs text-success`,children:$(`panel.onboarding.probe.okWithHint`)}):null,E===`failed`?(0,J.jsx)(`p`,{className:`text-xs text-error`,children:`这个地址连不上,二维码不会生成。确认它是 http:// 或 https:// 开头、那台中转在运行、域名解析到它。`}):null]}):null]})]}),(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center justify-end gap-2 px-4 py-4`,children:[(0,J.jsx)(Bw,{}),h===TD?(0,J.jsx)(Ob,{variant:`primary`,disabled:s||r!==``||K||S.trim()===``,onClick:()=>void se(),children:$(s?`panel.onboarding.connecting`:K?`panel.onboarding.fixFirst`:fe?`panel.onboarding.fillRelayFirst`:`panel.onboarding.enterPlugin`)}):q&&!K?(0,J.jsx)(Ob,{variant:`primary`,onClick:oe,children:$(`panel.onboarding.enterPlugin`)}):(0,J.jsx)(Ob,{variant:`primary`,disabled:s||r!==``||K,onClick:()=>void ae(),children:$(s?`panel.onboarding.opening`:K?`panel.onboarding.fixFirst`:G?`panel.onboarding.connectRelay`:`panel.onboarding.openDirect`)})]})]}),(0,J.jsx)(eC,{open:w,onOpenChange:T,children:(0,J.jsxs)(tC,{className:`w-[min(1200px,92vw)] max-w-none`,backdropProps:{className:`z-[80]`},viewportProps:{className:`z-[80]`},children:[(0,J.jsx)(nC,{children:(0,J.jsx)(rC,{children:$(`panel.onboarding.firewallTitle`)})}),(0,J.jsxs)(iC,{className:`flex flex-col gap-4`,children:[(0,J.jsxs)(`p`,{className:`text-sm text-foreground-muted`,children:[$(`panel.onboarding.firewallIntro`),` `,(0,J.jsx)(`span`,{className:`font-mono`,children:`18787`}),$(`panel.onboarding.firewallIntroTail`)]}),(0,J.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-3`,children:[(0,J.jsx)(FD,{title:`Linux`,steps:jD,port:U,onCopied:ne}),(0,J.jsx)(FD,{title:`Mac`,steps:MD,port:U,onCopied:ne}),(0,J.jsx)(FD,{title:`Windows`,steps:ND,port:U,onCopied:ne})]})]}),(0,J.jsxs)(aC,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,J.jsxs)(`span`,{className:`text-xs text-foreground-muted`,children:[te===`ok`?$(`panel.onboarding.copiedOk`):null,te===`failed`?$(`panel.onboarding.copiedFailed`):null]}),(0,J.jsx)(Ob,{variant:`primary`,onClick:()=>T(!1),children:$(`panel.onboarding.gotIt`)})]})]})}),(0,J.jsx)(eC,{open:A,onOpenChange:j,children:(0,J.jsxs)(tC,{className:`max-w-md`,closeLabel:$(`panel.common.close`),children:[(0,J.jsx)(nC,{children:(0,J.jsx)(rC,{children:$(`panel.onboarding.lanDialogTitle`)})}),(0,J.jsxs)(iC,{className:`flex flex-col gap-2`,children:[(0,J.jsx)(`p`,{className:`text-xs text-foreground-muted`,children:$(`panel.onboarding.lanDialogHint`)}),(0,J.jsx)(`div`,{role:`radiogroup`,"aria-label":$(`panel.onboarding.lanGroupA11y`),className:`flex flex-col gap-1`,children:ue.map(e=>{let t=e.address===(p||ue[0]?.address);return(0,J.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":t,onClick:()=>void le(e.address),className:`flex w-full cursor-pointer items-start gap-2.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-background-muted ${t?`bg-background-muted`:``}`,children:[(0,J.jsx)(`span`,{className:`mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border ${t?`border-primary bg-primary text-primary-foreground`:`border-border-muted`}`,"aria-hidden":`true`,children:t?(0,J.jsx)(ID,{}):null}),(0,J.jsxs)(`span`,{className:`flex min-w-0 flex-col gap-0.5`,children:[(0,J.jsx)(`span`,{className:`min-w-0 font-mono text-xs break-all text-foreground`,children:e.url}),(0,J.jsx)(`span`,{className:`text-xs text-foreground-muted`,children:e.interface??$(`panel.onboarding.lan`)})]})]},e.address)})})]})]})})]})}var jD=[{textKey:`panel.onboarding.linuxStep1`},{text:`systemctl status firewalld`,cmd:!0},{text:`sudo ufw status`,cmd:!0},{textKey:`panel.onboarding.linuxStep2`},{text:`sudo firewall-cmd --permanent --add-port={port}/tcp
26
26
  sudo firewall-cmd --reload`,cmd:!0},{text:`sudo ufw allow {port}/tcp`,cmd:!0},{textKey:`panel.onboarding.linuxStep3`}],MD=[{textKey:`panel.onboarding.macStep1`},{text:`/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate`,cmd:!0},{textKey:`panel.onboarding.macStep2`},{text:`sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off`,cmd:!0},{textKey:`panel.onboarding.macStep3`}],ND=[{textKey:`panel.onboarding.winStep1`},{text:`Get-NetFirewallProfile | Select-Object Name, Enabled`,cmd:!0},{textKey:`panel.onboarding.winStep2`},{text:`New-NetFirewallRule -DisplayName "DSH Mobile {port}" -Direction Inbound -LocalPort {port} -Protocol TCP -Action Allow`,cmd:!0},{textKey:`panel.onboarding.winStep3`}];function PD(){return[$(`panel.onboarding.prompt.intro`),``,$(`panel.onboarding.prompt.situation`),$(`panel.onboarding.prompt.address`),$(`panel.onboarding.prompt.guess`),``,$(`panel.onboarding.prompt.ask`),$(`panel.onboarding.prompt.ask1`),$(`panel.onboarding.prompt.ask2`),$(`panel.onboarding.prompt.ask3`),$(`panel.onboarding.prompt.ask4`),``,$(`panel.onboarding.prompt.extra`)].join(`