From b7b1c41e378ec467504b1555a4d4568302eb9c9b Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 29 Jun 2026 11:06:51 +0800 Subject: [PATCH 01/16] Document Wails desktop client setup --- README.md | 21 + desktop/.gitignore | 1 + desktop/README.md | 19 + .../bindings/fastgitdesktop/fastgitservice.ts | 22 + .../frontend/bindings/fastgitdesktop/index.ts | 11 + .../bindings/fastgitdesktop/models.ts | 10 + .../wailsapp/wails/v3/internal/eventcreate.ts | 9 + .../wailsapp/wails/v3/internal/eventdata.d.ts | 2 + .../frontend/dist/assets/index-9uDSrkgH.js | 44 + .../frontend/dist/assets/index-CzA6nRjJ.css | 1 + desktop/frontend/dist/index.html | 13 + desktop/frontend/index.html | 12 + desktop/frontend/package-lock.json | 1128 +++++++++++++++++ desktop/frontend/package.json | 18 + desktop/frontend/src/main.ts | 110 ++ desktop/frontend/src/style.css | 119 ++ desktop/frontend/tsconfig.json | 17 + desktop/frontend/vite.config.ts | 8 + desktop/go.mod | 17 + desktop/go.sum | 37 + desktop/main.go | 45 + desktop/service.go | 126 ++ 22 files changed, 1790 insertions(+) create mode 100644 desktop/.gitignore create mode 100644 desktop/README.md create mode 100644 desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts create mode 100644 desktop/frontend/bindings/fastgitdesktop/index.ts create mode 100644 desktop/frontend/bindings/fastgitdesktop/models.ts create mode 100644 desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts create mode 100644 desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts create mode 100644 desktop/frontend/dist/assets/index-9uDSrkgH.js create mode 100644 desktop/frontend/dist/assets/index-CzA6nRjJ.css create mode 100644 desktop/frontend/dist/index.html create mode 100644 desktop/frontend/index.html create mode 100644 desktop/frontend/package-lock.json create mode 100644 desktop/frontend/package.json create mode 100644 desktop/frontend/src/main.ts create mode 100644 desktop/frontend/src/style.css create mode 100644 desktop/frontend/tsconfig.json create mode 100644 desktop/frontend/vite.config.ts create mode 100644 desktop/go.mod create mode 100644 desktop/go.sum create mode 100644 desktop/main.go create mode 100644 desktop/service.go diff --git a/README.md b/README.md index 4f5ba9a..377ce7d 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,27 @@ agentic git commit generate tool - 路线图文档:`docs/roadmap.md` - Copilot DCOS:`docs/copilot-dcos.md` +## Desktop Client (Wails v3) + +- 桌面端代码位于:`desktop/` +- 该子项目不会影响现有 CLI(`main.go` / `bootstrap.Main()` 保持不变) + +快速启动: + +```bash +cd desktop +go run github.com/wailsapp/wails/v3/cmd/wails3@latest generate bindings -clean=true -ts -i +cd frontend && npm install && npm run build +cd .. +go run . +``` + +如果本机已安装 `wails3`,可直接在 `desktop/` 下执行: + +```bash +wails3 dev +``` + ## Command Overview - `fastgit commit`: AI 提交流程(保留原行为) - `fastgit commit ai`: AI 提交流程显式入口(新增) diff --git a/desktop/.gitignore b/desktop/.gitignore new file mode 100644 index 0000000..f786193 --- /dev/null +++ b/desktop/.gitignore @@ -0,0 +1 @@ +frontend/node_modules diff --git a/desktop/README.md b/desktop/README.md new file mode 100644 index 0000000..7038d7c --- /dev/null +++ b/desktop/README.md @@ -0,0 +1,19 @@ +# fastgit desktop (Wails v3) + +## Run in dev mode + +```bash +cd desktop/frontend +npm install +npm run build +cd .. +go run . +``` + +> 如果你本机安装了 `wails3`,也可使用 `wails3 dev`。 + +## Build desktop app + +```bash +wails3 build +``` diff --git a/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts b/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts new file mode 100644 index 0000000..1f7eaa8 --- /dev/null +++ b/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts @@ -0,0 +1,22 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +export function GetRepoRoot(): $CancellablePromise { + return $Call.ByID(853311305); +} + +export function RunFastgit(commandLine: string): $CancellablePromise<$models.CommandResult> { + return $Call.ByID(848143838, commandLine); +} + +export function SetRepoRoot(path: string): $CancellablePromise { + return $Call.ByID(2463093517, path); +} diff --git a/desktop/frontend/bindings/fastgitdesktop/index.ts b/desktop/frontend/bindings/fastgitdesktop/index.ts new file mode 100644 index 0000000..dd078d2 --- /dev/null +++ b/desktop/frontend/bindings/fastgitdesktop/index.ts @@ -0,0 +1,11 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as FastgitService from "./fastgitservice.js"; +export { + FastgitService +}; + +export type { + CommandResult +} from "./models.js"; diff --git a/desktop/frontend/bindings/fastgitdesktop/models.ts b/desktop/frontend/bindings/fastgitdesktop/models.ts new file mode 100644 index 0000000..70777c7 --- /dev/null +++ b/desktop/frontend/bindings/fastgitdesktop/models.ts @@ -0,0 +1,10 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export interface CommandResult { + "command": string; + "output": string; + "exitCode": number; + "startedAt": string; + "endedAt": string; +} diff --git a/desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts b/desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts new file mode 100644 index 0000000..1ea1058 --- /dev/null +++ b/desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts @@ -0,0 +1,9 @@ +//@ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +Object.freeze($Create.Events); diff --git a/desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts b/desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts new file mode 100644 index 0000000..3dd1807 --- /dev/null +++ b/desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts @@ -0,0 +1,2 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT diff --git a/desktop/frontend/dist/assets/index-9uDSrkgH.js b/desktop/frontend/dist/assets/index-9uDSrkgH.js new file mode 100644 index 0000000..02e8a84 --- /dev/null +++ b/desktop/frontend/dist/assets/index-9uDSrkgH.js @@ -0,0 +1,44 @@ +(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))o(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&o(s)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function o(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();const w=typeof window<"u"&&typeof document<"u",Fe="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function W(t=21){let e="",n=t|0;for(;n--;)e+=Fe[Math.random()*64|0];return e}var Y;function Le(){return window.location.origin+"/wails/runtime"}const x=512*1024,O=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10,IOS:11,Android:12});let ce=W(),te=null;function F(t,e=""){return function(n,o=null){return Re(t,n,e,o)}}async function Re(t,e,n,o){var r,i;if(te)return te.call(t,e,n,o);let s=new URL(Le()),l={object:t,method:e};o!=null&&(l.args=o);let a={"x-wails-client-id":ce,"Content-Type":"application/json"};n&&(a["x-wails-window-name"]=n);const f=JSON.stringify(l);let h;if(f.length>x?h=await ze(s,a,f):h=await fetch(s,{method:"POST",headers:a,body:f}),!h.ok)throw new Error(await h.text());return((i=(r=h.headers.get("Content-Type"))===null||r===void 0?void 0:r.indexOf("application/json"))!==null&&i!==void 0?i:-1)!==-1?h.json():h.text()}async function ze(t,e,n){const o=W(),r=new TextEncoder().encode(n),i=Math.ceil(r.length/x);for(let s=0;s{var r;const i=t.get(e);if(i){if(t.delete(e),o){i.reject(new Error(o));return}try{const s=JSON.parse(n??"{}");if(!s.ok){i.reject(new Error((r=s.error)!==null&&r!==void 0?r:"unknown runtime call error"));return}i.resolve("text"in s?s.text:s.data)}catch(s){i.reject(s)}}},te={call(e,n,o,r){return new Promise((i,s)=>{const l=W();t.set(l,{resolve:i,reject:s});try{we.invokeAsync(l,JSON.stringify({object:e,method:n,windowName:o,args:r??null,clientId:ce}))}catch(a){t.delete(l),s(a)}})}}}F(O.System);const $=(function(){var t,e,n,o,r,i;try{if(!((e=(t=window.chrome)===null||t===void 0?void 0:t.webview)===null||e===void 0)&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if(!((r=(o=(n=window.webkit)===null||n===void 0?void 0:n.messageHandlers)===null||o===void 0?void 0:o.external)===null||r===void 0)&&r.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external);if(!((i=window.wails)===null||i===void 0)&&i.invoke)return s=>window.wails.invoke(typeof s=="string"?s:JSON.stringify(s))}catch{}return console.warn(` +%c⚠️ Browser Environment Detected %c + +%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. +More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development +`,"background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;","background: transparent;","color: #ffffff; font-style: italic; font-weight: bold;"),null})();function I(t){$?.(t)}function Ee(){var t,e;return((e=(t=window._wails)===null||t===void 0?void 0:t.environment)===null||e===void 0?void 0:e.OS)==="windows"}function Pe(){var t,e;return((e=(t=window._wails)===null||t===void 0?void 0:t.environment)===null||e===void 0?void 0:e.OS)==="linux"}function ke(){var t,e;return!!(!((e=(t=window._wails)===null||t===void 0?void 0:t.environment)===null||e===void 0)&&e.Debug)}function Ae(){return new MouseEvent("mousedown").buttons===0}function Te(t){var e;return t.target instanceof HTMLElement?t.target:!(t.target instanceof HTMLElement)&&t.target instanceof Node&&(e=t.target.parentElement)!==null&&e!==void 0?e:document.body}w&&document.addEventListener("DOMContentLoaded",()=>{});w&&window.addEventListener("contextmenu",Ue);const Ie=F(O.ContextMenu),He=0;function Be(t,e,n,o){Ie(He,{id:t,x:e,y:n,data:o})}function Ue(t){const e=Te(t),n=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(n){t.preventDefault();const o=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Be(n,t.clientX,t.clientY,o)}else We(t,e)}function We(t,e){if(ke())return;switch(window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":t.preventDefault();return}if(e.isContentEditable)return;const n=window.getSelection(),o=n&&n.toString().length>0;if(o)for(let r=0;r{ne=t,ne||(E=T=!1,p())});let oe=!1;function Ne(){var t,e;const n=(e=(t=window._wails)===null||t===void 0?void 0:t.environment)===null||e===void 0?void 0:e.OS;if(n==="ios"||n==="android")return!0;const o=navigator.userAgent||navigator.vendor||window.opera||"";return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(o)}function G(){if(!oe&&!Ne()){window.addEventListener("mousedown",K,{capture:!0}),window.addEventListener("mousemove",K,{capture:!0}),window.addEventListener("mouseup",K,{capture:!0});for(const t of["click","contextmenu","dblclick"])window.addEventListener(t,qe,{capture:!0});oe=!0}}if(w){G(),document.addEventListener("DOMContentLoaded",G,{once:!0});let t=0;const e=window.setInterval(()=>{if(oe){window.clearInterval(e);return}G(),++t>100&&window.clearInterval(e)},50)}function qe(t){(_||T)&&(t.stopImmediatePropagation(),t.stopPropagation(),t.preventDefault())}const J=0,Ze=1,V=2;function K(t){let e,n=t.buttons;switch(t.type){case"mousedown":e=J,P||(n=y|1<"u"||typeof e=="object"))try{var n=A.call(e);return(n===et||n===tt||n===nt||n===Ve)&&e("")==null}catch{}return!1})}function st(t){if(de(t))return!0;if(!t||typeof t!="function"&&typeof t!="object")return!1;try{M(t,null,re)}catch(e){if(e!==k)return!1}return!ae(t)&&ie(t)}function lt(t){if(de(t))return!0;if(!t||typeof t!="function"&&typeof t!="object")return!1;if(ot)return ie(t);if(ae(t))return!1;var e=A.call(t);return e!==Ke&&e!==Qe&&!/^\[object HTML/.test(e)?!1:ie(t)}const b=M?st:lt;var Q;class se extends Error{constructor(e,n){super(e,n),this.name="CancelError"}}class D extends Error{constructor(e,n,o){super((o??"Unhandled rejection in cancelled promise.")+" Reason: "+ct(n),{cause:n}),this.promise=e,this.name="CancelledRejectionError"}}const v=Symbol("barrier"),ve=Symbol("cancelImpl"),ge=(Q=Symbol.species)!==null&&Q!==void 0?Q:Symbol("speciesPolyfill");class u extends Promise{constructor(e,n){let o,r;if(super((a,f)=>{o=a,r=f}),this.constructor[ge]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let i={promise:this,resolve:o,reject:r,get oncancelled(){return n??null},set oncancelled(a){n=a??void 0}};const s={get root(){return s},resolving:!1,settled:!1};Object.defineProperties(this,{[v]:{configurable:!1,enumerable:!1,writable:!0,value:null},[ve]:{configurable:!1,enumerable:!1,writable:!1,value:je(i,s)}});const l=_e(i,s);try{e(Ce(i,s),l)}catch(a){s.resolving?console.log("Unhandled exception in CancellablePromise executor.",a):l(a)}}cancel(e){return new u(n=>{Promise.all([this[ve](new se("Promise cancelled.",{cause:e})),at(this)]).then(()=>n(),()=>n())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>{this.cancel(e.reason)},{capture:!0}),this}then(e,n,o){if(!(this instanceof u))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(b(e)||(e=be),b(n)||(n=ye),e===be&&n==ye)return new u(i=>i(this));const r={};return this[v]=r,new u((i,s)=>{super.then(l=>{var a;this[v]===r&&(this[v]=null),(a=r.resolve)===null||a===void 0||a.call(r);try{i(e(l))}catch(f){s(f)}},l=>{var a;this[v]===r&&(this[v]=null),(a=r.resolve)===null||a===void 0||a.call(r);try{i(n(l))}catch(f){s(f)}})},async i=>{try{return o?.(i)}finally{await this.cancel(i)}})}catch(e,n){return this.then(void 0,e,n)}finally(e,n){if(!(this instanceof u))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return b(e)?this.then(o=>u.resolve(e()).then(()=>o),o=>u.resolve(e()).then(()=>{throw o}),n):this.then(e,e,n)}static get[ge](){return Promise}static all(e){let n=Array.from(e);const o=n.length===0?u.resolve(n):new u((r,i)=>{Promise.all(n).then(r,i)},r=>z(o,n,r));return o}static allSettled(e){let n=Array.from(e);const o=n.length===0?u.resolve(n):new u((r,i)=>{Promise.allSettled(n).then(r,i)},r=>z(o,n,r));return o}static any(e){let n=Array.from(e);const o=n.length===0?u.resolve(n):new u((r,i)=>{Promise.any(n).then(r,i)},r=>z(o,n,r));return o}static race(e){let n=Array.from(e);const o=new u((r,i)=>{Promise.race(n).then(r,i)},r=>z(o,n,r));return o}static cancel(e){const n=new u(()=>{});return n.cancel(e),n}static timeout(e,n){const o=new u(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>{o.cancel(n)}):setTimeout(()=>{o.cancel(n)},e),o}static sleep(e,n){return new u(o=>{setTimeout(()=>o(n),e)})}static reject(e){return new u((n,o)=>o(e))}static resolve(e){return e instanceof u?e:new u(n=>n(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new u((n,o)=>{e.resolve=n,e.reject=o},n=>{var o;(o=e.oncancelled)===null||o===void 0||o.call(e,n)}),e}}function je(t,e){let n;return o=>{if(e.settled||(e.settled=!0,e.reason=o,t.reject(o),Promise.prototype.then.call(t.promise,void 0,r=>{if(r!==o)throw r})),!(!e.reason||!t.oncancelled))return n=new Promise(r=>{try{r(t.oncancelled(e.reason.cause))}catch(i){Promise.reject(new D(t.promise,i,"Unhandled exception in oncancelled callback."))}}).catch(r=>{Promise.reject(new D(t.promise,r,"Unhandled rejection in oncancelled callback."))}),t.oncancelled=null,n}}function Ce(t,e){return n=>{if(!e.resolving){if(e.resolving=!0,n===t.promise){if(e.settled)return;e.settled=!0,t.reject(new TypeError("A promise cannot be resolved with itself."));return}if(n!=null&&(typeof n=="object"||typeof n=="function")){let o;try{o=n.then}catch(r){e.settled=!0,t.reject(r);return}if(b(o)){try{let s=n.cancel;if(b(s)){const l=a=>{Reflect.apply(s,n,[a])};e.reason?je(Object.assign(Object.assign({},t),{oncancelled:l}),e)(e.reason):t.oncancelled=l}}catch{}const r={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(s){this.root.settled=s},get reason(){return this.root.reason}},i=_e(t,r);try{Reflect.apply(o,n,[Ce(t,r),i])}catch(s){i(s)}return}}e.settled||(e.settled=!0,t.resolve(n))}}}function _e(t,e){return n=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(n instanceof se&&e.reason instanceof se&&Object.is(n.cause,e.reason.cause))return}catch{}Promise.reject(new D(t.promise,n))}else e.settled=!0,t.reject(n)}}function z(t,e,n){const o=[];for(const r of e){let i;try{if(!b(r.then)||(i=r.cancel,!b(i)))continue}catch{continue}let s;try{s=Reflect.apply(i,r,[n])}catch(l){Promise.reject(new D(t,l,"Unhandled exception in cancel method."));continue}s&&o.push((s instanceof Promise?s:Promise.resolve(s)).catch(l=>{Promise.reject(new D(t,l,"Unhandled rejection in cancel method."))}))}return Promise.all(o)}function be(t){return t}function ye(t){throw t}function ct(t){try{if(t instanceof Error||typeof t!="object"||t.toString!==Object.prototype.toString)return""+t}catch{}try{return JSON.stringify(t)}catch{}try{return Object.prototype.toString.call(t)}catch{}return""}function at(t){var e;let n=(e=t[v])!==null&&e!==void 0?e:{};return"promise"in n||Object.assign(n,S()),t[v]==null&&(n.resolve(),t[v]=n),n.promise}let S=Promise.withResolvers;S&&typeof S=="function"?S=S.bind(Promise):S=function(){let t,e;return{promise:new Promise((o,r)=>{t=o,e=r}),resolve:t,reject:e}};w&&(window._wails=window._wails||{});const dt=F(O.Call),ut=F(O.CancelCall),j=new Map,ft=0,ht=0;function pt(){let t;do t=W();while(j.has(t));return t}function wt(t){const e=pt(),n=u.withResolvers();j.set(e,{resolve:n.resolve,reject:n.reject});const o=dt(ft,Object.assign({"call-id":e},t));let r=!0;o.then(s=>{r=!1,j.delete(e),n.resolve(s)},s=>{r=!1,j.delete(e),n.reject(s)});const i=()=>(j.delete(e),ut(ht,{"call-id":e}).catch(s=>{console.error("Error while requesting binding call cancellation:",s)}));return n.oncancelled=()=>r?i():o.then(i),n.promise}function ue(t,...e){return wt({methodID:t,args:e})}const mt="data-file-drop-target",m="file-drop-target-active";let d=null;const vt=0,gt=1,bt=2,yt=3,St=4,Mt=5,Et=6,Tt=7,xt=8,jt=9,Ct=10,_t=11,Dt=12,Ot=13,Ft=14,Lt=15,Rt=16,zt=17,Pt=18,kt=19,At=20,It=21,Ht=22,Bt=23,Ut=24,Wt=25,Nt=26,qt=27,Zt=28,Xt=29,Yt=30,$t=31,Gt=32,Jt=33,Vt=34,Kt=35,Qt=36,en=37,tn=38,nn=39,on=40,rn=41,sn=42,ln=43,cn=44,an=45,dn=46,un=47,fn=48,hn=49,pn=50,wn=51,mn=52;function H(t){return t?t.closest(`[${mt}]`):null}function vn(){var t,e,n,o;return((e=(t=window.chrome)===null||t===void 0?void 0:t.webview)===null||e===void 0?void 0:e.postMessageWithAdditionalObjects)==null?!1:((o=(n=window._wails)===null||n===void 0?void 0:n.flags)===null||o===void 0?void 0:o.enableFileDrop)===!0}function gn(t,e,n){var o,r;!((r=(o=window.chrome)===null||o===void 0?void 0:o.webview)===null||r===void 0)&&r.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${t}:${e}`,n)}let fe=!1;function De(){fe=!1,d&&(d.classList.remove(m),d=null)}function bn(){var t,e;((e=(t=window._wails)===null||t===void 0?void 0:t.flags)===null||e===void 0?void 0:e.enableFileDrop)!==!1&&(fe=!0)}function yn(){De()}function Sn(t,e){var n,o;if(!fe||((o=(n=window._wails)===null||n===void 0?void 0:n.flags)===null||o===void 0?void 0:o.enableFileDrop)===!1)return;const r=document.elementFromPoint(t,e),i=H(r);d&&d!==i&&d.classList.remove(m),i?(i.classList.add(m),d=i):d=null}const c=Symbol("caller");class B{constructor(e=""){this[c]=F(O.Window,e);for(const n of Object.getOwnPropertyNames(B.prototype))n!=="constructor"&&typeof this[n]=="function"&&(this[n]=this[n].bind(this))}Get(e){return new B(e)}Position(){return this[c](vt)}Center(){return this[c](gt)}Close(){return this[c](bt)}DisableSizeConstraints(){return this[c](yt)}EnableSizeConstraints(){return this[c](St)}Focus(){return this[c](Mt)}ForceReload(){return this[c](Et)}Fullscreen(){return this[c](Tt)}GetScreen(){return this[c](xt)}GetZoom(){return this[c](jt)}Height(){return this[c](Ct)}Hide(){return this[c](_t)}IsFocused(){return this[c](Dt)}IsFullscreen(){return this[c](Ot)}IsMaximised(){return this[c](Ft)}IsMinimised(){return this[c](Lt)}Maximise(){return this[c](Rt)}Minimise(){return this[c](zt)}Name(){return this[c](Pt)}OpenDevTools(){return this[c](kt)}RelativePosition(){return this[c](At)}Reload(){return this[c](It)}Resizable(){return this[c](Ht)}Restore(){return this[c](Bt)}SetPosition(e,n){return this[c](Ut,{x:e,y:n})}SetAlwaysOnTop(e){return this[c](Wt,{alwaysOnTop:e})}SetBackgroundColour(e,n,o,r){return this[c](Nt,{r:e,g:n,b:o,a:r})}SetFrameless(e){return this[c](qt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[c](Zt,{enabled:e})}SetMaxSize(e,n){return this[c](Xt,{width:e,height:n})}SetMinSize(e,n){return this[c](Yt,{width:e,height:n})}SetRelativePosition(e,n){return this[c]($t,{x:e,y:n})}SetResizable(e){return this[c](Gt,{resizable:e})}SetSize(e,n){return this[c](Jt,{width:e,height:n})}SetTitle(e){return this[c](Vt,{title:e})}SetZoom(e){return this[c](Kt,{zoom:e})}Show(){return this[c](Qt)}Size(){return this[c](en)}ToggleFullscreen(){return this[c](tn)}ToggleMaximise(){return this[c](nn)}ToggleFrameless(){return this[c](on)}UnFullscreen(){return this[c](rn)}UnMaximise(){return this[c](sn)}UnMinimise(){return this[c](ln)}Width(){return this[c](cn)}Zoom(){return this[c](an)}ZoomIn(){return this[c](dn)}ZoomOut(){return this[c](un)}ZoomReset(){return this[c](fn)}HandlePlatformFileDrop(e,n,o){var r,i;if(((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)===!1)return;const s=document.elementFromPoint(n,o),l=H(s);if(!l)return;const a={id:l.id,classList:Array.from(l.classList),attributes:{}};for(let h=0;h{var o,r,i;if(!(!((o=n.dataTransfer)===null||o===void 0)&&o.types.includes("Files")))return;if(n.preventDefault(),((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)===!1){n.dataTransfer.dropEffect="none";return}e++;const s=document.elementFromPoint(n.clientX,n.clientY),l=H(s);d&&d!==l&&d.classList.remove(m),l?(l.classList.add(m),n.dataTransfer.dropEffect="copy",d=l):(n.dataTransfer.dropEffect="none",d=null)},!1),t.addEventListener("dragover",n=>{var o,r,i;if(!(!((o=n.dataTransfer)===null||o===void 0)&&o.types.includes("Files")))return;if(n.preventDefault(),((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)===!1){n.dataTransfer.dropEffect="none";return}const s=document.elementFromPoint(n.clientX,n.clientY),l=H(s);d&&d!==l&&d.classList.remove(m),l?(l.classList.contains(m)||l.classList.add(m),n.dataTransfer.dropEffect="copy",d=l):(n.dataTransfer.dropEffect="none",d=null)},!1),t.addEventListener("dragleave",n=>{var o,r,i;!((o=n.dataTransfer)===null||o===void 0)&&o.types.includes("Files")&&(n.preventDefault(),((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)!==!1&&n.relatedTarget!==null&&(e--,(e===0||d&&!d.contains(n.relatedTarget))&&(d&&(d.classList.remove(m),d=null),e=0)))},!1),t.addEventListener("drop",n=>{var o,r,i;if(!((o=n.dataTransfer)===null||o===void 0)&&o.types.includes("Files")&&(n.preventDefault(),((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)!==!1&&(e=0,d&&(d.classList.remove(m),d=null),vn()))){const s=[];if(n.dataTransfer.items){for(const l of n.dataTransfer.items)if(l.kind==="file"){const a=l.getAsFile();a&&s.push(a)}}else if(n.dataTransfer.files)for(const l of n.dataTransfer.files)s.push(l);s.length>0&&gn(n.clientX,n.clientY,s)}},!1)}typeof window<"u"&&typeof document<"u"&&Mn();w&&(window._wails=window._wails||{});w&&(window._wails.invoke=I,window._wails.clientId=ce);w&&(window._wails.handlePlatformFileDrop=Se.HandlePlatformFileDrop.bind(Se));w&&(window._wails.handleDragEnter=bn,window._wails.handleDragLeave=yn,window._wails.handleDragOver=Sn);w&&I("wails:runtime:ready");function En(t){return fetch(t,{method:"HEAD"}).then(e=>{if(e.ok&&(e.headers.get("content-type")||"").toLowerCase().includes("javascript")){const o=document.createElement("script");o.src=t,document.head.appendChild(o)}}).catch(()=>{})}w&&En("/wails/custom.js");function Tn(){return ue(853311305)}function xn(t){return ue(848143838,t)}function jn(t){return ue(2463093517,t)}const Cn=document.querySelector("#app");Cn.innerHTML=` +
+
+

fastgit desktop

+

在桌面里执行 fastgit 命令并查看输出

+
+ +
+ +
+ + +
+ +
+ +
+ +
+ + +
+
+ + + + +
+
+ +
+
+ Output + +
+
等待执行命令...
+
+
+`;const Oe=document.querySelector("#repo"),U=document.querySelector("#repo-hint"),he=document.querySelector("#cmd"),le=document.querySelector("#run"),_n=document.querySelector("#save-repo"),ee=document.querySelector("#output"),Me=document.querySelector("#meta");async function Dn(){try{const t=await Tn();Oe.value=t,U.textContent=`当前仓库: ${t}`}catch(t){U.textContent=`读取仓库失败: ${String(t)}`}}async function pe(){const t=he.value.trim();if(t){le.disabled=!0,ee.textContent="running...",Me.textContent="";try{const e=await xn(t);ee.textContent=e.output||"(no output)",Me.textContent=`${e.command} | exit=${e.exitCode}`}catch(e){ee.textContent=`执行失败: ${String(e)}`}finally{le.disabled=!1}}}_n.addEventListener("click",async()=>{const t=Oe.value.trim();if(t)try{await jn(t),U.textContent=`当前仓库: ${t}`}catch(e){U.textContent=`切换失败: ${String(e)}`}});le.addEventListener("click",()=>{pe()});he.addEventListener("keydown",t=>{t.key==="Enter"&&(t.preventDefault(),pe())});document.querySelectorAll(".chip").forEach(t=>{t.addEventListener("click",()=>{he.value=t.dataset.cmd||"",pe()})});Dn(); diff --git a/desktop/frontend/dist/assets/index-CzA6nRjJ.css b/desktop/frontend/dist/assets/index-CzA6nRjJ.css new file mode 100644 index 0000000..7fe4821 --- /dev/null +++ b/desktop/frontend/dist/assets/index-CzA6nRjJ.css @@ -0,0 +1 @@ +:root{color-scheme:light;--bg: #f2f5f9;--panel: #ffffff;--text: #1f2b3a;--muted: #607085;--line: #d4dde8;--primary: #1363df;--primary-strong: #0f4ca8}*{box-sizing:border-box}body{margin:0;font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:radial-gradient(circle at 0 0,#dfe8ff 0%,var(--bg) 42%);color:var(--text)}.layout{max-width:980px;margin:0 auto;padding:24px;display:grid;gap:16px}.header h1{margin:0;font-size:28px}.header p{margin:6px 0 0;color:var(--muted)}.panel{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px}.row{display:flex;gap:8px}.input{flex:1;min-width:0;border:1px solid var(--line);border-radius:8px;padding:10px 12px}.btn{border:1px solid var(--line);background:#fff;border-radius:8px;padding:10px 14px;cursor:pointer}.btn.primary{border-color:transparent;background:var(--primary);color:#fff}.btn.primary:hover{background:var(--primary-strong)}.quick-actions{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap}.chip{border:1px solid var(--line);border-radius:999px;background:#fff;padding:6px 12px;cursor:pointer}.output-panel{min-height:320px}.output-head{display:flex;justify-content:space-between;color:var(--muted);margin-bottom:8px}.output{margin:0;border-radius:8px;background:#0b1220;color:#d7e0ef;min-height:250px;padding:12px;overflow:auto}small{display:inline-block;margin-top:6px;color:var(--muted)}@media(max-width:720px){.row{flex-direction:column}} diff --git a/desktop/frontend/dist/index.html b/desktop/frontend/dist/index.html new file mode 100644 index 0000000..44aac58 --- /dev/null +++ b/desktop/frontend/dist/index.html @@ -0,0 +1,13 @@ + + + + + + fastgit desktop + + + + +
+ + diff --git a/desktop/frontend/index.html b/desktop/frontend/index.html new file mode 100644 index 0000000..eeb937a --- /dev/null +++ b/desktop/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + fastgit desktop + + +
+ + + diff --git a/desktop/frontend/package-lock.json b/desktop/frontend/package-lock.json new file mode 100644 index 0000000..502610a --- /dev/null +++ b/desktop/frontend/package-lock.json @@ -0,0 +1,1128 @@ +{ + "name": "fastgit-desktop-frontend", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fastgit-desktop-frontend", + "version": "0.0.1", + "dependencies": { + "@wailsio/runtime": "^3.0.0-alpha.18" + }, + "devDependencies": { + "typescript": "^5.8.3", + "vite": "^7.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wailsio/runtime": { + "version": "3.0.0-alpha.94", + "resolved": "https://registry.npmjs.org/@wailsio/runtime/-/runtime-3.0.0-alpha.94.tgz", + "integrity": "sha512-jtOtyWLDLop9NfU373sA43NjyGntxDFUIHY6kzmArz5HGn66Ok3vl9N2nIyVs7cArvADxk/mBBZ9wXOX7R0NFA==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/desktop/frontend/package.json b/desktop/frontend/package.json new file mode 100644 index 0000000..ad710ce --- /dev/null +++ b/desktop/frontend/package.json @@ -0,0 +1,18 @@ +{ + "name": "fastgit-desktop-frontend", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@wailsio/runtime": "^3.0.0-alpha.18" + }, + "devDependencies": { + "typescript": "^5.8.3", + "vite": "^7.2.0" + } +} diff --git a/desktop/frontend/src/main.ts b/desktop/frontend/src/main.ts new file mode 100644 index 0000000..3004ac7 --- /dev/null +++ b/desktop/frontend/src/main.ts @@ -0,0 +1,110 @@ +import "./style.css"; +import { FastgitService } from "../bindings/fastgitdesktop"; + +const app = document.querySelector("#app")!; + +app.innerHTML = ` +
+
+

fastgit desktop

+

在桌面里执行 fastgit 命令并查看输出

+
+ +
+ +
+ + +
+ +
+ +
+ +
+ + +
+
+ + + + +
+
+ +
+
+ Output + +
+
等待执行命令...
+
+
+`; + +const repoInput = document.querySelector("#repo")!; +const repoHint = document.querySelector("#repo-hint")!; +const cmdInput = document.querySelector("#cmd")!; +const runBtn = document.querySelector("#run")!; +const saveRepoBtn = document.querySelector("#save-repo")!; +const output = document.querySelector("#output")!; +const meta = document.querySelector("#meta")!; + +async function boot() { + try { + const root = await FastgitService.GetRepoRoot(); + repoInput.value = root; + repoHint.textContent = `当前仓库: ${root}`; + } catch (err) { + repoHint.textContent = `读取仓库失败: ${String(err)}`; + } +} + +async function run() { + const command = cmdInput.value.trim(); + if (!command) return; + + runBtn.disabled = true; + output.textContent = "running..."; + meta.textContent = ""; + + try { + const res = await FastgitService.RunFastgit(command); + output.textContent = res.output || "(no output)"; + meta.textContent = `${res.command} | exit=${res.exitCode}`; + } catch (err) { + output.textContent = `执行失败: ${String(err)}`; + } finally { + runBtn.disabled = false; + } +} + +saveRepoBtn.addEventListener("click", async () => { + const path = repoInput.value.trim(); + if (!path) return; + try { + await FastgitService.SetRepoRoot(path); + repoHint.textContent = `当前仓库: ${path}`; + } catch (err) { + repoHint.textContent = `切换失败: ${String(err)}`; + } +}); + +runBtn.addEventListener("click", () => void run()); + +cmdInput.addEventListener("keydown", (e) => { + if (e.key === "Enter") { + e.preventDefault(); + void run(); + } +}); + +document.querySelectorAll(".chip").forEach((btn) => { + btn.addEventListener("click", () => { + cmdInput.value = btn.dataset.cmd || ""; + void run(); + }); +}); + +void boot(); diff --git a/desktop/frontend/src/style.css b/desktop/frontend/src/style.css new file mode 100644 index 0000000..4a85b43 --- /dev/null +++ b/desktop/frontend/src/style.css @@ -0,0 +1,119 @@ +:root { + color-scheme: light; + --bg: #f2f5f9; + --panel: #ffffff; + --text: #1f2b3a; + --muted: #607085; + --line: #d4dde8; + --primary: #1363df; + --primary-strong: #0f4ca8; +} + +* { box-sizing: border-box; } + +body { + margin: 0; + font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + background: radial-gradient(circle at 0 0, #dfe8ff 0%, var(--bg) 42%); + color: var(--text); +} + +.layout { + max-width: 980px; + margin: 0 auto; + padding: 24px; + display: grid; + gap: 16px; +} + +.header h1 { + margin: 0; + font-size: 28px; +} + +.header p { + margin: 6px 0 0; + color: var(--muted); +} + +.panel { + background: var(--panel); + border: 1px solid var(--line); + border-radius: 12px; + padding: 14px; +} + +.row { + display: flex; + gap: 8px; +} + +.input { + flex: 1; + min-width: 0; + border: 1px solid var(--line); + border-radius: 8px; + padding: 10px 12px; +} + +.btn { + border: 1px solid var(--line); + background: #fff; + border-radius: 8px; + padding: 10px 14px; + cursor: pointer; +} + +.btn.primary { + border-color: transparent; + background: var(--primary); + color: #fff; +} + +.btn.primary:hover { background: var(--primary-strong); } + +.quick-actions { + margin-top: 10px; + display: flex; + gap: 8px; + flex-wrap: wrap; +} + +.chip { + border: 1px solid var(--line); + border-radius: 999px; + background: #fff; + padding: 6px 12px; + cursor: pointer; +} + +.output-panel { min-height: 320px; } + +.output-head { + display: flex; + justify-content: space-between; + color: var(--muted); + margin-bottom: 8px; +} + +.output { + margin: 0; + border-radius: 8px; + background: #0b1220; + color: #d7e0ef; + min-height: 250px; + padding: 12px; + overflow: auto; +} + +small { + display: inline-block; + margin-top: 6px; + color: var(--muted); +} + +@media (max-width: 720px) { + .row { + flex-direction: column; + } +} diff --git a/desktop/frontend/tsconfig.json b/desktop/frontend/tsconfig.json new file mode 100644 index 0000000..95c899c --- /dev/null +++ b/desktop/frontend/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "Bundler", + "allowImportingTsExtensions": false, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "strict": true, + "types": ["vite/client"] + }, + "include": ["src"] +} diff --git a/desktop/frontend/vite.config.ts b/desktop/frontend/vite.config.ts new file mode 100644 index 0000000..5e01572 --- /dev/null +++ b/desktop/frontend/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + build: { + outDir: "dist", + emptyOutDir: true + } +}); diff --git a/desktop/go.mod b/desktop/go.mod new file mode 100644 index 0000000..978a10c --- /dev/null +++ b/desktop/go.mod @@ -0,0 +1,17 @@ +module fastgitdesktop + +go 1.25.0 + +require github.com/wailsapp/wails/v3 v3.0.0-alpha2.108 + +require ( + github.com/adrg/xdg v0.5.3 // indirect + github.com/coder/websocket v1.8.14 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/godbus/dbus/v5 v5.2.2 // indirect + github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/wailsapp/wails/webview2 v1.0.27 // indirect + golang.org/x/sys v0.43.0 // indirect +) diff --git a/desktop/go.sum b/desktop/go.sum new file mode 100644 index 0000000..c5aec38 --- /dev/null +++ b/desktop/go.sum @@ -0,0 +1,37 @@ +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= +github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= +github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= +github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-json-experiment/json v0.0.0-20251027170946-4849db3c2f7e h1:Lf/gRkoycfOBPa42vU2bbgPurFong6zXeFtPoxholzU= +github.com/go-json-experiment/json v0.0.0-20251027170946-4849db3c2f7e/go.mod h1:uNVvRXArCGbZ508SxYYTC5v1JWoz2voff5pm25jU1Ok= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ= +github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 h1:njuLRcjAuMKr7kI3D85AXWkw6/+v9PwtV6M6o11sWHQ= +github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= +github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= +github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/wailsapp/wails/v3 v3.0.0-alpha2.108 h1:XKm31tberFlcYLRVzDYSHa8f+4CZDKRSN3vfQhS1Mkk= +github.com/wailsapp/wails/v3 v3.0.0-alpha2.108/go.mod h1:wrdvmyeCsB/K3YqJDoH8E3MwcN8NXAMnEFaDTW46w60= +github.com/wailsapp/wails/webview2 v1.0.27 h1:wjgAi/I8BBZ7kUGU8um3XF3ILEfzr96Q2Q1G4GPjMns= +github.com/wailsapp/wails/webview2 v1.0.27/go.mod h1:zdM4jcO1IaC61RiJL5F1BzgoqBHFIdacz8gPr5exr0o= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/desktop/main.go b/desktop/main.go new file mode 100644 index 0000000..9259cee --- /dev/null +++ b/desktop/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "embed" + "log" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +//go:embed all:frontend/dist +var assets embed.FS + +func main() { + svc := NewFastgitService() + + app := application.New(application.Options{ + Name: "fastgit-desktop", + Description: "Desktop client for fastgit", + Services: []application.Service{ + application.NewService(svc), + }, + Assets: application.AssetOptions{ + Handler: application.AssetFileServerFS(assets), + }, + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + }) + + app.Window.NewWithOptions(application.WebviewWindowOptions{ + Title: "fastgit desktop", + Width: 1180, + Height: 760, + Mac: application.MacWindow{ + InvisibleTitleBarHeight: 50, + Backdrop: application.MacBackdropTranslucent, + TitleBar: application.MacTitleBarHiddenInset, + }, + URL: "/", + }) + + if err := app.Run(); err != nil { + log.Fatal(err) + } +} diff --git a/desktop/service.go b/desktop/service.go new file mode 100644 index 0000000..7916ba7 --- /dev/null +++ b/desktop/service.go @@ -0,0 +1,126 @@ +package main + +import ( + "context" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + "time" +) + +type CommandResult struct { + Command string `json:"command"` + Output string `json:"output"` + ExitCode int `json:"exitCode"` + StartedAt string `json:"startedAt"` + EndedAt string `json:"endedAt"` +} + +type FastgitService struct { + repoRoot string +} + +func NewFastgitService() *FastgitService { + cwd, _ := os.Getwd() + if filepath.Base(cwd) == "desktop" { + parent := filepath.Dir(cwd) + if st, err := os.Stat(filepath.Join(parent, "main.go")); err == nil && !st.IsDir() { + cwd = parent + } + } + return &FastgitService{repoRoot: cwd} +} + +func (s *FastgitService) GetRepoRoot() string { + return s.repoRoot +} + +func (s *FastgitService) SetRepoRoot(path string) error { + path = strings.TrimSpace(path) + if path == "" { + return errors.New("repo path cannot be empty") + } + abs, err := filepath.Abs(path) + if err != nil { + return err + } + st, err := os.Stat(abs) + if err != nil { + return err + } + if !st.IsDir() { + return fmt.Errorf("%s is not a directory", abs) + } + s.repoRoot = abs + return nil +} + +func (s *FastgitService) RunFastgit(commandLine string) (CommandResult, error) { + line := strings.TrimSpace(commandLine) + if line == "" { + return CommandResult{}, errors.New("command cannot be empty") + } + args := strings.Fields(line) + if len(args) == 0 { + return CommandResult{}, errors.New("invalid command") + } + + now := time.Now().UTC() + result := CommandResult{Command: "fastgit " + line, StartedAt: now.Format(time.RFC3339)} + + bin, binArgs, err := s.resolveFastgitInvocation(args) + if err != nil { + return result, err + } + + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) + defer cancel() + + cmd := exec.CommandContext(ctx, bin, binArgs...) + cmd.Dir = s.repoRoot + output, runErr := cmd.CombinedOutput() + + result.Output = strings.TrimSpace(string(output)) + result.EndedAt = time.Now().UTC().Format(time.RFC3339) + + if runErr == nil { + result.ExitCode = 0 + return result, nil + } + + var exitErr *exec.ExitError + if errors.As(runErr, &exitErr) { + result.ExitCode = exitErr.ExitCode() + if result.Output == "" { + result.Output = runErr.Error() + } + return result, nil + } + + if errors.Is(ctx.Err(), context.DeadlineExceeded) { + result.ExitCode = 124 + if result.Output == "" { + result.Output = "command timed out after 2m" + } + return result, nil + } + + return result, runErr +} + +func (s *FastgitService) resolveFastgitInvocation(args []string) (string, []string, error) { + if path, err := exec.LookPath("fastgit"); err == nil { + return path, args, nil + } + + if path, err := exec.LookPath("go"); err == nil { + fallback := []string{"run", "."} + fallback = append(fallback, args...) + return path, fallback, nil + } + + return "", nil, errors.New("cannot find fastgit binary or go toolchain in PATH") +} From 8c3b1625d9633f029681441f75d3c9f980d4c0b2 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 29 Jun 2026 11:18:46 +0800 Subject: [PATCH 02/16] Add desktop task helpers --- Taskfile.yml | 55 ++ desktop/README.md | 10 + .../frontend/dist/assets/index-9uDSrkgH.js | 44 - .../frontend/dist/assets/index-CFCFzOqg.css | 1 + .../frontend/dist/assets/index-CzA6nRjJ.css | 1 - .../frontend/dist/assets/index-jX5N17in.js | 44 + desktop/frontend/dist/index.html | 4 +- desktop/frontend/package-lock.json | 813 ++++++++++++------ desktop/frontend/package.json | 7 +- 9 files changed, 645 insertions(+), 334 deletions(-) delete mode 100644 desktop/frontend/dist/assets/index-9uDSrkgH.js create mode 100644 desktop/frontend/dist/assets/index-CFCFzOqg.css delete mode 100644 desktop/frontend/dist/assets/index-CzA6nRjJ.css create mode 100644 desktop/frontend/dist/assets/index-jX5N17in.js diff --git a/Taskfile.yml b/Taskfile.yml index 337caf8..8e832b7 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -5,6 +5,8 @@ version: '3' dotenv: [ '.env' ] vars: Project: "fastgit" + DesktopDir: "./desktop" + FrontendDir: "./desktop/frontend" Base: "github.com/pubgo/funk/buildinfo" VERSION: sh: "git tag --sort=committerdate | tail -n 1" @@ -70,3 +72,56 @@ tasks: lint: cmds: - golangci-lint run --verbose ./... + + desktop:bindings: + desc: "generate Wails bindings for desktop frontend" + dir: "{{.DesktopDir}}" + cmds: + - go run github.com/wailsapp/wails/v3/cmd/wails3@latest generate bindings -clean=true -ts -i + + desktop:node:check: + desc: "check Node.js version for Vite 8 (>=20.19 or >=22.12)" + run: once + cmds: + - | + node -e ' + const [maj, min] = process.versions.node.split(".").map(Number); + const ok = (maj === 20 && min >= 19) || (maj === 22 && min >= 12) || maj > 22; + if (!ok) { + console.error("Node.js " + process.versions.node + " is not supported."); + console.error("Please use Node >=20.19.0 or >=22.12.0 for Vite 8."); + process.exit(1); + } + console.log("Node.js " + process.versions.node + " OK"); + ' + + desktop:frontend:install: + desc: "install desktop frontend dependencies" + dir: "{{.FrontendDir}}" + deps: + - desktop:node:check + cmds: + - npm install + + desktop:frontend:build: + desc: "build desktop frontend assets" + dir: "{{.FrontendDir}}" + cmds: + - task: desktop:frontend:install + - task: desktop:bindings + - npm run build + + desktop:run: + desc: "run desktop app from embedded frontend dist" + dir: "{{.DesktopDir}}" + cmds: + - task: desktop:frontend:build + - go run . + + desktop:dev: + desc: "run desktop app in local dev mode (no wails3 hot reload)" + dir: "{{.DesktopDir}}" + cmds: + - task: desktop:node:check + - task: desktop:frontend:build + - go run . diff --git a/desktop/README.md b/desktop/README.md index 7038d7c..1bf5e2f 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -1,5 +1,15 @@ # fastgit desktop (Wails v3) +## Quick Tasks (from repo root) + +```bash +task desktop:frontend:build +task desktop:run +task desktop:dev +``` + +`task desktop:dev` 当前是本地开发运行(会先构建前端,然后 `go run .`),不依赖 `build/config.yml`。 + ## Run in dev mode ```bash diff --git a/desktop/frontend/dist/assets/index-9uDSrkgH.js b/desktop/frontend/dist/assets/index-9uDSrkgH.js deleted file mode 100644 index 02e8a84..0000000 --- a/desktop/frontend/dist/assets/index-9uDSrkgH.js +++ /dev/null @@ -1,44 +0,0 @@ -(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))o(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&o(s)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function o(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();const w=typeof window<"u"&&typeof document<"u",Fe="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function W(t=21){let e="",n=t|0;for(;n--;)e+=Fe[Math.random()*64|0];return e}var Y;function Le(){return window.location.origin+"/wails/runtime"}const x=512*1024,O=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10,IOS:11,Android:12});let ce=W(),te=null;function F(t,e=""){return function(n,o=null){return Re(t,n,e,o)}}async function Re(t,e,n,o){var r,i;if(te)return te.call(t,e,n,o);let s=new URL(Le()),l={object:t,method:e};o!=null&&(l.args=o);let a={"x-wails-client-id":ce,"Content-Type":"application/json"};n&&(a["x-wails-window-name"]=n);const f=JSON.stringify(l);let h;if(f.length>x?h=await ze(s,a,f):h=await fetch(s,{method:"POST",headers:a,body:f}),!h.ok)throw new Error(await h.text());return((i=(r=h.headers.get("Content-Type"))===null||r===void 0?void 0:r.indexOf("application/json"))!==null&&i!==void 0?i:-1)!==-1?h.json():h.text()}async function ze(t,e,n){const o=W(),r=new TextEncoder().encode(n),i=Math.ceil(r.length/x);for(let s=0;s{var r;const i=t.get(e);if(i){if(t.delete(e),o){i.reject(new Error(o));return}try{const s=JSON.parse(n??"{}");if(!s.ok){i.reject(new Error((r=s.error)!==null&&r!==void 0?r:"unknown runtime call error"));return}i.resolve("text"in s?s.text:s.data)}catch(s){i.reject(s)}}},te={call(e,n,o,r){return new Promise((i,s)=>{const l=W();t.set(l,{resolve:i,reject:s});try{we.invokeAsync(l,JSON.stringify({object:e,method:n,windowName:o,args:r??null,clientId:ce}))}catch(a){t.delete(l),s(a)}})}}}F(O.System);const $=(function(){var t,e,n,o,r,i;try{if(!((e=(t=window.chrome)===null||t===void 0?void 0:t.webview)===null||e===void 0)&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if(!((r=(o=(n=window.webkit)===null||n===void 0?void 0:n.messageHandlers)===null||o===void 0?void 0:o.external)===null||r===void 0)&&r.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external);if(!((i=window.wails)===null||i===void 0)&&i.invoke)return s=>window.wails.invoke(typeof s=="string"?s:JSON.stringify(s))}catch{}return console.warn(` -%c⚠️ Browser Environment Detected %c - -%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. -More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development -`,"background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;","background: transparent;","color: #ffffff; font-style: italic; font-weight: bold;"),null})();function I(t){$?.(t)}function Ee(){var t,e;return((e=(t=window._wails)===null||t===void 0?void 0:t.environment)===null||e===void 0?void 0:e.OS)==="windows"}function Pe(){var t,e;return((e=(t=window._wails)===null||t===void 0?void 0:t.environment)===null||e===void 0?void 0:e.OS)==="linux"}function ke(){var t,e;return!!(!((e=(t=window._wails)===null||t===void 0?void 0:t.environment)===null||e===void 0)&&e.Debug)}function Ae(){return new MouseEvent("mousedown").buttons===0}function Te(t){var e;return t.target instanceof HTMLElement?t.target:!(t.target instanceof HTMLElement)&&t.target instanceof Node&&(e=t.target.parentElement)!==null&&e!==void 0?e:document.body}w&&document.addEventListener("DOMContentLoaded",()=>{});w&&window.addEventListener("contextmenu",Ue);const Ie=F(O.ContextMenu),He=0;function Be(t,e,n,o){Ie(He,{id:t,x:e,y:n,data:o})}function Ue(t){const e=Te(t),n=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(n){t.preventDefault();const o=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Be(n,t.clientX,t.clientY,o)}else We(t,e)}function We(t,e){if(ke())return;switch(window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":t.preventDefault();return}if(e.isContentEditable)return;const n=window.getSelection(),o=n&&n.toString().length>0;if(o)for(let r=0;r{ne=t,ne||(E=T=!1,p())});let oe=!1;function Ne(){var t,e;const n=(e=(t=window._wails)===null||t===void 0?void 0:t.environment)===null||e===void 0?void 0:e.OS;if(n==="ios"||n==="android")return!0;const o=navigator.userAgent||navigator.vendor||window.opera||"";return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(o)}function G(){if(!oe&&!Ne()){window.addEventListener("mousedown",K,{capture:!0}),window.addEventListener("mousemove",K,{capture:!0}),window.addEventListener("mouseup",K,{capture:!0});for(const t of["click","contextmenu","dblclick"])window.addEventListener(t,qe,{capture:!0});oe=!0}}if(w){G(),document.addEventListener("DOMContentLoaded",G,{once:!0});let t=0;const e=window.setInterval(()=>{if(oe){window.clearInterval(e);return}G(),++t>100&&window.clearInterval(e)},50)}function qe(t){(_||T)&&(t.stopImmediatePropagation(),t.stopPropagation(),t.preventDefault())}const J=0,Ze=1,V=2;function K(t){let e,n=t.buttons;switch(t.type){case"mousedown":e=J,P||(n=y|1<"u"||typeof e=="object"))try{var n=A.call(e);return(n===et||n===tt||n===nt||n===Ve)&&e("")==null}catch{}return!1})}function st(t){if(de(t))return!0;if(!t||typeof t!="function"&&typeof t!="object")return!1;try{M(t,null,re)}catch(e){if(e!==k)return!1}return!ae(t)&&ie(t)}function lt(t){if(de(t))return!0;if(!t||typeof t!="function"&&typeof t!="object")return!1;if(ot)return ie(t);if(ae(t))return!1;var e=A.call(t);return e!==Ke&&e!==Qe&&!/^\[object HTML/.test(e)?!1:ie(t)}const b=M?st:lt;var Q;class se extends Error{constructor(e,n){super(e,n),this.name="CancelError"}}class D extends Error{constructor(e,n,o){super((o??"Unhandled rejection in cancelled promise.")+" Reason: "+ct(n),{cause:n}),this.promise=e,this.name="CancelledRejectionError"}}const v=Symbol("barrier"),ve=Symbol("cancelImpl"),ge=(Q=Symbol.species)!==null&&Q!==void 0?Q:Symbol("speciesPolyfill");class u extends Promise{constructor(e,n){let o,r;if(super((a,f)=>{o=a,r=f}),this.constructor[ge]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let i={promise:this,resolve:o,reject:r,get oncancelled(){return n??null},set oncancelled(a){n=a??void 0}};const s={get root(){return s},resolving:!1,settled:!1};Object.defineProperties(this,{[v]:{configurable:!1,enumerable:!1,writable:!0,value:null},[ve]:{configurable:!1,enumerable:!1,writable:!1,value:je(i,s)}});const l=_e(i,s);try{e(Ce(i,s),l)}catch(a){s.resolving?console.log("Unhandled exception in CancellablePromise executor.",a):l(a)}}cancel(e){return new u(n=>{Promise.all([this[ve](new se("Promise cancelled.",{cause:e})),at(this)]).then(()=>n(),()=>n())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>{this.cancel(e.reason)},{capture:!0}),this}then(e,n,o){if(!(this instanceof u))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(b(e)||(e=be),b(n)||(n=ye),e===be&&n==ye)return new u(i=>i(this));const r={};return this[v]=r,new u((i,s)=>{super.then(l=>{var a;this[v]===r&&(this[v]=null),(a=r.resolve)===null||a===void 0||a.call(r);try{i(e(l))}catch(f){s(f)}},l=>{var a;this[v]===r&&(this[v]=null),(a=r.resolve)===null||a===void 0||a.call(r);try{i(n(l))}catch(f){s(f)}})},async i=>{try{return o?.(i)}finally{await this.cancel(i)}})}catch(e,n){return this.then(void 0,e,n)}finally(e,n){if(!(this instanceof u))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return b(e)?this.then(o=>u.resolve(e()).then(()=>o),o=>u.resolve(e()).then(()=>{throw o}),n):this.then(e,e,n)}static get[ge](){return Promise}static all(e){let n=Array.from(e);const o=n.length===0?u.resolve(n):new u((r,i)=>{Promise.all(n).then(r,i)},r=>z(o,n,r));return o}static allSettled(e){let n=Array.from(e);const o=n.length===0?u.resolve(n):new u((r,i)=>{Promise.allSettled(n).then(r,i)},r=>z(o,n,r));return o}static any(e){let n=Array.from(e);const o=n.length===0?u.resolve(n):new u((r,i)=>{Promise.any(n).then(r,i)},r=>z(o,n,r));return o}static race(e){let n=Array.from(e);const o=new u((r,i)=>{Promise.race(n).then(r,i)},r=>z(o,n,r));return o}static cancel(e){const n=new u(()=>{});return n.cancel(e),n}static timeout(e,n){const o=new u(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>{o.cancel(n)}):setTimeout(()=>{o.cancel(n)},e),o}static sleep(e,n){return new u(o=>{setTimeout(()=>o(n),e)})}static reject(e){return new u((n,o)=>o(e))}static resolve(e){return e instanceof u?e:new u(n=>n(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new u((n,o)=>{e.resolve=n,e.reject=o},n=>{var o;(o=e.oncancelled)===null||o===void 0||o.call(e,n)}),e}}function je(t,e){let n;return o=>{if(e.settled||(e.settled=!0,e.reason=o,t.reject(o),Promise.prototype.then.call(t.promise,void 0,r=>{if(r!==o)throw r})),!(!e.reason||!t.oncancelled))return n=new Promise(r=>{try{r(t.oncancelled(e.reason.cause))}catch(i){Promise.reject(new D(t.promise,i,"Unhandled exception in oncancelled callback."))}}).catch(r=>{Promise.reject(new D(t.promise,r,"Unhandled rejection in oncancelled callback."))}),t.oncancelled=null,n}}function Ce(t,e){return n=>{if(!e.resolving){if(e.resolving=!0,n===t.promise){if(e.settled)return;e.settled=!0,t.reject(new TypeError("A promise cannot be resolved with itself."));return}if(n!=null&&(typeof n=="object"||typeof n=="function")){let o;try{o=n.then}catch(r){e.settled=!0,t.reject(r);return}if(b(o)){try{let s=n.cancel;if(b(s)){const l=a=>{Reflect.apply(s,n,[a])};e.reason?je(Object.assign(Object.assign({},t),{oncancelled:l}),e)(e.reason):t.oncancelled=l}}catch{}const r={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(s){this.root.settled=s},get reason(){return this.root.reason}},i=_e(t,r);try{Reflect.apply(o,n,[Ce(t,r),i])}catch(s){i(s)}return}}e.settled||(e.settled=!0,t.resolve(n))}}}function _e(t,e){return n=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(n instanceof se&&e.reason instanceof se&&Object.is(n.cause,e.reason.cause))return}catch{}Promise.reject(new D(t.promise,n))}else e.settled=!0,t.reject(n)}}function z(t,e,n){const o=[];for(const r of e){let i;try{if(!b(r.then)||(i=r.cancel,!b(i)))continue}catch{continue}let s;try{s=Reflect.apply(i,r,[n])}catch(l){Promise.reject(new D(t,l,"Unhandled exception in cancel method."));continue}s&&o.push((s instanceof Promise?s:Promise.resolve(s)).catch(l=>{Promise.reject(new D(t,l,"Unhandled rejection in cancel method."))}))}return Promise.all(o)}function be(t){return t}function ye(t){throw t}function ct(t){try{if(t instanceof Error||typeof t!="object"||t.toString!==Object.prototype.toString)return""+t}catch{}try{return JSON.stringify(t)}catch{}try{return Object.prototype.toString.call(t)}catch{}return""}function at(t){var e;let n=(e=t[v])!==null&&e!==void 0?e:{};return"promise"in n||Object.assign(n,S()),t[v]==null&&(n.resolve(),t[v]=n),n.promise}let S=Promise.withResolvers;S&&typeof S=="function"?S=S.bind(Promise):S=function(){let t,e;return{promise:new Promise((o,r)=>{t=o,e=r}),resolve:t,reject:e}};w&&(window._wails=window._wails||{});const dt=F(O.Call),ut=F(O.CancelCall),j=new Map,ft=0,ht=0;function pt(){let t;do t=W();while(j.has(t));return t}function wt(t){const e=pt(),n=u.withResolvers();j.set(e,{resolve:n.resolve,reject:n.reject});const o=dt(ft,Object.assign({"call-id":e},t));let r=!0;o.then(s=>{r=!1,j.delete(e),n.resolve(s)},s=>{r=!1,j.delete(e),n.reject(s)});const i=()=>(j.delete(e),ut(ht,{"call-id":e}).catch(s=>{console.error("Error while requesting binding call cancellation:",s)}));return n.oncancelled=()=>r?i():o.then(i),n.promise}function ue(t,...e){return wt({methodID:t,args:e})}const mt="data-file-drop-target",m="file-drop-target-active";let d=null;const vt=0,gt=1,bt=2,yt=3,St=4,Mt=5,Et=6,Tt=7,xt=8,jt=9,Ct=10,_t=11,Dt=12,Ot=13,Ft=14,Lt=15,Rt=16,zt=17,Pt=18,kt=19,At=20,It=21,Ht=22,Bt=23,Ut=24,Wt=25,Nt=26,qt=27,Zt=28,Xt=29,Yt=30,$t=31,Gt=32,Jt=33,Vt=34,Kt=35,Qt=36,en=37,tn=38,nn=39,on=40,rn=41,sn=42,ln=43,cn=44,an=45,dn=46,un=47,fn=48,hn=49,pn=50,wn=51,mn=52;function H(t){return t?t.closest(`[${mt}]`):null}function vn(){var t,e,n,o;return((e=(t=window.chrome)===null||t===void 0?void 0:t.webview)===null||e===void 0?void 0:e.postMessageWithAdditionalObjects)==null?!1:((o=(n=window._wails)===null||n===void 0?void 0:n.flags)===null||o===void 0?void 0:o.enableFileDrop)===!0}function gn(t,e,n){var o,r;!((r=(o=window.chrome)===null||o===void 0?void 0:o.webview)===null||r===void 0)&&r.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${t}:${e}`,n)}let fe=!1;function De(){fe=!1,d&&(d.classList.remove(m),d=null)}function bn(){var t,e;((e=(t=window._wails)===null||t===void 0?void 0:t.flags)===null||e===void 0?void 0:e.enableFileDrop)!==!1&&(fe=!0)}function yn(){De()}function Sn(t,e){var n,o;if(!fe||((o=(n=window._wails)===null||n===void 0?void 0:n.flags)===null||o===void 0?void 0:o.enableFileDrop)===!1)return;const r=document.elementFromPoint(t,e),i=H(r);d&&d!==i&&d.classList.remove(m),i?(i.classList.add(m),d=i):d=null}const c=Symbol("caller");class B{constructor(e=""){this[c]=F(O.Window,e);for(const n of Object.getOwnPropertyNames(B.prototype))n!=="constructor"&&typeof this[n]=="function"&&(this[n]=this[n].bind(this))}Get(e){return new B(e)}Position(){return this[c](vt)}Center(){return this[c](gt)}Close(){return this[c](bt)}DisableSizeConstraints(){return this[c](yt)}EnableSizeConstraints(){return this[c](St)}Focus(){return this[c](Mt)}ForceReload(){return this[c](Et)}Fullscreen(){return this[c](Tt)}GetScreen(){return this[c](xt)}GetZoom(){return this[c](jt)}Height(){return this[c](Ct)}Hide(){return this[c](_t)}IsFocused(){return this[c](Dt)}IsFullscreen(){return this[c](Ot)}IsMaximised(){return this[c](Ft)}IsMinimised(){return this[c](Lt)}Maximise(){return this[c](Rt)}Minimise(){return this[c](zt)}Name(){return this[c](Pt)}OpenDevTools(){return this[c](kt)}RelativePosition(){return this[c](At)}Reload(){return this[c](It)}Resizable(){return this[c](Ht)}Restore(){return this[c](Bt)}SetPosition(e,n){return this[c](Ut,{x:e,y:n})}SetAlwaysOnTop(e){return this[c](Wt,{alwaysOnTop:e})}SetBackgroundColour(e,n,o,r){return this[c](Nt,{r:e,g:n,b:o,a:r})}SetFrameless(e){return this[c](qt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[c](Zt,{enabled:e})}SetMaxSize(e,n){return this[c](Xt,{width:e,height:n})}SetMinSize(e,n){return this[c](Yt,{width:e,height:n})}SetRelativePosition(e,n){return this[c]($t,{x:e,y:n})}SetResizable(e){return this[c](Gt,{resizable:e})}SetSize(e,n){return this[c](Jt,{width:e,height:n})}SetTitle(e){return this[c](Vt,{title:e})}SetZoom(e){return this[c](Kt,{zoom:e})}Show(){return this[c](Qt)}Size(){return this[c](en)}ToggleFullscreen(){return this[c](tn)}ToggleMaximise(){return this[c](nn)}ToggleFrameless(){return this[c](on)}UnFullscreen(){return this[c](rn)}UnMaximise(){return this[c](sn)}UnMinimise(){return this[c](ln)}Width(){return this[c](cn)}Zoom(){return this[c](an)}ZoomIn(){return this[c](dn)}ZoomOut(){return this[c](un)}ZoomReset(){return this[c](fn)}HandlePlatformFileDrop(e,n,o){var r,i;if(((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)===!1)return;const s=document.elementFromPoint(n,o),l=H(s);if(!l)return;const a={id:l.id,classList:Array.from(l.classList),attributes:{}};for(let h=0;h{var o,r,i;if(!(!((o=n.dataTransfer)===null||o===void 0)&&o.types.includes("Files")))return;if(n.preventDefault(),((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)===!1){n.dataTransfer.dropEffect="none";return}e++;const s=document.elementFromPoint(n.clientX,n.clientY),l=H(s);d&&d!==l&&d.classList.remove(m),l?(l.classList.add(m),n.dataTransfer.dropEffect="copy",d=l):(n.dataTransfer.dropEffect="none",d=null)},!1),t.addEventListener("dragover",n=>{var o,r,i;if(!(!((o=n.dataTransfer)===null||o===void 0)&&o.types.includes("Files")))return;if(n.preventDefault(),((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)===!1){n.dataTransfer.dropEffect="none";return}const s=document.elementFromPoint(n.clientX,n.clientY),l=H(s);d&&d!==l&&d.classList.remove(m),l?(l.classList.contains(m)||l.classList.add(m),n.dataTransfer.dropEffect="copy",d=l):(n.dataTransfer.dropEffect="none",d=null)},!1),t.addEventListener("dragleave",n=>{var o,r,i;!((o=n.dataTransfer)===null||o===void 0)&&o.types.includes("Files")&&(n.preventDefault(),((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)!==!1&&n.relatedTarget!==null&&(e--,(e===0||d&&!d.contains(n.relatedTarget))&&(d&&(d.classList.remove(m),d=null),e=0)))},!1),t.addEventListener("drop",n=>{var o,r,i;if(!((o=n.dataTransfer)===null||o===void 0)&&o.types.includes("Files")&&(n.preventDefault(),((i=(r=window._wails)===null||r===void 0?void 0:r.flags)===null||i===void 0?void 0:i.enableFileDrop)!==!1&&(e=0,d&&(d.classList.remove(m),d=null),vn()))){const s=[];if(n.dataTransfer.items){for(const l of n.dataTransfer.items)if(l.kind==="file"){const a=l.getAsFile();a&&s.push(a)}}else if(n.dataTransfer.files)for(const l of n.dataTransfer.files)s.push(l);s.length>0&&gn(n.clientX,n.clientY,s)}},!1)}typeof window<"u"&&typeof document<"u"&&Mn();w&&(window._wails=window._wails||{});w&&(window._wails.invoke=I,window._wails.clientId=ce);w&&(window._wails.handlePlatformFileDrop=Se.HandlePlatformFileDrop.bind(Se));w&&(window._wails.handleDragEnter=bn,window._wails.handleDragLeave=yn,window._wails.handleDragOver=Sn);w&&I("wails:runtime:ready");function En(t){return fetch(t,{method:"HEAD"}).then(e=>{if(e.ok&&(e.headers.get("content-type")||"").toLowerCase().includes("javascript")){const o=document.createElement("script");o.src=t,document.head.appendChild(o)}}).catch(()=>{})}w&&En("/wails/custom.js");function Tn(){return ue(853311305)}function xn(t){return ue(848143838,t)}function jn(t){return ue(2463093517,t)}const Cn=document.querySelector("#app");Cn.innerHTML=` -
-
-

fastgit desktop

-

在桌面里执行 fastgit 命令并查看输出

-
- -
- -
- - -
- -
- -
- -
- - -
-
- - - - -
-
- -
-
- Output - -
-
等待执行命令...
-
-
-`;const Oe=document.querySelector("#repo"),U=document.querySelector("#repo-hint"),he=document.querySelector("#cmd"),le=document.querySelector("#run"),_n=document.querySelector("#save-repo"),ee=document.querySelector("#output"),Me=document.querySelector("#meta");async function Dn(){try{const t=await Tn();Oe.value=t,U.textContent=`当前仓库: ${t}`}catch(t){U.textContent=`读取仓库失败: ${String(t)}`}}async function pe(){const t=he.value.trim();if(t){le.disabled=!0,ee.textContent="running...",Me.textContent="";try{const e=await xn(t);ee.textContent=e.output||"(no output)",Me.textContent=`${e.command} | exit=${e.exitCode}`}catch(e){ee.textContent=`执行失败: ${String(e)}`}finally{le.disabled=!1}}}_n.addEventListener("click",async()=>{const t=Oe.value.trim();if(t)try{await jn(t),U.textContent=`当前仓库: ${t}`}catch(e){U.textContent=`切换失败: ${String(e)}`}});le.addEventListener("click",()=>{pe()});he.addEventListener("keydown",t=>{t.key==="Enter"&&(t.preventDefault(),pe())});document.querySelectorAll(".chip").forEach(t=>{t.addEventListener("click",()=>{he.value=t.dataset.cmd||"",pe()})});Dn(); diff --git a/desktop/frontend/dist/assets/index-CFCFzOqg.css b/desktop/frontend/dist/assets/index-CFCFzOqg.css new file mode 100644 index 0000000..d766842 --- /dev/null +++ b/desktop/frontend/dist/assets/index-CFCFzOqg.css @@ -0,0 +1 @@ +:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f2f5f9;--panel:#fff;--text:#1f2b3a;--muted:#607085;--line:#d4dde8;--primary:#1363df;--primary-strong:#0f4ca8}*{box-sizing:border-box}body{background:radial-gradient(circle at 0 0, #dfe8ff 0%, var(--bg) 42%);color:var(--text);margin:0;font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.layout{gap:16px;max-width:980px;margin:0 auto;padding:24px;display:grid}.header h1{margin:0;font-size:28px}.header p{color:var(--muted);margin:6px 0 0}.panel{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px}.row{gap:8px;display:flex}.input{border:1px solid var(--line);border-radius:8px;flex:1;min-width:0;padding:10px 12px}.btn{border:1px solid var(--line);cursor:pointer;background:#fff;border-radius:8px;padding:10px 14px}.btn.primary{background:var(--primary);color:#fff;border-color:#0000}.btn.primary:hover{background:var(--primary-strong)}.quick-actions{flex-wrap:wrap;gap:8px;margin-top:10px;display:flex}.chip{border:1px solid var(--line);cursor:pointer;background:#fff;border-radius:999px;padding:6px 12px}.output-panel{min-height:320px}.output-head{color:var(--muted);justify-content:space-between;margin-bottom:8px;display:flex}.output{color:#d7e0ef;background:#0b1220;border-radius:8px;min-height:250px;margin:0;padding:12px;overflow:auto}small{color:var(--muted);margin-top:6px;display:inline-block}@media (width<=720px){.row{flex-direction:column}} diff --git a/desktop/frontend/dist/assets/index-CzA6nRjJ.css b/desktop/frontend/dist/assets/index-CzA6nRjJ.css deleted file mode 100644 index 7fe4821..0000000 --- a/desktop/frontend/dist/assets/index-CzA6nRjJ.css +++ /dev/null @@ -1 +0,0 @@ -:root{color-scheme:light;--bg: #f2f5f9;--panel: #ffffff;--text: #1f2b3a;--muted: #607085;--line: #d4dde8;--primary: #1363df;--primary-strong: #0f4ca8}*{box-sizing:border-box}body{margin:0;font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:radial-gradient(circle at 0 0,#dfe8ff 0%,var(--bg) 42%);color:var(--text)}.layout{max-width:980px;margin:0 auto;padding:24px;display:grid;gap:16px}.header h1{margin:0;font-size:28px}.header p{margin:6px 0 0;color:var(--muted)}.panel{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px}.row{display:flex;gap:8px}.input{flex:1;min-width:0;border:1px solid var(--line);border-radius:8px;padding:10px 12px}.btn{border:1px solid var(--line);background:#fff;border-radius:8px;padding:10px 14px;cursor:pointer}.btn.primary{border-color:transparent;background:var(--primary);color:#fff}.btn.primary:hover{background:var(--primary-strong)}.quick-actions{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap}.chip{border:1px solid var(--line);border-radius:999px;background:#fff;padding:6px 12px;cursor:pointer}.output-panel{min-height:320px}.output-head{display:flex;justify-content:space-between;color:var(--muted);margin-bottom:8px}.output{margin:0;border-radius:8px;background:#0b1220;color:#d7e0ef;min-height:250px;padding:12px;overflow:auto}small{display:inline-block;margin-top:6px;color:var(--muted)}@media(max-width:720px){.row{flex-direction:column}} diff --git a/desktop/frontend/dist/assets/index-jX5N17in.js b/desktop/frontend/dist/assets/index-jX5N17in.js new file mode 100644 index 0000000..97b1ac4 --- /dev/null +++ b/desktop/frontend/dist/assets/index-jX5N17in.js @@ -0,0 +1,44 @@ +(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=typeof window<`u`&&typeof document<`u`,t=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function n(e=21){let n=``,r=e|0;for(;r--;)n+=t[Math.random()*64|0];return n}function r(){return window.location.origin+`/wails/runtime`}var i=512*1024,a=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10,IOS:11,Android:12}),o=n(),s=null;function c(e,t=``){return function(n,r=null){return l(e,n,t,r)}}async function l(e,t,n,a){if(s)return s.call(e,t,n,a);let c=new URL(r()),l={object:e,method:t};a!=null&&(l.args=a);let u={"x-wails-client-id":o,"Content-Type":`application/json`};n&&(u[`x-wails-window-name`]=n);let d=JSON.stringify(l),f;if(f=d.length>i?await ee(c,u,d):await fetch(c,{method:`POST`,headers:u,body:d}),!f.ok)throw Error(await f.text());return(f.headers.get(`Content-Type`)?.indexOf(`application/json`)??-1)===-1?f.text():f.json()}async function ee(e,t,r){let a=n(),o=new TextEncoder().encode(r),s=Math.ceil(o.length/i);for(let n=0;n{let i=e.get(t);if(i){if(e.delete(t),r){i.reject(Error(r));return}try{let e=JSON.parse(n??`{}`);if(!e.ok){i.reject(Error(e.error??`unknown runtime call error`));return}i.resolve(`text`in e?e.text:e.data)}catch(e){i.reject(e)}}},s={call(t,r,i,a){return new Promise((s,c)=>{let l=n();e.set(l,{resolve:s,reject:c});try{u.invokeAsync(l,JSON.stringify({object:t,method:r,windowName:i,args:a??null,clientId:o}))}catch(t){e.delete(l),c(t)}})}}}a.System;var d=(function(){try{if(window.chrome?.webview?.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if(window.webkit?.messageHandlers?.external?.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external);if(window.wails?.invoke)return e=>window.wails.invoke(typeof e==`string`?e:JSON.stringify(e))}catch{}return console.warn(` +%c⚠️ Browser Environment Detected %c + +%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. +More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development +`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function f(e){d?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function p(){return!!window._wails?.environment?.Debug}function m(){return new MouseEvent(`mousedown`).buttons===0}function h(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}e&&document.addEventListener(`DOMContentLoaded`,()=>{}),e&&window.addEventListener(`contextmenu`,oe);var re=c(a.ContextMenu),ie=0;function ae(e,t,n,r){re(ie,{id:e,x:t,y:n,data:r})}function oe(e){let t=h(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);ae(n,e.clientX,e.clientY,r)}else se(e,t)}function se(e,t){if(p())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{y=e,y||(b=x=!1,A())});var T=!1;function le(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function E(){if(!T&&!le()){window.addEventListener(`mousedown`,k,{capture:!0}),window.addEventListener(`mousemove`,k,{capture:!0}),window.addEventListener(`mouseup`,k,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,ue,{capture:!0});T=!0}}if(e){E(),document.addEventListener(`DOMContentLoaded`,E,{once:!0});let e=0,t=window.setInterval(()=>{if(T){window.clearInterval(t);return}E(),++e>100&&window.clearInterval(t)},50)}function ue(e){(v||x)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var D=0,de=1,O=2;function k(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=D,w||(n=C|1<{n=e,r=t}),this.constructor[Ae]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[V]:{configurable:!1,enumerable:!1,writable:!0,value:null},[ke]:{configurable:!1,enumerable:!1,writable:!1,value:Me(i,a)}});let o=Pe(i,a);try{e(Ne(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[ke](new z(`Promise cancelled.`,{cause:t})),Re(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(R(t)||(t=Fe),R(n)||(n=Ie),t===Fe&&n==Ie)return new e(e=>e(this));let i={};return this[V]=i,new e((e,r)=>{super.then(n=>{var a;this[V]===i&&(this[V]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[V]===i&&(this[V]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return R(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[Ae](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>H(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>H(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>H(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>H(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function Me(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new B(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new B(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function Ne(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(R(r)){try{let r=n.cancel;if(R(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?Me(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=Pe(e,i);try{Reflect.apply(r,n,[Ne(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function Pe(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof z&&t.reason instanceof z&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new B(e.promise,n))}else t.settled=!0,e.reject(n)}}function H(e,t,n){let r=[];for(let i of t){let t;try{if(!R(i.then)||(t=i.cancel,!R(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new B(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new B(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function Fe(e){return e}function Ie(e){throw e}function Le(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function Re(e){let t=e[V]??{};return`promise`in t||Object.assign(t,U()),e[V]??(t.resolve(),e[V]=t),t.promise}var U=Promise.withResolvers;U=U&&typeof U==`function`?U.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},e&&(window._wails=window._wails||{});var ze=c(a.Call),Be=c(a.CancelCall),W=new Map,Ve=0,He=0;function Ue(){let e;do e=n();while(W.has(e));return e}function We(e){let t=Ue(),n=je.withResolvers();W.set(t,{resolve:n.resolve,reject:n.reject});let r=ze(Ve,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,W.delete(t),n.resolve(e)},e=>{i=!1,W.delete(t),n.reject(e)});let a=()=>(W.delete(t),Be(He,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function G(e,...t){return We({methodID:e,args:t})}var Ge=`data-file-drop-target`,K=`file-drop-target-active`,q=null,Ke=0,qe=1,Je=2,Ye=3,Xe=4,Ze=5,Qe=6,$e=7,et=8,tt=9,nt=10,rt=11,it=12,at=13,ot=14,st=15,ct=16,lt=17,ut=18,dt=19,ft=20,pt=21,mt=22,ht=23,gt=24,_t=25,vt=26,yt=27,bt=28,xt=29,St=30,Ct=31,wt=32,Tt=33,Et=34,Dt=35,Ot=36,kt=37,At=38,jt=39,Mt=40,Nt=41,Pt=42,Ft=43,It=44,Lt=45,Rt=46,zt=47,Bt=48,Vt=49,Ht=50,Ut=51,Wt=52;function J(e){return e?e.closest(`[${Ge}]`):null}function Gt(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function Kt(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var Y=!1;function qt(){Y=!1,q&&=(q.classList.remove(K),null)}function Jt(){window._wails?.flags?.enableFileDrop!==!1&&(Y=!0)}function Yt(){qt()}function Xt(e,t){if(!Y||window._wails?.flags?.enableFileDrop===!1)return;let n=J(document.elementFromPoint(e,t));q&&q!==n&&q.classList.remove(K),n?(n.classList.add(K),q=n):q=null}var X=Symbol(`caller`),Zt=new class e{constructor(t=``){this[X]=c(a.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[X](Ke)}Center(){return this[X](qe)}Close(){return this[X](Je)}DisableSizeConstraints(){return this[X](Ye)}EnableSizeConstraints(){return this[X](Xe)}Focus(){return this[X](Ze)}ForceReload(){return this[X](Qe)}Fullscreen(){return this[X]($e)}GetScreen(){return this[X](et)}GetZoom(){return this[X](tt)}Height(){return this[X](nt)}Hide(){return this[X](rt)}IsFocused(){return this[X](it)}IsFullscreen(){return this[X](at)}IsMaximised(){return this[X](ot)}IsMinimised(){return this[X](st)}Maximise(){return this[X](ct)}Minimise(){return this[X](lt)}Name(){return this[X](ut)}OpenDevTools(){return this[X](dt)}RelativePosition(){return this[X](ft)}Reload(){return this[X](pt)}Resizable(){return this[X](mt)}Restore(){return this[X](ht)}SetPosition(e,t){return this[X](gt,{x:e,y:t})}SetAlwaysOnTop(e){return this[X](_t,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[X](vt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[X](yt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[X](bt,{enabled:e})}SetMaxSize(e,t){return this[X](xt,{width:e,height:t})}SetMinSize(e,t){return this[X](St,{width:e,height:t})}SetRelativePosition(e,t){return this[X](Ct,{x:e,y:t})}SetResizable(e){return this[X](wt,{resizable:e})}SetSize(e,t){return this[X](Tt,{width:e,height:t})}SetTitle(e){return this[X](Et,{title:e})}SetZoom(e){return this[X](Dt,{zoom:e})}Show(){return this[X](Ot)}Size(){return this[X](kt)}ToggleFullscreen(){return this[X](At)}ToggleMaximise(){return this[X](jt)}ToggleFrameless(){return this[X](Mt)}UnFullscreen(){return this[X](Nt)}UnMaximise(){return this[X](Pt)}UnMinimise(){return this[X](Ft)}Width(){return this[X](It)}Zoom(){return this[X](Lt)}ZoomIn(){return this[X](Rt)}ZoomOut(){return this[X](zt)}ZoomReset(){return this[X](Bt)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=J(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=J(document.elementFromPoint(e.clientX,e.clientY));q&&q!==n&&q.classList.remove(K),n?(n.classList.add(K),e.dataTransfer.dropEffect=`copy`,q=n):(e.dataTransfer.dropEffect=`none`,q=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=J(document.elementFromPoint(e.clientX,e.clientY));q&&q!==t&&q.classList.remove(K),t?(t.classList.contains(K)||t.classList.add(K),e.dataTransfer.dropEffect=`copy`,q=t):(e.dataTransfer.dropEffect=`none`,q=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||q&&!q.contains(e.relatedTarget))&&(q&&=(q.classList.remove(K),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,q&&=(q.classList.remove(K),null),Gt()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&Kt(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&Qt(),e&&(window._wails=window._wails||{}),e&&(window._wails.invoke=f,window._wails.clientId=o),e&&(window._wails.handlePlatformFileDrop=Zt.HandlePlatformFileDrop.bind(Zt)),e&&(window._wails.handleDragEnter=Jt,window._wails.handleDragLeave=Yt,window._wails.handleDragOver=Xt),e&&f(`wails:runtime:ready`);function $t(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}e&&$t(`/wails/custom.js`);function en(){return G(853311305)}function tn(e){return G(848143838,e)}function nn(e){return G(2463093517,e)}var rn=document.querySelector(`#app`);rn.innerHTML=` +
+
+

fastgit desktop

+

在桌面里执行 fastgit 命令并查看输出

+
+ +
+ +
+ + +
+ +
+ +
+ +
+ + +
+
+ + + + +
+
+ +
+
+ Output + +
+
等待执行命令...
+
+
+`;var an=document.querySelector(`#repo`),Z=document.querySelector(`#repo-hint`),Q=document.querySelector(`#cmd`),on=document.querySelector(`#run`),sn=document.querySelector(`#save-repo`),cn=document.querySelector(`#output`),ln=document.querySelector(`#meta`);async function un(){try{let e=await en();an.value=e,Z.textContent=`当前仓库: ${e}`}catch(e){Z.textContent=`读取仓库失败: ${String(e)}`}}async function $(){let e=Q.value.trim();if(e){on.disabled=!0,cn.textContent=`running...`,ln.textContent=``;try{let t=await tn(e);cn.textContent=t.output||`(no output)`,ln.textContent=`${t.command} | exit=${t.exitCode}`}catch(e){cn.textContent=`执行失败: ${String(e)}`}finally{on.disabled=!1}}}sn.addEventListener(`click`,async()=>{let e=an.value.trim();if(e)try{await nn(e),Z.textContent=`当前仓库: ${e}`}catch(e){Z.textContent=`切换失败: ${String(e)}`}}),on.addEventListener(`click`,()=>void $()),Q.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.preventDefault(),$())}),document.querySelectorAll(`.chip`).forEach(e=>{e.addEventListener(`click`,()=>{Q.value=e.dataset.cmd||``,$()})}),un(); \ No newline at end of file diff --git a/desktop/frontend/dist/index.html b/desktop/frontend/dist/index.html index 44aac58..b723c20 100644 --- a/desktop/frontend/dist/index.html +++ b/desktop/frontend/dist/index.html @@ -4,8 +4,8 @@ fastgit desktop - - + +
diff --git a/desktop/frontend/package-lock.json b/desktop/frontend/package-lock.json index 502610a..98c2c74 100644 --- a/desktop/frontend/package-lock.json +++ b/desktop/frontend/package-lock.json @@ -11,8 +11,42 @@ "@wailsio/runtime": "^3.0.0-alpha.18" }, "devDependencies": { - "typescript": "^5.8.3", - "vite": "^7.2.0" + "typescript": "^6.0.3", + "vite": "^8.1.0" + }, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@esbuild/aix-ppc64": { @@ -28,6 +62,7 @@ "os": [ "aix" ], + "peer": true, "engines": { "node": ">=18" } @@ -45,6 +80,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } @@ -62,6 +98,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } @@ -79,6 +116,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } @@ -96,6 +134,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } @@ -113,6 +152,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } @@ -130,6 +170,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -147,6 +188,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -164,6 +206,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -181,6 +224,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -198,6 +242,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -215,6 +260,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -232,6 +278,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -249,6 +296,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -266,6 +314,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -283,6 +332,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -300,6 +350,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -317,6 +368,7 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -334,6 +386,7 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -351,6 +404,7 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -368,6 +422,7 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -385,6 +440,7 @@ "os": [ "openharmony" ], + "peer": true, "engines": { "node": ">=18" } @@ -402,6 +458,7 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=18" } @@ -419,6 +476,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -436,6 +494,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -453,366 +512,295 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", - "cpu": [ - "arm" - ], + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, - "license": "MIT", "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "node_modules/@oxc-project/types": { + "version": "0.137.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", + "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", + "integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz", + "integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz", + "integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", - "cpu": [ - "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz", + "integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", - "cpu": [ - "arm" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz", + "integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", - "cpu": [ - "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz", + "integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", - "cpu": [ - "loong64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz", + "integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==", "cpu": [ - "loong64" + "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", - "cpu": [ - "ppc64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz", + "integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", - "cpu": [ - "riscv64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz", + "integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz", + "integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz", + "integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", - "cpu": [ - "x64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz", + "integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", - "cpu": [ - "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz", + "integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==", "cpu": [ - "ia32" + "wasm32" ], "dev": true, - "license": "MIT", "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz", + "integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz", + "integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, - "license": "MIT" + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } }, "node_modules/@wailsio/runtime": { "version": "3.0.0-alpha.94", @@ -820,6 +808,15 @@ "integrity": "sha512-jtOtyWLDLop9NfU373sA43NjyGntxDFUIHY6kzmArz5HGn66Ok3vl9N2nIyVs7cArvADxk/mBBZ9wXOX7R0NFA==", "license": "MIT" }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/esbuild": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", @@ -827,6 +824,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -886,7 +885,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -895,6 +893,255 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/nanoid": { "version": "3.3.15", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", @@ -963,49 +1210,37 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "node_modules/rolldown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", + "integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==", "dev": true, - "license": "MIT", "dependencies": { - "@types/estree": "1.0.9" + "@oxc-project/types": "=0.137.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", - "fsevents": "~2.3.2" + "@rolldown/binding-android-arm64": "1.1.3", + "@rolldown/binding-darwin-arm64": "1.1.3", + "@rolldown/binding-darwin-x64": "1.1.3", + "@rolldown/binding-freebsd-x64": "1.1.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", + "@rolldown/binding-linux-arm64-gnu": "1.1.3", + "@rolldown/binding-linux-arm64-musl": "1.1.3", + "@rolldown/binding-linux-ppc64-gnu": "1.1.3", + "@rolldown/binding-linux-s390x-gnu": "1.1.3", + "@rolldown/binding-linux-x64-gnu": "1.1.3", + "@rolldown/binding-linux-x64-musl": "1.1.3", + "@rolldown/binding-openharmony-arm64": "1.1.3", + "@rolldown/binding-wasm32-wasi": "1.1.3", + "@rolldown/binding-win32-arm64-msvc": "1.1.3", + "@rolldown/binding-win32-x64-msvc": "1.1.3" } }, "node_modules/source-map-js": { @@ -1035,12 +1270,18 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "optional": true + }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1050,18 +1291,16 @@ } }, "node_modules/vite": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", - "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz", + "integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.27.0 || ^0.28.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "~1.1.2", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" @@ -1077,9 +1316,10 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -1092,13 +1332,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { diff --git a/desktop/frontend/package.json b/desktop/frontend/package.json index ad710ce..0bd392e 100644 --- a/desktop/frontend/package.json +++ b/desktop/frontend/package.json @@ -3,6 +3,9 @@ "private": true, "version": "0.0.1", "type": "module", + "engines": { + "node": ">=20.19.0" + }, "scripts": { "dev": "vite", "build": "vite build", @@ -12,7 +15,7 @@ "@wailsio/runtime": "^3.0.0-alpha.18" }, "devDependencies": { - "typescript": "^5.8.3", - "vite": "^7.2.0" + "typescript": "^6.0.3", + "vite": "^8.1.0" } } From 3401868b9b0e5d80358455dfea4387a8682e25d6 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 29 Jun 2026 11:32:34 +0800 Subject: [PATCH 03/16] Add desktop module actions to Fastgit console --- .../bindings/fastgitdesktop/fastgitservice.ts | 8 + .../frontend/bindings/fastgitdesktop/index.ts | 6 +- .../bindings/fastgitdesktop/models.ts | 30 +++ desktop/frontend/src/main.ts | 225 +++++++++++++----- desktop/frontend/src/style.css | 179 ++++++++++---- desktop/service.go | 205 +++++++++++++++- 6 files changed, 525 insertions(+), 128 deletions(-) diff --git a/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts b/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts index 1f7eaa8..e9d26bb 100644 --- a/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts +++ b/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts @@ -9,10 +9,18 @@ import { Call as $Call, CancellablePromise as $CancellablePromise } from "@wails // @ts-ignore: Unused imports import * as $models from "./models.js"; +export function GetModules(): $CancellablePromise<$models.DesktopModule[] | null> { + return $Call.ByID(1211788486); +} + export function GetRepoRoot(): $CancellablePromise { return $Call.ByID(853311305); } +export function RunAction(req: $models.ActionRunRequest): $CancellablePromise<$models.CommandResult> { + return $Call.ByID(465937298, req); +} + export function RunFastgit(commandLine: string): $CancellablePromise<$models.CommandResult> { return $Call.ByID(848143838, commandLine); } diff --git a/desktop/frontend/bindings/fastgitdesktop/index.ts b/desktop/frontend/bindings/fastgitdesktop/index.ts index dd078d2..9681d0f 100644 --- a/desktop/frontend/bindings/fastgitdesktop/index.ts +++ b/desktop/frontend/bindings/fastgitdesktop/index.ts @@ -7,5 +7,9 @@ export { }; export type { - CommandResult + ActionField, + ActionRunRequest, + CommandResult, + DesktopModule, + ModuleAction } from "./models.js"; diff --git a/desktop/frontend/bindings/fastgitdesktop/models.ts b/desktop/frontend/bindings/fastgitdesktop/models.ts index 70777c7..43f7508 100644 --- a/desktop/frontend/bindings/fastgitdesktop/models.ts +++ b/desktop/frontend/bindings/fastgitdesktop/models.ts @@ -1,6 +1,20 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +export interface ActionField { + "key": string; + "label": string; + "placeholder": string; + "required": boolean; + "default": string; +} + +export interface ActionRunRequest { + "moduleID": string; + "actionID": string; + "values": { [_ in string]?: string } | null; +} + export interface CommandResult { "command": string; "output": string; @@ -8,3 +22,19 @@ export interface CommandResult { "startedAt": string; "endedAt": string; } + +export interface DesktopModule { + "id": string; + "title": string; + "description": string; + "actions": ModuleAction[] | null; +} + +export interface ModuleAction { + "id": string; + "title": string; + "description": string; + "tool": string; + "args": string[] | null; + "fields": ActionField[] | null; +} diff --git a/desktop/frontend/src/main.ts b/desktop/frontend/src/main.ts index 3004ac7..981d139 100644 --- a/desktop/frontend/src/main.ts +++ b/desktop/frontend/src/main.ts @@ -1,110 +1,211 @@ import "./style.css"; -import { FastgitService } from "../bindings/fastgitdesktop"; +import * as FastgitService from "../bindings/fastgitdesktop/fastgitservice"; +import type { ActionField, CommandResult, DesktopModule, ModuleAction } from "../bindings/fastgitdesktop/models"; -const app = document.querySelector("#app")!; +const app = document.querySelector("#app"); +if (!app) throw new Error("#app not found"); app.innerHTML = `
-
-

fastgit desktop

-

在桌面里执行 fastgit 命令并查看输出

-
+
+

fastgit desktop console

+

仓库 / 分支 / worktree / issue / PR / tag 的统一管理台

+
-
- +
- - + +
+
+ +
- +
-
- +
- - + +
+
+ +
-
- - - - +
+ +
+
+

功能模块

+
+
-
-
- Output - +
+
+

输出

+
-
等待执行命令...
+
等待执行...
`; -const repoInput = document.querySelector("#repo")!; -const repoHint = document.querySelector("#repo-hint")!; -const cmdInput = document.querySelector("#cmd")!; -const runBtn = document.querySelector("#run")!; -const saveRepoBtn = document.querySelector("#save-repo")!; +const repoPath = document.querySelector("#repo-path")!; +const setRepoBtn = document.querySelector("#set-repo")!; +const repoStatus = document.querySelector("#repo-status")!; +const rawCmd = document.querySelector("#raw-cmd")!; +const runRawBtn = document.querySelector("#run-raw")!; +const modulesWrap = document.querySelector("#modules")!; const output = document.querySelector("#output")!; const meta = document.querySelector("#meta")!; +const busy = document.querySelector("#busy")!; -async function boot() { +let modules: DesktopModule[] = []; + +function setBusy(value: boolean) { + busy.textContent = value ? "运行中..." : ""; +} + +function renderResult(result: CommandResult, title?: string) { + output.textContent = result.output || "(no output)"; + const header = title ? `${title} | ` : ""; + meta.textContent = `${header}${result.command} | exit=${result.exitCode}`; +} + +function createFieldInput(moduleID: string, actionID: string, field: ActionField): HTMLInputElement { + const input = document.createElement("input"); + input.className = "input"; + input.placeholder = field.placeholder || field.label; + input.dataset.moduleId = moduleID; + input.dataset.actionId = actionID; + input.dataset.fieldKey = field.key; + if (field.default) input.value = field.default; + return input; +} + +function collectActionValues(moduleID: string, actionID: string): Record { + const values: Record = {}; + const selector = `input[data-module-id="${moduleID}"][data-action-id="${actionID}"]`; + const inputs = modulesWrap.querySelectorAll(selector); + inputs.forEach((input) => { + const key = input.dataset.fieldKey; + if (!key) return; + values[key] = input.value.trim(); + }); + return values; +} + +async function runAction(module: DesktopModule, action: ModuleAction) { + setBusy(true); try { - const root = await FastgitService.GetRepoRoot(); - repoInput.value = root; - repoHint.textContent = `当前仓库: ${root}`; + const values = collectActionValues(module.id, action.id); + const result = await FastgitService.RunAction({ + moduleID: module.id, + actionID: action.id, + values, + }); + renderResult(result, `${module.title} / ${action.title}`); } catch (err) { - repoHint.textContent = `读取仓库失败: ${String(err)}`; + output.textContent = `执行失败: ${String(err)}`; + meta.textContent = `${module.title} / ${action.title}`; + } finally { + setBusy(false); } } -async function run() { - const command = cmdInput.value.trim(); - if (!command) return; +function renderModules() { + modulesWrap.innerHTML = ""; + + for (const module of modules) { + const section = document.createElement("section"); + section.className = "module"; + + const header = document.createElement("div"); + header.className = "module-title"; + header.innerHTML = `

${module.title}

${module.description}

`; + section.appendChild(header); + + for (const action of module.actions || []) { + const row = document.createElement("div"); + row.className = "action-row"; - runBtn.disabled = true; - output.textContent = "running..."; - meta.textContent = ""; + const main = document.createElement("div"); + main.className = "action-main"; + main.innerHTML = `${action.title}${action.description}`; + const controls = document.createElement("div"); + controls.className = "action-controls"; + + for (const field of action.fields || []) { + controls.appendChild(createFieldInput(module.id, action.id, field)); + } + + const btn = document.createElement("button"); + btn.className = "btn small"; + btn.textContent = "执行"; + btn.addEventListener("click", () => void runAction(module, action)); + controls.appendChild(btn); + + row.appendChild(main); + row.appendChild(controls); + section.appendChild(row); + } + + modulesWrap.appendChild(section); + } +} + +async function boot() { try { - const res = await FastgitService.RunFastgit(command); - output.textContent = res.output || "(no output)"; - meta.textContent = `${res.command} | exit=${res.exitCode}`; + const root = await FastgitService.GetRepoRoot(); + repoPath.value = root; + repoStatus.textContent = `当前仓库: ${root}`; } catch (err) { - output.textContent = `执行失败: ${String(err)}`; - } finally { - runBtn.disabled = false; + repoStatus.textContent = `读取仓库失败: ${String(err)}`; + } + + try { + modules = (await FastgitService.GetModules()) || []; + renderModules(); + } catch (err) { + modulesWrap.textContent = `加载模块失败: ${String(err)}`; } } -saveRepoBtn.addEventListener("click", async () => { - const path = repoInput.value.trim(); +setRepoBtn.addEventListener("click", async () => { + const path = repoPath.value.trim(); if (!path) return; + setBusy(true); try { await FastgitService.SetRepoRoot(path); - repoHint.textContent = `当前仓库: ${path}`; + repoStatus.textContent = `当前仓库: ${path}`; } catch (err) { - repoHint.textContent = `切换失败: ${String(err)}`; + repoStatus.textContent = `切换失败: ${String(err)}`; + } finally { + setBusy(false); } }); -runBtn.addEventListener("click", () => void run()); - -cmdInput.addEventListener("keydown", (e) => { - if (e.key === "Enter") { - e.preventDefault(); - void run(); +runRawBtn.addEventListener("click", async () => { + const cmd = rawCmd.value.trim(); + if (!cmd) return; + setBusy(true); + try { + const result = await FastgitService.RunFastgit(cmd); + renderResult(result, "Raw fastgit"); + } catch (err) { + output.textContent = `执行失败: ${String(err)}`; + meta.textContent = "Raw fastgit"; + } finally { + setBusy(false); } }); -document.querySelectorAll(".chip").forEach((btn) => { - btn.addEventListener("click", () => { - cmdInput.value = btn.dataset.cmd || ""; - void run(); - }); +rawCmd.addEventListener("keydown", (event) => { + if (event.key !== "Enter") return; + event.preventDefault(); + runRawBtn.click(); }); void boot(); diff --git a/desktop/frontend/src/style.css b/desktop/frontend/src/style.css index 4a85b43..04eb104 100644 --- a/desktop/frontend/src/style.css +++ b/desktop/frontend/src/style.css @@ -1,119 +1,194 @@ :root { - color-scheme: light; - --bg: #f2f5f9; - --panel: #ffffff; - --text: #1f2b3a; - --muted: #607085; - --line: #d4dde8; - --primary: #1363df; - --primary-strong: #0f4ca8; + --bg-0: #f6f8fc; + --bg-1: #ffffff; + --line: #d9e1ed; + --text: #1a2330; + --muted: #617289; + --brand: #0f69d7; + --brand-2: #0b54ab; } -* { box-sizing: border-box; } +* { + box-sizing: border-box; +} body { margin: 0; - font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; - background: radial-gradient(circle at 0 0, #dfe8ff 0%, var(--bg) 42%); + font-family: "SF Pro Text", "Segoe UI", sans-serif; color: var(--text); + background: + radial-gradient(circle at 10% -20%, #ddeaff 0%, transparent 50%), + radial-gradient(circle at 95% -10%, #e4ffe9 0%, transparent 40%), + var(--bg-0); } .layout { - max-width: 980px; + max-width: 1160px; margin: 0 auto; padding: 24px; display: grid; - gap: 16px; + gap: 14px; } -.header h1 { +.hero h1 { margin: 0; - font-size: 28px; + font-size: 32px; } -.header p { - margin: 6px 0 0; +.hero p { + margin: 8px 0 0; color: var(--muted); } -.panel { - background: var(--panel); +.card { + background: var(--bg-1); border: 1px solid var(--line); - border-radius: 12px; + border-radius: 14px; padding: 14px; } .row { display: flex; + align-items: center; +} + +.row.gap { gap: 8px; } +label { + font-size: 13px; + color: var(--muted); +} + .input { - flex: 1; + width: 100%; min-width: 0; border: 1px solid var(--line); - border-radius: 8px; + border-radius: 10px; padding: 10px 12px; + background: #fff; } .btn { border: 1px solid var(--line); + border-radius: 10px; background: #fff; - border-radius: 8px; - padding: 10px 14px; + color: var(--text); cursor: pointer; + padding: 10px 14px; + white-space: nowrap; +} + +.btn.small { + padding: 8px 12px; } .btn.primary { border-color: transparent; - background: var(--primary); + background: var(--brand); color: #fff; } -.btn.primary:hover { background: var(--primary-strong); } +.btn.primary:hover { + background: var(--brand-2); +} -.quick-actions { - margin-top: 10px; +.hint { + color: var(--muted); + font-size: 12px; +} + +.module-head { display: flex; - gap: 8px; - flex-wrap: wrap; + align-items: center; + justify-content: space-between; + margin-bottom: 10px; } -.chip { +.module-head h2 { + margin: 0; + font-size: 18px; +} + +.modules { + display: grid; + gap: 10px; +} + +.module { border: 1px solid var(--line); - border-radius: 999px; - background: #fff; - padding: 6px 12px; - cursor: pointer; + border-radius: 12px; + padding: 10px; + background: #fbfdff; } -.output-panel { min-height: 320px; } +.module-title h3 { + margin: 0; +} -.output-head { - display: flex; - justify-content: space-between; +.module-title p { + margin: 4px 0 8px; color: var(--muted); - margin-bottom: 8px; + font-size: 13px; +} + +.action-row { + border-top: 1px dashed var(--line); + padding-top: 10px; + margin-top: 10px; + display: grid; + grid-template-columns: 1fr; + gap: 8px; +} + +.action-main strong { + display: block; + font-size: 14px; +} + +.action-main span { + color: var(--muted); + font-size: 12px; +} + +.action-controls { + display: flex; + gap: 8px; + flex-wrap: wrap; +} + +.action-controls .input { + width: 260px; } .output { margin: 0; - border-radius: 8px; - background: #0b1220; - color: #d7e0ef; - min-height: 250px; - padding: 12px; + min-height: 260px; + max-height: 420px; overflow: auto; + border-radius: 10px; + border: 1px solid #223149; + background: #0e1625; + color: #dae5fb; + padding: 12px; } -small { - display: inline-block; - margin-top: 6px; - color: var(--muted); -} +@media (max-width: 780px) { + .layout { + padding: 14px; + } -@media (max-width: 720px) { - .row { + .hero h1 { + font-size: 24px; + } + + .row.gap { flex-direction: column; + align-items: stretch; + } + + .action-controls .input { + width: 100%; } } diff --git a/desktop/service.go b/desktop/service.go index 7916ba7..46dffe7 100644 --- a/desktop/service.go +++ b/desktop/service.go @@ -19,6 +19,36 @@ type CommandResult struct { EndedAt string `json:"endedAt"` } +type ActionField struct { + Key string `json:"key"` + Label string `json:"label"` + Placeholder string `json:"placeholder"` + Required bool `json:"required"` + Default string `json:"default"` +} + +type ModuleAction struct { + ID string `json:"id"` + Title string `json:"title"` + Description string `json:"description"` + Tool string `json:"tool"` + Args []string `json:"args"` + Fields []ActionField `json:"fields"` +} + +type DesktopModule struct { + ID string `json:"id"` + Title string `json:"title"` + Description string `json:"description"` + Actions []ModuleAction `json:"actions"` +} + +type ActionRunRequest struct { + ModuleID string `json:"moduleID"` + ActionID string `json:"actionID"` + Values map[string]string `json:"values"` +} + type FastgitService struct { repoRoot string } @@ -58,6 +88,92 @@ func (s *FastgitService) SetRepoRoot(path string) error { return nil } +func (s *FastgitService) GetModules() []DesktopModule { + return []DesktopModule{ + { + ID: "repo", + Title: "仓库管理", + Description: "查看状态、拉取、推送", + Actions: []ModuleAction{ + {ID: "repo_status", Title: "状态", Description: "ggc status short", Tool: "fastgit", Args: []string{"ggc", "status", "short"}}, + {ID: "repo_pull", Title: "拉取", Description: "pull current branch", Tool: "fastgit", Args: []string{"pull"}}, + {ID: "repo_push", Title: "推送", Description: "push current branch", Tool: "fastgit", Args: []string{"push"}}, + }, + }, + { + ID: "branch", + Title: "分支管理", + Description: "列举、创建、切换、删除分支", + Actions: []ModuleAction{ + {ID: "branch_list", Title: "列出本地分支", Description: "ggc branch list local", Tool: "fastgit", Args: []string{"ggc", "branch", "list", "local"}}, + {ID: "branch_create", Title: "创建分支", Description: "ggc branch create ", Tool: "fastgit", Args: []string{"ggc", "branch", "create", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "分支名", Placeholder: "feature/my-branch", Required: true}}}, + {ID: "branch_checkout", Title: "切换分支", Description: "ggc branch checkout ", Tool: "fastgit", Args: []string{"ggc", "branch", "checkout", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "分支名", Placeholder: "main", Required: true}}}, + {ID: "branch_delete", Title: "删除分支", Description: "ggc branch delete ", Tool: "fastgit", Args: []string{"ggc", "branch", "delete", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "分支名", Placeholder: "feature/my-branch", Required: true}}}, + }, + }, + { + ID: "worktree", + Title: "Worktree 管理", + Description: "列出、创建、删除 worktree", + Actions: []ModuleAction{ + {ID: "worktree_list", Title: "列出 worktree", Description: "worktree list", Tool: "fastgit", Args: []string{"worktree", "list"}}, + {ID: "worktree_create", Title: "创建 worktree", Description: "worktree create --base ", Tool: "fastgit", Args: []string{"worktree", "create", "--base", "{{base}}", "{{target}}"}, Fields: []ActionField{{Key: "target", Label: "issue/branch", Placeholder: "123 或 feature/abc", Required: true}, {Key: "base", Label: "base", Placeholder: "main", Required: true, Default: "main"}}}, + {ID: "worktree_remove", Title: "删除 worktree", Description: "worktree remove ", Tool: "fastgit", Args: []string{"worktree", "remove", "{{target}}"}, Fields: []ActionField{{Key: "target", Label: "issue/branch", Placeholder: "123 或 feature/abc", Required: true}}}, + }, + }, + { + ID: "issue", + Title: "Issue 管理", + Description: "通过 gh CLI 进行 issue 查询与创建", + Actions: []ModuleAction{ + {ID: "issue_list", Title: "列出 issue", Description: "gh issue list --limit 30", Tool: "gh", Args: []string{"issue", "list", "--limit", "30"}}, + {ID: "issue_view", Title: "查看 issue", Description: "gh issue view ", Tool: "gh", Args: []string{"issue", "view", "{{id}}"}, Fields: []ActionField{{Key: "id", Label: "Issue ID", Placeholder: "123", Required: true}}}, + {ID: "issue_create", Title: "创建 issue", Description: "gh issue create", Tool: "gh", Args: []string{"issue", "create", "--title", "{{title}}", "--body", "{{body}}"}, Fields: []ActionField{{Key: "title", Label: "标题", Placeholder: "Issue title", Required: true}, {Key: "body", Label: "正文", Placeholder: "Issue body", Required: true}}}, + }, + }, + { + ID: "pr", + Title: "PR 管理", + Description: "create/status/sync/merge", + Actions: []ModuleAction{ + {ID: "pr_status", Title: "PR 状态", Description: "fastgit pr status", Tool: "fastgit", Args: []string{"pr", "status"}}, + {ID: "pr_create", Title: "创建 PR", Description: "fastgit pr create", Tool: "fastgit", Args: []string{"pr", "create"}}, + {ID: "pr_sync", Title: "同步 PR", Description: "fastgit pr sync", Tool: "fastgit", Args: []string{"pr", "sync"}}, + {ID: "pr_merge", Title: "合并 PR", Description: "fastgit pr merge --method --yes", Tool: "fastgit", Args: []string{"pr", "merge", "--method", "{{method}}", "--yes"}, Fields: []ActionField{{Key: "method", Label: "merge method", Placeholder: "squash|merge|rebase", Required: true, Default: "squash"}}}, + }, + }, + { + ID: "tag", + Title: "Tag 管理", + Description: "查看和发布 tag", + Actions: []ModuleAction{ + {ID: "tag_list", Title: "列出 tag", Description: "git tag --sort=-committerdate", Tool: "git", Args: []string{"tag", "--sort=-committerdate"}}, + {ID: "tag_publish", Title: "发布 tag", Description: "git tag && git push origin ", Tool: "git", Args: []string{"tag", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "Tag", Placeholder: "v1.2.3", Required: true}}}, + {ID: "tag_push", Title: "推送 tag", Description: "git push origin ", Tool: "git", Args: []string{"push", "origin", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "Tag", Placeholder: "v1.2.3", Required: true}}}, + }, + }, + } +} + +func (s *FastgitService) RunAction(req ActionRunRequest) (CommandResult, error) { + module, action, err := s.findAction(req.ModuleID, req.ActionID) + if err != nil { + return CommandResult{}, err + } + _ = module + values := req.Values + if values == nil { + values = map[string]string{} + } + + expandedArgs, err := fillActionArgs(action, values) + if err != nil { + return CommandResult{}, err + } + + return s.runTool(action.Tool, expandedArgs) +} + func (s *FastgitService) RunFastgit(commandLine string) (CommandResult, error) { line := strings.TrimSpace(commandLine) if line == "" { @@ -67,19 +183,73 @@ func (s *FastgitService) RunFastgit(commandLine string) (CommandResult, error) { if len(args) == 0 { return CommandResult{}, errors.New("invalid command") } + return s.runTool("fastgit", args) +} + +func fillActionArgs(action ModuleAction, values map[string]string) ([]string, error) { + normalized := make(map[string]string, len(values)) + for k, v := range values { + normalized[k] = strings.TrimSpace(v) + } + for _, field := range action.Fields { + val := normalized[field.Key] + if val == "" && field.Default != "" { + val = field.Default + normalized[field.Key] = val + } + if field.Required && val == "" { + return nil, fmt.Errorf("missing required field: %s", field.Label) + } + } + + expanded := make([]string, 0, len(action.Args)) + for _, item := range action.Args { + replaced := item + for key, value := range normalized { + replaced = strings.ReplaceAll(replaced, "{{"+key+"}}", value) + } + if strings.Contains(replaced, "{{") { + return nil, fmt.Errorf("unresolved parameter in args: %s", item) + } + replaced = strings.TrimSpace(replaced) + if replaced != "" { + expanded = append(expanded, replaced) + } + } + + return expanded, nil +} + +func (s *FastgitService) findAction(moduleID, actionID string) (DesktopModule, ModuleAction, error) { + for _, module := range s.GetModules() { + if module.ID != moduleID { + continue + } + for _, action := range module.Actions { + if action.ID == actionID { + return module, action, nil + } + } + return DesktopModule{}, ModuleAction{}, fmt.Errorf("action not found: %s", actionID) + } + return DesktopModule{}, ModuleAction{}, fmt.Errorf("module not found: %s", moduleID) +} + +func (s *FastgitService) runTool(tool string, args []string) (CommandResult, error) { now := time.Now().UTC() - result := CommandResult{Command: "fastgit " + line, StartedAt: now.Format(time.RFC3339)} + result := CommandResult{StartedAt: now.Format(time.RFC3339)} - bin, binArgs, err := s.resolveFastgitInvocation(args) + bin, execArgs, err := s.resolveInvocation(tool, args) if err != nil { return result, err } + result.Command = strings.Join(append([]string{bin}, execArgs...), " ") ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) defer cancel() - cmd := exec.CommandContext(ctx, bin, binArgs...) + cmd := exec.CommandContext(ctx, bin, execArgs...) cmd.Dir = s.repoRoot output, runErr := cmd.CombinedOutput() @@ -111,16 +281,25 @@ func (s *FastgitService) RunFastgit(commandLine string) (CommandResult, error) { return result, runErr } -func (s *FastgitService) resolveFastgitInvocation(args []string) (string, []string, error) { - if path, err := exec.LookPath("fastgit"); err == nil { +func (s *FastgitService) resolveInvocation(tool string, args []string) (string, []string, error) { + switch tool { + case "fastgit": + if path, err := exec.LookPath("fastgit"); err == nil { + return path, args, nil + } + if path, err := exec.LookPath("go"); err == nil { + fallback := []string{"run", "."} + fallback = append(fallback, args...) + return path, fallback, nil + } + return "", nil, errors.New("cannot find fastgit binary or go toolchain in PATH") + case "git", "gh": + path, err := exec.LookPath(tool) + if err != nil { + return "", nil, fmt.Errorf("cannot find %s in PATH", tool) + } return path, args, nil + default: + return "", nil, fmt.Errorf("unsupported tool: %s", tool) } - - if path, err := exec.LookPath("go"); err == nil { - fallback := []string{"run", "."} - fallback = append(fallback, args...) - return path, fallback, nil - } - - return "", nil, errors.New("cannot find fastgit binary or go toolchain in PATH") } From 9439fcb9d7d99c329c9d111a37c0abf13509dd6a Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 29 Jun 2026 14:43:40 +0800 Subject: [PATCH 04/16] chore: quick update codex/wails3 at 2026-06-29 14:43:40 --- desktop/README.md | 3 + .../bindings/fastgitdesktop/fastgitservice.ts | 4 - .../bindings/fastgitdesktop/models.ts | 2 - .../frontend/dist/assets/index-BlN-JZwK.css | 1 + .../frontend/dist/assets/index-BtWx1FlN.js | 14 + .../frontend/dist/assets/index-CFCFzOqg.css | 1 - .../frontend/dist/assets/index-jX5N17in.js | 44 - desktop/frontend/dist/index.html | 4 +- desktop/frontend/dist/wails/custom.js | 2 + desktop/frontend/index.html | 2 +- desktop/frontend/package-lock.json | 713 ++++++++++++++- desktop/frontend/package.json | 8 +- desktop/frontend/public/wails/custom.js | 2 + desktop/frontend/src/app/app.tsx | 23 + .../frontend/src/app/providers/app-context.ts | 31 + .../src/app/providers/app-provider.tsx | 379 ++++++++ desktop/frontend/src/app/types.ts | 30 + desktop/frontend/src/components/ui/button.tsx | 20 + desktop/frontend/src/components/ui/input.tsx | 7 + .../src/features/modules/module-actions.tsx | 73 ++ .../src/features/modules/module-sidebar.tsx | 56 ++ .../src/features/modules/sidebar-menu.tsx | 56 ++ .../src/features/output/output-panel.tsx | 20 + .../src/features/workspace/repo-switcher.tsx | 32 + .../src/features/workspace/top-tabs.tsx | 191 ++++ .../frontend/src/layouts/desktop-layout.tsx | 80 ++ desktop/frontend/src/lib/classnames.ts | 3 + desktop/frontend/src/lib/module-groups.ts | 24 + desktop/frontend/src/lib/persistence.ts | 81 ++ desktop/frontend/src/main.ts | 211 ----- desktop/frontend/src/main.tsx | 17 + desktop/frontend/src/services/backend.ts | 21 + desktop/frontend/src/style.css | 194 ---- desktop/frontend/src/styles/base.css | 48 + desktop/frontend/src/styles/forms.css | 68 ++ desktop/frontend/src/styles/index.css | 7 + desktop/frontend/src/styles/layout.css | 452 ++++++++++ desktop/frontend/src/styles/modules.css | 84 ++ desktop/frontend/src/styles/output.css | 61 ++ desktop/frontend/src/styles/tokens.css | 43 + desktop/frontend/tsconfig.json | 3 +- desktop/frontend/vite.config.ts | 2 + desktop/go.mod | 23 +- desktop/go.sum | 62 +- desktop/service.go | 842 +++++++++++++++--- desktop/service_test.go | 36 + 46 files changed, 3499 insertions(+), 581 deletions(-) create mode 100644 desktop/frontend/dist/assets/index-BlN-JZwK.css create mode 100644 desktop/frontend/dist/assets/index-BtWx1FlN.js delete mode 100644 desktop/frontend/dist/assets/index-CFCFzOqg.css delete mode 100644 desktop/frontend/dist/assets/index-jX5N17in.js create mode 100644 desktop/frontend/dist/wails/custom.js create mode 100644 desktop/frontend/public/wails/custom.js create mode 100644 desktop/frontend/src/app/app.tsx create mode 100644 desktop/frontend/src/app/providers/app-context.ts create mode 100644 desktop/frontend/src/app/providers/app-provider.tsx create mode 100644 desktop/frontend/src/app/types.ts create mode 100644 desktop/frontend/src/components/ui/button.tsx create mode 100644 desktop/frontend/src/components/ui/input.tsx create mode 100644 desktop/frontend/src/features/modules/module-actions.tsx create mode 100644 desktop/frontend/src/features/modules/module-sidebar.tsx create mode 100644 desktop/frontend/src/features/modules/sidebar-menu.tsx create mode 100644 desktop/frontend/src/features/output/output-panel.tsx create mode 100644 desktop/frontend/src/features/workspace/repo-switcher.tsx create mode 100644 desktop/frontend/src/features/workspace/top-tabs.tsx create mode 100644 desktop/frontend/src/layouts/desktop-layout.tsx create mode 100644 desktop/frontend/src/lib/classnames.ts create mode 100644 desktop/frontend/src/lib/module-groups.ts create mode 100644 desktop/frontend/src/lib/persistence.ts delete mode 100644 desktop/frontend/src/main.ts create mode 100644 desktop/frontend/src/main.tsx create mode 100644 desktop/frontend/src/services/backend.ts delete mode 100644 desktop/frontend/src/style.css create mode 100644 desktop/frontend/src/styles/base.css create mode 100644 desktop/frontend/src/styles/forms.css create mode 100644 desktop/frontend/src/styles/index.css create mode 100644 desktop/frontend/src/styles/layout.css create mode 100644 desktop/frontend/src/styles/modules.css create mode 100644 desktop/frontend/src/styles/output.css create mode 100644 desktop/frontend/src/styles/tokens.css create mode 100644 desktop/service_test.go diff --git a/desktop/README.md b/desktop/README.md index 1bf5e2f..299b601 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -1,5 +1,8 @@ # fastgit desktop (Wails v3) +该桌面端当前采用“SDK/方法调用”模型,不再通过输入命令字符串再解析执行。 +前端采用 React + feature 分层组织(参考 colanode 的 app/layout/features 结构)。 + ## Quick Tasks (from repo root) ```bash diff --git a/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts b/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts index e9d26bb..3bccdf7 100644 --- a/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts +++ b/desktop/frontend/bindings/fastgitdesktop/fastgitservice.ts @@ -21,10 +21,6 @@ export function RunAction(req: $models.ActionRunRequest): $CancellablePromise<$m return $Call.ByID(465937298, req); } -export function RunFastgit(commandLine: string): $CancellablePromise<$models.CommandResult> { - return $Call.ByID(848143838, commandLine); -} - export function SetRepoRoot(path: string): $CancellablePromise { return $Call.ByID(2463093517, path); } diff --git a/desktop/frontend/bindings/fastgitdesktop/models.ts b/desktop/frontend/bindings/fastgitdesktop/models.ts index 43f7508..12a8989 100644 --- a/desktop/frontend/bindings/fastgitdesktop/models.ts +++ b/desktop/frontend/bindings/fastgitdesktop/models.ts @@ -34,7 +34,5 @@ export interface ModuleAction { "id": string; "title": string; "description": string; - "tool": string; - "args": string[] | null; "fields": ActionField[] | null; } diff --git a/desktop/frontend/dist/assets/index-BlN-JZwK.css b/desktop/frontend/dist/assets/index-BlN-JZwK.css new file mode 100644 index 0000000..6803ebe --- /dev/null +++ b/desktop/frontend/dist/assets/index-BlN-JZwK.css @@ -0,0 +1 @@ +@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e0e5ed;--bg-main:#edf1f6;--bg-topbar:#e3e8f0;--bg-topbar-active:#f0f3f8;--bg-sidebar:#243247;--bg-sidebar-soft:#2f3f58;--bg-pane:#e3e7ef;--bg-pane-hover:#dbe2ec;--bg-card:#eef2f7;--bg-card-soft:#dde3ed;--bg-input:#edf1f6;--text-1:#1f2d44;--text-2:#5f708b;--text-3:#8b9ab0;--text-on-dark:#d6dfef;--sidebar-icon:#8fa2bf;--sidebar-icon-hover:#e4edfb;--sidebar-footer:#96a9c7;--sidebar-active-bg:#5a7db147;--sidebar-active-border:#a4bee857;--line:#bfcbdb;--line-strong:#adbbd1;--line-dark:#3a4860;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--ok:#1b9b4a;--error:#d83f57;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{background:#4f7fc41f;border-color:#4f7fc485}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;margin-left:auto;display:inline-flex}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);border-radius:10px;gap:3px;min-width:150px;padding:6px;display:grid;position:fixed;box-shadow:0 8px 20px #131f322e}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line-dark);background:linear-gradient(180deg, var(--bg-sidebar-soft), var(--bg-sidebar));color:var(--text-on-dark);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--sidebar-icon);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;display:grid}.sidebar-menu-panel__item:hover{color:var(--sidebar-icon-hover);background:#9ab2d414}.sidebar-menu-panel__item--active{color:var(--sidebar-icon-hover);background:linear-gradient(155deg, var(--sidebar-active-bg), #4c78bd1f);box-shadow:inset 0 0 0 1px var(--sidebar-active-border)}.sidebar-menu-panel__footer{border-top:1px solid var(--line-dark);color:var(--sidebar-footer);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{width:36px;height:32px;color:var(--sidebar-icon-hover);border-color:#a4b8d459;padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:#4f7fc47a}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:auto 1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.workspace-panel,.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 #ffffff57, var(--shadow-card);padding:12px}.workspace-panel header{justify-content:space-between;align-items:baseline;margin-bottom:8px;display:flex}.workspace-panel h2{font-size:14px}.workspace-panel header p,.workspace-panel__status{color:var(--text-2);font-size:12px}.workspace-panel__row{gap:8px;display:flex}.workspace-panel__status{margin-top:8px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line-dark);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line-dark);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto auto}}@media (width<=640px){.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);gap:10px;padding:12px;animation:.24s both rise-in;display:grid;box-shadow:0 1px #ffffff52}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button--primary{color:#fff;background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);outline:none;box-shadow:0 0 0 3px #4f7fc42e}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:#1b9b4a14;border-color:#1b9b4a40}.status-pill--error{color:var(--error);background:#d83f5714;border-color:#d83f5740}.output-panel__body{border-radius:var(--radius-lg);color:#d4dff2;background:#0f1725;border:1px solid #202d42;min-height:180px;max-height:30vh;margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto} diff --git a/desktop/frontend/dist/assets/index-BtWx1FlN.js b/desktop/frontend/dist/assets/index-BtWx1FlN.js new file mode 100644 index 0000000..e808af9 --- /dev/null +++ b/desktop/frontend/dist/assets/index-BtWx1FlN.js @@ -0,0 +1,14 @@ +var e=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports);(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function S(){}var C={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function ne(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return ne(e.type,t,e.props)}function ie(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ae(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var oe=/\/+/g;function se(e,t){return typeof e==`object`&&e&&e.key!=null?ae(``+e.key):t.toString(36)}function ce(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(S,S):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function le(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,le(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+se(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(oe,`$&/`)+`/`),le(o,r,i,``,function(e){return e})):o!=null&&(ie(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(oe,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{n.exports=t()})),r=e((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,ie());else{var t=n(l);t!==null&&se(x,t.startTime-e)}}var ee=!1,S=-1,C=5,te=-1;function ne(){return g?!0:!(e.unstable_now()-tet&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&se(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?ie():ee=!1}}}var ie;if(typeof y==`function`)ie=function(){y(re)};else if(typeof MessageChannel<`u`){var ae=new MessageChannel,oe=ae.port2;ae.port1.onmessage=re,ie=function(){oe.postMessage(null)}}else ie=function(){_(re,0)};function se(t,n){S=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(S),S=-1):h=!0,se(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,ie()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),i=e(((e,t)=>{t.exports=r()})),a=e((e=>{var t=n();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=e((e=>{var t=i(),r=n(),a=o();function s(e){var t=`https://react.dev/errors/`+e;if(1me||(e.current=pe[me],pe[me]=null,me--)}function D(e,t){me++,pe[me]=e.current,e.current=t}var ge=he(null),_e=he(null),ve=he(null),ye=he(null);function be(e,t){switch(D(ve,t),D(_e,e),D(ge,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}E(ge),D(ge,e)}function xe(){E(ge),E(_e),E(ve)}function Se(e){e.memoizedState!==null&&D(ye,e);var t=ge.current,n=Hd(t,e.type);t!==n&&(D(_e,e),D(ge,n))}function Ce(e){_e.current===e&&(E(ge),E(_e)),ye.current===e&&(E(ye),Qf._currentValue=fe)}var we,Te;function Ee(e){if(we===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);we=t&&t[1]||``,Te=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{De=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Ee(n):``}function ke(e,t){switch(e.tag){case 26:case 27:case 5:return Ee(e.type);case 16:return Ee(`Lazy`);case 13:return e.child!==t&&t!==null?Ee(`Suspense Fallback`):Ee(`Suspense`);case 19:return Ee(`SuspenseList`);case 0:case 15:return Oe(e.type,!1);case 11:return Oe(e.type.render,!1);case 1:return Oe(e.type,!0);case 31:return Ee(`Activity`);default:return``}}function Ae(e){try{var t=``,n=null;do t+=ke(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var je=Object.prototype.hasOwnProperty,Me=t.unstable_scheduleCallback,Ne=t.unstable_cancelCallback,Pe=t.unstable_shouldYield,Fe=t.unstable_requestPaint,Ie=t.unstable_now,Le=t.unstable_getCurrentPriorityLevel,Re=t.unstable_ImmediatePriority,ze=t.unstable_UserBlockingPriority,Be=t.unstable_NormalPriority,Ve=t.unstable_LowPriority,He=t.unstable_IdlePriority,Ue=t.log,We=t.unstable_setDisableYieldValue,Ge=null,Ke=null;function qe(e){if(typeof Ue==`function`&&We(e),Ke&&typeof Ke.setStrictMode==`function`)try{Ke.setStrictMode(Ge,e)}catch{}}var Je=Math.clz32?Math.clz32:Ze,Ye=Math.log,Xe=Math.LN2;function Ze(e){return e>>>=0,e===0?32:31-(Ye(e)/Xe|0)|0}var Qe=256,$e=262144,et=4194304;function tt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function nt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=tt(n))):i=tt(o):i=tt(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=tt(n))):i=tt(o)):i=tt(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function rt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function it(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function at(){var e=et;return et<<=1,!(et&62914560)&&(et=4194304),e}function ot(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function st(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function ct(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),bn=!1;if(yn)try{var xn={};Object.defineProperty(xn,"passive",{get:function(){bn=!0}}),window.addEventListener(`test`,xn,xn),window.removeEventListener(`test`,xn,xn)}catch{bn=!1}var Sn=null,Cn=null,wn=null;function Tn(){if(wn)return wn;var e,t=Cn,n=t.length,r,i=`value`in Sn?Sn.value:Sn.textContent,a=i.length;for(e=0;e=tr),ir=` `,ar=!1;function or(e,t){switch(e){case`keyup`:return $n.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function sr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var cr=!1;function lr(e,t){switch(e){case`compositionend`:return sr(t);case`keypress`:return t.which===32?(ar=!0,ir):null;case`textInput`:return e=t.data,e===ir&&ar?null:e;default:return null}}function ur(e,t){if(cr)return e===`compositionend`||!er&&or(e,t)?(e=Tn(),wn=Cn=Sn=null,cr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Mr(n)}}function Pr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Pr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Fr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Kt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Kt(e.document)}return t}function Ir(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Lr=yn&&`documentMode`in document&&11>=document.documentMode,Rr=null,zr=null,Br=null,Vr=!1;function Hr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Vr||Rr==null||Rr!==Kt(r)||(r=Rr,`selectionStart`in r&&Ir(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Br&&jr(Br,r)||(Br=r,r=Ed(zr,`onSelect`),0>=o,i-=o,Pi=1<<32-Je(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),o=a(_,o,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),M&&Ii(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),o=a(y,o,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),M&&Ii(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return M&&Ii(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),M&&Ii(i,g),u}function b(e,r,a,c){if(typeof a==`object`&&a&&a.type===y&&a.key===null&&(a=a.props.children),typeof a==`object`&&a){switch(a.$$typeof){case _:a:{for(var l=a.key;r!==null;){if(r.key===l){if(l=a.type,l===y){if(r.tag===7){n(e,r.sibling),c=i(r,a.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===ie&&Pa(l)===r.type){n(e,r.sibling),c=i(r,a.props),Va(c,a),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}a.type===y?(c=xi(a.props.children,e.mode,c,a.key),c.return=e,e=c):(c=bi(a.type,a.key,a.props,null,e.mode,c),Va(c,a),c.return=e,e=c)}return o(e);case v:a:{for(l=a.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),c=i(r,a.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=wi(a,e.mode,c),c.return=e,e=c}return o(e);case ie:return a=Pa(a),b(e,r,a,c)}if(de(a))return h(e,r,a,c);if(ce(a)){if(l=ce(a),typeof l!=`function`)throw Error(s(150));return a=l.call(a),g(e,r,a,c)}if(typeof a.then==`function`)return b(e,r,Ba(a),c);if(a.$$typeof===S)return b(e,r,la(e,a),c);Ha(e,a)}return typeof a==`string`&&a!==``||typeof a==`number`||typeof a==`bigint`?(a=``+a,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,a),c.return=e,e=c):(n(e,r),c=Si(a,e.mode,c),c.return=e,e=c),o(e)):n(e,r)}return function(e,t,n,r){try{za=0;var i=b(e,t,n,r);return Ra=null,i}catch(t){if(t===Oa||t===Aa)throw t;var a=gi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Wa=Ua(!0),Ga=Ua(!1),Ka=!1;function qa(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ja(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ya(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Xa(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=pi(e),fi(e,null,n),t}return li(e,r,t,n),pi(e)}function Za(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ut(e,n)}}function Qa(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var $a=!1;function eo(){if($a){var e=ya;if(e!==null)throw e}}function to(e,t,n,r){$a=!1;var i=e.updateQueue;Ka=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(q&f)===f:(r&f)===f){f!==0&&f===va&&($a=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ka=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Kl|=o,e.lanes=o,e.memoizedState=d}}function no(e,t){if(typeof e!=`function`)throw Error(s(191,e));e.call(t)}function ro(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=w.T,s={};w.T=s,Rs(e,!1,t,n);try{var c=i(),l=w.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ls(e,t,Sa(c,r),pu(e)):Ls(e,t,r,pu(e))}catch(n){Ls(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{T.p=a,o!==null&&s.types!==null&&(o.types=s.types),w.T=o}}function Ds(){}function Os(e,t,n,r){if(e.tag!==5)throw Error(s(476));var i=ks(e).queue;Es(e,i,t,fe,n===null?Ds:function(){return As(e),n(r)})}function ks(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:fe,baseState:fe,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:zo,lastRenderedState:fe},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:zo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function As(e){var t=ks(e);t.next===null&&(t=e.alternate.memoizedState),Ls(e,t.next.queue,{},pu())}function js(){return ca(Qf)}function Ms(){return z().memoizedState}function Ns(){return z().memoizedState}function Ps(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ya(n);var r=Xa(t,e,n);r!==null&&(hu(r,t,n),Za(r,t,n)),t={cache:ma()},e.payload=t;return}t=t.return}}function Fs(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},zs(e)?Bs(t,n):(n=ui(e,t,n,r),n!==null&&(hu(n,e,r),Vs(n,t,r)))}function Is(e,t,n){Ls(e,t,n,pu())}function Ls(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(zs(e))Bs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Ar(s,o))return li(e,t,i,0),G===null&&ci(),!1}catch{}if(n=ui(e,t,i,r),n!==null)return hu(n,e,r),Vs(n,t,r),!0}return!1}function Rs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},zs(e)){if(t)throw Error(s(479))}else t=ui(e,n,r,2),t!==null&&hu(t,e,2)}function zs(e){var t=e.alternate;return e===F||t!==null&&t===F}function Bs(e,t){bo=yo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Vs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ut(e,n)}}var Hs={readContext:ca,use:Lo,useCallback:R,useContext:R,useEffect:R,useImperativeHandle:R,useLayoutEffect:R,useInsertionEffect:R,useMemo:R,useReducer:R,useRef:R,useState:R,useDebugValue:R,useDeferredValue:R,useTransition:R,useSyncExternalStore:R,useId:R,useHostTransitionStatus:R,useFormState:R,useActionState:R,useOptimistic:R,useMemoCache:R,useCacheRefresh:R};Hs.useEffectEvent=R;var Us={readContext:ca,use:Lo,useCallback:function(e,t){return Po().memoizedState=[e,t===void 0?null:t],e},useContext:ca,useEffect:ps,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),ds(4194308,4,ys.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ds(4194308,4,e,t)},useInsertionEffect:function(e,t){ds(4,2,e,t)},useMemo:function(e,t){var n=Po();t=t===void 0?null:t;var r=e();if(xo){qe(!0);try{e()}finally{qe(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Po();if(n!==void 0){var i=n(t);if(xo){qe(!0);try{n(t)}finally{qe(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Fs.bind(null,F,e),[r.memoizedState,e]},useRef:function(e){var t=Po();return e={current:e},t.memoizedState=e},useState:function(e){e=Yo(e);var t=e.queue,n=Is.bind(null,F,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:xs,useDeferredValue:function(e,t){return ws(Po(),e,t)},useTransition:function(){var e=Yo(!1);return e=Es.bind(null,F,e.queue,!0,!1),Po().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=F,i=Po();if(M){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),G===null)throw Error(s(349));q&127||Wo(r,t,n)}i.memoizedState=n;var a={value:n,getSnapshot:t};return i.queue=a,ps(Ko.bind(null,r,a,e),[e]),r.flags|=2048,ls(9,{destroy:void 0},Go.bind(null,r,a,n,t),null),n},useId:function(){var e=Po(),t=G.identifierPrefix;if(M){var n=Fi,r=Pi;n=(r&~(1<<32-Je(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=So++,0<\/script>`,a=a.removeChild(a.firstChild);break;case`select`:a=typeof r.is==`string`?o.createElement(`select`,{is:r.is}):o.createElement(`select`),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=typeof r.is==`string`?o.createElement(i,{is:r.is}):o.createElement(i)}}a[_t]=t,a[vt]=r;a:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)a.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break a;for(;o.sibling===null;){if(o.return===null||o.return===t)break a;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=a;a:switch(Pd(a,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Ic(t)}}return V(t),Lc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Ic(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(s(166));if(e=ve.current,Ji(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=Vi,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[_t]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Gi(t,!0)}else e=Bd(e).createTextNode(r),e[_t]=t,t.stateNode=e}return V(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Ji(t),n!==null){if(e===null){if(!r)throw Error(s(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(s(557));e[_t]=t}else Yi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),e=!1}else n=Xi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(go(t),t):(go(t),null);if(t.flags&128)throw Error(s(558))}return V(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=Ji(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(s(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(s(317));i[_t]=t}else Yi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),i=!1}else i=Xi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(go(t),t):(go(t),null)}return go(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),a=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),zc(t,t.updateQueue),V(t),null);case 4:return xe(),e===null&&Sd(t.stateNode.containerInfo),V(t),null;case 10:return na(t.type),V(t),null;case 19:if(E(P),r=t.memoizedState,r===null)return V(t),null;if(i=(t.flags&128)!=0,a=r.rendering,a===null)if(i)Bc(r,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(a=_o(e),a!==null){for(t.flags|=128,Bc(r,!1),e=a.updateQueue,t.updateQueue=e,zc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)yi(n,e),n=n.sibling;return D(P,P.current&1|2),M&&Ii(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ie()>nu&&(t.flags|=128,i=!0,Bc(r,!1),t.lanes=4194304)}else{if(!i)if(e=_o(a),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,zc(t,e),Bc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!a.alternate&&!M)return V(t),null}else 2*Ie()-r.renderingStartTime>nu&&n!==536870912&&(t.flags|=128,i=!0,Bc(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(e=r.last,e===null?t.child=a:e.sibling=a,r.last=a)}return r.tail===null?(V(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ie(),e.sibling=null,n=P.current,D(P,i?n&1|2:n&1),M&&Ii(t,r.treeForkCount),e);case 22:case 23:return go(t),co(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(V(t),t.subtreeFlags&6&&(t.flags|=8192)):V(t),n=t.updateQueue,n!==null&&zc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&E(wa),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),na(N),V(t),null;case 25:return null;case 30:return null}throw Error(s(156,t.tag))}function Hc(e,t){switch(zi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return na(N),xe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(go(t),t.alternate===null)throw Error(s(340));Yi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(go(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Yi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return E(P),null;case 4:return xe(),null;case 10:return na(t.type),null;case 22:case 23:return go(t),co(),e!==null&&E(wa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return na(N),null;case 25:return null;default:return null}}function Uc(e,t){switch(zi(t),t.tag){case 3:na(N),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&go(t);break;case 13:go(t);break;case 19:E(P);break;case 10:na(t.type);break;case 22:case 23:go(t),co(),e!==null&&E(wa);break;case 24:na(N)}}function Wc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Gc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Kc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{ro(t,n)}catch(t){Z(e,e.return,t)}}}function qc(e,t,n){n.props=Xs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Jc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Yc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Xc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Zc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[vt]=t}catch(t){Z(e,e.return,t)}}function Qc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function $c(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Qc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function el(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=un));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(el(e,t,n),e=e.sibling;e!==null;)el(e,t,n),e=e.sibling}function tl(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(tl(e,t,n),e=e.sibling;e!==null;)tl(e,t,n),e=e.sibling}function nl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[_t]=e,t[vt]=n}catch(t){Z(e,e.return,t)}}var rl=!1,H=!1,il=!1,al=typeof WeakSet==`function`?WeakSet:Set,ol=null;function sl(e,t){if(e=e.containerInfo,Rd=sp,e=Fr(e),Ir(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break a}var o=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||i!==0&&f.nodeType!==3||(c=o+i),f!==a||r!==0&&f.nodeType!==3||(l=o+r),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===i&&(c=o),p===a&&++d===r&&(l=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,ol=t;ol!==null;)if(t=ol,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,ol=e;else for(;ol!==null;){switch(t=ol,a=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(a,r,n),a[_t]=e,kt(a),r=a;break a;case`link`:var o=Vf(`link`,`href`,i).get(r+(n.href||``));if(o){for(var c=0;cg&&(o=g,g=h,h=o);var _=Nr(s,h),v=Nr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,w.T=null,n=lu,lu=null;var a=au,o=su;if(X=0,ou=au=null,su=0,W&6)throw Error(s(331));var c=W;if(W|=4,Il(a.current),Ol(a,a.current,o,n),W=c,id(0,!1),Ke&&typeof Ke.onPostCommitFiberRoot==`function`)try{Ke.onPostCommitFiberRoot(Ge,a)}catch{}return!0}finally{T.p=i,w.T=r,Vu(e,t)}}function Wu(e,t,n){t=Ei(n,t),t=nc(e.stateNode,t,2),e=Xa(e,t,2),e!==null&&(st(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(iu===null||!iu.has(r))){e=Ei(n,e),n=rc(2),r=Xa(t,n,2),r!==null&&(ic(n,r,t,e),st(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Bl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Wl=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>Ie()-eu?!(W&2)&&Su(e,0):Jl|=n,Xl===q&&(Xl=0)),rd(e)}function qu(e,t){t===0&&(t=at()),e=di(e,t),e!==null&&(st(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Me(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Je(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=q,a=nt(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||rt(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Ie(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}X!==0&&X!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Jt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),kt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Jt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Jt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Jt(n.imageSizes)+`"]`)):i+=`[href="`+Jt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),kt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Jt(r)+`"][href="`+Jt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),kt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=Ot(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);kt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),kt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),kt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var i=(i=ve.current)?gf(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=Ot(i).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var a=Ot(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(jf(e)))&&!a._p&&(o.instance=a,o.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),a||Nf(i,e,n,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=Ot(i).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Af(e){return`href="`+Jt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),kt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Jt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Jt(n.href)+`"]`);if(r)return t.instance=r,kt(r),r;var i=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),kt(r),Pd(r,`style`,i),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Af(n.href);var a=e.querySelector(jf(i));if(a)return t.state.loading|=4,t.instance=a,kt(a),a;r=Mf(n),(i=mf.get(i))&&Rf(r,i),a=(e.ownerDocument||e).createElement(`link`),kt(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),t.state.loading|=4,Lf(a,n.precedence,e),t.instance=a;case`script`:return a=Pf(n.src),(i=e.querySelector(Ff(a)))?(t.instance=i,kt(i),i):(r=n,(i=mf.get(a))&&(r=h({},n),zf(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),kt(i),Pd(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,kt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),kt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()})),l=n(),u=c(),d=typeof window<`u`&&typeof document<`u`,f=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function p(e=21){let t=``,n=e|0;for(;n--;)t+=f[Math.random()*64|0];return t}function m(){return window.location.origin+`/wails/runtime`}var h=512*1024,g=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10,IOS:11,Android:12}),_=p(),v=null;function y(e,t=``){return function(n,r=null){return b(e,n,t,r)}}async function b(e,t,n,r){if(v)return v.call(e,t,n,r);let i=new URL(m()),a={object:e,method:t};r!=null&&(a.args=r);let o={"x-wails-client-id":_,"Content-Type":`application/json`};n&&(o[`x-wails-window-name`]=n);let s=JSON.stringify(a),c;if(c=s.length>h?await x(i,o,s):await fetch(i,{method:`POST`,headers:o,body:s}),!c.ok)throw Error(await c.text());return(c.headers.get(`Content-Type`)?.indexOf(`application/json`)??-1)===-1?c.text():c.json()}async function x(e,t,n){let r=p(),i=new TextEncoder().encode(n),a=Math.ceil(i.length/h);for(let n=0;n{let i=e.get(t);if(i){if(e.delete(t),r){i.reject(Error(r));return}try{let e=JSON.parse(n??`{}`);if(!e.ok){i.reject(Error(e.error??`unknown runtime call error`));return}i.resolve(`text`in e?e.text:e.data)}catch(e){i.reject(e)}}},v={call(t,n,r,i){return new Promise((a,o)=>{let s=p();e.set(s,{resolve:a,reject:o});try{ee.invokeAsync(s,JSON.stringify({object:t,method:n,windowName:r,args:i??null,clientId:_}))}catch(t){e.delete(s),o(t)}})}}}g.System;var S=(function(){try{if(window.chrome?.webview?.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if(window.webkit?.messageHandlers?.external?.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external);if(window.wails?.invoke)return e=>window.wails.invoke(typeof e==`string`?e:JSON.stringify(e))}catch{}return console.warn(` +%c⚠️ Browser Environment Detected %c + +%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. +More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development +`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function C(e){S?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function re(){return!!window._wails?.environment?.Debug}function ie(){return new MouseEvent(`mousedown`).buttons===0}function ae(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}d&&document.addEventListener(`DOMContentLoaded`,()=>{}),d&&window.addEventListener(`contextmenu`,le);var oe=y(g.ContextMenu),se=0;function ce(e,t,n,r){oe(se,{id:e,x:t,y:n,data:r})}function le(e){let t=ae(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);ce(n,e.clientX,e.clientY,r)}else ue(e,t)}function ue(e,t){if(re())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{fe=e,fe||(pe=me=!1,Oe())});var _e=!1;function ve(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function ye(){if(!_e&&!ve()){window.addEventListener(`mousedown`,we,{capture:!0}),window.addEventListener(`mousemove`,we,{capture:!0}),window.addEventListener(`mouseup`,we,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,be,{capture:!0});_e=!0}}if(d){ye(),document.addEventListener(`DOMContentLoaded`,ye,{once:!0});let e=0,t=window.setInterval(()=>{if(_e){window.clearInterval(t);return}ye(),++e>100&&window.clearInterval(t)},50)}function be(e){(T||me)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var xe=0,Se=1,Ce=2;function we(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=xe,ge||(n=D|1<{n=e,r=t}),this.constructor[tt]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[$e]:{configurable:!1,enumerable:!1,writable:!0,value:null},[et]:{configurable:!1,enumerable:!1,writable:!1,value:rt(i,a)}});let o=at(i,a);try{e(it(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[et](new Ze(`Promise cancelled.`,{cause:t})),ut(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(Xe(t)||(t=st),Xe(n)||(n=ct),t===st&&n==ct)return new e(e=>e(this));let i={};return this[$e]=i,new e((e,r)=>{super.then(n=>{var a;this[$e]===i&&(this[$e]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[$e]===i&&(this[$e]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return Xe(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[tt](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>ot(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>ot(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>ot(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>ot(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function rt(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new Qe(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new Qe(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function it(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(Xe(r)){try{let r=n.cancel;if(Xe(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?rt(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=at(e,i);try{Reflect.apply(r,n,[it(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function at(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof Ze&&t.reason instanceof Ze&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new Qe(e.promise,n))}else t.settled=!0,e.reject(n)}}function ot(e,t,n){let r=[];for(let i of t){let t;try{if(!Xe(i.then)||(t=i.cancel,!Xe(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new Qe(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new Qe(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function st(e){return e}function ct(e){throw e}function lt(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function ut(e){let t=e[$e]??{};return`promise`in t||Object.assign(t,dt()),e[$e]??(t.resolve(),e[$e]=t),t.promise}var dt=Promise.withResolvers;dt=dt&&typeof dt==`function`?dt.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},d&&(window._wails=window._wails||{});var ft=y(g.Call),pt=y(g.CancelCall),mt=new Map,ht=0,gt=0;function _t(){let e;do e=p();while(mt.has(e));return e}function vt(e){let t=_t(),n=nt.withResolvers();mt.set(t,{resolve:n.resolve,reject:n.reject});let r=ft(ht,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,mt.delete(t),n.resolve(e)},e=>{i=!1,mt.delete(t),n.reject(e)});let a=()=>(mt.delete(t),pt(gt,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function yt(e,...t){return vt({methodID:e,args:t})}var bt=`data-file-drop-target`,xt=`file-drop-target-active`,O=null,St=0,Ct=1,wt=2,Tt=3,Et=4,Dt=5,Ot=6,kt=7,At=8,jt=9,Mt=10,Nt=11,Pt=12,Ft=13,It=14,Lt=15,Rt=16,zt=17,Bt=18,Vt=19,Ht=20,Ut=21,Wt=22,Gt=23,Kt=24,qt=25,Jt=26,Yt=27,Xt=28,Zt=29,Qt=30,$t=31,en=32,tn=33,nn=34,rn=35,an=36,on=37,sn=38,cn=39,ln=40,un=41,dn=42,fn=43,pn=44,mn=45,hn=46,gn=47,_n=48,vn=49,yn=50,bn=51,xn=52;function Sn(e){return e?e.closest(`[${bt}]`):null}function Cn(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function wn(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var Tn=!1;function En(){Tn=!1,O&&=(O.classList.remove(xt),null)}function Dn(){window._wails?.flags?.enableFileDrop!==!1&&(Tn=!0)}function On(){En()}function kn(e,t){if(!Tn||window._wails?.flags?.enableFileDrop===!1)return;let n=Sn(document.elementFromPoint(e,t));O&&O!==n&&O.classList.remove(xt),n?(n.classList.add(xt),O=n):O=null}var k=Symbol(`caller`),An=new class e{constructor(t=``){this[k]=y(g.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[k](St)}Center(){return this[k](Ct)}Close(){return this[k](wt)}DisableSizeConstraints(){return this[k](Tt)}EnableSizeConstraints(){return this[k](Et)}Focus(){return this[k](Dt)}ForceReload(){return this[k](Ot)}Fullscreen(){return this[k](kt)}GetScreen(){return this[k](At)}GetZoom(){return this[k](jt)}Height(){return this[k](Mt)}Hide(){return this[k](Nt)}IsFocused(){return this[k](Pt)}IsFullscreen(){return this[k](Ft)}IsMaximised(){return this[k](It)}IsMinimised(){return this[k](Lt)}Maximise(){return this[k](Rt)}Minimise(){return this[k](zt)}Name(){return this[k](Bt)}OpenDevTools(){return this[k](Vt)}RelativePosition(){return this[k](Ht)}Reload(){return this[k](Ut)}Resizable(){return this[k](Wt)}Restore(){return this[k](Gt)}SetPosition(e,t){return this[k](Kt,{x:e,y:t})}SetAlwaysOnTop(e){return this[k](qt,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[k](Jt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[k](Yt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[k](Xt,{enabled:e})}SetMaxSize(e,t){return this[k](Zt,{width:e,height:t})}SetMinSize(e,t){return this[k](Qt,{width:e,height:t})}SetRelativePosition(e,t){return this[k]($t,{x:e,y:t})}SetResizable(e){return this[k](en,{resizable:e})}SetSize(e,t){return this[k](tn,{width:e,height:t})}SetTitle(e){return this[k](nn,{title:e})}SetZoom(e){return this[k](rn,{zoom:e})}Show(){return this[k](an)}Size(){return this[k](on)}ToggleFullscreen(){return this[k](sn)}ToggleMaximise(){return this[k](cn)}ToggleFrameless(){return this[k](ln)}UnFullscreen(){return this[k](un)}UnMaximise(){return this[k](dn)}UnMinimise(){return this[k](fn)}Width(){return this[k](pn)}Zoom(){return this[k](mn)}ZoomIn(){return this[k](hn)}ZoomOut(){return this[k](gn)}ZoomReset(){return this[k](_n)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=Sn(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=Sn(document.elementFromPoint(e.clientX,e.clientY));O&&O!==n&&O.classList.remove(xt),n?(n.classList.add(xt),e.dataTransfer.dropEffect=`copy`,O=n):(e.dataTransfer.dropEffect=`none`,O=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=Sn(document.elementFromPoint(e.clientX,e.clientY));O&&O!==t&&O.classList.remove(xt),t?(t.classList.contains(xt)||t.classList.add(xt),e.dataTransfer.dropEffect=`copy`,O=t):(e.dataTransfer.dropEffect=`none`,O=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||O&&!O.contains(e.relatedTarget))&&(O&&=(O.classList.remove(xt),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,O&&=(O.classList.remove(xt),null),Cn()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&wn(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&jn(),d&&(window._wails=window._wails||{}),d&&(window._wails.invoke=C,window._wails.clientId=_),d&&(window._wails.handlePlatformFileDrop=An.HandlePlatformFileDrop.bind(An)),d&&(window._wails.handleDragEnter=Dn,window._wails.handleDragLeave=On,window._wails.handleDragOver=kn),d&&C(`wails:runtime:ready`);function Mn(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}d&&Mn(`/wails/custom.js`);function Nn(){return yt(1211788486)}function Pn(){return yt(853311305)}function Fn(e){return yt(465937298,e)}function In(e){return yt(2463093517,e)}var Ln=class{getRepoRoot(){return Pn()}setRepoRoot(e){return In(e)}async getModules(){return await Nn()??[]}runAction(e){return Fn(e)}};function Rn(e){switch(e){case`repo`:case`branch`:case`worktree`:return`source`;case`issue`:case`pr`:return`collaboration`;case`tag`:return`release`;default:return`all`}}function zn(e,t){return t===`all`?e:e.filter(e=>Rn(e.id)===t)}var Bn=`fastgit.desktop.prefs.v1`;function Vn(){return typeof window<`u`&&window.localStorage!==void 0}function Hn(){if(!Vn())return{};try{let e=window.localStorage.getItem(Bn);if(!e)return{};let t=JSON.parse(e);return t&&typeof t==`object`?t:{}}catch{return{}}}function Un(e){Vn()&&window.localStorage.setItem(Bn,JSON.stringify(e))}function Wn(e){return`fastgit.desktop.tabs:${e}`}function Gn(e){if(!Vn()||!e)return null;try{let t=window.localStorage.getItem(Wn(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!=`object`?null:{openedModuleIds:Array.isArray(n.openedModuleIds)?n.openedModuleIds.map(e=>String(e)):[],selectedModuleId:n.selectedModuleId?String(n.selectedModuleId):null}}catch{return null}}function Kn(e,t){!Vn()||!e||window.localStorage.setItem(Wn(e),JSON.stringify(t))}var qn=(0,l.createContext)(null);function Jn(){let e=(0,l.useContext)(qn);if(!e)throw Error(`useAppContext must be used within AppProvider`);return e}var Yn=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),A=e(((e,t)=>{t.exports=Yn()}))(),Xn={title:`Welcome`,command:`-`,exitCode:0,body:`请选择左侧模块并执行动作。`},Zn=new Ln;function Qn(e,t){return t?e.includes(t)?e:[...e,t]:e}function $n(e){return Math.max(220,Math.min(420,e))}function er(e,t,n){let r=zn(e,t);return n[n.length-1]??r[0]?.id??e[0]?.id??null}function tr(){let e=Hn();return{repoPath:``,repoStatus:`加载中...`,modules:[],selectedModuleId:null,openedModuleIds:[],selectedMenu:e.selectedMenu??`source`,modulePaneWidth:$n(e.modulePaneWidth??280),modulePaneCollapsed:e.modulePaneCollapsed??!1,busy:!1,output:Xn}}function nr({children:e}){let[t,n]=(0,l.useState)(tr),r=(0,l.useCallback)(e=>{n(t=>({...t,busy:e}))},[]),i=(0,l.useCallback)(async()=>{r(!0);try{let[e,t]=await Promise.all([Zn.getRepoRoot(),Zn.getModules()]);n(n=>{let r=Gn(e),i=zn(t,n.selectedMenu),a=r?.selectedModuleId??n.selectedModuleId,o=a&&i.some(e=>e.id===a)?a:i[0]?.id??t[0]?.id??null,s=new Set(t.map(e=>e.id)),c=(r?.openedModuleIds??n.openedModuleIds).filter(e=>s.has(e));return{...n,repoPath:e,repoStatus:`当前仓库: ${e}`,modules:t,selectedModuleId:o,openedModuleIds:Qn(c,o)}})}catch(e){n(t=>({...t,output:{title:`Load Error`,command:`bootstrap`,exitCode:1,body:String(e)},repoStatus:`加载失败: ${String(e)}`}))}finally{r(!1)}},[r]),a=(0,l.useCallback)(e=>{n(t=>({...t,selectedModuleId:e,openedModuleIds:Qn(t.openedModuleIds,e)}))},[]),o=(0,l.useCallback)(e=>{n(t=>{if(t.selectedMenu===e)return{...t,modulePaneCollapsed:!t.modulePaneCollapsed};let n=zn(t.modules,e),r=t.selectedModuleId&&n.some(e=>e.id===t.selectedModuleId)?t.selectedModuleId:n[0]?.id??t.modules[0]?.id??null;return{...t,selectedMenu:e,selectedModuleId:r,openedModuleIds:Qn(t.openedModuleIds,r),modulePaneCollapsed:!1}})},[]),s=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.filter(t=>t!==e);if(t.selectedModuleId!==e)return{...t,openedModuleIds:n};let r=er(t.modules,t.selectedMenu,n);return{...t,openedModuleIds:n,selectedModuleId:r}})},[]),c=(0,l.useCallback)(e=>{n(t=>t.openedModuleIds.includes(e)?{...t,openedModuleIds:[e],selectedModuleId:e}:t)},[]),u=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.indexOf(e);if(n<0)return t;let r=t.openedModuleIds.slice(0,n+1),i=t.selectedModuleId&&r.includes(t.selectedModuleId)?t.selectedModuleId:er(t.modules,t.selectedMenu,r);return{...t,openedModuleIds:r,selectedModuleId:i}})},[]),d=(0,l.useCallback)((e,t)=>{e!==t&&n(n=>{let r=n.openedModuleIds.indexOf(e),i=n.openedModuleIds.indexOf(t);if(r<0||i<0)return n;let a=[...n.openedModuleIds];a.splice(r,1);let o=a.indexOf(t);return a.splice(o,0,e),{...n,openedModuleIds:a}})},[]),f=(0,l.useCallback)(()=>{n(e=>{let t=zn(e.modules,e.selectedMenu).find(t=>!e.openedModuleIds.includes(t.id))??e.modules[0];return t?{...e,selectedModuleId:t.id,openedModuleIds:Qn(e.openedModuleIds,t.id),modulePaneCollapsed:!1}:e})},[]),p=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneWidth:$n(e)}))},[]),m=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneCollapsed:e}))},[]),h=(0,l.useCallback)(async e=>{let t=e.trim();if(t){r(!0);try{await Zn.setRepoRoot(t),await i()}catch(e){n(t=>({...t,repoStatus:`切换失败: ${String(e)}`,output:{title:`Set Repository`,command:`SetRepoRoot`,exitCode:1,body:String(e)}}))}finally{r(!1)}}},[i,r]),g=(0,l.useCallback)(async(e,t,i)=>{r(!0);try{let r=await Zn.runAction({moduleID:e.id,actionID:t.id,values:i});n(n=>({...n,output:{title:`${e.title} / ${t.title}`,command:r.command,exitCode:r.exitCode,body:r.output||`(no output)`}}))}catch(r){n(n=>({...n,output:{title:`${e.title} / ${t.title}`,command:`RunAction`,exitCode:1,body:String(r)}}))}finally{r(!1)}},[r]),_=(0,l.useMemo)(()=>t.selectedModuleId?t.modules.find(e=>e.id===t.selectedModuleId)??null:null,[t.modules,t.selectedModuleId]),v=(0,l.useMemo)(()=>zn(t.modules,t.selectedMenu),[t.modules,t.selectedMenu]);(0,l.useEffect)(()=>{Un({selectedMenu:t.selectedMenu,modulePaneWidth:t.modulePaneWidth,modulePaneCollapsed:t.modulePaneCollapsed})},[t.modulePaneCollapsed,t.modulePaneWidth,t.selectedMenu]),(0,l.useEffect)(()=>{if(!t.repoPath)return;let e=new Set(t.modules.map(e=>e.id)),n=t.openedModuleIds.filter(t=>e.has(t)),r=t.selectedModuleId&&e.has(t.selectedModuleId)?t.selectedModuleId:null;Kn(t.repoPath,{openedModuleIds:n,selectedModuleId:r})},[t.modules,t.openedModuleIds,t.repoPath,t.selectedModuleId]);let y=(0,l.useMemo)(()=>({state:t,selectedModule:_,filteredModules:v,setSelectedModule:a,closeModuleTab:s,closeOtherModuleTabs:c,closeTabsToRight:u,reorderModuleTabs:d,addModuleTab:f,setSelectedMenu:o,setModulePaneWidth:p,setModulePaneCollapsed:m,refresh:i,switchRepo:h,runAction:g}),[t,_,v,a,s,c,u,d,f,o,p,m,i,h,g]);return(0,A.jsx)(qn.Provider,{value:y,children:e})}var rr=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),ir=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),ar=e=>{let t=ir(e);return t.charAt(0).toUpperCase()+t.slice(1)},or=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),sr=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},cr={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},lr=(0,l.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,l.createElement)(`svg`,{ref:c,...cr,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:or(`lucide`,i),...!a&&!sr(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,l.createElement)(e,t)),...Array.isArray(a)?a:[a]])),ur=(e,t)=>{let n=(0,l.forwardRef)(({className:n,...r},i)=>(0,l.createElement)(lr,{ref:i,iconNode:t,className:or(`lucide-${rr(ar(e))}`,`lucide-${e}`,n),...r}));return n.displayName=ar(e),n},dr=ur(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),fr=ur(`folder-git-2`,[[`path`,{d:`M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5`,key:`1w6njk`}],[`circle`,{cx:`13`,cy:`12`,r:`2`,key:`1j92g6`}],[`path`,{d:`M18 19c-2.8 0-5-2.2-5-5v8`,key:`pkpw2h`}],[`circle`,{cx:`20`,cy:`19`,r:`2`,key:`1obnsp`}]]),pr=ur(`git-fork`,[[`circle`,{cx:`12`,cy:`18`,r:`3`,key:`1mpf1b`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`path`,{d:`M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9`,key:`1uq4wg`}],[`path`,{d:`M12 12v3`,key:`158kv8`}]]),mr=ur(`layout-grid`,[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]),hr=ur(`panel-right-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m8 9 3 3-3 3`,key:`12hl5m`}]]),gr=ur(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),_r=ur(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),vr=ur(`tags`,[[`path`,{d:`M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z`,key:`16rjxf`}],[`path`,{d:`M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193`,key:`178nd4`}],[`circle`,{cx:`10.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`12ikhr`}]]),yr=ur(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function br(...e){return e.filter(Boolean).join(` `)}function xr({variant:e=`default`,className:t,children:n,...r}){return(0,A.jsx)(`button`,{className:br(`ui-button`,`ui-button--${e}`,t),...r,children:n})}var Sr={source:`源码与仓库`,collaboration:`协作与评审`,release:`发布与版本`,all:`全部模块`};function Cr(){let{state:e,filteredModules:t,setSelectedModule:n,setModulePaneCollapsed:r,refresh:i}=Jn();return(0,A.jsxs)(`aside`,{className:`module-pane`,children:[(0,A.jsxs)(`div`,{className:`module-pane__header`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{children:Sr[e.selectedMenu]??`模块`}),(0,A.jsxs)(`p`,{children:[t.length,` 个模块`]})]}),(0,A.jsxs)(`div`,{className:`module-pane__actions`,children:[(0,A.jsx)(xr,{variant:`ghost`,onClick:()=>void i(),children:`刷新`}),(0,A.jsx)(xr,{variant:`ghost`,className:`module-pane__collapse`,onClick:()=>r(!0),children:(0,A.jsx)(hr,{size:14})})]})]}),(0,A.jsxs)(`div`,{className:`module-pane__list`,children:[t.map(t=>(0,A.jsxs)(`button`,{className:br(`module-pane__item`,e.selectedModuleId===t.id&&`module-pane__item--active`),onClick:()=>n(t.id),type:`button`,children:[(0,A.jsx)(`strong`,{children:t.title}),(0,A.jsx)(`span`,{children:t.description})]},t.id)),t.length===0&&(0,A.jsx)(`div`,{className:`module-pane__empty`,children:`当前菜单下暂无模块`})]})]})}var wr=[{id:`source`,label:`源码`,icon:pr},{id:`collaboration`,label:`协作`,icon:dr},{id:`release`,label:`发布`,icon:vr},{id:`all`,label:`全部`,icon:mr}];function Tr(){let{state:e,setSelectedMenu:t,refresh:n}=Jn();return(0,A.jsxs)(`aside`,{className:`sidebar-menu-panel`,children:[(0,A.jsx)(`div`,{className:`sidebar-menu-panel__group`,children:wr.map(n=>{let r=n.icon;return(0,A.jsxs)(`button`,{className:br(`sidebar-menu-panel__item`,e.selectedMenu===n.id&&`sidebar-menu-panel__item--active`),onClick:()=>t(n.id),title:n.label,type:`button`,children:[(0,A.jsx)(r,{size:18,strokeWidth:2}),(0,A.jsx)(`span`,{children:n.label})]},n.id)})}),(0,A.jsxs)(`div`,{className:`sidebar-menu-panel__footer`,children:[(0,A.jsx)(xr,{variant:`ghost`,className:`sidebar-menu-panel__refresh`,onClick:()=>void n(),children:(0,A.jsx)(_r,{size:14})}),(0,A.jsx)(`span`,{children:e.modulePaneCollapsed?`已收起`:e.busy?`运行中`:`空闲`})]})]})}function Er({className:e,...t}){return(0,A.jsx)(`input`,{className:br(`ui-input`,e),...t})}function Dr(e){let t=new FormData(e),n={};for(let[e,r]of t.entries())n[e]=String(r).trim();return n}function Or(){let{selectedModule:e,runAction:t}=Jn();if(!e)return(0,A.jsx)(`section`,{className:`module-actions`,children:(0,A.jsx)(`div`,{className:`empty-state`,children:`未找到模块,请刷新。`})});let n=e.actions??[],r=n=>r=>{r.preventDefault(),t(e,n,Dr(r.currentTarget))};return(0,A.jsxs)(`section`,{className:`module-actions`,children:[(0,A.jsxs)(`header`,{className:`module-actions__header`,children:[(0,A.jsx)(`h2`,{children:e.title}),(0,A.jsx)(`p`,{children:e.description})]}),(0,A.jsx)(`div`,{className:`module-actions__grid`,children:n.map((e,t)=>(0,A.jsxs)(`article`,{className:`action-card`,style:{animationDelay:`${t*60}ms`},children:[(0,A.jsxs)(`div`,{className:`action-card__meta`,children:[(0,A.jsx)(`h3`,{children:e.title}),(0,A.jsx)(`p`,{children:e.description})]}),(0,A.jsxs)(`form`,{onSubmit:r(e),className:`action-card__form`,children:[(0,A.jsx)(`div`,{className:`action-card__fields`,children:(e.fields??[]).map(e=>(0,A.jsxs)(`label`,{className:`action-field`,children:[(0,A.jsx)(`span`,{children:e.label}),(0,A.jsx)(Er,{name:e.key,placeholder:e.placeholder||e.label,defaultValue:e.default||``,required:!!e.required})]},e.key))}),(0,A.jsx)(`div`,{className:`action-card__footer`,children:(0,A.jsx)(xr,{type:`submit`,children:`执行`})})]})]},e.id))})]})}function kr(){let{state:e}=Jn();return(0,A.jsxs)(`section`,{className:`output-panel`,children:[(0,A.jsxs)(`header`,{className:`output-panel__header`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{children:e.output.title}),(0,A.jsx)(`p`,{children:e.output.command})]}),(0,A.jsxs)(`span`,{className:e.output.exitCode===0?`status-pill status-pill--ok`:`status-pill status-pill--error`,children:[`exit `,e.output.exitCode]})]}),(0,A.jsx)(`pre`,{className:`output-panel__body`,children:e.output.body})]})}function Ar(){let{state:e,switchRepo:t}=Jn(),[n,r]=(0,l.useState)(``),i=n||e.repoPath;return(0,A.jsxs)(`section`,{className:`workspace-panel`,children:[(0,A.jsxs)(`header`,{children:[(0,A.jsx)(`h2`,{children:`Workspace`}),(0,A.jsx)(`p`,{children:e.busy?`运行中...`:`准备就绪`})]}),(0,A.jsxs)(`div`,{className:`workspace-panel__row`,children:[(0,A.jsx)(Er,{value:i,onChange:e=>r(e.target.value),placeholder:`/path/to/repository`}),(0,A.jsx)(xr,{variant:`primary`,onClick:()=>void t(i),children:`切换仓库`})]}),(0,A.jsx)(`p`,{className:`workspace-panel__status`,children:e.repoStatus})]})}function jr(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??`workspace`}function Mr(){let{state:e,addModuleTab:t,closeModuleTab:n,closeOtherModuleTabs:r,closeTabsToRight:i,reorderModuleTabs:a,setSelectedModule:o}=Jn(),s=jr(e.repoPath),[c,u]=(0,l.useState)(null),[d,f]=(0,l.useState)(null),[p,m]=(0,l.useState)(null),h=e.openedModuleIds.map(t=>e.modules.find(e=>e.id===t)).filter(e=>e!==void 0),g=h.length,_=(0,l.useMemo)(()=>p?h.find(e=>e.id===p.moduleId)??null:null,[p,h]),v=_?h.findIndex(e=>e.id===_.id):-1,y=g>1,b=v>=0&&v{let e=()=>m(null),t=e=>{e.key===`Escape`&&m(null)};return window.addEventListener(`pointerdown`,e),window.addEventListener(`keydown`,t),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,t)}},[]);let x=(e,t)=>{u(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t)},ee=(e,t)=>{e.preventDefault(),c&&c!==t&&f(t)},S=(e,t)=>{e.preventDefault(),!(!c||c===t)&&(a(c,t),f(null),u(null))},C=(e,t)=>{e.preventDefault(),e.stopPropagation(),m({x:e.clientX,y:e.clientY,moduleId:t})},te=e=>{e(),m(null)};return(0,A.jsxs)(`header`,{className:`tabs-header app-drag-region`,children:[(0,A.jsxs)(`div`,{className:`tabs-repo app-no-drag-region`,children:[(0,A.jsx)(fr,{size:14}),(0,A.jsx)(`span`,{children:s})]}),(0,A.jsx)(`div`,{className:`tabs-track app-no-drag-region`,children:h.map(t=>{let r=e.selectedModuleId===t.id;return(0,A.jsxs)(`div`,{className:[`tabs-track__item`,r?`tabs-track__item--active`:``,d===t.id?`tabs-track__item--drag-over`:``].filter(Boolean).join(` `),onClick:()=>o(t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o(t.id))},onContextMenu:e=>C(e,t.id),draggable:g>1,onDragStart:e=>x(e,t.id),onDragOver:e=>ee(e,t.id),onDrop:e=>S(e,t.id),onDragEnd:()=>{u(null),f(null)},role:`button`,tabIndex:0,"aria-label":`switch to ${t.title}`,"aria-pressed":r,children:[(0,A.jsx)(`span`,{children:t.title}),(0,A.jsx)(`button`,{className:`tabs-track__close`,onClick:e=>{e.stopPropagation(),n(t.id)},onContextMenu:e=>C(e,t.id),type:`button`,"aria-label":`close ${t.title}`,children:(0,A.jsx)(yr,{size:13})})]},t.id)})}),(0,A.jsx)(`button`,{className:`tabs-add app-no-drag-region`,onClick:t,type:`button`,"aria-label":`new tab`,children:(0,A.jsx)(gr,{size:14})}),p&&_&&(0,A.jsxs)(`div`,{className:`tabs-menu app-no-drag-region`,style:{left:`${p.x}px`,top:`${p.y}px`},onPointerDown:e=>e.stopPropagation(),children:[(0,A.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>n(_.id)),disabled:!y,children:`关闭标签`}),(0,A.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>r(_.id)),disabled:!y,children:`关闭其他标签`}),(0,A.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>i(_.id)),disabled:!b,children:`关闭右侧标签`})]})]})}function Nr(){let{state:e,setModulePaneWidth:t}=Jn(),[n,r]=(0,l.useState)(!1),i=n=>{if(window.innerWidth<=900||e.modulePaneCollapsed)return;r(!0);let i=n.clientX,a=e.modulePaneWidth,o=e=>{t(a+(e.clientX-i))},s=()=>{r(!1),window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s)},a={"--module-pane-width":`${e.modulePaneWidth}px`};return(0,A.jsxs)(`main`,{className:`desktop-shell`,children:[(0,A.jsx)(Mr,{}),(0,A.jsxs)(`section`,{className:[`desktop-body`,n?`desktop-body--dragging`:``,e.modulePaneCollapsed?`desktop-body--pane-collapsed`:``].filter(Boolean).join(` `),style:a,children:[(0,A.jsx)(Tr,{}),(0,A.jsxs)(`div`,{className:`module-pane-wrap`,children:[(0,A.jsx)(Cr,{}),(0,A.jsx)(`div`,{className:`module-pane-resizer`,onMouseDown:i,role:`separator`,"aria-orientation":`vertical`,"aria-label":`resize sidebar`})]}),(0,A.jsxs)(`div`,{className:`desktop-main`,children:[(0,A.jsx)(Ar,{}),(0,A.jsx)(Or,{}),(0,A.jsx)(kr,{})]})]})]})}function Pr(){let{refresh:e}=Jn();return(0,l.useEffect)(()=>{e()},[e]),(0,A.jsx)(Nr,{})}function Fr(){return(0,A.jsx)(nr,{children:(0,A.jsx)(Pr,{})})}var Ir=document.getElementById(`app`);if(!Ir)throw Error(`#app not found`);(0,u.createRoot)(Ir).render((0,A.jsx)(l.StrictMode,{children:(0,A.jsx)(Fr,{})})); \ No newline at end of file diff --git a/desktop/frontend/dist/assets/index-CFCFzOqg.css b/desktop/frontend/dist/assets/index-CFCFzOqg.css deleted file mode 100644 index d766842..0000000 --- a/desktop/frontend/dist/assets/index-CFCFzOqg.css +++ /dev/null @@ -1 +0,0 @@ -:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f2f5f9;--panel:#fff;--text:#1f2b3a;--muted:#607085;--line:#d4dde8;--primary:#1363df;--primary-strong:#0f4ca8}*{box-sizing:border-box}body{background:radial-gradient(circle at 0 0, #dfe8ff 0%, var(--bg) 42%);color:var(--text);margin:0;font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.layout{gap:16px;max-width:980px;margin:0 auto;padding:24px;display:grid}.header h1{margin:0;font-size:28px}.header p{color:var(--muted);margin:6px 0 0}.panel{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px}.row{gap:8px;display:flex}.input{border:1px solid var(--line);border-radius:8px;flex:1;min-width:0;padding:10px 12px}.btn{border:1px solid var(--line);cursor:pointer;background:#fff;border-radius:8px;padding:10px 14px}.btn.primary{background:var(--primary);color:#fff;border-color:#0000}.btn.primary:hover{background:var(--primary-strong)}.quick-actions{flex-wrap:wrap;gap:8px;margin-top:10px;display:flex}.chip{border:1px solid var(--line);cursor:pointer;background:#fff;border-radius:999px;padding:6px 12px}.output-panel{min-height:320px}.output-head{color:var(--muted);justify-content:space-between;margin-bottom:8px;display:flex}.output{color:#d7e0ef;background:#0b1220;border-radius:8px;min-height:250px;margin:0;padding:12px;overflow:auto}small{color:var(--muted);margin-top:6px;display:inline-block}@media (width<=720px){.row{flex-direction:column}} diff --git a/desktop/frontend/dist/assets/index-jX5N17in.js b/desktop/frontend/dist/assets/index-jX5N17in.js deleted file mode 100644 index 97b1ac4..0000000 --- a/desktop/frontend/dist/assets/index-jX5N17in.js +++ /dev/null @@ -1,44 +0,0 @@ -(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=typeof window<`u`&&typeof document<`u`,t=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function n(e=21){let n=``,r=e|0;for(;r--;)n+=t[Math.random()*64|0];return n}function r(){return window.location.origin+`/wails/runtime`}var i=512*1024,a=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10,IOS:11,Android:12}),o=n(),s=null;function c(e,t=``){return function(n,r=null){return l(e,n,t,r)}}async function l(e,t,n,a){if(s)return s.call(e,t,n,a);let c=new URL(r()),l={object:e,method:t};a!=null&&(l.args=a);let u={"x-wails-client-id":o,"Content-Type":`application/json`};n&&(u[`x-wails-window-name`]=n);let d=JSON.stringify(l),f;if(f=d.length>i?await ee(c,u,d):await fetch(c,{method:`POST`,headers:u,body:d}),!f.ok)throw Error(await f.text());return(f.headers.get(`Content-Type`)?.indexOf(`application/json`)??-1)===-1?f.text():f.json()}async function ee(e,t,r){let a=n(),o=new TextEncoder().encode(r),s=Math.ceil(o.length/i);for(let n=0;n{let i=e.get(t);if(i){if(e.delete(t),r){i.reject(Error(r));return}try{let e=JSON.parse(n??`{}`);if(!e.ok){i.reject(Error(e.error??`unknown runtime call error`));return}i.resolve(`text`in e?e.text:e.data)}catch(e){i.reject(e)}}},s={call(t,r,i,a){return new Promise((s,c)=>{let l=n();e.set(l,{resolve:s,reject:c});try{u.invokeAsync(l,JSON.stringify({object:t,method:r,windowName:i,args:a??null,clientId:o}))}catch(t){e.delete(l),c(t)}})}}}a.System;var d=(function(){try{if(window.chrome?.webview?.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if(window.webkit?.messageHandlers?.external?.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external);if(window.wails?.invoke)return e=>window.wails.invoke(typeof e==`string`?e:JSON.stringify(e))}catch{}return console.warn(` -%c⚠️ Browser Environment Detected %c - -%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. -More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development -`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function f(e){d?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function p(){return!!window._wails?.environment?.Debug}function m(){return new MouseEvent(`mousedown`).buttons===0}function h(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}e&&document.addEventListener(`DOMContentLoaded`,()=>{}),e&&window.addEventListener(`contextmenu`,oe);var re=c(a.ContextMenu),ie=0;function ae(e,t,n,r){re(ie,{id:e,x:t,y:n,data:r})}function oe(e){let t=h(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);ae(n,e.clientX,e.clientY,r)}else se(e,t)}function se(e,t){if(p())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{y=e,y||(b=x=!1,A())});var T=!1;function le(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function E(){if(!T&&!le()){window.addEventListener(`mousedown`,k,{capture:!0}),window.addEventListener(`mousemove`,k,{capture:!0}),window.addEventListener(`mouseup`,k,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,ue,{capture:!0});T=!0}}if(e){E(),document.addEventListener(`DOMContentLoaded`,E,{once:!0});let e=0,t=window.setInterval(()=>{if(T){window.clearInterval(t);return}E(),++e>100&&window.clearInterval(t)},50)}function ue(e){(v||x)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var D=0,de=1,O=2;function k(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=D,w||(n=C|1<{n=e,r=t}),this.constructor[Ae]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[V]:{configurable:!1,enumerable:!1,writable:!0,value:null},[ke]:{configurable:!1,enumerable:!1,writable:!1,value:Me(i,a)}});let o=Pe(i,a);try{e(Ne(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[ke](new z(`Promise cancelled.`,{cause:t})),Re(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(R(t)||(t=Fe),R(n)||(n=Ie),t===Fe&&n==Ie)return new e(e=>e(this));let i={};return this[V]=i,new e((e,r)=>{super.then(n=>{var a;this[V]===i&&(this[V]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[V]===i&&(this[V]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return R(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[Ae](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>H(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>H(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>H(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>H(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function Me(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new B(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new B(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function Ne(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(R(r)){try{let r=n.cancel;if(R(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?Me(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=Pe(e,i);try{Reflect.apply(r,n,[Ne(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function Pe(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof z&&t.reason instanceof z&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new B(e.promise,n))}else t.settled=!0,e.reject(n)}}function H(e,t,n){let r=[];for(let i of t){let t;try{if(!R(i.then)||(t=i.cancel,!R(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new B(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new B(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function Fe(e){return e}function Ie(e){throw e}function Le(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function Re(e){let t=e[V]??{};return`promise`in t||Object.assign(t,U()),e[V]??(t.resolve(),e[V]=t),t.promise}var U=Promise.withResolvers;U=U&&typeof U==`function`?U.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},e&&(window._wails=window._wails||{});var ze=c(a.Call),Be=c(a.CancelCall),W=new Map,Ve=0,He=0;function Ue(){let e;do e=n();while(W.has(e));return e}function We(e){let t=Ue(),n=je.withResolvers();W.set(t,{resolve:n.resolve,reject:n.reject});let r=ze(Ve,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,W.delete(t),n.resolve(e)},e=>{i=!1,W.delete(t),n.reject(e)});let a=()=>(W.delete(t),Be(He,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function G(e,...t){return We({methodID:e,args:t})}var Ge=`data-file-drop-target`,K=`file-drop-target-active`,q=null,Ke=0,qe=1,Je=2,Ye=3,Xe=4,Ze=5,Qe=6,$e=7,et=8,tt=9,nt=10,rt=11,it=12,at=13,ot=14,st=15,ct=16,lt=17,ut=18,dt=19,ft=20,pt=21,mt=22,ht=23,gt=24,_t=25,vt=26,yt=27,bt=28,xt=29,St=30,Ct=31,wt=32,Tt=33,Et=34,Dt=35,Ot=36,kt=37,At=38,jt=39,Mt=40,Nt=41,Pt=42,Ft=43,It=44,Lt=45,Rt=46,zt=47,Bt=48,Vt=49,Ht=50,Ut=51,Wt=52;function J(e){return e?e.closest(`[${Ge}]`):null}function Gt(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function Kt(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var Y=!1;function qt(){Y=!1,q&&=(q.classList.remove(K),null)}function Jt(){window._wails?.flags?.enableFileDrop!==!1&&(Y=!0)}function Yt(){qt()}function Xt(e,t){if(!Y||window._wails?.flags?.enableFileDrop===!1)return;let n=J(document.elementFromPoint(e,t));q&&q!==n&&q.classList.remove(K),n?(n.classList.add(K),q=n):q=null}var X=Symbol(`caller`),Zt=new class e{constructor(t=``){this[X]=c(a.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[X](Ke)}Center(){return this[X](qe)}Close(){return this[X](Je)}DisableSizeConstraints(){return this[X](Ye)}EnableSizeConstraints(){return this[X](Xe)}Focus(){return this[X](Ze)}ForceReload(){return this[X](Qe)}Fullscreen(){return this[X]($e)}GetScreen(){return this[X](et)}GetZoom(){return this[X](tt)}Height(){return this[X](nt)}Hide(){return this[X](rt)}IsFocused(){return this[X](it)}IsFullscreen(){return this[X](at)}IsMaximised(){return this[X](ot)}IsMinimised(){return this[X](st)}Maximise(){return this[X](ct)}Minimise(){return this[X](lt)}Name(){return this[X](ut)}OpenDevTools(){return this[X](dt)}RelativePosition(){return this[X](ft)}Reload(){return this[X](pt)}Resizable(){return this[X](mt)}Restore(){return this[X](ht)}SetPosition(e,t){return this[X](gt,{x:e,y:t})}SetAlwaysOnTop(e){return this[X](_t,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[X](vt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[X](yt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[X](bt,{enabled:e})}SetMaxSize(e,t){return this[X](xt,{width:e,height:t})}SetMinSize(e,t){return this[X](St,{width:e,height:t})}SetRelativePosition(e,t){return this[X](Ct,{x:e,y:t})}SetResizable(e){return this[X](wt,{resizable:e})}SetSize(e,t){return this[X](Tt,{width:e,height:t})}SetTitle(e){return this[X](Et,{title:e})}SetZoom(e){return this[X](Dt,{zoom:e})}Show(){return this[X](Ot)}Size(){return this[X](kt)}ToggleFullscreen(){return this[X](At)}ToggleMaximise(){return this[X](jt)}ToggleFrameless(){return this[X](Mt)}UnFullscreen(){return this[X](Nt)}UnMaximise(){return this[X](Pt)}UnMinimise(){return this[X](Ft)}Width(){return this[X](It)}Zoom(){return this[X](Lt)}ZoomIn(){return this[X](Rt)}ZoomOut(){return this[X](zt)}ZoomReset(){return this[X](Bt)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=J(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=J(document.elementFromPoint(e.clientX,e.clientY));q&&q!==n&&q.classList.remove(K),n?(n.classList.add(K),e.dataTransfer.dropEffect=`copy`,q=n):(e.dataTransfer.dropEffect=`none`,q=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=J(document.elementFromPoint(e.clientX,e.clientY));q&&q!==t&&q.classList.remove(K),t?(t.classList.contains(K)||t.classList.add(K),e.dataTransfer.dropEffect=`copy`,q=t):(e.dataTransfer.dropEffect=`none`,q=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||q&&!q.contains(e.relatedTarget))&&(q&&=(q.classList.remove(K),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,q&&=(q.classList.remove(K),null),Gt()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&Kt(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&Qt(),e&&(window._wails=window._wails||{}),e&&(window._wails.invoke=f,window._wails.clientId=o),e&&(window._wails.handlePlatformFileDrop=Zt.HandlePlatformFileDrop.bind(Zt)),e&&(window._wails.handleDragEnter=Jt,window._wails.handleDragLeave=Yt,window._wails.handleDragOver=Xt),e&&f(`wails:runtime:ready`);function $t(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}e&&$t(`/wails/custom.js`);function en(){return G(853311305)}function tn(e){return G(848143838,e)}function nn(e){return G(2463093517,e)}var rn=document.querySelector(`#app`);rn.innerHTML=` -
-
-

fastgit desktop

-

在桌面里执行 fastgit 命令并查看输出

-
- -
- -
- - -
- -
- -
- -
- - -
-
- - - - -
-
- -
-
- Output - -
-
等待执行命令...
-
-
-`;var an=document.querySelector(`#repo`),Z=document.querySelector(`#repo-hint`),Q=document.querySelector(`#cmd`),on=document.querySelector(`#run`),sn=document.querySelector(`#save-repo`),cn=document.querySelector(`#output`),ln=document.querySelector(`#meta`);async function un(){try{let e=await en();an.value=e,Z.textContent=`当前仓库: ${e}`}catch(e){Z.textContent=`读取仓库失败: ${String(e)}`}}async function $(){let e=Q.value.trim();if(e){on.disabled=!0,cn.textContent=`running...`,ln.textContent=``;try{let t=await tn(e);cn.textContent=t.output||`(no output)`,ln.textContent=`${t.command} | exit=${t.exitCode}`}catch(e){cn.textContent=`执行失败: ${String(e)}`}finally{on.disabled=!1}}}sn.addEventListener(`click`,async()=>{let e=an.value.trim();if(e)try{await nn(e),Z.textContent=`当前仓库: ${e}`}catch(e){Z.textContent=`切换失败: ${String(e)}`}}),on.addEventListener(`click`,()=>void $()),Q.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.preventDefault(),$())}),document.querySelectorAll(`.chip`).forEach(e=>{e.addEventListener(`click`,()=>{Q.value=e.dataset.cmd||``,$()})}),un(); \ No newline at end of file diff --git a/desktop/frontend/dist/index.html b/desktop/frontend/dist/index.html index b723c20..66a3a2b 100644 --- a/desktop/frontend/dist/index.html +++ b/desktop/frontend/dist/index.html @@ -4,8 +4,8 @@ fastgit desktop - - + +
diff --git a/desktop/frontend/dist/wails/custom.js b/desktop/frontend/dist/wails/custom.js new file mode 100644 index 0000000..8704c50 --- /dev/null +++ b/desktop/frontend/dist/wails/custom.js @@ -0,0 +1,2 @@ +// Optional Wails runtime extension hook. +// Kept intentionally minimal to avoid 404 on /wails/custom.js. diff --git a/desktop/frontend/index.html b/desktop/frontend/index.html index eeb937a..c616cfe 100644 --- a/desktop/frontend/index.html +++ b/desktop/frontend/index.html @@ -7,6 +7,6 @@
- + diff --git a/desktop/frontend/package-lock.json b/desktop/frontend/package-lock.json index 98c2c74..bd5ed30 100644 --- a/desktop/frontend/package-lock.json +++ b/desktop/frontend/package-lock.json @@ -8,9 +8,15 @@ "name": "fastgit-desktop-frontend", "version": "0.0.1", "dependencies": { - "@wailsio/runtime": "^3.0.0-alpha.18" + "@wailsio/runtime": "^3.0.0-alpha.18", + "lucide-react": "^0.542.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" }, "devDependencies": { + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.2", + "@vitejs/plugin-react": "^5.1.0", "typescript": "^6.0.3", "vite": "^8.1.0" }, @@ -18,6 +24,288 @@ "node": ">=20.19.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@emnapi/core": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", @@ -517,6 +805,56 @@ "node": ">=18" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", @@ -802,12 +1140,205 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@wailsio/runtime": { "version": "3.0.0-alpha.94", "resolved": "https://registry.npmjs.org/@wailsio/runtime/-/runtime-3.0.0-alpha.94.tgz", "integrity": "sha512-jtOtyWLDLop9NfU373sA43NjyGntxDFUIHY6kzmArz5HGn66Ok3vl9N2nIyVs7cArvADxk/mBBZ9wXOX7R0NFA==", "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.40", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", + "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -817,6 +1348,13 @@ "node": ">=8" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.380", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.380.tgz", + "integrity": "sha512-W6d5AbuEoRayO447cqrg6lKJIlscgRnnxOZl/08kfV71BQDoEBC7Wwis68z87LjyK6f4kWyTaubuDbhHKrZkbA==", + "dev": true, + "license": "ISC" + }, "node_modules/esbuild": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", @@ -861,6 +1399,16 @@ "@esbuild/win32-x64": "0.28.1" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -893,6 +1441,49 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -1142,6 +1733,31 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.542.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.542.0.tgz", + "integrity": "sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.15", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", @@ -1161,6 +1777,16 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-releases": { + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1210,6 +1836,37 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rolldown": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", @@ -1243,6 +1900,22 @@ "@rolldown/binding-win32-x64-msvc": "1.1.3" } }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1290,6 +1963,37 @@ "node": ">=14.17" } }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/vite": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz", @@ -1366,6 +2070,13 @@ "optional": true } } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" } } } diff --git a/desktop/frontend/package.json b/desktop/frontend/package.json index 0bd392e..3a00478 100644 --- a/desktop/frontend/package.json +++ b/desktop/frontend/package.json @@ -12,9 +12,15 @@ "preview": "vite preview" }, "dependencies": { - "@wailsio/runtime": "^3.0.0-alpha.18" + "@wailsio/runtime": "^3.0.0-alpha.18", + "lucide-react": "^0.542.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" }, "devDependencies": { + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.2", + "@vitejs/plugin-react": "^5.1.0", "typescript": "^6.0.3", "vite": "^8.1.0" } diff --git a/desktop/frontend/public/wails/custom.js b/desktop/frontend/public/wails/custom.js new file mode 100644 index 0000000..8704c50 --- /dev/null +++ b/desktop/frontend/public/wails/custom.js @@ -0,0 +1,2 @@ +// Optional Wails runtime extension hook. +// Kept intentionally minimal to avoid 404 on /wails/custom.js. diff --git a/desktop/frontend/src/app/app.tsx b/desktop/frontend/src/app/app.tsx new file mode 100644 index 0000000..68928ac --- /dev/null +++ b/desktop/frontend/src/app/app.tsx @@ -0,0 +1,23 @@ +import { useEffect } from "react"; + +import { AppProvider } from "./providers/app-provider"; +import { useAppContext } from "./providers/app-context"; +import { DesktopLayout } from "../layouts/desktop-layout"; + +function AppBootstrap() { + const { refresh } = useAppContext(); + + useEffect(() => { + void refresh(); + }, [refresh]); + + return ; +} + +export function App() { + return ( + + + + ); +} diff --git a/desktop/frontend/src/app/providers/app-context.ts b/desktop/frontend/src/app/providers/app-context.ts new file mode 100644 index 0000000..8602589 --- /dev/null +++ b/desktop/frontend/src/app/providers/app-context.ts @@ -0,0 +1,31 @@ +import { createContext, useContext } from "react"; + +import type { ActionRunRequest, AppState, DesktopModule, ModuleAction, SidebarMenuType } from "../types"; + +export interface AppContextValue { + state: AppState; + selectedModule: DesktopModule | null; + filteredModules: DesktopModule[]; + setSelectedModule(moduleId: string): void; + closeModuleTab(moduleId: string): void; + closeOtherModuleTabs(moduleId: string): void; + closeTabsToRight(moduleId: string): void; + reorderModuleTabs(sourceId: string, targetId: string): void; + addModuleTab(): void; + setSelectedMenu(menu: SidebarMenuType): void; + setModulePaneWidth(width: number): void; + setModulePaneCollapsed(collapsed: boolean): void; + refresh(): Promise; + switchRepo(path: string): Promise; + runAction(module: DesktopModule, action: ModuleAction, values: ActionRunRequest["values"]): Promise; +} + +export const AppContext = createContext(null); + +export function useAppContext(): AppContextValue { + const value = useContext(AppContext); + if (!value) { + throw new Error("useAppContext must be used within AppProvider"); + } + return value; +} diff --git a/desktop/frontend/src/app/providers/app-provider.tsx b/desktop/frontend/src/app/providers/app-provider.tsx new file mode 100644 index 0000000..503a421 --- /dev/null +++ b/desktop/frontend/src/app/providers/app-provider.tsx @@ -0,0 +1,379 @@ +import type { ReactNode } from "react"; +import { useCallback, useEffect, useMemo, useState } from "react"; + +import { BackendService } from "../../services/backend"; +import { filterModulesByMenu } from "../../lib/module-groups"; +import { loadPrefs, loadWorkspaceTabs, savePrefs, saveWorkspaceTabs } from "../../lib/persistence"; +import { AppContext } from "./app-context"; +import type { AppState, DesktopModule, ModuleAction, OperationOutput, SidebarMenuType } from "../types"; + +interface AppProviderProps { + children: ReactNode; +} + +const initialOutput: OperationOutput = { + title: "Welcome", + command: "-", + exitCode: 0, + body: "请选择左侧模块并执行动作。", +}; + +const backend = new BackendService(); + +function upsertOpened(opened: string[], moduleId: string | null): string[] { + if (!moduleId) { + return opened; + } + return opened.includes(moduleId) ? opened : [...opened, moduleId]; +} + +function clampPaneWidth(width: number): number { + return Math.max(220, Math.min(420, width)); +} + +function fallbackSelection(modules: DesktopModule[], selectedMenu: SidebarMenuType, opened: string[]): string | null { + const filtered = filterModulesByMenu(modules, selectedMenu); + const lastOpened = opened[opened.length - 1]; + return lastOpened ?? filtered[0]?.id ?? modules[0]?.id ?? null; +} + +function createInitialState(): AppState { + const prefs = loadPrefs(); + return { + repoPath: "", + repoStatus: "加载中...", + modules: [], + selectedModuleId: null, + openedModuleIds: [], + selectedMenu: prefs.selectedMenu ?? "source", + modulePaneWidth: clampPaneWidth(prefs.modulePaneWidth ?? 280), + modulePaneCollapsed: prefs.modulePaneCollapsed ?? false, + busy: false, + output: initialOutput, + }; +} + +export function AppProvider({ children }: AppProviderProps) { + const [state, setState] = useState(createInitialState); + + const setBusy = useCallback((busy: boolean) => { + setState((prev) => ({ ...prev, busy })); + }, []); + + const refresh = useCallback(async () => { + setBusy(true); + try { + const [repoPath, modules] = await Promise.all([backend.getRepoRoot(), backend.getModules()]); + setState((prev) => { + const storedTabs = loadWorkspaceTabs(repoPath); + const filtered = filterModulesByMenu(modules, prev.selectedMenu); + const selectedCandidate = storedTabs?.selectedModuleId ?? prev.selectedModuleId; + const nextSelected = + selectedCandidate && filtered.some((module) => module.id === selectedCandidate) + ? selectedCandidate + : filtered[0]?.id ?? modules[0]?.id ?? null; + const availableIDs = new Set(modules.map((module) => module.id)); + const openedCandidate = storedTabs?.openedModuleIds ?? prev.openedModuleIds; + const nextOpened = openedCandidate.filter((id) => availableIDs.has(id)); + + return { + ...prev, + repoPath, + repoStatus: `当前仓库: ${repoPath}`, + modules, + selectedModuleId: nextSelected, + openedModuleIds: upsertOpened(nextOpened, nextSelected), + }; + }); + } catch (error) { + setState((prev) => ({ + ...prev, + output: { + title: "Load Error", + command: "bootstrap", + exitCode: 1, + body: String(error), + }, + repoStatus: `加载失败: ${String(error)}`, + })); + } finally { + setBusy(false); + } + }, [setBusy]); + + const setSelectedModule = useCallback((moduleId: string) => { + setState((prev) => ({ + ...prev, + selectedModuleId: moduleId, + openedModuleIds: upsertOpened(prev.openedModuleIds, moduleId), + })); + }, []); + + const setSelectedMenu = useCallback((menu: SidebarMenuType) => { + setState((prev) => { + if (prev.selectedMenu === menu) { + return { + ...prev, + modulePaneCollapsed: !prev.modulePaneCollapsed, + }; + } + + const filtered = filterModulesByMenu(prev.modules, menu); + const nextSelected = + prev.selectedModuleId && filtered.some((module) => module.id === prev.selectedModuleId) + ? prev.selectedModuleId + : filtered[0]?.id ?? prev.modules[0]?.id ?? null; + return { + ...prev, + selectedMenu: menu, + selectedModuleId: nextSelected, + openedModuleIds: upsertOpened(prev.openedModuleIds, nextSelected), + modulePaneCollapsed: false, + }; + }); + }, []); + + const closeModuleTab = useCallback((moduleId: string) => { + setState((prev) => { + const nextOpened = prev.openedModuleIds.filter((id) => id !== moduleId); + if (prev.selectedModuleId !== moduleId) { + return { + ...prev, + openedModuleIds: nextOpened, + }; + } + + const fallback = fallbackSelection(prev.modules, prev.selectedMenu, nextOpened); + return { + ...prev, + openedModuleIds: nextOpened, + selectedModuleId: fallback, + }; + }); + }, []); + + const closeOtherModuleTabs = useCallback((moduleId: string) => { + setState((prev) => { + if (!prev.openedModuleIds.includes(moduleId)) { + return prev; + } + return { + ...prev, + openedModuleIds: [moduleId], + selectedModuleId: moduleId, + }; + }); + }, []); + + const closeTabsToRight = useCallback((moduleId: string) => { + setState((prev) => { + const index = prev.openedModuleIds.indexOf(moduleId); + if (index < 0) { + return prev; + } + + const nextOpened = prev.openedModuleIds.slice(0, index + 1); + const selectedExists = prev.selectedModuleId ? nextOpened.includes(prev.selectedModuleId) : false; + const nextSelected = selectedExists + ? prev.selectedModuleId + : fallbackSelection(prev.modules, prev.selectedMenu, nextOpened); + return { + ...prev, + openedModuleIds: nextOpened, + selectedModuleId: nextSelected, + }; + }); + }, []); + + const reorderModuleTabs = useCallback((sourceId: string, targetId: string) => { + if (sourceId === targetId) { + return; + } + + setState((prev) => { + const sourceIndex = prev.openedModuleIds.indexOf(sourceId); + const targetIndex = prev.openedModuleIds.indexOf(targetId); + if (sourceIndex < 0 || targetIndex < 0) { + return prev; + } + + const nextOpened = [...prev.openedModuleIds]; + nextOpened.splice(sourceIndex, 1); + const nextTargetIndex = nextOpened.indexOf(targetId); + nextOpened.splice(nextTargetIndex, 0, sourceId); + return { + ...prev, + openedModuleIds: nextOpened, + }; + }); + }, []); + + const addModuleTab = useCallback(() => { + setState((prev) => { + const scope = filterModulesByMenu(prev.modules, prev.selectedMenu); + const candidate = scope.find((module) => !prev.openedModuleIds.includes(module.id)) ?? prev.modules[0]; + if (!candidate) { + return prev; + } + return { + ...prev, + selectedModuleId: candidate.id, + openedModuleIds: upsertOpened(prev.openedModuleIds, candidate.id), + modulePaneCollapsed: false, + }; + }); + }, []); + + const setModulePaneWidth = useCallback((width: number) => { + setState((prev) => ({ + ...prev, + modulePaneWidth: clampPaneWidth(width), + })); + }, []); + + const setModulePaneCollapsed = useCallback((collapsed: boolean) => { + setState((prev) => ({ + ...prev, + modulePaneCollapsed: collapsed, + })); + }, []); + + const switchRepo = useCallback( + async (path: string) => { + const next = path.trim(); + if (!next) { + return; + } + + setBusy(true); + try { + await backend.setRepoRoot(next); + await refresh(); + } catch (error) { + setState((prev) => ({ + ...prev, + repoStatus: `切换失败: ${String(error)}`, + output: { + title: "Set Repository", + command: "SetRepoRoot", + exitCode: 1, + body: String(error), + }, + })); + } finally { + setBusy(false); + } + }, + [refresh, setBusy] + ); + + const runAction = useCallback( + async (module: DesktopModule, action: ModuleAction, values: Record) => { + setBusy(true); + try { + const result = await backend.runAction({ + moduleID: module.id, + actionID: action.id, + values, + }); + setState((prev) => ({ + ...prev, + output: { + title: `${module.title} / ${action.title}`, + command: result.command, + exitCode: result.exitCode, + body: result.output || "(no output)", + }, + })); + } catch (error) { + setState((prev) => ({ + ...prev, + output: { + title: `${module.title} / ${action.title}`, + command: "RunAction", + exitCode: 1, + body: String(error), + }, + })); + } finally { + setBusy(false); + } + }, + [setBusy] + ); + + const selectedModule = useMemo(() => { + if (!state.selectedModuleId) { + return null; + } + return state.modules.find((module) => module.id === state.selectedModuleId) ?? null; + }, [state.modules, state.selectedModuleId]); + + const filteredModules = useMemo( + () => filterModulesByMenu(state.modules, state.selectedMenu), + [state.modules, state.selectedMenu] + ); + + useEffect(() => { + savePrefs({ + selectedMenu: state.selectedMenu, + modulePaneWidth: state.modulePaneWidth, + modulePaneCollapsed: state.modulePaneCollapsed, + }); + }, [state.modulePaneCollapsed, state.modulePaneWidth, state.selectedMenu]); + + useEffect(() => { + if (!state.repoPath) { + return; + } + + const availableIDs = new Set(state.modules.map((module) => module.id)); + const openedModuleIds = state.openedModuleIds.filter((id) => availableIDs.has(id)); + const selectedModuleId = + state.selectedModuleId && availableIDs.has(state.selectedModuleId) ? state.selectedModuleId : null; + + saveWorkspaceTabs(state.repoPath, { + openedModuleIds, + selectedModuleId, + }); + }, [state.modules, state.openedModuleIds, state.repoPath, state.selectedModuleId]); + + const value = useMemo( + () => ({ + state, + selectedModule, + filteredModules, + setSelectedModule, + closeModuleTab, + closeOtherModuleTabs, + closeTabsToRight, + reorderModuleTabs, + addModuleTab, + setSelectedMenu, + setModulePaneWidth, + setModulePaneCollapsed, + refresh, + switchRepo, + runAction, + }), + [ + state, + selectedModule, + filteredModules, + setSelectedModule, + closeModuleTab, + closeOtherModuleTabs, + closeTabsToRight, + reorderModuleTabs, + addModuleTab, + setSelectedMenu, + setModulePaneWidth, + setModulePaneCollapsed, + refresh, + switchRepo, + runAction, + ] + ); + + return {children}; +} diff --git a/desktop/frontend/src/app/types.ts b/desktop/frontend/src/app/types.ts new file mode 100644 index 0000000..0d8eb01 --- /dev/null +++ b/desktop/frontend/src/app/types.ts @@ -0,0 +1,30 @@ +import type { + ActionRunRequest, + CommandResult, + DesktopModule, + ModuleAction, +} from "../../bindings/fastgitdesktop/models"; + +export type { ActionRunRequest, CommandResult, DesktopModule, ModuleAction }; + +export type SidebarMenuType = "source" | "collaboration" | "release" | "all"; + +export interface OperationOutput { + title: string; + command: string; + exitCode: number; + body: string; +} + +export interface AppState { + repoPath: string; + repoStatus: string; + modules: DesktopModule[]; + selectedModuleId: string | null; + openedModuleIds: string[]; + selectedMenu: SidebarMenuType; + modulePaneWidth: number; + modulePaneCollapsed: boolean; + busy: boolean; + output: OperationOutput; +} diff --git a/desktop/frontend/src/components/ui/button.tsx b/desktop/frontend/src/components/ui/button.tsx new file mode 100644 index 0000000..1d172a3 --- /dev/null +++ b/desktop/frontend/src/components/ui/button.tsx @@ -0,0 +1,20 @@ +import type { ButtonHTMLAttributes, PropsWithChildren } from "react"; + +import { cn } from "../../lib/classnames"; + +type Variant = "default" | "primary" | "ghost"; + +interface ButtonProps extends ButtonHTMLAttributes { + variant?: Variant; +} + +export function Button({ variant = "default", className, children, ...props }: PropsWithChildren) { + return ( + + ); +} diff --git a/desktop/frontend/src/components/ui/input.tsx b/desktop/frontend/src/components/ui/input.tsx new file mode 100644 index 0000000..1ee1fef --- /dev/null +++ b/desktop/frontend/src/components/ui/input.tsx @@ -0,0 +1,7 @@ +import type { InputHTMLAttributes } from "react"; + +import { cn } from "../../lib/classnames"; + +export function Input({ className, ...props }: InputHTMLAttributes) { + return ; +} diff --git a/desktop/frontend/src/features/modules/module-actions.tsx b/desktop/frontend/src/features/modules/module-actions.tsx new file mode 100644 index 0000000..8bc0b5a --- /dev/null +++ b/desktop/frontend/src/features/modules/module-actions.tsx @@ -0,0 +1,73 @@ +import { FormEvent } from "react"; + +import { Button } from "../../components/ui/button"; +import { Input } from "../../components/ui/input"; +import { useAppContext } from "../../app/providers/app-context"; + +function collectValues(form: HTMLFormElement): Record { + const payload = new FormData(form); + const values: Record = {}; + + for (const [key, raw] of payload.entries()) { + values[key] = String(raw).trim(); + } + return values; +} + +export function ModuleActions() { + const { selectedModule, runAction } = useAppContext(); + + if (!selectedModule) { + return ( +
+
未找到模块,请刷新。
+
+ ); + } + + const actions = selectedModule.actions ?? []; + + const onSubmit = (action: (typeof actions)[number]) => (event: FormEvent) => { + event.preventDefault(); + const values = collectValues(event.currentTarget); + void runAction(selectedModule, action, values); + }; + + return ( +
+
+

{selectedModule.title}

+

{selectedModule.description}

+
+ +
+ {actions.map((action, index) => ( +
+
+

{action.title}

+

{action.description}

+
+
+
+ {(action.fields ?? []).map((field) => ( + + ))} +
+
+ +
+
+
+ ))} +
+
+ ); +} diff --git a/desktop/frontend/src/features/modules/module-sidebar.tsx b/desktop/frontend/src/features/modules/module-sidebar.tsx new file mode 100644 index 0000000..5780a0a --- /dev/null +++ b/desktop/frontend/src/features/modules/module-sidebar.tsx @@ -0,0 +1,56 @@ +import { PanelRightClose } from "lucide-react"; + +import { Button } from "../../components/ui/button"; +import { cn } from "../../lib/classnames"; +import { useAppContext } from "../../app/providers/app-context"; + +const menuTitles: Record = { + source: "源码与仓库", + collaboration: "协作与评审", + release: "发布与版本", + all: "全部模块", +}; + +export function ModuleSidebar() { + const { state, filteredModules, setSelectedModule, setModulePaneCollapsed, refresh } = useAppContext(); + const menuTitle = menuTitles[state.selectedMenu] ?? "模块"; + + return ( + + ); +} diff --git a/desktop/frontend/src/features/modules/sidebar-menu.tsx b/desktop/frontend/src/features/modules/sidebar-menu.tsx new file mode 100644 index 0000000..7b62cb3 --- /dev/null +++ b/desktop/frontend/src/features/modules/sidebar-menu.tsx @@ -0,0 +1,56 @@ +import type { LucideIcon } from "lucide-react"; +import { GitFork, LayoutGrid, RefreshCcw, Tags, UsersRound } from "lucide-react"; + +import type { SidebarMenuType } from "../../app/types"; +import { Button } from "../../components/ui/button"; +import { cn } from "../../lib/classnames"; +import { useAppContext } from "../../app/providers/app-context"; + +interface MenuItem { + id: SidebarMenuType; + label: string; + icon: LucideIcon; +} + +const items: MenuItem[] = [ + { id: "source", label: "源码", icon: GitFork }, + { id: "collaboration", label: "协作", icon: UsersRound }, + { id: "release", label: "发布", icon: Tags }, + { id: "all", label: "全部", icon: LayoutGrid }, +]; + +export function SidebarMenu() { + const { state, setSelectedMenu, refresh } = useAppContext(); + + return ( + + ); +} diff --git a/desktop/frontend/src/features/output/output-panel.tsx b/desktop/frontend/src/features/output/output-panel.tsx new file mode 100644 index 0000000..9e00d63 --- /dev/null +++ b/desktop/frontend/src/features/output/output-panel.tsx @@ -0,0 +1,20 @@ +import { useAppContext } from "../../app/providers/app-context"; + +export function OutputPanel() { + const { state } = useAppContext(); + + return ( +
+
+
+

{state.output.title}

+

{state.output.command}

+
+ + exit {state.output.exitCode} + +
+
{state.output.body}
+
+ ); +} diff --git a/desktop/frontend/src/features/workspace/repo-switcher.tsx b/desktop/frontend/src/features/workspace/repo-switcher.tsx new file mode 100644 index 0000000..993c717 --- /dev/null +++ b/desktop/frontend/src/features/workspace/repo-switcher.tsx @@ -0,0 +1,32 @@ +import { useState } from "react"; + +import { Button } from "../../components/ui/button"; +import { Input } from "../../components/ui/input"; +import { useAppContext } from "../../app/providers/app-context"; + +export function RepoSwitcher() { + const { state, switchRepo } = useAppContext(); + const [draft, setDraft] = useState(""); + + const value = draft || state.repoPath; + + return ( +
+
+

Workspace

+

{state.busy ? "运行中..." : "准备就绪"}

+
+
+ setDraft(event.target.value)} + placeholder="/path/to/repository" + /> + +
+

{state.repoStatus}

+
+ ); +} diff --git a/desktop/frontend/src/features/workspace/top-tabs.tsx b/desktop/frontend/src/features/workspace/top-tabs.tsx new file mode 100644 index 0000000..9e2b0fe --- /dev/null +++ b/desktop/frontend/src/features/workspace/top-tabs.tsx @@ -0,0 +1,191 @@ +import { useEffect, useMemo, useState } from "react"; +import type { DragEvent, MouseEvent } from "react"; +import { FolderGit2, Plus, X } from "lucide-react"; + +import { useAppContext } from "../../app/providers/app-context"; + +function basename(path: string): string { + const parts = path.split(/[\\/]/).filter(Boolean); + return parts[parts.length - 1] ?? "workspace"; +} + +export function TopTabs() { + const { + state, + addModuleTab, + closeModuleTab, + closeOtherModuleTabs, + closeTabsToRight, + reorderModuleTabs, + setSelectedModule, + } = useAppContext(); + const repoName = basename(state.repoPath); + const [draggedId, setDraggedId] = useState(null); + const [dragOverId, setDragOverId] = useState(null); + const [menu, setMenu] = useState<{ x: number; y: number; moduleId: string } | null>(null); + const openedModules = state.openedModuleIds + .map((id) => state.modules.find((module) => module.id === id)) + .filter((module): module is NonNullable => module !== undefined); + const openedCount = openedModules.length; + + const menuModule = useMemo(() => { + if (!menu) { + return null; + } + return openedModules.find((module) => module.id === menu.moduleId) ?? null; + }, [menu, openedModules]); + const menuIndex = menuModule ? openedModules.findIndex((module) => module.id === menuModule.id) : -1; + const hasOthers = openedCount > 1; + const hasRight = menuIndex >= 0 && menuIndex < openedCount - 1; + + useEffect(() => { + const onPointerDown = () => setMenu(null); + const onKeyDown = (event: KeyboardEvent) => { + if (event.key === "Escape") { + setMenu(null); + } + }; + window.addEventListener("pointerdown", onPointerDown); + window.addEventListener("keydown", onKeyDown); + return () => { + window.removeEventListener("pointerdown", onPointerDown); + window.removeEventListener("keydown", onKeyDown); + }; + }, []); + + const handleDragStart = (event: DragEvent, moduleId: string) => { + setDraggedId(moduleId); + event.dataTransfer.effectAllowed = "move"; + event.dataTransfer.setData("text/plain", moduleId); + }; + + const handleDragOver = (event: DragEvent, moduleId: string) => { + event.preventDefault(); + if (draggedId && draggedId !== moduleId) { + setDragOverId(moduleId); + } + }; + + const handleDrop = (event: DragEvent, moduleId: string) => { + event.preventDefault(); + if (!draggedId || draggedId === moduleId) { + return; + } + reorderModuleTabs(draggedId, moduleId); + setDragOverId(null); + setDraggedId(null); + }; + + const handleContextMenu = (event: MouseEvent, moduleId: string) => { + event.preventDefault(); + event.stopPropagation(); + setMenu({ + x: event.clientX, + y: event.clientY, + moduleId, + }); + }; + + const runMenuAction = (action: () => void) => { + action(); + setMenu(null); + }; + + return ( +
+
+ + {repoName} +
+ +
+ {openedModules.map((module) => { + const active = state.selectedModuleId === module.id; + return ( +
setSelectedModule(module.id)} + onKeyDown={(event) => { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + setSelectedModule(module.id); + } + }} + onContextMenu={(event) => handleContextMenu(event, module.id)} + draggable={openedCount > 1} + onDragStart={(event) => handleDragStart(event, module.id)} + onDragOver={(event) => handleDragOver(event, module.id)} + onDrop={(event) => handleDrop(event, module.id)} + onDragEnd={() => { + setDraggedId(null); + setDragOverId(null); + }} + role="button" + tabIndex={0} + aria-label={`switch to ${module.title}`} + aria-pressed={active} + > + {module.title} + +
+ ); + })} +
+ + + + {menu && menuModule && ( +
event.stopPropagation()} + > + + + +
+ )} +
+ ); +} diff --git a/desktop/frontend/src/layouts/desktop-layout.tsx b/desktop/frontend/src/layouts/desktop-layout.tsx new file mode 100644 index 0000000..0d72871 --- /dev/null +++ b/desktop/frontend/src/layouts/desktop-layout.tsx @@ -0,0 +1,80 @@ +import { useState } from "react"; +import type { CSSProperties, MouseEvent } from "react"; + +import { useAppContext } from "../app/providers/app-context"; +import { ModuleSidebar } from "../features/modules/module-sidebar"; +import { SidebarMenu } from "../features/modules/sidebar-menu"; +import { ModuleActions } from "../features/modules/module-actions"; +import { OutputPanel } from "../features/output/output-panel"; +import { RepoSwitcher } from "../features/workspace/repo-switcher"; +import { TopTabs } from "../features/workspace/top-tabs"; + +export function DesktopLayout() { + const { state, setModulePaneWidth } = useAppContext(); + const [isDragging, setIsDragging] = useState(false); + + const onResizeStart = (event: MouseEvent) => { + if (window.innerWidth <= 900 || state.modulePaneCollapsed) { + return; + } + + setIsDragging(true); + const startX = event.clientX; + const startWidth = state.modulePaneWidth; + + const onMove = (moveEvent: globalThis.MouseEvent) => { + const delta = moveEvent.clientX - startX; + setModulePaneWidth(startWidth + delta); + }; + + const onUp = () => { + setIsDragging(false); + window.removeEventListener("mousemove", onMove); + window.removeEventListener("mouseup", onUp); + document.body.style.cursor = ""; + document.body.style.userSelect = ""; + }; + + document.body.style.cursor = "col-resize"; + document.body.style.userSelect = "none"; + window.addEventListener("mousemove", onMove); + window.addEventListener("mouseup", onUp); + }; + + const bodyStyle: CSSProperties = { + "--module-pane-width": `${state.modulePaneWidth}px`, + } as CSSProperties; + + return ( +
+ +
+ +
+ +
+
+
+ + + +
+
+
+ ); +} diff --git a/desktop/frontend/src/lib/classnames.ts b/desktop/frontend/src/lib/classnames.ts new file mode 100644 index 0000000..4aa9305 --- /dev/null +++ b/desktop/frontend/src/lib/classnames.ts @@ -0,0 +1,3 @@ +export function cn(...values: Array): string { + return values.filter(Boolean).join(" "); +} diff --git a/desktop/frontend/src/lib/module-groups.ts b/desktop/frontend/src/lib/module-groups.ts new file mode 100644 index 0000000..cb57af7 --- /dev/null +++ b/desktop/frontend/src/lib/module-groups.ts @@ -0,0 +1,24 @@ +import type { DesktopModule, SidebarMenuType } from "../app/types"; + +export function menuForModule(moduleId: string): SidebarMenuType { + switch (moduleId) { + case "repo": + case "branch": + case "worktree": + return "source"; + case "issue": + case "pr": + return "collaboration"; + case "tag": + return "release"; + default: + return "all"; + } +} + +export function filterModulesByMenu(modules: DesktopModule[], menu: SidebarMenuType): DesktopModule[] { + if (menu === "all") { + return modules; + } + return modules.filter((module) => menuForModule(module.id) === menu); +} diff --git a/desktop/frontend/src/lib/persistence.ts b/desktop/frontend/src/lib/persistence.ts new file mode 100644 index 0000000..d006fbe --- /dev/null +++ b/desktop/frontend/src/lib/persistence.ts @@ -0,0 +1,81 @@ +import type { SidebarMenuType } from "../app/types"; + +const PREFS_KEY = "fastgit.desktop.prefs.v1"; + +export interface DesktopPrefs { + selectedMenu: SidebarMenuType; + modulePaneWidth: number; + modulePaneCollapsed: boolean; +} + +interface WorkspaceTabs { + openedModuleIds: string[]; + selectedModuleId: string | null; +} + +function canUseStorage(): boolean { + return typeof window !== "undefined" && typeof window.localStorage !== "undefined"; +} + +export function loadPrefs(): Partial { + if (!canUseStorage()) { + return {}; + } + + try { + const raw = window.localStorage.getItem(PREFS_KEY); + if (!raw) { + return {}; + } + const parsed = JSON.parse(raw) as Partial; + return parsed && typeof parsed === "object" ? parsed : {}; + } catch { + return {}; + } +} + +export function savePrefs(prefs: DesktopPrefs): void { + if (!canUseStorage()) { + return; + } + + window.localStorage.setItem(PREFS_KEY, JSON.stringify(prefs)); +} + +function workspaceTabsKey(repoPath: string): string { + return `fastgit.desktop.tabs:${repoPath}`; +} + +export function loadWorkspaceTabs(repoPath: string): WorkspaceTabs | null { + if (!canUseStorage() || !repoPath) { + return null; + } + + try { + const raw = window.localStorage.getItem(workspaceTabsKey(repoPath)); + if (!raw) { + return null; + } + const parsed = JSON.parse(raw) as Partial; + if (!parsed || typeof parsed !== "object") { + return null; + } + + return { + openedModuleIds: Array.isArray(parsed.openedModuleIds) + ? parsed.openedModuleIds.map((value) => String(value)) + : [], + selectedModuleId: parsed.selectedModuleId ? String(parsed.selectedModuleId) : null, + }; + } catch { + return null; + } +} + +export function saveWorkspaceTabs(repoPath: string, tabs: WorkspaceTabs): void { + if (!canUseStorage() || !repoPath) { + return; + } + + window.localStorage.setItem(workspaceTabsKey(repoPath), JSON.stringify(tabs)); +} diff --git a/desktop/frontend/src/main.ts b/desktop/frontend/src/main.ts deleted file mode 100644 index 981d139..0000000 --- a/desktop/frontend/src/main.ts +++ /dev/null @@ -1,211 +0,0 @@ -import "./style.css"; -import * as FastgitService from "../bindings/fastgitdesktop/fastgitservice"; -import type { ActionField, CommandResult, DesktopModule, ModuleAction } from "../bindings/fastgitdesktop/models"; - -const app = document.querySelector("#app"); -if (!app) throw new Error("#app not found"); - -app.innerHTML = ` -
-
-

fastgit desktop console

-

仓库 / 分支 / worktree / issue / PR / tag 的统一管理台

-
- -
-
- -
-
- - -
-
-
- -
-
- -
-
- - -
-
- -
-
-

功能模块

- -
-
-
- -
-
-

输出

- -
-
等待执行...
-
-
-`; - -const repoPath = document.querySelector("#repo-path")!; -const setRepoBtn = document.querySelector("#set-repo")!; -const repoStatus = document.querySelector("#repo-status")!; -const rawCmd = document.querySelector("#raw-cmd")!; -const runRawBtn = document.querySelector("#run-raw")!; -const modulesWrap = document.querySelector("#modules")!; -const output = document.querySelector("#output")!; -const meta = document.querySelector("#meta")!; -const busy = document.querySelector("#busy")!; - -let modules: DesktopModule[] = []; - -function setBusy(value: boolean) { - busy.textContent = value ? "运行中..." : ""; -} - -function renderResult(result: CommandResult, title?: string) { - output.textContent = result.output || "(no output)"; - const header = title ? `${title} | ` : ""; - meta.textContent = `${header}${result.command} | exit=${result.exitCode}`; -} - -function createFieldInput(moduleID: string, actionID: string, field: ActionField): HTMLInputElement { - const input = document.createElement("input"); - input.className = "input"; - input.placeholder = field.placeholder || field.label; - input.dataset.moduleId = moduleID; - input.dataset.actionId = actionID; - input.dataset.fieldKey = field.key; - if (field.default) input.value = field.default; - return input; -} - -function collectActionValues(moduleID: string, actionID: string): Record { - const values: Record = {}; - const selector = `input[data-module-id="${moduleID}"][data-action-id="${actionID}"]`; - const inputs = modulesWrap.querySelectorAll(selector); - inputs.forEach((input) => { - const key = input.dataset.fieldKey; - if (!key) return; - values[key] = input.value.trim(); - }); - return values; -} - -async function runAction(module: DesktopModule, action: ModuleAction) { - setBusy(true); - try { - const values = collectActionValues(module.id, action.id); - const result = await FastgitService.RunAction({ - moduleID: module.id, - actionID: action.id, - values, - }); - renderResult(result, `${module.title} / ${action.title}`); - } catch (err) { - output.textContent = `执行失败: ${String(err)}`; - meta.textContent = `${module.title} / ${action.title}`; - } finally { - setBusy(false); - } -} - -function renderModules() { - modulesWrap.innerHTML = ""; - - for (const module of modules) { - const section = document.createElement("section"); - section.className = "module"; - - const header = document.createElement("div"); - header.className = "module-title"; - header.innerHTML = `

${module.title}

${module.description}

`; - section.appendChild(header); - - for (const action of module.actions || []) { - const row = document.createElement("div"); - row.className = "action-row"; - - const main = document.createElement("div"); - main.className = "action-main"; - main.innerHTML = `${action.title}${action.description}`; - - const controls = document.createElement("div"); - controls.className = "action-controls"; - - for (const field of action.fields || []) { - controls.appendChild(createFieldInput(module.id, action.id, field)); - } - - const btn = document.createElement("button"); - btn.className = "btn small"; - btn.textContent = "执行"; - btn.addEventListener("click", () => void runAction(module, action)); - controls.appendChild(btn); - - row.appendChild(main); - row.appendChild(controls); - section.appendChild(row); - } - - modulesWrap.appendChild(section); - } -} - -async function boot() { - try { - const root = await FastgitService.GetRepoRoot(); - repoPath.value = root; - repoStatus.textContent = `当前仓库: ${root}`; - } catch (err) { - repoStatus.textContent = `读取仓库失败: ${String(err)}`; - } - - try { - modules = (await FastgitService.GetModules()) || []; - renderModules(); - } catch (err) { - modulesWrap.textContent = `加载模块失败: ${String(err)}`; - } -} - -setRepoBtn.addEventListener("click", async () => { - const path = repoPath.value.trim(); - if (!path) return; - setBusy(true); - try { - await FastgitService.SetRepoRoot(path); - repoStatus.textContent = `当前仓库: ${path}`; - } catch (err) { - repoStatus.textContent = `切换失败: ${String(err)}`; - } finally { - setBusy(false); - } -}); - -runRawBtn.addEventListener("click", async () => { - const cmd = rawCmd.value.trim(); - if (!cmd) return; - setBusy(true); - try { - const result = await FastgitService.RunFastgit(cmd); - renderResult(result, "Raw fastgit"); - } catch (err) { - output.textContent = `执行失败: ${String(err)}`; - meta.textContent = "Raw fastgit"; - } finally { - setBusy(false); - } -}); - -rawCmd.addEventListener("keydown", (event) => { - if (event.key !== "Enter") return; - event.preventDefault(); - runRawBtn.click(); -}); - -void boot(); diff --git a/desktop/frontend/src/main.tsx b/desktop/frontend/src/main.tsx new file mode 100644 index 0000000..8a487cc --- /dev/null +++ b/desktop/frontend/src/main.tsx @@ -0,0 +1,17 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; + +import { App } from "./app/app"; +import "./styles/index.css"; + +const container = document.getElementById("app"); +if (!container) { + throw new Error("#app not found"); +} + +const root = createRoot(container); +root.render( + + + +); diff --git a/desktop/frontend/src/services/backend.ts b/desktop/frontend/src/services/backend.ts new file mode 100644 index 0000000..ae19687 --- /dev/null +++ b/desktop/frontend/src/services/backend.ts @@ -0,0 +1,21 @@ +import * as FastgitAPI from "../../bindings/fastgitdesktop/fastgitservice"; + +import type { ActionRunRequest, CommandResult, DesktopModule } from "../app/types"; + +export class BackendService { + getRepoRoot(): Promise { + return FastgitAPI.GetRepoRoot(); + } + + setRepoRoot(path: string): Promise { + return FastgitAPI.SetRepoRoot(path); + } + + async getModules(): Promise { + return (await FastgitAPI.GetModules()) ?? []; + } + + runAction(request: ActionRunRequest): Promise { + return FastgitAPI.RunAction(request); + } +} diff --git a/desktop/frontend/src/style.css b/desktop/frontend/src/style.css deleted file mode 100644 index 04eb104..0000000 --- a/desktop/frontend/src/style.css +++ /dev/null @@ -1,194 +0,0 @@ -:root { - --bg-0: #f6f8fc; - --bg-1: #ffffff; - --line: #d9e1ed; - --text: #1a2330; - --muted: #617289; - --brand: #0f69d7; - --brand-2: #0b54ab; -} - -* { - box-sizing: border-box; -} - -body { - margin: 0; - font-family: "SF Pro Text", "Segoe UI", sans-serif; - color: var(--text); - background: - radial-gradient(circle at 10% -20%, #ddeaff 0%, transparent 50%), - radial-gradient(circle at 95% -10%, #e4ffe9 0%, transparent 40%), - var(--bg-0); -} - -.layout { - max-width: 1160px; - margin: 0 auto; - padding: 24px; - display: grid; - gap: 14px; -} - -.hero h1 { - margin: 0; - font-size: 32px; -} - -.hero p { - margin: 8px 0 0; - color: var(--muted); -} - -.card { - background: var(--bg-1); - border: 1px solid var(--line); - border-radius: 14px; - padding: 14px; -} - -.row { - display: flex; - align-items: center; -} - -.row.gap { - gap: 8px; -} - -label { - font-size: 13px; - color: var(--muted); -} - -.input { - width: 100%; - min-width: 0; - border: 1px solid var(--line); - border-radius: 10px; - padding: 10px 12px; - background: #fff; -} - -.btn { - border: 1px solid var(--line); - border-radius: 10px; - background: #fff; - color: var(--text); - cursor: pointer; - padding: 10px 14px; - white-space: nowrap; -} - -.btn.small { - padding: 8px 12px; -} - -.btn.primary { - border-color: transparent; - background: var(--brand); - color: #fff; -} - -.btn.primary:hover { - background: var(--brand-2); -} - -.hint { - color: var(--muted); - font-size: 12px; -} - -.module-head { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 10px; -} - -.module-head h2 { - margin: 0; - font-size: 18px; -} - -.modules { - display: grid; - gap: 10px; -} - -.module { - border: 1px solid var(--line); - border-radius: 12px; - padding: 10px; - background: #fbfdff; -} - -.module-title h3 { - margin: 0; -} - -.module-title p { - margin: 4px 0 8px; - color: var(--muted); - font-size: 13px; -} - -.action-row { - border-top: 1px dashed var(--line); - padding-top: 10px; - margin-top: 10px; - display: grid; - grid-template-columns: 1fr; - gap: 8px; -} - -.action-main strong { - display: block; - font-size: 14px; -} - -.action-main span { - color: var(--muted); - font-size: 12px; -} - -.action-controls { - display: flex; - gap: 8px; - flex-wrap: wrap; -} - -.action-controls .input { - width: 260px; -} - -.output { - margin: 0; - min-height: 260px; - max-height: 420px; - overflow: auto; - border-radius: 10px; - border: 1px solid #223149; - background: #0e1625; - color: #dae5fb; - padding: 12px; -} - -@media (max-width: 780px) { - .layout { - padding: 14px; - } - - .hero h1 { - font-size: 24px; - } - - .row.gap { - flex-direction: column; - align-items: stretch; - } - - .action-controls .input { - width: 100%; - } -} diff --git a/desktop/frontend/src/styles/base.css b/desktop/frontend/src/styles/base.css new file mode 100644 index 0000000..5dfc131 --- /dev/null +++ b/desktop/frontend/src/styles/base.css @@ -0,0 +1,48 @@ +* { + box-sizing: border-box; +} + +html, +body, +#app { + height: 100%; +} + +body { + margin: 0; + color: var(--text-1); + background: var(--bg-app); + font-family: var(--font-body); +} + +h1, +h2, +h3, +h4 { + margin: 0; + font-family: var(--font-heading); + letter-spacing: 0.01em; +} + +p { + margin: 0; +} + +@keyframes rise-in { + from { + opacity: 0; + transform: translateY(12px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.app-drag-region { + -webkit-app-region: drag; +} + +.app-no-drag-region { + -webkit-app-region: no-drag; +} diff --git a/desktop/frontend/src/styles/forms.css b/desktop/frontend/src/styles/forms.css new file mode 100644 index 0000000..85d5184 --- /dev/null +++ b/desktop/frontend/src/styles/forms.css @@ -0,0 +1,68 @@ +.ui-button { + appearance: none; + border: 1px solid var(--line-strong); + border-radius: var(--radius-md); + min-height: 36px; + padding: 0 14px; + font: inherit; + font-size: 12px; + font-weight: 700; + color: var(--text-1); + background: var(--bg-topbar-active); + cursor: pointer; + transition: border-color 0.18s ease, background 0.18s ease; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; +} + +.ui-button:hover { + border-color: var(--line-strong); + background: var(--bg-pane-hover); +} + +.ui-button--primary { + border-color: transparent; + color: #fff; + background: var(--brand); +} + +.ui-button--primary:hover { + background: var(--brand-strong); + border-color: transparent; +} + +.ui-button--ghost { + background: transparent; +} + +.ui-input { + width: 100%; + min-width: 0; + border: 1px solid var(--line-strong); + border-radius: var(--radius-md); + min-height: 36px; + padding: 0 11px; + font: inherit; + font-size: 13px; + color: var(--text-1); + background: var(--bg-input); + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} + +.ui-input:focus { + outline: none; + border-color: var(--brand); + box-shadow: 0 0 0 3px rgba(79, 127, 196, 0.18); +} + +.action-field { + display: grid; + gap: 4px; +} + +.action-field span { + color: var(--text-2); + font-size: 12px; +} diff --git a/desktop/frontend/src/styles/index.css b/desktop/frontend/src/styles/index.css new file mode 100644 index 0000000..ca72496 --- /dev/null +++ b/desktop/frontend/src/styles/index.css @@ -0,0 +1,7 @@ +@import url("https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap"); +@import "./tokens.css"; +@import "./base.css"; +@import "./layout.css"; +@import "./modules.css"; +@import "./forms.css"; +@import "./output.css"; diff --git a/desktop/frontend/src/styles/layout.css b/desktop/frontend/src/styles/layout.css new file mode 100644 index 0000000..95e44c9 --- /dev/null +++ b/desktop/frontend/src/styles/layout.css @@ -0,0 +1,452 @@ +.desktop-shell { + height: 100%; + display: grid; + grid-template-rows: 40px 1fr; + background: var(--bg-main); +} + +.tabs-header { + display: flex; + align-items: center; + gap: 8px; + padding: 0 10px; + border-bottom: 1px solid var(--line); + background: var(--bg-topbar); +} + +.tabs-repo { + height: 26px; + padding: 0 10px; + display: inline-flex; + align-items: center; + gap: 6px; + border-radius: 7px; + border: 1px solid var(--line); + color: var(--text-2); + font-size: 12px; + background: var(--bg-topbar-active); + white-space: nowrap; +} + +.tabs-track { + display: flex; + align-items: stretch; + min-width: 0; + overflow-x: auto; + gap: 3px; +} + +.tabs-track__item { + height: 30px; + min-width: 90px; + border: 1px solid transparent; + background: transparent; + border-radius: 8px 8px 0 0; + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: 6px; + padding: 0 12px; + color: var(--text-2); + font-family: var(--font-heading); + font-size: 12px; + cursor: pointer; + user-select: none; +} + +.tabs-track__item span:first-child { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.tabs-track__item--active { + background: var(--bg-topbar-active); + border-color: var(--line); + border-bottom-color: var(--bg-topbar-active); + color: var(--text-1); +} + +.tabs-track__item--drag-over { + border-color: rgba(79, 127, 196, 0.52); + background: rgba(79, 127, 196, 0.12); +} + +.tabs-track__close { + width: 18px; + height: 18px; + border: 0; + border-radius: 5px; + background: transparent; + color: var(--text-2); + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + padding: 0; +} + +.tabs-track__close:hover { + color: var(--text-1); + background: var(--bg-pane-hover); +} + +.tabs-add { + margin-left: auto; + width: 26px; + height: 26px; + border: 1px solid var(--line); + border-radius: 7px; + background: var(--bg-topbar-active); + color: var(--text-2); + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; +} + +.tabs-menu { + position: fixed; + z-index: 30; + min-width: 150px; + border: 1px solid var(--line); + border-radius: 10px; + background: var(--bg-topbar-active); + box-shadow: 0 8px 20px rgba(19, 31, 50, 0.18); + padding: 6px; + display: grid; + gap: 3px; +} + +.tabs-menu__item { + border: 0; + border-radius: 7px; + background: transparent; + color: var(--text-1); + text-align: left; + font-size: 12px; + padding: 7px 10px; + cursor: pointer; +} + +.tabs-menu__item:hover { + background: var(--bg-pane-hover); +} + +.tabs-menu__item:disabled { + color: var(--text-3); + cursor: not-allowed; +} + +.desktop-body { + min-height: 0; + display: grid; + grid-template-columns: 72px var(--module-pane-width, 280px) minmax(0, 1fr); + transition: grid-template-columns 0.18s ease; +} + +.desktop-body--pane-collapsed { + grid-template-columns: 72px 0 minmax(0, 1fr); +} + +.desktop-body--dragging * { + cursor: col-resize !important; +} + +.module-pane-wrap { + position: relative; + min-width: 0; + overflow: hidden; + transition: opacity 0.18s ease; +} + +.desktop-body--pane-collapsed .module-pane-wrap { + opacity: 0; +} + +.sidebar-menu-panel { + border-right: 1px solid var(--line-dark); + background: linear-gradient(180deg, var(--bg-sidebar-soft), var(--bg-sidebar)); + color: var(--text-on-dark); + display: grid; + grid-template-rows: 1fr auto; + min-height: 0; +} + +.sidebar-menu-panel__group { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + padding: 12px 0; +} + +.sidebar-menu-panel__item { + width: 56px; + min-height: 50px; + border: 0; + border-radius: 12px; + background: transparent; + color: var(--sidebar-icon); + display: grid; + justify-items: center; + align-content: center; + gap: 4px; + font-size: 11px; + cursor: pointer; +} + +.sidebar-menu-panel__item:hover { + color: var(--sidebar-icon-hover); + background: rgba(154, 178, 212, 0.08); +} + +.sidebar-menu-panel__item--active { + color: var(--sidebar-icon-hover); + background: linear-gradient(155deg, var(--sidebar-active-bg), rgba(76, 120, 189, 0.12)); + box-shadow: inset 0 0 0 1px var(--sidebar-active-border); +} + +.sidebar-menu-panel__footer { + border-top: 1px solid var(--line-dark); + padding: 10px 8px; + display: grid; + justify-items: center; + gap: 6px; + color: var(--sidebar-footer); + font-size: 11px; +} + +.sidebar-menu-panel__refresh { + width: 36px; + height: 32px; + padding: 0; + border-color: rgba(164, 184, 212, 0.35); + color: var(--sidebar-icon-hover); +} + +.module-pane { + border-right: 1px solid var(--line); + background: var(--bg-pane); + min-height: 0; + display: grid; + grid-template-rows: auto 1fr; +} + +.module-pane-resizer { + position: absolute; + top: 0; + right: -2px; + width: 4px; + height: 100%; + cursor: col-resize; + background: transparent; + z-index: 5; +} + +.module-pane-resizer:hover { + background: rgba(79, 127, 196, 0.48); +} + +.module-pane__header { + padding: 12px; + border-bottom: 1px solid var(--line); + display: flex; + align-items: center; + justify-content: space-between; +} + +.module-pane__actions { + display: inline-flex; + align-items: center; + gap: 6px; +} + +.module-pane__collapse { + width: 34px; + min-height: 34px; + padding: 0; +} + +.module-pane__header h2 { + font-size: 13px; + font-family: var(--font-heading); +} + +.module-pane__header p { + margin-top: 2px; + color: var(--text-2); + font-size: 12px; +} + +.module-pane__list { + min-height: 0; + overflow: auto; + padding: 8px; + display: grid; + align-content: start; + gap: 6px; +} + +.module-pane__item { + border: 1px solid transparent; + border-radius: 9px; + background: transparent; + color: inherit; + text-align: left; + cursor: pointer; + padding: 10px; +} + +.module-pane__item:hover { + background: var(--bg-pane-hover); +} + +.module-pane__item--active { + background: var(--bg-topbar-active); + border-color: var(--line-strong); + box-shadow: var(--shadow-card); +} + +.module-pane__item strong { + display: block; + font-size: 13px; +} + +.module-pane__item span { + display: block; + margin-top: 4px; + color: var(--text-2); + font-size: 12px; + line-height: 1.35; +} + +.module-pane__empty { + border-radius: 9px; + border: 1px dashed var(--line-strong); + padding: 12px; + font-size: 12px; + color: var(--text-2); +} + +.desktop-main { + min-height: 0; + display: grid; + grid-template-rows: auto 1fr auto; + gap: 10px; + padding: 10px; +} + +.workspace-panel, +.module-actions, +.output-panel { + border: 1px solid var(--line); + border-radius: var(--radius-xl); + background: var(--bg-card); + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.34), var(--shadow-card); + padding: 12px; +} + +.workspace-panel header { + display: flex; + justify-content: space-between; + align-items: baseline; + margin-bottom: 8px; +} + +.workspace-panel h2 { + font-size: 14px; +} + +.workspace-panel header p, +.workspace-panel__status { + color: var(--text-2); + font-size: 12px; +} + +.workspace-panel__row { + display: flex; + gap: 8px; +} + +.workspace-panel__status { + margin-top: 8px; +} + +@media (max-width: 1120px) { + .desktop-body { + grid-template-columns: 64px var(--module-pane-width, 240px) minmax(0, 1fr); + } +} + +@media (max-width: 900px) { + .desktop-shell { + grid-template-rows: auto 1fr; + } + + .desktop-body { + grid-template-columns: 1fr; + grid-template-rows: auto auto 1fr; + } + + .desktop-body--pane-collapsed { + grid-template-columns: 1fr; + grid-template-rows: auto auto 1fr; + } + + .sidebar-menu-panel { + border-right: 0; + border-bottom: 1px solid var(--line-dark); + grid-template-rows: auto; + grid-template-columns: 1fr auto; + align-items: center; + min-height: auto; + padding: 0 8px; + } + + .sidebar-menu-panel__group { + flex-direction: row; + padding: 8px 0; + justify-content: center; + } + + .sidebar-menu-panel__item { + width: 60px; + min-height: 46px; + } + + .sidebar-menu-panel__footer { + border-top: 0; + border-left: 1px solid var(--line-dark); + padding: 8px; + grid-auto-flow: column; + align-items: center; + } + + .module-pane { + border-right: 0; + border-bottom: 1px solid var(--line); + } + + .module-pane-resizer { + display: none; + } + + .desktop-main { + grid-template-rows: auto auto auto; + } +} + +@media (max-width: 640px) { + .workspace-panel__row { + flex-direction: column; + } + + .tabs-header { + padding: 0 6px; + } + + .tabs-repo { + display: none; + } +} diff --git a/desktop/frontend/src/styles/modules.css b/desktop/frontend/src/styles/modules.css new file mode 100644 index 0000000..8fd81ca --- /dev/null +++ b/desktop/frontend/src/styles/modules.css @@ -0,0 +1,84 @@ +.module-actions { + min-height: 0; + display: grid; + grid-template-rows: auto 1fr; + gap: 10px; + animation: rise-in 0.22s ease both; +} + +.module-actions__header { + border-bottom: 1px solid var(--line); + padding-bottom: 10px; +} + +.module-actions__header h2 { + font-size: 17px; +} + +.module-actions__header p { + margin-top: 4px; + color: var(--text-2); + font-size: 13px; +} + +.module-actions__grid { + min-height: 0; + overflow: auto; + display: grid; + align-content: start; + gap: 10px; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); +} + +.action-card { + border: 1px solid var(--line); + border-radius: var(--radius-lg); + background: var(--bg-card-soft); + padding: 12px; + display: grid; + gap: 10px; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.32); + animation: rise-in 0.24s ease both; +} + +.action-card__meta h3 { + font-size: 14px; +} + +.action-card__meta p { + margin-top: 4px; + color: var(--text-2); + font-size: 12px; + line-height: 1.45; +} + +.action-card__form { + display: grid; + gap: 10px; +} + +.action-card__fields { + display: grid; + gap: 8px; +} + +.action-card__footer { + display: flex; + justify-content: flex-end; +} + +.empty-state { + border: 1px dashed var(--line-strong); + border-radius: var(--radius-lg); + min-height: 120px; + display: grid; + place-items: center; + color: var(--text-2); + background: var(--bg-card-soft); +} + +@media (max-width: 760px) { + .module-actions__grid { + grid-template-columns: 1fr; + } +} diff --git a/desktop/frontend/src/styles/output.css b/desktop/frontend/src/styles/output.css new file mode 100644 index 0000000..af721eb --- /dev/null +++ b/desktop/frontend/src/styles/output.css @@ -0,0 +1,61 @@ +.output-panel { + display: grid; + gap: 10px; +} + +.output-panel__header { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 10px; +} + +.output-panel__header h2 { + font-size: 14px; +} + +.output-panel__header p { + margin-top: 4px; + color: var(--text-2); + font-size: 12px; + word-break: break-all; +} + +.status-pill { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 72px; + height: 26px; + border-radius: 999px; + font-size: 11px; + font-weight: 700; + border: 1px solid transparent; +} + +.status-pill--ok { + color: var(--ok); + background: rgba(27, 155, 74, 0.08); + border-color: rgba(27, 155, 74, 0.25); +} + +.status-pill--error { + color: var(--error); + background: rgba(216, 63, 87, 0.08); + border-color: rgba(216, 63, 87, 0.25); +} + +.output-panel__body { + margin: 0; + min-height: 180px; + max-height: 30vh; + overflow: auto; + border: 1px solid #202d42; + border-radius: var(--radius-lg); + background: #0f1725; + color: #d4dff2; + padding: 11px; + font-family: "JetBrains Mono", "SF Mono", Menlo, monospace; + font-size: 12px; + line-height: 1.55; +} diff --git a/desktop/frontend/src/styles/tokens.css b/desktop/frontend/src/styles/tokens.css new file mode 100644 index 0000000..801763c --- /dev/null +++ b/desktop/frontend/src/styles/tokens.css @@ -0,0 +1,43 @@ +:root { + --font-heading: "Sora", "Avenir Next", sans-serif; + --font-body: "Manrope", "PingFang SC", "Segoe UI", sans-serif; + + --bg-app: #e0e5ed; + --bg-main: #edf1f6; + --bg-topbar: #e3e8f0; + --bg-topbar-active: #f0f3f8; + --bg-sidebar: #243247; + --bg-sidebar-soft: #2f3f58; + --bg-pane: #e3e7ef; + --bg-pane-hover: #dbe2ec; + --bg-card: #eef2f7; + --bg-card-soft: #dde3ed; + --bg-input: #edf1f6; + + --text-1: #1f2d44; + --text-2: #5f708b; + --text-3: #8b9ab0; + --text-on-dark: #d6dfef; + --sidebar-icon: #8fa2bf; + --sidebar-icon-hover: #e4edfb; + --sidebar-footer: #96a9c7; + --sidebar-active-bg: rgba(90, 125, 177, 0.28); + --sidebar-active-border: rgba(164, 190, 232, 0.34); + + --line: #bfcbdb; + --line-strong: #adbbd1; + --line-dark: #3a4860; + + --brand: #4f7fc4; + --brand-strong: #3c679f; + --accent: #13ad9f; + + --ok: #1b9b4a; + --error: #d83f57; + + --radius-xl: 14px; + --radius-lg: 11px; + --radius-md: 9px; + + --shadow-card: 0 8px 26px rgba(18, 28, 44, 0.08); +} diff --git a/desktop/frontend/tsconfig.json b/desktop/frontend/tsconfig.json index 95c899c..9ee5f08 100644 --- a/desktop/frontend/tsconfig.json +++ b/desktop/frontend/tsconfig.json @@ -11,7 +11,8 @@ "isolatedModules": true, "noEmit": true, "strict": true, - "types": ["vite/client"] + "types": ["vite/client"], + "jsx": "react-jsx" }, "include": ["src"] } diff --git a/desktop/frontend/vite.config.ts b/desktop/frontend/vite.config.ts index 5e01572..4f6a825 100644 --- a/desktop/frontend/vite.config.ts +++ b/desktop/frontend/vite.config.ts @@ -1,6 +1,8 @@ import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; export default defineConfig({ + plugins: [react()], build: { outDir: "dist", emptyOutDir: true diff --git a/desktop/go.mod b/desktop/go.mod index 978a10c..d0a9937 100644 --- a/desktop/go.mod +++ b/desktop/go.mod @@ -2,16 +2,35 @@ module fastgitdesktop go 1.25.0 -require github.com/wailsapp/wails/v3 v3.0.0-alpha2.108 +require ( + github.com/go-git/go-git/v6 v6.0.0-alpha.4 + github.com/google/go-github/v71 v71.0.0 + github.com/wailsapp/wails/v3 v3.0.0-alpha2.108 + golang.org/x/oauth2 v0.36.0 +) require ( + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.4.1 // indirect github.com/adrg/xdg v0.5.3 // indirect + github.com/cloudflare/circl v1.6.3 // indirect github.com/coder/websocket v1.8.14 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/go-git/gcfg/v2 v2.0.2 // indirect + github.com/go-git/go-billy/v6 v6.0.0-alpha.1 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/godbus/dbus/v5 v5.2.2 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 // indirect + github.com/kevinburke/ssh_config v1.6.0 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pjbgf/sha1cd v0.6.0 // indirect + github.com/sergi/go-diff v1.4.0 // indirect github.com/wailsapp/wails/webview2 v1.0.27 // indirect - golang.org/x/sys v0.43.0 // indirect + golang.org/x/crypto v0.51.0 // indirect + golang.org/x/net v0.54.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.44.0 // indirect ) diff --git a/desktop/go.sum b/desktop/go.sum index c5aec38..9b9decb 100644 --- a/desktop/go.sum +++ b/desktop/go.sum @@ -1,37 +1,95 @@ +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.4.1 h1:9RfcZHqEQUvP8RzecWEUafnZVtEvrBVL9BiF67IQOfM= +github.com/ProtonMail/go-crypto v1.4.1/go.mod h1:e1OaTyu5SYVrO9gKOEhTc+5UcXtTUa+P3uLudwcgPqo= github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= +github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= +github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo= +github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs= +github.com/go-git/go-billy/v6 v6.0.0-alpha.1 h1:xVjAR4oUvrKy7/Xuw/lLlV3gkxR3KO2H8W+MamuVVsQ= +github.com/go-git/go-billy/v6 v6.0.0-alpha.1/go.mod h1:eaCUpHbedW7//EwcYmUDfJe2N6sJC9O12AT0OTqJR1E= +github.com/go-git/go-git-fixtures/v6 v6.0.0-alpha.1 h1:gmqi2jvsreu0s8JMLylYDFq4sbjHwwlhktMw0DUg3mA= +github.com/go-git/go-git-fixtures/v6 v6.0.0-alpha.1/go.mod h1:ECf1MqJlBdYpKggBrOXjo/0EnvRZx6D++I86UYjPgAQ= +github.com/go-git/go-git/v6 v6.0.0-alpha.4 h1:aDTc2UGanmaE7FkGLSlBEB9nohMnQ+RKXcfq/D+esDQ= +github.com/go-git/go-git/v6 v6.0.0-alpha.4/go.mod h1:4ODa/G7hPWrh4Y+7lmt59Ij3zW38IEfvRoAZxLYYBhc= github.com/go-json-experiment/json v0.0.0-20251027170946-4849db3c2f7e h1:Lf/gRkoycfOBPa42vU2bbgPurFong6zXeFtPoxholzU= github.com/go-json-experiment/json v0.0.0-20251027170946-4849db3c2f7e/go.mod h1:uNVvRXArCGbZ508SxYYTC5v1JWoz2voff5pm25jU1Ok= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ= github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-github/v71 v71.0.0 h1:Zi16OymGKZZMm8ZliffVVJ/Q9YZreDKONCr+WUd0Z30= +github.com/google/go-github/v71 v71.0.0/go.mod h1:URZXObp2BLlMjwu0O8g4y6VBneUj2bCHgnI8FfgZ51M= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 h1:njuLRcjAuMKr7kI3D85AXWkw6/+v9PwtV6M6o11sWHQ= github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= +github.com/kevinburke/ssh_config v1.6.0 h1:J1FBfmuVosPHf5GRdltRLhPJtJpTlMdKTBjRgTaQBFY= +github.com/kevinburke/ssh_config v1.6.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pjbgf/sha1cd v0.6.0 h1:3WJ8Wz8gvDz29quX1OcEmkAlUg9diU4GxJHqs0/XiwU= +github.com/pjbgf/sha1cd v0.6.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/wailsapp/wails/v3 v3.0.0-alpha2.108 h1:XKm31tberFlcYLRVzDYSHa8f+4CZDKRSN3vfQhS1Mkk= github.com/wailsapp/wails/v3 v3.0.0-alpha2.108/go.mod h1:wrdvmyeCsB/K3YqJDoH8E3MwcN8NXAMnEFaDTW46w60= github.com/wailsapp/wails/webview2 v1.0.27 h1:wjgAi/I8BBZ7kUGU8um3XF3ILEfzr96Q2Q1G4GPjMns= github.com/wailsapp/wails/webview2 v1.0.27/go.mod h1:zdM4jcO1IaC61RiJL5F1BzgoqBHFIdacz8gPr5exr0o= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/desktop/service.go b/desktop/service.go index 46dffe7..9477a4e 100644 --- a/desktop/service.go +++ b/desktop/service.go @@ -4,11 +4,21 @@ import ( "context" "errors" "fmt" + neturl "net/url" "os" "os/exec" "path/filepath" + "sort" "strings" "time" + + git "github.com/go-git/go-git/v6" + gitconfig "github.com/go-git/go-git/v6/config" + "github.com/go-git/go-git/v6/plumbing" + "github.com/go-git/go-git/v6/plumbing/client" + httptransport "github.com/go-git/go-git/v6/plumbing/transport/http" + "github.com/google/go-github/v71/github" + "golang.org/x/oauth2" ) type CommandResult struct { @@ -31,8 +41,6 @@ type ModuleAction struct { ID string `json:"id"` Title string `json:"title"` Description string `json:"description"` - Tool string `json:"tool"` - Args []string `json:"args"` Fields []ActionField `json:"fields"` } @@ -84,6 +92,9 @@ func (s *FastgitService) SetRepoRoot(path string) error { if !st.IsDir() { return fmt.Errorf("%s is not a directory", abs) } + if _, err := git.PlainOpenWithOptions(abs, &git.PlainOpenOptions{DetectDotGit: true}); err != nil { + return fmt.Errorf("%s is not a git repository: %w", abs, err) + } s.repoRoot = abs return nil } @@ -93,132 +104,240 @@ func (s *FastgitService) GetModules() []DesktopModule { { ID: "repo", Title: "仓库管理", - Description: "查看状态、拉取、推送", + Description: "状态 / 拉取 / 推送", Actions: []ModuleAction{ - {ID: "repo_status", Title: "状态", Description: "ggc status short", Tool: "fastgit", Args: []string{"ggc", "status", "short"}}, - {ID: "repo_pull", Title: "拉取", Description: "pull current branch", Tool: "fastgit", Args: []string{"pull"}}, - {ID: "repo_push", Title: "推送", Description: "push current branch", Tool: "fastgit", Args: []string{"push"}}, + {ID: "repo_status", Title: "状态", Description: "显示工作区状态"}, + {ID: "repo_pull", Title: "拉取", Description: "拉取当前分支"}, + {ID: "repo_push", Title: "推送", Description: "推送当前分支"}, }, }, { ID: "branch", Title: "分支管理", - Description: "列举、创建、切换、删除分支", + Description: "列出 / 创建 / 切换 / 删除", Actions: []ModuleAction{ - {ID: "branch_list", Title: "列出本地分支", Description: "ggc branch list local", Tool: "fastgit", Args: []string{"ggc", "branch", "list", "local"}}, - {ID: "branch_create", Title: "创建分支", Description: "ggc branch create ", Tool: "fastgit", Args: []string{"ggc", "branch", "create", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "分支名", Placeholder: "feature/my-branch", Required: true}}}, - {ID: "branch_checkout", Title: "切换分支", Description: "ggc branch checkout ", Tool: "fastgit", Args: []string{"ggc", "branch", "checkout", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "分支名", Placeholder: "main", Required: true}}}, - {ID: "branch_delete", Title: "删除分支", Description: "ggc branch delete ", Tool: "fastgit", Args: []string{"ggc", "branch", "delete", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "分支名", Placeholder: "feature/my-branch", Required: true}}}, + {ID: "branch_list", Title: "列出本地分支", Description: "显示本地分支列表"}, + {ID: "branch_create", Title: "创建分支", Description: "创建新分支", Fields: []ActionField{{Key: "name", Label: "分支名", Placeholder: "feature/my-branch", Required: true}}}, + {ID: "branch_checkout", Title: "切换分支", Description: "切换到指定分支", Fields: []ActionField{{Key: "name", Label: "分支名", Placeholder: "main", Required: true}}}, + {ID: "branch_delete", Title: "删除分支", Description: "删除指定分支", Fields: []ActionField{{Key: "name", Label: "分支名", Placeholder: "feature/my-branch", Required: true}}}, }, }, { ID: "worktree", Title: "Worktree 管理", - Description: "列出、创建、删除 worktree", + Description: "列出 / 创建 / 删除", Actions: []ModuleAction{ - {ID: "worktree_list", Title: "列出 worktree", Description: "worktree list", Tool: "fastgit", Args: []string{"worktree", "list"}}, - {ID: "worktree_create", Title: "创建 worktree", Description: "worktree create --base ", Tool: "fastgit", Args: []string{"worktree", "create", "--base", "{{base}}", "{{target}}"}, Fields: []ActionField{{Key: "target", Label: "issue/branch", Placeholder: "123 或 feature/abc", Required: true}, {Key: "base", Label: "base", Placeholder: "main", Required: true, Default: "main"}}}, - {ID: "worktree_remove", Title: "删除 worktree", Description: "worktree remove ", Tool: "fastgit", Args: []string{"worktree", "remove", "{{target}}"}, Fields: []ActionField{{Key: "target", Label: "issue/branch", Placeholder: "123 或 feature/abc", Required: true}}}, + {ID: "worktree_list", Title: "列出 worktree", Description: "查看所有 worktree"}, + {ID: "worktree_create", Title: "创建 worktree", Description: "根据 issue/branch 创建", Fields: []ActionField{{Key: "target", Label: "issue/branch", Placeholder: "123 或 feature/abc", Required: true}, {Key: "base", Label: "base", Placeholder: "main", Required: true, Default: "main"}}}, + {ID: "worktree_remove", Title: "删除 worktree", Description: "删除指定 worktree", Fields: []ActionField{{Key: "target", Label: "issue/branch", Placeholder: "123 或 feature/abc", Required: true}}}, }, }, { ID: "issue", Title: "Issue 管理", - Description: "通过 gh CLI 进行 issue 查询与创建", + Description: "GitHub API(需 GITHUB_TOKEN)", Actions: []ModuleAction{ - {ID: "issue_list", Title: "列出 issue", Description: "gh issue list --limit 30", Tool: "gh", Args: []string{"issue", "list", "--limit", "30"}}, - {ID: "issue_view", Title: "查看 issue", Description: "gh issue view ", Tool: "gh", Args: []string{"issue", "view", "{{id}}"}, Fields: []ActionField{{Key: "id", Label: "Issue ID", Placeholder: "123", Required: true}}}, - {ID: "issue_create", Title: "创建 issue", Description: "gh issue create", Tool: "gh", Args: []string{"issue", "create", "--title", "{{title}}", "--body", "{{body}}"}, Fields: []ActionField{{Key: "title", Label: "标题", Placeholder: "Issue title", Required: true}, {Key: "body", Label: "正文", Placeholder: "Issue body", Required: true}}}, + {ID: "issue_list", Title: "列出 issue", Description: "列出 open issue"}, + {ID: "issue_view", Title: "查看 issue", Description: "查看 issue 详情", Fields: []ActionField{{Key: "id", Label: "Issue ID", Placeholder: "123", Required: true}}}, + {ID: "issue_create", Title: "创建 issue", Description: "创建 issue", Fields: []ActionField{{Key: "title", Label: "标题", Placeholder: "Issue title", Required: true}, {Key: "body", Label: "正文", Placeholder: "Issue body", Required: true}}}, }, }, { ID: "pr", Title: "PR 管理", - Description: "create/status/sync/merge", + Description: "GitHub API(需 GITHUB_TOKEN)", Actions: []ModuleAction{ - {ID: "pr_status", Title: "PR 状态", Description: "fastgit pr status", Tool: "fastgit", Args: []string{"pr", "status"}}, - {ID: "pr_create", Title: "创建 PR", Description: "fastgit pr create", Tool: "fastgit", Args: []string{"pr", "create"}}, - {ID: "pr_sync", Title: "同步 PR", Description: "fastgit pr sync", Tool: "fastgit", Args: []string{"pr", "sync"}}, - {ID: "pr_merge", Title: "合并 PR", Description: "fastgit pr merge --method --yes", Tool: "fastgit", Args: []string{"pr", "merge", "--method", "{{method}}", "--yes"}, Fields: []ActionField{{Key: "method", Label: "merge method", Placeholder: "squash|merge|rebase", Required: true, Default: "squash"}}}, + {ID: "pr_status", Title: "PR 状态", Description: "查看当前分支对应 PR"}, + {ID: "pr_create", Title: "创建 PR", Description: "为当前分支创建 PR"}, + {ID: "pr_sync", Title: "同步 PR 内容", Description: "更新当前分支 PR 标题与正文"}, + {ID: "pr_merge", Title: "合并 PR", Description: "合并当前分支 PR", Fields: []ActionField{{Key: "method", Label: "merge method", Placeholder: "squash|merge|rebase", Required: true, Default: "squash"}}}, }, }, { ID: "tag", Title: "Tag 管理", - Description: "查看和发布 tag", + Description: "列出 / 创建 / 推送", Actions: []ModuleAction{ - {ID: "tag_list", Title: "列出 tag", Description: "git tag --sort=-committerdate", Tool: "git", Args: []string{"tag", "--sort=-committerdate"}}, - {ID: "tag_publish", Title: "发布 tag", Description: "git tag && git push origin ", Tool: "git", Args: []string{"tag", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "Tag", Placeholder: "v1.2.3", Required: true}}}, - {ID: "tag_push", Title: "推送 tag", Description: "git push origin ", Tool: "git", Args: []string{"push", "origin", "{{name}}"}, Fields: []ActionField{{Key: "name", Label: "Tag", Placeholder: "v1.2.3", Required: true}}}, + {ID: "tag_list", Title: "列出 tag", Description: "列出本地 tags"}, + {ID: "tag_publish", Title: "创建 tag", Description: "在当前 HEAD 创建 tag", Fields: []ActionField{{Key: "name", Label: "Tag", Placeholder: "v1.2.3", Required: true}}}, + {ID: "tag_push", Title: "推送 tag", Description: "推送指定 tag", Fields: []ActionField{{Key: "name", Label: "Tag", Placeholder: "v1.2.3", Required: true}}}, }, }, } } func (s *FastgitService) RunAction(req ActionRunRequest) (CommandResult, error) { - module, action, err := s.findAction(req.ModuleID, req.ActionID) + _, action, err := s.findAction(req.ModuleID, req.ActionID) if err != nil { return CommandResult{}, err } - _ = module - values := req.Values - if values == nil { - values = map[string]string{} - } + values := normalizeValues(req.Values) - expandedArgs, err := fillActionArgs(action, values) - if err != nil { - return CommandResult{}, err + started := time.Now().UTC() + result := CommandResult{ + Command: fmt.Sprintf("sdk/%s/%s", req.ModuleID, req.ActionID), + StartedAt: started.Format(time.RFC3339), } - return s.runTool(action.Tool, expandedArgs) -} + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) + defer cancel() -func (s *FastgitService) RunFastgit(commandLine string) (CommandResult, error) { - line := strings.TrimSpace(commandLine) - if line == "" { - return CommandResult{}, errors.New("command cannot be empty") + output, err := s.dispatchAction(ctx, action.ID, values) + result.EndedAt = time.Now().UTC().Format(time.RFC3339) + if err != nil { + result.ExitCode = 1 + if strings.TrimSpace(output) == "" { + output = err.Error() + } + result.Output = output + return result, nil } - args := strings.Fields(line) - if len(args) == 0 { - return CommandResult{}, errors.New("invalid command") + + result.ExitCode = 0 + result.Output = strings.TrimSpace(output) + if result.Output == "" { + result.Output = "ok" } - return s.runTool("fastgit", args) + return result, nil } -func fillActionArgs(action ModuleAction, values map[string]string) ([]string, error) { - normalized := make(map[string]string, len(values)) +func normalizeValues(values map[string]string) map[string]string { + if values == nil { + return map[string]string{} + } + out := make(map[string]string, len(values)) for k, v := range values { - normalized[k] = strings.TrimSpace(v) + out[k] = strings.TrimSpace(v) } + return out +} - for _, field := range action.Fields { - val := normalized[field.Key] - if val == "" && field.Default != "" { - val = field.Default - normalized[field.Key] = val +func (s *FastgitService) dispatchAction(ctx context.Context, actionID string, values map[string]string) (string, error) { + switch actionID { + case "repo_status": + return s.repoStatus(ctx) + case "repo_pull": + return s.repoPull(ctx) + case "repo_push": + return s.repoPush(ctx) + case "branch_list": + return s.branchList(ctx) + case "branch_create": + name, err := requiredValue(values, "name", "分支名") + if err != nil { + return "", err } - if field.Required && val == "" { - return nil, fmt.Errorf("missing required field: %s", field.Label) + return s.branchCreate(ctx, name) + case "branch_checkout": + name, err := requiredValue(values, "name", "分支名") + if err != nil { + return "", err } - } - - expanded := make([]string, 0, len(action.Args)) - for _, item := range action.Args { - replaced := item - for key, value := range normalized { - replaced = strings.ReplaceAll(replaced, "{{"+key+"}}", value) + return s.branchCheckout(ctx, name) + case "branch_delete": + name, err := requiredValue(values, "name", "分支名") + if err != nil { + return "", err + } + return s.branchDelete(ctx, name) + case "worktree_list": + return s.worktreeList(ctx) + case "worktree_create": + target, err := requiredValue(values, "target", "issue/branch") + if err != nil { + return "", err + } + base := optionalValue(values, "base", "main") + return s.worktreeCreate(ctx, target, base) + case "worktree_remove": + target, err := requiredValue(values, "target", "issue/branch") + if err != nil { + return "", err + } + return s.worktreeRemove(ctx, target) + case "issue_list": + return s.issueList(ctx) + case "issue_view": + id, err := requiredInt(values, "id", "Issue ID") + if err != nil { + return "", err + } + return s.issueView(ctx, id) + case "issue_create": + title, err := requiredValue(values, "title", "标题") + if err != nil { + return "", err } - if strings.Contains(replaced, "{{") { - return nil, fmt.Errorf("unresolved parameter in args: %s", item) + body, err := requiredValue(values, "body", "正文") + if err != nil { + return "", err } - replaced = strings.TrimSpace(replaced) - if replaced != "" { - expanded = append(expanded, replaced) + return s.issueCreate(ctx, title, body) + case "pr_status": + return s.prStatus(ctx) + case "pr_create": + return s.prCreate(ctx) + case "pr_sync": + return s.prSync(ctx) + case "pr_merge": + method := optionalValue(values, "method", "squash") + return s.prMerge(ctx, method) + case "tag_list": + return s.tagList(ctx) + case "tag_publish": + name, err := requiredValue(values, "name", "Tag") + if err != nil { + return "", err } + return s.tagPublish(ctx, name) + case "tag_push": + name, err := requiredValue(values, "name", "Tag") + if err != nil { + return "", err + } + return s.tagPush(ctx, name) + default: + return "", fmt.Errorf("unsupported action: %s", actionID) + } +} + +func requiredValue(values map[string]string, key, label string) (string, error) { + v := strings.TrimSpace(values[key]) + if v == "" { + return "", fmt.Errorf("%s 不能为空", label) + } + return v, nil +} + +func optionalValue(values map[string]string, key, def string) string { + v := strings.TrimSpace(values[key]) + if v == "" { + return def } + return v +} + +func requiredInt(values map[string]string, key, label string) (int, error) { + raw, err := requiredValue(values, key, label) + if err != nil { + return 0, err + } + n, convErr := strconvAtoi(raw) + if convErr != nil { + return 0, fmt.Errorf("%s 不是有效数字", label) + } + return n, nil +} - return expanded, nil +func strconvAtoi(v string) (int, error) { + var out int + for _, ch := range v { + if ch < '0' || ch > '9' { + return 0, errors.New("invalid number") + } + out = out*10 + int(ch-'0') + } + return out, nil } func (s *FastgitService) findAction(moduleID, actionID string) (DesktopModule, ModuleAction, error) { @@ -236,70 +355,563 @@ func (s *FastgitService) findAction(moduleID, actionID string) (DesktopModule, M return DesktopModule{}, ModuleAction{}, fmt.Errorf("module not found: %s", moduleID) } -func (s *FastgitService) runTool(tool string, args []string) (CommandResult, error) { - now := time.Now().UTC() - result := CommandResult{StartedAt: now.Format(time.RFC3339)} +func (s *FastgitService) openRepo() (*git.Repository, error) { + repo, err := git.PlainOpenWithOptions(s.repoRoot, &git.PlainOpenOptions{DetectDotGit: true}) + if err != nil { + return nil, fmt.Errorf("open repo failed: %w", err) + } + return repo, nil +} - bin, execArgs, err := s.resolveInvocation(tool, args) +func (s *FastgitService) currentBranch(repo *git.Repository) (string, error) { + head, err := repo.Head() if err != nil { - return result, err + return "", err + } + if !head.Name().IsBranch() { + return "", fmt.Errorf("detached HEAD") } - result.Command = strings.Join(append([]string{bin}, execArgs...), " ") + return head.Name().Short(), nil +} - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() +func (s *FastgitService) repoStatus(ctx context.Context) (string, error) { + repo, err := s.openRepo() + if err != nil { + return "", err + } + wt, err := repo.Worktree() + if err != nil { + return "", err + } + status, err := wt.Status() + if err != nil { + return "", err + } + if status.IsClean() { + return "working tree clean", nil + } - cmd := exec.CommandContext(ctx, bin, execArgs...) - cmd.Dir = s.repoRoot - output, runErr := cmd.CombinedOutput() + keys := make([]string, 0, len(status)) + for path := range status { + keys = append(keys, path) + } + sort.Strings(keys) - result.Output = strings.TrimSpace(string(output)) - result.EndedAt = time.Now().UTC().Format(time.RFC3339) + var b strings.Builder + for _, path := range keys { + st := status[path] + fmt.Fprintf(&b, "%c%c %s\n", st.Staging, st.Worktree, path) + } + return strings.TrimSpace(b.String()), nil +} - if runErr == nil { - result.ExitCode = 0 - return result, nil +func (s *FastgitService) repoPull(ctx context.Context) (string, error) { + repo, err := s.openRepo() + if err != nil { + return "", err + } + wt, err := repo.Worktree() + if err != nil { + return "", err + } + branch, err := s.currentBranch(repo) + if err != nil { + return "", err + } + opts := &git.PullOptions{ + RemoteName: "origin", + ReferenceName: plumbing.NewBranchReferenceName(branch), + SingleBranch: true, + ClientOptions: s.clientOptions(repo), + } + if err := wt.PullContext(ctx, opts); err != nil { + if errors.Is(err, git.NoErrAlreadyUpToDate) { + return "already up-to-date", nil + } + return "", err } + return "pull completed", nil +} - var exitErr *exec.ExitError - if errors.As(runErr, &exitErr) { - result.ExitCode = exitErr.ExitCode() - if result.Output == "" { - result.Output = runErr.Error() +func (s *FastgitService) repoPush(ctx context.Context) (string, error) { + repo, err := s.openRepo() + if err != nil { + return "", err + } + err = repo.PushContext(ctx, &git.PushOptions{RemoteName: "origin", ClientOptions: s.clientOptions(repo)}) + if err != nil { + if errors.Is(err, git.NoErrAlreadyUpToDate) { + return "already up-to-date", nil } - return result, nil + return "", err } + return "push completed", nil +} - if errors.Is(ctx.Err(), context.DeadlineExceeded) { - result.ExitCode = 124 - if result.Output == "" { - result.Output = "command timed out after 2m" +func (s *FastgitService) branchList(ctx context.Context) (string, error) { + _ = ctx + repo, err := s.openRepo() + if err != nil { + return "", err + } + current, err := s.currentBranch(repo) + if err != nil { + return "", err + } + iter, err := repo.Branches() + if err != nil { + return "", err + } + branches := make([]string, 0) + _ = iter.ForEach(func(ref *plumbing.Reference) error { + branches = append(branches, ref.Name().Short()) + return nil + }) + sort.Strings(branches) + var b strings.Builder + for _, name := range branches { + prefix := " " + if name == current { + prefix = "* " } - return result, nil + b.WriteString(prefix + name + "\n") + } + return strings.TrimSpace(b.String()), nil +} + +func (s *FastgitService) branchCreate(ctx context.Context, name string) (string, error) { + _ = ctx + repo, err := s.openRepo() + if err != nil { + return "", err + } + head, err := repo.Head() + if err != nil { + return "", err + } + if !head.Name().IsBranch() { + return "", fmt.Errorf("detached HEAD") } + refName := plumbing.NewBranchReferenceName(name) + if _, err := repo.Reference(refName, true); err == nil { + return "", fmt.Errorf("branch exists: %s", name) + } + if err := repo.Storer.SetReference(plumbing.NewHashReference(refName, head.Hash())); err != nil { + return "", err + } + return fmt.Sprintf("branch created: %s", name), nil +} - return result, runErr +func (s *FastgitService) branchCheckout(ctx context.Context, name string) (string, error) { + _ = ctx + repo, err := s.openRepo() + if err != nil { + return "", err + } + wt, err := repo.Worktree() + if err != nil { + return "", err + } + refName := plumbing.NewBranchReferenceName(name) + if err := wt.Checkout(&git.CheckoutOptions{Branch: refName}); err != nil { + return "", err + } + return fmt.Sprintf("checked out: %s", name), nil } -func (s *FastgitService) resolveInvocation(tool string, args []string) (string, []string, error) { - switch tool { - case "fastgit": - if path, err := exec.LookPath("fastgit"); err == nil { - return path, args, nil - } - if path, err := exec.LookPath("go"); err == nil { - fallback := []string{"run", "."} - fallback = append(fallback, args...) - return path, fallback, nil +func (s *FastgitService) branchDelete(ctx context.Context, name string) (string, error) { + _ = ctx + repo, err := s.openRepo() + if err != nil { + return "", err + } + current, err := s.currentBranch(repo) + if err != nil { + return "", err + } + if current == name { + return "", fmt.Errorf("cannot delete current branch: %s", name) + } + if err := repo.Storer.RemoveReference(plumbing.NewBranchReferenceName(name)); err != nil { + return "", err + } + return fmt.Sprintf("branch deleted: %s", name), nil +} + +func (s *FastgitService) worktreeList(ctx context.Context) (string, error) { + out, err := s.gitInRepo(ctx, "worktree", "list", "--porcelain") + if err != nil { + return "", err + } + if strings.TrimSpace(out) == "" { + return "no worktree", nil + } + return strings.TrimSpace(out), nil +} + +func (s *FastgitService) worktreeCreate(ctx context.Context, target, base string) (string, error) { + repoTop, err := s.gitInRepo(ctx, "rev-parse", "--show-toplevel") + if err != nil { + return "", err + } + repoTop = strings.TrimSpace(repoTop) + repoName := filepath.Base(repoTop) + branchName, suffix := determineWorktreeNames(target) + worktreePath := filepath.Join(filepath.Dir(repoTop), fmt.Sprintf("%s-%s", repoName, suffix)) + if _, err := s.gitInRepo(ctx, "worktree", "add", worktreePath, "-b", branchName, base); err != nil { + return "", err + } + return fmt.Sprintf("created worktree: %s", worktreePath), nil +} + +func (s *FastgitService) worktreeRemove(ctx context.Context, target string) (string, error) { + repoTop, err := s.gitInRepo(ctx, "rev-parse", "--show-toplevel") + if err != nil { + return "", err + } + repoTop = strings.TrimSpace(repoTop) + repoName := filepath.Base(repoTop) + _, suffix := determineWorktreeNames(target) + worktreePath := filepath.Join(filepath.Dir(repoTop), fmt.Sprintf("%s-%s", repoName, suffix)) + if _, err := s.gitInRepo(ctx, "worktree", "remove", worktreePath); err != nil { + return "", err + } + return fmt.Sprintf("removed worktree: %s", worktreePath), nil +} + +func determineWorktreeNames(input string) (branchName, dirSuffix string) { + if strings.Contains(input, "/") { + branchName = input + dirSuffix = sanitizeBranchName(input) + return + } + branchName = input + "/impl" + dirSuffix = input + return +} + +func sanitizeBranchName(v string) string { + replacer := strings.NewReplacer( + "/", "-", + "\\", "-", + "*", "-", + "?", "-", + ":", "-", + "<", "-", + ">", "-", + "\"", "-", + "|", "-", + ) + s := replacer.Replace(v) + for strings.Contains(s, "--") { + s = strings.ReplaceAll(s, "--", "-") + } + return strings.Trim(s, "-") +} + +func (s *FastgitService) gitInRepo(ctx context.Context, args ...string) (string, error) { + cmd := exec.CommandContext(ctx, "git", args...) + cmd.Dir = s.repoRoot + out, err := cmd.CombinedOutput() + if err != nil { + return "", fmt.Errorf("git %s: %w\n%s", strings.Join(args, " "), err, strings.TrimSpace(string(out))) + } + return string(out), nil +} + +func (s *FastgitService) issueList(ctx context.Context) (string, error) { + owner, repoName, client, err := s.githubClient(ctx) + if err != nil { + return "", err + } + issues, _, err := client.Issues.ListByRepo(ctx, owner, repoName, &github.IssueListByRepoOptions{State: "open", ListOptions: github.ListOptions{PerPage: 30}}) + if err != nil { + return "", err + } + if len(issues) == 0 { + return "no open issues", nil + } + var b strings.Builder + for _, it := range issues { + if it.GetPullRequestLinks() != nil { + continue } - return "", nil, errors.New("cannot find fastgit binary or go toolchain in PATH") - case "git", "gh": - path, err := exec.LookPath(tool) - if err != nil { - return "", nil, fmt.Errorf("cannot find %s in PATH", tool) + fmt.Fprintf(&b, "#%d [%s] %s\n", it.GetNumber(), it.GetState(), it.GetTitle()) + } + if strings.TrimSpace(b.String()) == "" { + return "no open issues", nil + } + return strings.TrimSpace(b.String()), nil +} + +func (s *FastgitService) issueView(ctx context.Context, number int) (string, error) { + owner, repoName, client, err := s.githubClient(ctx) + if err != nil { + return "", err + } + issue, _, err := client.Issues.Get(ctx, owner, repoName, number) + if err != nil { + return "", err + } + return fmt.Sprintf("#%d [%s]\n%s\n\n%s", issue.GetNumber(), issue.GetState(), issue.GetTitle(), strings.TrimSpace(issue.GetBody())), nil +} + +func (s *FastgitService) issueCreate(ctx context.Context, title, body string) (string, error) { + owner, repoName, client, err := s.githubClient(ctx) + if err != nil { + return "", err + } + req := &github.IssueRequest{Title: github.Ptr(title), Body: github.Ptr(body)} + issue, _, err := client.Issues.Create(ctx, owner, repoName, req) + if err != nil { + return "", err + } + return issue.GetHTMLURL(), nil +} + +func (s *FastgitService) prStatus(ctx context.Context) (string, error) { + owner, repoName, client, branch, err := s.githubBranchClient(ctx) + if err != nil { + return "", err + } + pr, err := s.findPRForBranch(ctx, owner, repoName, client, branch) + if err != nil { + return "", err + } + if pr == nil { + return "no open PR for current branch", nil + } + return fmt.Sprintf("#%d [%s]\n%s\n%s", pr.GetNumber(), pr.GetState(), pr.GetTitle(), pr.GetHTMLURL()), nil +} + +func (s *FastgitService) prCreate(ctx context.Context) (string, error) { + owner, repoName, client, branch, err := s.githubBranchClient(ctx) + if err != nil { + return "", err + } + if existing, err := s.findPRForBranch(ctx, owner, repoName, client, branch); err == nil && existing != nil { + return fmt.Sprintf("PR already exists: %s", existing.GetHTMLURL()), nil + } + + repoInfo, _, err := client.Repositories.Get(ctx, owner, repoName) + if err != nil { + return "", err + } + base := repoInfo.GetDefaultBranch() + title := "Update " + branch + body := "Generated by fastgit desktop SDK layer" + + newPR := &github.NewPullRequest{Title: github.Ptr(title), Head: github.Ptr(branch), Base: github.Ptr(base), Body: github.Ptr(body)} + created, _, err := client.PullRequests.Create(ctx, owner, repoName, newPR) + if err != nil { + return "", err + } + return created.GetHTMLURL(), nil +} + +func (s *FastgitService) prSync(ctx context.Context) (string, error) { + owner, repoName, client, branch, err := s.githubBranchClient(ctx) + if err != nil { + return "", err + } + pr, err := s.findPRForBranch(ctx, owner, repoName, client, branch) + if err != nil { + return "", err + } + if pr == nil { + return "no open PR for current branch", nil + } + title := "Update " + branch + body := "Updated by fastgit desktop SDK layer" + edited := &github.PullRequest{Title: github.Ptr(title), Body: github.Ptr(body)} + updated, _, err := client.PullRequests.Edit(ctx, owner, repoName, pr.GetNumber(), edited) + if err != nil { + return "", err + } + return fmt.Sprintf("PR updated: %s", updated.GetHTMLURL()), nil +} + +func (s *FastgitService) prMerge(ctx context.Context, method string) (string, error) { + owner, repoName, client, branch, err := s.githubBranchClient(ctx) + if err != nil { + return "", err + } + pr, err := s.findPRForBranch(ctx, owner, repoName, client, branch) + if err != nil { + return "", err + } + if pr == nil { + return "", fmt.Errorf("no open PR for current branch") + } + method = strings.ToLower(strings.TrimSpace(method)) + if method == "" { + method = "squash" + } + if method != "squash" && method != "merge" && method != "rebase" { + return "", fmt.Errorf("unsupported merge method: %s", method) + } + res, _, err := client.PullRequests.Merge(ctx, owner, repoName, pr.GetNumber(), "", &github.PullRequestOptions{MergeMethod: method}) + if err != nil { + return "", err + } + return fmt.Sprintf("merged=%v message=%s", res.GetMerged(), res.GetMessage()), nil +} + +func (s *FastgitService) tagList(ctx context.Context) (string, error) { + _ = ctx + repo, err := s.openRepo() + if err != nil { + return "", err + } + iter, err := repo.Tags() + if err != nil { + return "", err + } + tags := make([]string, 0) + _ = iter.ForEach(func(ref *plumbing.Reference) error { + tags = append(tags, ref.Name().Short()) + return nil + }) + if len(tags) == 0 { + return "no tags", nil + } + sort.Sort(sort.Reverse(sort.StringSlice(tags))) + return strings.Join(tags, "\n"), nil +} + +func (s *FastgitService) tagPublish(ctx context.Context, name string) (string, error) { + repo, err := s.openRepo() + if err != nil { + return "", err + } + head, err := repo.Head() + if err != nil { + return "", err + } + if _, err := repo.CreateTag(name, head.Hash(), nil); err != nil { + return "", err + } + return fmt.Sprintf("tag created: %s", name), nil +} + +func (s *FastgitService) tagPush(ctx context.Context, name string) (string, error) { + repo, err := s.openRepo() + if err != nil { + return "", err + } + refSpec := gitconfig.RefSpec(fmt.Sprintf("refs/tags/%[1]s:refs/tags/%[1]s", name)) + err = repo.PushContext(ctx, &git.PushOptions{ + RemoteName: "origin", + RefSpecs: []gitconfig.RefSpec{refSpec}, + ClientOptions: s.clientOptions(repo), + }) + if err != nil { + if errors.Is(err, git.NoErrAlreadyUpToDate) { + return "already up-to-date", nil } - return path, args, nil + return "", err + } + return fmt.Sprintf("tag pushed: %s", name), nil +} + +func (s *FastgitService) githubClient(ctx context.Context) (owner, repoName string, client *github.Client, err error) { + repo, err := s.openRepo() + if err != nil { + return "", "", nil, err + } + remote, err := repo.Remote("origin") + if err != nil { + return "", "", nil, fmt.Errorf("origin remote not found: %w", err) + } + urls := remote.Config().URLs + if len(urls) == 0 { + return "", "", nil, fmt.Errorf("origin remote has no URL") + } + owner, repoName, err = parseGitHubRemote(urls[0]) + if err != nil { + return "", "", nil, err + } + token := strings.TrimSpace(os.Getenv("GITHUB_TOKEN")) + if token == "" { + token = strings.TrimSpace(os.Getenv("GH_TOKEN")) + } + if token == "" { + return "", "", nil, fmt.Errorf("GITHUB_TOKEN/GH_TOKEN is required for GitHub API operations") + } + tok := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}) + httpClient := oauth2.NewClient(ctx, tok) + return owner, repoName, github.NewClient(httpClient), nil +} + +func (s *FastgitService) githubBranchClient(ctx context.Context) (owner, repoName string, client *github.Client, branch string, err error) { + owner, repoName, client, err = s.githubClient(ctx) + if err != nil { + return "", "", nil, "", err + } + repo, err := s.openRepo() + if err != nil { + return "", "", nil, "", err + } + branch, err = s.currentBranch(repo) + if err != nil { + return "", "", nil, "", err + } + return owner, repoName, client, branch, nil +} + +func (s *FastgitService) findPRForBranch(ctx context.Context, owner, repoName string, client *github.Client, branch string) (*github.PullRequest, error) { + prs, _, err := client.PullRequests.List(ctx, owner, repoName, &github.PullRequestListOptions{State: "open", Head: owner + ":" + branch, ListOptions: github.ListOptions{PerPage: 20}}) + if err != nil { + return nil, err + } + if len(prs) == 0 { + return nil, nil + } + return prs[0], nil +} + +func parseGitHubRemote(remote string) (owner, repo string, err error) { + remote = strings.TrimSpace(strings.TrimSuffix(remote, ".git")) + var path string + + switch { + case strings.HasPrefix(remote, "git@github.com:"): + path = strings.TrimPrefix(remote, "git@github.com:") + case strings.HasPrefix(remote, "ssh://git@github.com/"): + path = strings.TrimPrefix(remote, "ssh://git@github.com/") default: - return "", nil, fmt.Errorf("unsupported tool: %s", tool) + u, parseErr := neturl.Parse(remote) + if parseErr != nil { + return "", "", fmt.Errorf("parse remote URL failed: %w", parseErr) + } + if !strings.EqualFold(u.Hostname(), "github.com") { + return "", "", fmt.Errorf("only github.com is supported in desktop GitHub API mode") + } + path = strings.TrimPrefix(u.Path, "/") + } + + parts := strings.Split(path, "/") + if len(parts) < 2 { + return "", "", fmt.Errorf("invalid GitHub remote: %s", remote) + } + return parts[0], parts[1], nil +} + +func (s *FastgitService) clientOptions(repo *git.Repository) []client.Option { + token := strings.TrimSpace(os.Getenv("GITHUB_TOKEN")) + if token == "" { + token = strings.TrimSpace(os.Getenv("GH_TOKEN")) } + if token == "" { + return nil + } + remote, err := repo.Remote("origin") + if err != nil || remote == nil || len(remote.Config().URLs) == 0 { + return nil + } + url := strings.ToLower(strings.TrimSpace(remote.Config().URLs[0])) + if strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") { + return []client.Option{client.WithHTTPAuth(&httptransport.TokenAuth{Token: token})} + } + return nil } diff --git a/desktop/service_test.go b/desktop/service_test.go new file mode 100644 index 0000000..07def7a --- /dev/null +++ b/desktop/service_test.go @@ -0,0 +1,36 @@ +package main + +import "testing" + +func TestParseGitHubRemote(t *testing.T) { + cases := []struct { + in string + owner string + repo string + }{ + {"git@github.com:pubgo/fastgit.git", "pubgo", "fastgit"}, + {"https://github.com/pubgo/fastgit.git", "pubgo", "fastgit"}, + {"ssh://git@github.com/pubgo/fastgit", "pubgo", "fastgit"}, + } + + for _, c := range cases { + owner, repo, err := parseGitHubRemote(c.in) + if err != nil { + t.Fatalf("unexpected error for %s: %v", c.in, err) + } + if owner != c.owner || repo != c.repo { + t.Fatalf("parse mismatch for %s: got %s/%s want %s/%s", c.in, owner, repo, c.owner, c.repo) + } + } +} + +func TestDetermineWorktreeNames(t *testing.T) { + b, d := determineWorktreeNames("123") + if b != "123/impl" || d != "123" { + t.Fatalf("unexpected simple mapping: %s %s", b, d) + } + b, d = determineWorktreeNames("feature/a") + if b != "feature/a" || d != "feature-a" { + t.Fatalf("unexpected branch mapping: %s %s", b, d) + } +} From 6ebb05d762842d405aa98ba4d903064f522d601a Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 29 Jun 2026 15:21:40 +0800 Subject: [PATCH 05/16] Remove stale desktop frontend build artifacts --- .../frontend/dist/assets/index-BlN-JZwK.css | 1 - .../{index-BtWx1FlN.js => index-D2ISv5tC.js} | 0 .../frontend/dist/assets/index-D6-5WBuw.css | 1 + desktop/frontend/dist/index.html | 4 ++-- desktop/frontend/src/styles/layout.css | 11 ++++++----- desktop/frontend/src/styles/tokens.css | 18 +++++++++--------- 6 files changed, 18 insertions(+), 17 deletions(-) delete mode 100644 desktop/frontend/dist/assets/index-BlN-JZwK.css rename desktop/frontend/dist/assets/{index-BtWx1FlN.js => index-D2ISv5tC.js} (100%) create mode 100644 desktop/frontend/dist/assets/index-D6-5WBuw.css diff --git a/desktop/frontend/dist/assets/index-BlN-JZwK.css b/desktop/frontend/dist/assets/index-BlN-JZwK.css deleted file mode 100644 index 6803ebe..0000000 --- a/desktop/frontend/dist/assets/index-BlN-JZwK.css +++ /dev/null @@ -1 +0,0 @@ -@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e0e5ed;--bg-main:#edf1f6;--bg-topbar:#e3e8f0;--bg-topbar-active:#f0f3f8;--bg-sidebar:#243247;--bg-sidebar-soft:#2f3f58;--bg-pane:#e3e7ef;--bg-pane-hover:#dbe2ec;--bg-card:#eef2f7;--bg-card-soft:#dde3ed;--bg-input:#edf1f6;--text-1:#1f2d44;--text-2:#5f708b;--text-3:#8b9ab0;--text-on-dark:#d6dfef;--sidebar-icon:#8fa2bf;--sidebar-icon-hover:#e4edfb;--sidebar-footer:#96a9c7;--sidebar-active-bg:#5a7db147;--sidebar-active-border:#a4bee857;--line:#bfcbdb;--line-strong:#adbbd1;--line-dark:#3a4860;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--ok:#1b9b4a;--error:#d83f57;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{background:#4f7fc41f;border-color:#4f7fc485}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;margin-left:auto;display:inline-flex}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);border-radius:10px;gap:3px;min-width:150px;padding:6px;display:grid;position:fixed;box-shadow:0 8px 20px #131f322e}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line-dark);background:linear-gradient(180deg, var(--bg-sidebar-soft), var(--bg-sidebar));color:var(--text-on-dark);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--sidebar-icon);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;display:grid}.sidebar-menu-panel__item:hover{color:var(--sidebar-icon-hover);background:#9ab2d414}.sidebar-menu-panel__item--active{color:var(--sidebar-icon-hover);background:linear-gradient(155deg, var(--sidebar-active-bg), #4c78bd1f);box-shadow:inset 0 0 0 1px var(--sidebar-active-border)}.sidebar-menu-panel__footer{border-top:1px solid var(--line-dark);color:var(--sidebar-footer);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{width:36px;height:32px;color:var(--sidebar-icon-hover);border-color:#a4b8d459;padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:#4f7fc47a}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:auto 1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.workspace-panel,.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 #ffffff57, var(--shadow-card);padding:12px}.workspace-panel header{justify-content:space-between;align-items:baseline;margin-bottom:8px;display:flex}.workspace-panel h2{font-size:14px}.workspace-panel header p,.workspace-panel__status{color:var(--text-2);font-size:12px}.workspace-panel__row{gap:8px;display:flex}.workspace-panel__status{margin-top:8px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line-dark);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line-dark);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto auto}}@media (width<=640px){.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);gap:10px;padding:12px;animation:.24s both rise-in;display:grid;box-shadow:0 1px #ffffff52}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button--primary{color:#fff;background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);outline:none;box-shadow:0 0 0 3px #4f7fc42e}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:#1b9b4a14;border-color:#1b9b4a40}.status-pill--error{color:var(--error);background:#d83f5714;border-color:#d83f5740}.output-panel__body{border-radius:var(--radius-lg);color:#d4dff2;background:#0f1725;border:1px solid #202d42;min-height:180px;max-height:30vh;margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto} diff --git a/desktop/frontend/dist/assets/index-BtWx1FlN.js b/desktop/frontend/dist/assets/index-D2ISv5tC.js similarity index 100% rename from desktop/frontend/dist/assets/index-BtWx1FlN.js rename to desktop/frontend/dist/assets/index-D2ISv5tC.js diff --git a/desktop/frontend/dist/assets/index-D6-5WBuw.css b/desktop/frontend/dist/assets/index-D6-5WBuw.css new file mode 100644 index 0000000..f93fab5 --- /dev/null +++ b/desktop/frontend/dist/assets/index-D6-5WBuw.css @@ -0,0 +1 @@ +@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e0e5ed;--bg-main:#edf1f6;--bg-topbar:#e3e8f0;--bg-topbar-active:#f0f3f8;--bg-sidebar:#dde3ec;--bg-sidebar-soft:#e5eaf2;--bg-pane:#e3e7ef;--bg-pane-hover:#dbe2ec;--bg-card:#eef2f7;--bg-card-soft:#dde3ed;--bg-input:#edf1f6;--text-1:#1f2d44;--text-2:#5f708b;--text-3:#8b9ab0;--text-on-dark:#5f708b;--sidebar-icon:#667b99;--sidebar-icon-hover:#1f2d44;--sidebar-footer:#7388a6;--sidebar-active-bg:#4f7fc429;--sidebar-active-border:#93afdc85;--line:#bfcbdb;--line-strong:#adbbd1;--line-dark:#b8c4d6;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--ok:#1b9b4a;--error:#d83f57;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{background:#4f7fc41f;border-color:#4f7fc485}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;margin-left:auto;display:inline-flex}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);border-radius:10px;gap:3px;min-width:150px;padding:6px;display:grid;position:fixed;box-shadow:0 8px 20px #131f322e}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line-dark);background:var(--bg-sidebar);color:var(--text-on-dark);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--sidebar-icon);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;font-weight:600;display:grid}.sidebar-menu-panel__item:hover{color:var(--sidebar-icon-hover);background:var(--bg-pane-hover)}.sidebar-menu-panel__item--active{color:var(--sidebar-icon-hover);background:var(--sidebar-active-bg);box-shadow:inset 0 0 0 1px var(--sidebar-active-border)}.sidebar-menu-panel__footer{border-top:1px solid var(--line-dark);color:var(--sidebar-footer);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{border-color:var(--line-strong);width:36px;height:32px;color:var(--text-2);padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:#4f7fc47a}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:auto 1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.workspace-panel,.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 #ffffff57, var(--shadow-card);padding:12px}.workspace-panel header{justify-content:space-between;align-items:baseline;margin-bottom:8px;display:flex}.workspace-panel h2{font-size:14px}.workspace-panel header p,.workspace-panel__status{color:var(--text-2);font-size:12px}.workspace-panel__row{gap:8px;display:flex}.workspace-panel__status{margin-top:8px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line-dark);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line-dark);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto auto}}@media (width<=640px){.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);gap:10px;padding:12px;animation:.24s both rise-in;display:grid;box-shadow:0 1px #ffffff52}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button--primary{color:#fff;background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);outline:none;box-shadow:0 0 0 3px #4f7fc42e}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:#1b9b4a14;border-color:#1b9b4a40}.status-pill--error{color:var(--error);background:#d83f5714;border-color:#d83f5740}.output-panel__body{border-radius:var(--radius-lg);color:#d4dff2;background:#0f1725;border:1px solid #202d42;min-height:180px;max-height:30vh;margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto} diff --git a/desktop/frontend/dist/index.html b/desktop/frontend/dist/index.html index 66a3a2b..7b76ba8 100644 --- a/desktop/frontend/dist/index.html +++ b/desktop/frontend/dist/index.html @@ -4,8 +4,8 @@ fastgit desktop - - + +
diff --git a/desktop/frontend/src/styles/layout.css b/desktop/frontend/src/styles/layout.css index 95e44c9..c1b913b 100644 --- a/desktop/frontend/src/styles/layout.css +++ b/desktop/frontend/src/styles/layout.css @@ -166,7 +166,7 @@ .sidebar-menu-panel { border-right: 1px solid var(--line-dark); - background: linear-gradient(180deg, var(--bg-sidebar-soft), var(--bg-sidebar)); + background: var(--bg-sidebar); color: var(--text-on-dark); display: grid; grid-template-rows: 1fr auto; @@ -193,17 +193,18 @@ align-content: center; gap: 4px; font-size: 11px; + font-weight: 600; cursor: pointer; } .sidebar-menu-panel__item:hover { color: var(--sidebar-icon-hover); - background: rgba(154, 178, 212, 0.08); + background: var(--bg-pane-hover); } .sidebar-menu-panel__item--active { color: var(--sidebar-icon-hover); - background: linear-gradient(155deg, var(--sidebar-active-bg), rgba(76, 120, 189, 0.12)); + background: var(--sidebar-active-bg); box-shadow: inset 0 0 0 1px var(--sidebar-active-border); } @@ -221,8 +222,8 @@ width: 36px; height: 32px; padding: 0; - border-color: rgba(164, 184, 212, 0.35); - color: var(--sidebar-icon-hover); + border-color: var(--line-strong); + color: var(--text-2); } .module-pane { diff --git a/desktop/frontend/src/styles/tokens.css b/desktop/frontend/src/styles/tokens.css index 801763c..980b148 100644 --- a/desktop/frontend/src/styles/tokens.css +++ b/desktop/frontend/src/styles/tokens.css @@ -6,8 +6,8 @@ --bg-main: #edf1f6; --bg-topbar: #e3e8f0; --bg-topbar-active: #f0f3f8; - --bg-sidebar: #243247; - --bg-sidebar-soft: #2f3f58; + --bg-sidebar: #dde3ec; + --bg-sidebar-soft: #e5eaf2; --bg-pane: #e3e7ef; --bg-pane-hover: #dbe2ec; --bg-card: #eef2f7; @@ -17,16 +17,16 @@ --text-1: #1f2d44; --text-2: #5f708b; --text-3: #8b9ab0; - --text-on-dark: #d6dfef; - --sidebar-icon: #8fa2bf; - --sidebar-icon-hover: #e4edfb; - --sidebar-footer: #96a9c7; - --sidebar-active-bg: rgba(90, 125, 177, 0.28); - --sidebar-active-border: rgba(164, 190, 232, 0.34); + --text-on-dark: #5f708b; + --sidebar-icon: #667b99; + --sidebar-icon-hover: #1f2d44; + --sidebar-footer: #7388a6; + --sidebar-active-bg: rgba(79, 127, 196, 0.16); + --sidebar-active-border: rgba(147, 175, 220, 0.52); --line: #bfcbdb; --line-strong: #adbbd1; - --line-dark: #3a4860; + --line-dark: #b8c4d6; --brand: #4f7fc4; --brand-strong: #3c679f; From c91324773d605b6b7364a7857b68e7aedeb2e19a Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 30 Jun 2026 10:36:53 +0800 Subject: [PATCH 06/16] Remove stale frontend dist asset --- assets/fastgit-logo-icon.svg | 23 ++++++++++ assets/fastgit-logo.svg | 25 +++++++++++ desktop/assets/fastgit-icon.png | Bin 0 -> 152109 bytes .../frontend/dist/assets/index-D2ISv5tC.js | 14 ------ .../frontend/dist/assets/index-D6-5WBuw.css | 1 - .../frontend/dist/assets/index-DAwICAMZ.js | 14 ++++++ .../frontend/dist/assets/index-DDjpz5O3.css | 1 + desktop/frontend/dist/index.html | 4 +- .../src/assets/brand/fastgit-logo-icon.svg | 23 ++++++++++ .../src/features/workspace/top-tabs.tsx | 5 ++- desktop/frontend/src/styles/forms.css | 4 +- desktop/frontend/src/styles/layout.css | 41 ++++++++++-------- desktop/frontend/src/styles/modules.css | 2 +- desktop/frontend/src/styles/output.css | 14 +++--- desktop/frontend/src/styles/tokens.css | 35 ++++++++------- desktop/main.go | 4 ++ 16 files changed, 149 insertions(+), 61 deletions(-) create mode 100644 assets/fastgit-logo-icon.svg create mode 100644 assets/fastgit-logo.svg create mode 100644 desktop/assets/fastgit-icon.png delete mode 100644 desktop/frontend/dist/assets/index-D2ISv5tC.js delete mode 100644 desktop/frontend/dist/assets/index-D6-5WBuw.css create mode 100644 desktop/frontend/dist/assets/index-DAwICAMZ.js create mode 100644 desktop/frontend/dist/assets/index-DDjpz5O3.css create mode 100644 desktop/frontend/src/assets/brand/fastgit-logo-icon.svg diff --git a/assets/fastgit-logo-icon.svg b/assets/fastgit-logo-icon.svg new file mode 100644 index 0000000..205e3fb --- /dev/null +++ b/assets/fastgit-logo-icon.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fastgit-logo.svg b/assets/fastgit-logo.svg new file mode 100644 index 0000000..6f241be --- /dev/null +++ b/assets/fastgit-logo.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + fastgit + diff --git a/desktop/assets/fastgit-icon.png b/desktop/assets/fastgit-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5637fc5a010a3ab0383b003f0ccf534e45e9eb83 GIT binary patch literal 152109 zcmeFZWm6nX&@PO7fItYI#YuuJ?y$H92oN;52MO-7NN@`f+$Fe6a2A)~wm@)q*In4< z+|Q{x_5OqR(^FGj-80jldaA3tukMwhiqzZUra*8-2b=RJ3=%Ieu-KxjzGiF`@b~O&q14c1qr2|f=lTBrzP|G0Wcb8cT<7U&57J%{ z#HL1_HAng4OzivB*#Xz#>zUKZRP(7P+n*V9`s&xrv4^-q)b`Sz0?)*4$M2i(D+Hiy ziuTw)F@?wSI`>45-)$LL{P^1@U&@xd(r8Oq9SnrQldE|}CDz;&ilL}<2EPcGp#0dW>zFZ=~RA|+< zhrl&KC3KZi?lJTstfn}8ceiNV7AJSG;Mu3D%EfjDm_N^8c>L^`SDr_dasWs>Tm1OA z7=4MTig|hQ*@YjIJAFTYF-ZVjCj?%xZooMJD3Iav9ygDk($hAEKNo5qn`7Pk9eIzJ zi~!_nRwXvDqpJ(q34iXY3LFKWpWQ8#{(cRYgjypoxuA%%igM5&j{!L2D7N=fRxHuQ zzRCNSJIZY;Yb;TY zPRv(xOO|F1RZVST7iV)2`OVw|*Mh=j11WceW->6O;)I)roaY4-+{^;Zn)FFp=WJ5% zlDn7o9wJH;!fmo?DFQyxQ}7dg7F}%DL!XAUtCIm6M~E^nI@-ICZ6|)Z7v1e`uw~`# zHK6|$BG2yt{4zw;*ExKSLaR4*em+8b+Cv_&=H-9Ps7qw*rVHJ1%Uhz8tAM#`2iRCdy1EfO9TwU`nr0O^?w z;6?ABpD6}yaoT9C@U4r-%;M2MPp1!mzw#sVi-aVr`;E<+E1I@#-JNKm{z`REC^Ti} z(G=p<9jFnI)v7*pOXJ{Fg~{>P8$PVHnd&EE(3RjM=i-}WGmSBlr*FtL2G_Kfi-hgM zz*z~j4&+|g$Hm(S;_#_Y&>EoUzQ)wTLSstri*JA*g4F6MN&z5tLkd1{+<0b_KR+-! zm8_XIszRtipWA8?-NVL@ec;;)IF7#@q61!AhJL9jSSTTT=P@$8u~B#Z4l;>1!5Y(_ zJe4Ei$YT2m%mUmj8ZJG$C12n2LJwxB(KlbGQALK8WIGdtpce}g^Yn3Prr^duH+;VT zm}jE+t`KmzUd>OMT9RF}Y%;Bi*hwQ3r%xC%`EK&9c9dXZVF@FKVzc&6woa{9oG64v z^Hf>Hy)`8t!KfSZdza*^pN}5-4?|zs#b;?SKtjoqk>qYUh+2aDz zX$*(d`QxV5#MXv%*9+4ioo|7+@W>HklT7~+`kp`eM1V>;)2Kc?21bHr;7vJ;2F%ni z0Cx>=*GS~y{_z05)BaW*hq5sUn&+|gw$B7sqZ{?NV0G92T_Pnvze*vUfAMf6OSorE zfc9#|GF1`zCS`={tayjc#B<-zQW}}=je}xb7rFTSHc#Mq?EzQ1*}_$388WPFPYgsy zk*J}wJTjA2pfU7Z(hoK(j<8Q(+|Ts9x7=^!F0-YwzAhF}=5l@?jMHRShPk8s+j>;E9t7z!VY2nslQBc}yp_t0#_g$e)!l0(K(h#C!lGacaqY`=N4I@vaD>2MPZd#|wCYAkvfX z{<)(RJv%}?klbUFtoCVgs#d-Kq_)QC#XW%D_|}lz$m*njdYI0B;zmYmgE-<|8j#pf z1xT*C!Jm)Buv(NwQ2yuz)ZgzA`f%J_nGXsnh$@(Qe_4m0Gk?ax;SFcRqU$r&1C=T5 zL=s9EORAD-S!cMY$+UQ6{$*A*2L?_*?a;o(p(vQAc}3GKA%L<&0cZZ)(OL9Ex*vx$ zAT1KEf1&t9NOzg9a=MooI3#*I=3KFtr0L|wVoPGlzduJT+&+`}X>~7M7pzo9uuWyz zER?Eq^=)?WFc2K{H_w+pjrl-OI9`Gzmph4F20Bh24vUYMth3IMuuzFBsxdRP|B80? zpokoNrk1~%xA%eysnpV-NhIEb-{Vv%{_NU z0IZq!M%uy%!~^q&F@~gFyrWN(Fo2a259`|4a>Sb@$0uZfeg>sV&X%1W4cl)=UCc;H ztM|<7>X8yg>D$o#uo6Gm0p=Ct1!3~t(O2XZ3_>A#=3;$oY+AxiFZ_>ic2VoUOGKvZ`^!%06cBxRgWR_=41S$B>wmmwVm?3!x!@(`8%}-9cih! zkD93hV!TF3iTjV(X_s zLnA))sui1`$Fd^gVQY9UD4JTB!}~6`jzv5GfAt@}_fIez>vve47+g8hmHrddraVaJ_Y6GaF>FR0FLYHp1>D~Ef*(NO zm#jcXhKJ+ia`d!y1gjR(i)RrIT6>CpYH8Wf6MUGOe--E&SYAmx1*0!8+8HZgCij&- zHeVb9U=Cl+nE#%V9PX1IM^QtYV@rRJMa@ew+u6+RU`Ik5P<`T3?8+{2;?<)_OvIQO zFQWkEnd0|=6=i3nrzoE^PZCl6Nuajs&s#{%>gC7i;@LcNC54@ys&R$u_=z(T_7D$$oA?9`0NqV6f(Fh9PGF_9V7 z@zGDY*pq7V7wzWB$tUhLBe4ZN$#CbAbxJ+M^924gp}rja+$&^F%_D#YexBu*(0#N9 zzKMf4%m)TGxYOA@B{Oe`<{YF2Otb|2<4q8|kMlrucN?$nAjD?|_oPo`de1k794Xc0 z!EfLgyM@$&*E8iy{-&{KM5>bGT+lRU7#EI(Z|;nC89*f${_`$vet-YtAu5OJrqzVV zJmWOMjf?;d@2lRYP#rO8n%e@P{a`g%io%Nhm(AeF<}4(q0NIuk3v{-K* zC)kTT_YV2-mk4U!f(hp1t31gFLeJNF9g7t^Z!~w4f_YCuqAR|JKo709Rvb!f8?*|? zJ!#Qh)T=Qtr5&K*CevR~GSW|`hh;PmS-HKAXJNbpcI8e5u+IphaB;+l#eY^SU55`n zc*yy|F)mOpoD$S83FpB>FWWYNfcvatiI?HKzT917o5z(_ify6s?$whBpUy{vM;V(K zknxQhO59AmsK4yrG!srO&Y76sBxNMdX1hjBbOPzru0Ln}b3zQS| z8ORd1<$2IuFm$j29g>EYDqxNywI2-FzVFLyu)V&g+|mspRQrHipNl?LGI+ZXSS@Uz z(xU;P(F%Yro_%dHz$@fbUX5doi7n7~ab}enobMNUA$bSU%ap8VJM0MxVPHyGH&ADR zHF|w@OFb2AcVu|~`zX1ikZuLSq>b4{x7r_tM>yIau zlg8j}kImaM|7|Pp2wvYad&mWH13cr@S@3-UtncU@t#jDN(a70CgZPLb8)%62F=Gu~ zBYXhbvUl&US};_5;);u^h5*^;vxjDR(f9Lkk$CZ){jB4x8$f|0v(*B^No!v z4NCx?l5TXxVcWcKrR0f^`=7vkA}{rzL+zo$gp5hWFJ605**}wyVTkE}BQ`$Z zwW2TiG&F_lduJb;rCH*C1O##so@ln>r+f1n27*cRo~P`-KG_^R)z)4h$n)+F{Wh+l zE!}s)3->pq)#$>4dA2@lFn{B__KW9h>_x#1O+on0ZFO1vp>f=pSgk4Np3mI%mU0z{ zePDSzLEA|=x(mdRu}BoJ9aIKi|T*fkhk+1iXnQ;{p{A?Cxm0{D_u}Ar7jT z5nxTt;X~60^8+SeR)#~&JiOXreJNU;-bJ!ze6 z++htSupbfAV%>A8yE-3jz0AcH-b$6`E)x91TIX@PgEMcs$)Oltn~FPxW0)H@_K{VgsA z@TB9S5Psz4n^geD3&{vD^haV4$htZixDsMA@D}y!Vglaw$?&JwWGHU8Jk&;0*9Yi) z4mL3nyx9StR7UUAlH6|1%lE24a_UtO-;-`=aHH5L=q@a38u!q|(9R(10RQvupu&lq z3Sgh`)5pd!p{gBix$*p(=3du2i3@#(^rDjtgn!;lUujw=T4QRhNWErKbpdsTCEf4}b}=K6G+=eJ0NNO{PcK0UiI z#Xf%_v~xO2ChWYvbAnZ1w=9ATAQZ!fcx0Fc4J0YJJw= zbZ`3t3do1@G@+SM)j*!=X1Bu(V0Ic$xnZ}A^jc%(+bQdswdQKPt%_^N(<7gM6{#mQK)MMboI=S~QUc$JUjfQuX+e zP4dI9)^Q#|@jJmwA;DB7Zlm8Gv>#1`({7D+t|eHzeX@6jQG*F$IPQ)sD_>C3}l+`mo7@TvE zgZ`G^s;9|2Fuxi;@hkwGiKw+2-Gp%mF8rTWY<3y_Fe?@932O@UX7(0MV%5CE*z|0j z`&Da`YVXT|Zr)4wv4e6PCoO~n6Qpa}bIou^DGqB)mYHOI_|5C;6sbQIWmdH8nHdkJ zkvfz~6;ym^ljK^B_DmRDMNEcyEnDNK>3Esg&R7k0&;E>#*~_%PHOLg;wStG%%`c=s zs^>56uFOP7{H?RIl?#yTg~tUvYvY+{F}(}<=tWn%yHndqwh#>WLe$oX-WqwV<^E+} z95i^E1N<_x0b!lo@mtq^1?ryL_WAcdp$QT#t^w@8hrg%W|EnoB^aX$>WL#uB7x9hw z1Av_9_cxDp?wK=b?&z_cDmdxt!vuDBl)2MA)evMuB@Qd&sZ^=A4PsznN@~4X9^J;B zXH1t`E>+FWuw0LK^}v9AQcX1wl+;7=MzU>l!~|vViFhJ~E$?>My1hn~Cyg)dmoMcr zedE7rd>-m90{0Z>$Zgx8ee6Q z!u=DUmZ)9L;c_<%Ku&jFFJSATjkabMCh*nN-y#=ceqA^&Yux4E2FA*+wi9>v;O(3>a#kRhyx>I9BF}W zF?*IY$|P{02Igxdjl|#rx#In-hQEYs5ZZfcWm;jH;vwu<7emq7`IXmwS*09k8EJ;M z+yoiY@@UwBMTp#AT49tI-nNwZ?Py#}JlDsquZ2)tB1<+(pDa{Ptt|8tG{92oQz=cN zHPn=7q0MahRL;JEeFC$97>k_ULWg;Ljdtts^zmd0DRk+^}sv-Tp< zVA{>a?7NshXeEK0`Mn3Z21@hI^PGFHDFUG4`>@DC5x^D92(QlfD!)HG0xGV;5Ol72 zz^V(1zmzbs!Wb1g9H~1bPLY&rL9vdszjdk5zK6vmv?Fi3vW8!tkzj#hoq$z9=Zd(* zB<*9;B4n@e0-?oG7re>rdmx{{gc^ziZ2eeX;b?g5$_Zvy<@%eq?=40^NWKO z1A794D1bD9$iU31Txf>4#oY1%SfOSy@AZh^_iVrph^PM-!_}l?uW8!)Gh7muQ}l0E zGKAIY$xftkDu2169G8pO8Y{BxoYr)Rie0O41%yVEd+=PhFLNyMN%F7R=Qj3Gnb|Ib{cnVq*L=?R_-{l9 zKkggw77sSV$K_J%%TSZ~JH5#ZGjSAiTB;dyYl`o*c2_WMEXzZ>TsG&0?APQvLwVoG z0<%AqQAZvBZf*iLc&(>tu$*KDML_oRI=aA!i|6qN$k73C`up5)9r_al;4QPXC1FEM+!uA<1U!Q>QCR&~EaK`l(+m#2W|M(M;@OV5I44o%fkFetgbBQs4 zWPHQ=2{7bHwV>fyroU&~xBA!VB%ZaN-zy^rNH>Z8Ec*VVKWmOio7J@i3mJV=pzmTK zx|$90x3}Vm)O0j*FumJ(HAQ7qmKyY^D=uq2&Oi?asm+8p83&qu*!Zs?S4I+MiG;>t zPX0QTY(of96^5$Yzty%WooXnLbps)o_(Y(m#_w;_dn!cif<(>O$UI+nYzQxoC<$AR z)9b~2ula#n`ie-%>e~;up*OUAQ2rS_YrF(&pCR>8S3`xwo{R=Lw*h=a{}KVZibivfh`=Ifbi=1Fox-y+?g0{bRePaMCyly3$G~13xK#@v03H# zWqyVInW{Oe8MBJW1)c zA3Mv$Lu&Y3}r;yfKAUzVuJ3YP7#X=%0c zp!2etg^uj{$KN1x6@{{E7L-2*G4JrI{iLc$>5g$ULPzPlYP7>*{&3eF2Bc`Whjxt8 zrF>zfGpxN@_$lf(DRo6ZrN>X(aZ3WB7)Mux;dBs3Mn*)~9cLqu(@HtoJ0XIQ6Pdh% zjC2FNS^?!I8@Y*y^UlxKdd&nXs=01nETKouCiXuF(d1QUXVwuhF~0HkTt-^L*?D?~ z)MG0v!}d2RdC1zpBa4fthnGXq+I5)P$MqeH)!@J^fJKU^+Qm!f%lZR!_?ExPJdhZE zz4-N#>_}Kp(G4~CkX9NwJVt6&DwHyH={?t= z(-#f}i@c}N7gejq6*eZ|f0klRukJM-Q0S8Sv36|ZTf^Vyy`MvUb}F@7#jjZCGPJ0|~m z@LOSq+wV>_-@%tNE37ZK$P3J3AfN-bJ{<4MI~NRpS$!x^*jRm9@pybndpV7%FN9KfUM@(jjxkQgzJ+Nzu z8Y~O*_f9u1uq&}J;JG4|Q}IZ&BCUk4v67G2re|wP>Yq>WSHK0a zC4D+5E$?I3n4;KZu20?)>N`#8HvbZQ>dk3pL5l4?+T0vPif+Z%2~Ca&-z2}{`sp{p z=5es%Jd$PeDw;)L<>-S<2chaZJVy1V6}}lN;3*cG)=Ry3$gg>P5Sazm594-{ZCA~F z_hI5$E;RetW;zz*I(H)6XJO3bi=(K*%B*ntITHWwY{5Ra3pu@kTr@_IgFF)djU`B7 z!-WC~(gpVxD!Y-jklWr+?7O@NlK|^~iA1B1#Lk!Y$zy*FWbO@e*0Rir2V4v}t7WG@ zHvd_JNYWmm%;ea;Wlz&4U`r$63SBPR5Isr*n|@AjUl&e2=)Yx^sF%Xi7M-IRsW0k2=DOh41Rm9pM_&eVpt+GVBIFHo`-ZFp*Jo4UKEx~MklMD%cJ zK$A-AuA7u#q|03_@||Oy|BB;+>Bm(EfzS74z;EDxp)vELs*(7a-u&(Ii&S4bezfdw zA<7$io}S4QuC+9dN-P{Ieq?`o@R(`$La02{)VvI+ziei$&q2ileu>t-;PxoA6%;&e z{}<`;o!*H(UWqK^jfRZ@Cfk9cP~mI(pMxz;=p=*V>PDrjr(AD75E}ujL%AV|d)0Ec z%dus9GNu7L@#>fIOfOqbs=Sj4*3YvFwSn<)#!&obs_jn zfmF5I8L^>MsOp2YVZonFnVK5MOQvkfr)s){Jani4|={>TuXU z0;zC`;;x32s%hpAZXnY#uYZo#H|?7`P6UFZodD%_M~Lw^gxnq<*YzNUg+7H=Vo{%r z&B;uxyFg``S($ymZ^InC>_?`kE`?}R^B*&a>T$n)yc#~gQTa|y{mHmpF5Ebp>1UV4M5B2``BtSRT0G)e~&yya$QjqtH<_ z`0%&(DPDJh{$)mF8?tySaV-{*mWnUZjkS6bJt9Z^!`9+pfje}(d0uWCNle;YO)s zyh?j3?o%GM4l_sD{<4A(2>G2IqCdVPnYS6`E5hH3^tLHv@>G`{{?zchd`>)}YV#FH znV%>}i|b}+Q_P+FJLN>=zHthId@6d2eZw79QE?@gKYMYGv(2gp`Ke@?HWXGQziw1I z^H;On+V@Tynks&I1M{&wcU)wpx5qW-=+dKO6b+Co9T}w*n9CNQ2MTFB2a~9kRA`{VL*R*JN|0eORIX|0ZjL)`3^l z-6sh~YaRRGf7h6Wdpftl(E9r*=!Dp_D?NqD^QqhGChHTGAp!ENM;};l)~4i~_aND4 ziFXXb+oF7t+@!}bj->3!uK`ACoQ?AHHk2d9=L2!?nWZH;MVKym#!ltL2aAM6eF}k3 zv#dU}3|pa~Z_)fx4mtteWOef%4HqbVSYVFM1L0w_QVEZI=~HbJMv;QGmgu9-wS6wl zrvV@raPK4CO_`_%*3on)`I*{Hq~YtMenY1pU!5^^fx38+(N2chLY+apIwZ>3?31@r<(;>B-J3Q|l&}*EVOB z`k9p|$<2xlAc{qig!q{h<5&^VURfeh9~PKUh5{{bUTbib2WGrc5y5CbAL2Xir#f7b z+}x}+A=XXSjro(7GYE#e6G%C^1EImtF~;|7@zOqiQHK7E#(CGe>X9UTLSsw2d)MRD z|48wUb2}D_c@r_G%iwH+cOpsCc~*@HMjd#efvbJ$jiTc9ZL5q{M02pqA9h1*5>5Q{ZN&pRMZh{m@BYPAV&(t`j1oPMW`*ao=F?)-!*R>w)y<9r54Y2$Cnd zDd?=vAkaGKY#9~heSc%4qt!4|)mUPvPNgSsZFCcn@GgAg;txaWl4<&fk2XHXBlLh% zpRVtc{<%eDCr3|O-&4sqq+(8!$LUPB#?6({aC0(+waO@p1YT(}X2105kIAThPue34 zaCJ&ja2HQ2e7|<0m;SB^MxDENF?e~1+Y5GDM1YRe6 zoBPsdq6*RkA-#~>^Jj~HzjA)xpdnZ_+%R6TVVYcr9oNrveQWIu5mf_Z%YQoM^47qB zI*ESne=5lxIN?#F*85#Mh3W$%dfi`h_=J@3`9h9B#K&@GEhKW0ILhq|;REGk0S`;JU9j>~sZow6Tg@_w8xaI<1rfzu;@ z)hdM%QPKHqeu^J#mjk=iS>Mg^*-m&n{B3Bt zPXJhxK9Yg`+oiIzGqWuTp0T$~QmD<|!hkdsy}V#h1S4kIR@f)jH%X_7X6BASo+y3HE8pkQItD-YcIh<76rZp?ezk$I@*QhtRJ;kv~) zW={90xON#&{{oj85t-E@ne@wQW+utLs^2xLoP^$qe-vLx9TENt@@dWU##M(jf*kXi z-v4f1?ViuWkX$rfv4A>sl@I3T|3u^EYJ6Yf$C6>mxM479ey{u#Uw^*M)_)|(;5+ehPL%MB|T%cJ=ps0}%i| zBm+JF2dwVC_~ox;9V`Sd-yC4B^tuPVB<3m9)F9P3KsUD*Jpt-&Zs`XcA2H<7cB_0S zT1{#E9g=$?bPdD0MSo6!@dBe*QiT!Sl4GGkq1^$id)-cq-V5Bkl3-iex%@V)%#r9p z5KmuP@Y=a;JJRx^wWxbeqQpcjIQ`lZfbbA#xkJ=b+P~#3u+wrbnV7tf9_(>O@1%fz z`2v$EZ58{M27*ykr@)_=I!WqKh@fya2RGYl7jc=?C2( zMMM)t0lm7am&M|DxOzXzEzp?HGvn$c_D45G5HXl1mKMzvP2VqqSViS>#b`wNl_nsu z7u~7-|r+Vn$Kv(PO>r%)=1jy8mxEk>r>Bm5j!n8D1~ArI_wj9fuC-sJt9OH z7tB4R<#OPhrL{-Q6ohT^8QsUmb%$G~?ZqVFnR zd`yt!$eQnvAe}=Vm-!PDxP%!^L=L7WIOrH^d!Z2GtK03OzLL_R#X!~GWK8(V&|KU3 ztdN^#ruIGd+dcrwi7=P5IgS>G)j(FC>oT`eX$VzU$gYH#Jm=u&-TnJ2p>OaIQn~=w z`HJmKf~Vm8Kd|@jEe~xKoPjL;^QC_p@JS~ax6#^9#0oskt;AIF@BAu+enGQ|PQsu# zHeBu5KXxs7Z@iwbj)*=A`|LgosqEZvjyPoRp_a)p)y;Iit2XYiW&<>H6;@J)o@%#k zN@d#H4zZ(g-7!kC(mh@0z7=<6ZL+dUt3s*vwEw##HQCKh|FeW)-vZ zz|%c%FjwyJI62qd&_`HOP;9Ozgr9}? zVYIO<7<`{(EGeoLeg;(PK!?*QQpha3vJNB1}_41@AJG5 z_d6L63n>7($vaT{>G*faUI2VzpmM-!laQ2sRzfW0B3ZeHyjzz90k2 zhhVrGe$F^zOTUV@JL{Upi;<`wE$=O>57j?Cs#obKtzlm*;gv4Ab$h&bf~KMCiL z-0aGdG|iOlhrK7SEhoALc7DMTWay5}7 z$6nvD0!CFDJk7R`Mo$Z8g=M`jrs4|Mtj4f=bNRpSfiW_#8n*#3Rf*p5ZK~3U5V>uF zyoG$JTy*}}Rw(?_kOYf&%<#=wD+YN4!x%46L4sr_L|bvw5Xi?njo0XG_?Ed3yIef+ z{m)ufEH{cBM`-4j(PbNyi|S}Oy&-k~Lm-n*I)T>PP{p2Bfx72S@&srOIC!`M?F;D2 zD#6-`iIKW;7g$PZDQyfN(qeU(by8c6vvoh?x}4kGHjOx7XO0uj<9V}B}U6Hd*xX~KMvzI=6r`oBI6iokr}=I z?;Lrsw(XN@JKr@H5fr0(`L?q9)2^6vl|7?SIU&yK&9ixG_a*Hw ze#>Wq%LYzHFwW&^cZFe<@&IMIja3mA^FR*#L-Y0{^NeX{wlzLaBeS_lb z^5Z6v%?}ZiK>gYtxtb>FgY>ryD?o!0>L?No5+9CLj9*fxy1g#oe#g%6+XvW=;&IY^2*02fd4sw;XQ`sQ zIT=6a+pZw_b9grZ`L*`X}ml2vwrzl;)KL#~6QWIlMC`}pAv_Ppy_W<{H( z&Cb@FAmJ8DPHzluCwFbPy$@%HEy=f9A=a=0vd#ByB?(KGD5R>jDW6>2C8|gy&mCL3 zE&k4Xs?v2jyW+3s{vxX8Q=PVNUHzESZvdZ+vDCJ~4pVvakKiu)kUi~ri=^9p*uZdU zhJ#jV;hpH)OL&^i=#mm@G>LUp?-G0Xzt-@=52ElNB<7J{RETP@NYV(nn)UI6t3-WK zbrIZJavxA-tEwFbgVK--J0u5)(gnHGn}v9r`P;Ib1$st5Td_peQ-b5eccH#oq<4IvJGRDXs|g*zoARH6IG z0rYQaI;xF@CVhMD!cQrMTyq7SUcU2X59b4_yJd4zHRH8UhXMu9>0A? zE6fN1@fZ}RxCIaE_a(bzJ{j#pRcskr2q{0* z4JD;BzTnM&!h1m5*U8@2akE(f_F#wFy?Isl*o+U0-l3f~Ig#UY`^L8ijx2n*zRe6f zVtEk~0c<0C_rhRqlGN7Fg4RY*A|;j8lmV}wX&)uu@wI@wTO(=Evas-`nL75@Iqr{* zH!Y{92a0)^J73tssF&!6?9q#Fs0zqV3{*3peCyQ|HFa^M{RQ$C1-2x#X5w^aC)xk< zF%8OtXH+Hy;!5~d4M^i52_ZUn6ja71-6KQYf$_L0TSD=d&3_pEXRC^>;@&pxRe-w= z>ir-G_z&O@mrDl`XZIjfZ#^5e)BovTW|$x=Gm1v0w@#DAKqPwhOp$vHskPa(R(X?d zCPxN47HOd7bPIY?g^MD9c_V7oLWs%YPk89IJ_Fpf5&I~Q>6>`)n+k4FmMM|;|P~%DO)CWBp<;EM5JrdE^#(S#u z9bGvuYMg-n`5;hd^qz){kFq6lPnG}Q)~tNTfa&J-rv+OjVCSj**)1vN<pnJL}F46Ted|tSu?||B@7u zw(!H7cW7Gy7$QP<;nIzr61|VzRwDIEeL0pq8mqeR2`)XjKw;}ZoenV za{`;<0Mg@S{&R~7^i?>E9zRi1^GN6v5wvLAD!LaVw$TW zGnZ6mgod8WLCAsT;`)C*Ug&_i3v;t|))v-$Jf?-mKUcURzc=oQgzX$BpqOVwfGM)c z<^HscNtAyw%?R~eypgTX$dJqiX_-GQH}A>`q^)0{zVbwIbn@{x3L?vfe42Ig+CBSh z{MTevHAvb_$SL+P5|vZFt)2ae`FmPJOQ#k|2}+?lT71{DI}rz@69UCxtT?alAp0uJ ztdTHj5~W7W_R86Z?GK;*&LaGZ)Nk4jH!Q1X>UJbQ8Oij|BhegAfd|i_SH)z%8>BRS zvig2l^4F=noo z@pQY-L%*%GA=#{%h`xq-{s@wb@lD4Wc8$` zJ^l}=7v35=m_-GZiUfKq^x$M0$k&o*d+0N704S^kf$jY2Aj?-&cO2w^9*W5qz7tzc zXL{Ew1h;FNbL+2p4XoE(JJlMf(XR`N)HP<9Rs%e{LLTs&y1zw~D4*%Y#uhUKU^W?r zZ|T@}6n&$HC=wpA8JQ<}QRC#5)En=-(cm6@FE%&&#AaeA)7p=B=#RKx@&VyZ|9OY+ zRT&rcb0$^JD~txJ=}4=WX*~8baTBkvEmi|y8YY6iGWMf-+kQ3~F7GJ7fy&_g>=65t zaL2(eR^5~4q4i2KT^U=3OT6SX&Q^NZ=N{MT8i#b4->7%X07nb@ z_t6+TB+_O-iLly~`_W5+Vp#%FYeY_b7f?5dIkYY8?qU%b=L66i4f{d&7ukRBm2)mG zju8ogkG*5-cOc{f80X?$+J7)VW6)RtC6ox%imVaQQ8$|wuF}Wmh~Q~__TY1g-(t+* zC?MP{^vTdy&^3&QN`2?-YB4IKK%dwPjUv-XW#J$tuOh{Y^$o}7BpXcs{Y#CeEoL4wvH4V?aRaq@ zBIDT!O_W=}x!(?p|LzCZJL$?R=fm+7xEj;&7}NcS6wI;OwHK}R~qX|l2(_4y!BvBwWt8vs=PRJ1A{-s@U}>T%&O=$d*%lh zMSl2x-e`N}{NG>*Y-sMx6RZ?S8XFFXnA1B5BLe{6F-%UVag!)1vBvxj+cl$jsibC*mQ3 z8zVETc(K=yWeFE6gxOvux=UIffi6`XL80@RCSuu$R&33(68O9nfPf4aS#>;%#Pf4HQ8U6VxxrFeV!((n9O?(@W&HLR!1h&bwu*oz29hmB|@$^CH zLUOXF?I8YZ_vtHj(B0`o7erU#xZKCkV}0lF{o5#4r;|m}l8gPAM)=*yl`UY#@|IRVv{r>@%-NNkA_br+vWWR0%xX z6~D#&UYNN_V9QwoFd5vnkWsW_dVif<0vn^xx@D^yk21ng?LI8wAK)p>%2-d-ly?_z z5ttle)0<=pa~qx*_7YkWGSkxSy_3TaB?GNB)StFevv ztX#lQ()4R11OOAX?gmj$yG9Qs8`v>PQ;mrwp$`zFx*?eKsIz0u=D#0P*S51^O(c)V zALRUbs1m@Z22pCJDPF&~*wpd*=Lr;7BaZ)U{f>a%(cR@qZ65r_`Qn(U>m&mC_bK7E zp91zh7~}G%+h@o#Y{m|go3r209QH(-dOS$b;PPR5^^k7C zmrzngUZ&WJ^9cRoIqEMF`?NiPW5NhKUJl@j46?4hK-rQ3XMxzaYE5b6 zOJa1Xma)vBRWEK%Vw?O`+_RscvG7U^mPnI*Z7Z-Y0F{0Jk$d;pdD-msx)hn1Uzk&D z-&dQh^XEDRuXVCKlgmPDRD~&u8)Uux?e3f9AWJ4zY{gm!naZoWT7zCJpo@9Y+-=R+ zh4e)&T9Rg3*}tf{geW7o>W+^KrCwBV8Qpwj*uzR_Gnz(4FD?Hw0gT|_Xf91AEN*7q z@8}8`Jn2S^oq*3S6g;|55>?7;ye$~Rv)f}hPE=+i5{Wk>+$w+iZ0WSTj{%W?dEz&% z8s*CxkJjA&! z^4thIMDML9EN&m#In8etV82XoCJ4)0_N;E$tdja37OY^wv=lY){bIDyp0s<5Uyf+( znc4Z)PoYQAG<}lX%+RK8e@Yb7tH6J7x!#t!PU@KP1RdRX_{|(!4y86;ALI*}|B;Ij z3h^WzyfGJY4kw`NyqwXq_m~bD{@E_wWXlo9)s)+aAS3|sUOiH>oo(f8r}5&40TWpC z*e&#Tr3>yh?-RP8Xq}MtTPye;rY~M7YJ`3ECQktm;FBn#05EN~x{;a_t+X0_@&PG@ zf_|Erx=;QBbd6FrZxQdw1rb?L_M*y|&9*PgV^7HC8xdaA?iv;bc@asrUYh zAlJZa{ngL811|%;y-)SfjKk$-v%8NFu{y5R9RpdDo6Mj-LL&P;8b214`5zq@Gp~Zv z$vNOI#ukNAUJ3K22U!MlZY{P+B_-qL{i>e6sQ>heO%&a^+7)J!%zl|Y7HVU4ff^@l zm_4q(mncPNi|L!mTa>i#e%#PdM_~N2#`r$~c0h^0h;29(z@vuoNkg+FoNwN(B9(|h z3ptBH^f?eBiBb%3#8wxqzyXO*rJ>-iXMvk~(J?`sKI2tIVxy7BR|S ztN3ih&=wVewQ?F!Ga9$jAcWERp4Ld1@#ab2M}GwFM+Lk7kTW|auS!P3o?~mY(nR4}Y~ftr&T zeA2G9^;e{$gGWzZ1EKB&ytK2|F%|jH00&3?$W|M-5eF{MqkT3ib^ujt;f3%cIQ3Dc z>5Z1CYQvuRoWI;7`|H{KqG@C5myS~$`ICt`4Q;pJtjTHO(e9zbJCBtB_e{SwGgsGX zhK9R;h1VZ=7&v=i8TyLDQP#u|+A!Ci4RLnqU6ncKGc^$@pCTvCLA^AkPjG%3Cxi09 zad2xdTk!bFziX)X_IdC9&ENlq5x5uXfIGRHp$>f6*L?SjpSl0+|50bg|HZ%c)>MQJ zGLbrjz6m+(K8|(F%3OGlzAUm~X}b=1hv@Q_9hWXb2&9pqo<|USMK5}G29CSsYp#zD z5E82ZBQexyfY8x2mHq2;*k_$XPh4pF7gcH;kn*!;C<7%|me$NiLIDFbE0BG5sbD8M zRolZfQ}58fROdrAt-L;m&Z;>}S+gwIAg)z^oR!c?ZT)Umovc&qx@T=>^UU@1BwjDP z0!AjOzXFm)VyD*0I~HxLtog$w?xnUVRKD6ok2RzA(X}2%gG9GN2*+JR@Y>AtQ^qC| zT7mUgHHAEV9BacnA>0*eVfd+KJvw_^&k|jd4xnf9HC9>9c9cJzu)g&iwUD&du(R)B z?((#A?3dh=>cA}c*ao+7gKY3BZoYupl7sJ@%$>l{Dz|be=XzgcRr&sOS z$LB9DXrJmh{~6b;Q*-DQ61>FFC9=Y5wmut~^zfA=gK1{%`YX`?GC|u{yh!voGDJ&x zmp?N}jCCdDRJyL_QT-5fo|<}nNVFY29b6(zVA%)?0Y0N@ z_E`0@W)6gKXOi~{;ld*QHnhHS7&@~K0SPt5U?DARqNMyJP6mN$&L#w48qYFr z@Pt@lSVta{*V@kC1Ve|~plJB8V>=9U5a>EHJ80Bi1WhGJ*5o<#!yAz5Y-0n+oj>U^ zScQeKX7>*}?{zw~A~=AWrLFzc3EmA@^LAesxbUkE*eKFJuVZV^bSM|)klMi%2O<3i zLNex6kG1xSZyjo;OtB<`3eXbfBtTI20C%US`YBSjHqMUQuBWh1-F)cYH)*>cOK)~F zuDHy6H9>vCrAV=YRK-7WLUzl zO9V)9O`vr>5-evP(ZRHy!VIGsp)9lSnj@o{mIxIivE{f_(?Bb>b|L`1t|7q27z?e0ZyDGjB6`+iXw_o8(~5Ic{N^&PJRi8ZdgNdExxe+7-`6U4dfNX4pkM!E zk39Mp>&QIGLD8s7kVBPyJ3Q%FbBWpdGnrRRgq6?rFvvAQ2O1SbU8~6e3XydF2O#UX2 zUUNZjzA)s&>i|QtCfItTKNT?YcY4Y_`XoKqPDFa5EHdU`Xz4h%SjZn-1w<2g*33eeEi+h2!OlW>6dKj_V#!Dk#Vv?G-qx3V zp^YEeHi75{SuLVje)3aKaW-9D&q{T_7Sr0sXJDPQz;-|-puZ*P8~s()N3i$k_t&|Ik59Zr@nur6-J z=d3xl4`dnf9Js(?D+V3rMMwN{h+g+%+N{amIOe_xt%Hw?6-@$yVrHD`uDLmaXHat; zO4;O@E@DGoa`>fi=|IS z*sb-dg`wY9!&P%$`8hX&F4cEgAE{ZB>Tez5M?&Z@l$UF?K?$_0 zcu1~B-eLOL<^}Hjjb8Q1UIaW-?3`umG!$U1spEUpu1>%6Dq`OipXsJjP7bVqyoeB- z&Cc8XHAB{((Z{Yw(ON6B5zZMc)!#i0kK6B_h>7>J^ff8ANxgnp{oqMR{$3wyoUd>6 zMqP6HBlMyceC1Hyk~z_7zZ&9W;kMM;7#qhsQJzW{Hqg#H_1BEm^=ozLpLIko?0i(L zKv;|$y~dLMEOW4AIP#Ox?*$Cvdat*)AG*H!@MpdI?SJi;gS)Hq{wDzS=I`I$eq&v@ z$2kN(;yz?K6r3Fo7Cw;7xx_kHI$Vy@XQIM#5IN|B7hJP&$a64t;LDyk$@pQ(fkL-+ zYEEwCq7i~}Bvb4%%U0H*+xjCQfrF$C)|8gv$|>~|?N1{MW6^f~PG9+<4+$Y-uC+!q zvv>a4MeA_+%c*_MM>HRCIhB`~q-j}P4k)9FTJkSfxS~b4^nq2ps8WWBf@c9zdty~P;gnCK%1?{X2r8Uj0&?>S!> z{5FU@G|s?fjh5s|07KW!ENaiE=LcS*g<9~kN=wF~>zP1CX5nFAM61IK@7~VyADH9I zE*MYNtx=Qey}o+<=K7IubnM-J9{Y9&d*T1d-|PRo4#tyxqSb}@ar7a==tIY<+LnXc z?zzQK5xyNhh_ci}LH#N1HMXghKnRHEU*&IeAZ)XqGjV;`%RkmL{Q(j+z>L;nJN0Y~ zzkIdHMOQCcFZnm3Lc2zTc#e9?<*~?5gD+Glt{%9kKs^%0%@q7 z?!~Y>bGAdT^Aw*^LK8Ei*>&GrH$naSa{vD$k)9cdY8^mGZ;M^sC~%EgX+r| zF8CR$4F~J`qaH1~Gv{Iu-jM=iS#}s&2BK*wkTi&Gg6LqfzMLaYaA|cuA_Q)(!EXZd zX3fl)$yWG0FSyc!gpfN0D1X)+53aZJt46uoZm*xiIgQa>YlM61h^!vx@8&?)fKmUH zfKBhrrej{fTqE{#jfIBt#ic@PrC9`WIJA?prcKdcm-U=0x4g6R&vo)F!q&*SGb_PO zSc|FGS$293u?D!jSJrvAtf`D44c3vD^+5K4#~!)=FWvS3iQqf`PXL~MaQ$cNFg?kE zU2p3=U>rRU#ne*1HtT%V12}_&HxIatJoVE-#uMeS^0jH?k{B_wDXm<(M$4uPS5E0D z%w&NUE#$0PsEnx#E%ylhzKD&{UYd#$)wsyS6p464O92k8C+j2tuRQK? zEeEdbuCev;DHtWkiB-1zB5E=w{q$b?HVPw#iXjYq{YyQvscp(cmeeM;BG5jGn^x~g zniht*RzfJgsfUhx>-trvUb3S^Sr6k&t@GDj`l5Fm(WrkVCOXXSmwm~_e!tI1QcB*b za8fQr*O>NISPc@WAA^wgP!OpM%YyIsEI#USZZ*{avAn;AYm!EVM6dJFUf8L}J7Eyw zF!EQn6<+%7BS!B}7K~VsaEvw~XZI|tT27vVnS<7Aq&;!J9*Qy3a<+VzvqeE7kCG+=jhk>1|P^6UTZ|A}Yr zJ@ZRf_pV&R62y!J>KhtbJ>lccfLh_7S54$b>%#{hJ&AIG`AM+Ovl=UO_3d$vwk%tHp;NYnr zq~}#@UhahxcspD_y5+Aw%3h`RyMU6>WzR)9BxeWD5xV3rTWL)lvCUW!SJZ|2-0Si| zg5L`h=s9~V{?@^j{z<>~c`M1^Zx7ny6+a*XT@UYftcAC`mcktR*P#=#_PWo>Y+w-- zNnwUu7Lx#(!?;u*0kf~m`z!l+mth(0oAp_?_lbkE{sd19Lv5;!+vECdKgNo!9xkO9 zg8(8nHCE!<49)I;TEWb4osMHKb2;_?91u}glTsvt_t>-26RH`yR(6Y7 zaOzLgQpb802soZUlt4KFt!g>p^cs+fSyLZ_SP$D|O>8I$h^?d39~cOed*#=Aq|dE0 zg{+CaY%+_WNXn$}5jz$YH`k0!^EXL4D%5lQ#Lz9D;gL^zf96)~vhznY)g2RAaIsiGv4Ax`xx~7$3 zhT5+@3Qml3Dgy0WXR!-W1iBQ`Ujor>NiCHNdBKZ?!3U)#U>F7OI`PgxHULby#HwiF z%L&&IC4LA6PJno&i{z3&$$$_IaRg@!{jzq@NDsi86IFa=SR3Mbffvp;`1r$6 zKC32L49$4!r)|?UwG&FsXg5_u^2vAKTT%sxYtS@G_%_yBxsgf(U8g_TsZ;vpCl=0R z5RC1!?io15o81J~fYtAh`ll{7rQh`tM5MW-ne;KsM_y%gB3M1Jjb+xwkh+-*lfGJ) zI!v1SM6qg0t8*sQ1kw-2b2Q1%iJ&cbZ9SjdKj;W0j=4tm=%~&(Y96^lRzrTx&F@lV z&pi)wVhI5~bXdXHoaHLN`I*MLR!zU?x~HzQF%a}Ht?hc!yJB%J=xSS!T1dZUnH4QN z=IHwV6N)Z8(aIeqak>ulG&;&WlwII-yPnlHXV=71q@zYn`l?|O#g^@oMsQQwIvs`DLH z^o=nCagpr$w1wC94o}e3DL*0k(WNR-_6F3hgwqe%QYV2+v@W+nhi5LUE^>KBox+;| zz_3fLoz0|LW&@;plGTDQP>K&t_UQPFVrJFrps5eu?(x(<2`uz0@6zbSToisULA%eL zeeo(5{@__Fuc1B`ya)AJ`54Owm3$4iqurwn;b2MJ;4ecGD1zV=Dm%Q%T=27f%MUwR z{262gUwJ#x)*Yqky|kngZP!#+RzoMG(khqYTIirBp0cD4<>Lrry*|_#0?l1Od{^E1Vy=q{XsuqyE~5 zUtw^Em$mTqkiCL6NX$0%pw?g+?ETX^_$qMz^a~!px%vlH^^3+SRts`knLX-^_<*zMqZVIBh(ZTf z5gf5)^da-*SnP+Txs42y1CIL6fD5#~xO4PkS(XRMu_54OEEs9!GFMo#i@wnfSZhrn z-SC&=L}b}6dKNG%5vyxKjQYuM4LX-H!)eb}u6zg%b8ACBesQGe70i0Rq=(iTZbMU* zvDux^WvPGV121g)np^;_4N%a0M3-`~l90`S<)?Q7~} z9e(-G1EwSAi&aYet!CI%Zb(OL$C8(JpNm* zLhE7FL_1dY#G*}rj6EL=RYB*ckdBqDM49Zt_F8$iKHR2~&y-Nrz}G(uu00)Leji(El(~I@!%V$hV|iVF z1*5H6dI~}2NoURx>!g#OYAKWDv#>5&4EYZDGKPSF_OWDu*0bzhSN^poHF5TApKZB6 z&I5GE!i_N+*$wix#y3aK0 zKG&>tC^#{)5mP^h%TNZJd1m-{t%sNo0Y3^Jr!Vo$!N+M$Yq2)gAD=$N9N4DFJkhl( z40sI!5~SnL2A_@MSKxeLJL>1^ImYM(U&~f=fFxq6jY5~4Dq5zBPHU#RF5}3bxcs=L z;z11{zMi$2tP4J9-rs;3S1#~k>V73!8u06nXA}4w2&CXfq+BO5^+j%@dRls!2ORf; z*Sk(W%CAXOK*y@?vTHVfq?rBwifP1k{qj*y|15a3n6mzJ(F9n+qz>ua5`Q`$&rf*^ zE4Yfx*}{UBXP57_1fzj}#LOo7t+~FH!JPe$N>%T-@chX;oh+^2{7Og!!IO9A1io^L zmeNxG#LU53TAjc5?Z;L?cvO>|jm9)+ItDJ~W{=NJzsIuckNg9u1<}%gvExLZ!ZQ;+ z@Y5JPF6sB2`ZEjOSx+>a_0#oh%^uS@Pq+YxKB#(fQ+}7s{#$I-6C_=f^>^AN7rJF120>vSwz8qh|8yk&v-3pFWIaR?gJ5 z$Tz$>nqa*15XybnOtKPl-6!{_1cfNEq&Vs-jPj}gMGfj&RFaAtpoJiXEpzax4cAG$V%Jjg{ro=g2RnGzlw=hfQeW*w4bJ@Hdtu6htN zyEN(-wS7~j_re$-%V6vNFPV|c2S0Fi^Qph^_P_Rz6L%NpJNHij?mzh$|ENd5{CUCo zDEW|a%z9{1hrJGq4rd)G*8E8fbMWgSlRrV>V+OCoSBJTS=3$3n8I8A|H&Q1b!V1Vd z^$Ty(vX@6eaE90GT%HaU1YQkcAmv});E7rFcm5-$iDEwRXfqjt2NHhePaJiPq@wAZ z6C3QV;!0n|2;ESoMI7eKHz& zzX4@6Y#mfM>p1~9=5QTHOT5lY>DH2%Q+?3u`7vUaXQo2ty%bsWt&EEgH<3$R?F`Y0 zMMYH6*QQLe5(qEG=qTX)A-0MI=TP$RxK+Mv(ZoAKDn|Ja&>&I{Bd`I~g=V;tf3%6u znZ=hlW>JWs6RWkfu_Yn!+LWz_T^)cvytR$?L8lxYss3qQ58K)UbuWv=ISf9?hBAr~y~_(?60J>jE22PU)+2CkHvhFQT#$I&8JBL1@gp z$C3XOA9+;l6HnaUyL10Bz@7UGz}4;bYx{WgA*myhL)@o@gTu+;K8u~&7>6y@mk63>M zoWI;8RY5@#s5M||q0hf~)K3D116nqX;qXpy_s7{2Y8?<`4Q=h$&w$p@@e_K37USx0 zs;ajl7=qUW9YywxoiTFKig!_-c1|7oMrgzvi5|1ym8Q&Hl=W+dUN1H9|3)d@b@ zitPkC9hszF7~2|OappmDg!LMwK0lHVMjPV_BRmZXLFWZq>R59nj1X*D)0@N!mtvNj zkPtAS=w!yf44}tQ@^2e&0)6VMnLqApNq~cAC18(d(MnCRt?v&o+SnWi7Wk@z5@!B5 z*23E0@^F~(jx2j&I+x7SYl8HW63kw6*BMgdmi$z-0Ir=H#5Wk6f5jmU-u-3M`J246 zs15bwls4Q1wni;AL{=-v#;~&Z%a$6g38!tMYVJnJr!~$?TGE;QQ%;0dEa43B+Ls~P z#7SQfyvLjV-5|rAc-*PK0DSIizwfbnyxCj!x5{+JS=rc_`^Z2k+l&M?G=9D zLC0FN;k{_C=FHIyN{4e~VCc{nc777%)7RFPDFsPu*mhs>=D1*rC7S=gXaGA>t zhGk}GoS91&4RP}i6Y(!KQ4_OhRJOz|({1<%j*T(N!i24&193qF+WYc&9mo4P&-3%U zu7WYswcm^Ly1t+DJm2r*;e9@QzSpl;@Ak$?#ExOFl@2}JnE=2EQbz7Qo>x?mf|TduAIlPn?zJ z{zL%vy0^!t9D90=sfuR_3vW$layQJ+934LRw&ar+IYo9bYa6gvkH4D7>ep!v$9sAR zfNT9Q`50=QtUpmDX!UlVGxxfciq80Z9fJD+%>;0rJM0QzJKwrjA^1cxz4TfF^w!>S z=Bi5^aQpbPr`g+QzUJNE^hckA^R%?5>IZ;Vz3PAeN*(kod<%5KzRO$(-?4SYG|h#~ zrQpKkYH{B@3ef_-$eOPU*IX!bk2;BNAaF)-`7;Ow&$9fk-~rq>cR=bgrxg8zTQsNg zWsz!6Pw*~#ppz46)jtJn|6mAH!SXYX0xUJ6Hh0FjsVAPv5zk6es&kax`pp?1#I^3F zMb3T~1=vUZrYsKYiYKsRJoTsi^3nA|#ThS_IG(0>5=>SkoEkpe!+O^DtUu%M(d#Lj zTR~~rw7w|-mxZqNiY+y3%hem)>JBVq^bL)`tny62$WzyT6huZw`1*I!ZyicSp!JlCIfC6O^I zS%7PqG11o9>fMWE&wA0*NO~Ntc#=!~Es;3<&_^q%b$XhLrd$Tzf9vN#VfkpDnoV%M zsWqNoQg_uV;G29I!Zbl`X!8Su11C&mi}$ZN=lO)aT4`&?Rvyv@n7-mKlqv7XzWw+c&dH?c+u^nznRO@OS3MfZh`O7 zdFX<1<#UmHQOq`2>GZyBj6+^J2KbRg0calBUff>T1+#l(QOQd%7gYl0NvHfJYPT_v zMiub%JED;N`!diQRgMMBM4R<*|M3Hw;E2N6{EVn|hyCIyV9lxDGGGkbe54#kz~l5O zD(Ed9frGuaqF$)=#m|~jcGd=8BX5dF>p64vlAv!>x!0NAM2%X{wl&^3-s*S{!(8UVg%sY}hI=T4Ae zO{_-{#%F^%?CH_T`b_`;1rW`Agfb=3RMPQ^-}Yth{Lo5w)Hz{Ms+SX*I24_e@9~J# z3ozwDb&Ou0o+F&pPygt*c>a_;o~j=JbPe|5`Xc3Can|c%%!TYl=JNUC1mtVs`vtC8 zz@yg-ZJ^?rM`6M3$0I1yl|=W-@BDa~1hPNWgWp=ZWSGwRO-~Eu%qsC4dqJEn&jdar|@&GV2wXh zGY((R@mU@m9^t9n6CP8S>D5r|q5r@tJ1QbHfmYXc#Nr=e!ps9BmNi0UeAus9>$hYC z;!`iEhhHaE+kVOjmw9V|tTz0M|LEIaiJZQ$^;N8RYxrScMhwUAL{b;LlNx#8brH}fYe591 z1U;OYqY_;jN;1YLUU1ZgKeJRC!0m+>Zu`%Opzr$G{k!W$vbgts`@j39XCJ-rVP7Mi z{CUBBRp+u~LykWX#XUF4mxjwC0ph)Enc&n0(ufJnSYa-5Uxe~e>jf{XJpyYy7uBK; z)@N+mO^vu+n&M%Itl!&zBO{v{oi}vqv)p(NAN*0FXBYbbCZ2j4ivH~7s@1| z^|NQ1_bhENkHjZW3=LVwJ@q@}LP_uaw?rW0CuG2v6qEWS5p}R#|HwOSe2X|G(N1y( zo!InuBjI!r|)a@KV50<%_m)a3ZqHfs3&+W=xMwfz}ecZ8&x>txWq zW~|obXSSc0^++RgpQbrs9s&=ARPPG?Ke#`xZ)$}Ix7B%lK0gQdf@$I8uzAm3H-f_6=A`*N24+1U?Twf*-bJ?p0D>p0GtJloo35BnSyw=M$ zIbX!Nni<2aWI*=vW!1~FzR-fplNaN_B18lZqp6=4)&5{7w>&lXn79UES|&OK6pufA zPZPA4hH7~262YYo$CZ!&)?c31!&rmW;A=w6anO8d8<%wE^?58WM%X;NTj(H-e#Xnc za}xGW-t1#uzTrx)lmqeMnY!lukQ_UACMkmW$~>V)WxapJ17Ds|49h}G>Rg}CPyAKq z7C>#edpthyts&X?Zy-+2spqS_RlAxoi9hSJ0Md}sXR!|A=`xqsn*ya+825g){QqDyjUacQoTKhTAYCa%LjckVDp2|01S-23DD0%nn!Np z>-<^)+I7^VSAB1f9!_9Y75q$3X!oDn&X=bxjFV6x}(1E;W})9 zSi~1?vs!;W^CARDj$h`^3o^^=^1Toa*C_F_B*6`8t7D8L!qwI z$;^on&-xU_f7t+76NgE+)f0mEN>KYO&yBV$S{nE)2{WDJmPVj-^A=CZthQtPXPpvRd z&IKmQzQ0S+UOvBuOj-wUc%q*DSx|2<*x5e~uXLLl?(-eus(!%UW5!649Q*4!*}wR7 zwWh@0>vnw#p7b@wd(O!xh)=x$F=ibrSeNFYR}JjY*ZDPe`qv=2`p4@ifOQSTTjDWm zZBzl)HTFAvn~gV6Yi;A!l^>=8nnf!Y@Pp#HqysBG`W}=R&%`L*GMm6AL{Hu$P8tQWB8D zLd(pa2!O4S$3j6|tgFJpf)LLyB0aQKKkURZLc^kwwU1(i)nea#g064n4D%!Fvq1cf z8UMjs$)Xzv*RFiYq2HZ)sL7v!1|rKYw~!XwZyX? zBH7D+hi|{Q_fESoi`tVl(%M^AG3uC=rXSou3ONfetJ-C8Kb-Q zq$%~T+Wgi}viz=II9|TComNEg&YkZ*i+jYc{7E$5-fGcvNRMiSKfnW@k`idx`=JEA z$Lg2AK-COB^>%gVKF?-neV6q=X(ywL&#oge<`+5$|JK9H&6lp%;zD3dYq5tenXWOq z;Io1~H!6GJtc})^$htkyU4_=Su**5``rV0o@lUXFK(XmH;r17-*;be`RY&MMbNHV7ch>6au{wghb{DS-t4~PwJPXYE)0FSJz{!)D= zHC_D^JNFvB@Y7QhXS|xU&1%0A<>f3+P19p#Z79^*)-^lW%~Zc?-N$EQ*Vj6;i(PB9 zE2G)t=O^#n9}NVI|4|gh*^{+~-&(!;&{nz5p}D-qa~63mUqH1yJ00J&+y4;_IJ!KH2Y}Mis)Q$)+mUas3jQ%CBdhXTl zR`Q2H-E(^?{uzK5ZZCQ-2hZ8(>ta7STrL%Npm%`_?`y)vPuRT$E|KJWkph=?!|lbv z!xuJ6_G@~s;YAtzwRKMIw5-9yxzyF$2xkM)bNd95F9yZUuj+7W$J8kT33h$$$9{;@ zDcE`v@eXLHs1vGT1nfVt=DPf9)Ps3>?KeO2@q6%8>E2Td3~t1;{=s)q4+;Ro2hY|} zD78gu1SOT7il(E02zsIi2U71Qm{EHbUdb*&1}9e?$!MZnXB+ZR*Y^sKcR z^k)5sPw$!c6{rXYWs@I7yT0`M4~m1}1w7Q+K0#LJiRU*5P>pbNC%dlpY|SdMgv$vk zZxA>Ez_=f9a|+WgyKq2&g)Rg#Jl4LNI%VuXu%c&JY8XAo%_o-yBo*z&W1zO~Z>Cwo zjL&_wMm;VQd0c#0XBzHljc6w9nt4zcO z*TP9XasNi*nHSzWjJxihiXQ+TJ$mLnec8AGT*dt>2i{9a?`y+l_l2kH?de@$et!0s zSh1m_l^lIqdb3BDh7;@pOM*9WrlCW|k zX0e&mv7SufTYLPVWu7mvf!WLJSHRLFhC4~mt%~@7%2(3ws_Pw(dN02Lm+mPO@R+zb zIt>W>GXt$ZJ3^dTnzb1!)-M}R9b)Z~iFA1Ao$FI zpuib3evE16c;Ja1td|^B(oL`7FdRPlV4?8w+T3p*1S%+J1hx(yQ_m&09B~fc^$vV_ zF`r-X8Iz;AhpuLS7YShn2Nd3{K)l}Dy*Bup4xe1kZ`9($bJn!{A@XsqUQ7~m{ThPr z8m~FLLA64-LBvBD^u4qZ3S>~xEdwpu?laE1_x|<#LB~Dowb$Zf>WLooJhV4-YOB{^ zO0;jbNO~H8IdNU(TAQ-26%fIxe+iOTxGj)Gyl=v%7oBnk+x-vI2FAz#sX<}UPzeR+GEbTRf9|9L^UP5r>!xm?D)aOMhT zUtw|w)5EIvW;^JMP5xqGk0>Moe=r7T-1?oG`pW`_SAARG9E+l%VI;*Dzx9!MkXyZ1vtGH zN7|7*lY}yBB~MBpx_IRL%5c8K_5{}k!VemL>rKzP_>`DF^c)troZ*%v@|RT#P%`&tc++vF9WwIy;a`~go@skhyM9fk5s!xk65yA` zTcdkWgwu=Rxnl~&WAvd*rwHc;U4C;8Be~8Ga=}}Rh1gbGi=KlL0 z5mbB9`eAwf=!)hdQ!-_7a`5FYuyF3{zlN*^wza^-Nj%bT-F?CCgv8Pp0#zY_;g+IVxNO?ah8cs z_F{5V7+Nu%!Nm7DfsY4#TIU;+y>wC#P+kAnJLvUCAPXSr0?f?Au15a3mrjjQtxd4MFyy+g0>qCZoCvgh<-4w)Z+&1?2cNJB4T(i@9!-EBUB}BA zI6ky}uAVJjX2u}v6xt#&(Vf23RZp)olgMXW{>j;6_BFD>+03;srP;qn{-IYW7TJxW z94JR~iCv)L-XrJ9l$XgN2~h^_T1lR#JeDr-!@NHe=VXydm^0M8FOOO&&7w5#IhF z)DST#xM58q-t}W4l2?bX^9Tb>?|JY(Y_FpieJ?XM&V+Zai}I1ilIevUHZ?V%3ovHbAL2qUu{Vk4<;hH{uwKJY3Q2?o{>F6HN~-!l9w?O?;0H%FH4+0 zj7>tYemdm8ka}^wgBSR?hTbc*3C32Mb1(z>|-AlA&yZ0y&4S5Kc;?hqv!f#`w^d zyVn7j-zFugp~V1OjBwlx9*yV&fsh`_(9iP=-xxitL=k*U4L_c#?pPHxZ+Z4`YneXY zE?-A+xP?xE9)B`5H93C2087}I&#V{Q=qVTL0b)B*W6xzm zh*IIVDtedCx=`RzPmh@t#DKAp!6%YEaVqC*PtEaU9NF+wZN}`b=aGzBNU-x^J~I#I z(S4wwlAJLs6e(o=mLHw9TjLq-F2K~~IYRh5h8Nf!U*1c?uBlQmW^V9>F~4-j7BMj6 z1BfT%IY0BMC6Yk94-;`|O#|#%EYd1?7-&+M8c*=$;A1Z(vW~33Yr-eY>Cry;SxT#! ze)ccCD6}ME_4gQ8>1C{>T6hdH^7>bB>Kv=onMv2wwN|L!7S{uGvG7x&gN8h|-}csH zYPfou;)mA(Oor7*{HiAa`)Aj9Zfw@!bA>_7B-9VOl~H>`Y#6LaJ{j|@LdM8)LHSgR9vzr`&So|_Flbre zq3?)_-4`Aup!mlts`aYh?kDdGa8*MVPYWo-o+ z<)v{sUT;iH+Wr%4u62#6YbK^o*4-X$qBhAuG(5UhD_+iQFZiXc znhw5o^l&8u_Shr=T>yQ3oV8DD01BX9#wzF)DQI8KfK|>#Xo6m z)I6h-Q@fJ`hA2!A2(3wX9k_dcM$=tn^=HR@x4ZuV;G?(O8#v3HXD&i7fG-B;OCW%` zP%|Oi3s%68{dyFp*m~IpUyty~7VPVW>+;+aUF_u-1*R(`jiqb;*6gT$#_7^~PI8OH z?y+YSwtwCk=Fvz#x*^w-Sk|}w)>nbO4S3A)+<=y6zu7D6+Mn_(RGGb_u4x4FpG0z` zewK$$sYk!R7xHBj9|0zjdZyA-;2fiej|y3Jx+r)XxU>x?-W>aunis}=#f{-9K;ibg z&@m=D{vIB4azmcFk{sOB&6(A|=V#f|cPQaMo>=P_fGuRcHTM0bp0e#by5=j9);_eBW8CPMZ<`2YZ2||c zppy~lusr&XLr>+guOnQ>`YZuWH4b;qXFMub=w33v-cj?U^LVrD*e5VJ?+%lk2=!YO}>O2DAnT-kP3YS<6ozG$4(o z-dto;CjoM#4aO@qp`fOup#_aLskm%~daV}+IzfG)gM`l5a+-ua*-4mhfPgfQg9#(S z`qURMKH*1zC;3#6{a-Vgqvska1S9>v`dc9-2vJYa9%~KZbFQKfpK*N>Po&y2qktiq zV2*@62_|uSXb3;!t!K|+5H%*W9d*Jt5>`|KShKI*e04BLTdi@S%^}S|cc0q70b+C}%=#x+ zTynwK=dvfnkw7SGqxU=uU^0ub5k;C5256?kSFT#bvwxu&*Vz2oLF``J-Twe^dm%r? zamc=Gx&*!mo%dw9FzXfSt=gA@v?0D<^TjtXu2o)xxrYXhnlakG!}dT2koKKL%Rx#8JOiRCZJ zCBHn0cyh2aJlD7Vqp;{w3_EdGJSJWrg$dC6y9 zZ7}RlSnX6;8~{zI-#%7RGT$F55uiTegg@g`KnR+3ObS11gs(Q9^=fa{K%m+~*mZwq zpG-f;_Rk;IEyY~40Q+zd#GID>>=db-A31QUXg)dqXpbczp};YcfqTZZi32u))0^53 zVD-&7g`*IE;a$F;C?7^1>XFSr#(qW67r*vz_^c_G(GL!xU;7&XHsKSyJ@e>|K1v>Z zbkcp19$%P|6V@dawh`0yFqeC#Tf;@!mwDtDJ6=q|tS0Wh-&{*_^wD(h*?0}t{u=j1 zDXTpisVQW8Mm81>3yrx82$Lr*FLuU#daX@@(FaNBSyMa{MWbp3PXR}G6a+}SP_C1d zDcBBY&%5s~=FqnPSVGE+T&L9EnfFQy2`41`93_{(EHv=;VN4J#q~WB{P9{Bu!0L%e z#t-R;rmgdXM~H{LRFw~a!1gNS?7?|Wb6P|98qn`P?sXDVt0z90y7z~CYabQfsBA*( zxB29e%=sxGvGSRv{%|9Ii~+b2gO}DdGduaSRR#siGj}#;pea%nV$wYw)|n2QJsp2x z8D4ytOk*Uh|Ms}Cd+hK2Zvb?uUY!f8BRy{f<7v4RKJvLBB=VAT!F*@j_r=RgSbhMJ z_n6D&3n_#z8aFMP;b6WCu)Y)MYLHU=Lga$NkEUfVY$hSulkwDQNo!5ap6Jl>^r!_W z)V)fNEiX!5SoH0$xxK72QuREvvJfW(s_&FrE_C$AXL*fh%HO_OTsRa%-s`W8*OiHL zq`|16-M&7a>j9Q@*A*mRZ{2q^3k0msv~mzQ!l_M|_|86#OlyfmSi~B)(k!4c7s!R6 z&00KkAdg_du&2c0OEKiaM*XOChK_YikHDPEh#`0~Gj}a0OF=wn^;%d;mb;i&8G`ed+$}e5kVb<)Q##5&IO1V_8E8Z7L zE#CeDd$a^n16SO6+o#~1Ly~$PdsPa#h65*)O4i)qvk!)) zr<5zb4x1~u8-0BDI+uPy^6zjf?6OAcvQOY$L-nU>>r_m}%L|bfqI}{3{)*>EWwSrs zCZwVOKR+lql(1u&yMUFVfH;b!LC5F$6Q`w{eNRa2=sCxupYEUMd&OSva7p2_^c8Ro z>bow}2j5O=FYWkV`}_ZQ0X%y2oG%ME!UxVkAN`*~bE(cN!)4%Nv^NZlg8VxKHh-?e zXmWWNF5(EBmwOn-RKLB2rI1V7pT76YMUANyI<;$d6dHf{a%nN@4W)husbG-8_5afz znKt_ibJigh^S3nq`hEC#2!I407*Bl}7Mv8gwWbyz;IMa3Kymgz>)(4q3LX4nm59TR zC*QSfn-k}1SIL*Ur0a@eF+j?>^6i%brkY^>E+CJt_3YuNmW^SAMq5wEwbgiPwO0WU@NG%cXLHW@oEbp1b=J^v=J%|HJ;^Xw z6FM|BccllA{bMV~F9xm&;q5hhjTQ#e%J1C$teM(QzN;0VG#^@)R8e|z$GL(zbTk}+ zVDWce8&Dh?r`Nf^#Cw-0V$~lxGrfNp*$XKR6kJ{uU%dUD4s6!t3Y6@znJSy0r$T&N1=m!%tm79Gom^X=IvbZQEa7ikePMOHuQzQ-Hy=enTB= zPJR6cTRA+G$ma83Zu z+B!|&^+FB=*y+vs!Jhu%@`pREih$y8Keo?@KX8D1<+f;*YjB2HFTR%#s+n0Wn*U^4x2F?q4L1{R58zWDBUrm*9g1 z7)My2v^}!F9;KK*$lR@9y*s5nbG!S$0eBjI0C+A3%$48<(R!QOD>5nfx&Uza#a*~u z&|aE}L-eJAIJ}VRGj_uxnkIEP_?D-kW6b?)A&0$-bbj$oFqlxl3*OFN_gbJ@l*% zT)%XJjWqIM2Rl_uZOkU=GW^YPdNA(%;2WH|{Xy9ub+y^RoNqMn8(Og72<%{qWLES3 zO%04`yVrP-_V1b+D;Cgke&*+}7N3D@ym)B^^2B!FBQs}hY%17i)8#7;u^$VxFa$H+ zywS8=_A1oW;QM>jHuUJTPUL)k^`D>T?EG=s7e=+ zwRGUxMTqnKOHp?C^rcUB>I;8;|0r3G0eQHNoL|{jkE}5s_EI2~&(mEhILeO~If9q9 zI$({k1UWEx>`!uWO8wy|()FX{;Gl^2bE#C}EKPkp*4kRg%7X>Xx|OWg^rQc4e*-Z4 z^$FYQ%i-A+&tdl#(D!p)+PW}Y3nu!2ESpQioR)lYi4fGMw~)zzbJ;+xWL}Djky7)Q znJyvW^OF}lFQ$D53+L2?RP3q1y=FNy_Zp)!p(M!Z6Mn|bjj_PwCRn{=Nk(_AD?gg9 zo3)K^*KzWxX!#pw_bgFE%2-7o27^-asK0sjXfkaNzG;&zkbSQ|J`VG!ar;g3s5P;s z<$(de^>J)uvgEVbd)Xd;{VJcnjFB$YmK59dpZV}$ z=KLV_93znWx_;;FJZ|1M*d{{G$K>nUmcJ{7PfY{Ypj5mb(us`KwLS}EZ}tX+&U2L1 zXZ?1aAT~L_=8~xYT9f5w|0>{Ki53;G9ee&tn#p5%Y2f{(SG)-N^0t4oPHr#6AhRa@ z@^JNdRS8TQv2*{!QEuw@JtEl8@OF3dchvhg+F4ipjd1x{0~OUDk5!@1PXTWL=4!0( zK_k+$%Kk_Jns~{jhgR*irUVBp^!l@d#C^8A|7QT!W%BX&5Ow5Sh~r}TE-B_0MHBOS zX-ZS?OT;bYw*^S%OL2Q01mT=_2)3Hc3CEuolS}$!&-evA?9_&g|9#pF$WJfrTx=UF zn1)wd>janbuJt!QRf;B*_|{b)zIQ4)3%7ujQZM@K^%T%`Dz5*VX2W=vZBG}=D0z1R z7~{u|hdc9&m)Ht-U!kGU|L)jp;=jlgh%RdmXBC6q>F2Q@Qxf>>o%e={4^KRTjyDsI zOeg|*G9<1KTt_>;DB*JBy0#2`v zyIvsH7(K@aG;9O~(##kN*PK|$GnOly?^A?>b3Syb%SwZ4H}P29IUN4TtF3EBs1^!arZv})2ZOTvWU!Suzc{_3p^c#Njs{^NnLTK61SU&yR7HAY3x z2kTw_hY#4UjFH#M;HY8ktM%ekKL}Y_l##l<^toqm?|$c7Ztwi`Prkk7&9A?`FkA3uNl$q)a`?I-`2pS}I9pZM_YNB*auy#3-YeMI{awRIet zdaQomA8MMoG|lk+nY~b~_hA7cu)*Mp)i5pVVtncX%$_IC#_jWq%&2No(G-S1zp|dX zgwL~H$?z0f;hu5puRcA+RaFyn{48inaAg`ZCFP}09}i8AwmcQvQWa2Seg6nhj{>JZ z!$@a4X8#DN)raKT=g50qXdA;U0=po5sE)XEz6}K3ieDZRuaEa&ogdtu#VpASZ~-eo zs7U0jOon1Y{A1ve&_pVx)-%cTkW(ke6kC5S@#S!~h@ zho1Ej><<~lBZWVHaa=FH=Bvg97A6~jk`=sfHi;UXHjk&S>1^tK7*EGV@&2msi)#&} z?8hwn^r_Sc^I9i;$KF@#Qfb!*dj%~}-}FZTHVIbGOUs&%JvA)nc-9ZkRaZche)&*F z&x}ReAD2^rxtjNpb&KD>&DgM<->YBwvfKN=^z&|C{_Ed)`UVrcEeHfhAv-E+%+-th{*?00{^?o%!~C%wm7GCjhA*rJ5=NDFFlK!9 z3kqDmggiI73Xg9EnyWorkdo)Rf{WI=Gs3L8QcmX9iok?T@0TQ#eXkziG=29wKkfF7 zzv)YEU-a&`-=2N;AMQWj`_YfSaQmx2^0#mQ@qh7`{Wk-t#ZT`Y3+S19wOz{wYSF2g z&}HlZkFHuPwn$-#hn~dwr4Lie>&%%i0Z;bh+{-KDP>@A$(0MNo#NjvfD8l-iIDImv zhG1An+jX1r-C&&p+~YB%@mP1MxU)E_r<6sBF3{YcBz?ro>Ao@#|U6`~Gk_v#tr>e&oOU{#al1?q~88 z{0+c}wFzvnH8oois<(kwpUgf(#{e9tk zv8FDjikHLGb*m`q@^b>cu*8reY=p=2#d8_M;FUVGJXWMQ1|F*e&Sw?C3j{w3`C?H( zE#nl>vG?cD@?VB@ZBnv6-19%xL~MJGqYDwC+V!N*zNQCLFQk0A9 z+SUmIvQGGjY|pKgGWR?zJ<(R9DjK?}m10?5?txT_(IP~Y(bjpM< zzPK?q&cd5N!olhS+h+>!{!yQ$!bjhAjXwkp9rNEF96n=TfdC`mT2h~@8{e(1QPRSr zPjfFn@89^JdztT<78IO`EJ|%;GP&dD-LI3s0pNIPTrw}12O;&>7l#X$F9`5}G7ry} zoN)P!FKt9mKN|*A{(1=&E(1iz^lmP=W-hjwqc4k4$5B}HK`;LcGMu<{z2RTv44C+_ z0b!3py9s)4^Ty9!2XL&&`)@fOD!A}iJXEiLjiA6magQBiu1_*#nU~)R9NeH1*tiq` zZM8(tT)vFQp7MA7X6^l4U*g1T?|$?;UK_A%*I=EWuz0=xHLtjR`!{~2{<{Bj7v}%Z z!Jq%{|Hkdl{6{}{``MrS`RkHeL^tG|cRYQ+lrx>ZFmIn{4|1(vV32M@$vAhxxXT_7 zcCnhwK0bbaoLf8|_ElQhsWtw3mhgl?YX;JmyQ+wOd#qx*PCWYkV?188dbq!Az>!2x zP%zV~+bdQX(izupd`@XV^0VYsB*&UM&-K&98qOcy!KimiSPD*ad=uY|ka`t1FC zu&z_ZU{&Oz1dxZ^MQ68Js{+?R&S z@GG}m)_o!M>gqr7h0kl8wnw>O)x@9Tj2GB1zKf_ceJ~c=w|pdmvp*3u^ohTxgG&yn zFj7%{7alH*z956Aq_cHyUl}gGSFrs@Ow`3lNK>yBAC1GGnv6}AcrsdS;GK{Y|6FgW z*;m+VBLJ<-a@@Hjt;5`)MG4F`#xz4XM@qxBe(%N1MM)iJ(Hi&ut%8D&Lv`cPwKn$^ zU-a3x@BX%b^7e|C|D*f=DtZ6=KKJ$|@A-_|pZfRz%iDkZLqF<**ZFzP-jFPWp+2p@ z!Or*j>HQOm__`N>vki={Z3~F7?_Zqq{zZ+wHN^aLOd$RTKbL9Q+I~n_GW0*e3Yj+b zS%4oetKeu#X5Z-d`uSt4@dyOIp5vK$CRs-!S;7Uhs0^C%dORCH*Q+tH zEYv*kUWaFSbROTM-ocp8*k%tEG+zS3FkXZts9`}K?jH+ui*M*Q@;*QE-%@0rwFq3w zv98nC>sYEYxa000?tfAEakx>wBXj5;>ptX=6`Xi4nXigKgx5u2LJacYbD4>AuVL{a znLmUyFrOYZ`$E?Me6`n?!QjB#OPp1sW5hd9zb-F0;`KM(Som$JJ?k=BDda3E9KTvi z6U!nfgR20(tv=<`^Ksk@A1~H#t*k#Y1tk@KDO%RR;n#(}?t-bfkq*G~>;-G$L;dvi zf!!KYTk|eJ6SEe_0%lvpkML7}{NrFR4P8Dy`sEr?3nU#RKqX9W%@4osF_idH|IPp1 z{_p>tUw!+Y4}I-F(m(vWE3bI|rMK_-XTSdTo!|OT++NH-ci@6qA_vd~W?`LmZD;^v zQ@ln~vd*3n+3YCKH0K=GBLeYS;~n2DAW`tyR7~C}b?&Tndw!ZsGu-@~{~TzttYP%x zr-^IPOv6d7HO8MrGM?9H(Cm@3JUR&cSTj3E+Xal|+7_~`J0E7DFIm>FSnAejJiN#C zg`{yXxW$#QailTUn(LJ{f`}wi^;jH4D+Rz~4MwXBG-&ovA8iO}^@;`Y*uFRD#l+Vr}pVN zyA$E9yVp18hsD$ox&ygHXF)xufg1}RG`rIM+iV59 zmp+UUB5W3OjRv#+d>L5gQS;pzP9pP!Yktn(kc($4eCQdI(4{fw?^=exOU`!z3N$}6 zj5qjfK(ftw#`<6Zl@7Qz&54mG?)6IjpgX?;XQDy)GtT){JiYZNqLS2@0-l(s=Vyr-^s|xceUfdcgF)xZDIE zeExv5j%;Fpf3n$t|L8+%lTnufZ|RT zob$H;@uRIeC)WB=c+IO`e)~86;0JD>|2dz2Fh0J9pZ~76-TwF=`WDst{A||L=M7*L z4A_+Y1v}eo;B}nyCvome*aX>M&DtACjDebm#}_=Ip*X$hxkrg@fJV`;I{`lOT=xeI zZ9H42xrB+&1aIFD`1_xfs-ZSqB`#0;D9=`JyLbiZd*rz1> zqIhjRzed;k8@R*%?tcKtJ@Ae9h3re#%jq+n7tPn$Z^wKoa7T1$d=Y$Kj8Kri<6K1R z;2=Ktj5J>B(xRhquia*Y&CE4*T!6KXyc9Z%Cv-)|)BcvsOB#B{&EePeyB-8Ju=V(7 zLbeI^A&$Xi%(H8zA1PzKe)9Sip9(k#bz0-QE(FXGV*3VXpEE!D;97xu3HZE=1%Rl5 zXvHC_iIZx}7aH(jO&5jPiA!Ye$t3EJR`^5m<+uv0{9s!ZP(Ckv=}T_k_g%l^_L=%W z^Z9sh@BH*P-M;S+eBk!HYF@2-;y(8%=M)6%XPu4KJNA%?1&(lQ zjV?^@pVz~fNLwan{jSi9JFqPjmqWn3k+O%!>|^!sx4-`%0FHz8P>0I7_T$6XNq2r8 zwWGZ#zGFi^(7rH`SIcBwz`3aBB?DT@j^|~uOq2A(XK;p%BfavP6wu^xgH!$hyxxqr zfBA=qhc(zQgk=YI^7{v7?8Dn^jl}Vu(!=NTU;%`7%M2{A>J#}`XBj@um6Pj z!@tGzL%<*T=YIR`#V_vHi+5^$p=R&0={rvlJJERv!f&pXWoL zfcq430O`U+VeQi?;Itm@dx2X(ebvw2rK}@Ae0O|bY0#|KulYbSU?P9VTym@0Ji^ui zH$XbZ^xap-h%lhF{LJjr;n};sa#n&LpqMFJKK{e3x&^s+RU$BKFdZ zi5F>~2mX-jH9)^uUJ?)5B#cX>&(M`04JvxvKYQ*~3b$WtXysxvKDz+h5KZe|?|p_( z-n|C#*PPhY?R`-u{v%~zct%@iob2CR`iEx%9kcjT7b@ZVUNQ4}T*zP<3u7{T3k)m# zr1Es#fvkJ2FuT?#<@m~jg=$pT0?}<_KPOx|Ezdr0;wx#p#OR(O*;nI1J z*>?7op2qfhngHjLJBOwb_F!aR<=YeEtbxI!*~2l-5ymmlS+_@S@qDx~XG&_>)d;E}UrAK+t?mM>st}>9}00 z=YjV5K|5Xt-JTE5Z;G%UkL9-ua7~n9K7R3H?XHms{_cZIj`J(lG{UJJukp6X@P#sm zRPIW&vuyS+b8z?E?*0b=A0CIP0heUm1&queM%_k8YX${Kde$l!JS`x;jlCn+@fF46+pfwqF@*vd`c2%=xYPIp9f@0m_Hz( zJ2L0zS-yNGoP34bk4iVX;avfn)3&3(QU6oFkH>%Dua*94{nzOq4E)M3d6!|?{y9Hw zfX{I@nzP-j&hGrG=Lf7CIosE170&wB{TUK|`Ni>f|EG!yodS%PPXIwPPNMf__gA5Z zKI1lb_0-(Pj_Q&9c(Ttbf74jh%%%p-qoMhP+8g>Hw)l%Kwt&1NtS^0%j$hqoM-ucp zDTj|K2r%ZM;MD4rA$z2$8xTHcX6@hbNjiUmDnS1+e6lYEmb|^1xySzQe*oY(&kLGE z%#r(r)TQtj|6C5oOaeJK*13H#2I~9NlzHRD#l`_PZB%>#ts)Zm_zRFCgGDf)i^2i1 zFQV0;e#XH}A2o}+5?(e-r*}~l#s^{t_$Lq_Qfl>JY}(Xsv?UpltH0(6xwers#tCxv zVsQK+S_E{~~ zT~qq;w%6gOq&a|AE@S?%YZ+swaPYmV+?N9jp)EAC@jq)%f=p6-uuRo$h zdVA#$X3Ysz+w@?Zz{g&g2I_ud)wi}{u@`4_W(Un&KVUFh7Ki={3P3#=sa3;!J05#K zlMnKKpLhQQ05^v_vk#p+;9ImVb#p#ugB#Jr(0oDX8uT(M)%0;cdYK48?T3p6flF87 zdZ}z@BQuQksBG0gG=)t^7`|D@1!r!L;YUGF3(z5i%IGk#KLgrcE9+~^i;-M?SN`B% z*6;cxf=)5?CAL@cuyT#0*8XVHvQtMSdycMg1mLYTYT_^t?~#*+f2;?d_7DIq1Wb30 z%_UL)F3p+-dyx^a$X@>G+kHH>bIt zYp4f(czU+L2OHq~TjS|_C+)#Qt=gHPn@{-hnW}RCDIc!_ll1jlI3*XqdFk4}Yg2ED z=DRriZ$2PHcwFAUA+Gf+KW*(FT<6)R@po-mSDw-7_njpO)eGWytP*GWU|B^K%q6D4 zTK{C5yT|_ie*n;B=;3qNd>nCnG8)f4Avq{|O+0Tt*TrEjnSV>od|mwcH7L^a(MSgI z*Rx!DBh;0od9P*JKvsP)#PcPk9|gZS9&di?2_Ajx;sZ&Kl(7_s-L)1MeqKiE$O}Fa z!x?R6h|XGECuRmKN!I=>>5aO2JwMG6|GZcf=$HG3)9rwT~kK&;e z8%#a+Pk!trGotp-Ij8m-z?U2_NS!dY$i>>gy|(bOufQMO-mCv_|M!1s{_0%WPx$u! z_kG^&z3$8Z2smpZ zORVQ}p4oVev@z@5v5#CsUfNj~(A;0rUZ3XmLpIWiI8G06B^=LMnn*ueA|Md_i4R?4 z-=CSUy^!!i&Dsx=$w7c>WoQ{S-1s$?dpazOXWW`y*YFVtWb}z!XzKDh;G{r|?Q zllOfnu)V=sp)VcuXCV4_{y;>aFNZDk*!cXRVULy603RMC`hN>cXj<{>KF@8(#~k%Y z;KRq`h)x_KX(!=}@3{jC@;e(4oSs12cu`E3PuD_jYqB0;4QFcezi3C=%TDy?^smAF?6<$^_UWJUhTB`-{JPs)KlydHH@@yw zx94B}-0kK1pQ*iE|ED$mSLJ&D&UG$R3ZAM~{a)Ge$a-Dz6p-;T8FbER^bUnpw^nfO z^#S>W9{%xv@mqazd;MK;mc`B3w}G>rJLj$Heu-1slX^)Jrg{GtxN{|Xp^UoSKB9l+ z@h|-1FWvsnU-(7$|LgzubGM)R>7Tj%6bqO(NrY44!sh6 z=jn+dPm6!**<&TiTfhU2CpObnvfj(QEzv?V+7G^Gq{W_QUn39Jo@lmUFcw$Pg$lv% zU*Y}7&}EHB)w>>K_}+>#C#Es~!YlfEML;+W@>|)|M|CbmIe(`Sn3i}P*BA}AR513@ zt>}U%u<&8ICgttLzEi3H@7gtVd?=!_FIhvl_xim19{_rAxhy=@=3?|hB-nT_4p_5D z7~%_Gm}0)@TweW(7UQCG(TLAg%jg7HHd$C5RiS<{&!xnme?ahWE-Z(>Gv`J2my;3H z0uLn$plPyR{uD*NIC{S*Aw^5$AfphKy?#Rli2v3)i-d3Q>Fenz`ZD&H+4x)QtV=U;w%rT(i54B!4~pM3jblMTLo^{Xp<{&2~wW%3aN!C1L+5%wxr(G&KZZjrE6rWA@c#@vAU!rgHF|WhmUK z-C25;+C3JkQa%V9iJ!dhpOp5R;D(=Cj`tEPj)6d3`<7Bwt?|oNGz}(Z7=7Eo}F%fB1)vAmtzVFjlSiIADwJy8VU^{@d$j`#$)V zUk}9@w{r@#JN~Y=1R&QujF}Wb?eqeW1M!SC*D7tPQT(SonH7# zH386L5*n;=6|VhyNfiE=Ql>;NHiIl-NjA_g91>wH$T`sBHv@lW>uc&dR_aY}eD&>X z-uEtlKJ87fALV{A3C?EHc+*i^)4c5LD{Za0XX!rvK^T_WqyY`7=B%p;bH>fbu!-oQ z;Q9lsTjGt)o+H83?Fn%x6OJjseIPlv&POQc zFL%uu=Y4~?3-~Gh&A<=-cRzglbARcFZ$JI_e=azj%30`EKtN-A800Zi!mByZS?(xx z&|H@$;c&0jH1B=&6dYmq8g)XlJ`o6NjR8E~svW)LyDzxx@#GZi`NeM+KpY*~j&@FN zva?UwmlK%cPcXC*2DJGM8*$61GM$!oD0_qHI?#Q7_YIBcW!NFP!28I>wVWvP*LUE-CW4 zh-(~QdzwGK8t28@K9-8GYxVV(ZQhAlND6cz&+8P-KJhjrh5bxnxf8_I}@fmM<zCfX;tM`Ygjt^%R>B-bCTfq5sh_s* zM?4+8JmQ+r9-FO4Yd)41+sI$Xhi=kYOKb6&9hiF>vfb+%XtTOj@2K~2Vr)#enVtzm zk2NK~y9+d_3IzADo~h+{zjTm2hX)0W+b#g^U;LrJar+Pd>|eP3_)q-3WdWk@t>v*l zxVjeitc~B?gS7IQErGW{{ z)dxtM1^Bxn5vscQ>^)apG-Ex`*!%MMT^WHAMmb&e&sj8yWG$zU*Y2vw#>>kP`rdy4 zxcmPKAQzN-l7sh`PEVIx)SJ(^mw+KxPdAB+LMz{6E{T$6-I)ZYK@x zgH<0=9iK14@~tbBU>Sug75)n7A=yH*gN`Ib+*eej?9$MjeI?-(8+c*S|>*~1s#n5i32 z81dDRbxtmN-QCnodH(DEK<&*VD7461CKEk4 z{;_`j@;Ud1x%q4U*&&W6yEl7f{*2is_K{d_D-pFE+6<$gz3y1*K7c~^+$5{cNI=$5 zm#_HZ&%J%c7k}REul(?j-G1Od`E$1)|2rQJP|rxFqO324cC7)lcvhXt(Y~zLeu{F> zrcfg#ojx96W#wEq`y@411Qj6WHdqDF@!2@Zj3xzPy^`WiP$`u5b9V+t+{9=igrR?9}RSgnm)X`r%5gYhu=M>+2Un>*>6C zoM}1vthE?8do0|ni!}|>T=M}(YICgGy&=z?W6r+|{=S>H!)M*~YrWpT%-8<&Ek1D% zih=8~w{5=cAD+K2zyLZv&W!zMzo!oLJ6CAh@Ptj<7=8#Wp7nh3dp_&-MZfNyxBvVH z|H|zL{?i}yKTzm*7h(ndrxM~@Z;z>fH2`OE$#k!fxikae(B_5?ulr{%>G}(|-A91@ zH1EaiNkYLax`TDBcjhZ)%EYFC?J1ON1k~Z?Px)ED^4VW}f@yEEABy|kH#mYCKH{G< z!J9B^o&`)uk+$x5_PYA#{#U+?d+hK22LKep*x z>q3b%Azv{5;jN`V0=-C4tNdb3K#piNO!VM;tkRt3p)r-_vbr+Y>3{N8JjX}N_kK8{ zxJ~Nf8GmWv+jV(3b=4n*@u;@ftO+&E_RT=ufa+<;OzKI@4PUhBSBP=Gv=IODU;ml6 zfBtuV_3d@9ecm|a&wTfU8na6-cjTkbq&`lJr`P3rjnIP?Rc9$Xj=Z7%Ltva%Z1~;~ z#%dZ@jX`QoWYsUx7araJAO6{p*)wfM_ab}h&Dq<2?msCX2j?h0+c$8AYacN%kb&Ba z&--?sf5yYlp@!!Zo1we7Fx>psk{*?>`x^b%QD5?Tx9|TC{_O29>AxPZzyIJLEf=qG zy=E=ka@N42TK>bDtstJ4KKyKnVj8$EvINy?VFE#Z&kxI}3@kvI!iRMAA06p|4@+#s z(Q|Abp6q>U0eypoiicE82R{m((-VsnZm=Cp>@=K0%?%Oqcu+TMVORa!Y*B(_ivdfWzW&F6k|khx0gKo?Cm?g`KxZ<`}=@+H6VOm z_v%;P{^jrZ!0q>a>u=G&$m!Xv$Djd1=_Zs&ieEFQ_d5oUrg{8xmu5%A*v;Gq9`+#7 z7)JK9plDQ|*_1(1%y@)LUHqbcBq!soT%^I4HF3Lp9KMH>+x6u8wRO6WNooS${bQ^T z(>CvcCiLE7kCPp^=_RoIm2cys;)k!bV&wFcIdMX(GUv}nX{V>h zLy7u!3YWD`1>KDH01&Mu`=T-Fw&(-k11nE?%OB5;k8pGopL75I1wgfQlDpeq`pZ`+;uwyqjgR) z)|p`C^#D%dl2(j-?mnvHpP?z`FWzW6P7o~G!-8k-rEjP;C%Gwk3aglN%`BDk3Psayme@n*GVa@4V6MeKACz&!LF0@Tx zRe?~9=`-GQqljBcSoiEecpeSk$pVd=iTO?N@<;6SC5TL8gIL>?3ZBvb9{UZqKlv|x z;P%;{{>g#J6lK@m>TIxUuGT73gVsRKTxxVYXWMwVo{hTjn$8kDi9b4tkA16ITiuH2 z7hhxZ-Ot$~Kt0?1sTpyf{DrHB%H~*mVqW9y zL)KaxN*O!OkO6)D)%%^*)B7-*>h>B&4vOg-R5vm{CF89%czbk=-qb?;2+#h;4+s0m z2u$>;h8C9Dlkk|Lz?%q6xa)yHPCg@#bF6vy8JC7;_Jq+<>GHIgl}yU$uAle+13=H& zJvWLrH%p_w94qXc;)R`;!=NOp^f+I6C#67Ne+_zf+oN>lSCx#~G0h7x0d@Upb@53Z zc=P>O1uPC+^VOgH))g6Emc0+gDc~1~L_f1X@yqL#@qXe39}3M>YS1|JWSW1^XMO7J zPyC^8y1n5wuQWI{QuAWNJh<$2*$np>fv)k46RR$&Hp)PZhy0{Zd+K)W1li*D43~d& z@?}$1Vyel%4DKdq@^mz|C+nYc`8^Z@z&UK8Bm%js+%=!Zo89V4>@_E2#9 zxPS0yeF>M$s;71Ty3Pr=(g)#@8J(U(weGOL`yT-E;+!X^h)IGgo{(!3BeAt}OG`Y9N`ZU*IxV?~rC~ z@S~9)D*l$$BT}hrt&u1RwQ}ukadKthpZYyuY|KFHV^zn4PL45|_k7l;-Tt-j`fd6r z{+~-NN_dY(D`kL=XWS;*dQf653a8H=cP#So>01R@<}~qPRW=bqiI;_$?Hb;?F zzoMqKPWo*c?$h*SyVm-32U+`UG~w)3`Uxk!_SuZJW4&txJT^&uU4(rXoYiBJ)iQ@% z;#;fdpYH?C(iC878#nbQc&Og||1$W;{@}OW-u+o`Q#^O8Tle|m(;+Lk1sRD9Yt>KlOhDoS8xj0Y>QnUK(^1N{1t!4r@ry_ zN5AtMZqGf(|2SnlFx3!i2I~xF9;K^xW4kXuI4iYSFNA!2ENj4wY`piQd;NeuTd<-c zcbv*E^&e+&xe&|z{s+E=Y!P>eUK`sTW6<$z|Jso5qw{lroix9!1)uwZJ~5r650JZ` zd7PN=hZZrK29wWuCr>7P(gQB(tRLXC)T@6l#Y`b`&7&ksX(~4HzhEG(xtKi-L0Fdj#mrGBWFM*ulekt-|gUDsb z7k=-6doGIxRv{n}V;P57(FJne(R{gdPJe#5$o8;oz6d>^Lbtm#*>8Y!Y zVc(^`EaX5ee~n%K@X_%anFG|sbvsCaMs7ZyAA9O~IPkn}(+|`gN_fTZ8UF)+|LS-D zw%aT9pZv`uZ(gxzp|` z_yK^EJ1&6^b>36I6#dfg`7-Y%=F;}li{eXx0KZAnxJ;`Zd;pay$5|r^ zkG-Jdm$lt)FV?@c?|Xm$*WOYhjn{jW&_xs8K&!O zol^FXNnR%YC*FV?tJ>U5O z|4XXYxgR`GT_NjO+}Rr{T=g954$gMkMx)lYK2Dr3QRJSgh z>GAAE2L)%)gLP%D&o}|BYhaKNK!xe7XGbY6qc5b_pyVul?4yv?O%IE(s?nL-ng zEqGh3<##WWOKsk3VA6H@Q?sdheEaYCirYK&Py17MvC(;aeX|QOwRvi;@0D-CVD)S+ z0V+vj2dKrhxu{@`V7_7l3T-{nU3`tKbM)CH?w3&OaM0BpuGg{To|1ufiA~EEWX*)w zBEsb8(;edh9ZByWK&QeWw(nDt*=N+x*8M**_;ZeVS6YPmr61?mT2YOAdZ5h9GfupB zzU@w;NXifvhu3mBPDG~pkBmg|=?LP%DuD()jsoh|wO9_3i z#kg@te^jF>61BpKXVjTzpQE4X{XU<99{~2@aZ!3feHs35^4DdnYrKjj#oT zKnNirAqiQ*EQA1>#41p>B9v8wxS)uwa8x{s6gietP^$KnF3^@*mr@`-ZEdUIQ526X z#Y1CRiUrRpdU~|=$Wj`%Niw}Y*L7dd^Sr`Y2e#s@GB*zOSw7aK)jL;9&A@%_H|xDK!y(eqev^DdvF z|DV5INKy-#9O!qXol$kJ*S(ibyG6h(5x8dKImgEaJMfrbnEh)REWkJ64KqK9l{2Z0 zFAUcUO>=dA@eID??D}AT+%5VzWv}}8mDt3ruy9))GOj?I@9m$=`~K74v>043uKOeR zf8mGAITlXX&VfYKcb8qq2dsUfB)Q8czTq{OkNCAOTDc$X7%DlFVhxf#Pd&rv-;lC! zzBd;zt_2UtK948J$xP_^{tK-=%;|V|I)UV1TwGS4d~7cC6h&?@+QfDZn549R{7^+< z$q$#mk4OH^x^bvY@B|v}IiMd7$37jomt~AokDze9_4T;=0f5Wy!1`|W$O|!lK6Qbs9c}d?<6Z;!e9(YnZ27fb0zr#5$`cp6U&u9`!Q*2hqjK6Y z#RZvG`N>~ly>5OfbXwi1;utYC&yf^mxJUFXJxdzV75lfhG;^2Ey* zedg;Ed$eG%#wXE`gE%;q5OI<#d-8Y8kyp^e&v`qU;WqK$Wo(}Cxn_3w0Qw;uP(Iej zNQRhwzc%SKWVJcT24HVq4kpm!X|4XLX!GUGk-k#cB%G^J8{nFXRPKDD3k%PXn-=dFXeQt&Ms6C3fN6S0E|#N%yfG7D zkOzS|2nIJhpT^UUYu!=1?RpR=o)Z%z^%!5f@4RU^lkDo{a59cG(Jk{hV^&6wpYylO%Q>~# zf_&fQP5KY}^zZxU%i{Fg-0+2QDiE3LQNYAxPx94+u;xrE8WLN%)$E-zi|gK=oCf?T z$UbpMKgC0;$VOfy7CW)|yyts7?ebeb<&6#- z(~gWXIVRqAa+0gap)_%Ga48c5JE7sSY$8{N#W;5JoMhMl)~oXDah2UdzCTVlZ^F2m zhw~E_5}Xt;da=Jk3CBxkuOR5W)LyrWP_GAwHwm!5M%+ z#fcAVxk-UcIPVxKnl*Yv>fp$SMb4|vAz1mZ_;MWCcOpOIOJb(S$HOgE-L0RNq2p}b zv7htn?x=_9U;2)YUVA2lPTyxfWV^=aGNZ%Sj2o}B@p5B#UcEnj1MhZ~>&l;8oD=yq z{t0AKbe8esU;oO>bD#BoiAnCH(>Nt`d?~FT9*&%6CD$mLGq4Q_cW2Zv8FL=4#fO17 ziIu)4kmU*NIPzh4d|b?ty9hdR^h1lk>GZ@&1n#-<XGz^ zZ{0sWu4`iAI4k+*T(`Q`=N9*y{{f(vm?6%fc;mnsBin$^-g|l z?(6i#y=@-d0}TFrii#-dg@uV9*{(d`PIztCa_}`z{;(=GwiE|OAL*R`Dcc3l2>|AC zu&A~b@3~3gy*Bp`mHJg*_c3nirCY5>9khpU`fp$1>A7y??)+em|0ZZYR}98am~k!Q z^fO;bc@i@DC%k3n>XgH9zy5KQTf&aLz%K!6_4^Sj1S>q91oCT9e=toGF06FIS_mZPTJ zDG?nwPwY^+aOHyR{*8{a7MSz{a~Wde=@#tcO-eWa0{{c!A@LM&>3faJx(-r(*ErzR z&xVdvhCM8fH&$ZhJULw9J9?ATOk49(^Xf{nF>GmrtmsJNcJayI)*0`z4(=UC9*C zFThoQ9b1UYn=ga$kBedu1`;jn8Xg7l$LKF1cN5kA@&L5)@TKP_GhSAFB%7Lem5E85 z#o)uuKH6W}l3t`&J@@`EFmOw4a^J^b{aB!)JU#9RG2G#(3@JpBuyg ziC1HA2qTg_MbNYH@YrPH?QE_X!xj10zU=w>s{qdck@&!TvVsSOaE@M@tjW(g9Q|qD zsb{bQGWQ}Vp%gO2U%K*+*_->F%q;p52ShB57q6a6GEVC_NlYx%E52mZoZ&w8f$x5t z?_&KNKLmjNnP`DeH}B?I{5akGcJn^~aD%*TOedGk5b#0f!*KZQA(S)*4}u+V(z48> z3{f&$mc~S^%pF`I;E9+MApy;g7!t|AIYw>A>-c6Uo#)v>_2_F5e7=YpKk*XB49-Ug z;!80Zq$C`O?<{pVb40D>7}~){2DHzH537A_LqjpG;vERx$39v43VFmPOGubq2E=F{bu!U|bW zLl2%544^w1+cEq(dw3wubS0Kd9aLUc=TvUHZm!_YJg_ByXa|nCR_i0R2|KpncqT8s zo+c=xxGAUgA+Nl4O!E(MzijFkcyhFCd|&SHfk*wm@AYn%*L~OrqntMG7*WC_>{*2J z-SM&8CA*%>_h`(iYk7lo9xf9GDVKiE>EU%8$HzWv;e{^VI_Ew4*D&=sr}hw@A-TiQ z5I4E^T3!08Kc#YP%hvs2n)|o$`dW-woFYgs@5~Qgb^@$VgXolF6#j#2Y%4x96*uqq z9)?bC&L2E^ocBEU|43NSKwkUdFS@)>|I@+7LNeU;IHu&_H|NQ3TeNwmAfua;d^Wda zpErLHgB}d^q^5j-SZ&Ar;Tzj2Ph|&Q1injufjNO4iRkSad)j{3C0b9q%)|V0?v#V; z#L7-l#{xgc{(!PIK*NYj@}Q9i{zk>e#}5GW63^WGUOOKC!*Fi;l>1Wn?WnVdz>~Jd zVW{Pv7vnT^el~m$Zeq#1Ng*CGdPXuU40(bxtc@spR~ju*DY ziB6n^tOXhEm`0DnuG!H77#+0*Z?@paXubS!%_Yw6K++DC8OT?^@b&%Sii4LKM!vm` zep4aUrvAvOKGWJxtUmgZrbig{@f^Y-o4Yw6T+_=&!4R3NFc=RV5?wEyOdBhFbX zeig)jg#6{_NGqfS{F2niaIQf9=bUAjH7VI-hZI4dTwbK;-1*B#`w< zMnx}WT;dQ=;NcoKZRzjygUxkQr{ls8cWS{uvb6Z3p!P_dBub0U`cY*w*0szT+~Kyo zsHyk9ToIg~qehKbf>9q<$206urk4YkzWs~lHlH{D1AvE8gTOs=p}udObGZzt4IUuB ztfP{H)=Y;7X%A%Q3J+Faa`p^obfE9XO`yRjMj|9=c#);mAvRvH+V|c#j^8-MuP+8M z?E2xXqxMkYv@pah9{s%gsSiJLN@`1&Bqy)&0c)NV0Bx28egMFRDKGpP5jQyxpz*97 z4s_A0vPp*XT1(zvOwQ&C?+y>%5d$YF`|0623o?U!$d+Hu-%n1*B7Sq|URsdS1)u!E zZU$Iyd$~O-(fy;xlGDG`Zn=G9pCN3I_WfhZyHR&KS3l%3TMBXdFM!_+@X{{~`IIc_ znB`=Gh7aZ$zw7)b4j7Z;dBoWFf8>v^+}`k!uh{XOBL?6mUAFch)}7B;OAxNoI3&}M zxE=8r-r3Pd6Xv|1xT8(4<~mFfFP;a_5O~A6@!aeBZKToW4-c`@*M3JNe&Xid#?vIw zHyP(yuI_QRZ>zhfe=8=HkR!EDAx7TrNkxc+N8}&wSsf+lkkU+P6=Em=9SVXOGP#J38mI zd=HFuL}20TEf2Y2M#sy(T!AkL4wIY3MPLqcMicD-S01>an|Gs}(UAEZ6b}eU4um~v=A9T@kuqnIUMu)6bGqNoH zptBwYtGneMwClI$48gxAf3zat)ClkYzVCJUkmo-0Aj1~w#G11T$ajE{kc?BT@rN_a z4zm0fqx+_l@Wl;{=@zf6JmT1@7z3iVF4t1Bgso}Ek-aV$jbDl-1jljccRt&Mbfs@n zrRmv_T_@_yjnk4ffVwaERi-AnxyQ}_0KkCk3!Q8?T3T(oPYa&kt&b8Kf+OPF|eDiIYBBp+oPJ zbs@*wO8eM-VgdGw<@de4RUv6Z=&!dCt@^eql-udfMO4@T&$Fo!vE7 z*L`7}24S;g*Y61nKC(IGfo;M>F02f)Q=^x8Qa?IMNuCzQZwho!$&NokB!fQlk0qED zCv&i8Tz>Ie+Vr!dm>RUiyNiBVsX=uFvT5NkZw3y`|v0 zATwv~CJli;#>p~`X*gQz-4Gk!SSyNHk0{Id_<(`UoIu*T|eu3>i`^1q5- zrPYhfFAg=XRliAQY)g9zV>4QE5UyNoypXM5vij;++U-B|3H$Kn6)$*JdX1NC59dNA ztGx6%Y#`x#2iV$&0mX>ZF}lP$43f{bpZAC%Jx%|E-A~x=zyArB_k8zv zy}bDO&$@iXhrRIf+E={ba{q((=PP0&W!e+d&s?N04Gwgf%gImMee+%7yq%Psn1f`* zL2EO2u3z?|=Uo2Me;w=jtlgnq)L13EejTfJK0X}`IC&8>p2@a)WixfH^5jsM^Hxn@ za!X-DpPI@ZdrnkXzb%KQ@q|_ijk#EMTBX`?N;)9-2Kj76@#A~dzr_d!Sm%x$b4P_Q z*BcdX{|5kFoG)_*q;rCHT{1)BNuME_G2erkKb$-$BIq!6CU|kGgVS`LtQ;IE%CQj- zbTi1%;j(q4L|k&p%W}q8P$5=4NyPFHyB-rJH#?aK;uwx+W1TzZz*>J5%`!YI9;rI# zhQMy+<%thIczL1z7C;!|r$d(Ah&0Ek`<`5;&u71{YjL*IgXEC*J$(7D@BgvOH@x|8 zUH-{G{i!=SDx>l$JgqV2=+QAL(+@dLtk>ft-S=Lau8@W1@Sq(8ml%IOQu@~ye?^nYD|J^VlwFZ%~IzG&ty zI*09b3CuY}^?{C1Z_^Ke|MVw*>hd?ghtCgO-tT?hbsdcX{TL8mKl%VE!2xE{f24!3TeU-<4l{=ppw4Jl>lp?>N{ld$fP}>esH> z@HVLhS?RDta=vRjR*a#ZxN{EdRi_0eH2pV zBs&GE58-P6cD%+-MliKDG&|RoU@32Kzxlrf!1eRVG_Wy6QO-NpIlxP6zdXw>ZC?<0 z7+6!(VNaCx8D9C=&(RY@qFqPjX?D!XapVp^crW8-Fo`dvKVu%)xK94#WD4X4?mpfd z8?wHP;2fVCBm*l=JUK^NFDPX8U2k?kQhvyD-uLpL{+Cr6fgS98oTQF=`L0&zuT&h` zpKYjP@Hr*#cPR1y_|4yW`O5#`zw#gc#7JM~e(b#Crq=RMA-@QkXx=8=x}TkhrRFzC z>2fD7Q~9v>6F>>L+xUL{w|vLttv~wDRP#&7xdm9tZ5Ai5S_x2N6GT{{xrjKZkz~0CRDBe%!xN*Gy$ch~$k=sgc{$ z?$;2VvWVF`g5MvRnlpRrY5Zcn5598q3J$IC17wfr3hc`He195CFxQh>NsKcOt)r$K zrP3HPq)wBy5qvGEtbEw}l&`5yon1z)IVhJlk{W#?uN9;V2ht6n+twT4AT`0(uD zAP2=D+$~mp}Kdf6cj`ZuPS} zIDhmQj&gdJlXD#-vIA)gp0hsA2W4jSS?~XAq(_ZCd(u;8a9TY*@F6+JSx=ntku9#_ zF?b3X&BSQ`;Y40=3(Xrnz42KDiyNVd8BYRQ|H7b!JaGG-wb2c(o zF;kPD@l`NsEa!Q-{O!N{BbUGY9p7)=WAX8q|N7s(eCPN5@V)(`7!~h2r+=Qy7Cyyh zR%vVuoZY{`?d7>ZlG~EY?F*!@aoG1~MQCm0qDIFyd3@_%`L4@%fB%onJ&l@6mEGfq zpFaaQIH)eUBBfS8jpu!aX9(Dbg76>kjQ3{q>byYR{Np;DNB>IUy@!>k2@+Rg&7I9@ zpkwj~tvf#1r}yOGC4$7^DIMy`B@U=uX-2Al6<76l%eto&RH>M_cacwkJDFx>$Ex8~g+CV70wK!+2=gBz>3~|^a z4-ZrW$8(AJIvBLU*yxxJlspg*f)98fegLo%IxQFnk0jH*xg=_Hvy-9d$Hv(_7NjM= zi~ixhcU=A>{iXkSVUtA%K8_Xl9dmLqo?hq|ePO}pbrPUR(y?(I&+fiIQ{?^-+iSB@ zvwkHCbcr;ZeZS$G|HkF-{m7567>^a<@BPpJ>*YWEroZNNsj4;l0_c-_ECa=2#HoeP z-u}m!FY9%G0mN#3A`T!6FZ(h zO#I-<4*Y@-e)o?&Hac|4KXtS&EVsLE{|5l>PIu``^$_HeJG8l4bQ+DBmJBJNu`($7 z;1JIYXUx?JoZsFPGkAd)*A^12G4bpRkHy0Y4%z3@Hmbd%l!vjQG{z|7$JY<_IA-$~*?T|zU5R2gGfr-;|KvMmdcIf5lMni6a(C$r zd0zBS`v2&Kzn{xmFSIO#g_2LwL*NYRSkk!$R5)-+%1K|Huf* zUG?C%jE(`P_1P-|Oays>H9lAX!NdRX<-PT<1jfg;MiqBt5-=0Y&4Kt<>%nR+_}Xhf ziL2FId>}Uy%d(KT!uYcw)e1|HvYUQ{$7ZezSH&$vQmc$xn>I7HY$T9z;!ibk4)P zk#UGGemIA@{DFrjjPjE5yWjE;OuTu6PYj#%fZJI(Zaf6mZ>MKP~T%X0ok=+rjKW5y}IVDb!&s$B^aa!;yhqNT0#tYHfFh+r;^zA*SQwbO&y? zJY-CaJc*SME56Rv#S#dy+#_}zM6lvPX5Fxs;BFp6_*8wVrC0HfEOz6D!;~R7Y2rIX zcWY_k1MuBR=KtppuKZ2aI#H#!`^&I*ZW=wDk)7zZ6H5ZZ3G?Afg&fPc6{>io65cd9px5kwJBKOzCk`sYk6S*O~ev9j|YmG04 z)WxnPjPGG&wzcl`Z|QGLxcwghdXc*EJvzO`3??VLX~r0c4oL6+Z`}+uQGzx_OgznX5RSM9+OBbn2ze#fIV9Fi`ddHwmv2>T{m_&S z-Eh~xfpUIWe+A$HzobpUe;_Ul?_yrY;!nSF`GuWBUVaYgt5e_vP`~+?{Ln(q=5nr+ zuxnTqU44<%*DfJ|#GgS=2HEV_xU-u>GB(F|j`yOkGy`h=K|`R=thfH$FJAuGpZS(Y zwwK5}mmc;)nuKisu! z5HHl;5VUMW7(Xe-auqM|hc7?zlmBNpNGL?&027pVnK(5*>}d861S2;E@FTNj{)2z& zQ=YVPObnj#DmK(S_qsbj&b9e$x8yTa!$&{JyY=GTKg1ogeodfsEkNhGob{6eXWZgC zUIY@tHA&jsUOxbp> z?e#!pz~^d-WczPR+=Oraa$5Nq08YP*4@0?qYMg>l@6%3At-uAZ3*ZqZWzkHSc zy#|kle@_7aKmR}R@4fl*b${{OE)Tu^9nRJ1PZ_SEwb!s}&OQ1mP$A3k%8@-g1WH#hg;}AI3 z$mPb@D-Brqr5p1tZ;yk26Ce}fiI{uLDC_}=eGP@C$2PoY2t8wS_JEI%|1Dm_8doN; zvDp242DdL-UFHh_{P3Bo@Zp7F$Hy1wLYf8l{@}&D$J{e^Pf>OJ&hPt?%Ma== zP5;h+^^KR;zmxurf#2~xKXmze{geLuI}19clPN`}=Wd0p>?|BuD6Sh|Rol;=Wdhkk zkUwC6gU4g+>=p&YW;_b?9FSS*ANa}8+LJ#v)WP`a_(_VhB|YLBeGsvlPiia)A1)LN zKN0RTH>Ag0Lgp2mp95@<>d~1kZ+Gm@@8C^e6Q@}_$H`&Iljq9z$T4Xtigk(R`TpGP=ryGQOtOs~2*uQZ5G>DZdKj8FS#e?4p+&h3em<#%eh ztg)}`%Xx%5?H}}Y|CC?jr|-ifXXh*q?3OpJ&zUQfQv(G4Z&O5PK4F80Q2L%FSMT^h z^=r*4aiQTueS_6WVt6pIibux80;1=Fg&Q4|6UXx49mwW9La-FBfBaXFu`XBVngm=2 zX*X7rg@fA5j4T41jSq(0S-or5HK5cV0`#sQUw!Oi=R+pJW!#RaSjFdbo6pC|-vZ$J z8K_($du22oH1;in$apif9twjb89!vEJcwsNak@K59jG&ol>sVeZG2L%qm7JB zmFd%7B$u4y2}jqe&^ZzgYw$$ctEt3?7>VzloYG12fO3=pxsH>dv=g9NIOij(V>wP@ z0W+8RRg>eQ#G(bDAC6W=-xw&9Yw(=T)G7nzKeEG_e~|s4E$c7KUS9pH^Dq3B{`K!B zps}-DhZCEeG4Vm?{@4RWbj4LIJ$=ia2_m60;(h3V72@cQ2_?KGWtVluZy&Eh+j+-K ze3bkCBKuz8R*Yp+eoHTtLy^GBL4p%B4DiOcHfiBxCDq90UD)XC7pH{*H`dLKQp^1l zYw~4BhovtI}A=NewIgPo6X7dtizm5 zU)d%mtf%jhe&cjsIUiXG+8AilD*(5<9tS@F%#<7#>bYiO^vQ)I=ga2qRR=vUy8MCp zG5DFc!0wqCd(TTih@N+>6@O?Ux0eQ#-2*M5^EwQZ2oCW}0>p@PmzQ&~?D(+ zEEQfcXF73cCJ_0xF8j?R`ELK_<+yqf*EyYrfQGO4HeX!kO>cl;O>7HSsjV~#Z<@q2 z#XOqXgp79OQm1;2d5HVPinjejz85}ogP$EHO&t4C0*=B1^~CVKgVDm2UirA7P+Y~A zC;x>-YSMrB(EC+=f&YJgf-M(6T)^oxC(q^uq4g)T{9B9FJ>$5%r$5#e+=BqDDPYw( z=H+!3c+UlZH;Z|SsaxplpsdDl`qk=MY(Sd4WvrY%vC1p%>suVPs@ znJnX+@oo`|TL9L$tbPsaKF5iCarT@IW;PsF-&azNBd61E^P(L~9oVO+`X%o2bZ-df z)tc6M)aIpE+s(4hN~=!pC5Ih8y+z^p+HK=eGU2TY%T}BBw2Z@zZ8!h702q+oHFuYR z$qUIHXCO2vGfAAQ_se1Y43hC!yT+3Mh{G{j6z26G7&A+aQ-;JZG)R2%#h`P^?&1$q zs>mN1xD`)6hATh+eMT7*AFw^;omaB8x*-!Y<>=u0j zeN1=Y8k2Y~Oq=U(E>(kx4>5M!Nf(UG4q(x>NLn>PU=EbA@^=(KRt@l)fA@b{F)c~F zi3&^{$=N-)cD^SDit9LGARCvj<7q$n8wW>q0#5~>3fcz%T}P~_c1=0MBD^@9`{1Z8 z>?TNziL?F4p?Cq>SBv|ehVo{&oBt~SSMxRV)}c9H{u#q{(F{?>XjCZp)RFy)eEc$! zJuCo&*B8UkJMfd17z}5ZZM-0UNf!Eu6yL?syt<1B58&}}2Nr(ClCd0)eRXL3?X%4j ze-zpBinoUD`vr{Vyo1qbOMaY(d6|4}VC^nZyIVu{*!WyI<{YlEYwP_vCors|XXi0_ z^TiOC?!@uE8Vo+d*;8wJf91!oa*{7}?P21{7hGx#WbRJ~e|5{aY8$R#9pnn1zd~@| z{Otnm{woDJ`)?u4UpZKX48=)H4rM0J5nXyLtd-H6rhvoaPWkp*4+Sh!bVn2$^caGx znW}BVm!tV}?#y-f{nc^ym3{S6xZ5U*l5^{I4)tA`OJO1msb|m1a6D2Cs|g50O57=8 zG_@@6*3-UrkAwQRa&P8g+MR7RLQDf1YmTPcaRxtm#mH0oRkyW1uQ((Iv6* zI2-ZnAePSqj^2X5hR2lA%e-ZXJfI!+K^UnAaUI`WJv-S@@E1Vw(Orx$F4QNge)?rRWRCemCDx!`-})63rSN8rfbL zi7|Wd)s+Kd7!B6Z9K|?El+v0A=U^6YfXNx{{==9W_+^{31wQ>WLAd|+0#Dxiqm=GI#>DH&q<00GCspiI;KYLKsntJ`UkL=78g47S_{J0+zYXyaynQ+84dpRX8c79PCdu-II zRemQUTZrt_M{)*t?|lTmk}2fo_Q%Z+02xe80YjysU>?}-E)Ns8FOT@i2e-~bOo1(Y z2Q})%+Wh%~iH~h&4{e`8a++auf^dxUUPo z7&;Mr5@`9m5tzbc+&pk6)uc@iBcDEt-^#|&!8O)@bHlZkxZ4Wr5-8@mn)|YdE$lyetQ`kUG5~cF+W3Lybf`~L;dfMq|z z6Fsr)4KH5!i?>bC(K_u{caI-reC#v3WY)AL2R%Js>ofwsO{k5ss_#g5@cEn+onLfN z^^@RJ!)nZltepOFYJZU3KapjZ#j#h)33uT~+Q$YTf+H zc!R>t|1$vGSuV80um{xBg3JK+3DTnES&7mzLXM-g4=1o}th$RQWQ}>4;U?y~c~*irKonLk$6s z9dIAXbC&yQQe3a^%p7A2 zx*~J?+8(XC90INBa2&39n0bsl7QDL_`v`T$A-Aq8?$v-=XD^9}os!gvL4EP@9qHf{ z{kX$%W5=8SD*)?4J*W(oE_*JKy<^#d@Vjtc@-j#%Y=(R@bZ}<0H*yWs46Wg3{6zMP zr5KFlW|gxK1lPwwaKa1SnAtt7(b?dKxEufACHIxT?9Ko`sKE^;6z9Pj`vgzi=o}xB zz80cABCOO!KKbAmclJeM-DF`I3$fVY^==&shgp!;j3b=FDzt60|+9UxBypY;=_jlKYVG)7IlFqSoa*jGf<22dHBc9qT;k=Y1 zG=Zt1W@2i=P3|zSURocW^(M{i5Z7zPL6FW380ByeV)D~TKF)h#r#9gYU&$wgi*5Q2 z(KurlPpRxH^*WbA5YmBW#UHQEH?G)=^*%LVTLy=ZXMDu~H>x}9gx@jU)bZwj09ZpY zH_G|EZ-%_DW?zo(YX~wkLU!cJkiqvvNR^jkzF0L?>xGo9Trd!mEd2DF!xVydi0qap zd*qqo)`Nz1#75BJ@XM3CR+xLwdwG%!M0}+Os&Cy@@q2CK+5?#K`rV9+|=QjzMzR zLy-PCx?2FfLr9gBM*j$gQl!34g0iFqgiItO!y zC^~uI!{=^&@dYL(Id}(^0s&aR@ffovH6PNeG2pBfu6Pl5XCL~;B8ST0d|vpZAP4K6 z45>Ch19(X3-^5D-XHLjqfK@iiTu53#oo9CEG&UrMZAlnlkq0hc&r)+d;$d-b4FQ|8_2?Q0jPS0t@|`$= zT6w_F8-VaO*UkR`;NjH`dlq$vTr*ee>t--Ab!%Xbxmn)hJQENu4jwG<0-Z039i>k! zo$Qhftd+R-6@NuGJa2=uG=b6MyK0*JvCTW;TzKG0jMSQ!fILiLvH>kc<9DANlg+C2 z{BkpmYa`;u0dakk{%m2Icw2XkGf!0xaONx&KK(xTJwY36&zxIPppY4H#20HgKJ|)6My$z z3L>#mqlNGh$o>I2|0%+l0kYwNd%1KRC`xH@7-PG)e26wK)=jSIY2G`-CpI!<-t}-D zLtxp?xDYUh)RqKRSy(w}H5Qmrt(*pBA3N8<2f!wPEHZlWI2YnO59y2xn;msd^vS`n z+VR*jl&NKJfRoC#r)wp?YnlEzjr1&06BE{;6U$FbI5{V>F)W*p<3m4q=npb(jouE zH>xlWCvFbDU$c*+2~XdX0Ftay^}fh2_m_N<(|DD7V){5H$CvYp(qgoyj>ZF^j~(gr zw6y+9A7W!822#JtzfD`};+-QveFk61I?K0x>u&h2VnJ?AxcMIdxG*l$A0}FBU-CZN zNv$499o>8(7(Oq!A$hG+p?E^$9ObG7LH2NtgY&b4 zYjI6@W3G!t=QruKZ${Z*N$&jckergod~qKwXRK`Q<;27b&ipDS!GoAY z7RZ3~7%u(lYK+!eJw+PsY7;3w2Nq|XsFb8FkDcShVJ9Q^LuS{?e%v`!AiU(f=p>*u z-kg!~Md#(Xm9g7f9zoW;;$e{~pUG`HS*agEZKXCBuymbg0f?c7j%sxl+CC}Cs9+&3i z%I^pX1ipks#^g_YmQBZ?3*$YItjF>JY8^h;c%Ny-_-I?s#yd%CV={j7PeK8U0av%Q zQFI_$m*r91!yTYq7iQ{TXLxl$4c@68e5tL`#%CXIR(f3g0KkAU=)QQ#en~yJSWsjz z@XFeIB{S4r)8io=Z?^NiF&K=Dy+g_1Sr2m7*huEYmzUkLV&?@Fu6!0j<)vAeBZysj zD0aT2NZ@?Q`c;5>UXT?cu?-(Q-kez}2foPcR@xf9jdLyzCtSTC(W7CF?*c>5gpXD>Mk)0lyW+1TN= z{lGh3V-o)OwG)FlspL85BOc#`j_F+Meg!%S>fnf*n|su+fw8+sMus^3&AioS|AmQP zAfr6+AxBTXog2>aEkBUwahe@A(5sZH4PnyG?6bUOY z_>p!EoNSTa@#T~52M@+Uc>-=RcXwzK!BW1zHr7^-@QFISb7s?u+0W$f7&+IWxbDV{ z%f0=RVQi~^0=P1`>9L7#`|-H=7Xjsh_0(?Y}RlX&VV47 zXW+$K?Li`heEr`8my`G%V&RqmgB^IX!k?3$jVW7lDFSbzY;MOSzAdB2L%O?KJB?pu z_}nWi%w}mQ9WDJypD_BxKH0akv3ZDVda?S~yp&$+Ld7zL3mXMK{x_IVQ@)Vu$iJ9o zWx9xLJswj%cJM=s!(F-chcmc5$C>2LIHzp(%!;|^(VFX;FGGw_DVgb+vm1WP*jUmz z2P>oMlRUk&;pO}#TkD7N>5u$A<4p~L`84E&PNcAgOODGIq5Ypaoudg%*!~$aVQf9+ z19Q$#FnCW)1D&C{n}&O4jXc{UP;yB8$$t``?$yEc10P*and`<0Jg21W4m-{hq+q6> zAhUB|FO7G&wDib-viV{EHyHTOD({q2Yw`|w^-pZWFyoPa4`S{qv0ESU7v6_(`Z+U( zobJSy{y9?@u=*!F|FRznxZ*bf`dPb}!F#K5dJ=wO!EZ=Iy7;)K;_;QrlI@eh$R@pm zPeup7@YV^_o~-!g9-qXCe|=@T*>&?j0Ca3UPz-()cP^A`mqGTCbe=CYBoAr_YK90d zFP+CXsxX*I1LttYo4%6;{lMXi8l`1GT6rPw#vh*I?RmtE=$tb3!TU{ff^EPiXnjyE zd2-&mv5A!0HX4vVv=3nla43`x7ym>K5_!FZ^8>-S5;E%%f`pg5(XV---DQCnKe#xW zhv@jUHg>YbpT6+VJ;aUzTYNc{(>pl%pWOHafk33hLhrn+mTq9#7Xmk}vL?RNUcPMk!Nk1_1YKL%L`cK`kNUGCQp zQ|_~yHn|3J&(l^t^7B`GsfQm3-mb^n-d3F>5_PWsx^BGA{<%k!w6mvI%Ev9ELk3hw zox!umsI#1VKh>JX-eZ?+&Jd&xl6{Obj@Fx-kdD!K*L9%n0=4evz#x{t@A@R_Sa%%P5?*e62UKD zgN`d3E_9=bC%(>uPp5?be|%AzfP=04<~1As`QjlKp$M#X%1I$#5XdPnEXcjF?!l9! z){!ghEi-$JXI<8qbJy?t6P0rl&^{$Xd)}Xn_x{z1sd0FnR`G_L8FkaOY+m^->l&cs zU1#z~lZXC*;Xoc%hU)+CvmE-f&i~q9a(Tzw;hrGMF8zC?2=c~n^3K+zrjG#WKo-A( zUEwhk#QQZKL-XlQ)DwTcr;7$BE#ISfJtuufY?%Hbi`f6!Z2KpTsFOGR59k|n{V#ot zzk~%Jy}e(A58j`@D)7+T$W-_4^4$nWm^Myt?({F|O(s3Gf1?&bEkQ?r-9P#%y~AGP zcmL#5BDrq7l>A=@&8C%V`c{(u3K^n~@lNag#>yhwpR`1k{m|KR;IH)ZJ!9n*0%Ps0GkX%?uz91^GqGO&qUT(m_~3n)C+Wi<*3Q?~ zU%m&N{8fb~Kj{gM^@HKPPJM+w=)ul|JDwr4N;-{+UC&1c2Oq5QjYrS? zWNf=09!?+1A}`aHpPhx$hP;S6^$X^N+e44&iY3$i8elvzuwSoWzW0(>2LgRFW>n;{LrLIudnk@ z_G!d!<8@80o8ml^?ua{t#0pNBJKR?`;mhOx62g?=B(IPXmTU$cXSM^meDtedeEE{! z@vmH-_D<~Y8(#N{%d0=^g_nQ(>)(9&&hPz!s~pLC&4_EGAQ$T%(Z|u?D$DfdU!;FV zPOB!y-Mby~)pz2y*)!5Q-+lk&gWIg;=JcgYsKdcTGHhxiduJeg?=HWwHvVcRCZ?^< zm4MSXY-g-9$-&*)cJqG=z<(^v@cQz6^C)O z&^LdI=R8e`hY2D!|2g64U*PEt9~QfHvUa!LR@r9vCg(GLNqWZ*=&$qt-p~Em%OCy1 zPkpEU;op?`0p!bm@26e9=(m2n{yz2-+>+)``O|`2F11l@4KPLXR=~6N!)$M$1c%#Ygmn`E3sr1KC`lC%GYlUz9M!igGbiK@$F;dc;DuB z^M3`vFO2V3m)ZL~z6@rr*X??E7z`OaED>X8phnL`>Q%BI8^g3>84sl6HUqX3@Q@iJ zKHNQwcVh}BlUb0E*&E0Iz~4|iq-7q15?@!aJ&8f46SHLWj*$xU*Zr)t-dfX6{ba|v z1k}?ovmc(z%_j4-J~$*BkI*xoa8h@3+s5@*5O7lt>;B|@*4UhqW&=l?{L)u2P7*#H z^5484f52qn-^xkB6EAsTIAcN)gh_oc1_CWV2XH+l?hPy5#b+#&m-$;?LLDXW^)zS5VjB~O#w%ErM-dULOcoN`Cu zRW6ejap$*SVfJo-O~%4`fSO8nCxA%K+YR-OL(HiWAA5s|%LQy##Jl$--Ix>6G0k z{Ca^=mI72OM+WZ@ekL3`BtH$LhE1|Fh}5+3M-FFfJnK&fE$dO8%mFn)5hOl7@$&t} z(a$~t$(`k{gI#gtn0R`^Yv6EViCDVJyT9vGE?@JdpZlo%!@o(s;zOTv`BQ)7^OWmT zlYScBO4B=E+#o2^jq=6VuN|<*^xHii+4ncSVaq+Ff0p4K`f%7ukHpyb7bn7#(tEty zyIj8ZkN);Y_xdGl92M$mC#6mEF-- zo*mCyU$_4Q05>>yj+nvNSL=J%g|Fe%6nRKw$jbq0&jwNko~M3waG;zx!2{|Tt24z+am{i4y`TT#OwW9XA&BtS?h*$baBEpYh>tOzJcj4+;R3 z=p*Zh#`?%S8!wu~g6J+yVB$8{YMYnD~uS-zrE48vnKO)w$7zCQ>|lX%nrs>b4xc^CaJ z|F8N(Z@N71gWkXDNA3Rn=REWBZ~fuletGIso|qh`R~%Y@lXw57U}h9?y&gyZJJYNG z?(Fr<8VDZp>3>AN8}d#ye)nVK3pakpIdY~B&%d}VHyBa&3a1#HL-y2!Jh^D+*RE@i z!fL?aUCZ<+dFx>Ejo;C4PkMa(0KhH#QumjCud+jW^<^U?^U*=hICc0vIcvD?^7L#5 z#|+ncj?Q0>jsil%rbIl49Y*QKRpw@3S101UoeBdheG7q3Yhf)X=je%r`{1lBe1gZ3 z43Nyf7)-2OjbGa26z@Rnhn+f7i&K;elY856>^9onTqTT4>R&Ik`QVndxb9Z-C9-3z z_{m03kPS|TX4+ghpoC<^-HPafNH1|Fd{YP}b)T{$4(E=Jht>(!k&5~Kfd0Pvm+LS4 zKNkM*cO820L%>)3>z}FrTiblS&@$?#=&3*Ts&5A2uy2G`3{R>xp1!dXI(LgasbF#c8Y}V9!lj6EGy{M;b&Mf?^8bR* z`VE&?JPQAwzf$|>F8+4F@BW;RoubDz4bVYCeoM{`aA)mb?oZuQZz{vE;AxT+>a+2= z^Q!T6UoGS=z`}rkWZ(~9e$VHA{DuF|{bOx?nErOa7ryBeSDn<-wR@J?^lO1pE`1l$ zg!V7JI2se)&SnXWheiUw9rK@efAPJV|H;F-HfQZC|Isxh48AkPvn<1gakt6i9=rqO z(RZ%+qz|D!Nq^!;2mg+L5Z$2oIQRj;6QZk|n`WR!>=z8C4(YmM4FThTYxYPUeu-=E zG%nIIfa=$(fw4k|L4B$roYb!N>9!K?ofaSL+6r7wcX; z5Z5=c>_LJd5OZWbqqD{*G^>`zg3U|YRsMF4Y2`1PB};;1&{wjF$Z7Ig(RH@$Si5i0 z!bMLfBMI<(!E>(a(aEKF4)F|kYrGeJ#1dE89nH>=I)Oy3gLm|o%SXNPg_lo!!z<6M z9#b;^VBp8R`a@ky8la-wSBmUCxFc@Gbr01)`exVJLD4q-qPrOP{oQGeX?f5~VnM`8 zT%=$3nwMTa>0f#c;$w1s@^Ab|*Ff^SKDR}hqkq_GgLUzB|Kg>m7VXieU9v9CcK?=P z`tLp-{r5c?#KXaIf0BKVL*Q$PS#Ag>+<}{b9eJSO{^7wrvtZc7r}kCJx5{}p>d>On4eT}!D4bsDT z@J?yQ_R&5QtF9-U^!j40paVA60SQwkjCt{6ioD6Coj}gqFF3IWZ&2<7jkR{1ple%! zli*6eQ2_;56BoAS5D^yyJIg=harSBU+R&MHtOmw0_=hh~fA@E}e6jw2{*U$b#h?F4 zs^w{}cRF)b(sY0It^K3NELyf(HT_x)#~Cpf0IG0F^^r9F2mYSQ=}UgcryxG2*O&aR z-+X!cd%WwalNwWI{z!EH)Pke*N3M6;boL0xg)>KcnLFvTet8A)(Pu8U{r5g(Hd!v8 zG$ST{@#ptx9QJoe>r^&9;6V4vagriZiS z;3Pn6Np`(gJTYNuzLgySUp_8KeQG?IoF``V;enrD{AM-(9Iv_JVJD06ndc*LQ$SM5 zodLqz@y(Ej8NkbV^`;3@WI|{|xX=HFzjx-pu=A%iSg2g{2hF6gKKol^{jg$m2upGggkWIX=l1{WW#iG^6+ zJr`)RnwDn+&jp|FO56_Jz@o!>Y>qd^RKM|dlV9U6jvEzj{s({zWp1yRy8gfzBXbcO zgCN;oQ2E2h;tYLc%~70=Ir7BRymq2CCc9;U9pA=0cFc)Cc{z`HKaEA-2_=foV7ty( z&QXSeJNAa>53Ab1hkuytII`o|frpj-BCQ8IcwoF`$UCoe(@^aCjAp-(zy^WM{V>_^ zPz>h;Fx7hdfsP(vVo!AEBi;PMmF4_}88eE_5tsF>PwLC*t~=4Nvn*R8u2yqq=Ob|9 zZ=2m^Yep~qkZ1j>|Lc97!>`ce^{;*D~~|Lc97*RRmy4X^vK%gglNE6AwPzszC6P3LC5m{0o8qGM|X zoMUADhCdos<6Ma*WnQXv-|;0N!#%4fJ8Byo@& zf;o?_dPr7|brIvF>o`{g@wvt4&Hn)4yPli#;Bd?OWQZ81JqjMo`m)c!_=RC+W^Ozv z$R46m+HB<-oeUCwfjXAJ9c1PW?wPwSizf83Y*tAG-wBwzk28N5h;uG@3eT4SFIw2y zcCSWP{2Uio^-?6}elgP%48)rJi)YuTdDfm3{7Orlekhs9N+ z7Rv5L`w+m8ALNr~0@=%t@Z{Vub_G_rHyqu`ox1(>WLEE$qgyp^Mm*d=S-6$n8;(}#p>=R!;GWBl$+MxLzwOiBX!l!s zeEw&Atm~scUaGh6*Vz`V?q7>PjmXElkojL7OsnSwsB3yUA*~#l{_j+BHv?MlEv}`v zm_wh%*RA)r-}AsH%+!xJODrW=F-B)S%K2`we^MNA;ALLgn-gyS2LNuYFTy!E)#XNW z(ac5l>r3Xqd!Rf_b_|r6iiGFFqw*J;hTfdsJy-VbY@P?l97ASQ_I_;Az}Js(m<#~*0?ivPGv-?Lw6I6@;&L_0(_ zalXjwV`7twS-F{O;diXo7tXd%j!n+o3P^rzEJE*-EI1#Wz@@?`H58dWdNYLuXRY`G zgdp}KjQL`C`0|nu`9OW1HBPs)z2pVYzPwZ)7X9Ee?OC$*Q*y2+H$Y$AwkWxPeClgO z`ipPYU~nBAJO38Nm%QME#^-jnm%i{h7e4N*Yo<2(m-%%kS8F7+m-f|}21{2Lgmj-) zM+?OBul;}nTyd6f2xP-Ic!Tz(+h+UlJ5qh&R8EaYeyNQ_56&E-t30*1rbA9{ecvZ1 zIh{S*@}3`)-{|9U@dLnq337|f1b=vRHqcr(LSL4?0H`ygc(LlOT?1RKEi>S2=x4as zS|wyR8>&EyT7f#2BHw(=Tx^VDsFHfvu zH%<@lsjIe=x3N=tUPyF#B_)Z-@}i1maWyY`Z(r^J%rGR8(FNr?%SV3ru;0DE2~sW^ z*l=SqZ{|la-Pce-XHNDzyqvS_wfu-P8kz6AeA>r;#Q5Fb_URx0Iv3^M%^kIW7)CYy zNMG8ueShi}4eRHs&ug+~5*#iwGX4MbfBB=Myus&ZeB!U0#!%eM?bPXcp4MgdX`t5G zzuHkB9mJFVulvDoK3DfQHwP_naBEHf*LjTQJ(WwplonQ;v6s7b;Z)rf(gP&RQRnFw z-e_9iV%mx;%3C_z{0{)WVBIfYI!rBRW+J<%LxYn)a5@a^xckiDW{9+J6P8Sr)-VU{D}o+qChRIe`m*tFFGfi zz)=zl=&^{=yc#dH25u_y(69PBeq(4aEBh6{a4bJ9=U$xPQJCZFj9+q*;2@x*OE`H9 zXNpWt1Drqt3^v)sXXkH9yPQ3BZIgXs9k~#b{Mapr!z4O8&g=;thIf0~Q!cN1=?9PV z?QO5pe>sqUO|W}M{rXV(o*!zw+@)ql~c*^|GaZ?(3+nnHbSfR8 zc$4eZuXw@bJ@v0NUj3s#?a@@cX7aRou(xaR(xl(Q;=&3HJ#y~G_vffN+bDmZ@Bs{- zkIwwc@7(hk%r`EEbWR$(@8rPE1(shBI-iK8L@OH$1K%0=S>fHO4F>!$Wv^r0Z}NHb zKLGUB)-a7CtFja_4j^`H@T?ojUV;lu5I;CEpp2||1!BbDCdJWHZA)dyOnqO(f5i$qKKbrwdfjbX@CuE3 z+xyM`0Kj!}!RuN_U_SCkBDVbp$nv$rOp&(%E~2~;9ghsr@MyC7zF|iWZ1@^^oNODX zHH@77wG{$sF)&eZ0AkB7kuuM&fOYFvvySXMO z_md1t=?pekINJU2kY{jnCWj+8^G{yn#~H@#;dYK^tOMVgh~p(lb8bF+pZk*!-k}-X zf+v44R^g--PH8wtwf8H9@bXzM5?=Sp7ntLgA0PF~4^7?FKK0YTc7i=Ep8mzyCQoay z&1X8;yF7Pf!`UT#^s8Qc%dK^7ANA^&sOD*!TEz0^cV`r6R{!b~Tkav>8Mpv*AEBIH zv+rNmSJR$f@k8VVAp+-mFO%`9F5R`W#8i()}B6F0HZ z;gJPq;T2~>$(RFuz+rbG4H&t%~uFd>%dD0W_zr66d&y4wopD+C2XI`HCqz8R3?(aRd z?)kyV9ioT6HwkX`H1#AHnVxo5eZM+mdg6l*US9aT54b1Vttnpg{0~&E`LDcF_jD@# zLqQ*_?0z(Xes{+EegwvMT5SRPZn&BQPqV>0h7*YIn*Viwpv$lc8p}7YL*J3c=nf+H zi*#re&hfD)2}@3C>TO!B&pm-g3zvn*@y6Hf{{Wzy=kmRDpT1xp7)cq%=3zkQ(~Ada zdw&Am1JNPLE;|^C$z!(Py%dP_KD~xENKZOdBGdkIT!;f@k)>kQInI++T+Ku*w$hj#P}RL_TXDv zT*^RH*2e1qULRY`g@ajeb*31vVxyPN_g7nY*|;NqN#*6;-1KL1Ho@UA&dzPrjvlb% z1L2?k=RZty>+8V>9=N<%e@IcjTbG;2-Q_~KNLu8NZ_vGx56K#=CHG?y*u>P{R^bM%`Uuu&-a)4OH}&* zo4mIV-hR8vyY3JONr0gub_()ZDK8^neSxV%9jDakC^PLJw%U%iY8~w#Wt_376|A=E z6tPn1;8>esr^|`}=!N=uivf z+|PcV`@8pE>$_{0o^{Nn?-*0LEfRpVvqEjTU(MPI}ji zU-Ah|0!OrbpZNG=Ex+#^Nu1hQ*QVVgnuq+IEbsmYfZkItmrHlM>T;RgkT|()y2aDn z{A#q>%h%>fBSYb*%WJcZjG8M^VRvm427RpR4xI!_oEd8rv|z0bA2+fs+py`tRZQg;ktN<1E|zYL@OGL4nQzCIos3{bMrUJ0uQj!ay(%j4Gy0M&^omq zyC-642;*~x=^SQ>6NJWS&9df|Yq^e-&^tWA2vaRoXRS#t6FMj7*l_tA%%)T$3O?Qe zN&nn#AN89)48~(IKI$VrT<6Ta=b0L{Z#u8~QRumgR@1ddW%`6U>)3LCyPO~Gn0tTE ztB?MOe=5g2`uAb|dVbeTh2|bE^%EfduZpYKtN&$RwP(Fw8aC;9WQ}CfwiSvG@TXtucRiOy@nk z+}yP~Y?{`sG1xXM*PrH~kpb>Te5lu$ZW%Xpv9b{6pj+lavppIUK7Y7}OS}^k`Xo`e2FB-@DmTQaIW_)TXUY{fDcwHbHZZ@q;Q9m z?V~>8pY-x^c<=+j?zNn_{j<(bp{CZmmfTD63+V;-F{Sq&+|YgJ`Jv;=x!2uCf8=k> z;ak6lwLA`Jh8b$0d_qKX0egNoKgD;xS(;^M3#pSZ? z@Ew=K#*}FWH_oh?+DO-CnLiNQRui*Ybf>5q7Vv!X@j+pLOw8=gHQq=I<(xo^UD;4Z zEB0(y8wtWAJJ~hRB2LyhV>UhSXlZJln!gpu1-@%L>(;_T`0R8ZN1)_2d~2ExR)h8E zWGjQsn&HeaZzz~@NAbg7xyt1FnLf3%M$TUe&tOJt)vo8n(fF)|OrBBLch-0YIgjSX zKcoJ*4FA^wU8dGawWoe5i|d#EpnkcFshDqn-{1Je#kS~Twf%Y*{1@{cm*KOz0K5Ns zcK82ODs>FT^;-o@UB@%MoasS>)b!a8Hvp% zxoGm*1eO}U@d2**)=FB&IK_gnca0!<8a4eFn`7Y^s3CXyxceUfxI?bh4LM&FzE~UO zrHMV}w%4WCK3+F*8r4lCo|~6hkVOleHqs z`=R}?J;Q*<@LJD}Kx@z?VPQRK4biwn&shNYOu{iIk0o-+)j3;pa#=*;OrTOdXOnm) zu2{f(mzl$V_A{U1R3C@Ov!D5azDusIciU^s`Ejt~VUXRaRPU;F%su+fL-vz8Q-At{ znV65uc-FHxD+SQU?bpg>&O1Zh_)ZxcxO2#y`t2FF(Z*`k_W(!vp0m03f4{#r?Ghi2 zV>pg;o9`IM5@4N)kc!j%j|AEaoXu;e8Xen^(Z{_pF#;S-@&Mo@*xc{9`yT+(;I!i0 zW*e0|?FHMGO6ja^&h_9T^+AU*dJdNEAY&L1(jEbxEhDAFuTH|Lu>oNKP%Rd05 z07uEr@=f{Adgi;J^=hLQ;rSxw>bk~xak4z`rS}mHp8H-{SI)T5=f37Wi2zV862_pI zqE|!ne$RV;>Cm0;Gnfrl!YGhCVNB9u;cPs>ce=d$9{}3O{zHUIoo2GVm+a=qW|^kh z{0G%se*QpClNjem+7f-QWb;~@3&X-69!j9isBfvWr3sUGXC2n?aKjW9_BV zwHMkngb4`fQ_O1e(E^jW(g`##!Vs8jABDb%c5|HZJLnb&32_bAgc-k*ORci5jUcS8 zYnC2^HGj^Ht2wYj(y=wMHh&5bEuPWVLeSx`LCO2MKUqMh#%#8N*XWKmd*`tVFtMf3 z{2VzFf@9y>J~w-P9=oBM zdAKOo#TR$pD)sFfN&Si9wg((3X{?Lr<{iXl4JFdX}Z+h+qALF1Wk%_;u z2ZzoOxZC*1GYa)F12bmyO~(#Y<9s&>&fa`$2>{S%1byG*{(k_NOLarA*5&51ee-j> zzHxfNvnT$t7?MQ{CZ?Ygu?%&nLEKL*#zcV-$^HyR$CgZJ7 zOfONhsimvyVyfHKgsm$jp(j^uwLdup+7C(K{r&l5{U5FLzm$9l*v7v4A77llKN2~? z5x^>YKgE}ky&>XOuXFWG$1fmEe}Ao0!cJ}uWa&X}`GD^5dH+8E=+biGUigmPXLS8) ziQIH?co?gZv`*t-%V)FmWe&c7Fni6zfmkp`p#m}5I?KFR-N>`(lTc!&(c8qQfR9wZ z!PCJPM*!vfWp*8sf9dGvmBGHOw%J}A&b}yKH)i;SMPw>$!4@(IvvlCr5G!czU|3GV z>xv!)I#Xyq<{B%O=9QknUJKZGh&!I6u+|v;k%$o+9~%L!h55S}iw;Nw^_(YXsx|Xl z-}V^&0mTnHl#NU4%yRl76`i}E^5*_xqyD+Slb$|7l0mI|f9xNxAF%QR0Pm^m;CfJB zN?sQ!=4V|l9&BaBpOTRWZP2@%zKCmSW%_dU210U z5xaG~#67i(#RhogH0Rgku|pnbpnjo&8M^(A`y_OVa(m;O-xA%&;Q8}!(pk^?c|(0u zzm$OcOSO7e%&DWHff<6>^a~fD;Xc8~N4B4T(=T9tEJn||-aprbcP%|h9c^0Gn3`eC zGSj90DkMJFTl3(M$o;s`UI&u9@_k7+_ojIS4mtuB_MJ7c&Xx_@e(~95P4vW1oaVCU zWHo6|9LKAE6#PVZ>yqpJkNf`tpm*5I?|wC6nsb?F(JviZg0cF=T|pbCmD@0wuMIN| z6uJdM?JHnezc5+x9EA!oo6pNzp`Z)dFW;tD#&2EVe)bDBa}-Y9yzfid>GXV_<+2wb z3qH+j_DmT&U)%J^%t9Y{`t4k_?hLnidM#FS7=_6DiGUW?+2+ch_@wC!MA0vS_|@~{ zu@^FfoU+O@0;k36*5!c#EZ}@w=To3BJ%dbm4M(b1} zIBHlsYwmMh+O$R_o_71$H~ig0?Y@^k`*VNicxO}+m4!M{BZhl_N_DLtPD3E9r7aKp ze{l4F@66=duh+NksiHf~c~N7nli501oaU~ZKRGrJ_rdI&M&DEOc=S`i?CqC3=I&&; z({ca*a%>vcZ-6e7`_!Jx^&cza>fQP!5%!$%oo(QT6Yo9Nijx=0sw-B6!6sJ0!ei6N zoSBJ1%W2yblQLx4{Rfp+nPud6B{h3FSQr+i>G`ccGAQIMSFO11Svn0l=^H|B%PvRGnpng^yyy2m z!imZHfxyD<(8laM6K}FU=*RgSHvM54V(9apBT?)>`~N;ZKLGd-V`|{q@bJaF_xi0` z_5SFqeJNQ{*AbkVQrjs0>wiu^bUY^Gb@~C|`u?>~-Fm6XQH%AxQX7R+&7Qpfsi^u} z_4n+z2O@XUtNe%cztFz45Z>GUN%DvRDtiL;`-9o`T=u-n@`DwBC1uocChq|V>Hcag zW?S`Sb>HLh`6~eKrd(}WCii|`@3PyNCh}4anw?*57+#u(&4(`sxJPU@axGo-v1qew4hdeJ|-ZV1IXcZ3Cx*V*r zb`8%L)7GWLB6Gdev$n zWfyj-jc8BM1j83wdA;hjZ&>VmU%cwIKc^$^`n7-dy`^BSFZG~y-0^rkx4x_Xa!#qC zT*goQ^#60&-}B~GuldqqrctyMp(2Zdw)CzKLF@jeZjfj^FlGV z`8*pcqZ-4$0kdvfL?umc4!wiXF-FfI9DEpQ(7q^%shv1{Xyn9*41F19pQEGcA`Qtz z2*u3os9oFfdNQ=RGArE&6O%pbVUmptGi!Gp0%l4y%RxL^c=z?)HG zX9N0}SlT8(X&yS(b`Hd1;Ad6dvfA6^5(6jN`2+4U+=TJ3@t93 z8Lgj7KM&W>mCOC-9(dw;Fbt;3T2SYy_1oU@&f61f-X z7-!4|3XY@zPIM<4UFRSjM)*J*D{C@J9D(ec`myx~|IUFGBlEBBFbKl3Mxr z0Ps6D>Vl$oj>(1{y7G9b$AryZZv0FhEh{M()YC7OB*-<_*txuc;3cWzhMnqs) zo%$tC^AyC+V?QQhrlEo43<;?S#7`#9v+GF-h3GoTtkF0Job!zF9SVY*?qK;t(wxZ) zWbfjtBTr*Rz|xr5=3H6Zjn}Cqc5P_(TsgmGOf=GB(MzJ^w;XIlqv;)aV~J^U7sh$j zSVpwQy6V5kxR>*G`>yYQ`R(2B{-u!a@cHg{zx(#Q@B2}otjA7o`r?ig>&6C<`@@yH zNdL*X1;X3cG(P%rS|W(s^S<{-RNwpk+bpi{3;woF+xn$udB3z)@A9j|C3OGSx{B%= z23`E@=AG>QWEMuhYvXRJgrjTUU0-05z_Faosx#jeVvlat%0Y{MUl8x4cb!>Jas8=7 z+|@r0L!HtmjatRV*!KHeJtjW@& z%a*^q1S7EXFw|#>rj%Ms*CgkS;EB~*B7X6NBVzImrn!(aI1lTgUrnLpW8V*Ww0cg{ zk4>dcP4E$Ql&ovhOfHKz>oabksWZ`iei@ma3jmF^MvMrP>v){>-hg$Y7)356$d?9jffz%Yksw+-}ZzYFy7ul~$ptor^xU;cQ-3zw-X?{YkeMvhHbOY2v=} z)?~$#Sbc@pERpqnLCRvfB~Y+#{XPJ~83u6%7O)ufS^9+8Yq_n1y+H%M%jaY91As4d zuCJHu%XP!J4_2eCTc#n}C=b?P!e8j!sbhK=Q(Xni6D>$@9pP8A;qwsu5Z2Za*v~I5_?lSg>B}fp{ z-~6`kujTIMzws?E^j&bUM~^?2<)BBV1g<3;ImdRXzXcc3q*B@J`+M5$YrpyV_TS^< zYrpBc*RklnoSTy6mn$?yeWY5K{tu^OyMEMi_y4{hY*$5q>ke2OEKH3L;M{FYnZcW) zB(lysR#oCvirL(1GGkl-Ek>;TVfZ^yNax=S*qh!2Fx=^QEPeoRv&>~?o!jJ++em59 z-g3XtrzL6bX(sS&vemQuqgl`jj=pQ-qRo0qWse!X;aj<~agCOY1a&+p%>fWw_5kcM z$FY`H_|4x?eDm5leCQR}u^Lm_;CCDdQxD<~A3t&MNNlf(H(J*!!l)LM3T56}*OX3J z*A7Wc|H{rGCFKZg1h%pbPEn@)m)@Pfv(J|d@v9%Y+0w|_*!BKadWcPCN zc;#!^+|_v5D_(Q^(I0=!oGEAS8`#-(X}v(w)ZWk9Hh1HCdsdG_));y=sfArHQwtD#%T0U>V3!exo!UsqEvnTaGkA^Le9aMHVVm`N%%FK0#LGG}a(qTg zGtEfDu?ojCvJu!JtT_VsG^{i2>=!2HQR1w^1Y~_;IVbHLmpFhJ;P#Y6D^N@z)-qP& z<iVRl2(lZtf1e0-OcgBC(?XUdr-(%Z7J-+hmo|oEl*4D4H zZF5=|lA5LdR3`Pa!6lUmCqk()OMN=J?j2!IOyKXiedX7EXQ6j9f5q2+`{gX0v;Er{ zfV-`A>x`pC^D>+8So8grQcp{}j=jf|Zl=JFbLoG}OafV7-X9Uom8-Mw&w=Ouph**d z&%xdU+&M7YC%e}B{SF`KCI9kghC0fp>fNpH{s#cR2)@l+=cP@K8>ZPAZ74TPI}O)? zHPDYojp4`c-c{^`KSZ2FBc|aS*Z)gY(B!EnWP+o!1FuyZJAA!(3l~rJPtLW7LL{98 zZ61E(iR}0ZcUe1|oe{8}*ZEp>zP!=VhZl}PHqCnsn&R_$N4A>LjlTI4tLq(4tI4T)qPu#r=A7gqth3$P97J*S6?C=k|YfUsqk3fQp z-}j}F7EXqy;=2mK8rkO#BQ(y-ZjR#~B*yll`T;Rt>X7-`SK3`RvaHp%g{{euD z^dCH0_$NMJ_UaFIZl%01(?rJf%UK&b!ymUunoTB*5Bg~Skn0yZc%d};W05xByrK$8 z2KYS!OoP@2Pxfw;ao}lW_;{nk(smQzgN}#4#Btl9m;+@}qC}VPl^mqcDt9KQcVW>Lj%#QHE)=cF^8K?=Pu1 z4`I_k%Gl?~9vKuIi_L&je;OBh&i&l4`HtH!zV&S=KBWg|c<$Haf1SF1 zs-5fSnxsBlN3SMTQeE`R^$H|4D9HEcg7(^1jq)CF#l6>PL*>K3_nfc(*4ta|puTVU z#V2n6>sNiF`^N8*&c`uRzu9zh{ZtnhJVsY(muh;n{hxxlZmwVM#rFq&Ew!u1002M$ zNkl?6QAe@)RZ6-ZQ_#zl19&?`kbwf3q}gYD0^W7A0QMj zv){RGfy768I1Wo9GrX)Wdc?yQ4C{VSvFD)M;K$bY$|7iu0G!^ROj}~d1G^#cnh*9l zzhqJmIavqf^(1bq4L~Lj_Pu{t9Z7GrwE21c*8%_BSA28bPuclPzWnR;U*gOEGd*=Z z`o}fN9kiC*N7k+B9KAJM_b0>fLBzf5*ZVVjppGvCclh_;^bc-d`WL^>?x*tO&p!8S zZ*SCp>993({pLWf#?;7u))a;hPPVHD>0mRgmHG_`sJO159De`DHlY%~_u)8rqUXuW z?CJl+8o#v?!>m(hR6xSX^^-rl&CgPM0Ob!?lT9_}`%Bm{gpvqekM5z4#9fZN{{f)4 z#>KWbxOdi!-HckRx!Y9suZ{^e&)qoT$7=n&HDlO+n5|%1q-|;B$)JgdMf^3qe(x<9 ze*QpGC!6+=emTnsgEX2@EFgtG>uxaTg&S(>0__f&j*Dck)ii@f^0na%eUWsq|thWt{}cYJTw#l z_zO5T1i+qo%4G`Y$2JyH#BLajaKK(J!AEyue;YG zUE{g!(76ra7iDm5y3WMw8tpVzGJx-VnjgY#y3T-RIF8oLUQZ%JH+5qm5iKuG<5~)W z^?Q;nR7=^+(VQ1*YGb;^}Sps9LQ}ftz_UL3?`i|*bO^ME5 z)ZYqt$&df^A@E?_dM$P2RrtLI59-2oprT|V7|-EZelc)Ou^zq!$7a| zi2Wh&JSVt?I+Lii&dwIT_D@}>ZqL{Avww&F13~}om;LqItAFOH^Ir>mwf<{=fAUMe z`u48l-@136)AgGIv_Df*8CPNUGUc249T4o-`zzUu2=w|d_k=6hcf9l6w?Fx3|H|!E zPoe)>;H!T6^|$}#i@)Ob?sxrC&adNg8lR{o(0Q|51xQgYAiDhQ|B`{07uqBD7xRkm z?P_3lqdPL}s}8K|Q+M_KXoD%e_iP@Ie%3i50JlI$zx7r(&sJgKn_H?j>>Ho8{e4XO z@b7ut{SN>%xbIZA$n1t!Gjzt-##1-6D=@k_jC;@lZ5lU~aQOpA$Z4`u27cR;*<8mb z8RBie_r$_Jb7Lj3G_2idOuD>KtP@``CMGk#&(ZiphzkJ?>oS`()v}Qs4RH)K9B*)( zA5M4{NUeztP=23%@Sc#nTET-QN1PcijG~FaGMM#18@d z;s5!6<|}VcC}+;I&ZwibOcY42)JrE${ezV?b`_%h6w@C2QoZ=8-N|o^&Qf(v(cl;R z{ASiiah`bF+i#!$MStlj@k0QA`2X=g{apVaM12;O#XaM)O=WzpqyGVP`1s&pr#7iy z>)HA2{|Gb=b#tVNbLoHLj6FDzJAvLQkkuQytlAr+v$fz`A~*;45k{NK_G#Epc&`$J zrE_eY!Q>RXFUY~e`9~*)`+eU14*>2QH%}UV@24qrx9j4MMootsErc5H=m9qq);8WW zj3JJ7fV-4{8xFsDdrtfz)>qz`*9)S(A)SRg!}kdDidw}IfH*|;nY+e^%TMOL8k1u< zj$J~S&PI{sxG=P_VvRwKlsvZU(HZ~b0H|r5bKRLM+0d|tR%hS)V?#NqLF$pyuJ@$j*~oCMqGfH5xlEVw`ZHO!y) z-#v+;vrBEX z_U|H2_WiCOgC79eH@R3pr@P#^tT9d#tuEbP7dQi%x1!CInMOY8!m>9ufxLE%X;Nb0 z@~nkBHrSPi-NX&CUv?;z=J>(|5k9v08b}Q10%#J@(xW2X_H3Qyw-$Ufp^uN*vC+^V z-Yh)_D&J|GUu<3;xVkt$%beXG?nfOs#2ZgZ(Jcap~g8x9X?$wZzd$jEA+AjKJXzu0gcT z{h^;2zAqErb9?I(Z@+!P7k#<@kAdHp#NUUW-}oIby#4Vne6D+dw5Ed2FlX8|@hRJE z0qfkn8)rSVqsG*PdbP&PtA3VWJfiMcB0@$IBQvA37S+UvW=HSMGrogHj)9`Bk2c`O zI1=N-E<8>z*|GJ!W>d%wY~ zWNgEfi`h1JG0lv}3eg3i5q$XB$3o133lFf$nlZF%A!#($^$-2LMDYRA$GO7T17$EI z(=b3+jPaGf>?7eX3Sr8{%-V4!8oFlv>X(YoH+qc+`O7wJ(nuos*g5W;eOwPhD(Y0GeP~ zb(LDPZ8HaYxnl6Uq0Sd%bl^xovNXS2Za0?oox<%stHBatTq~aUZeCW5#Dm8AX?htN zXT*~JifNe9KIcv>N#dFFGv{np#$i{(CzrxqKt*An-2CDg6lq)WoiT~G2EOP~&+62D z(ylTS#K6?HHTFFDEKMIkU?&7AUr46c+%y5{QWh8cU=|&WG-ICw7()f5&86BIMv+Y* zX91vL`Y0ch>2kZK&R;A1b--nK|DN0P_20IC`A@v=_DBAm-*x-!fBDnn`!#;@Z}@x8 zU;Fmk8{hm3t{(|IWuH;W%=wa5s=@(`lJD}x?#l<6_s8V9SF9YnqkU6b>MI8E^dJ&3 zR(KWygSYL_jZ4pQX0Lxl@J0H!7ryc}w?F!ae)sLOKkJ`w=wH*Bf5YEj(7)t|e`f*1 z-$6<+_0!WeBjfm5m!9P;K&#I|!-qq;=ET~R-#SIv@&?Cl(il-{|6@;X;4-2>2x2jI zOl>9r6K-bb5Rmo|i_>B>xZ}kEa&aji86KWRD#<~3vze<6U!SzaQU-YU;&?f%#M5@*$qoXL}N`0U!wq1{ER006M$P^sVSWCCUl%S@g4{*uEr z(@b5m7RX@stTiI<+1kzvV`V44@p)g@U7YmMA+z4{YJ;8yjm9G>{^bi|;(8IH zIgRur&2ouJV820E>lu@mq>Y<~78VYap@*G3@){67eVyhm@FX2;ggg@YjET7==?k^O zOX7TqqoJn(cE(fzc7#o;w{QRQ&(GSa!~vCYz*hWte)*?gP-(PgC^h`&{6}9nMin|v3%H{s_Px{!~ zzx6qvb^DA@|AgDqpZ;`0{9_yM)<4qs;+MYa_BX%vh5p+QPRr>%`I!jZyYO0%RpX}b zgKIND%$VN$2$9%~(CGj3{wx~5o&)v%kzO5tW3G2Wtk|ThV8mg3+9&_!+wcF~|LW~C zf9ogxs?_%fU-C-*=Ze4Q_M`sy`YWh@_no_*QOWEJXd#^AqmQ$y@1=e^;EuCv#<5$! ztY=rF{i#35m6Gh>9}d@2#)Ce)iG-s;D^PIl7ELGF!-g zg!HuAPk!%Tv(!l3-Simz6#(6t?sfeyR60TzyZ_MOPGwW$tp7EDWg5#~)-2A3nzj9Q zhRS+v^C919P2mw9)b~XO?LCG&@$} zSYZe|4hFw&3Uwm(x;pzM3`h8+xA+z49|S8+Nmx&KQmwr+8Du0@Y5-0#W6D}&pH8;i zUs%<2UfTHlgBir)Bj;#nkpKe$#&SMbkCP5y7-r6SXOr(}o&5)kocx!>mjH{2J6f@j zKO@Oxo!!fR;%D@q-2Iu`hknSj{kH{v`)7R0?UVnRkGg%p`~Rc8=I?yhyKb+1_3Ljh z_@N)WefRgh)c+(x>Y8({{HQv2L7quV`Kf+RUj{9DPd<`NhRyL}lV%7$UE{FXcbOR1 zYf04`{|JA?oIns8W7gn1&|p}@l+@bil9m5u{?b?c)a{@6&=0=-&d>T6ZomCAKlS!0 zzvW~8f7SODuX^3>1wZi88-Ka~P5LW34z35C?7B>H-m@lu<>~W|FE)HNuxy_|;eO&9 zx;Hr&yyN~VAzSWDMAq0{m;uasWbNdy`Y`MwkX9-4*tKcQ*bVnX$m#zP9zIT=WfJJQ zz~f0YJs$`fp0J52xMQHp`p9L;3_dY|9R`edIR4ST8J~*2Z%9p2hL`oqza15l&rL?el}c?eu4nd_m2aJgj45YGfi1@fzp*Ju!{B@J}s)>O;!{ zT2#MBwyri4VBcS2PAL|jT=_=^zy3R4bo=`6`2O27p78;6YucZdrQv}&`9B7EvX>RuZQ7<|r}AFeFmvsue{7^#!lax?~iz=R*2Q(ONLMeD=m_gt^F z7bywHrghGgLbv{jRsGUAtI+fQy-|Nq|E+I(!R_n5_4&7Fe&7e(K2?8f;1fUopT2$c zNB%~CKI}Jqh-&+Rw`c3a;GZsdLZ6@4zq9{mf9~(xUZ>BiUh{hWF!7q(JKp(D*D*;e zuK(0c{jl{Y&QFJLE&7-K_t_lEkIT8FP!6?g{jo9XnG5(!eY*4-Jv< zWe(h+mg0#OWSn*6cpV?HxS&>R8Q z+7%E9`+5(!$h)Jliz=a0z{iwjKwOfuE(PV*tuycyM{9n#aGXi5XSFd2fQpW1@JK42RyuY&P20#RT+`+ZJK{7=nose# zGV;a7y85}Vc&$4*?Y!cPXxCey@tfx6akh;=*I2=w^=Uzq^JG4Jf7u;cR<&ThP!nao z5`{aVy{FC5%5@H^@mxPZ=q`b^F#SAGJ^Q@ecg|%A=NDRPGiQ>?eKtYNmssLkU~<^_ z2|i-8lRlip-!At3)pJ<83D-z|N_g?7P>BjypT$W^*FEt!Kh@v)9MmJZy{!0(Z?(j6 z=`6rQ+4}%6qUv*xl=)K&;~)d`6#S0*-ui#zQol&_neZcOF=+=7G--B;pSbX`5(`YiCyt+!&$Y=(0HR6Ow@8GOW2}OpuIvwO zT%q&j!!GfRu@JW8H3^yT_2d(Q;)ubpSYX-(nlll{F+okt%<#(J>wZz$A|Z0i87Akk znL9b*@4%GLaeg@+39YVu0a*J*Y(!+V^nFvm#c0i<50DxY%kf!YTc7NcThuJY!z9B) znEX$Lk(;v*R@1IU&J4%41({e8o80OY#|1DeHG!YRQn!KTy*RX&9x2aeP7A-5weSIm zmpl=l)d7KZtv@t>CXa{pyT$^X9G57(n5|HLHazqGkyc}!_2X>*B@Lquv}6q-%07^F z#?%F?R)}j@J0^CsrxvLOu63s2m^tfRzu?eJHhI6;<&3P78i`%rf9&?6vDYoY$u|tX z8DzF^?YPRolww(uuS?6Q@riJAH{&&xR)7CZDMA80L>|zsRGIFO9_He8HB} zAofoTf03|m%zzzZ@mOG)Bn$7}Zi2m+k$mE$=Is3`e%&E?jM2%n5o2k`Up{7^U$be0 zbG+)TBr%MU_+F<2vMxcW$xj5YnYGBo(x23~^^1lfgB5C>A@(XbdN#>_o{!vHzYxxz$@)BZPA*~c<3sRX&g4wkoG%#=E0D=(s9?y; z^$P>4ho!3LxhE)KWn#YTkpm2$SUbL=3~_QJ-lVhdZy+Qq=eXC5w{coOYy)pNx^-}g zdeNDn)?u9jAhY=0G(W>u`r`0gMn3LdB|r>5GMc{h51So54ScVs|3eN$&+3OB&83Z> zUq^g=(UX&0oyX+jI995JXXgl<{K1=Z(8Y^Xb^4gC78N zjhD;3UVOex+81u0+`E=-xbX4u;^fzoTnl;6uJKEjhH4`n(AC8GGMSJ7hJsXI5MH?s z_dOe91vc;`?U?Y(WDXR68XT>>ObBM3mDVhPYT-5HiRHSmelVJ6JiMe=KqX48Kl>}V zwQLQDjScPAta((=0lkUV_5P9z9_%~&S!qhl$pf}##nL|?HICwkSd2D9_B z_~=-m_dfvJjsr|O(NXl{V4SJv%G~-TRyd=}L~PE6re`gP$APq6`J^)rui@)sJ~Mvu49QO()i*-?RkMY- z-^Km^0C055^pjtPUg^GkwMGGUs!fi48_F#$dtE30fxr?33!mm?FnO&xd<+Y|wEa?< z0WL(rDv+6m9gJPGOS8xEu%W>_2hGi&SUsCr*W*tDcqUqdK8RoUQTD}|<40clPlic^ z#>m_nd6(ijZ}Tnc;)u%3*+9+#CdgS2&M*$ zv7=`V9u~1cbZwi^vXqAuP~x2Wtf4gi(1B+-oDpkZb0BO)l~#ZewZYw*wPgWAn53a}IOnotKgLNipYyZxt74&)JoElPT4rwll#1$Q_ZIOK)U+{I; zMgtOR^t;?H6!?%+;^1qoVy)MXXc@n8(HI?*sA_rAMO2oaIrn++=WL)_iZgGF&1q5{ z@rk2gjfV!KvCbKL^*cK+6L9i7?}y{fSxQO_8)0~y`aKu9H=peXPA#Gzl_Z|~)0(6V zgPlhFwj5M$yj{*fG+Rvl5Fj^dtdz zV!}6V0R+Y-;{jU=?=?QOg&K`&YTo^y+!lJpDmbadFC7g$B-699CF|bVI>7w%{lO)h z;!=P)D}2Sx`x`aipAQ|Mtxh#M$xiER*9>LFfJC5mCYFg~7j_VVtl7Rhe%$?E0dRxr z0?!8R7eeOo73jGeI%000W@>}cCD`397T>_)ht`SsX}C>=&agep^(0h>VFc$>lH(7; ziJ=?8Ku(2FO*bXT;#X}%x5A1Mz2=bu9C0R|)CG}R$je$8_>vPKWcFV6A^)mKITOR@FWEEvAYz3OhA3zf{lNh&{{m_+*)P zAkK$<32DWu1O`5be(T@HYSh|$rDB=t^0UzZOCF4zEbD66p@;W+B%eI1+c=l=ml$Yw zcRSzx4*tqGA+->KVXQk@TOT8yM-y-i zTpEr=9@g3Y6CZ5&6U(dAAleoHiqM4esbd>nEv}txo`Fkx(hr@zg>x3K6F#SC;+`Xr zyoo;{NB`0HFOX1C=1kZ66UsV(l$^Dv?o}_O0UJMa>o@r$lgy_!BYzPqHZdK){^17! zmzAE%Z&LKyC6d8Ca|oC>MZTO3GENzrzXct4v}c{;TZzcVJAUZ40mYXX543Hxm{HBY z36Kh7&xrwzI2ZavbIzME=MW(znEEhPw)R zB_EHuXSV(_n5LpJ){6^90J}=;OcO;Zasj!qYQ_XSd06V=FAg0yHU`IMwh_xDkmV(4 zP2#K=@bp=6wXtuAJzI_s7`$fZKWp|Hyx4nS6MKAkJI+|HpA3lu9@NGYw7w4DhH)w#oIpA9$qO`N`tL#qRtA$O%e}I8P5C z4@aQ6BjU5S=G;6(0&slHbEVi_!0+_R=&nWVKT`I-2AZF0zHtb7SI-Z(jf0EwQ=Bar;; z!MS4YjrEhf#S(}3)O+|Cp=@1%^a;qQMD|XX}S|ovnTWR!rN% z?@4R2)sN^(wl0<)t_ouEkXm)IFtQ*1no@tZIgZd?Xo{4%OAMTTan8h`hT)*mm^h7b zma^+tm`qYwz>}o)Ih@9@=DYtZ09K2Hy2Wk zKVaBZpxvtFxtj{W89vLpb2d8K=p=YV3H z^<>!cZJ#5JYT}W@5!t@p8G-Civhs~0b;$|HX7fkL6PV&SWA_cFIZSYbtxf=e(?7^O zN&Swzn@v>qv*}{l_qXF%+s^C5_Y%s~dUB9pvKx&Nm>b+80imEz&oec^GXB&VTF%Le zF$}GU*WK{h4nIOuza@&oHDB^;4GTjfYkY@f=t;fl6Jp)p1Q(eVkdCHRHS5X$k+vC`I^2F`I-K1$1tr_8H+=i5IbzzqV(5PKU2?mIRuP zxB1>LGCFL)g%wu;qpNLmPn_fjs(k2W+15>D^-M1Cmq`nbUz;8CSY-h-w&q}qj5`k6 z2hfE1fn>N$#Bu%=M`OfEYnEnMJEx@l;t)x_gyLz>&J z=(d1;LB_+JJ1r7MBbk_UVL+&e01$gtC(5E}oN2@txW}!mCxz?#k72w2$1zu~3 zqcI7%rP@Ce`6@7CA|Ti^dlQ%IJFzrPOnR2}1NuZIQt#3xwD~YhBD;Nl+hieDd0q*Y z^Fh>b%xV(_(Vj0@#{;_ykeJvMn_qEhMK16?Q$Ii%Stp;wamG#6AoIlWyv`+;^+w0h zh?PCqp2=&&6%q71(FnqW10TvDHo@i%zZhP5e>c=dw#!2yjyuRvwdkBO^m=rhz@b6@$`dZ1y*|n!PS~>$ZspFJbJ{>4mdvU7 z;>m(`^?`*F92aHJm{{sNG*XE*&xLod)%bj-d?3YM3e152j+(+zL@HsnT z)_wU*GkLU4Nrc27*@?P%<(vX%Ou~E5gLO2+Z<8`F#f2j-QCCAp!2a_n7~r47aT01` zj@H;NaM>R6(Q2-{kUK(h+dT7?ucJI^O&r9k==E%Y>gbxr?w2whnuCJp+5Ftr2HpZ^k5*+uj)@_h^DN zW3U?)%^hnzb2j4c(WtTrmJG5^va^Oj93{}`G3}_FW1R)40K0yvY1vDIn3Z5LF=}ez z%0o3Z80}J=9`O^m=UBW6=&1s5atNOL?5roL+||lvVoT*XK(VQxrPevjA1w!4JaDRs zebIlo2AW4G_MA+*}(Kt1akQg*5#nX8h6&j$p=&7%g=fm)Cmvoh-v4E_)GP6$H(Opn2Oc#FfqrA>VN~`{CX5=0= z5594lttDa4BuWs*vF2=?!soyRf1)le_CDf6zKs428((6wW0arLOkTAc!N!J(IXPQE z4`yT?cJpy0Z}}!BD+V$7bP(Hg8G4VFby5kj;t6a$YTFZEV+?JsgY;d5@-cl%$ZJC1;g&&Imub&OGPG z{>TLYoLoc7`CzU%2Y>gE)f^xvO|0a^31zjw%zzjiz;h;8b=f?zdZx@mIme!TGs4b( z#bmqAl=@{~equjTKV?FCrIRV^v;HlLPtmgw%fy+HpL|)G-~7wL!4PGiHQ1PmocL(> z{HuQU0tl|#9V=(Szfu#ZXYM(uSrt4F*zrn4d_dvn4)YX$VgT#AW}AX!h8}@%$OG`$ zIRl2y_*loN=RQ9v?O}n5&zif=Xf)3vbg(@W+uA~xt`?llIkE$! zX~hEo$>+g6qGQ%%Y~L%#vTdX+NgRYUoJ6J=^c?NAzr)4d{{X-pa>cpJxolq~SD(FG zXIySD+0#yXt|lnDU2tmUMMyvXQUDf6gC&yiLy7hS9pXqJ@#UL0;u7@;xzZXLc<63^ z9L0r7j3F@9X=3ppgRb7$O-8^XJS4C*wsKdFH^N+9_Kh_t^NEG+D>3$+TLeh8aXkya;|D|fIm_%l&3iZe#sj%xOxu1#! zD_Oy5{P+p((0)j3v@wR$^W+>v^Z6la@PwM3e3P*EqWZ4bATz+!uMFAmbUYS60C2Bd zs4rS=;I^EL@4dRG+yMs1Y)%nv9D1ZL4$2wfYptGH%{OkxC;IIDBA?ncU7ZzNx*<9H z!SrQqy6)ZjlmJ+UpJR7Utli)fPkXo?T5n$MvP8-=8lfjf&gmnEdx8OWpv|Xy&C7e( zZA0U%#{gkRL4F{ImhCd+ULQCc)p6uAiu*&r4=d#?+4o#MJl1^T-}je&1bAwnL)bJH zugxF$!~V%}jW9juq{bTaa89f_CowpHemfjbpASMPv17J?XV!2X4_sV3=IrgL070+= zHbGT(0u>0!w=;r{BX@|U8sS*JCws$P&?a=u3qg1%LjK$zp5;wy>?wuq>i{Ef0k3<1 zL$Zx^)lPm=kp(~UuHVET0_Sl)_{nPQp1jeD*#ZKr`Xw|hVlJMbg>V}Gma}#3$>dq1 z@twgE!aXSXUg!P-*$U?4r?$o|Y42<^Y3^Up3vTJ3b|DhTv-6jJ?vKxb{N;O^0YbUE5h-0j=X5p#j1YJksZHy&&RpQEsW-w^I_a4$hp`z-LBtHI6k!# z)AiA8Wf}OwAdXAG-PPMV|6H+YP_q)CxC)*{O~H z?4MnxT?zB%o}9M@BqDx}g#oe7tjv-vBj@jKki#z$j?W{QYq#MO2*<^^?RITv_&wl; zxyF`AEZB(Pfdbf#i52W#%x<$=$&b-Mc>0Jz_E;q8d_P%qndE+4}fwQg^~XSnfcB5mEow!#S3c4K$* zIDWMN#DKuC;a5mXhdm8VydX>`O@1A?D%dt+p5}#ISPL{(gOUnpC+0OPG@<*Q7+%gf zxScfu!+@r>Av4dqIWY5~Le>|B`Tf+1jrR|m!9HD|a>%u#aWM5IkL_B=N!hfX%ejqE zb$VLnoKq{p?T}i|hO>38nR7523r%c}Q)3VtXZ!Sz`8#h5*`|00e=ikXn+dB}`BGeQ z$!X#x&*p7oa>oS7E-jL<=RwC6il2>{a}8Z!WGv;Jv}&UAwNCigx#X`Mn|-(^BKjyY zWeu4Ttm7BUECDo3Gc2|dz~X^w7mZ;}`1&*!Gkbisl@}{6VjTCk>Sxx#iMXPgV#nw< zXZn|4j_Z@;JP=xwNoOClvZP_oS{GyLJK=WZ<(=g@<$ShG{EJsXdI2t2YS{X99{R6% zDxV(&{OQ>zR*w_&liZ&o`iq9h0=4!Fj~|~#>tr8~elGVn_iH??D3MOTkZRrc7fa=u zGl8Qv8F-4Gb$!O27b@pi=b96&KDC59NbuucPqNoefW+fD&e<$*>^SMkfafXTu#fu5 zcnEC1I6BkeT2ff4{~XyfYd%d6@b&%(v){i9FyQFVF|&y#>s7CDJlr?a_64v@?mjq{ z)-U-03K!pdslSDqSon@Z5Qghy&{2Qv_ReGCj`_XUZ*bNOb(Aea~8gnh|J^vEr-@ob1wNM?-kd)L86VKO^*Lq=)?4N8#?LyZ-@zH~DNC zU$|^;P(SDfeOP->v+R)usX|`ZLYZk8)7@fW!olvQ8_jlH;}dJe0bD#Ye2FrfF28$Q zvu!Aw9|f{wh0TL`_!b!bBt=~L{X2Q)bkX!#LN^sn$Cj|;pq<|Ybhv);I{p%nOMZTR z`X_&^GsM-8iT@ZM)qVQY`CA3V{J6xQ92?5%lh=GG&8~IML(Zuw2gTL`vc)EoUE?FT z4E$mM2_tc^xkkb{t}z=QHoVarfy7#35tYwzJjc}R!1pYjM~W1jQ#GrB(YXOA*s~m( zb0VA>?2~8a)P1nRlM5`*=y=WU8sEb9%ZCWDyoa$zZB<|oET15KR#A$@2j1DUVI)x# zZIRvnc>Ub`T}N!Dj>N){Wu-^MzB$W2(-D9rah+4h81dIFr z$i=#t*h~e+R*ldTyJtCLh0Xo(oswACEGH2-wR>L9_}GF;8HDgU-!RUI)S}=S;dp~} z9Fmm4ie)1_#^6|0dur~z?WW5=nBgZrM(hK`H~bjwmhfLN~5_M*2ia6QpvA4 zCsqUi&$(x@;v`Zv29$g(l*givZJjD~;rWsfo7@_+e3?G%LqF*DAOHS;?e;r<+do_D zugOd*U;O$1-tD_z^zz$t|F`eFz46U&>AO8O7hukSV|{TbJIqu!rRt6|PUId+P4hP&k`oyFhp} zLeJWJMFAfm3;hnLy%n2WHeUr&ztZ6%sv$?}7aC?xcV*iM+M{)g1jwLMKVrlat#GPW z{UWHHbBiHhk~1OI#>lpir9W{V?Y|*FEJ*?*iFL-rSqT`iC`H}#eE&ZH==Nwb-|BhM zx$D&kVA?Af&4EUbh?hC=_&~Q|cww@xjzeJ+(J$yJ5E(aqW9}Hl8jf&|f{cDS#)NG= zq=NZnVkH?N$uTwmfH(n{Nt1F)Nvm#=b!xc8MT^C?vJze5X&)!+*iwR)~|P2 zUxP&|Pv7m-?HcQh(|hZjQlppqYmZ+0hXf;i@SL?eDB&w0tCS4RJkgEbF>+QL=dsTl z-|E%zpM5*Yo^*vRPv*(V9IdOp>Q_zU0>0Ew{^lC!oN0J*X47}5{6}M<-`q4eIaw1v z@h8auRXwFn?Bz(liA}3d1T_vDP3=#r1!|1v9=6uFC zHlPZb*+^`_?_Ph9KRz&9DB+t!oYvfsI;}qZIoZ++rE!fEZN-`d9d}}Q;;c(C8acNW zmd~)b@Ai53e+z&M_uw}D7HG%J=&Y_=IGNqdvd~yGifL^u%lNe(KSDHA1`NMErUthJ zfE-Sop2u7pzbKM3PTl{XrEUB(nyLt%dbHooMfA|zVp&YC0kzDcF z<0Ce+ds3_P0p9qsI-mQ?`_y*d`8@fex32f%`T#+5ro7}{OG0YGTShkr!UqGyLsIh^2y24GYG9wX@i(741a0P_WDeM5Peo2qYJMuLgEo8 z3f((J;)~cU1JMf>f&3-GNfQ3bYb8TeiD>kt^9BX9g$sw5i8bE5pv0JMD0(8xXq@#| zECI^-><@g#?N9wDzwh?XeagoHd!HJ==XZX_?PEUj!*BoHmwoN+7oT{0a+@OO#ME`p zmO{HAKBEgE=PrP;Y+J|e$`@2?WK5#D#t%Fz*+{IwP5=Nv07*naR9C5FiMUa?`CAyoC*V;_B4pspc=GZGc69`G~(>2MG|v`7zC~?lf_*iM{eydd|?v(e{(5`E|0fxM!mrZ1R?M zy;zUXbAA-M>iKi%@g&jPhko$0Z~xPO`3K)8|L`YM#&7+UkH3BK7ySFT-|!*N_MUUC z+InsCIZx>+tXWd?Uqa_aA&(_uS;k$n8J|?#Bk6U^mB0HAYBe3sJ+^KtKnrKYU zw+s}T?Y_TDqK@JwTmtbI55KXoEtrC=`YGAQnd7GQT!4mO-(j_5C6o0H6sB- znAnaVx$up2B(v&5LlF~SF`7%_#0xg@eY@=JaK1|jCL1TP&R;it*df+hrRc_*wetsD zsLzk~LmTyq+1lE`b^eQ68SGu}*_zcw%Yro|38cvE(a|7}dhW?`|33h<)8<8cc&+>L z+gxgB8bwXfmy`YoomXQwJX}N5Md4|^8f{_*l(xy2ftfa>p@|7EaVGqZFJyRLL}NjX_JyDK2X3G6vA=2T z@4M3{eC$Wu{)hkK4?1VgmAm$-v(_>;IelnAdmU4YOC6_vt|{y3pRtQ+et10jgip;S zuuZHP%r^JdV>f&Bo8yWZMNbHc}F13z;wdbJ;?ZHj_M3YsqxNZjgMK8c{M%z*1 zXl~_>z&Ux%Be`V`ukRo62PWC9oq;*!HdbmDplzIG35<@W{(+UFa({s_!y^Losu_ED z`dkWtkzs)@$B0eCH8XMcT9Z<8mW|&N6Ff09+vQwsz&>a3Ef@y590wU)+3bfBI~rYM zi96Af3rXS7gC#TjO<$WzHiq+;k=bj@M0+}Bq(+R%u{1LrGe*a)O*65E#7wiD{RXFv?6vmx&p953x+G7W$#cgf@Bfdz_l@0s zOV7HVJ?C^fQxIAuYM}+1TBg)a{nu)+s2QVacwu8i65xd)ys7UD(HBG$?Hf&qMq+$n zFdB-fefBRQDnn7?_mjg<0ep6!TlHHZ32xn(pMf8EmiABmuF-WWVn|Z& z5VQ}FW^FCke+lG13FuJVzO&%$8hr!0=2S=iq<~KF`^%l&3YqHVt|uz zvs^gvaCQ)0EoY)l++kRH1M)o_1ddvoTh;ZGNbjwBflA@bfx0lnvl!r1u<^rhr=c61 zI}3`i6{9A>#WJHA7}CXS?g{sD#orKJMkQ~i)AOBJSW#o zktfjOSv;H*N&hX8mI9FZ5?fy8eeBjR zc{tBpKiygsY! ztP99ekq++Jf;kAHW0(Sq7YWN#r^KltyLgF<>ehGt=1i?$B($S`{fthzb7$~|i!j#A z&d1RBn_TWJ3_gEA0JcC$zYBoAX_9302OQqXel&b8ulIKW?A3Ap8w-Bx zv#O*`_SkdI_D1iIa8vET=$p%A5NfpM5l$b(lX@k#I?yHm#26o?%{BB%e`?1e<~%1J zzLoQw#mp0Ks(B5P*o*ZG zl3QO5r>jq_n@J6$U+$-|AFb<9Hy#i-@*y+4w$P98(4lTZCYq564dA0Y6Lx;F_3VXK zQ1nclWpW_1Mq3wL9M!VyhAYzfPZZb=kRxW6fX0@jZvX7p|N7g%^w0kjg}m+NZ~hnl z$=g5k4Zl8lPu9zC?IHx)kyO-P3!@s6sLa%2Gsgv0{ zNB`9*4i7seN6T4=nf49Ogxf zQ7yR8GSG9muW-&99K_Yam~_G856`TaJW@Ym(S>>RS)p$W^KgU0xTe`8*?{7{tou$G zSJ4%RYEDtpBhC;10{~6baasFv>zfx+ee?9`TM2g$wZUiw#ZI_gg>G`MmPUJU>1;fK zhL^*-c}a`!S3%QnXd8XRJY}6_@QEe`_T@lz(!!G*w91Qg;^%#u7u^K#B*ahtk{|wm z{%`m3yME_4>n|+&rE?*vmp3j{@1IlZ^hW`DPd>lu#6I;-MN;S30bZ+@n8kMhpT4z4 zViwXD7<+hwZ=~Z)R=wQmN{B#x7Q;z$m&)#!bRg1(8ytp#gtQx6;yrW4mAw~x%{Hur zXppy_3vW~GleObV-s!t0U}wz!G`p{5IJGX{^W{VL)DfjMctF@swJvi=7T$UZ=y_7p z5j(K8oabr1`ui3rGITC+(I7B<%LffEF4#uoiMAk~AAV6c5c(EVHdETuq{N{eDXzaGa;rTiYrIi=Zzo4m;Jx-m3|x zAu+SI+m8utk_Ld^m{E;}kZE=_N6X>F@AEqc_SJ%9jOWYZL=GN&{0)D9H~*3!QvF*o zIK#L6wr`pOGf{ATsBu=Fy~d^C-e~dGo;qd_wrV<<)jz%f1z^|57;7c4w5>n;^lkdb za6Jq+Bwdrd$ASLj???xiNAb(I<4i>#XtDm2QH)Eg8c~E<0Y1Q-$7>Tn43V+&dc5fU zOFaV_*3`H_%}!4!&!qM~veXxQR+_)|8TWHDnEo zJtFuxdt-L}x;B8I(I;mFzsJHWE^7FC&c5@&v!0Ah;5Er9zTDxXATp0{Vdelf zn}Lwb zhhj+$I2xwH=2b!-_4)8W0JOoB;!hVEf9k+Lj={2z_x^)cDw+_?l_D z_2SWNAvL@W$Hr@0C%YjqmNlK)ZqT)aXOO65o|mh8kqah z@*mOP?f-ZBulFU5zg^>fzu~>NuY1q06@BZm=d&cO*M0v`s>E?0uz;U0x1q}Y**upl zhkoxe2c-z#3mRGbY1_WPXf(HpFke7^&LcWbZ~)H#4AC0yxbMEa=QQ?foiE7A&F5SP zgk_%%emI#mSatVI{X`e-vwpz@J^lo(_isQ6@iC(oowI)6WhFhCbAAJiCDIuDSSB!R zHpGU3fCS-~b!s;0S!=FO0WhPTdBN?0AOrszU1|n35o?|Lt!OWbUuRqH;LT$V-5|-q zebKB^z8eZ}3^O0F(NKi($DQE^h~0}}Aq8xX*LoEPTVl%3&N?<5n3b^nTKzYBJ9(H# z4|J>Jm=$4OcFx~1BThMveJjykhNDHFYR}R->E2m`94eYpfkP1oHaBaw=QEM8GRQxxKCLBVUa+v9 z+|*v)V1Hng?b8hn#2WZj?L`$7J*JMTPeCzt*-er0b2UyAFCkyrm@afiNZ<|ekP zg>62AOm#R<(gT)cxBhvq!qN5cIeJjeS3ApnPgoZQJE6+Y+>_^Jt@xgQ;aIHt!Kh*V zS*|l>AAHa}t7%>BN!53naObjm1KV+ygg61`FpyK;_}WQj={p5yAj=q=E3k?^)#e!b0ZI zp0n7-dhk{_*7)E1o?mnO+F$qOTl_&*U#oMy_dUN_Cv06(Gme+~wvPE?scrQGabV9{ zQakMTHMK@{7G%Ztiz@e*{@M3u#%P%b0YhV3TG*688o=u+lFvS8@=KVkX0Wzs6unOLH%!<-LP8Px_6rf+O{_Oa)fXPqdE`$zM6E&jS{34JZy5D1a>Ht~q>MfXRv zV@4oTFxai7h%+xkhS!3GH$f$^(9?UwpZNA}Gh^TDZ=Uw?NYLhYL7LUZp+P7*;a7|d z{Zv1cB?Yx59K6mE-_}3kFb>7FUeP~En`y7*qBjyI+XWDH$TMf%{EZ*&=HNfnrh=t$ zhz?(_eLrH5bJ>r|gW){zMMqI^XnWC*cjWhd+x)`%-Ni-X!V7-sjDIF&xlgupH^S#x zZs`Ye7j@*-^EqE00+ju^{RiQJry$L1aXK<%^<#g)0x=%b2Uy%R%U@@ zq_4cLmS-6?6LOA~lRVJ_&$&il!O_fF?KlXCOYqG2NB}K6i^oyh-`M-tq?Z;{jOwr^ z-v&;Fd>&l#B{cf1W$~{w$HMJ44&a60(13%{GciYJ((?IHNnLmS${%VH9}X=&?0`B3 zd9{ggOg;~>aGxJ+zCV1%CB}KMhXAU6z>mH0aTYhT4pp7hFHz3N90(>~^tEw((neFZ zYT2leL?v$G2{WEpeZo|&e))F@+)oUf0~Y8g4ReGN*~s%J8+pgG$?F z-F5|NONmOXdBr$GqBz6gSHl+&`>-{I%@Owt@Z%i8**Smyhkvi=Z~lAK@yaW&+}`(3 zzjyAh_n6aCj`T_P)TQ<1Ze3&XeaArhTcyDinbY7SNGo|zh@e(`cj zR(xzHXlxjBBR1yY3usJ`yHaz1a|pbNoW)FwQ*maP`1Ae}+61bQ>XkEnC*O&Gk!bCR z^YLB}X5(dCcZCAxg0ko7<0~|t$$xfaXS*Jm`GMf&7?1mHKKDm2kvD zu8{RIwPR=r)@>?xNVvdu^d-m)UtstRpJrR}DC5vD<*aKnXa^5E@zD+5+)YvO;Ctrg zw>VEN#o4|HM$G%HgD1PZAm8|pzh{CTclwQA|1~}wwQ1d$d;N1+zWLOL+ROz|DeA}Y z#3Q~`5y$>=sRmzI)&OR$^v{sU7TkJPf_Wqoqz%DNHrat;L?dfLs@?ELCy&V%ZVgYE zvWiAXFnTQf#IVmo+{3>2sjL=$zephJl!C{ZjJs*XIM^@&HAC<|esn zFi#K+jpmLMk~vUCXwmy4w)HbIfUryfOpUXj2xuFv%+fGdt`eI2Kh%gT1)M(1%&Q+m z87&_QA_Rjhhb_%DV&+@$!h}m{f=vB{P6E)7$kIrLG2iD1HXqJ*pFbIjXA;54tE`))&-5O_9!PVsophyMY9Zft{bvFT4%*nQP$ge={>Zft!1 z5UO>X?dS==Xm>r4(6{_foD^v`TB)t{4yfH{A$c- zO=3O&B?IyK{DOeZcyfE^7rc7=>aYA&o9IDToRPDpwyMC?cwN8B+`4q`-MS>cqPbDm zIfcTKYM%EW{~J)iK&2J9PK(g zczKr^8CwgB1vq1RifF@!wWoV-{mvx8qjxvJCxh+XTIllO4E%wbm>oI!g;x@2tWn5-SspcS>6 z#2g}Vvq5LLn$T1j_{}a2=LTn^KwHayYT{=Q5a?=FSU>_ZGdxi1%u_VL?@X7Y6NCbhE{?-DtKAfE(9t=1)H_QF{w3dk>u6n>tF}#*G z%@CNH`c=qI;y5(fp2ik$!%-qt`Y-`VH=ARjvbqWst=() z)gT~2G7Z?yff)`)5WYWzU0Op8-L-z=iE-?~`vNS+S*{~zsJFf8at$;p_&`LL2{ z9o}J+(c~L%_?H%GIZw{C@zlX+{1Ds6`4z+3!QmPp;D;R#{{sN`*_YQ1B|~3u=3e~t zfi8Ny1)Wzftec9c@%PKl-7|dyq;Q(7daR2lz~K#~`?{W)_|>6<1rM%LeQ{1W&ib7T z4-IRd1wp5Qy8sE6gV2WaZ_s;L##jB?U%9S=vg{J|{!%yJ;5dC(4fMQM`xD6L*L;S!f8aJtJbn&7m1PsI>bGv|{*;%w zNKWB~n{)St^?e?KW|+tc$PiR#Lct`*tzYfvG&fMem&FQ8&t&Gq-k6oYgOA4q2sN>X zK4J1ZgoiYUE9uG)+k=mX{{g`Fr`tU*b*`INg1gVfvzTV{OXBr((a{8XNx%Wj40qr( zJL~ZFh0;#FHC#-FVr8wTL9?z+b1;Krr{&TjPNOdvY{_Z#9WQ; ze&0WI6K$O~0Jf!RvK1HZXgOWEeV5GUCq8(%(`V7O$N6hjFveM*=V>f>=PX>(O9l(B z?OGFywuYZ*H7Tz-uxvQ*#L#j5U>vDlkL(_M`DI`FD}2C~DjjgGU+!<}fXl_(6`aZq&tSE4AFB4?7r)%Oj*Z8;ZV-4W z3{so{HCkqMH!SEB?=?6%YP0^3VsqbAJ_L}636N&5!Cy!6zW!lJL^KoYOoR`87%F9c zg|&Z!7@ZMI&e^zr_wjNCzggkwS;>8)iosUjo)yfcPA9e~4%doFsBa z(tsc&2?*8XM1X@5KfBa&Ji?;I;K>q1IiobBGCx~C`HJ_P*h~Eim;W9QHdT}ATBA=A z8crrl8+-O~Irq_J?LAZjxt9N~|A;YWf?Sw9@cA+@UJvLs zoQnXn4FQgjva(ikMmLzcqgQm!2Af~7!NS!uueBk1taBMP`;E6cVH1ZgTwlV!G4CZA z{M!LJeo8=(Xf^fA{pF5qbda3BAcClCv5s*4dOzT^Hlgcm)ZlH^W8WWZ3NIs0Zye=q zmC}F2DQxcFeQU1R0fbizDA@Ou=woBBMyFayz%EkB2?+z>h@&$~q7p z{Wm1RLYDf+9Nw;T&g7F^$cIm}@-k;ONIuTukU7N&ZM@tLo9x$Gi&-0)Bo0oOJDc9a&tLSeFPu`P{w|p>fID#Ew4ms7DX#jyfv#M?sTTER-g^|uP%J{D3%oAajLMg)-Us;Gx~R6GeiqKntMbE?)Fdk z&j=uBRIAyUsfjwN;a;}Q;vAh=wUTdPTOal-fmw$-njBW#J&V>Ldj5^?S*BJ)Yb{PB zym7*29ublnn-_@TYVcYFk2B{89{vD=CeITdc5JdXR>tNZn+ypwR~W)qE$6RI=8a#l z$}>|dG_1*fY&Pz55PIUBohrHD0pR|~K3YOX|-t2LIE z;Mh0=BA(GSs5ap?)aPeUulX z_)8N#r^(z!#(Omyr(U$+10ITKY(xn1LdClEwdV{4!&Bff&oSkTm;WRYE#Ud0fb-q@ zL-A!9?|%0?T{D`yM8-(SFw@4rd9t~O=*Yr=E0ZSyBu zQP!#;0q45s#Juu^js0Ed`jc{VI8Iwe@jg=>XqktFjCK;eM{&$e!Ep8pi;dMD_LOd@ z!=ue;^!%WzvDcdq{^~i|ktrsTn>Pm<{Ak_to~0VPhnpV$2Y}v~@3>9nZqW$R8*mtmlkO zv$PtlIrwl|91cgHnoTA72cB~pzu-j4^v{G7 zHlgl;>5ygI@QHK}1+jZ(>-axuiD}v`Ju(8rAU#&;A1$I^A-l*~3rNO}xuY8HKOZz+ zLJe^sD(PSA4S^?P6jXrru9EjrNsi7kYyu9&(y%@%&(5jE|Va*={aFO`G#aAH4UZPpZT^WfuC_7_$r> z)o}ji_QRnqO;}S)^C!ggP7dDT_8w;Io*F&>fa7||=i~nXFqi8)Z&SHjb|d;`<;$x; zKLFazWeff>2d>R<(`dzl8gu5+^b5f{Z%CS{fk{C8G3*A%v2C$SO&nOO=_s&+_w4k8 zo#4e4d>Fto;NI~4g=n7$UjOXp9QQIjUVr`Pd`#E3C3Ly;psw5@MIB#ja;cwV>e=<} z^~1g4^MzAGi3}ej_cMsI$Et9>zp)w`RM7bY!e6BFRW35KGx_#Z(|G4K{pU4t;uHpb zul)?(*rBrDF$xF((7a^^t@D8+4fqOS=9Bv6eT$|8gFS-@>?nBlyZ;*i_o-F=_{qn9 zZDBPt@e3|XwQ+V$&MPV$Kz6-`!0@mcK4x3YHCWaP=>08f;^iyDgqfu^%K36vIsZ;G znnIi2$;=^5Y`f3oT==#FF}|+QAAdEIQ1ar*FQZ)mXvx^3nr3~^`wV~1?{MRjYBY0i z;T`@2CO6j7cKzTT-$+dUm{TVh9(_Fi4*dAWDijG3~`rl#EpG|hq=-!Bmw zx(x@eEn|+m21CQ(!w$Y9jah~?;+deegmqp8bv_&0Hu08fNwAQS1|Qv)0m!+=otFyx zliO!Ln?Dpy{os$!=!YHGr}gW3DG+z(`%5i(c3kQwW9!#DG-BYXKLX)l+ITi52sLYs znJ(+IXR@~2TxVa#s+_d2-Td14OylkOW=q`a6IR0HO!rs7@5SoIUec>^wg zfD^f=YL%h9jerMz!>1bNo`CcGHkIHEB17^vzF+hqAiXuT?){y-oR3dz5IHa~@HpYd ztY4TqE}`1MpZXb;^#mK2gNh@3CR3>MTEr{{-+K#ZZHR$*8hn~e(bIIyWiG69`JIV^ zHbl)U3hNqQeIhfQ&#Bq`I}=d9QGD@$EkpSemNVwdiKxJz-hS$*f0pe_F@92KU0+hI zpXS^X21e_*Yh|m7yYH-bIW}Q}hCO)ihsyUdca=-RtIyb~NFKq*g1ef@u@Jue=sR@b zAwvxS!|81u=5>T0#yI?5=K?1}pQ*#}IzJzd*b!zXQATZEj$b^)CL%SSFu%Vhe zEr_{mhtEblrx`56brI9jvCXbIP*9)~+w{fY^yTjb59|~wKPb-F(Dr{Jk2t>+KLGgR z+P%HS)m_s=WA{7fX2Z}RnsD|u(Hi;XmYuLn8 z$?voYTCmZVsbOGt^Iz@w`lZ48lRx$oOfSXw?)8+`jTA$k(brsukoKKqhT@(h1q8=m~2vN8*X z%w1-`&*A+%npd_PA-T&~b()Yy-p5@)1eNDFXRvubum8(^_P=R#X#0G4t=OCijENj7 z%ZhNq;A1fRL)_r;*gG-1e#5j06PaLz?R${}a!=)LCTl;q)g@>CA@I|loklP>hw9t51mGPlEj_9el3Fi1cZg@U3-myX zS0Css&p!$m?+%hXo#fVfBC}tf)rr$&Y7jTu%tZOcr5~3K>mKwJdpF}~pw;HIL;=cY zr6e2Sd7SoW7SGF?Tt^pBr9Y2J3EI%tD42{`fZ)mPluCs z&nybBNndFM81oQ!l6P2qMLbN5(jMK=Z;4MMJHo0rX<7L%W8WtLK1I$?OW(PU3b2g6|s zfv66Amd_+rGe;)}_8Y$O{vpTdjjhVsV)^LDf2@{=pFjHAUt4EPHCp?#Pj(%z_cw@j zf16?TKurzha_(%aSC1I?pDvI4%SQ|Db-_#0d~*z2(*Tq7B1ix}jiNip8IR%U*qJw{ z&vkxi9X<>*EuN(lNATnt{guD~7JL@>aqZdYH+lt|rPg5Y`#(adYej>YjC$Y{nfy!0 z-1RzFIIaw{Q%vuVs0;j{a$w(!1Uzb) zBkKO8>L!?30X|ow2Qctj!#DCPhcpueJ5Hpo60UunwGUjX;{=V%*f-o&isHGl9u z+zR1PYxB^Hm*WS3^Mc#a>*CXuZGt`T#z^B8m>JYb>x~-PcpCd`AgyWGHfmhjiNM^1 z4;gddo1i#2txoLuIrV@gXz7s*A>bL+&5UpVv~2x^MPu^*@W(!J`}`Yk*7LCQ=ihka z_MyN0SEp91U@qzGTE?m4bLz)^xXDucx&()Td(H?^nPmWg!>OunU~ zeEBZ@iE}XeEId0nB(v<){)3w}W9bTSeG>wY|B`-!Ll+XSFYk?Upr2)^R@mj20hOk0 zt;nwYIQKc$`9}w?){VHP)$^V3XoauZ;GIAd8GRF3W2-0Rt)&sY)(x8D`(t32?3G;e z4@rXB6P)#w=PYZ$ec;zQ6%bBwb67C?T(FB|>tCtEO&wep<0s-c0JqirtzTYWpyE4Y zKNA?L=HJ|#XU?De+cm^84*76e1OE9qhN#4!_>q+_I5COyddb<4Ug8*WDPzHC=ljQk-A$$O&5Mp~pLeMnBHM7*-%eyk0DJXkokE{?G6KNP-^t`Q7jT@YHY4&Dk}k zyk76xQO79{{Uh)5?vJWMus9NEv+HYryto<{-*DQfn?*-K_>!7e!VDhc5G2k?g%$g{ zTkPT1YVdIK1&@7vogwva&MBjY=PW}T(9#$Z$2Py>&@qGg1F2?Wb1v5!P~=%Pxs`|0 zk>4(DiibZMIa4Bl=bTO<5w2_Tt474x=x5;QkaHfH_3ZiJ^dC&bu;~n1g&nv_x?Y)sb?OJ>ahE1A zg+d3rZSH?NAh_MW>w72c{5w(fHWwu>1a6qxKQ?<%@%%XMP7v;Tf8|Z1 z7qF#of3%y)`r_(V-s#}>sP$bHQ>vr??{Tj)_V^XkqOSykhr6HTtes3= zD@WrEpK8llDi{`)Bmgc`*2Tx+ARZ2b2ft%vV|Gou_8f)Y8Fld*ooaCg{kFc1Y%#>l z?E10LVC`8CQf}1ZwteuK01=qb10Q3aD}Q0K&P*zW6WOy&s^+we>olLHJ| z^1&S}>(qvG8anR3_Xg|`h9EPqg}2_F1#O}9Wh zqhB&XC2X(HMhqY?G3%9qK&NK&Ud9PrF9r?1)RSg0%;eza9|F!_er97+glsS-@gWQO zANpo;8?hnU zo@XF#>3cm0b2iszP`Ypu8J+kqX=sCvwd$~qB#$9mIAjyeUXLclz~RB%>LpKdcm4|N z`o;C5|0uxFF_9Y|8LjR0R%~P-FY3SK2cBP!jcL{0JaGFwWkrX;d~y!~I#iyVrSX%0 zx6BF*?leB$`la{*fac8gbMabxlM8MmoK3`)msj;N+S;a1HAN^hOU8Wb5^? zf9NlNBL6G-aXrfP!5@0<#-~+1%B}^Y&b?WpiyN2s! z-RNKo^gILly8>AyTjwHx*?7Rsd}!m{=$yrF!o}NK8P48to}q#(XBN54)FDBdyOBKz zA5M_{Zvlnh`CBWRaEEKi02Ai}uv~-RQ{S;IC8|kH!$0Pk=${P>KQ`j$-r@G%1b6U5OEI~<(VAV)#MR$lKeXgl95bn! z!A7kBRln*owH7&>gQtE8FO0b6Pt-ZA1Gj?BV~`@MhYNf%@;V%{4%xt+boyV>gEznF zW;LMZZXH}n|5&6ZGR*O{R}B2;K<9*q7n`gOotYrUfe%ygac(Vm&wJ~6nzylf80`Z1 z_*>KGCu-kqD>^|3@SEg%G9ymtHF{_Ka2sJHi$|KZ;c{H2fk5dKd>bDVzBrlwO=d{eVp zTsGea*CnfdJEUJwws8v`L(r{eaOSzYCu`3wH2hh#38s-o1#QfJ&g0lbW*gX_`U7`c zY@Qu&#^!n?^z^MAQ@*XW`<2WZnJ?nx==y1C%2huZMAG;;v#WG*uGa)EeYBcuxg$41 z;fHs{4RQ7m!cmaZnN0$Ts~(PBzrkWW@LqQxAShIb)SxQK$2p96)Euz#aopgVztM3- zSF~jgI?wVI$J{u>2WNRZia1%c##aEY2`d+-Xv8tc!R%Okfd`S(gGopxo+nA2pIH^F*$+-ehizAT2p;YBskLkHBH2aE7f7*7Z`KG?l0 zKK2}1BnC|Yfe>pBhG%$*!1bU1w}0~X|9s}NY~R-7XLW|(_uqWys!i*Z`sZkrrgkj# zxi+dr`^V8Km1`6WUjV zIoJ<8L{@VQ84rP{Y80UTq#pr2dydpd8ADNyi7$8UsozkHG5FdbUa2_$?sDYk)sI63 zpZc|WclGN5(DiyWXB`TjISbw%Kas8H)WVSyLx2fJn>D3$wKiKw7qe@H+YHD$M)f3@&^a#l^Yb|N&j2<|DPQNFFPZV=^rWBs!!{z-B%r{x8ioM`zR^Ic=`|D@j+lr2tQFwe zpl6>$9o;Ri)Q^x@!SlgxeGmnBtxfmLB;qkf2WOq{yZR>zelO|8@p+D&r}gDZ{kEL7 z7U--1IfktHlNflL$7jS^_il&(z#G&8kYY$yveAM&@5wk!WPP21v-kWxS*VofXzh71 zJnZ7(e*nnMapid@(ui(DT6&rxP1+ZWj`91`hR7~dgeKgJFeg5LFeHp;8?x}c8v8|Z zB%(7e_yot}kTh<@lQ+%-zFy4O_ltBWICZD*!)kS}v(ARn)ImXn?fS5Oa{Dvi_u<8-Tsg7%YT)T^X*DenCD-A?{5lsK+d~JU8k7iI6`w*)Yrbm9m}cp z*jrr@VBucEuMMCk>UCT|{6%Qe*b*wN;wRMlQ6c88XUv$dy>jKOrR3K@DA4=|NV!X}{dLPsg6Hwda$adA1HKb+Ja@Egd ztyDU|CKIgHv-olm_n_n9e*jobM?>h>*#_%Qrvp9t?c&Q{J9;AoUe8yDc~+w-WcQ;Y z29{ZB=xWn1iniNGS|Xs)ELj80pG_N@kmkY}!k@YJ#-az>x{DivaDrcB@dlM#CoctA zXXf(%KK)k#fAI%Dz9`-ndrGbYZ<;Wx9^yXQx*Hi3K&!!HETB+n++*$%spb5Ny?=X|}VoOQSayQFPSABcdE zDq?ZTwANa!qfYG7A!^}=Mw1yE%Z{Yr$L2&Fk;nsoEFHV+r)p`lbwiUZ;Tpb95S7ff z=-0MfS`0)SfmE}e#By7ykMFG@oF&^?*j7Be>AyL@>wryRqe+a%a2Y!qo(Lu$KXqvQ z-MsHY41~&`*;yOEZ8(zyG}s;N>2R3GULqcLJp2y;y}2}rE_CiRtwAG9$0+dG>&7BK zqYYsS?D_2Gb5tI<%G>6ixls-w>a^4F=a_A#e956Z?}Z~ze82F^!aUh)&N=PlQIZD0 zCcFI$$8LYQE`DKIV{@1rR^f&*V_0w@O zs0|~>_tNznQ(TD&{)l(k@Klqov)~9SVsDAFvam0jRf=v)xC1+l|&)IWx zXu;Ju)_fM3`qF!BjI&Q;iFxvi>4J!9`l~vHHu7SBUI7Z2K4jb6S)cd~4?EAcck5^m zkCOPDiH9$%{$VpaO*wwOyZ@_?$KHfkILj7b*jG@!xnI1`9aHyf`F(>9uf8|s_FUdp zAV(&y?=I^TpZdXVkLRKtCr5lNvZ64vGHRiZgz@GA9AJWYnjjp+ zk=<0wyhhIA_&3V6a`sfsfw_G`Bk?1*q1Z6PsS*2sv9gw$7#hTT28FtrQ?RHP59# zxn^HY!}Un6C*JA%Y=~&Iwmp~TIZ?cL<6dV4C%W6rWtg3?dEv6>*<(P0G&xvwl-0thkP@_t%0IwGJ~9gsDZpC%`oc zt&kFE=I*u*k@-c)(vpz1N^s(j_0}O8-kod0%(4-)J$1R^G*AElKmbWZK~(G<9pmpH z8=RH%m)3b~-=A>!np5j@W@Kt|+y$6R7?sICDJ-VcVuj?KO_RCnr6q%Hek`jQa&~Ob z@?RsD;4C`95d0FJ1f2e?mv7G0z3V62{_apFNBsjY3Aeh3t?=<#y|H6$S9tlJ8$$NL zoeA&CyZpk-uqqG_4Z=R(qT3XKtb-b{P%27$0);68r#=|J2ad z>dck<-qV${86)@ahS`k)t~(%p9hvo^kNhQOcwVyI)TWZh&h)1V2CNBV@kz?T)<`Sn zi?0dvW%ev1FGBT(4lzhgZtgZa)C^qqPmB$i*~bO0XY0#mC;o|H?{X>jGoSt3?ce#2 zzWo>E|1gmM!Qb!xJ%3>RC;!}^o<3uGgtM$OvuQ16X7YXb@D5I)sK0ADHlP~j%F1`- zr5IW}{H$HS(ZJ#!t%jVY_Wfa;0k)blb)7l+;LhDJN5zvg`U^HZ5!pQ5<6=GNY@KWL zts&>u+C3xdz$fp?$H4&lag#YTkR;?Bz0~SFeqpYkHkbZqKU7VMvxWf2cu5H&=eY0B zvEzc@@BL`Vym*4-`J(#ai65QRAKS9ZoEnl*v}UHC9GS;b(ZbndI6onnU>rGPIdPot zuVj66>reDLw}@A-3>ERaey}kx?g1Ag^X|Xc$jC`L2CRQMk;#^|LX7uiPv}fR9~z2x z{=f$37}ojJD~XSYO3;buxx zx@p}wY0SJtYA|e!@nw@O&%O)|b05)70$Se$SQX($WYy^43E4KG0-qUN;aVJ>3QJ$2 z=J}LGV+I%e@bmzoG(KmAjkG5xt>Lx?cJ}kpbO|JCn*|8pPoIY=UBV==YzDRLhCxj(9(^K(Ymk9gKGXF*-{dzld>3r))@Qw@4}th)^gL3}nc!}X)- ztMh?mM(!jAq8Z-#ymOD$=&YE=vTChld(#9D{CM~u0Q5Jz{haRa-P~a>xeamogR#vZ zXXAYD+WX7$F!mk5lrJ~6o$!8fMh6Y+Kr+pjcs)yC^fYpuqgCd4S;z^KM$#PSV;XpJ zaIiANUx&dwG-UUg_+nBJ;k-Du%9k&QiILrB1gAjntZN1Z0SLx%v;Q;S_k*_&{m@^% zeamnErrY~|!+Syh9UtHIJwKqodoJvK9Z<+Xk~2tKFd13bKCWUdxm>QZng)ny_14-nsZHL-17T)+A;V3?9}6c zYu#YY{7zXC+9SAr;=(`SIiJunxdA56ndtUvBU-wC&=8VrfQt#{@$!-0?0pK8j z$44j57!0%4%rC~Z|0fjJBw~Fw`kh?781BTIY4X|iGyNnnYokKE@(-N?CLiUxG-Zo5 z>9Bk8{Ux^N=>d{+^m}}EOMfZbm;-4^mg`(eIfm^}1S5vV`n`?A&zvP;OJBj(7u4rz z?ND?-ELtthY_9XM@}GLu*YubftzdOZuLKfcL)JWti!*r=g2!i>fTfSUIUWQ6fd)1*sJxpYko*DShCdrT3VsH$S=S47#L(oc!K)%jUMLwZ zaAJ2xrCBzG!Oza9J<1;X9_%;L?5U@5AgVcxFl#zC*}C}e)X@u{g&VK zjkj<3x_{{Q$}6u7$KRUiP5oc`zV8Dcy?w_Y`|jHZKJwZNNR!L@Vru$|?w8GZ&;CL@ zPQC7;H8pNZ&06;B4;Qs19oPB=T8?O`%&+8D{p3AsJRJKAJ72tTGz@6(kA__+Lx=3%J*;Nw|`-sP3U`4dn#OX_=QJ;Uz;%jy~MtY=wyNK1P{ zu&?_AYdD%2J8i8NL1etY7@rXx7SapT(pqVr=eypS&)stko&+!7AEI4%!h%uEv5fj0 zKz`>z?ql){7K%eF0XQ%pwOaWPME+4f@&g^^Oj@_^I-B|a(WESD;-s`|b@qhO14;U$ zgJYe=8$FKt$!FM{#rZ$E{og^ul%DQZjmO??XDN9H;au9 z@W>bH`3}*(>C-eGo4&|?31?5^m}VMkH95S?x!0I7(#EW#Q!6Pav9r-nD!le>vL+D{ zGV(uf!%Y5+Frej~=h?{M*CDc?J&bVuP@5Qg6cIxL$Jcu1%i?zX;75Ms_JP0j+U-kz z`7iZnl&b z*chvR#~oeoZ|XO-@p<)d4RUC)XtCC8wLt@c8P$s`Rl7hGXHKDPUzHu|lMG)dJUy8n z$o+v2gC|A!s1r{*=lzlAT)%TBc+#KD1*~Cct79(LGNGhlEi?|j^@o`fiZ+^apaxb0 zs0EX|+!s8i z(Fd~N&-Nu@DaQmkY3dhA{H`f`7e${eXB`uLZu(InP zUhScBxd|Pe#_Jz4?n$^r+;uf0C=g^ypp8ocn?G*n<`t_i4~KmT2t0ZBMQLz6s1xpRgR{7>l*>i^+S{Mp+d`k%k| z_O35{=j|WyWi=YUVr`P{QofcN#Q>EW1qTx z;zvJq`{-+b?e;%^kgJfG0trab5!AW%>v)}eQuJ>$8|6rq#6`}WzzRL zwGz+#3J*Hv1{gds491UZ)$UI*_l zEr7)O`{OvK@#L3S@LD;vnnJDojWjp;rWUpVTcTNqDO%;qeDb{o`|iJ~Biu*IOMm@v zI8N6GIgQrpT-(-sb=D_y0o>QlUsxwQ_Zk9{gp}P3S7PhP$1jFMoimsxe|-QCJ3amn z08eh8^3|SA&?ezpr!Q!vZU|*f&t%;mnkJ#?Xu?DhywJAk;f5l-x(OZ$HeiNF+lJXO zkM$y;r2zI$N`7Zj8({NWFkT1DUei8b@;U>cTI5fI0?RwF01_)&36B|Bkv5&e9 z)gqv0Vg9WC5~1(^&=24KfE8E#HB)aJ?Qv4*y> ziLr3FM~Ao$=d4ZcA8T}-s|YT&nxwTPDNgm+|l z6ilZ^ej$ud8#vBw8J|=nn^JDu%Fx#$LMQ27JE! zCAiL97kV{Ngu;}G?n<6mpXCNKZ)!6m)u>4At>gc ziG~b4|L(s_)Y_P8_(&Fhc%Qy?st>J9`}ogQ2WjrqD>9U+`{&^g`Q$zEpz}kW77b!~ ztWP`f=v0q=Hn(5=0l>w08$aH0d-^F~Cbv7icQ!&BzONx+jM@PiYBRV zHPujtc(fom^~@mywmCp)Q$$8~h`@%Ac6jVe+jl0D?ap6FXtwLr4<5m<&4SO2Jl`a zzPqGC{p6f;B+aqOjLRPfP5opk-vBe!I%nK5il5D@U-RKSa;AFG${9!4S^|S7Xt>#@ z<{0DL8Zymr-Q?Il>K6oDsUMax!rNqOl&vQ|U9K}Q$T^4CEEUDZD3Ive5T8Bx6$hbx z!DDR#LD(`H;dZ#4%HC4bf3jh|)DMF{_AG8}sUQ6D!RxzN1<0vwpO|7mAfEIgW2K?s zeg2qYHsa1F4EYa+2tJelr#AXASC9Ws0B%qAKLObN!4>C5(-Xe%_7C%z6Q?~5!LKw( zyu)A~H=GUfl_&~%4xSAy9qeWR;#M|%?8Cz@pT6MHNb8$00mGWjnPYNqTD(lomt-`E z?A~izOPO49KCKl1eiE8U6KwT_*;ig>KD=mt*#glsFSyTw9~6mZ!EUrP{g7x7bO$e68EiwH;ruT#^MzyQa5*xMslI6(LK09mCKs~y%TCzn zFn1mOa6n*)|Z`Mxu?l<@VkD&k|Uvx*D^Wc z+kT++_ndV%vVQc@=pOoLDw1Lpc&r>fa;cvM3BIde^O$$k7@?D3f?b@AHwoDcKXd9A zk8>qo?C6pHCHv{0!5`@lfhO?dfMeBYBG?-a_k|~RqveRc6WB5#Tv~-=sE+v|R&45r zGZ4d9Zk$E-NF*8d8129ZLc{i1$`^NPF%c64)F(*(fmGhR=9%I`tl??a+9YQBw`StV zwYe4M`N=Q-06=}-&O`rw+9y`S^&q}{T8tMWGcJFzH0EpyLS_J^6_=^aEPL?NSts6D zlt6{SD=jx%ocU%*wARD4wY17>FhBxI32Kv>W9J!V(}OX5UbIt(oQ({v-$>bz@ME<6 zuGm;dP*Is!O?}~rVi?YgtWV)X8NYLB1~T=fbTE&Ju6-;9EA#99alUwVS*Cv0H|ZR% zabsgkE+vS2a-Oq}KX+D}0;}oe*n8Th51-falicVu&t~B|%?4jXYloehkL0YYNdk#L z&I2xNe9AiuwwL~O=!p*iZR?xxcqq9S)&Hsm=W+j&2TZADI9b!bw#TF=!C1*(>!z2m zZF79?uk_5RpMnh!e{>8O_PtL1*q231w5*41pF6mOu3q4Y4VTIh#Or&U?nTLPg>=HvQT<=UUFm->F6+&z?(2 z=g$n61NQ;e`422!r;V-odolRMjeEETANnvje=SqL1msS-W`6UN**)&_;r|K1?a3>z z%^SBGB8{<|gPuu4$fFI-Xq(%+UnH^;M=!|P=IR~-H*9GgYwwC}L&F{ZG*&c&FK=UE zfO6@u!T`aHVz95ZR#7K3vDPtMQ3rnU9K7c78#CvsZW0;&;Vl8`GF6wCt94~fbbUeg z0P$F}K@LzffFZS??Z7(aTvI>A2GTE;oZq@WvsNPL`IjB@VP|9Cp%=_mhaAXG=~o=_@aDnOiI5s>9L-FZNn1I2jFvGkwT8j{*$d zma&@?JRfY9Erz-4T~`^+YYnut@3}ma6G57rv-eQJZ`$EC-V7_(=FIGMLj$+1yqWnU zE&X%qSSVs7vrdA&cTqCw}6i0mxYy;wAd}U=7XWFB~i2 zMob)=?8z3)UH`V0_QZQ?6$Vu;QuUayy5( z_BnyC>e$IHs&mfbaFopT3l30L#IxHYI`sz5uKKLw1*4VlXPqFle+6YxJg8>|IZhtQ zr(l?$gRi?p-nZ|`IRVUGYkTUqB&A{Q{k9&%09jOeuF-rpuNF1 z@Tg}r5`E?$0@>{{z)U=SNFfu!Hq<3xhXRHa%IEUrs#~1hLAh+G~E2(P;vWZJR506E0%D- zux3ajF8}C3eBzfDSHPzBVBbJ3ahA0r>tu z@~xlI?frOKF^$z`=R~enp)7pc^sUu@! zW4E+JQx`&srH}fKwRw))iWOx>{>S{3ON=&)ft^141bt!(;Mt~DDp`H?xtQP+SliD87HOdXc z1Xkn>y|b-quNa}Jlf*H#hUlVyforq0h;5J)Z6wC)xSnhGG*QkT{ZWEt_fL811u(T5 zSMtH8m`S1Y?jJes)9YS*i95iDFETOYIkm3-;K>mGo^v*1^yn^{DJ~FRr=m-3hR7r4c}m0>%ki!;nv^#8WhF!l9IG#f}4+kYVz@#JqOOMW+4z4lw_-w1|S#hBb&~zn&w7G@Io`@3J&(Z&r z2owB_orgA)NRS(^pcOj_fdl}7p3-nc=kS_)awNsIckFO39@q#b(7~ApA4o8)ci!9y z>=_HH1$Sdz6Lx=Sm|M8wH_af1^E^Li9d5j=(|?Jz&2|U5L=GYw2S-HSHFo{NXMW&t zJI6%l%+wfX;GQP`mA(lUed4_(8p7emruC{{T#hGlqLa7Jox2v|!$2Q>yc9nG=)cYR z!1ZNH)AgO$mpm^z&80!JT^de+)!=rHmj*K;D93=cF&^t1k3Fx`YRZKTPw>Jyj#&Xo zY0u^lcRD;I4pshWn}6o!7BY&lk5xhsW2OqukIR5fGmc4Boe^f7dE5La)sU{%3 z<^)&u)8Fxs65*MXN&F!8AUb%h1aPE{6SInqkq_gjsZ6_mLYrep)CVeAT=AxC{n%I{ zHHq3jYq??QAg1uiUKUw>aPpuKF}WZB$HbCxtsj=H@BD=~1rM*7GcXzNfbqtdfF`G% z;jzv$^=gfLJ_Q**HU1mvzmq?lVWJQEvG816A`sq^w=7z)Rl-1=pQ z*_skG99kCopc`vrW>4(FcXEUAfMXV|K8&qj;8wK0?Mrj(nnJxPnmQ_F2 zM8P>pZB4@sN(QhI+hEQ7j;P}%0RxFWxy^4#^zY9C!K5JCpO3qdC}_--{FBVCA8$7? zho&s)1)z9^@tIf=FIzzNxn6J(hgZJ#Iy$U9J7gG&r#OmXDmVC{3g6y9oLumn+~CJ& zc*DqLSTtF~IkK^CygpC4;l+Q9Xl;XY6o{P5*ZkR+fLuHPDAdt`jGZ*75!*P{UJ&qO zO}sY!-!5S=f4M~h*2AE8d@!5Ge!dj{1mKk?PyEvy7rYu|I_mPWxn0sU^Z-rnPhXC; zpQfOprp4NB#tjc0R=sL_f3Jg-KE|4J_?ec2b@H#OXT_6N0+}a+OoHzhvN;gNTjLO) z4YWuG6Mq?Z0>mVL;MJ)RFXF7r4W~Y>(bB)@uuTAIGR8=TVNbnYUEKF_km6XC}X5J$C~^ht~XJEDjwYA+i^P-|NITcGb@W6MQMa z)fO~**tJ7nA0QJscZMC?#(RYkIAgFA7~A4$(B=)sFzcCWII6?kJYeWL^XyIscqdex zW`)7+Q3AN8E*JRJz)FfW%c>us&}8Nh>wSDYyMEO_bd*Hk$I}FQVA2GB*H1?OPP_vY z)^yNgst|7)FAZi*~8`uQ{Ckb21FOYsB1 zFZ<$G`0sN*PvfQGX(Bp`{@M*e6Een|m!uulMsGmzj!qCt_SQTES;ps2QGl=rjD*tV=Uo_%r8RGI*Fv zE2^+{ijhN5<4n(nV2c{xN2-XMfM5tinorhjSO-sRaav^b3070)_;K$4x@inHJIp725|1hY?42T zXe193V&%k>JF#&>;MmNmd0pl(JpJKF#alC|@R|L2^_w8XtV0gOjV8Dy&*JDmId=K; zuHkpo0)dys^qO%Nl#LTePYFA?)C_F!oEMwnQy6yG{YU^&jxlg_hLT7RwBiz*a6s87 z4#BWsXY8EpQta{steD-=WVkWrg4q1wKJg1DP9x`x)t}V}e}S{4$!N^$7kOK)GhNz-WbKcg(Rv1QE z{;cH#g9e{aPI71Vgw>gK_Nrgu!Z(7s=*~D71&aZ$Jf68fam?9sf6;ZC!VY|$BRb+e zFpI!P+X-m3M$fhICMLaEIloWXt>@bZgK(pnR6x}JY6ScpK;=eZQbTLu2<=O z_-fSHbGHC6)TSBDNp;rIxP$Nd!DIZ85IDilo`ukfn=@2^jbfmPHm(e zmRR#N7dZ%Z|Bo21=pR}6`~^Ws5P-2w!sjV^25jh~>-Frj4n9g+4}q~IKn5L1vf5AE zxT`Wd#QB@kd{qkGR0#{Gu&H1Dngua*;!^w3XX2xPo+*^ZxNUKId_s*UdvIc2j?9N=@U}03M)@#M^ZS=0R)1sc<~Uriaa84hbiV9|ApPYpx0Z%*(`r`JAmB zJPxFOeDH?94xycO6JgxVu~%;Lba8-22NHN`Qita2fKM&xPtqkvJ5t1<`Jj6amVl*( zH!+9HhC>=~_?@q{CXEG^IxVh1JVEP9&*ZyaPS2GGIJdm^n{Q2W zl<&Q{02l~gv|4jgXc*-YdzY$E{H-iWM7ab;It$ml1Qc5}GdDWo#OsTnJ&>|F69n5o z=D{RBy22X99RXdf-Sfrg{Dsqe_7t{#%HN6>TlI^$=ZN8;OA@WZGin;yKEHaE55Dtg zbf0i77-5q2fulc>4nIEO*u&n-+|tl1VNa*W-&O?lGoaP~MB7&H2|l%RWzKBYOm&s- zD6$lWHUWER;&~0>z{~|d8ii@sf^JGG=y`WW$t8`Le?|~;ry8s6`p1~T9;Twt1X6ll z1xpRb`_dekq2p71vz0dvj6n8qg8B4v1o}Riub4GU8tpzKB=-KJO$-wMUp!M4%lLyu zulw-a#n{EXCjI{f)MzWd-S-#Z_Tu~n;OW!1b1*n)IT(yNEIj8P*d7+24j)87IxtRX z^w|m1hnbxD9_AL6dcm)5(3Q~v9sUAT2B33dYTm=lV!aoj97;V+L68dUdby+rF*8w2tOd1T~^Wf}j&xP`Ccv^6~3l>IKQ=LqDYY9O1P7`a3rM z_U!(M&DA}ztY>p@mX|%Vfp*0z*+wYUufX9$sC!*|Qr>&A_TfJps1MwFQIPv}636G< zcjm!%UJCHm(lPaMC&!Ivrpw@YMm2DPUT2+;~@nA@-okw zY5GQieSYND^JAk%f#i%a2FoP%)|FxH$Oic8$E0DtN+9aa4G2mMG|eF0m(>mThDfHK(eUwnl`%JW}r!Mp?4ScYS0%Gmn=PSO{P z;om)Z{0qQz>ddfQ+u+>uO)L8Dw4iWR^?$mWf`u2m=x~L4aH{hUaZo$O4 zZv8n74u_8h*MzgGhM@M>PFjDuZvpcjyp<1Z^x==woX3=w@`f-?-^gI_us^-1;p_|1 z;*&y4KL%2F_Llm|ab-V)Tqe;jCO8Xd+WohHc#gtBalC5@!b3OzliZXw{%Eh-V-6DI zNM*v+(madG`JTs}QNu6*i`g|wwU^W`LcuEihy ztQUC04IYr?z-)ilPaNI;418~{0m|9@lyZJQ?$-s=RmsC%km{#g`?4KUM%VG^D*EW` z{abad?FC%nWB?QBl?D8}mtUN}0IXiL4Zo7dFaF9u_wKtV&wpF@$mV@u^s?>wWH}EG z7TuAL0SAsOH7kht9`r1eWJ;?jOhp3y5|<5c4Lizu~*8ob9l)ku`S# z80u1x{gX?DI~f*vWdbm&FPKBahs!$b(O3c_Z8o5ODhQ-MhkQ|MkE^~h*dDL(%us3J zj9hGD=GHv=m+3r9V}a6_KELj-d(+saJfLsCSGleJ&8GJ{{$uZ6ddpZ2){^xbVC!`5 zI6%O<<(5ji=W*z1iS+Fik&!wC7MRJ+^P^9#k6O93c3n!W{VCkEO_j4}_jA912rbqC zW)J-ZvGnbUdG~TYzr=la5!^&D=T*+X_cdqY*kH;H-xU$CRL{zIjm2v4Ht+Tm!H3!O z%5yCjU9)tmo!`mjKm2&HIIk)Z)3al#E1rrtaC5!^2*tU1tGZ{hahQKkIi8B-cXx(EHx;mfxP(ul)N9^S=V% zQR;t7^a_u8zfk)D_we{2^h{{X=MEgR9IO1YO{@yxD=&ksRiPZn#{KcqL0sB%_SV`y zQSNzV?0o&QA9>R!8L1?EpPRjz1K@`%FilQYdw|~m1D<^O zE9Z3d&A^9=g>r|A2l4&6x)iYRt1xrW(Io-bsOjq8=qHVqekgzHB%W)yV+VhE0GRcp z57lakkH3C^E_(H38c*z**OjpgjU?OvZabAJ`pm+|BNx2X!7k8u{Yo0%JLF}Y3~T=Q zT5~H5baH4x2P@z1Wk8{GAN}@kX;Z7EqPOBGCS*Aq{d0Q3AB0Lay~CmWyVzml$}-WQrhkilE{p``q+=c=f0;b)>D zrG(EMuKht*58SN1YXh4e9I=SmuGwm|KR6G4ATe=XVE2#P$b#ou`=4Bbz~JYnm^}Xp z8@Tx=JsJmh3UmKRlJXVSq+eQiv&r&Q{mz4&8>PrV>8 zhrfaoBJ3Qks4~H!E9SZq8h#e3|KOM}vC$g^gjcBhv%VL@XJ31|+}JaJ*0r=1f!`E- z{kf#Q3c!8S)Rf`4{>~-W{jXmJh$(MKi5i^@(Qg0@hyG$CMoZsSRv)a@bD;yvOo7+8~AY z-aa*zXC}51p1Y=H?`>{RsjNOl5giw0P+c4~_ul@?ztHo9RxgeQcp5oxy3ev5IAl`4 z_d!jmdh>H`%eNO~egrjqdbxs=)?gUpe$J`36!_^MKF9f!{!|i;scQ)$%4JZBNzYR6 zz5b0_NV!Ah$9wH$`K$sAKIr*s77lH8vOMLgQwODEw7tb4g zsP#aJ=XdhS<(b|*zm|;NcsOJMDL6(=xl$vmMB+&f-FhMPN9)PR50`bq zSv{HD2@5p6c3(|)C7z+M>VxQl2oBKGdY*l0uQosZo0?iDGOY_ydmxXOaw))L_A$Am zfK{KR@XZ;ypJwRN)( z`t2CFRnzG&<_LHgkLZY$17!K@KDH|qHUOs{9qAW5rI(LD#_fRR5im9@>Ss3fYqoqq zc@bn#sO`9`L*Ur|_9J^!zoqW}#b7l$GrM4#II zusJU|s*34=_yA_$aOFVyOl5BRK1k&b&2(pr)7ada=pe6{W}V-h?>X?va`)M$%6Tgs zV<$_1X%_$|=}^)0p*dinF4q*YUbw+#*e|C!7oF)}+jH!*eT1`gHRr>-ukaUro`(_K z3OySo{t9m)$L>ErVFeC7taA5Af5yweW{A!F*q1GLc!-W(eDY)fUi*Kjx3G}8*GHi2 za`@T6#xb){`j-ueK9hQMJo~@)RJ8#y-0z=klsNf)e$@_d>N)EqQBe0~&pZ>RCmitU zLmuzwXP=R*C<5fq^}J^aC7OGD4jkgWjhu zq4vS);p5P7PIFc@Fd;U$taNwCT&QUHRT3Xgc*xA5Edi}LcW*XtkPp7*An${TYe%LIFnB$sgj8`2L za+*8o*;_W2HF5o+udP3?x+xPg$oj78;Db7AwuWNSh$iI`UpY#hKjs6_<=SVy9s<08 zG8&m1daawD#6#ZFrvoVycH9IovHNp9vzGy{8sh*}T=Ozoo10Vk1EH_uFRx@%!>Sz( zepX>7BBLvHZLd}sO7~?S3D}E0xvufI%6MR6AA*A;WuKKe`0dqbl|FlNg_fpHYSUip zk6gmmYfY;F`&+^J^bbzzV(oo-M5_Hu53JYP@zDjxp5A{KWTMH8C>MNS9f{eKoJErJ zo(u#rmumuLfk8JJ9!{zMdj3GUvY3xXxUOGQ?=20OqQ)z*xhsYS3L1cyV&7!sb@(5A zb4AQJi8g0;6dhM<4+?jU8p-*O$MA#f{wW}ZT|8Pty>IF#t^bVJw-)xIj4#|@0Djd+ zUjJqtj}QB8@TtHc2vUW z9(q4UIOHd}sh^q%q==h^F!tHID{R;>_a$uenef_iDe44u2H_WNGlSVBY0V2C0F3fF znjfj9ef6@$A%KX55_^?>C0PhHXiwwQIv7)b67J4mPQEwr34E5e`P&PfezazT*Yc;c z&DnPv)>7JiFzH*z)(=bQO|Z?320e2k)LJxV)B*3IeDL4p+ylqPOF_SIMXT>cefHN47EpuUA~M zM`HJ%lk0CW9sNuU-+Cv|1teAItfsE`H@5mWyMBUT6cqG_Tj3p|{o*yssoLcu^)q5|W=plglF1EC~%d=S@o!ND@h z_Xxlh8LR4^>aMf z*1=d{`$Jkk7GK(q1LY6ernP@onjCphgVD&<_0k{T7z>aBj0`)BvsczZn*u;;G|ekV z?Bl#K${yG$+I8A+_)!ZKIDBh!eh$9-X|M6eZGw5%D2gA8IG4Rl%-rbbFB$Z&JK#B% z3M+fN_`@&Aa~8v2I?*T1b@G9_G>atH^B1&Y8Xj@`#d3o^Q0@t6`Z!dJo&FICt&Hl-+7~9|4 z+0((d-S*u6>~K^_Gxa#J`nR`*;Kd*38Sx+bjFeVwB&|K8{jq>J+g z@VnX?*Z(pltEPUS>=n)VLA|As=4bU!Al4IPW`2TM-rlLnJrdFNF+!WVFZ~OZ~#jyfFPNpkA<(Luson}sbuWbn^V;eTL;845sS! z@<`4Kni zEuEw>WaH@yt-YRQ5!NRqjQ+ve{^(de^^a_f$WWUhzAGO71j$54f%D9Ho1)aC^&?D` z)$Ax>_yj0!U781E>s{DYTabVD(Pz*2o$$h4FTHR()`oxlJ#YKDH+=q={-!6-o_q;M ziZjB&@&WTCt2sSBT>B6fn=!~Jl;y+RMP#jxUXe}vgP`E?ZriUf#Dxyq0%H3gZu*I6 z3OWdckELOKS*pKA0b2v3{?QeM^+C851XPmoMGkvjMm+p78?!0#36@l6RT=vv?0wt6 zAW4;L9oMuYyTt2$U^{ma5D)4mA?YjZeC(2jpI^wVOWE_QUqlq!fK4K~1dP=7ul#=7 z7R;U$d&Q+IgcG-J=aJ4GzBdaFo#}_?Kt@-Ft%WE^E;Cw8LWvVAsKC*R)Aj+%+3-0W z4s)+Zb4!VB0Y&^z#${cgYsz~K-b;ac2CE&P#a<=T6aGxe*$ci3#C{nCw*#Pfx zVRC+0+NH@#5@o*Di|9#vb?$+LDZ_z((${?Uunb7p%+mL6Ju-N8P7mUpI^CyX+DEtL zSH;7F4u%s{wGYTDZ_!W1bymjtLOcs8n=xM5L+Ur1TC=xr`hULfE#G!BUX=L@`ELMt zxcaXI{%gF=`#@?wr@UhiI=IYpl>8o9qa2+ian1A8!aaAGtSiSh9}4Lj$M($r`;Rq1{jAu?^i_{8+9sZO! zo`J7gl#EoXO^p^hn@u1nGmS$b6m+Gy=!yo>w3ZaDLq^0S8d} zN3M0`nPG@;g}el2w_;t??8ULl7C1YJ%26rxOB)V9m$_Zy6Q1sEKx;pIQj0Luq3Ylq zWm~)YmbPbh&pK7j^Mwx?5iXDOM66E`241=1kNx=9T+2>TD93EDXq%F``K(JCeFoQr z!gw$O3q5-##-E-ZOPOo|3e-eDjGmJuLYyljUMV3Sl`VtqNImc!XOBNh3e zdmaUQ&LQ7^19oy%b$Fs9%v@;lQujr0Sow<{dk`+JLMY!_mRP2B|c9Hq` zwiM`{Gnx&N%K~U*X>Tw1cwVp84gV|&_~MJjJn~W4)kZJe7BIDq!0Lmb?w`i^?rIi) zN!;|WWltgI?*d)iqN>vLJNoWrYtaY}e%*2EewK!C(Qwge#!4cPf-<1A`$sIEfq5t6 z8`h$)iT88r1DpckXTiRru%VfypULGOmgnqciAg||^l$KJ5}PGMeKHqdeAyScYyUQP zX+Wt6BYY=EXb#)Lk0yS^Oc^g%FPh_1NS_yYu62I06bjFHjiWQI>C!K>UC3DtB@a`> z(y%7a`igZ8+2Ho6KYRp4L6h3kzo<^iMJ!bjTC3dyHQz$^lGYFy&z|5@KHkfN1y~3! zN_DN|h!Jv*#K1Cj98~u2;5**?y>Hgq&Wv>pC=CHKIAzp z$2sd+5y6Mn+&N)BjXhuhgPEgf-T35y=N#|D-XeTR$7gwHor9066cL>>e>w0DCt--D zeVO2Qj=cRf_WvLDStofsx__@B*qHk+fO)uRP5)FJdtH3bN7UfyA6$TrArDZaw-7B@ z09=0-;Y=Jpw2Dxs>BAw;pMGSRL+EzW6JilxHERjSc;+I+$8_^q-{X%vYV}}V0yefv zk(*E4b&+WQG@UE^pCYBO_A^B}!`uy!1_2kK(Q||};U9CROPY^_Qt30a&WAO-LP(bg z>uf@vuyc_GWK2@gT|V&f(3o1H2_N05Oc)mut(j97e*!xAL`~b6HYobLc$+>@}Fg|^%-vKY~^+Nvz;B)@juli;kyr1OppXXJp95Nj$&KHMs zowGSBK8_;!Fq14`@;S&pijMf;dzOzL)4a@R>rV@q5hfn?AFRx_U!{HUvEKz`HZKfD zy6WY(>4BzF3^ z{|eW0q)Nl8rSE?V)fq{drxZuRZVzhPo(o4qn$ks)5Gaw9f}5QLiXf+j7gqf zc9v4M7lOo=|I`9{`GnfeITJ6YGMT&xy29+4aHM$_JQ@f`JwL~tCo5(AvWb}piXBqrzTx}lzB#|kC(=1Y9yvVyMKd2v)AFZicU2~ zw0;(xgnvx{06+jqL_t)y^`}-mQevJjZmHi@E9w12fO`m@WM7^V)~3K_PqUBV;}QL$ z*`N3$5if%wE)cwePJa4_7ruemA5{e>ICZnEuIKHCajARJiCI^1 zTnm3%$@QS=9tNuXDP3=<27R=i7 z&4aS|qwTf8{JD2I)Of~|-{(;c_*0gp?w;QLl@Gk_ZTcPX;$AQGUjTUQpY_tyzpAtK zv;A1`;p7j8W_?73^TF|p!$H*Krss)Z~H>mJQZj8K2T;a?nUd4;9uq3M)vrYc^{wSTau z9?J@)fA$`?O80W9jr8otWsTnzlb*JKd)g33{9cU?aFYgg*)IDHh3Z*@K}Q2KfV}{Y zzC%aSwZNZzp@xiBs*eNwaF*5dO5oFT=8@o@`oSFAopRz|I_T`lG}mtTh(!RV*5PnZ zvfDgs3^(Hnr4m>jAe#T*w72!|$b6$hD< z*R_(IJ*|x?R-;)X6}T3{!nYqmU7<72i@kLm0y2IY0sE8-AG(8fpEa_55e%ZX`612^ z(6QHywIb$E($Qo#7yvJl>UTbOqej2;GY!iAV!3?o3U;3xs~~_DhNhE-TZ855-(nlJWSU-MTUZkn707Mcni(Bv8CCZ^+S)u*xS+G%Pb-A$L0P^Xwkd2di;=0`|TJ7f-T08 zt(`F3@Tn`WpD+XS_hk5yB5}UI;TvzhQRXxAW~;9iUaNo3kAINPDe_G}{CEGxKXLj6 zzP<2&0pQs`f9Ydiui+!>#nj?Fh&f~{=-0sjg#ygP{0aF0=Nyytq3?&o2UKrC)AJt8 z!8F|SzEnNT&hVm`ke492e0cm~1~kx7o<#P<3zD)CDj!1XFGm4@T&n>rh{cap_q^xf z_$4Q(Yt!?g(#w}1(3K>nMLm@`)4vz1f9EaQ*6N-q=F7mT8NP7~IrT*WC}r5Q zl!Fgz!to+7B-eEUY)(xCr}vsi-yvuGd=&iopZ{?8UHXXfbMZ=P>EECY?Z&E*XLadI zN)CYe+H|l<&;7t=FYzts^tY57FqINWaLV_hLHiTo>e%N`gqRt#{eAu@IYs;NSz&JO z6T~X+J(Zp)OV`fmq&>KKuioDTkzO{L_uJ|#tix)qMwhv^s(oB^I!Pu@h<>60zdHA|KdN^srUvC>>Qbla}e_) za-sx2PEk+KV!@w73z&0f_{8!;5K(sFyhtnw-ScvoEV!|ZQ$WU6O5XHnXpxW8_^XKc zhClA3HN4^5r(%wQb^#u11Eg~lmc9~;J^&P`*Dvu(ItbO5eaC0(!a4KxVLzEqT0>aT znK`i$sI7^PSzyt_IK5J}pP#1IW%NG4F*{f@^?=#*+=_@e7FOA;dJV-s?xhl;(6xDf zY^D??v)9=oU@pfq1=|m2YE9pyV(n5)6FBj`t6C&|_dnJD`@b1cc{Px&$O?y$?Ic-Q zm9j%5Bzv!O2+2IiUWcsgy~nXP$KHD#+p*4Zob~noeE)#wFOS>vcHQpReOz~GN90N< z8;z5pU`fUPUxT{Q+H2m7+iX(gKXYta#?qZ>G$LEbmc~z}O-0T&-+q%r%+yI8j+FCe z({q5*d*6$eOUzVbuHto~Iv-3))Mzd}iu{{^Q#!u@^zjXl+KA zJlSm^w%4;_NkW3F-@lhIT$XFdG?z`CASC4MnwLT`WxMS@)dIt&D_(Zr4%16VO@id# z4FASvO7iSWwxFp@F@43yj9zC~i~-(P<;1H#m}%&?wc$?5NN8?oPN?8KDSu(ZX|MVh z23iH2yPEagd;iQH3ni!Rr`@!I+4;o}1C_B^W`S=@HP-mKm3rP=C;;?NwGVdQJL;+; z&#YEOW}x^{q`TSV;h*%MYuB6p^RFsDS}oreO$TQWEWFbgMycEzZ!{q^Iz0R1 zSZT!mueJeIZ2!omy>to-qpl$dPOu47m0y3|gaRjgm4BExcf7iL&+8KCBBYbmYW88R z2tEhxVXXEoDjYJuA9!1*M%_*0)fa|kj}LtcRPVIWl*coxOAebz{v_PqCb2NyoRp3J zA4I812ta#h>=aA(brQDLu$gex%PWhT?UM{)_(J--$xB#uN%XqsYu~JE>bnCo=kp!C zg(wIA2lsZjR@;xjHBhaBrva2uy0w2&a&j&T0kz+Hr(x0soVu|*u1scl4d6?eOS)<@ zyRUI?&u|%6^UbsJ1RdhhDJ{l~a%lv*3Bd=!&f%*_N=MwK%r97IJ%oH;sS9%&Xgvj) z>6T7sOG7?k++kHjR~T1QE$lFG7}Dy0kJ6`8D-&RSZ3 z*XA|@HJeYdg(i5tWXOLlX{`ILHaR;|o$TtE!_;_Hq3K!Y=kzCAOnfibU6*|4X%>0m zJouq|`Q4wW*hjJI9KNs1RCw~LxR|?8j|@z}d|Y=}Sy&^nm*AEWF0YTo2<$&pXx z!Vmphr`!-S=G&?E{lLu?H4F@d)=sh3+R8 zfpV@CJW_r0fUlhDSDXS)vOh&Lx*oqaZ83Cq>PZEMQ;$7g{&~CX_cikMQu8t8`#FVP zNQ~KFxZdtB_{5L(Yth49MvzxwA)fpYoKH$NZ~gNYSL9i4w6iK1>5M$rBq9b99+D*I zW9XH?sHCu-3z$wU>cSc-ukWs^)g`9s-NiK(cx4&luPY^A-qNa%7r)oX8A&hNilY{z ztl^+jC#j4Q`p^{wr_+eMXG zDIS^}9D6MjsXtZ!G@?akHzNQ=>*%h4o-GkJXyW#LM7bt*&>6> z=^%->%;d{&ZPE)aU)n*?+kD3~i|svS)XV6&eFov!;2Y%05V(N5c+;z>DkVwMV;A&)dPipFl1U4SXzSeOE@cR(0WLuYmhk2??*UOZ|#ezF@ZUQK9PH_05(u z5R>`&i#rtqx0Sg#lyA2|{&!Fg3aRGR^NTE~@x{q4 zqE7h0%p$EqSX^d9=N`DVt3ITb^3ke(Ul(-P5GZ9{?oTL5OsjNV z;9O9W=cmYSTwrOMd~Rx34c4&97)y_*Mqvy(!Sq$$o6O7~S*>05Pi z+avn!9@>jfTw|He+c-Mx>SfXw@clR@{Ogoc<*O}eAcVs_7 zg?agYTmDvWgws{Jt74R4e90B3;K@Lx$LE$$MUBU~vhd8`U#XT^V*ggri)s#jr=^g- zh=B7RnhjQwJo}p>pz0c)9$$+ONhZ+ke~bC)HA@JgakBL$PfMly-XQ$d=Ucb*>Ld6+ z#u0&n8h$^yQKLKZj+42cW-IG$RF^YO+g`ITr1#)nJaP2~G1|v|PQ17W`7|hOeyv|> z6YAnBe998|$*MLflf>?r?A}bgIP;xS@cT!L=UCj~Ui%bB=}qxtLN&XDxqr!<@2}yr z5@g?`{9+h(3ET>Y&l=A$5UhNh-MbpB8D-#)Y(~BCV*OLPQ*`~8eO1H{l7mkq{+pTz zY|!P5g2q52R4DVpcY!VujADvtoT$bw6zJ?c9M3W$wqsW?Gbcs8o5}a&2<0T~Qnxw$ z;ESuoUx2Gtm~z2Igm8hWLG&Ype5it@X+;}b_Z27m!S<6n%J_32Q^u`Px}-*2)#x-* z<|@Y@ZXIB}k5n4`*;MMv@eQkzw6`@D{F8ji&gzL2!VV&YQ$U` z#=c}*8;&*bhMy-jb-TfV4SV5VGEbAA8!644ZnQ zD}klDxNNp1swe}v9vCCGl19gLXyLjhJx}1x`4jNF8kx)}(L${_LQ5r_BoC3+HJ#v7 zRQt+FJ-1jt>FT8dX#svzk^_DerfYG+b9%kJ{r$}9{|UOA~9ZewJY@R5~(+X#UdJ6F<8-Sa@?CNKbXiKZK6EUZen2 z{1!BZVzxr3;=54RX-?{$?n3$NO*PYAb|i4G!K>{;`k#$W>;>eZW_F6?FT9 z_Z5LkXTUyCkh&~**}odQD;pKZbH%xdiS(+muKi7I{j5l|DVZRuT;1@3 z4_Yh-v8f^LziWerti6XNmaT4kKk-Rmluy;IKd7KPZpuH7ys$b~_XUQp2gyni0$e1z zbU>%Ti?c~JB%DcytM|>Va1%H{m^h+@9K3g$7CVaQvNHe<>+IC3x`(ggAzoA z$8ap`M|D151uy6ZfBRUePhNL?iP?*&D-py~b}Z<{BPI^={fB`fnl@w~8^?_nxU48# zd78d88&>4gTr@uZY)sY+UT6HaOTE3#b2c{Z@38aU9#@isdu9IUC^JfDXRtDJBtXNb zSf-wmroW9OZPlUs(7XWO1?>}$|G0ygB{OFDo}wj+U1WI7ni%%T{1C%k0*~W5$Z)dN^$1m?QCpAlqlV=ZWtF z)fHNOuO&|W5ymj<+dyq$HZPncNs@;N}S_flnWmeWU9ErP1y&p}N zlT0v>TJbh}>rBQB`s~s^9#n@(f&4l0IyLA6mdoT`2EJGwBYD!^4@}ib*vRTi@Gk_J zzBo7LCaAojg$9ACDWnVz45S?jbnp{hq_*w6WxfE+72p0sat1W}|D#FKo-;HN%BnrCDYSX-b+mph2cb^3;u$+k zwO=s3J96BmKb*Ry7U|JV9bOL1|JmZz>-k8t&;#}JY=zd9#yulbWx8k9h%3ogd{4fd zJz5RpAQyNHbQO62pW4ID=3gSiC!iRzULC%!(9C>6`4=WTnG)iPA6{R&5dV8-;oPv! zvT5QcupUSG!Y{mNML6_F|1M_uzZCDaoxG_8?)yu*o_AD+KjoxS4`_fjJ_eRcs}tVn$+ z8AoDp+#zhJ#XiB^`-xcDhfv}GU%Os=08PuM1N&ekEqb2uzI|pyS|A90p?+_Ib@!bc z(#K0WUCfNi#f{BVnCjBP^S0G{HYZll48GB+mQViVVe#iaP%J&KL|19=X{S^z{!g~s zWTUrUZ%H#Zyu~-e3;U(UbvVFKf_C;M>F<4dKEVQR4rEYq!9?RfXaTj$6YaE4Y ziQ1zmF**^Bi&3A{wx@i=6LGbs(6ATLWp(niByQ*bk}#;? zOqtKch*J$Yql&Yx&xiLbcwNiXyij8!E2!$zr|#s!bc-*;$YjD9LWsa`ZT`(YWjtBd^s@Tslur(EGpf z!Dv(5>Bs*H4#B^pomtlNMtp=3o!h2_;JX%d?&(rU? z`cP(=@(kj;*XX+Dk3&KtCcDq?>q+Umr9c--0vG@E>>e|-X}Wnw*3HyHXk-HFLJ#UX z_9~%?NY`CMo1Q1A^t7@KQqI?jb0#exKWB!n+CKXoODE4^Q+<2) zt$d1(Xx~#)FQ?P9uP^_*JA-yX^)6*qG@SPV*e|&TqBtB89_*xlGa6NdCSY$G0Zlb> z^~bxA0N>3t%J`43for~bnaJx#YGo#^Olzru5> z4`Adh$G*G0n(%N;lS5~6Yr`t+iJIH?zwM8iS~4e%O9)Kkm_>oYBjW;u<;iu(Jbp2A z`wbmwEYAFG=A0J>7Kh|yOVjQLip`5?ESZ-<)C zG|*Nl;|^;rGKGmk5_i1X%1T-nPDS)`n7Gi9whjxVTHC3RD%*b^Tn9aUW*<7{4hKoL zU$*=+^sYsT_(ykpzQM6hqSBtPAY zL36pQagQ^0s7jxZCtsSf2D9(Ch^ViHyfKZjqa=tV06L5n*c;CRw-ac1WgA9&(Dyu} zoWi7|laEBhiw<%d8q*!Z!}n6oufll(`p9)Xt_y;1>=6Qm-MwimYN|5?eTB??mNbQr zw=hH7M)ZwZ?>sT1dHb}(SUW%3hlcpBI}>{k!zJ%Jh*8mmUX4xYQqhykXAW15+r+pS z6+Pt8yHy|wH6OAV1!2gOIAToL z-<1CGh?Y)Wd4#ugV1bykvQ!j{y=1tjTVk;Xy&p8{6g8zG?RDomn+L0n(2hn^#MrgG zK>It)XThPt+R+Ggh<>F~LJE{)XutknV0sYr{1LU>Bim?z&PJ{*kSxFQ{b#P53enIm zIalOto_A)#(}&i4^1jnWism{{+*CDW8DGh9^WdOwdve;Q)#Q*H``if1u8*Qx z_*k{4hXa8TJO2XN+9aG_Ptp`ha89Vx9l%lZ|ss>_-3nADpXb*?gGK0vZlAq&@}N>i=F-bY;9d1H+-_T>5=X2p+|4gtK-hqw_;Q{uFsd^cNYA$ z@L|#t3Trw`Wz$w4f|Z!W7z1B7#q#}!tVKN?T+u*nU8@#Jzg&74v-uf=If@2>-JqCbivloSFe27S^!!W+6CHP3UlE*A9p+xCVHNkOtCHx zU~@#(h(~(om-S0wTyhh>dj1cz_jh8Ok}2BpQ%8QSYGcF2Q~+~Rk40ni+>T3Y1%RpOOrM~^H9Z=|Ku)8e{=$I%?Y55AG_>fmqxeszVair#l} z5a~9kmrG`Rc@;6osV|~_z1nm@OHs2a@wmXpP1As4>uF~QOI({ z4(pYMdgQyJvs|BhRR+&UclG6ctJx249IJ(dqF`~=^Hadug5aFH4=V&IPa%$lQEoJx zr@#-S^V7R-ng2O?v71(TTO?GQ;V8Ryb+wts2M-bFzYw6X_c3)`_-;H z#>xUYVCaj>uruJ&xA3ybW;ysErt}2y*N;57UQV)M=|846o|*5CGd^B{8)Mgsy;T0b zkUBfdQMy^?6m3CeucH`;Ej}T*fWgeAc(tGAMfF8ow-9z>EZw~o;$^a2WY(rF;LApu|qk zOmSqeL+R#qTu;SG;=$I;*-=n{g)zySQgP-Q6_=@gc*<>I_rNE6ey=EHx6>q>x-Qin zX`eS9L?1zC$mh3L7wy9(#Mk636&kKxA%KB}(T4Be{Uox!b~DZ?djRvKr0UNx_g&bk zW2aP{9tn&&JAr<6mEN*sKNhBPFPk~vvc0Zu5_dNnEobT*S<4fd!7?&1ti#V8OT~I= z$7~*~^&Nzj6NG9y?$S*vEv%aL#@f1j>y4M-21ZQS>k*ET6JRmQjQ2>DL6|3xHYnm) ziqg%N4pZ$hY{}YhUmkWB+7T@9PcZlS9_GF2f8#|0EnMv*McY)X2^^Lywn{UcXOL?*U9L zDo^GC9ib=>8z}quai-}A7zJw=uCrQY(bsQLtm7d3wX4FW*q}c~DmO!JzPkIHeJhBe z4~yp-U2(`<-G`pppj}#xX6v1!E{!(Ljf{Hr4^|I7+v_iXq!n7%=*r`1VJ*>VlF56a zzOwQ!c*s(WCTiSs;D!SVEcCOq}A@hI`>e-zyKiq6Ga?sDMQ@6 z6RRxi?A-w|5ls9cKjN(Q1uJ3sc9@=RbK5fRN0#?{$nV|lPgV+lSDs&UaRdtLkqb`; zN(uj-%X9PuWiFV(W)EOiZN!e>QuDmF_$r zxA8b;oXF}(US0TUbQq`RdE6OXaqASX7>Ro8MTdv}j`=MtHe&4z(%fH{@A8gAZxXYx+tBOl96udn&cjkl1pfmW7C^?h1*MQLLa>A;*9 zi=t-uFG=M2Wk4PAsjEe2Qzq1@|P*IbM}I;ud|L5V%N9N0WXL zZG~n*&IX78vCS;3WzTDU=g3R|X{n5LXBtT-QDk-2swYV)$?RW`q>!_V2lLW|n^FCf zd4TJ&*A(xP0~HwpPccWDo1L9*L&2;M)t& zPb+!pgosOdV`EBQ1ss&Uw=OfTM;bZ&-M?gc+Z@A|Cip`Id%$U0{+@r@}>Mad7q(S zpI^{!;fawHgf;9cX3(?mbKiR_pB%RNoDcy%nLlrqJopFJds^dZdYz+w zp!8xsimX|`g~H!f(`@fM&uZu#W22>1Cv!V(3Z4I)#t+|>U;iOB0HjIu`CV4odk{4j zKeGq7OKgns(ZScu+jy=*@B&S>P=d9J(513KQ|PRc@9S>o;>v)Om|m}CIpA4NmfdejQ*IOHfO_64Sf3t-=w{ylbAcXDY8zU!+vtv7lfon$IUsZT0d= z;qAn)pCck27_6L!>puO|4SJ8=AviI76n}>Ko?+w$kf#z_O%1sFEv&V=5*7FSuWzR^fvYn$2C#F$M2=OIf_QyTKs!GU?slb_O?_!@kOdh9Bm% zI&<5yO%y*hpQ!GHYBrg^xnNa0ngr~#{jZ*CHOeoY3lub5(x&1pGi`f3~ zHcqxjs$_9^#FLb~`eetH{~Z5czJCZf+cIlTZw}@5Y8Ec%O_ zVK;r$Mie4u5In9YlJ*3N;$gVXR7O=QZw?$Qc-?QC5!JH)7DHM63PJN)^vSs&_frz6 zxW4>Bt^6DG^Or`<*MsvgGCoD-^8KtR<1eW9!7|$5|D5uxyzba?=Zu%Xp@>oKZ**d- zV2IiGIEI7;M3w=?0{An+y!P@UmcmX+JFV`v4~K5HnqCzoW>>390TEd-3bfg?n^3w$OQ+jAj1QnU@TR8(D}z9(3$p=P61YK@ru@)2JKl-<(NUKCDi9 zlT+(&U_4O!k(6mSp#p3b`bub?&t^n0)!;yt^E_RY&&Du37_=eUIwsTfpu}4ZD729z zPdM`|2ETVK9)bNUf>`KW(cJ>!Ha%Ah$%)eTs%BoPqZ%=y)uV8;|7dF{WsEJ|sgY;N z@Q7!ME21g~n(QVS^33tOXIw9*wR)BQT1T4+o|3%-PKJ)-YlK6M|EOL>7fXjUL4R_L56c?Gsmcwmy*c2ApbD_fU{~B_vCaiy zZ?f6i4Ath@x_t^nBFYFGE9}I(?EnX0(n9mfSrTF8;5ZXh*v1ST>^NCBBhflb9mYz9 zu1Kwfk%hr^PPH<)T832101_8nw9&Of9(*r8Sxie)vi_cO-c@1h$;}Fehjy*s91;kh z;&C`W^bTAHu0}8Gn9C{*&Jsq7E*E(y^Q6KALq2s07s&N~nmMHUc7CdGl0#Dn%I)Kl z6ERM5yOA>jY5gzq1FIKmsWN?)59zlIt%vyUd{C%Wg8#RglH@pWg95hpf&jcJwKDrU zG=#!+2{rPU3MQq+%5Tp@(yq=-m=}4OOE9!rx!Nb)n~iS!Nq3cpTiHz{e->?&LFc-) z(DwX;@-W=}YT}f|sf$E!$GE$l^p35wrzZhD|AsMtp6fp>OKqX!>D{;Zy-9VRzn4!s znBQWu>7Wa$V0uv8NJKJbNWia#V}pe!=jwZ&I-bq%>_Qa-y!6Fw!Z^5?FE9tQuZ zMK&bZaIDYNr?`y=rcvN)$`TDy==Lw?VxHf*=lF;QVE9IQBk4u47?_I3T@ z*!?hnZou^)HPZV{o(L;#+eg!kz6nh&S6O_}zndWp463AMDPtqk{u#bx8!kPb=p}Yq z(-y($r?L)Jb6xf9c&+~o)RvfX9{Mq;lal= z*M8|(=PCmR5r86Z@rcEd>R9o|OlRoahpHu;G}lu2t(-*|Njf${wdM$TDTEiwI)nd3 z;pzx^tEF{ivxlp4)d%?pqxUXc%LPLB1~4N5Th`9U%1z5KE0Wr_JS}*K@;Zs8-ze2y zqoCr*)5fMkj;Is{OzSlOgXw}0p8=1S3cmUMkCaYr6P|_ zfvxgpd&lavJCZrRQPT9Xf1f;ieO(uPQj(p*#2($)bvgvuT0>|Ze#iXh^f?lj(scI4 zX(9#x^!&>mJtenZZtNsk0POLj3IUR~)<7wcR9VBdXzBXxl-( zM^(P>wGo2OFpy-@Nv`JGOtHHd^Mnl9W!r0OBBq-2syW}XL?p*$`NSUoN89vPsimz_ zJ%#6>q|GMv2g}=bZz8^`9E3OFcn30vrx#o|43hV@DmfqbGQDYb7yD_jqlpN;DuUhf znlFj=TqVR>1MqEqW`yrE1y?>e7}?b$$;TKDFkBXN%uDQs5n?}{69%PsNy;CC_c<=7FJfRrKJ2ReY+!yn2gI`MRvgSXSY>uH7rGFI<_z`Szaw1JgG)> zPntcZ^Db>QL2*~0S;sFNpFbMhm0n1_=<+^#W@MX%4&eqSWq$XkXy#Q7k#{feuXvy& zp5*`C955^{8k`n%OZH80)UbQTYNF3Jpzs-gxe{%;bG^(0uAw0O>%IMp+f+Y&MO%%k zG#%*Z*BZ+%Hxu4qY<6%_3br)K2V1@X4bFgr^K6E3$lYW!c*N|B1~cLwn1S4kpncFg zca4@it<=;>N_Z!E$xA6iQ{w5E{1D#bxA$^abi7udkMGN2X4fG;U1LmTv@_MT zwzg+WOW;84!U5u5wy%-59fluaWL}ITrczxaNTT{#qSH$ zq1s>XSz?`Ri9DmLJZK|}Q1_wWq6z=C5i-@lbYu1*f1e%^@l8Bv+pK zA5@bCz&xV+l)nGk=W@TrGMqE2@VI@GNVBH9yv~B>@Y@FXFIE@mz}`@;5ZPv0(hv4o zCIe>uppMk6faxqSd8Mm*G>&o=ev++N5@F|NaxAlLB zp|AHRDL6tuzZ%G=dVw$0@m4my_Do9$efpO^l{sB#eAQW4Q3>Y@aAg>a?3st%Ue{+A zTbsI_PD>9|8adDz#V}O5Es`X+76toUq!mVB-&S0tseH;N>`3nRyhoN8r`Dg$m8~{2 zzp{GVr-1#~F71Ff#J+L5_C>PNd(1Lv+S$mtG>NS@#XAOer@`M==&7yosM}01rkg99 zE-c*Y*c9mhgHJb+mB!Z)+LidC#!*in%`Q!}9j%fGyJt_fZ~5PXNUcxfEgtLpqOiUW zu6s01-z^mMcXeSGf+PKJfJh14*d)T!?Cfd?_8FVU!a>w0fw{GsYIESIR`EK7OTbkp zaeLDf04`ezUfr(mbfl34?IAxPf7$fX{;dz8pWP0bOqBxYuACs(JCLfy*+K!4<@skX zJHt)ohg4y}dIjp`bF!_!{i93mj~4LL)+g>ZdAehVJr|4eQ4rz_aRaBexpIrkzi&Yb z&cwH{J+saSHShH)eM|JwR-PS;vTqwML#6Um7X4X1w30Y6?G{Yz$u*JaElOnbUN((Q z#@iQtz3yw%HcPu-$%r!Hw}k@U)teU64beWFw2w8uV6%dE&KxXJd0#00fQE4I1HYMd z2{Aldi}| z@U1HNjZ4S@2dFlQ*h(;TKZ4$CUx!Gi8hh^h1UR%{l`z+T#2RD6{kuY;trr}G98bas z)W#693HVGUB@LM^s3bSL2qg@2coT3KVoB1LEB3Wddg@H^3y#MyO#AG3`nYX($VM@rn8ji^V6IL85*-quCEZcUfZI~NLqyM9&7U~Y_Y6A=FO53gtIVm^SkoTJmW;!Quq{{ThC}hX#-O zqC5Mi&tBpO-80_>KK>^?Q`w0(Mtkh#n7_|FM{N0*anU`bO1IF%m)beLQou$^wx;JU zo7Fw{aEyDaFO|3wP-{)xDhAKd@^*6jL?nyUZCULS(;6{5 zbl;cHK}6Y9bnl+1H%7SMyvqM*yz%%lGr*uj@TrT*BXd!mno$D|B|i1!i_;=`LGz~G zAc5y&vF$cg%_jw@z4!JiWs%hT%**a8I!9158LaKFCsjmHiY%7pVNw%v_0C54B z?YRRUV?i~xd_*MBaRbauJKIdKpSSEcAHcI}2N9j^ZBYXmXiz|y_b9j7Q&>ONHHJ>^ zfY3?0;PV1%)I{aYc!JwzI24%Qet2#z@A8}1?Te4(%Iq^-)@(8QqzRHIU0WWVq42!H zzZzE3$|%wo0xqABm2r3=rW{fFs~#%j$yLW*A}4lVQ>W}=XZD;TSNJpdwEgzx60J$u zMLBr9GHk7y$MNH%mRV6V>u%rFtV)Zq&G`e5a>lHUPvafD3+LUt2Lk^c|D~F?qIOl) z4`Wghu;@wqjE|;Ixo-ZdS)R;BQ|Vl*V3cDi$hy{Ken{A6Ga#ret#rEKEg44)-;81H zq;HP0)so;YtzrIG{C{zV^|Xm&hD0fCyz%-!qLR)@Cg=#eayjFuczJq#@&6f>YiLK& z8t*C=Ok67`)~{S?mHVD;nSDY=;9S@^3|C&6cKW$`Sz-mm(q_xQe3X?`^j7-0$lrQ6 z^Q_Ix?abui2fpCwRpxe~mrdEb2`hLjse#~%#d zWh*;17dUKWyc!C{ZPR$!x&eF5i|$zD{I|rgE6r^IrMg;I8*<4JnTVbzC;d2TozvO~ z=uU|BkgK{Cedo>F;UZHGWC9uAempL|+iGzB*Kcbq%C zzs9VeU=c}e03X<+UI%uQGLRd3X?;_96=pJ{A*8ly4~{aB=0u#j-VG{#nFEXwj;ALu zVV!>{_`WMExS)xoqnze@anPplaU+SQfulbHKF7IjpY>saru`T|P15)vt&w7mYW6J2 z0vgL>2h?DIu9vjDHkR!Fq+RI|22px3THP(@rvimibpBpi=Z`5Ddx91fhwXG`@Y&28 zgY6Fq7JILE&)F7LEn)J+_r|knw+895en<7cjox~!OG*Q?<_kmM zVJ8vbNlDNy0+d0Rtn`E#1MuZMFjL_meD8B9N0-&*OBK{zI@eXS-3nbVrs_N+Acam# z9C`U^V4E`8T#I~DyT+-!7TIU7@CI}5h)y_Ja9?$n<;5{6 z=4Z)mAj*ZbntJEu2H`GoNkb!QszWA!Xy~EeW^D6}>rKL+mU?u&(_3AG-zc_iT7y;@NEQxcN<&(+^3eyrvNqwp|{ zK6r$P{k)2zdxrntzZqbCqi6l{T=N8N&l0Y0R-plKj{b?x-Zu8fN?DtqkoJZ)N&^s0`T<=|y{#bh-M@%a*`upuxQAyi-Ovg=-otRkq z@vw$7BF>BHjBI2I_+K~#JiKe8Nt%)yu$Vj3n26eaFe3IA1lM)jI$RY5+|^%tCh`u53dCPbEuW$+na*?$|l`zl{Exr3LUAMBay&sXZ$f7Y|0xQ;oQP z+)YW&*!O=SD7uz|MFQ-f{0dN4cFY=+Vzg@cS(OTe<-q-M^g`h-iI>Ya zs#cE9koD!}9wgk%MP56T&lRl3Y3*=mBb4dnU&u=@12{vTe}MOG#K5k%s%N@BYA+#j zzLqzXoUtP%H$L3Nw-3k%M*rG#L{#B1{W_wIfbbdMUQh3Uu)JjnNVV@}sFk16yhw33 z_|g%bCpOqgoIzA2xtfW=#k%~z$DU$X3kTC^IpLS-n*#}Ca`Ty~cUvzp7+QCqn9ZWe z!TU^@JRQqBdVgzqT&B~Pa$nC{_#T}r#dz6WQb3POugg1i)Q?zd#!Y)1Nr$Q^TxYzl z+=*nR4^qF~!4IM_j})*CJDthRqVpf>$Y9%O=`&;&j*fQEQNyav$}AaP3N3Nwv`2zji$F!tJOd( z>cN?aQns0L4t4<0p5jMrObmG`A-1=hx_nd!bsBBGb3*oYU*TiZs;1MQ%} zGNENRP4B^EDiQg#xiMj@I*^pf<>2?@p&zP!9+!@82Cmaxo6E~^0i+hd{}3|^`@i6> z@s=}cD4SeC2gXX{UvdhfB8-$@HNo*E5YUCrio8FnAahBcClK?3Fep3E(oVeJedMH5TNTeDWncjepK}xBcexB5{{>=ZfdgKm89>he5H?dy ztxlJu5FHQ*m7{pUlRhz{@j*2)n;urZ{=HGM=su)(_vi(Omhfg$ajPkPqh?g)vjm47 z6%%Lf(XRrL=QP+s0EMWJtg(32%oBvccHZY@z9A)3;~Q5S788*-Gh~9Y~(*A3MW(iY%dvnu}%IlH%YWz(U(0cQdQLW7mF*Xg-vNF3(b#P&( z7ZJZBb^l@xQ>!VkFZyk7ruI>o%Rxht-M5#cI&H>!{tSgY0WQT&7V^Ao8phk=!j{Ip zFUs%qo?A!MacDDICyJ)!xMbM@|8q>TnR+q0HwNDSCVKV|Tr_6XKPH$bb+u zEx~#h?@{lMJota@o#{Iph!)1_t*1Ko*3!kk+}6}iN~MX;sg(R`Pr zj5(sCpYJ2|eqlbM+(f*G0!#;+>Ya17YR3SjlP`tZvA3Go zPc&0n(K>TL(!u~_MYW!g=%KLwWL^YEeRN}&J7abyn%VW=p6qV2kdun2j!*^PRc%MV7Be(OJMP#Pb7-GoqOsO7rl7+}RMUDY7{*15xB zT+Pfb>x^<$+rWS?yDq8FY!RS@H?Z#Qyk(bEV~7X*;Ar;yER^c2QCr=i=mNab$T-!< zFT2@0eio?*Uk2o~f5_iP?`UvD5{iZ9-JY{Q{IcSgs#$&CGF`N4R~^(R((6NQnK@F# zD?NMX`+Q5DYczZB%gkhIGdkAZnyYI;Of)6qF=dwfz>bu1-1^lB+Y!I|+Uw0VO3t%8 zX`l3dayQvE&TOH5X#+G{#Un)ae90f*KRZL<{j$?ZQSTukRDk z;w^17N~oW|9{PtUNAg1K2lcXHkMLSQJ0{Pkca`yp9n8n}oy@q#J-;KekNKsT=7e?m zUwpcnK1KY{*Xj_8pB!D83Ouo*uF=|g(J}pXN38Bx>gmoo4l7m^ucwJk>lSOy9ss_1 z3r^YMu%(~dHroWCYCDLw?sBkA2S67a$R7YolQ!*C;i(lmFO07M$-cTG;wuzn!;@;m6L4*JzgRng@TY)&ushDm?L!zC{H9`BI35x9tHAj;_6^{Os8nVzPZxXG^9hE#Xb!p_`WnqJ*er5v z*xy{VNjCNSG1ss=@Yq7>t7kg>WVV56h|!Zhr!Y>Z{hS@HSHc4=d5Ggb6py^lNQobd zWyga7mS_z3U>N@YNG{DY5U>n%j~L zq*@>yd3l>@;|@M=b2tLeRZfeN?9P8_?0j0-`sPAi;8HF00_#4Nq06*V1N5;_H$w*o z$svTPby2>0>tX^Cl*p6ZreO3AgOi=7J<`Q>>KkRWC?_BwH)4`O=Kk}&U<+}mx%7149u?~F*_L1~o|G0{m1U*ftT4!P`T zR>V2oNhrN5u?2#wf3~cS()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports);(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function S(){}var C={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function ne(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return ne(e.type,t,e.props)}function ie(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ae(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var oe=/\/+/g;function se(e,t){return typeof e==`object`&&e&&e.key!=null?ae(``+e.key):t.toString(36)}function ce(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(S,S):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function le(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,le(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+se(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(oe,`$&/`)+`/`),le(o,r,i,``,function(e){return e})):o!=null&&(ie(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(oe,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{n.exports=t()})),r=e((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,ie());else{var t=n(l);t!==null&&se(x,t.startTime-e)}}var ee=!1,S=-1,C=5,te=-1;function ne(){return g?!0:!(e.unstable_now()-tet&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&se(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?ie():ee=!1}}}var ie;if(typeof y==`function`)ie=function(){y(re)};else if(typeof MessageChannel<`u`){var ae=new MessageChannel,oe=ae.port2;ae.port1.onmessage=re,ie=function(){oe.postMessage(null)}}else ie=function(){_(re,0)};function se(t,n){S=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(S),S=-1):h=!0,se(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,ie()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),i=e(((e,t)=>{t.exports=r()})),a=e((e=>{var t=n();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=e((e=>{var t=i(),r=n(),a=o();function s(e){var t=`https://react.dev/errors/`+e;if(1me||(e.current=pe[me],pe[me]=null,me--)}function D(e,t){me++,pe[me]=e.current,e.current=t}var ge=he(null),_e=he(null),ve=he(null),ye=he(null);function be(e,t){switch(D(ve,t),D(_e,e),D(ge,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}E(ge),D(ge,e)}function xe(){E(ge),E(_e),E(ve)}function Se(e){e.memoizedState!==null&&D(ye,e);var t=ge.current,n=Hd(t,e.type);t!==n&&(D(_e,e),D(ge,n))}function Ce(e){_e.current===e&&(E(ge),E(_e)),ye.current===e&&(E(ye),Qf._currentValue=fe)}var we,Te;function Ee(e){if(we===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);we=t&&t[1]||``,Te=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{De=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Ee(n):``}function ke(e,t){switch(e.tag){case 26:case 27:case 5:return Ee(e.type);case 16:return Ee(`Lazy`);case 13:return e.child!==t&&t!==null?Ee(`Suspense Fallback`):Ee(`Suspense`);case 19:return Ee(`SuspenseList`);case 0:case 15:return Oe(e.type,!1);case 11:return Oe(e.type.render,!1);case 1:return Oe(e.type,!0);case 31:return Ee(`Activity`);default:return``}}function Ae(e){try{var t=``,n=null;do t+=ke(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var je=Object.prototype.hasOwnProperty,Me=t.unstable_scheduleCallback,Ne=t.unstable_cancelCallback,Pe=t.unstable_shouldYield,Fe=t.unstable_requestPaint,Ie=t.unstable_now,Le=t.unstable_getCurrentPriorityLevel,Re=t.unstable_ImmediatePriority,ze=t.unstable_UserBlockingPriority,Be=t.unstable_NormalPriority,Ve=t.unstable_LowPriority,He=t.unstable_IdlePriority,Ue=t.log,We=t.unstable_setDisableYieldValue,Ge=null,Ke=null;function qe(e){if(typeof Ue==`function`&&We(e),Ke&&typeof Ke.setStrictMode==`function`)try{Ke.setStrictMode(Ge,e)}catch{}}var Je=Math.clz32?Math.clz32:Ze,Ye=Math.log,Xe=Math.LN2;function Ze(e){return e>>>=0,e===0?32:31-(Ye(e)/Xe|0)|0}var Qe=256,$e=262144,et=4194304;function tt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function nt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=tt(n))):i=tt(o):i=tt(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=tt(n))):i=tt(o)):i=tt(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function rt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function it(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function at(){var e=et;return et<<=1,!(et&62914560)&&(et=4194304),e}function ot(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function st(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function ct(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),bn=!1;if(yn)try{var xn={};Object.defineProperty(xn,"passive",{get:function(){bn=!0}}),window.addEventListener(`test`,xn,xn),window.removeEventListener(`test`,xn,xn)}catch{bn=!1}var Sn=null,Cn=null,wn=null;function Tn(){if(wn)return wn;var e,t=Cn,n=t.length,r,i=`value`in Sn?Sn.value:Sn.textContent,a=i.length;for(e=0;e=tr),ir=` `,ar=!1;function or(e,t){switch(e){case`keyup`:return $n.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function sr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var cr=!1;function lr(e,t){switch(e){case`compositionend`:return sr(t);case`keypress`:return t.which===32?(ar=!0,ir):null;case`textInput`:return e=t.data,e===ir&&ar?null:e;default:return null}}function ur(e,t){if(cr)return e===`compositionend`||!er&&or(e,t)?(e=Tn(),wn=Cn=Sn=null,cr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Mr(n)}}function Pr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Pr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Fr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Kt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Kt(e.document)}return t}function Ir(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Lr=yn&&`documentMode`in document&&11>=document.documentMode,Rr=null,zr=null,Br=null,Vr=!1;function Hr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Vr||Rr==null||Rr!==Kt(r)||(r=Rr,`selectionStart`in r&&Ir(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Br&&jr(Br,r)||(Br=r,r=Ed(zr,`onSelect`),0>=o,i-=o,Pi=1<<32-Je(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),o=a(_,o,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),M&&Ii(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),o=a(y,o,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),M&&Ii(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return M&&Ii(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),M&&Ii(i,g),u}function b(e,r,a,c){if(typeof a==`object`&&a&&a.type===y&&a.key===null&&(a=a.props.children),typeof a==`object`&&a){switch(a.$$typeof){case _:a:{for(var l=a.key;r!==null;){if(r.key===l){if(l=a.type,l===y){if(r.tag===7){n(e,r.sibling),c=i(r,a.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===ie&&Pa(l)===r.type){n(e,r.sibling),c=i(r,a.props),Va(c,a),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}a.type===y?(c=xi(a.props.children,e.mode,c,a.key),c.return=e,e=c):(c=bi(a.type,a.key,a.props,null,e.mode,c),Va(c,a),c.return=e,e=c)}return o(e);case v:a:{for(l=a.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),c=i(r,a.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=wi(a,e.mode,c),c.return=e,e=c}return o(e);case ie:return a=Pa(a),b(e,r,a,c)}if(de(a))return h(e,r,a,c);if(ce(a)){if(l=ce(a),typeof l!=`function`)throw Error(s(150));return a=l.call(a),g(e,r,a,c)}if(typeof a.then==`function`)return b(e,r,Ba(a),c);if(a.$$typeof===S)return b(e,r,la(e,a),c);Ha(e,a)}return typeof a==`string`&&a!==``||typeof a==`number`||typeof a==`bigint`?(a=``+a,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,a),c.return=e,e=c):(n(e,r),c=Si(a,e.mode,c),c.return=e,e=c),o(e)):n(e,r)}return function(e,t,n,r){try{za=0;var i=b(e,t,n,r);return Ra=null,i}catch(t){if(t===Oa||t===Aa)throw t;var a=gi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Wa=Ua(!0),Ga=Ua(!1),Ka=!1;function qa(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ja(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ya(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Xa(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=pi(e),fi(e,null,n),t}return li(e,r,t,n),pi(e)}function Za(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ut(e,n)}}function Qa(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var $a=!1;function eo(){if($a){var e=ya;if(e!==null)throw e}}function to(e,t,n,r){$a=!1;var i=e.updateQueue;Ka=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(q&f)===f:(r&f)===f){f!==0&&f===va&&($a=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ka=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Kl|=o,e.lanes=o,e.memoizedState=d}}function no(e,t){if(typeof e!=`function`)throw Error(s(191,e));e.call(t)}function ro(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=w.T,s={};w.T=s,Rs(e,!1,t,n);try{var c=i(),l=w.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ls(e,t,Sa(c,r),pu(e)):Ls(e,t,r,pu(e))}catch(n){Ls(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{T.p=a,o!==null&&s.types!==null&&(o.types=s.types),w.T=o}}function Ds(){}function Os(e,t,n,r){if(e.tag!==5)throw Error(s(476));var i=ks(e).queue;Es(e,i,t,fe,n===null?Ds:function(){return As(e),n(r)})}function ks(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:fe,baseState:fe,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:zo,lastRenderedState:fe},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:zo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function As(e){var t=ks(e);t.next===null&&(t=e.alternate.memoizedState),Ls(e,t.next.queue,{},pu())}function js(){return ca(Qf)}function Ms(){return z().memoizedState}function Ns(){return z().memoizedState}function Ps(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ya(n);var r=Xa(t,e,n);r!==null&&(hu(r,t,n),Za(r,t,n)),t={cache:ma()},e.payload=t;return}t=t.return}}function Fs(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},zs(e)?Bs(t,n):(n=ui(e,t,n,r),n!==null&&(hu(n,e,r),Vs(n,t,r)))}function Is(e,t,n){Ls(e,t,n,pu())}function Ls(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(zs(e))Bs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Ar(s,o))return li(e,t,i,0),G===null&&ci(),!1}catch{}if(n=ui(e,t,i,r),n!==null)return hu(n,e,r),Vs(n,t,r),!0}return!1}function Rs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},zs(e)){if(t)throw Error(s(479))}else t=ui(e,n,r,2),t!==null&&hu(t,e,2)}function zs(e){var t=e.alternate;return e===F||t!==null&&t===F}function Bs(e,t){bo=yo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Vs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ut(e,n)}}var Hs={readContext:ca,use:Lo,useCallback:R,useContext:R,useEffect:R,useImperativeHandle:R,useLayoutEffect:R,useInsertionEffect:R,useMemo:R,useReducer:R,useRef:R,useState:R,useDebugValue:R,useDeferredValue:R,useTransition:R,useSyncExternalStore:R,useId:R,useHostTransitionStatus:R,useFormState:R,useActionState:R,useOptimistic:R,useMemoCache:R,useCacheRefresh:R};Hs.useEffectEvent=R;var Us={readContext:ca,use:Lo,useCallback:function(e,t){return Po().memoizedState=[e,t===void 0?null:t],e},useContext:ca,useEffect:ps,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),ds(4194308,4,ys.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ds(4194308,4,e,t)},useInsertionEffect:function(e,t){ds(4,2,e,t)},useMemo:function(e,t){var n=Po();t=t===void 0?null:t;var r=e();if(xo){qe(!0);try{e()}finally{qe(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Po();if(n!==void 0){var i=n(t);if(xo){qe(!0);try{n(t)}finally{qe(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Fs.bind(null,F,e),[r.memoizedState,e]},useRef:function(e){var t=Po();return e={current:e},t.memoizedState=e},useState:function(e){e=Yo(e);var t=e.queue,n=Is.bind(null,F,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:xs,useDeferredValue:function(e,t){return ws(Po(),e,t)},useTransition:function(){var e=Yo(!1);return e=Es.bind(null,F,e.queue,!0,!1),Po().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=F,i=Po();if(M){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),G===null)throw Error(s(349));q&127||Wo(r,t,n)}i.memoizedState=n;var a={value:n,getSnapshot:t};return i.queue=a,ps(Ko.bind(null,r,a,e),[e]),r.flags|=2048,ls(9,{destroy:void 0},Go.bind(null,r,a,n,t),null),n},useId:function(){var e=Po(),t=G.identifierPrefix;if(M){var n=Fi,r=Pi;n=(r&~(1<<32-Je(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=So++,0<\/script>`,a=a.removeChild(a.firstChild);break;case`select`:a=typeof r.is==`string`?o.createElement(`select`,{is:r.is}):o.createElement(`select`),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=typeof r.is==`string`?o.createElement(i,{is:r.is}):o.createElement(i)}}a[_t]=t,a[vt]=r;a:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)a.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break a;for(;o.sibling===null;){if(o.return===null||o.return===t)break a;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=a;a:switch(Pd(a,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Ic(t)}}return V(t),Lc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Ic(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(s(166));if(e=ve.current,Ji(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=Vi,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[_t]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Gi(t,!0)}else e=Bd(e).createTextNode(r),e[_t]=t,t.stateNode=e}return V(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Ji(t),n!==null){if(e===null){if(!r)throw Error(s(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(s(557));e[_t]=t}else Yi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),e=!1}else n=Xi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(go(t),t):(go(t),null);if(t.flags&128)throw Error(s(558))}return V(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=Ji(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(s(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(s(317));i[_t]=t}else Yi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),i=!1}else i=Xi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(go(t),t):(go(t),null)}return go(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),a=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),zc(t,t.updateQueue),V(t),null);case 4:return xe(),e===null&&Sd(t.stateNode.containerInfo),V(t),null;case 10:return na(t.type),V(t),null;case 19:if(E(P),r=t.memoizedState,r===null)return V(t),null;if(i=(t.flags&128)!=0,a=r.rendering,a===null)if(i)Bc(r,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(a=_o(e),a!==null){for(t.flags|=128,Bc(r,!1),e=a.updateQueue,t.updateQueue=e,zc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)yi(n,e),n=n.sibling;return D(P,P.current&1|2),M&&Ii(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ie()>nu&&(t.flags|=128,i=!0,Bc(r,!1),t.lanes=4194304)}else{if(!i)if(e=_o(a),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,zc(t,e),Bc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!a.alternate&&!M)return V(t),null}else 2*Ie()-r.renderingStartTime>nu&&n!==536870912&&(t.flags|=128,i=!0,Bc(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(e=r.last,e===null?t.child=a:e.sibling=a,r.last=a)}return r.tail===null?(V(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ie(),e.sibling=null,n=P.current,D(P,i?n&1|2:n&1),M&&Ii(t,r.treeForkCount),e);case 22:case 23:return go(t),co(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(V(t),t.subtreeFlags&6&&(t.flags|=8192)):V(t),n=t.updateQueue,n!==null&&zc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&E(wa),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),na(N),V(t),null;case 25:return null;case 30:return null}throw Error(s(156,t.tag))}function Hc(e,t){switch(zi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return na(N),xe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(go(t),t.alternate===null)throw Error(s(340));Yi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(go(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Yi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return E(P),null;case 4:return xe(),null;case 10:return na(t.type),null;case 22:case 23:return go(t),co(),e!==null&&E(wa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return na(N),null;case 25:return null;default:return null}}function Uc(e,t){switch(zi(t),t.tag){case 3:na(N),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&go(t);break;case 13:go(t);break;case 19:E(P);break;case 10:na(t.type);break;case 22:case 23:go(t),co(),e!==null&&E(wa);break;case 24:na(N)}}function Wc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Gc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Kc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{ro(t,n)}catch(t){Z(e,e.return,t)}}}function qc(e,t,n){n.props=Xs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Jc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Yc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Xc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Zc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[vt]=t}catch(t){Z(e,e.return,t)}}function Qc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function $c(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Qc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function el(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=un));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(el(e,t,n),e=e.sibling;e!==null;)el(e,t,n),e=e.sibling}function tl(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(tl(e,t,n),e=e.sibling;e!==null;)tl(e,t,n),e=e.sibling}function nl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[_t]=e,t[vt]=n}catch(t){Z(e,e.return,t)}}var rl=!1,H=!1,il=!1,al=typeof WeakSet==`function`?WeakSet:Set,ol=null;function sl(e,t){if(e=e.containerInfo,Rd=sp,e=Fr(e),Ir(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break a}var o=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||i!==0&&f.nodeType!==3||(c=o+i),f!==a||r!==0&&f.nodeType!==3||(l=o+r),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===i&&(c=o),p===a&&++d===r&&(l=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,ol=t;ol!==null;)if(t=ol,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,ol=e;else for(;ol!==null;){switch(t=ol,a=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(a,r,n),a[_t]=e,kt(a),r=a;break a;case`link`:var o=Vf(`link`,`href`,i).get(r+(n.href||``));if(o){for(var c=0;cg&&(o=g,g=h,h=o);var _=Nr(s,h),v=Nr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,w.T=null,n=lu,lu=null;var a=au,o=su;if(X=0,ou=au=null,su=0,W&6)throw Error(s(331));var c=W;if(W|=4,Il(a.current),Ol(a,a.current,o,n),W=c,id(0,!1),Ke&&typeof Ke.onPostCommitFiberRoot==`function`)try{Ke.onPostCommitFiberRoot(Ge,a)}catch{}return!0}finally{T.p=i,w.T=r,Vu(e,t)}}function Wu(e,t,n){t=Ei(n,t),t=nc(e.stateNode,t,2),e=Xa(e,t,2),e!==null&&(st(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(iu===null||!iu.has(r))){e=Ei(n,e),n=rc(2),r=Xa(t,n,2),r!==null&&(ic(n,r,t,e),st(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Bl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Wl=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>Ie()-eu?!(W&2)&&Su(e,0):Jl|=n,Xl===q&&(Xl=0)),rd(e)}function qu(e,t){t===0&&(t=at()),e=di(e,t),e!==null&&(st(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Me(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Je(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=q,a=nt(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||rt(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Ie(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}X!==0&&X!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Jt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),kt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Jt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Jt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Jt(n.imageSizes)+`"]`)):i+=`[href="`+Jt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),kt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Jt(r)+`"][href="`+Jt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),kt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=Ot(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);kt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),kt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),kt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var i=(i=ve.current)?gf(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=Ot(i).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var a=Ot(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(jf(e)))&&!a._p&&(o.instance=a,o.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),a||Nf(i,e,n,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=Ot(i).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Af(e){return`href="`+Jt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),kt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Jt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Jt(n.href)+`"]`);if(r)return t.instance=r,kt(r),r;var i=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),kt(r),Pd(r,`style`,i),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Af(n.href);var a=e.querySelector(jf(i));if(a)return t.state.loading|=4,t.instance=a,kt(a),a;r=Mf(n),(i=mf.get(i))&&Rf(r,i),a=(e.ownerDocument||e).createElement(`link`),kt(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),t.state.loading|=4,Lf(a,n.precedence,e),t.instance=a;case`script`:return a=Pf(n.src),(i=e.querySelector(Ff(a)))?(t.instance=i,kt(i),i):(r=n,(i=mf.get(a))&&(r=h({},n),zf(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),kt(i),Pd(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,kt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),kt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()})),l=n(),u=c(),d=typeof window<`u`&&typeof document<`u`,f=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function p(e=21){let t=``,n=e|0;for(;n--;)t+=f[Math.random()*64|0];return t}function m(){return window.location.origin+`/wails/runtime`}var h=512*1024,g=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10,IOS:11,Android:12}),_=p(),v=null;function y(e,t=``){return function(n,r=null){return b(e,n,t,r)}}async function b(e,t,n,r){if(v)return v.call(e,t,n,r);let i=new URL(m()),a={object:e,method:t};r!=null&&(a.args=r);let o={"x-wails-client-id":_,"Content-Type":`application/json`};n&&(o[`x-wails-window-name`]=n);let s=JSON.stringify(a),c;if(c=s.length>h?await x(i,o,s):await fetch(i,{method:`POST`,headers:o,body:s}),!c.ok)throw Error(await c.text());return(c.headers.get(`Content-Type`)?.indexOf(`application/json`)??-1)===-1?c.text():c.json()}async function x(e,t,n){let r=p(),i=new TextEncoder().encode(n),a=Math.ceil(i.length/h);for(let n=0;n{let i=e.get(t);if(i){if(e.delete(t),r){i.reject(Error(r));return}try{let e=JSON.parse(n??`{}`);if(!e.ok){i.reject(Error(e.error??`unknown runtime call error`));return}i.resolve(`text`in e?e.text:e.data)}catch(e){i.reject(e)}}},v={call(t,n,r,i){return new Promise((a,o)=>{let s=p();e.set(s,{resolve:a,reject:o});try{ee.invokeAsync(s,JSON.stringify({object:t,method:n,windowName:r,args:i??null,clientId:_}))}catch(t){e.delete(s),o(t)}})}}}g.System;var S=(function(){try{if(window.chrome?.webview?.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if(window.webkit?.messageHandlers?.external?.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external);if(window.wails?.invoke)return e=>window.wails.invoke(typeof e==`string`?e:JSON.stringify(e))}catch{}return console.warn(` -%c⚠️ Browser Environment Detected %c - -%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. -More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development -`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function C(e){S?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function re(){return!!window._wails?.environment?.Debug}function ie(){return new MouseEvent(`mousedown`).buttons===0}function ae(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}d&&document.addEventListener(`DOMContentLoaded`,()=>{}),d&&window.addEventListener(`contextmenu`,le);var oe=y(g.ContextMenu),se=0;function ce(e,t,n,r){oe(se,{id:e,x:t,y:n,data:r})}function le(e){let t=ae(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);ce(n,e.clientX,e.clientY,r)}else ue(e,t)}function ue(e,t){if(re())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{fe=e,fe||(pe=me=!1,Oe())});var _e=!1;function ve(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function ye(){if(!_e&&!ve()){window.addEventListener(`mousedown`,we,{capture:!0}),window.addEventListener(`mousemove`,we,{capture:!0}),window.addEventListener(`mouseup`,we,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,be,{capture:!0});_e=!0}}if(d){ye(),document.addEventListener(`DOMContentLoaded`,ye,{once:!0});let e=0,t=window.setInterval(()=>{if(_e){window.clearInterval(t);return}ye(),++e>100&&window.clearInterval(t)},50)}function be(e){(T||me)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var xe=0,Se=1,Ce=2;function we(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=xe,ge||(n=D|1<{n=e,r=t}),this.constructor[tt]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[$e]:{configurable:!1,enumerable:!1,writable:!0,value:null},[et]:{configurable:!1,enumerable:!1,writable:!1,value:rt(i,a)}});let o=at(i,a);try{e(it(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[et](new Ze(`Promise cancelled.`,{cause:t})),ut(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(Xe(t)||(t=st),Xe(n)||(n=ct),t===st&&n==ct)return new e(e=>e(this));let i={};return this[$e]=i,new e((e,r)=>{super.then(n=>{var a;this[$e]===i&&(this[$e]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[$e]===i&&(this[$e]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return Xe(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[tt](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>ot(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>ot(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>ot(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>ot(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function rt(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new Qe(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new Qe(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function it(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(Xe(r)){try{let r=n.cancel;if(Xe(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?rt(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=at(e,i);try{Reflect.apply(r,n,[it(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function at(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof Ze&&t.reason instanceof Ze&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new Qe(e.promise,n))}else t.settled=!0,e.reject(n)}}function ot(e,t,n){let r=[];for(let i of t){let t;try{if(!Xe(i.then)||(t=i.cancel,!Xe(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new Qe(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new Qe(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function st(e){return e}function ct(e){throw e}function lt(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function ut(e){let t=e[$e]??{};return`promise`in t||Object.assign(t,dt()),e[$e]??(t.resolve(),e[$e]=t),t.promise}var dt=Promise.withResolvers;dt=dt&&typeof dt==`function`?dt.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},d&&(window._wails=window._wails||{});var ft=y(g.Call),pt=y(g.CancelCall),mt=new Map,ht=0,gt=0;function _t(){let e;do e=p();while(mt.has(e));return e}function vt(e){let t=_t(),n=nt.withResolvers();mt.set(t,{resolve:n.resolve,reject:n.reject});let r=ft(ht,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,mt.delete(t),n.resolve(e)},e=>{i=!1,mt.delete(t),n.reject(e)});let a=()=>(mt.delete(t),pt(gt,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function yt(e,...t){return vt({methodID:e,args:t})}var bt=`data-file-drop-target`,xt=`file-drop-target-active`,O=null,St=0,Ct=1,wt=2,Tt=3,Et=4,Dt=5,Ot=6,kt=7,At=8,jt=9,Mt=10,Nt=11,Pt=12,Ft=13,It=14,Lt=15,Rt=16,zt=17,Bt=18,Vt=19,Ht=20,Ut=21,Wt=22,Gt=23,Kt=24,qt=25,Jt=26,Yt=27,Xt=28,Zt=29,Qt=30,$t=31,en=32,tn=33,nn=34,rn=35,an=36,on=37,sn=38,cn=39,ln=40,un=41,dn=42,fn=43,pn=44,mn=45,hn=46,gn=47,_n=48,vn=49,yn=50,bn=51,xn=52;function Sn(e){return e?e.closest(`[${bt}]`):null}function Cn(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function wn(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var Tn=!1;function En(){Tn=!1,O&&=(O.classList.remove(xt),null)}function Dn(){window._wails?.flags?.enableFileDrop!==!1&&(Tn=!0)}function On(){En()}function kn(e,t){if(!Tn||window._wails?.flags?.enableFileDrop===!1)return;let n=Sn(document.elementFromPoint(e,t));O&&O!==n&&O.classList.remove(xt),n?(n.classList.add(xt),O=n):O=null}var k=Symbol(`caller`),An=new class e{constructor(t=``){this[k]=y(g.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[k](St)}Center(){return this[k](Ct)}Close(){return this[k](wt)}DisableSizeConstraints(){return this[k](Tt)}EnableSizeConstraints(){return this[k](Et)}Focus(){return this[k](Dt)}ForceReload(){return this[k](Ot)}Fullscreen(){return this[k](kt)}GetScreen(){return this[k](At)}GetZoom(){return this[k](jt)}Height(){return this[k](Mt)}Hide(){return this[k](Nt)}IsFocused(){return this[k](Pt)}IsFullscreen(){return this[k](Ft)}IsMaximised(){return this[k](It)}IsMinimised(){return this[k](Lt)}Maximise(){return this[k](Rt)}Minimise(){return this[k](zt)}Name(){return this[k](Bt)}OpenDevTools(){return this[k](Vt)}RelativePosition(){return this[k](Ht)}Reload(){return this[k](Ut)}Resizable(){return this[k](Wt)}Restore(){return this[k](Gt)}SetPosition(e,t){return this[k](Kt,{x:e,y:t})}SetAlwaysOnTop(e){return this[k](qt,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[k](Jt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[k](Yt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[k](Xt,{enabled:e})}SetMaxSize(e,t){return this[k](Zt,{width:e,height:t})}SetMinSize(e,t){return this[k](Qt,{width:e,height:t})}SetRelativePosition(e,t){return this[k]($t,{x:e,y:t})}SetResizable(e){return this[k](en,{resizable:e})}SetSize(e,t){return this[k](tn,{width:e,height:t})}SetTitle(e){return this[k](nn,{title:e})}SetZoom(e){return this[k](rn,{zoom:e})}Show(){return this[k](an)}Size(){return this[k](on)}ToggleFullscreen(){return this[k](sn)}ToggleMaximise(){return this[k](cn)}ToggleFrameless(){return this[k](ln)}UnFullscreen(){return this[k](un)}UnMaximise(){return this[k](dn)}UnMinimise(){return this[k](fn)}Width(){return this[k](pn)}Zoom(){return this[k](mn)}ZoomIn(){return this[k](hn)}ZoomOut(){return this[k](gn)}ZoomReset(){return this[k](_n)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=Sn(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=Sn(document.elementFromPoint(e.clientX,e.clientY));O&&O!==n&&O.classList.remove(xt),n?(n.classList.add(xt),e.dataTransfer.dropEffect=`copy`,O=n):(e.dataTransfer.dropEffect=`none`,O=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=Sn(document.elementFromPoint(e.clientX,e.clientY));O&&O!==t&&O.classList.remove(xt),t?(t.classList.contains(xt)||t.classList.add(xt),e.dataTransfer.dropEffect=`copy`,O=t):(e.dataTransfer.dropEffect=`none`,O=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||O&&!O.contains(e.relatedTarget))&&(O&&=(O.classList.remove(xt),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,O&&=(O.classList.remove(xt),null),Cn()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&wn(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&jn(),d&&(window._wails=window._wails||{}),d&&(window._wails.invoke=C,window._wails.clientId=_),d&&(window._wails.handlePlatformFileDrop=An.HandlePlatformFileDrop.bind(An)),d&&(window._wails.handleDragEnter=Dn,window._wails.handleDragLeave=On,window._wails.handleDragOver=kn),d&&C(`wails:runtime:ready`);function Mn(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}d&&Mn(`/wails/custom.js`);function Nn(){return yt(1211788486)}function Pn(){return yt(853311305)}function Fn(e){return yt(465937298,e)}function In(e){return yt(2463093517,e)}var Ln=class{getRepoRoot(){return Pn()}setRepoRoot(e){return In(e)}async getModules(){return await Nn()??[]}runAction(e){return Fn(e)}};function Rn(e){switch(e){case`repo`:case`branch`:case`worktree`:return`source`;case`issue`:case`pr`:return`collaboration`;case`tag`:return`release`;default:return`all`}}function zn(e,t){return t===`all`?e:e.filter(e=>Rn(e.id)===t)}var Bn=`fastgit.desktop.prefs.v1`;function Vn(){return typeof window<`u`&&window.localStorage!==void 0}function Hn(){if(!Vn())return{};try{let e=window.localStorage.getItem(Bn);if(!e)return{};let t=JSON.parse(e);return t&&typeof t==`object`?t:{}}catch{return{}}}function Un(e){Vn()&&window.localStorage.setItem(Bn,JSON.stringify(e))}function Wn(e){return`fastgit.desktop.tabs:${e}`}function Gn(e){if(!Vn()||!e)return null;try{let t=window.localStorage.getItem(Wn(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!=`object`?null:{openedModuleIds:Array.isArray(n.openedModuleIds)?n.openedModuleIds.map(e=>String(e)):[],selectedModuleId:n.selectedModuleId?String(n.selectedModuleId):null}}catch{return null}}function Kn(e,t){!Vn()||!e||window.localStorage.setItem(Wn(e),JSON.stringify(t))}var qn=(0,l.createContext)(null);function Jn(){let e=(0,l.useContext)(qn);if(!e)throw Error(`useAppContext must be used within AppProvider`);return e}var Yn=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),A=e(((e,t)=>{t.exports=Yn()}))(),Xn={title:`Welcome`,command:`-`,exitCode:0,body:`请选择左侧模块并执行动作。`},Zn=new Ln;function Qn(e,t){return t?e.includes(t)?e:[...e,t]:e}function $n(e){return Math.max(220,Math.min(420,e))}function er(e,t,n){let r=zn(e,t);return n[n.length-1]??r[0]?.id??e[0]?.id??null}function tr(){let e=Hn();return{repoPath:``,repoStatus:`加载中...`,modules:[],selectedModuleId:null,openedModuleIds:[],selectedMenu:e.selectedMenu??`source`,modulePaneWidth:$n(e.modulePaneWidth??280),modulePaneCollapsed:e.modulePaneCollapsed??!1,busy:!1,output:Xn}}function nr({children:e}){let[t,n]=(0,l.useState)(tr),r=(0,l.useCallback)(e=>{n(t=>({...t,busy:e}))},[]),i=(0,l.useCallback)(async()=>{r(!0);try{let[e,t]=await Promise.all([Zn.getRepoRoot(),Zn.getModules()]);n(n=>{let r=Gn(e),i=zn(t,n.selectedMenu),a=r?.selectedModuleId??n.selectedModuleId,o=a&&i.some(e=>e.id===a)?a:i[0]?.id??t[0]?.id??null,s=new Set(t.map(e=>e.id)),c=(r?.openedModuleIds??n.openedModuleIds).filter(e=>s.has(e));return{...n,repoPath:e,repoStatus:`当前仓库: ${e}`,modules:t,selectedModuleId:o,openedModuleIds:Qn(c,o)}})}catch(e){n(t=>({...t,output:{title:`Load Error`,command:`bootstrap`,exitCode:1,body:String(e)},repoStatus:`加载失败: ${String(e)}`}))}finally{r(!1)}},[r]),a=(0,l.useCallback)(e=>{n(t=>({...t,selectedModuleId:e,openedModuleIds:Qn(t.openedModuleIds,e)}))},[]),o=(0,l.useCallback)(e=>{n(t=>{if(t.selectedMenu===e)return{...t,modulePaneCollapsed:!t.modulePaneCollapsed};let n=zn(t.modules,e),r=t.selectedModuleId&&n.some(e=>e.id===t.selectedModuleId)?t.selectedModuleId:n[0]?.id??t.modules[0]?.id??null;return{...t,selectedMenu:e,selectedModuleId:r,openedModuleIds:Qn(t.openedModuleIds,r),modulePaneCollapsed:!1}})},[]),s=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.filter(t=>t!==e);if(t.selectedModuleId!==e)return{...t,openedModuleIds:n};let r=er(t.modules,t.selectedMenu,n);return{...t,openedModuleIds:n,selectedModuleId:r}})},[]),c=(0,l.useCallback)(e=>{n(t=>t.openedModuleIds.includes(e)?{...t,openedModuleIds:[e],selectedModuleId:e}:t)},[]),u=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.indexOf(e);if(n<0)return t;let r=t.openedModuleIds.slice(0,n+1),i=t.selectedModuleId&&r.includes(t.selectedModuleId)?t.selectedModuleId:er(t.modules,t.selectedMenu,r);return{...t,openedModuleIds:r,selectedModuleId:i}})},[]),d=(0,l.useCallback)((e,t)=>{e!==t&&n(n=>{let r=n.openedModuleIds.indexOf(e),i=n.openedModuleIds.indexOf(t);if(r<0||i<0)return n;let a=[...n.openedModuleIds];a.splice(r,1);let o=a.indexOf(t);return a.splice(o,0,e),{...n,openedModuleIds:a}})},[]),f=(0,l.useCallback)(()=>{n(e=>{let t=zn(e.modules,e.selectedMenu).find(t=>!e.openedModuleIds.includes(t.id))??e.modules[0];return t?{...e,selectedModuleId:t.id,openedModuleIds:Qn(e.openedModuleIds,t.id),modulePaneCollapsed:!1}:e})},[]),p=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneWidth:$n(e)}))},[]),m=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneCollapsed:e}))},[]),h=(0,l.useCallback)(async e=>{let t=e.trim();if(t){r(!0);try{await Zn.setRepoRoot(t),await i()}catch(e){n(t=>({...t,repoStatus:`切换失败: ${String(e)}`,output:{title:`Set Repository`,command:`SetRepoRoot`,exitCode:1,body:String(e)}}))}finally{r(!1)}}},[i,r]),g=(0,l.useCallback)(async(e,t,i)=>{r(!0);try{let r=await Zn.runAction({moduleID:e.id,actionID:t.id,values:i});n(n=>({...n,output:{title:`${e.title} / ${t.title}`,command:r.command,exitCode:r.exitCode,body:r.output||`(no output)`}}))}catch(r){n(n=>({...n,output:{title:`${e.title} / ${t.title}`,command:`RunAction`,exitCode:1,body:String(r)}}))}finally{r(!1)}},[r]),_=(0,l.useMemo)(()=>t.selectedModuleId?t.modules.find(e=>e.id===t.selectedModuleId)??null:null,[t.modules,t.selectedModuleId]),v=(0,l.useMemo)(()=>zn(t.modules,t.selectedMenu),[t.modules,t.selectedMenu]);(0,l.useEffect)(()=>{Un({selectedMenu:t.selectedMenu,modulePaneWidth:t.modulePaneWidth,modulePaneCollapsed:t.modulePaneCollapsed})},[t.modulePaneCollapsed,t.modulePaneWidth,t.selectedMenu]),(0,l.useEffect)(()=>{if(!t.repoPath)return;let e=new Set(t.modules.map(e=>e.id)),n=t.openedModuleIds.filter(t=>e.has(t)),r=t.selectedModuleId&&e.has(t.selectedModuleId)?t.selectedModuleId:null;Kn(t.repoPath,{openedModuleIds:n,selectedModuleId:r})},[t.modules,t.openedModuleIds,t.repoPath,t.selectedModuleId]);let y=(0,l.useMemo)(()=>({state:t,selectedModule:_,filteredModules:v,setSelectedModule:a,closeModuleTab:s,closeOtherModuleTabs:c,closeTabsToRight:u,reorderModuleTabs:d,addModuleTab:f,setSelectedMenu:o,setModulePaneWidth:p,setModulePaneCollapsed:m,refresh:i,switchRepo:h,runAction:g}),[t,_,v,a,s,c,u,d,f,o,p,m,i,h,g]);return(0,A.jsx)(qn.Provider,{value:y,children:e})}var rr=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),ir=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),ar=e=>{let t=ir(e);return t.charAt(0).toUpperCase()+t.slice(1)},or=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),sr=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},cr={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},lr=(0,l.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,l.createElement)(`svg`,{ref:c,...cr,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:or(`lucide`,i),...!a&&!sr(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,l.createElement)(e,t)),...Array.isArray(a)?a:[a]])),ur=(e,t)=>{let n=(0,l.forwardRef)(({className:n,...r},i)=>(0,l.createElement)(lr,{ref:i,iconNode:t,className:or(`lucide-${rr(ar(e))}`,`lucide-${e}`,n),...r}));return n.displayName=ar(e),n},dr=ur(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),fr=ur(`folder-git-2`,[[`path`,{d:`M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5`,key:`1w6njk`}],[`circle`,{cx:`13`,cy:`12`,r:`2`,key:`1j92g6`}],[`path`,{d:`M18 19c-2.8 0-5-2.2-5-5v8`,key:`pkpw2h`}],[`circle`,{cx:`20`,cy:`19`,r:`2`,key:`1obnsp`}]]),pr=ur(`git-fork`,[[`circle`,{cx:`12`,cy:`18`,r:`3`,key:`1mpf1b`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`path`,{d:`M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9`,key:`1uq4wg`}],[`path`,{d:`M12 12v3`,key:`158kv8`}]]),mr=ur(`layout-grid`,[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]),hr=ur(`panel-right-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m8 9 3 3-3 3`,key:`12hl5m`}]]),gr=ur(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),_r=ur(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),vr=ur(`tags`,[[`path`,{d:`M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z`,key:`16rjxf`}],[`path`,{d:`M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193`,key:`178nd4`}],[`circle`,{cx:`10.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`12ikhr`}]]),yr=ur(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function br(...e){return e.filter(Boolean).join(` `)}function xr({variant:e=`default`,className:t,children:n,...r}){return(0,A.jsx)(`button`,{className:br(`ui-button`,`ui-button--${e}`,t),...r,children:n})}var Sr={source:`源码与仓库`,collaboration:`协作与评审`,release:`发布与版本`,all:`全部模块`};function Cr(){let{state:e,filteredModules:t,setSelectedModule:n,setModulePaneCollapsed:r,refresh:i}=Jn();return(0,A.jsxs)(`aside`,{className:`module-pane`,children:[(0,A.jsxs)(`div`,{className:`module-pane__header`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{children:Sr[e.selectedMenu]??`模块`}),(0,A.jsxs)(`p`,{children:[t.length,` 个模块`]})]}),(0,A.jsxs)(`div`,{className:`module-pane__actions`,children:[(0,A.jsx)(xr,{variant:`ghost`,onClick:()=>void i(),children:`刷新`}),(0,A.jsx)(xr,{variant:`ghost`,className:`module-pane__collapse`,onClick:()=>r(!0),children:(0,A.jsx)(hr,{size:14})})]})]}),(0,A.jsxs)(`div`,{className:`module-pane__list`,children:[t.map(t=>(0,A.jsxs)(`button`,{className:br(`module-pane__item`,e.selectedModuleId===t.id&&`module-pane__item--active`),onClick:()=>n(t.id),type:`button`,children:[(0,A.jsx)(`strong`,{children:t.title}),(0,A.jsx)(`span`,{children:t.description})]},t.id)),t.length===0&&(0,A.jsx)(`div`,{className:`module-pane__empty`,children:`当前菜单下暂无模块`})]})]})}var wr=[{id:`source`,label:`源码`,icon:pr},{id:`collaboration`,label:`协作`,icon:dr},{id:`release`,label:`发布`,icon:vr},{id:`all`,label:`全部`,icon:mr}];function Tr(){let{state:e,setSelectedMenu:t,refresh:n}=Jn();return(0,A.jsxs)(`aside`,{className:`sidebar-menu-panel`,children:[(0,A.jsx)(`div`,{className:`sidebar-menu-panel__group`,children:wr.map(n=>{let r=n.icon;return(0,A.jsxs)(`button`,{className:br(`sidebar-menu-panel__item`,e.selectedMenu===n.id&&`sidebar-menu-panel__item--active`),onClick:()=>t(n.id),title:n.label,type:`button`,children:[(0,A.jsx)(r,{size:18,strokeWidth:2}),(0,A.jsx)(`span`,{children:n.label})]},n.id)})}),(0,A.jsxs)(`div`,{className:`sidebar-menu-panel__footer`,children:[(0,A.jsx)(xr,{variant:`ghost`,className:`sidebar-menu-panel__refresh`,onClick:()=>void n(),children:(0,A.jsx)(_r,{size:14})}),(0,A.jsx)(`span`,{children:e.modulePaneCollapsed?`已收起`:e.busy?`运行中`:`空闲`})]})]})}function Er({className:e,...t}){return(0,A.jsx)(`input`,{className:br(`ui-input`,e),...t})}function Dr(e){let t=new FormData(e),n={};for(let[e,r]of t.entries())n[e]=String(r).trim();return n}function Or(){let{selectedModule:e,runAction:t}=Jn();if(!e)return(0,A.jsx)(`section`,{className:`module-actions`,children:(0,A.jsx)(`div`,{className:`empty-state`,children:`未找到模块,请刷新。`})});let n=e.actions??[],r=n=>r=>{r.preventDefault(),t(e,n,Dr(r.currentTarget))};return(0,A.jsxs)(`section`,{className:`module-actions`,children:[(0,A.jsxs)(`header`,{className:`module-actions__header`,children:[(0,A.jsx)(`h2`,{children:e.title}),(0,A.jsx)(`p`,{children:e.description})]}),(0,A.jsx)(`div`,{className:`module-actions__grid`,children:n.map((e,t)=>(0,A.jsxs)(`article`,{className:`action-card`,style:{animationDelay:`${t*60}ms`},children:[(0,A.jsxs)(`div`,{className:`action-card__meta`,children:[(0,A.jsx)(`h3`,{children:e.title}),(0,A.jsx)(`p`,{children:e.description})]}),(0,A.jsxs)(`form`,{onSubmit:r(e),className:`action-card__form`,children:[(0,A.jsx)(`div`,{className:`action-card__fields`,children:(e.fields??[]).map(e=>(0,A.jsxs)(`label`,{className:`action-field`,children:[(0,A.jsx)(`span`,{children:e.label}),(0,A.jsx)(Er,{name:e.key,placeholder:e.placeholder||e.label,defaultValue:e.default||``,required:!!e.required})]},e.key))}),(0,A.jsx)(`div`,{className:`action-card__footer`,children:(0,A.jsx)(xr,{type:`submit`,children:`执行`})})]})]},e.id))})]})}function kr(){let{state:e}=Jn();return(0,A.jsxs)(`section`,{className:`output-panel`,children:[(0,A.jsxs)(`header`,{className:`output-panel__header`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{children:e.output.title}),(0,A.jsx)(`p`,{children:e.output.command})]}),(0,A.jsxs)(`span`,{className:e.output.exitCode===0?`status-pill status-pill--ok`:`status-pill status-pill--error`,children:[`exit `,e.output.exitCode]})]}),(0,A.jsx)(`pre`,{className:`output-panel__body`,children:e.output.body})]})}function Ar(){let{state:e,switchRepo:t}=Jn(),[n,r]=(0,l.useState)(``),i=n||e.repoPath;return(0,A.jsxs)(`section`,{className:`workspace-panel`,children:[(0,A.jsxs)(`header`,{children:[(0,A.jsx)(`h2`,{children:`Workspace`}),(0,A.jsx)(`p`,{children:e.busy?`运行中...`:`准备就绪`})]}),(0,A.jsxs)(`div`,{className:`workspace-panel__row`,children:[(0,A.jsx)(Er,{value:i,onChange:e=>r(e.target.value),placeholder:`/path/to/repository`}),(0,A.jsx)(xr,{variant:`primary`,onClick:()=>void t(i),children:`切换仓库`})]}),(0,A.jsx)(`p`,{className:`workspace-panel__status`,children:e.repoStatus})]})}function jr(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??`workspace`}function Mr(){let{state:e,addModuleTab:t,closeModuleTab:n,closeOtherModuleTabs:r,closeTabsToRight:i,reorderModuleTabs:a,setSelectedModule:o}=Jn(),s=jr(e.repoPath),[c,u]=(0,l.useState)(null),[d,f]=(0,l.useState)(null),[p,m]=(0,l.useState)(null),h=e.openedModuleIds.map(t=>e.modules.find(e=>e.id===t)).filter(e=>e!==void 0),g=h.length,_=(0,l.useMemo)(()=>p?h.find(e=>e.id===p.moduleId)??null:null,[p,h]),v=_?h.findIndex(e=>e.id===_.id):-1,y=g>1,b=v>=0&&v{let e=()=>m(null),t=e=>{e.key===`Escape`&&m(null)};return window.addEventListener(`pointerdown`,e),window.addEventListener(`keydown`,t),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,t)}},[]);let x=(e,t)=>{u(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t)},ee=(e,t)=>{e.preventDefault(),c&&c!==t&&f(t)},S=(e,t)=>{e.preventDefault(),!(!c||c===t)&&(a(c,t),f(null),u(null))},C=(e,t)=>{e.preventDefault(),e.stopPropagation(),m({x:e.clientX,y:e.clientY,moduleId:t})},te=e=>{e(),m(null)};return(0,A.jsxs)(`header`,{className:`tabs-header app-drag-region`,children:[(0,A.jsxs)(`div`,{className:`tabs-repo app-no-drag-region`,children:[(0,A.jsx)(fr,{size:14}),(0,A.jsx)(`span`,{children:s})]}),(0,A.jsx)(`div`,{className:`tabs-track app-no-drag-region`,children:h.map(t=>{let r=e.selectedModuleId===t.id;return(0,A.jsxs)(`div`,{className:[`tabs-track__item`,r?`tabs-track__item--active`:``,d===t.id?`tabs-track__item--drag-over`:``].filter(Boolean).join(` `),onClick:()=>o(t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o(t.id))},onContextMenu:e=>C(e,t.id),draggable:g>1,onDragStart:e=>x(e,t.id),onDragOver:e=>ee(e,t.id),onDrop:e=>S(e,t.id),onDragEnd:()=>{u(null),f(null)},role:`button`,tabIndex:0,"aria-label":`switch to ${t.title}`,"aria-pressed":r,children:[(0,A.jsx)(`span`,{children:t.title}),(0,A.jsx)(`button`,{className:`tabs-track__close`,onClick:e=>{e.stopPropagation(),n(t.id)},onContextMenu:e=>C(e,t.id),type:`button`,"aria-label":`close ${t.title}`,children:(0,A.jsx)(yr,{size:13})})]},t.id)})}),(0,A.jsx)(`button`,{className:`tabs-add app-no-drag-region`,onClick:t,type:`button`,"aria-label":`new tab`,children:(0,A.jsx)(gr,{size:14})}),p&&_&&(0,A.jsxs)(`div`,{className:`tabs-menu app-no-drag-region`,style:{left:`${p.x}px`,top:`${p.y}px`},onPointerDown:e=>e.stopPropagation(),children:[(0,A.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>n(_.id)),disabled:!y,children:`关闭标签`}),(0,A.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>r(_.id)),disabled:!y,children:`关闭其他标签`}),(0,A.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>i(_.id)),disabled:!b,children:`关闭右侧标签`})]})]})}function Nr(){let{state:e,setModulePaneWidth:t}=Jn(),[n,r]=(0,l.useState)(!1),i=n=>{if(window.innerWidth<=900||e.modulePaneCollapsed)return;r(!0);let i=n.clientX,a=e.modulePaneWidth,o=e=>{t(a+(e.clientX-i))},s=()=>{r(!1),window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s)},a={"--module-pane-width":`${e.modulePaneWidth}px`};return(0,A.jsxs)(`main`,{className:`desktop-shell`,children:[(0,A.jsx)(Mr,{}),(0,A.jsxs)(`section`,{className:[`desktop-body`,n?`desktop-body--dragging`:``,e.modulePaneCollapsed?`desktop-body--pane-collapsed`:``].filter(Boolean).join(` `),style:a,children:[(0,A.jsx)(Tr,{}),(0,A.jsxs)(`div`,{className:`module-pane-wrap`,children:[(0,A.jsx)(Cr,{}),(0,A.jsx)(`div`,{className:`module-pane-resizer`,onMouseDown:i,role:`separator`,"aria-orientation":`vertical`,"aria-label":`resize sidebar`})]}),(0,A.jsxs)(`div`,{className:`desktop-main`,children:[(0,A.jsx)(Ar,{}),(0,A.jsx)(Or,{}),(0,A.jsx)(kr,{})]})]})]})}function Pr(){let{refresh:e}=Jn();return(0,l.useEffect)(()=>{e()},[e]),(0,A.jsx)(Nr,{})}function Fr(){return(0,A.jsx)(nr,{children:(0,A.jsx)(Pr,{})})}var Ir=document.getElementById(`app`);if(!Ir)throw Error(`#app not found`);(0,u.createRoot)(Ir).render((0,A.jsx)(l.StrictMode,{children:(0,A.jsx)(Fr,{})})); \ No newline at end of file diff --git a/desktop/frontend/dist/assets/index-D6-5WBuw.css b/desktop/frontend/dist/assets/index-D6-5WBuw.css deleted file mode 100644 index f93fab5..0000000 --- a/desktop/frontend/dist/assets/index-D6-5WBuw.css +++ /dev/null @@ -1 +0,0 @@ -@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e0e5ed;--bg-main:#edf1f6;--bg-topbar:#e3e8f0;--bg-topbar-active:#f0f3f8;--bg-sidebar:#dde3ec;--bg-sidebar-soft:#e5eaf2;--bg-pane:#e3e7ef;--bg-pane-hover:#dbe2ec;--bg-card:#eef2f7;--bg-card-soft:#dde3ed;--bg-input:#edf1f6;--text-1:#1f2d44;--text-2:#5f708b;--text-3:#8b9ab0;--text-on-dark:#5f708b;--sidebar-icon:#667b99;--sidebar-icon-hover:#1f2d44;--sidebar-footer:#7388a6;--sidebar-active-bg:#4f7fc429;--sidebar-active-border:#93afdc85;--line:#bfcbdb;--line-strong:#adbbd1;--line-dark:#b8c4d6;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--ok:#1b9b4a;--error:#d83f57;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{background:#4f7fc41f;border-color:#4f7fc485}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;margin-left:auto;display:inline-flex}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);border-radius:10px;gap:3px;min-width:150px;padding:6px;display:grid;position:fixed;box-shadow:0 8px 20px #131f322e}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line-dark);background:var(--bg-sidebar);color:var(--text-on-dark);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--sidebar-icon);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;font-weight:600;display:grid}.sidebar-menu-panel__item:hover{color:var(--sidebar-icon-hover);background:var(--bg-pane-hover)}.sidebar-menu-panel__item--active{color:var(--sidebar-icon-hover);background:var(--sidebar-active-bg);box-shadow:inset 0 0 0 1px var(--sidebar-active-border)}.sidebar-menu-panel__footer{border-top:1px solid var(--line-dark);color:var(--sidebar-footer);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{border-color:var(--line-strong);width:36px;height:32px;color:var(--text-2);padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:#4f7fc47a}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:auto 1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.workspace-panel,.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 #ffffff57, var(--shadow-card);padding:12px}.workspace-panel header{justify-content:space-between;align-items:baseline;margin-bottom:8px;display:flex}.workspace-panel h2{font-size:14px}.workspace-panel header p,.workspace-panel__status{color:var(--text-2);font-size:12px}.workspace-panel__row{gap:8px;display:flex}.workspace-panel__status{margin-top:8px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line-dark);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line-dark);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto auto}}@media (width<=640px){.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);gap:10px;padding:12px;animation:.24s both rise-in;display:grid;box-shadow:0 1px #ffffff52}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button--primary{color:#fff;background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);outline:none;box-shadow:0 0 0 3px #4f7fc42e}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:#1b9b4a14;border-color:#1b9b4a40}.status-pill--error{color:var(--error);background:#d83f5714;border-color:#d83f5740}.output-panel__body{border-radius:var(--radius-lg);color:#d4dff2;background:#0f1725;border:1px solid #202d42;min-height:180px;max-height:30vh;margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto} diff --git a/desktop/frontend/dist/assets/index-DAwICAMZ.js b/desktop/frontend/dist/assets/index-DAwICAMZ.js new file mode 100644 index 0000000..4eceed9 --- /dev/null +++ b/desktop/frontend/dist/assets/index-DAwICAMZ.js @@ -0,0 +1,14 @@ +var e=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports);(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function S(){}var C={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function ne(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return ne(e.type,t,e.props)}function ie(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ae(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var oe=/\/+/g;function se(e,t){return typeof e==`object`&&e&&e.key!=null?ae(``+e.key):t.toString(36)}function ce(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(S,S):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function le(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,le(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+se(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(oe,`$&/`)+`/`),le(o,r,i,``,function(e){return e})):o!=null&&(ie(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(oe,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{n.exports=t()})),r=e((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,ie());else{var t=n(l);t!==null&&se(x,t.startTime-e)}}var ee=!1,S=-1,C=5,te=-1;function ne(){return g?!0:!(e.unstable_now()-tet&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&se(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?ie():ee=!1}}}var ie;if(typeof y==`function`)ie=function(){y(re)};else if(typeof MessageChannel<`u`){var ae=new MessageChannel,oe=ae.port2;ae.port1.onmessage=re,ie=function(){oe.postMessage(null)}}else ie=function(){_(re,0)};function se(t,n){S=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(S),S=-1):h=!0,se(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,ie()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),i=e(((e,t)=>{t.exports=r()})),a=e((e=>{var t=n();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=e((e=>{var t=i(),r=n(),a=o();function s(e){var t=`https://react.dev/errors/`+e;if(1me||(e.current=pe[me],pe[me]=null,me--)}function D(e,t){me++,pe[me]=e.current,e.current=t}var ge=he(null),_e=he(null),ve=he(null),ye=he(null);function be(e,t){switch(D(ve,t),D(_e,e),D(ge,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}E(ge),D(ge,e)}function xe(){E(ge),E(_e),E(ve)}function Se(e){e.memoizedState!==null&&D(ye,e);var t=ge.current,n=Hd(t,e.type);t!==n&&(D(_e,e),D(ge,n))}function Ce(e){_e.current===e&&(E(ge),E(_e)),ye.current===e&&(E(ye),Qf._currentValue=fe)}var we,Te;function Ee(e){if(we===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);we=t&&t[1]||``,Te=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{De=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Ee(n):``}function ke(e,t){switch(e.tag){case 26:case 27:case 5:return Ee(e.type);case 16:return Ee(`Lazy`);case 13:return e.child!==t&&t!==null?Ee(`Suspense Fallback`):Ee(`Suspense`);case 19:return Ee(`SuspenseList`);case 0:case 15:return Oe(e.type,!1);case 11:return Oe(e.type.render,!1);case 1:return Oe(e.type,!0);case 31:return Ee(`Activity`);default:return``}}function Ae(e){try{var t=``,n=null;do t+=ke(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var je=Object.prototype.hasOwnProperty,Me=t.unstable_scheduleCallback,Ne=t.unstable_cancelCallback,Pe=t.unstable_shouldYield,Fe=t.unstable_requestPaint,Ie=t.unstable_now,Le=t.unstable_getCurrentPriorityLevel,Re=t.unstable_ImmediatePriority,ze=t.unstable_UserBlockingPriority,Be=t.unstable_NormalPriority,Ve=t.unstable_LowPriority,He=t.unstable_IdlePriority,Ue=t.log,We=t.unstable_setDisableYieldValue,Ge=null,Ke=null;function qe(e){if(typeof Ue==`function`&&We(e),Ke&&typeof Ke.setStrictMode==`function`)try{Ke.setStrictMode(Ge,e)}catch{}}var Je=Math.clz32?Math.clz32:Ze,Ye=Math.log,Xe=Math.LN2;function Ze(e){return e>>>=0,e===0?32:31-(Ye(e)/Xe|0)|0}var Qe=256,$e=262144,et=4194304;function tt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function nt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=tt(n))):i=tt(o):i=tt(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=tt(n))):i=tt(o)):i=tt(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function rt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function it(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function at(){var e=et;return et<<=1,!(et&62914560)&&(et=4194304),e}function ot(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function st(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function ct(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),yn=!1;if(vn)try{var bn={};Object.defineProperty(bn,"passive",{get:function(){yn=!0}}),window.addEventListener(`test`,bn,bn),window.removeEventListener(`test`,bn,bn)}catch{yn=!1}var xn=null,Sn=null,Cn=null;function wn(){if(Cn)return Cn;var e,t=Sn,n=t.length,r,i=`value`in xn?xn.value:xn.textContent,a=i.length;for(e=0;e=er),rr=` `,ir=!1;function ar(e,t){switch(e){case`keyup`:return Qn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function or(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var sr=!1;function cr(e,t){switch(e){case`compositionend`:return or(t);case`keypress`:return t.which===32?(ir=!0,rr):null;case`textInput`:return e=t.data,e===rr&&ir?null:e;default:return null}}function lr(e,t){if(sr)return e===`compositionend`||!$n&&ar(e,t)?(e=wn(),Cn=Sn=xn=null,sr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=jr(n)}}function Nr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Nr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Pr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Gt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Gt(e.document)}return t}function Fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Ir=vn&&`documentMode`in document&&11>=document.documentMode,Lr=null,Rr=null,zr=null,Br=!1;function Vr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Br||Lr==null||Lr!==Gt(r)||(r=Lr,`selectionStart`in r&&Fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),zr&&Ar(zr,r)||(zr=r,r=Ed(Rr,`onSelect`),0>=o,i-=o,Ni=1<<32-Je(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),o=a(_,o,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),N&&Fi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),o=a(y,o,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),N&&Fi(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return N&&Fi(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),N&&Fi(i,g),u}function b(e,r,a,c){if(typeof a==`object`&&a&&a.type===y&&a.key===null&&(a=a.props.children),typeof a==`object`&&a){switch(a.$$typeof){case _:a:{for(var l=a.key;r!==null;){if(r.key===l){if(l=a.type,l===y){if(r.tag===7){n(e,r.sibling),c=i(r,a.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===ie&&Na(l)===r.type){n(e,r.sibling),c=i(r,a.props),Ba(c,a),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}a.type===y?(c=bi(a.props.children,e.mode,c,a.key),c.return=e,e=c):(c=yi(a.type,a.key,a.props,null,e.mode,c),Ba(c,a),c.return=e,e=c)}return o(e);case v:a:{for(l=a.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),c=i(r,a.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=Ci(a,e.mode,c),c.return=e,e=c}return o(e);case ie:return a=Na(a),b(e,r,a,c)}if(de(a))return h(e,r,a,c);if(ce(a)){if(l=ce(a),typeof l!=`function`)throw Error(s(150));return a=l.call(a),g(e,r,a,c)}if(typeof a.then==`function`)return b(e,r,za(a),c);if(a.$$typeof===S)return b(e,r,ca(e,a),c);Va(e,a)}return typeof a==`string`&&a!==``||typeof a==`number`||typeof a==`bigint`?(a=``+a,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,a),c.return=e,e=c):(n(e,r),c=xi(a,e.mode,c),c.return=e,e=c),o(e)):n(e,r)}return function(e,t,n,r){try{Ra=0;var i=b(e,t,n,r);return La=null,i}catch(t){if(t===Da||t===ka)throw t;var a=hi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ua=Ha(!0),Wa=Ha(!1),Ga=!1;function Ka(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function qa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ja(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ya(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=fi(e),di(e,null,n),t}return ci(e,r,t,n),fi(e)}function Xa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ut(e,n)}}function Za(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Qa=!1;function $a(){if(Qa){var e=va;if(e!==null)throw e}}function eo(e,t,n,r){Qa=!1;var i=e.updateQueue;Ga=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===_a&&(Qa=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ga=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function to(e,t){if(typeof e!=`function`)throw Error(s(191,e));e.call(t)}function no(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=w.T,s={};w.T=s,Ls(e,!1,t,n);try{var c=i(),l=w.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Is(e,t,xa(c,r),pu(e)):Is(e,t,r,pu(e))}catch(n){Is(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{T.p=a,o!==null&&s.types!==null&&(o.types=s.types),w.T=o}}function Es(){}function Ds(e,t,n,r){if(e.tag!==5)throw Error(s(476));var i=Os(e).queue;Ts(e,i,t,fe,n===null?Es:function(){return ks(e),n(r)})}function Os(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:fe,baseState:fe,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ro,lastRenderedState:fe},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ro,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ks(e){var t=Os(e);t.next===null&&(t=e.alternate.memoizedState),Is(e,t.next.queue,{},pu())}function As(){return sa(Qf)}function js(){return B().memoizedState}function Ms(){return B().memoizedState}function Ns(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ja(n);var r=Ya(t,e,n);r!==null&&(hu(r,t,n),Xa(r,t,n)),t={cache:pa()},e.payload=t;return}t=t.return}}function Ps(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Rs(e)?zs(t,n):(n=li(e,t,n,r),n!==null&&(hu(n,e,r),Bs(n,t,r)))}function Fs(e,t,n){Is(e,t,n,pu())}function Is(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Rs(e))zs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,kr(s,o))return ci(e,t,i,0),K===null&&si(),!1}catch{}if(n=li(e,t,i,r),n!==null)return hu(n,e,r),Bs(n,t,r),!0}return!1}function Ls(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Rs(e)){if(t)throw Error(s(479))}else t=li(e,n,r,2),t!==null&&hu(t,e,2)}function Rs(e){var t=e.alternate;return e===I||t!==null&&t===I}function zs(e,t){yo=vo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Bs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ut(e,n)}}var Vs={readContext:sa,use:Io,useCallback:z,useContext:z,useEffect:z,useImperativeHandle:z,useLayoutEffect:z,useInsertionEffect:z,useMemo:z,useReducer:z,useRef:z,useState:z,useDebugValue:z,useDeferredValue:z,useTransition:z,useSyncExternalStore:z,useId:z,useHostTransitionStatus:z,useFormState:z,useActionState:z,useOptimistic:z,useMemoCache:z,useCacheRefresh:z};Vs.useEffectEvent=z;var Hs={readContext:sa,use:Io,useCallback:function(e,t){return No().memoizedState=[e,t===void 0?null:t],e},useContext:sa,useEffect:fs,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),us(4194308,4,vs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return us(4194308,4,e,t)},useInsertionEffect:function(e,t){us(4,2,e,t)},useMemo:function(e,t){var n=No();t=t===void 0?null:t;var r=e();if(bo){qe(!0);try{e()}finally{qe(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=No();if(n!==void 0){var i=n(t);if(bo){qe(!0);try{n(t)}finally{qe(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ps.bind(null,I,e),[r.memoizedState,e]},useRef:function(e){var t=No();return e={current:e},t.memoizedState=e},useState:function(e){e=Jo(e);var t=e.queue,n=Fs.bind(null,I,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:bs,useDeferredValue:function(e,t){return Cs(No(),e,t)},useTransition:function(){var e=Jo(!1);return e=Ts.bind(null,I,e.queue,!0,!1),No().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=I,i=No();if(N){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),K===null)throw Error(s(349));J&127||Uo(r,t,n)}i.memoizedState=n;var a={value:n,getSnapshot:t};return i.queue=a,fs(Go.bind(null,r,a,e),[e]),r.flags|=2048,cs(9,{destroy:void 0},Wo.bind(null,r,a,n,t),null),n},useId:function(){var e=No(),t=K.identifierPrefix;if(N){var n=Pi,r=Ni;n=(r&~(1<<32-Je(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=xo++,0<\/script>`,a=a.removeChild(a.firstChild);break;case`select`:a=typeof r.is==`string`?o.createElement(`select`,{is:r.is}):o.createElement(`select`),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=typeof r.is==`string`?o.createElement(i,{is:r.is}):o.createElement(i)}}a[_t]=t,a[vt]=r;a:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)a.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break a;for(;o.sibling===null;){if(o.return===null||o.return===t)break a;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=a;a:switch(Pd(a,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Fc(t)}}return H(t),Ic(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Fc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(s(166));if(e=ve.current,qi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=Bi,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[_t]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Wi(t,!0)}else e=Bd(e).createTextNode(r),e[_t]=t,t.stateNode=e}return H(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=qi(t),n!==null){if(e===null){if(!r)throw Error(s(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(s(557));e[_t]=t}else Ji(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;H(t),e=!1}else n=Yi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(ho(t),t):(ho(t),null);if(t.flags&128)throw Error(s(558))}return H(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=qi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(s(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(s(317));i[_t]=t}else Ji(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;H(t),i=!1}else i=Yi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(ho(t),t):(ho(t),null)}return ho(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),a=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Rc(t,t.updateQueue),H(t),null);case 4:return xe(),e===null&&Sd(t.stateNode.containerInfo),H(t),null;case 10:return ta(t.type),H(t),null;case 19:if(E(F),r=t.memoizedState,r===null)return H(t),null;if(i=(t.flags&128)!=0,a=r.rendering,a===null)if(i)zc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(a=go(e),a!==null){for(t.flags|=128,zc(r,!1),e=a.updateQueue,t.updateQueue=e,Rc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)vi(n,e),n=n.sibling;return D(F,F.current&1|2),N&&Fi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ie()>tu&&(t.flags|=128,i=!0,zc(r,!1),t.lanes=4194304)}else{if(!i)if(e=go(a),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Rc(t,e),zc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!a.alternate&&!N)return H(t),null}else 2*Ie()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,i=!0,zc(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(e=r.last,e===null?t.child=a:e.sibling=a,r.last=a)}return r.tail===null?(H(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ie(),e.sibling=null,n=F.current,D(F,i?n&1|2:n&1),N&&Fi(t,r.treeForkCount),e);case 22:case 23:return ho(t),so(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(H(t),t.subtreeFlags&6&&(t.flags|=8192)):H(t),n=t.updateQueue,n!==null&&Rc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&E(Ca),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),ta(P),H(t),null;case 25:return null;case 30:return null}throw Error(s(156,t.tag))}function Vc(e,t){switch(Ri(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ta(P),xe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(ho(t),t.alternate===null)throw Error(s(340));Ji()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(ho(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Ji()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return E(F),null;case 4:return xe(),null;case 10:return ta(t.type),null;case 22:case 23:return ho(t),so(),e!==null&&E(Ca),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return ta(P),null;case 25:return null;default:return null}}function Hc(e,t){switch(Ri(t),t.tag){case 3:ta(P),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&ho(t);break;case 13:ho(t);break;case 19:E(F);break;case 10:ta(t.type);break;case 22:case 23:ho(t),so(),e!==null&&E(Ca);break;case 24:ta(P)}}function Uc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Wc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Gc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{no(t,n)}catch(t){Z(e,e.return,t)}}}function Kc(e,t,n){n.props=Ys(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function qc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Jc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Yc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Xc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[vt]=t}catch(t){Z(e,e.return,t)}}function Zc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Qc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Zc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=ln));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(el(e,t,n),e=e.sibling;e!==null;)el(e,t,n),e=e.sibling}function tl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[_t]=e,t[vt]=n}catch(t){Z(e,e.return,t)}}var nl=!1,U=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Pr(e),Fr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break a}var o=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||i!==0&&f.nodeType!==3||(c=o+i),f!==a||r!==0&&f.nodeType!==3||(l=o+r),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===i&&(c=o),p===a&&++d===r&&(l=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,a=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(a,r,n),a[_t]=e,k(a),r=a;break a;case`link`:var o=Vf(`link`,`href`,i).get(r+(n.href||``));if(o){for(var c=0;cg&&(o=g,g=h,h=o);var _=Mr(s,h),v=Mr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,w.T=null,n=lu,lu=null;var a=au,o=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(s(331));var c=G;if(G|=4,Fl(a.current),Dl(a,a.current,o,n),G=c,id(0,!1),Ke&&typeof Ke.onPostCommitFiberRoot==`function`)try{Ke.onPostCommitFiberRoot(Ge,a)}catch{}return!0}finally{T.p=i,w.T=r,Vu(e,t)}}function Wu(e,t,n){t=Ti(n,t),t=tc(e.stateNode,t,2),e=Ya(e,t,2),e!==null&&(st(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=Ti(n,e),n=nc(2),r=Ya(t,n,2),r!==null&&(rc(n,r,t,e),st(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>Ie()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=at()),e=ui(e,t),e!==null&&(st(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Me(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Je(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=nt(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||rt(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Ie(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=qt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),k(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+qt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+qt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+qt(n.imageSizes)+`"]`)):i+=`[href="`+qt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),k(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+qt(r)+`"][href="`+qt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),k(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=Ot(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);k(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),k(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),k(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var i=(i=ve.current)?gf(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=Ot(i).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var a=Ot(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(jf(e)))&&!a._p&&(o.instance=a,o.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),a||Nf(i,e,n,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=Ot(i).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Af(e){return`href="`+qt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),k(t),e.head.appendChild(t))}function Pf(e){return`[src="`+qt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+qt(n.href)+`"]`);if(r)return t.instance=r,k(r),r;var i=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),k(r),Pd(r,`style`,i),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Af(n.href);var a=e.querySelector(jf(i));if(a)return t.state.loading|=4,t.instance=a,k(a),a;r=Mf(n),(i=mf.get(i))&&Rf(r,i),a=(e.ownerDocument||e).createElement(`link`),k(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),t.state.loading|=4,Lf(a,n.precedence,e),t.instance=a;case`script`:return a=Pf(n.src),(i=e.querySelector(Ff(a)))?(t.instance=i,k(i),i):(r=n,(i=mf.get(a))&&(r=h({},n),zf(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),k(i),Pd(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,k(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),k(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()})),l=n(),u=c(),d=typeof window<`u`&&typeof document<`u`,f=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function p(e=21){let t=``,n=e|0;for(;n--;)t+=f[Math.random()*64|0];return t}function m(){return window.location.origin+`/wails/runtime`}var h=512*1024,g=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10,IOS:11,Android:12}),_=p(),v=null;function y(e,t=``){return function(n,r=null){return b(e,n,t,r)}}async function b(e,t,n,r){if(v)return v.call(e,t,n,r);let i=new URL(m()),a={object:e,method:t};r!=null&&(a.args=r);let o={"x-wails-client-id":_,"Content-Type":`application/json`};n&&(o[`x-wails-window-name`]=n);let s=JSON.stringify(a),c;if(c=s.length>h?await x(i,o,s):await fetch(i,{method:`POST`,headers:o,body:s}),!c.ok)throw Error(await c.text());return(c.headers.get(`Content-Type`)?.indexOf(`application/json`)??-1)===-1?c.text():c.json()}async function x(e,t,n){let r=p(),i=new TextEncoder().encode(n),a=Math.ceil(i.length/h);for(let n=0;n{let i=e.get(t);if(i){if(e.delete(t),r){i.reject(Error(r));return}try{let e=JSON.parse(n??`{}`);if(!e.ok){i.reject(Error(e.error??`unknown runtime call error`));return}i.resolve(`text`in e?e.text:e.data)}catch(e){i.reject(e)}}},v={call(t,n,r,i){return new Promise((a,o)=>{let s=p();e.set(s,{resolve:a,reject:o});try{ee.invokeAsync(s,JSON.stringify({object:t,method:n,windowName:r,args:i??null,clientId:_}))}catch(t){e.delete(s),o(t)}})}}}g.System;var S=(function(){try{if(window.chrome?.webview?.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if(window.webkit?.messageHandlers?.external?.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external);if(window.wails?.invoke)return e=>window.wails.invoke(typeof e==`string`?e:JSON.stringify(e))}catch{}return console.warn(` +%c⚠️ Browser Environment Detected %c + +%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. +More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development +`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function C(e){S?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function re(){return!!window._wails?.environment?.Debug}function ie(){return new MouseEvent(`mousedown`).buttons===0}function ae(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}d&&document.addEventListener(`DOMContentLoaded`,()=>{}),d&&window.addEventListener(`contextmenu`,le);var oe=y(g.ContextMenu),se=0;function ce(e,t,n,r){oe(se,{id:e,x:t,y:n,data:r})}function le(e){let t=ae(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);ce(n,e.clientX,e.clientY,r)}else ue(e,t)}function ue(e,t){if(re())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{fe=e,fe||(pe=me=!1,Oe())});var _e=!1;function ve(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function ye(){if(!_e&&!ve()){window.addEventListener(`mousedown`,we,{capture:!0}),window.addEventListener(`mousemove`,we,{capture:!0}),window.addEventListener(`mouseup`,we,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,be,{capture:!0});_e=!0}}if(d){ye(),document.addEventListener(`DOMContentLoaded`,ye,{once:!0});let e=0,t=window.setInterval(()=>{if(_e){window.clearInterval(t);return}ye(),++e>100&&window.clearInterval(t)},50)}function be(e){(T||me)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var xe=0,Se=1,Ce=2;function we(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=xe,ge||(n=D|1<{n=e,r=t}),this.constructor[tt]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[$e]:{configurable:!1,enumerable:!1,writable:!0,value:null},[et]:{configurable:!1,enumerable:!1,writable:!1,value:rt(i,a)}});let o=at(i,a);try{e(it(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[et](new Ze(`Promise cancelled.`,{cause:t})),ut(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(Xe(t)||(t=st),Xe(n)||(n=ct),t===st&&n==ct)return new e(e=>e(this));let i={};return this[$e]=i,new e((e,r)=>{super.then(n=>{var a;this[$e]===i&&(this[$e]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[$e]===i&&(this[$e]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return Xe(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[tt](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>ot(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>ot(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>ot(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>ot(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function rt(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new Qe(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new Qe(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function it(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(Xe(r)){try{let r=n.cancel;if(Xe(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?rt(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=at(e,i);try{Reflect.apply(r,n,[it(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function at(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof Ze&&t.reason instanceof Ze&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new Qe(e.promise,n))}else t.settled=!0,e.reject(n)}}function ot(e,t,n){let r=[];for(let i of t){let t;try{if(!Xe(i.then)||(t=i.cancel,!Xe(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new Qe(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new Qe(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function st(e){return e}function ct(e){throw e}function lt(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function ut(e){let t=e[$e]??{};return`promise`in t||Object.assign(t,dt()),e[$e]??(t.resolve(),e[$e]=t),t.promise}var dt=Promise.withResolvers;dt=dt&&typeof dt==`function`?dt.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},d&&(window._wails=window._wails||{});var ft=y(g.Call),pt=y(g.CancelCall),mt=new Map,ht=0,gt=0;function _t(){let e;do e=p();while(mt.has(e));return e}function vt(e){let t=_t(),n=nt.withResolvers();mt.set(t,{resolve:n.resolve,reject:n.reject});let r=ft(ht,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,mt.delete(t),n.resolve(e)},e=>{i=!1,mt.delete(t),n.reject(e)});let a=()=>(mt.delete(t),pt(gt,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function yt(e,...t){return vt({methodID:e,args:t})}var bt=`data-file-drop-target`,xt=`file-drop-target-active`,O=null,St=0,Ct=1,wt=2,Tt=3,Et=4,Dt=5,Ot=6,k=7,kt=8,At=9,jt=10,Mt=11,Nt=12,Pt=13,Ft=14,It=15,Lt=16,Rt=17,zt=18,Bt=19,Vt=20,Ht=21,Ut=22,Wt=23,Gt=24,Kt=25,qt=26,Jt=27,Yt=28,Xt=29,Zt=30,Qt=31,$t=32,en=33,tn=34,nn=35,rn=36,an=37,on=38,sn=39,cn=40,ln=41,un=42,dn=43,fn=44,pn=45,mn=46,hn=47,gn=48,_n=49,vn=50,yn=51,bn=52;function xn(e){return e?e.closest(`[${bt}]`):null}function Sn(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function Cn(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var wn=!1;function Tn(){wn=!1,O&&=(O.classList.remove(xt),null)}function En(){window._wails?.flags?.enableFileDrop!==!1&&(wn=!0)}function Dn(){Tn()}function On(e,t){if(!wn||window._wails?.flags?.enableFileDrop===!1)return;let n=xn(document.elementFromPoint(e,t));O&&O!==n&&O.classList.remove(xt),n?(n.classList.add(xt),O=n):O=null}var A=Symbol(`caller`),kn=new class e{constructor(t=``){this[A]=y(g.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[A](St)}Center(){return this[A](Ct)}Close(){return this[A](wt)}DisableSizeConstraints(){return this[A](Tt)}EnableSizeConstraints(){return this[A](Et)}Focus(){return this[A](Dt)}ForceReload(){return this[A](Ot)}Fullscreen(){return this[A](k)}GetScreen(){return this[A](kt)}GetZoom(){return this[A](At)}Height(){return this[A](jt)}Hide(){return this[A](Mt)}IsFocused(){return this[A](Nt)}IsFullscreen(){return this[A](Pt)}IsMaximised(){return this[A](Ft)}IsMinimised(){return this[A](It)}Maximise(){return this[A](Lt)}Minimise(){return this[A](Rt)}Name(){return this[A](zt)}OpenDevTools(){return this[A](Bt)}RelativePosition(){return this[A](Vt)}Reload(){return this[A](Ht)}Resizable(){return this[A](Ut)}Restore(){return this[A](Wt)}SetPosition(e,t){return this[A](Gt,{x:e,y:t})}SetAlwaysOnTop(e){return this[A](Kt,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[A](qt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[A](Jt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[A](Yt,{enabled:e})}SetMaxSize(e,t){return this[A](Xt,{width:e,height:t})}SetMinSize(e,t){return this[A](Zt,{width:e,height:t})}SetRelativePosition(e,t){return this[A](Qt,{x:e,y:t})}SetResizable(e){return this[A]($t,{resizable:e})}SetSize(e,t){return this[A](en,{width:e,height:t})}SetTitle(e){return this[A](tn,{title:e})}SetZoom(e){return this[A](nn,{zoom:e})}Show(){return this[A](rn)}Size(){return this[A](an)}ToggleFullscreen(){return this[A](on)}ToggleMaximise(){return this[A](sn)}ToggleFrameless(){return this[A](cn)}UnFullscreen(){return this[A](ln)}UnMaximise(){return this[A](un)}UnMinimise(){return this[A](dn)}Width(){return this[A](fn)}Zoom(){return this[A](pn)}ZoomIn(){return this[A](mn)}ZoomOut(){return this[A](hn)}ZoomReset(){return this[A](gn)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=xn(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=xn(document.elementFromPoint(e.clientX,e.clientY));O&&O!==n&&O.classList.remove(xt),n?(n.classList.add(xt),e.dataTransfer.dropEffect=`copy`,O=n):(e.dataTransfer.dropEffect=`none`,O=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=xn(document.elementFromPoint(e.clientX,e.clientY));O&&O!==t&&O.classList.remove(xt),t?(t.classList.contains(xt)||t.classList.add(xt),e.dataTransfer.dropEffect=`copy`,O=t):(e.dataTransfer.dropEffect=`none`,O=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||O&&!O.contains(e.relatedTarget))&&(O&&=(O.classList.remove(xt),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,O&&=(O.classList.remove(xt),null),Sn()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&Cn(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&An(),d&&(window._wails=window._wails||{}),d&&(window._wails.invoke=C,window._wails.clientId=_),d&&(window._wails.handlePlatformFileDrop=kn.HandlePlatformFileDrop.bind(kn)),d&&(window._wails.handleDragEnter=En,window._wails.handleDragLeave=Dn,window._wails.handleDragOver=On),d&&C(`wails:runtime:ready`);function jn(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}d&&jn(`/wails/custom.js`);function Mn(){return yt(1211788486)}function Nn(){return yt(853311305)}function Pn(e){return yt(465937298,e)}function Fn(e){return yt(2463093517,e)}var In=class{getRepoRoot(){return Nn()}setRepoRoot(e){return Fn(e)}async getModules(){return await Mn()??[]}runAction(e){return Pn(e)}};function Ln(e){switch(e){case`repo`:case`branch`:case`worktree`:return`source`;case`issue`:case`pr`:return`collaboration`;case`tag`:return`release`;default:return`all`}}function Rn(e,t){return t===`all`?e:e.filter(e=>Ln(e.id)===t)}var zn=`fastgit.desktop.prefs.v1`;function Bn(){return typeof window<`u`&&window.localStorage!==void 0}function Vn(){if(!Bn())return{};try{let e=window.localStorage.getItem(zn);if(!e)return{};let t=JSON.parse(e);return t&&typeof t==`object`?t:{}}catch{return{}}}function Hn(e){Bn()&&window.localStorage.setItem(zn,JSON.stringify(e))}function Un(e){return`fastgit.desktop.tabs:${e}`}function Wn(e){if(!Bn()||!e)return null;try{let t=window.localStorage.getItem(Un(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!=`object`?null:{openedModuleIds:Array.isArray(n.openedModuleIds)?n.openedModuleIds.map(e=>String(e)):[],selectedModuleId:n.selectedModuleId?String(n.selectedModuleId):null}}catch{return null}}function Gn(e,t){!Bn()||!e||window.localStorage.setItem(Un(e),JSON.stringify(t))}var Kn=(0,l.createContext)(null);function qn(){let e=(0,l.useContext)(Kn);if(!e)throw Error(`useAppContext must be used within AppProvider`);return e}var Jn=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),j=e(((e,t)=>{t.exports=Jn()}))(),Yn={title:`Welcome`,command:`-`,exitCode:0,body:`请选择左侧模块并执行动作。`},Xn=new In;function Zn(e,t){return t?e.includes(t)?e:[...e,t]:e}function Qn(e){return Math.max(220,Math.min(420,e))}function $n(e,t,n){let r=Rn(e,t);return n[n.length-1]??r[0]?.id??e[0]?.id??null}function er(){let e=Vn();return{repoPath:``,repoStatus:`加载中...`,modules:[],selectedModuleId:null,openedModuleIds:[],selectedMenu:e.selectedMenu??`source`,modulePaneWidth:Qn(e.modulePaneWidth??280),modulePaneCollapsed:e.modulePaneCollapsed??!1,busy:!1,output:Yn}}function tr({children:e}){let[t,n]=(0,l.useState)(er),r=(0,l.useCallback)(e=>{n(t=>({...t,busy:e}))},[]),i=(0,l.useCallback)(async()=>{r(!0);try{let[e,t]=await Promise.all([Xn.getRepoRoot(),Xn.getModules()]);n(n=>{let r=Wn(e),i=Rn(t,n.selectedMenu),a=r?.selectedModuleId??n.selectedModuleId,o=a&&i.some(e=>e.id===a)?a:i[0]?.id??t[0]?.id??null,s=new Set(t.map(e=>e.id)),c=(r?.openedModuleIds??n.openedModuleIds).filter(e=>s.has(e));return{...n,repoPath:e,repoStatus:`当前仓库: ${e}`,modules:t,selectedModuleId:o,openedModuleIds:Zn(c,o)}})}catch(e){n(t=>({...t,output:{title:`Load Error`,command:`bootstrap`,exitCode:1,body:String(e)},repoStatus:`加载失败: ${String(e)}`}))}finally{r(!1)}},[r]),a=(0,l.useCallback)(e=>{n(t=>({...t,selectedModuleId:e,openedModuleIds:Zn(t.openedModuleIds,e)}))},[]),o=(0,l.useCallback)(e=>{n(t=>{if(t.selectedMenu===e)return{...t,modulePaneCollapsed:!t.modulePaneCollapsed};let n=Rn(t.modules,e),r=t.selectedModuleId&&n.some(e=>e.id===t.selectedModuleId)?t.selectedModuleId:n[0]?.id??t.modules[0]?.id??null;return{...t,selectedMenu:e,selectedModuleId:r,openedModuleIds:Zn(t.openedModuleIds,r),modulePaneCollapsed:!1}})},[]),s=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.filter(t=>t!==e);if(t.selectedModuleId!==e)return{...t,openedModuleIds:n};let r=$n(t.modules,t.selectedMenu,n);return{...t,openedModuleIds:n,selectedModuleId:r}})},[]),c=(0,l.useCallback)(e=>{n(t=>t.openedModuleIds.includes(e)?{...t,openedModuleIds:[e],selectedModuleId:e}:t)},[]),u=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.indexOf(e);if(n<0)return t;let r=t.openedModuleIds.slice(0,n+1),i=t.selectedModuleId&&r.includes(t.selectedModuleId)?t.selectedModuleId:$n(t.modules,t.selectedMenu,r);return{...t,openedModuleIds:r,selectedModuleId:i}})},[]),d=(0,l.useCallback)((e,t)=>{e!==t&&n(n=>{let r=n.openedModuleIds.indexOf(e),i=n.openedModuleIds.indexOf(t);if(r<0||i<0)return n;let a=[...n.openedModuleIds];a.splice(r,1);let o=a.indexOf(t);return a.splice(o,0,e),{...n,openedModuleIds:a}})},[]),f=(0,l.useCallback)(()=>{n(e=>{let t=Rn(e.modules,e.selectedMenu).find(t=>!e.openedModuleIds.includes(t.id))??e.modules[0];return t?{...e,selectedModuleId:t.id,openedModuleIds:Zn(e.openedModuleIds,t.id),modulePaneCollapsed:!1}:e})},[]),p=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneWidth:Qn(e)}))},[]),m=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneCollapsed:e}))},[]),h=(0,l.useCallback)(async e=>{let t=e.trim();if(t){r(!0);try{await Xn.setRepoRoot(t),await i()}catch(e){n(t=>({...t,repoStatus:`切换失败: ${String(e)}`,output:{title:`Set Repository`,command:`SetRepoRoot`,exitCode:1,body:String(e)}}))}finally{r(!1)}}},[i,r]),g=(0,l.useCallback)(async(e,t,i)=>{r(!0);try{let r=await Xn.runAction({moduleID:e.id,actionID:t.id,values:i});n(n=>({...n,output:{title:`${e.title} / ${t.title}`,command:r.command,exitCode:r.exitCode,body:r.output||`(no output)`}}))}catch(r){n(n=>({...n,output:{title:`${e.title} / ${t.title}`,command:`RunAction`,exitCode:1,body:String(r)}}))}finally{r(!1)}},[r]),_=(0,l.useMemo)(()=>t.selectedModuleId?t.modules.find(e=>e.id===t.selectedModuleId)??null:null,[t.modules,t.selectedModuleId]),v=(0,l.useMemo)(()=>Rn(t.modules,t.selectedMenu),[t.modules,t.selectedMenu]);(0,l.useEffect)(()=>{Hn({selectedMenu:t.selectedMenu,modulePaneWidth:t.modulePaneWidth,modulePaneCollapsed:t.modulePaneCollapsed})},[t.modulePaneCollapsed,t.modulePaneWidth,t.selectedMenu]),(0,l.useEffect)(()=>{if(!t.repoPath)return;let e=new Set(t.modules.map(e=>e.id)),n=t.openedModuleIds.filter(t=>e.has(t)),r=t.selectedModuleId&&e.has(t.selectedModuleId)?t.selectedModuleId:null;Gn(t.repoPath,{openedModuleIds:n,selectedModuleId:r})},[t.modules,t.openedModuleIds,t.repoPath,t.selectedModuleId]);let y=(0,l.useMemo)(()=>({state:t,selectedModule:_,filteredModules:v,setSelectedModule:a,closeModuleTab:s,closeOtherModuleTabs:c,closeTabsToRight:u,reorderModuleTabs:d,addModuleTab:f,setSelectedMenu:o,setModulePaneWidth:p,setModulePaneCollapsed:m,refresh:i,switchRepo:h,runAction:g}),[t,_,v,a,s,c,u,d,f,o,p,m,i,h,g]);return(0,j.jsx)(Kn.Provider,{value:y,children:e})}var nr=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),rr=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),ir=e=>{let t=rr(e);return t.charAt(0).toUpperCase()+t.slice(1)},ar=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),or=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},sr={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},cr=(0,l.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,l.createElement)(`svg`,{ref:c,...sr,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:ar(`lucide`,i),...!a&&!or(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,l.createElement)(e,t)),...Array.isArray(a)?a:[a]])),lr=(e,t)=>{let n=(0,l.forwardRef)(({className:n,...r},i)=>(0,l.createElement)(cr,{ref:i,iconNode:t,className:ar(`lucide-${nr(ir(e))}`,`lucide-${e}`,n),...r}));return n.displayName=ir(e),n},ur=lr(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),dr=lr(`git-fork`,[[`circle`,{cx:`12`,cy:`18`,r:`3`,key:`1mpf1b`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`path`,{d:`M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9`,key:`1uq4wg`}],[`path`,{d:`M12 12v3`,key:`158kv8`}]]),fr=lr(`layout-grid`,[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]),pr=lr(`panel-right-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m8 9 3 3-3 3`,key:`12hl5m`}]]),mr=lr(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),hr=lr(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),gr=lr(`tags`,[[`path`,{d:`M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z`,key:`16rjxf`}],[`path`,{d:`M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193`,key:`178nd4`}],[`circle`,{cx:`10.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`12ikhr`}]]),_r=lr(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function vr(...e){return e.filter(Boolean).join(` `)}function yr({variant:e=`default`,className:t,children:n,...r}){return(0,j.jsx)(`button`,{className:vr(`ui-button`,`ui-button--${e}`,t),...r,children:n})}var br={source:`源码与仓库`,collaboration:`协作与评审`,release:`发布与版本`,all:`全部模块`};function xr(){let{state:e,filteredModules:t,setSelectedModule:n,setModulePaneCollapsed:r,refresh:i}=qn();return(0,j.jsxs)(`aside`,{className:`module-pane`,children:[(0,j.jsxs)(`div`,{className:`module-pane__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:br[e.selectedMenu]??`模块`}),(0,j.jsxs)(`p`,{children:[t.length,` 个模块`]})]}),(0,j.jsxs)(`div`,{className:`module-pane__actions`,children:[(0,j.jsx)(yr,{variant:`ghost`,onClick:()=>void i(),children:`刷新`}),(0,j.jsx)(yr,{variant:`ghost`,className:`module-pane__collapse`,onClick:()=>r(!0),children:(0,j.jsx)(pr,{size:14})})]})]}),(0,j.jsxs)(`div`,{className:`module-pane__list`,children:[t.map(t=>(0,j.jsxs)(`button`,{className:vr(`module-pane__item`,e.selectedModuleId===t.id&&`module-pane__item--active`),onClick:()=>n(t.id),type:`button`,children:[(0,j.jsx)(`strong`,{children:t.title}),(0,j.jsx)(`span`,{children:t.description})]},t.id)),t.length===0&&(0,j.jsx)(`div`,{className:`module-pane__empty`,children:`当前菜单下暂无模块`})]})]})}var Sr=[{id:`source`,label:`源码`,icon:dr},{id:`collaboration`,label:`协作`,icon:ur},{id:`release`,label:`发布`,icon:gr},{id:`all`,label:`全部`,icon:fr}];function Cr(){let{state:e,setSelectedMenu:t,refresh:n}=qn();return(0,j.jsxs)(`aside`,{className:`sidebar-menu-panel`,children:[(0,j.jsx)(`div`,{className:`sidebar-menu-panel__group`,children:Sr.map(n=>{let r=n.icon;return(0,j.jsxs)(`button`,{className:vr(`sidebar-menu-panel__item`,e.selectedMenu===n.id&&`sidebar-menu-panel__item--active`),onClick:()=>t(n.id),title:n.label,type:`button`,children:[(0,j.jsx)(r,{size:18,strokeWidth:2}),(0,j.jsx)(`span`,{children:n.label})]},n.id)})}),(0,j.jsxs)(`div`,{className:`sidebar-menu-panel__footer`,children:[(0,j.jsx)(yr,{variant:`ghost`,className:`sidebar-menu-panel__refresh`,onClick:()=>void n(),children:(0,j.jsx)(hr,{size:14})}),(0,j.jsx)(`span`,{children:e.modulePaneCollapsed?`已收起`:e.busy?`运行中`:`空闲`})]})]})}function wr({className:e,...t}){return(0,j.jsx)(`input`,{className:vr(`ui-input`,e),...t})}function Tr(e){let t=new FormData(e),n={};for(let[e,r]of t.entries())n[e]=String(r).trim();return n}function Er(){let{selectedModule:e,runAction:t}=qn();if(!e)return(0,j.jsx)(`section`,{className:`module-actions`,children:(0,j.jsx)(`div`,{className:`empty-state`,children:`未找到模块,请刷新。`})});let n=e.actions??[],r=n=>r=>{r.preventDefault(),t(e,n,Tr(r.currentTarget))};return(0,j.jsxs)(`section`,{className:`module-actions`,children:[(0,j.jsxs)(`header`,{className:`module-actions__header`,children:[(0,j.jsx)(`h2`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsx)(`div`,{className:`module-actions__grid`,children:n.map((e,t)=>(0,j.jsxs)(`article`,{className:`action-card`,style:{animationDelay:`${t*60}ms`},children:[(0,j.jsxs)(`div`,{className:`action-card__meta`,children:[(0,j.jsx)(`h3`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsxs)(`form`,{onSubmit:r(e),className:`action-card__form`,children:[(0,j.jsx)(`div`,{className:`action-card__fields`,children:(e.fields??[]).map(e=>(0,j.jsxs)(`label`,{className:`action-field`,children:[(0,j.jsx)(`span`,{children:e.label}),(0,j.jsx)(wr,{name:e.key,placeholder:e.placeholder||e.label,defaultValue:e.default||``,required:!!e.required})]},e.key))}),(0,j.jsx)(`div`,{className:`action-card__footer`,children:(0,j.jsx)(yr,{type:`submit`,children:`执行`})})]})]},e.id))})]})}function Dr(){let{state:e}=qn();return(0,j.jsxs)(`section`,{className:`output-panel`,children:[(0,j.jsxs)(`header`,{className:`output-panel__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:e.output.title}),(0,j.jsx)(`p`,{children:e.output.command})]}),(0,j.jsxs)(`span`,{className:e.output.exitCode===0?`status-pill status-pill--ok`:`status-pill status-pill--error`,children:[`exit `,e.output.exitCode]})]}),(0,j.jsx)(`pre`,{className:`output-panel__body`,children:e.output.body})]})}function Or(){let{state:e,switchRepo:t}=qn(),[n,r]=(0,l.useState)(``),i=n||e.repoPath;return(0,j.jsxs)(`section`,{className:`workspace-panel`,children:[(0,j.jsxs)(`header`,{children:[(0,j.jsx)(`h2`,{children:`Workspace`}),(0,j.jsx)(`p`,{children:e.busy?`运行中...`:`准备就绪`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row`,children:[(0,j.jsx)(wr,{value:i,onChange:e=>r(e.target.value),placeholder:`/path/to/repository`}),(0,j.jsx)(yr,{variant:`primary`,onClick:()=>void t(i),children:`切换仓库`})]}),(0,j.jsx)(`p`,{className:`workspace-panel__status`,children:e.repoStatus})]})}var kr=`data:image/svg+xml,%3csvg%20width='512'%20height='512'%20viewBox='0%200%20512%20512'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20role='img'%20aria-label='fastgit%20logo%20icon'%3e%3cdefs%3e%3clinearGradient%20id='bg'%20x1='72'%20y1='56'%20x2='448'%20y2='456'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%233C679F'/%3e%3cstop%20offset='1'%20stop-color='%231F2D44'/%3e%3c/linearGradient%3e%3clinearGradient%20id='stroke'%20x1='136'%20y1='152'%20x2='376'%20y2='360'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F0F3F8'/%3e%3cstop%20offset='1'%20stop-color='%23D6DFEF'/%3e%3c/linearGradient%3e%3c/defs%3e%3crect%20x='56'%20y='56'%20width='400'%20height='400'%20rx='96'%20fill='url(%23bg)'/%3e%3cpath%20d='M168%20336V208C168%20194.745%20178.745%20184%20192%20184H320C333.255%20184%20344%20194.745%20344%20208V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M256%20184V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'/%3e%3ccircle%20cx='168'%20cy='336'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='344'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='184'%20r='30'%20fill='%23E8EDF4'/%3e%3c/svg%3e`;function Ar(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??`workspace`}function jr(){let{state:e,addModuleTab:t,closeModuleTab:n,closeOtherModuleTabs:r,closeTabsToRight:i,reorderModuleTabs:a,setSelectedModule:o}=qn(),s=Ar(e.repoPath),[c,u]=(0,l.useState)(null),[d,f]=(0,l.useState)(null),[p,m]=(0,l.useState)(null),h=e.openedModuleIds.map(t=>e.modules.find(e=>e.id===t)).filter(e=>e!==void 0),g=h.length,_=(0,l.useMemo)(()=>p?h.find(e=>e.id===p.moduleId)??null:null,[p,h]),v=_?h.findIndex(e=>e.id===_.id):-1,y=g>1,b=v>=0&&v{let e=()=>m(null),t=e=>{e.key===`Escape`&&m(null)};return window.addEventListener(`pointerdown`,e),window.addEventListener(`keydown`,t),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,t)}},[]);let x=(e,t)=>{u(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t)},ee=(e,t)=>{e.preventDefault(),c&&c!==t&&f(t)},S=(e,t)=>{e.preventDefault(),!(!c||c===t)&&(a(c,t),f(null),u(null))},C=(e,t)=>{e.preventDefault(),e.stopPropagation(),m({x:e.clientX,y:e.clientY,moduleId:t})},te=e=>{e(),m(null)};return(0,j.jsxs)(`header`,{className:`tabs-header app-drag-region`,children:[(0,j.jsxs)(`div`,{className:`tabs-repo app-no-drag-region`,children:[(0,j.jsx)(`img`,{className:`tabs-repo__logo`,src:kr,alt:`fastgit logo`}),(0,j.jsx)(`span`,{children:s})]}),(0,j.jsx)(`div`,{className:`tabs-track app-no-drag-region`,children:h.map(t=>{let r=e.selectedModuleId===t.id;return(0,j.jsxs)(`div`,{className:[`tabs-track__item`,r?`tabs-track__item--active`:``,d===t.id?`tabs-track__item--drag-over`:``].filter(Boolean).join(` `),onClick:()=>o(t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o(t.id))},onContextMenu:e=>C(e,t.id),draggable:g>1,onDragStart:e=>x(e,t.id),onDragOver:e=>ee(e,t.id),onDrop:e=>S(e,t.id),onDragEnd:()=>{u(null),f(null)},role:`button`,tabIndex:0,"aria-label":`switch to ${t.title}`,"aria-pressed":r,children:[(0,j.jsx)(`span`,{children:t.title}),(0,j.jsx)(`button`,{className:`tabs-track__close`,onClick:e=>{e.stopPropagation(),n(t.id)},onContextMenu:e=>C(e,t.id),type:`button`,"aria-label":`close ${t.title}`,children:(0,j.jsx)(_r,{size:13})})]},t.id)})}),(0,j.jsx)(`button`,{className:`tabs-add app-no-drag-region`,onClick:t,type:`button`,"aria-label":`new tab`,children:(0,j.jsx)(mr,{size:14})}),p&&_&&(0,j.jsxs)(`div`,{className:`tabs-menu app-no-drag-region`,style:{left:`${p.x}px`,top:`${p.y}px`},onPointerDown:e=>e.stopPropagation(),children:[(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>n(_.id)),disabled:!y,children:`关闭标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>r(_.id)),disabled:!y,children:`关闭其他标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>i(_.id)),disabled:!b,children:`关闭右侧标签`})]})]})}function Mr(){let{state:e,setModulePaneWidth:t}=qn(),[n,r]=(0,l.useState)(!1),i=n=>{if(window.innerWidth<=900||e.modulePaneCollapsed)return;r(!0);let i=n.clientX,a=e.modulePaneWidth,o=e=>{t(a+(e.clientX-i))},s=()=>{r(!1),window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s)},a={"--module-pane-width":`${e.modulePaneWidth}px`};return(0,j.jsxs)(`main`,{className:`desktop-shell`,children:[(0,j.jsx)(jr,{}),(0,j.jsxs)(`section`,{className:[`desktop-body`,n?`desktop-body--dragging`:``,e.modulePaneCollapsed?`desktop-body--pane-collapsed`:``].filter(Boolean).join(` `),style:a,children:[(0,j.jsx)(Cr,{}),(0,j.jsxs)(`div`,{className:`module-pane-wrap`,children:[(0,j.jsx)(xr,{}),(0,j.jsx)(`div`,{className:`module-pane-resizer`,onMouseDown:i,role:`separator`,"aria-orientation":`vertical`,"aria-label":`resize sidebar`})]}),(0,j.jsxs)(`div`,{className:`desktop-main`,children:[(0,j.jsx)(Or,{}),(0,j.jsx)(Er,{}),(0,j.jsx)(Dr,{})]})]})]})}function Nr(){let{refresh:e}=qn();return(0,l.useEffect)(()=>{e()},[e]),(0,j.jsx)(Mr,{})}function Pr(){return(0,j.jsx)(tr,{children:(0,j.jsx)(Nr,{})})}var Fr=document.getElementById(`app`);if(!Fr)throw Error(`#app not found`);(0,u.createRoot)(Fr).render((0,j.jsx)(l.StrictMode,{children:(0,j.jsx)(Pr,{})})); \ No newline at end of file diff --git a/desktop/frontend/dist/assets/index-DDjpz5O3.css b/desktop/frontend/dist/assets/index-DDjpz5O3.css new file mode 100644 index 0000000..0fdd3f8 --- /dev/null +++ b/desktop/frontend/dist/assets/index-DDjpz5O3.css @@ -0,0 +1 @@ +@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e1e7ef;--bg-main:#edf2f8;--bg-topbar:#e3e8f0;--bg-topbar-active:#f1f4f9;--bg-pane:#e3e7ef;--bg-pane-hover:#dce3ed;--bg-card:#eef2f7;--bg-card-soft:#dfe5ee;--bg-input:#edf1f6;--bg-output:#e7edf6;--text-1:#1f2d44;--text-2:#5d708d;--text-3:#8b9ab0;--text-inverse:#fff;--text-output:#1f2d44;--line:#bfcbdb;--line-strong:#adbbd1;--line-output:#b5c4d8;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--brand-soft:#4f7fc41f;--brand-soft-strong:#4f7fc42e;--brand-line:#4f7fc485;--brand-line-strong:#4f7fc47a;--ok:#1b9b4a;--error:#d83f57;--ok-soft:#1b9b4a14;--ok-line:#1b9b4a40;--error-soft:#d83f5714;--error-line:#d83f5740;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14;--shadow-menu:0 8px 20px #131f322e;--highlight-stroke:#ffffff57}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-repo__logo{flex:0 0 14px;width:14px;height:14px;display:block}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{border-color:var(--brand-line);background:var(--brand-soft)}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;margin-left:auto;display:inline-flex}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);min-width:150px;box-shadow:var(--shadow-menu);border-radius:10px;gap:3px;padding:6px;display:grid;position:fixed}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line);background:var(--bg-pane);color:var(--text-2);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;font-weight:600;display:grid}.sidebar-menu-panel__item:hover{color:var(--text-1);background:var(--bg-pane-hover)}.sidebar-menu-panel__item--active{color:var(--text-1);background:var(--bg-card-soft);box-shadow:inset 0 0 0 1px var(--line-strong)}.sidebar-menu-panel__footer{border-top:1px solid var(--line);color:var(--text-2);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{border-color:var(--line-strong);width:36px;height:32px;color:var(--text-2);padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:var(--brand-line-strong)}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:auto 1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.workspace-panel,.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 var(--highlight-stroke), var(--shadow-card);padding:12px}.workspace-panel header{justify-content:space-between;align-items:baseline;margin-bottom:8px;display:flex}.workspace-panel h2{font-size:14px}.workspace-panel header p,.workspace-panel__status{color:var(--text-2);font-size:12px}.workspace-panel__row{gap:8px;display:flex}.workspace-panel__status{margin-top:8px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto auto}}@media (width<=640px){.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);box-shadow:0 1px 0 var(--highlight-stroke);gap:10px;padding:12px;animation:.24s both rise-in;display:grid}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button--primary{color:var(--text-inverse);background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft-strong);outline:none}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-line)}.status-pill--error{color:var(--error);background:var(--error-soft);border-color:var(--error-line)}.output-panel__body{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);min-height:180px;max-height:30vh;color:var(--text-output);margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto} diff --git a/desktop/frontend/dist/index.html b/desktop/frontend/dist/index.html index 7b76ba8..edabb44 100644 --- a/desktop/frontend/dist/index.html +++ b/desktop/frontend/dist/index.html @@ -4,8 +4,8 @@ fastgit desktop - - + +
diff --git a/desktop/frontend/src/assets/brand/fastgit-logo-icon.svg b/desktop/frontend/src/assets/brand/fastgit-logo-icon.svg new file mode 100644 index 0000000..205e3fb --- /dev/null +++ b/desktop/frontend/src/assets/brand/fastgit-logo-icon.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/desktop/frontend/src/features/workspace/top-tabs.tsx b/desktop/frontend/src/features/workspace/top-tabs.tsx index 9e2b0fe..9f8ab32 100644 --- a/desktop/frontend/src/features/workspace/top-tabs.tsx +++ b/desktop/frontend/src/features/workspace/top-tabs.tsx @@ -1,8 +1,9 @@ import { useEffect, useMemo, useState } from "react"; import type { DragEvent, MouseEvent } from "react"; -import { FolderGit2, Plus, X } from "lucide-react"; +import { Plus, X } from "lucide-react"; import { useAppContext } from "../../app/providers/app-context"; +import logoIcon from "../../assets/brand/fastgit-logo-icon.svg"; function basename(path: string): string { const parts = path.split(/[\\/]/).filter(Boolean); @@ -94,7 +95,7 @@ export function TopTabs() { return (
- + fastgit logo {repoName}
diff --git a/desktop/frontend/src/styles/forms.css b/desktop/frontend/src/styles/forms.css index 85d5184..93da46f 100644 --- a/desktop/frontend/src/styles/forms.css +++ b/desktop/frontend/src/styles/forms.css @@ -24,7 +24,7 @@ .ui-button--primary { border-color: transparent; - color: #fff; + color: var(--text-inverse); background: var(--brand); } @@ -54,7 +54,7 @@ .ui-input:focus { outline: none; border-color: var(--brand); - box-shadow: 0 0 0 3px rgba(79, 127, 196, 0.18); + box-shadow: 0 0 0 3px var(--brand-soft-strong); } .action-field { diff --git a/desktop/frontend/src/styles/layout.css b/desktop/frontend/src/styles/layout.css index c1b913b..ad1b4ae 100644 --- a/desktop/frontend/src/styles/layout.css +++ b/desktop/frontend/src/styles/layout.css @@ -28,6 +28,13 @@ white-space: nowrap; } +.tabs-repo__logo { + width: 14px; + height: 14px; + flex: 0 0 14px; + display: block; +} + .tabs-track { display: flex; align-items: stretch; @@ -68,8 +75,8 @@ } .tabs-track__item--drag-over { - border-color: rgba(79, 127, 196, 0.52); - background: rgba(79, 127, 196, 0.12); + border-color: var(--brand-line); + background: var(--brand-soft); } .tabs-track__close { @@ -112,7 +119,7 @@ border: 1px solid var(--line); border-radius: 10px; background: var(--bg-topbar-active); - box-shadow: 0 8px 20px rgba(19, 31, 50, 0.18); + box-shadow: var(--shadow-menu); padding: 6px; display: grid; gap: 3px; @@ -165,9 +172,9 @@ } .sidebar-menu-panel { - border-right: 1px solid var(--line-dark); - background: var(--bg-sidebar); - color: var(--text-on-dark); + border-right: 1px solid var(--line); + background: var(--bg-pane); + color: var(--text-2); display: grid; grid-template-rows: 1fr auto; min-height: 0; @@ -187,7 +194,7 @@ border: 0; border-radius: 12px; background: transparent; - color: var(--sidebar-icon); + color: var(--text-2); display: grid; justify-items: center; align-content: center; @@ -198,23 +205,23 @@ } .sidebar-menu-panel__item:hover { - color: var(--sidebar-icon-hover); + color: var(--text-1); background: var(--bg-pane-hover); } .sidebar-menu-panel__item--active { - color: var(--sidebar-icon-hover); - background: var(--sidebar-active-bg); - box-shadow: inset 0 0 0 1px var(--sidebar-active-border); + color: var(--text-1); + background: var(--bg-card-soft); + box-shadow: inset 0 0 0 1px var(--line-strong); } .sidebar-menu-panel__footer { - border-top: 1px solid var(--line-dark); + border-top: 1px solid var(--line); padding: 10px 8px; display: grid; justify-items: center; gap: 6px; - color: var(--sidebar-footer); + color: var(--text-2); font-size: 11px; } @@ -246,7 +253,7 @@ } .module-pane-resizer:hover { - background: rgba(79, 127, 196, 0.48); + background: var(--brand-line-strong); } .module-pane__header { @@ -344,7 +351,7 @@ border: 1px solid var(--line); border-radius: var(--radius-xl); background: var(--bg-card); - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.34), var(--shadow-card); + box-shadow: 0 1px 0 var(--highlight-stroke), var(--shadow-card); padding: 12px; } @@ -397,7 +404,7 @@ .sidebar-menu-panel { border-right: 0; - border-bottom: 1px solid var(--line-dark); + border-bottom: 1px solid var(--line); grid-template-rows: auto; grid-template-columns: 1fr auto; align-items: center; @@ -418,7 +425,7 @@ .sidebar-menu-panel__footer { border-top: 0; - border-left: 1px solid var(--line-dark); + border-left: 1px solid var(--line); padding: 8px; grid-auto-flow: column; align-items: center; diff --git a/desktop/frontend/src/styles/modules.css b/desktop/frontend/src/styles/modules.css index 8fd81ca..79f4b33 100644 --- a/desktop/frontend/src/styles/modules.css +++ b/desktop/frontend/src/styles/modules.css @@ -37,7 +37,7 @@ padding: 12px; display: grid; gap: 10px; - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.32); + box-shadow: 0 1px 0 var(--highlight-stroke); animation: rise-in 0.24s ease both; } diff --git a/desktop/frontend/src/styles/output.css b/desktop/frontend/src/styles/output.css index af721eb..21590ca 100644 --- a/desktop/frontend/src/styles/output.css +++ b/desktop/frontend/src/styles/output.css @@ -35,14 +35,14 @@ .status-pill--ok { color: var(--ok); - background: rgba(27, 155, 74, 0.08); - border-color: rgba(27, 155, 74, 0.25); + background: var(--ok-soft); + border-color: var(--ok-line); } .status-pill--error { color: var(--error); - background: rgba(216, 63, 87, 0.08); - border-color: rgba(216, 63, 87, 0.25); + background: var(--error-soft); + border-color: var(--error-line); } .output-panel__body { @@ -50,10 +50,10 @@ min-height: 180px; max-height: 30vh; overflow: auto; - border: 1px solid #202d42; + border: 1px solid var(--line-output); border-radius: var(--radius-lg); - background: #0f1725; - color: #d4dff2; + background: var(--bg-output); + color: var(--text-output); padding: 11px; font-family: "JetBrains Mono", "SF Mono", Menlo, monospace; font-size: 12px; diff --git a/desktop/frontend/src/styles/tokens.css b/desktop/frontend/src/styles/tokens.css index 980b148..ad01d6d 100644 --- a/desktop/frontend/src/styles/tokens.css +++ b/desktop/frontend/src/styles/tokens.css @@ -2,42 +2,47 @@ --font-heading: "Sora", "Avenir Next", sans-serif; --font-body: "Manrope", "PingFang SC", "Segoe UI", sans-serif; - --bg-app: #e0e5ed; - --bg-main: #edf1f6; + --bg-app: #e1e7ef; + --bg-main: #edf2f8; --bg-topbar: #e3e8f0; - --bg-topbar-active: #f0f3f8; - --bg-sidebar: #dde3ec; - --bg-sidebar-soft: #e5eaf2; + --bg-topbar-active: #f1f4f9; --bg-pane: #e3e7ef; - --bg-pane-hover: #dbe2ec; + --bg-pane-hover: #dce3ed; --bg-card: #eef2f7; - --bg-card-soft: #dde3ed; + --bg-card-soft: #dfe5ee; --bg-input: #edf1f6; + --bg-output: #e7edf6; --text-1: #1f2d44; - --text-2: #5f708b; + --text-2: #5d708d; --text-3: #8b9ab0; - --text-on-dark: #5f708b; - --sidebar-icon: #667b99; - --sidebar-icon-hover: #1f2d44; - --sidebar-footer: #7388a6; - --sidebar-active-bg: rgba(79, 127, 196, 0.16); - --sidebar-active-border: rgba(147, 175, 220, 0.52); + --text-inverse: #ffffff; + --text-output: #1f2d44; --line: #bfcbdb; --line-strong: #adbbd1; - --line-dark: #b8c4d6; + --line-output: #b5c4d8; --brand: #4f7fc4; --brand-strong: #3c679f; --accent: #13ad9f; + --brand-soft: rgba(79, 127, 196, 0.12); + --brand-soft-strong: rgba(79, 127, 196, 0.18); + --brand-line: rgba(79, 127, 196, 0.52); + --brand-line-strong: rgba(79, 127, 196, 0.48); --ok: #1b9b4a; --error: #d83f57; + --ok-soft: rgba(27, 155, 74, 0.08); + --ok-line: rgba(27, 155, 74, 0.25); + --error-soft: rgba(216, 63, 87, 0.08); + --error-line: rgba(216, 63, 87, 0.25); --radius-xl: 14px; --radius-lg: 11px; --radius-md: 9px; --shadow-card: 0 8px 26px rgba(18, 28, 44, 0.08); + --shadow-menu: 0 8px 20px rgba(19, 31, 50, 0.18); + --highlight-stroke: rgba(255, 255, 255, 0.34); } diff --git a/desktop/main.go b/desktop/main.go index 9259cee..56eb69c 100644 --- a/desktop/main.go +++ b/desktop/main.go @@ -10,12 +10,16 @@ import ( //go:embed all:frontend/dist var assets embed.FS +//go:embed assets/fastgit-icon.png +var appIcon []byte + func main() { svc := NewFastgitService() app := application.New(application.Options{ Name: "fastgit-desktop", Description: "Desktop client for fastgit", + Icon: appIcon, Services: []application.Service{ application.NewService(svc), }, From e10986306e241d202f50c99e048212500422f0f6 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 30 Jun 2026 11:51:50 +0800 Subject: [PATCH 07/16] Remove stale frontend bundle asset --- .../frontend/dist/assets/index-4urArxMX.js | 14 ++ .../frontend/dist/assets/index-BvrVHuHl.css | 1 + .../frontend/dist/assets/index-DAwICAMZ.js | 14 -- .../frontend/dist/assets/index-DDjpz5O3.css | 1 - desktop/frontend/dist/index.html | 4 +- desktop/frontend/src/app/app.tsx | 7 +- .../frontend/src/app/providers/app-context.ts | 4 +- .../src/app/providers/app-provider.tsx | 223 +++++++++++++----- desktop/frontend/src/app/types.ts | 1 + .../src/features/workspace/repo-switcher.tsx | 134 ++++++++++- .../src/features/workspace/top-tabs.tsx | 109 ++++++++- .../frontend/src/layouts/desktop-layout.tsx | 2 - desktop/frontend/src/lib/persistence.ts | 18 +- desktop/frontend/src/styles/forms.css | 13 + desktop/frontend/src/styles/layout.css | 187 ++++++++++++++- 15 files changed, 616 insertions(+), 116 deletions(-) create mode 100644 desktop/frontend/dist/assets/index-4urArxMX.js create mode 100644 desktop/frontend/dist/assets/index-BvrVHuHl.css delete mode 100644 desktop/frontend/dist/assets/index-DAwICAMZ.js delete mode 100644 desktop/frontend/dist/assets/index-DDjpz5O3.css diff --git a/desktop/frontend/dist/assets/index-4urArxMX.js b/desktop/frontend/dist/assets/index-4urArxMX.js new file mode 100644 index 0000000..bdfe51f --- /dev/null +++ b/desktop/frontend/dist/assets/index-4urArxMX.js @@ -0,0 +1,14 @@ +var e=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports);(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function S(){}var C={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function ne(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return ne(e.type,t,e.props)}function w(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ie(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ae=/\/+/g;function oe(e,t){return typeof e==`object`&&e&&e.key!=null?ie(``+e.key):t.toString(36)}function se(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(S,S):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ce(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ce(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+oe(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(ae,`$&/`)+`/`),ce(o,r,i,``,function(e){return e})):o!=null&&(w(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ae,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{n.exports=t()})),r=e((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,w());else{var t=n(l);t!==null&&oe(x,t.startTime-e)}}var ee=!1,S=-1,C=5,te=-1;function ne(){return g?!0:!(e.unstable_now()-tet&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&oe(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?w():ee=!1}}}var w;if(typeof y==`function`)w=function(){y(re)};else if(typeof MessageChannel<`u`){var ie=new MessageChannel,ae=ie.port2;ie.port1.onmessage=re,w=function(){ae.postMessage(null)}}else w=function(){_(re,0)};function oe(t,n){S=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(S),S=-1):h=!0,oe(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,w()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),i=e(((e,t)=>{t.exports=r()})),a=e((e=>{var t=n();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=e((e=>{var t=i(),r=n(),a=o();function s(e){var t=`https://react.dev/errors/`+e;if(1pe||(e.current=fe[pe],fe[pe]=null,pe--)}function O(e,t){pe++,fe[pe]=e.current,e.current=t}var he=me(null),ge=me(null),_e=me(null),ve=me(null);function ye(e,t){switch(O(_e,t),O(ge,e),O(he,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}D(he),O(he,e)}function be(){D(he),D(ge),D(_e)}function xe(e){e.memoizedState!==null&&O(ve,e);var t=he.current,n=Hd(t,e.type);t!==n&&(O(ge,e),O(he,n))}function Se(e){ge.current===e&&(D(he),D(ge)),ve.current===e&&(D(ve),Qf._currentValue=de)}var Ce,we;function Te(e){if(Ce===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Ce=t&&t[1]||``,we=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ee=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Te(n):``}function Oe(e,t){switch(e.tag){case 26:case 27:case 5:return Te(e.type);case 16:return Te(`Lazy`);case 13:return e.child!==t&&t!==null?Te(`Suspense Fallback`):Te(`Suspense`);case 19:return Te(`SuspenseList`);case 0:case 15:return De(e.type,!1);case 11:return De(e.type.render,!1);case 1:return De(e.type,!0);case 31:return Te(`Activity`);default:return``}}function ke(e){try{var t=``,n=null;do t+=Oe(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var Ae=Object.prototype.hasOwnProperty,je=t.unstable_scheduleCallback,Me=t.unstable_cancelCallback,Ne=t.unstable_shouldYield,Pe=t.unstable_requestPaint,Fe=t.unstable_now,Ie=t.unstable_getCurrentPriorityLevel,Le=t.unstable_ImmediatePriority,Re=t.unstable_UserBlockingPriority,ze=t.unstable_NormalPriority,Be=t.unstable_LowPriority,Ve=t.unstable_IdlePriority,He=t.log,Ue=t.unstable_setDisableYieldValue,We=null,Ge=null;function Ke(e){if(typeof He==`function`&&Ue(e),Ge&&typeof Ge.setStrictMode==`function`)try{Ge.setStrictMode(We,e)}catch{}}var qe=Math.clz32?Math.clz32:Xe,Je=Math.log,Ye=Math.LN2;function Xe(e){return e>>>=0,e===0?32:31-(Je(e)/Ye|0)|0}var Ze=256,Qe=262144,$e=4194304;function et(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function tt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=et(n))):i=et(o):i=et(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=et(n))):i=et(o)):i=et(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function nt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function rt(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function it(){var e=$e;return $e<<=1,!($e&62914560)&&($e=4194304),e}function at(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function ot(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function st(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),yn=!1;if(vn)try{var bn={};Object.defineProperty(bn,"passive",{get:function(){yn=!0}}),window.addEventListener(`test`,bn,bn),window.removeEventListener(`test`,bn,bn)}catch{yn=!1}var xn=null,Sn=null,Cn=null;function wn(){if(Cn)return Cn;var e,t=Sn,n=t.length,r,i=`value`in xn?xn.value:xn.textContent,a=i.length;for(e=0;e=er),rr=` `,ir=!1;function ar(e,t){switch(e){case`keyup`:return Qn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function or(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var sr=!1;function cr(e,t){switch(e){case`compositionend`:return or(t);case`keypress`:return t.which===32?(ir=!0,rr):null;case`textInput`:return e=t.data,e===rr&&ir?null:e;default:return null}}function lr(e,t){if(sr)return e===`compositionend`||!$n&&ar(e,t)?(e=wn(),Cn=Sn=xn=null,sr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=jr(n)}}function Nr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Nr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Pr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Gt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Gt(e.document)}return t}function Fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Ir=vn&&`documentMode`in document&&11>=document.documentMode,Lr=null,Rr=null,zr=null,Br=!1;function Vr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Br||Lr==null||Lr!==Gt(r)||(r=Lr,`selectionStart`in r&&Fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),zr&&Ar(zr,r)||(zr=r,r=Ed(Rr,`onSelect`),0>=o,i-=o,Ni=1<<32-qe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),o=a(_,o,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),N&&Fi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),o=a(y,o,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),N&&Fi(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return N&&Fi(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),N&&Fi(i,g),u}function b(e,r,a,c){if(typeof a==`object`&&a&&a.type===y&&a.key===null&&(a=a.props.children),typeof a==`object`&&a){switch(a.$$typeof){case _:a:{for(var l=a.key;r!==null;){if(r.key===l){if(l=a.type,l===y){if(r.tag===7){n(e,r.sibling),c=i(r,a.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===w&&Na(l)===r.type){n(e,r.sibling),c=i(r,a.props),Ba(c,a),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}a.type===y?(c=bi(a.props.children,e.mode,c,a.key),c.return=e,e=c):(c=yi(a.type,a.key,a.props,null,e.mode,c),Ba(c,a),c.return=e,e=c)}return o(e);case v:a:{for(l=a.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),c=i(r,a.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=Ci(a,e.mode,c),c.return=e,e=c}return o(e);case w:return a=Na(a),b(e,r,a,c)}if(ue(a))return h(e,r,a,c);if(se(a)){if(l=se(a),typeof l!=`function`)throw Error(s(150));return a=l.call(a),g(e,r,a,c)}if(typeof a.then==`function`)return b(e,r,za(a),c);if(a.$$typeof===S)return b(e,r,ca(e,a),c);Va(e,a)}return typeof a==`string`&&a!==``||typeof a==`number`||typeof a==`bigint`?(a=``+a,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,a),c.return=e,e=c):(n(e,r),c=xi(a,e.mode,c),c.return=e,e=c),o(e)):n(e,r)}return function(e,t,n,r){try{Ra=0;var i=b(e,t,n,r);return La=null,i}catch(t){if(t===Da||t===ka)throw t;var a=hi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ua=Ha(!0),Wa=Ha(!1),Ga=!1;function Ka(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function qa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ja(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ya(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=fi(e),di(e,null,n),t}return ci(e,r,t,n),fi(e)}function Xa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,lt(e,n)}}function Za(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Qa=!1;function $a(){if(Qa){var e=va;if(e!==null)throw e}}function eo(e,t,n,r){Qa=!1;var i=e.updateQueue;Ga=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===_a&&(Qa=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ga=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function to(e,t){if(typeof e!=`function`)throw Error(s(191,e));e.call(t)}function no(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=T.T,s={};T.T=s,Ls(e,!1,t,n);try{var c=i(),l=T.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Is(e,t,xa(c,r),pu(e)):Is(e,t,r,pu(e))}catch(n){Is(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{E.p=a,o!==null&&s.types!==null&&(o.types=s.types),T.T=o}}function Es(){}function Ds(e,t,n,r){if(e.tag!==5)throw Error(s(476));var i=Os(e).queue;Ts(e,i,t,de,n===null?Es:function(){return ks(e),n(r)})}function Os(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:de,baseState:de,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ro,lastRenderedState:de},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ro,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ks(e){var t=Os(e);t.next===null&&(t=e.alternate.memoizedState),Is(e,t.next.queue,{},pu())}function As(){return sa(Qf)}function js(){return B().memoizedState}function Ms(){return B().memoizedState}function Ns(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ja(n);var r=Ya(t,e,n);r!==null&&(hu(r,t,n),Xa(r,t,n)),t={cache:pa()},e.payload=t;return}t=t.return}}function Ps(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Rs(e)?zs(t,n):(n=li(e,t,n,r),n!==null&&(hu(n,e,r),Bs(n,t,r)))}function Fs(e,t,n){Is(e,t,n,pu())}function Is(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Rs(e))zs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,kr(s,o))return ci(e,t,i,0),K===null&&si(),!1}catch{}if(n=li(e,t,i,r),n!==null)return hu(n,e,r),Bs(n,t,r),!0}return!1}function Ls(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Rs(e)){if(t)throw Error(s(479))}else t=li(e,n,r,2),t!==null&&hu(t,e,2)}function Rs(e){var t=e.alternate;return e===I||t!==null&&t===I}function zs(e,t){yo=vo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Bs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,lt(e,n)}}var Vs={readContext:sa,use:Io,useCallback:z,useContext:z,useEffect:z,useImperativeHandle:z,useLayoutEffect:z,useInsertionEffect:z,useMemo:z,useReducer:z,useRef:z,useState:z,useDebugValue:z,useDeferredValue:z,useTransition:z,useSyncExternalStore:z,useId:z,useHostTransitionStatus:z,useFormState:z,useActionState:z,useOptimistic:z,useMemoCache:z,useCacheRefresh:z};Vs.useEffectEvent=z;var Hs={readContext:sa,use:Io,useCallback:function(e,t){return No().memoizedState=[e,t===void 0?null:t],e},useContext:sa,useEffect:fs,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),us(4194308,4,vs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return us(4194308,4,e,t)},useInsertionEffect:function(e,t){us(4,2,e,t)},useMemo:function(e,t){var n=No();t=t===void 0?null:t;var r=e();if(bo){Ke(!0);try{e()}finally{Ke(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=No();if(n!==void 0){var i=n(t);if(bo){Ke(!0);try{n(t)}finally{Ke(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ps.bind(null,I,e),[r.memoizedState,e]},useRef:function(e){var t=No();return e={current:e},t.memoizedState=e},useState:function(e){e=Jo(e);var t=e.queue,n=Fs.bind(null,I,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:bs,useDeferredValue:function(e,t){return Cs(No(),e,t)},useTransition:function(){var e=Jo(!1);return e=Ts.bind(null,I,e.queue,!0,!1),No().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=I,i=No();if(N){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),K===null)throw Error(s(349));J&127||Uo(r,t,n)}i.memoizedState=n;var a={value:n,getSnapshot:t};return i.queue=a,fs(Go.bind(null,r,a,e),[e]),r.flags|=2048,cs(9,{destroy:void 0},Wo.bind(null,r,a,n,t),null),n},useId:function(){var e=No(),t=K.identifierPrefix;if(N){var n=Pi,r=Ni;n=(r&~(1<<32-qe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=xo++,0<\/script>`,a=a.removeChild(a.firstChild);break;case`select`:a=typeof r.is==`string`?o.createElement(`select`,{is:r.is}):o.createElement(`select`),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=typeof r.is==`string`?o.createElement(i,{is:r.is}):o.createElement(i)}}a[gt]=t,a[_t]=r;a:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)a.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break a;for(;o.sibling===null;){if(o.return===null||o.return===t)break a;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=a;a:switch(Pd(a,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Fc(t)}}return H(t),Ic(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Fc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(s(166));if(e=_e.current,qi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=Bi,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[gt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Wi(t,!0)}else e=Bd(e).createTextNode(r),e[gt]=t,t.stateNode=e}return H(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=qi(t),n!==null){if(e===null){if(!r)throw Error(s(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(s(557));e[gt]=t}else Ji(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;H(t),e=!1}else n=Yi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(ho(t),t):(ho(t),null);if(t.flags&128)throw Error(s(558))}return H(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=qi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(s(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(s(317));i[gt]=t}else Ji(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;H(t),i=!1}else i=Yi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(ho(t),t):(ho(t),null)}return ho(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),a=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Rc(t,t.updateQueue),H(t),null);case 4:return be(),e===null&&Sd(t.stateNode.containerInfo),H(t),null;case 10:return ta(t.type),H(t),null;case 19:if(D(F),r=t.memoizedState,r===null)return H(t),null;if(i=(t.flags&128)!=0,a=r.rendering,a===null)if(i)zc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(a=go(e),a!==null){for(t.flags|=128,zc(r,!1),e=a.updateQueue,t.updateQueue=e,Rc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)vi(n,e),n=n.sibling;return O(F,F.current&1|2),N&&Fi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Fe()>tu&&(t.flags|=128,i=!0,zc(r,!1),t.lanes=4194304)}else{if(!i)if(e=go(a),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Rc(t,e),zc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!a.alternate&&!N)return H(t),null}else 2*Fe()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,i=!0,zc(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(e=r.last,e===null?t.child=a:e.sibling=a,r.last=a)}return r.tail===null?(H(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Fe(),e.sibling=null,n=F.current,O(F,i?n&1|2:n&1),N&&Fi(t,r.treeForkCount),e);case 22:case 23:return ho(t),so(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(H(t),t.subtreeFlags&6&&(t.flags|=8192)):H(t),n=t.updateQueue,n!==null&&Rc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&D(Ca),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),ta(P),H(t),null;case 25:return null;case 30:return null}throw Error(s(156,t.tag))}function Vc(e,t){switch(Ri(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ta(P),be(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Se(t),null;case 31:if(t.memoizedState!==null){if(ho(t),t.alternate===null)throw Error(s(340));Ji()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(ho(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Ji()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return D(F),null;case 4:return be(),null;case 10:return ta(t.type),null;case 22:case 23:return ho(t),so(),e!==null&&D(Ca),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return ta(P),null;case 25:return null;default:return null}}function Hc(e,t){switch(Ri(t),t.tag){case 3:ta(P),be();break;case 26:case 27:case 5:Se(t);break;case 4:be();break;case 31:t.memoizedState!==null&&ho(t);break;case 13:ho(t);break;case 19:D(F);break;case 10:ta(t.type);break;case 22:case 23:ho(t),so(),e!==null&&D(Ca);break;case 24:ta(P)}}function Uc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Wc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Gc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{no(t,n)}catch(t){Z(e,e.return,t)}}}function Kc(e,t,n){n.props=Ys(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function qc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Jc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Yc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Xc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[_t]=t}catch(t){Z(e,e.return,t)}}function Zc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Qc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Zc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=ln));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(el(e,t,n),e=e.sibling;e!==null;)el(e,t,n),e=e.sibling}function tl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[gt]=e,t[_t]=n}catch(t){Z(e,e.return,t)}}var nl=!1,U=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Pr(e),Fr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break a}var o=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||i!==0&&f.nodeType!==3||(c=o+i),f!==a||r!==0&&f.nodeType!==3||(l=o+r),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===i&&(c=o),p===a&&++d===r&&(l=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,a=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(a,r,n),a[gt]=e,Ot(a),r=a;break a;case`link`:var o=Vf(`link`,`href`,i).get(r+(n.href||``));if(o){for(var c=0;cg&&(o=g,g=h,h=o);var _=Mr(s,h),v=Mr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,T.T=null,n=lu,lu=null;var a=au,o=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(s(331));var c=G;if(G|=4,Fl(a.current),Dl(a,a.current,o,n),G=c,id(0,!1),Ge&&typeof Ge.onPostCommitFiberRoot==`function`)try{Ge.onPostCommitFiberRoot(We,a)}catch{}return!0}finally{E.p=i,T.T=r,Vu(e,t)}}function Wu(e,t,n){t=Ti(n,t),t=tc(e.stateNode,t,2),e=Ya(e,t,2),e!==null&&(ot(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=Ti(n,e),n=nc(2),r=Ya(t,n,2),r!==null&&(rc(n,r,t,e),ot(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>Fe()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=it()),e=ui(e,t),e!==null&&(ot(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return je(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-qe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=tt(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||nt(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Fe(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=qt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),Ot(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+qt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+qt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+qt(n.imageSizes)+`"]`)):i+=`[href="`+qt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),Ot(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+qt(r)+`"][href="`+qt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),Ot(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=Dt(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);Ot(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=Dt(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),Ot(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=Dt(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),Ot(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var i=(i=_e.current)?gf(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=Dt(i).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var a=Dt(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(jf(e)))&&!a._p&&(o.instance=a,o.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),a||Nf(i,e,n,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=Dt(i).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Af(e){return`href="`+qt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),Ot(t),e.head.appendChild(t))}function Pf(e){return`[src="`+qt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+qt(n.href)+`"]`);if(r)return t.instance=r,Ot(r),r;var i=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),Ot(r),Pd(r,`style`,i),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Af(n.href);var a=e.querySelector(jf(i));if(a)return t.state.loading|=4,t.instance=a,Ot(a),a;r=Mf(n),(i=mf.get(i))&&Rf(r,i),a=(e.ownerDocument||e).createElement(`link`),Ot(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),t.state.loading|=4,Lf(a,n.precedence,e),t.instance=a;case`script`:return a=Pf(n.src),(i=e.querySelector(Ff(a)))?(t.instance=i,Ot(i),i):(r=n,(i=mf.get(a))&&(r=h({},n),zf(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),Ot(i),Pd(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,Ot(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),Ot(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()})),l=n(),u=c(),d=typeof window<`u`&&typeof document<`u`,f=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function p(e=21){let t=``,n=e|0;for(;n--;)t+=f[Math.random()*64|0];return t}function m(){return window.location.origin+`/wails/runtime`}var h=512*1024,g=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10,IOS:11,Android:12}),_=p(),v=null;function y(e,t=``){return function(n,r=null){return b(e,n,t,r)}}async function b(e,t,n,r){if(v)return v.call(e,t,n,r);let i=new URL(m()),a={object:e,method:t};r!=null&&(a.args=r);let o={"x-wails-client-id":_,"Content-Type":`application/json`};n&&(o[`x-wails-window-name`]=n);let s=JSON.stringify(a),c;if(c=s.length>h?await x(i,o,s):await fetch(i,{method:`POST`,headers:o,body:s}),!c.ok)throw Error(await c.text());return(c.headers.get(`Content-Type`)?.indexOf(`application/json`)??-1)===-1?c.text():c.json()}async function x(e,t,n){let r=p(),i=new TextEncoder().encode(n),a=Math.ceil(i.length/h);for(let n=0;n{let i=e.get(t);if(i){if(e.delete(t),r){i.reject(Error(r));return}try{let e=JSON.parse(n??`{}`);if(!e.ok){i.reject(Error(e.error??`unknown runtime call error`));return}i.resolve(`text`in e?e.text:e.data)}catch(e){i.reject(e)}}},v={call(t,n,r,i){return new Promise((a,o)=>{let s=p();e.set(s,{resolve:a,reject:o});try{ee.invokeAsync(s,JSON.stringify({object:t,method:n,windowName:r,args:i??null,clientId:_}))}catch(t){e.delete(s),o(t)}})}}}g.System;var S=(function(){try{if(window.chrome?.webview?.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if(window.webkit?.messageHandlers?.external?.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external);if(window.wails?.invoke)return e=>window.wails.invoke(typeof e==`string`?e:JSON.stringify(e))}catch{}return console.warn(` +%c⚠️ Browser Environment Detected %c + +%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. +More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development +`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function C(e){S?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function re(){return!!window._wails?.environment?.Debug}function w(){return new MouseEvent(`mousedown`).buttons===0}function ie(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}d&&document.addEventListener(`DOMContentLoaded`,()=>{}),d&&window.addEventListener(`contextmenu`,ce);var ae=y(g.ContextMenu),oe=0;function se(e,t,n,r){ae(oe,{id:e,x:t,y:n,data:r})}function ce(e){let t=ie(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);se(n,e.clientX,e.clientY,r)}else le(e,t)}function le(e,t){if(re())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{de=e,de||(fe=pe=!1,De())});var ge=!1;function _e(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function ve(){if(!ge&&!_e()){window.addEventListener(`mousedown`,Ce,{capture:!0}),window.addEventListener(`mousemove`,Ce,{capture:!0}),window.addEventListener(`mouseup`,Ce,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,ye,{capture:!0});ge=!0}}if(d){ve(),document.addEventListener(`DOMContentLoaded`,ve,{once:!0});let e=0,t=window.setInterval(()=>{if(ge){window.clearInterval(t);return}ve(),++e>100&&window.clearInterval(t)},50)}function ye(e){(E||pe)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var be=0,xe=1,Se=2;function Ce(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=be,he||(n=O|1<{n=e,r=t}),this.constructor[et]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[Qe]:{configurable:!1,enumerable:!1,writable:!0,value:null},[$e]:{configurable:!1,enumerable:!1,writable:!1,value:nt(i,a)}});let o=it(i,a);try{e(rt(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[$e](new Xe(`Promise cancelled.`,{cause:t})),lt(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(Ye(t)||(t=ot),Ye(n)||(n=st),t===ot&&n==st)return new e(e=>e(this));let i={};return this[Qe]=i,new e((e,r)=>{super.then(n=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return Ye(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[et](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>at(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>at(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>at(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>at(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function nt(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new Ze(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new Ze(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function rt(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(Ye(r)){try{let r=n.cancel;if(Ye(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?nt(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=it(e,i);try{Reflect.apply(r,n,[rt(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function it(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof Xe&&t.reason instanceof Xe&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new Ze(e.promise,n))}else t.settled=!0,e.reject(n)}}function at(e,t,n){let r=[];for(let i of t){let t;try{if(!Ye(i.then)||(t=i.cancel,!Ye(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new Ze(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new Ze(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function ot(e){return e}function st(e){throw e}function ct(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function lt(e){let t=e[Qe]??{};return`promise`in t||Object.assign(t,ut()),e[Qe]??(t.resolve(),e[Qe]=t),t.promise}var ut=Promise.withResolvers;ut=ut&&typeof ut==`function`?ut.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},d&&(window._wails=window._wails||{});var dt=y(g.Call),ft=y(g.CancelCall),pt=new Map,mt=0,ht=0;function gt(){let e;do e=p();while(pt.has(e));return e}function _t(e){let t=gt(),n=tt.withResolvers();pt.set(t,{resolve:n.resolve,reject:n.reject});let r=dt(mt,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,pt.delete(t),n.resolve(e)},e=>{i=!1,pt.delete(t),n.reject(e)});let a=()=>(pt.delete(t),ft(ht,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function vt(e,...t){return _t({methodID:e,args:t})}var yt=`data-file-drop-target`,bt=`file-drop-target-active`,k=null,xt=0,St=1,Ct=2,wt=3,Tt=4,Et=5,Dt=6,Ot=7,kt=8,At=9,jt=10,Mt=11,Nt=12,Pt=13,Ft=14,It=15,Lt=16,Rt=17,zt=18,Bt=19,Vt=20,Ht=21,Ut=22,Wt=23,Gt=24,Kt=25,qt=26,Jt=27,Yt=28,Xt=29,Zt=30,Qt=31,$t=32,en=33,tn=34,nn=35,rn=36,an=37,on=38,sn=39,cn=40,ln=41,un=42,dn=43,fn=44,pn=45,mn=46,hn=47,gn=48,_n=49,vn=50,yn=51,bn=52;function xn(e){return e?e.closest(`[${yt}]`):null}function Sn(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function Cn(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var wn=!1;function Tn(){wn=!1,k&&=(k.classList.remove(bt),null)}function En(){window._wails?.flags?.enableFileDrop!==!1&&(wn=!0)}function Dn(){Tn()}function On(e,t){if(!wn||window._wails?.flags?.enableFileDrop===!1)return;let n=xn(document.elementFromPoint(e,t));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),k=n):k=null}var A=Symbol(`caller`),kn=new class e{constructor(t=``){this[A]=y(g.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[A](xt)}Center(){return this[A](St)}Close(){return this[A](Ct)}DisableSizeConstraints(){return this[A](wt)}EnableSizeConstraints(){return this[A](Tt)}Focus(){return this[A](Et)}ForceReload(){return this[A](Dt)}Fullscreen(){return this[A](Ot)}GetScreen(){return this[A](kt)}GetZoom(){return this[A](At)}Height(){return this[A](jt)}Hide(){return this[A](Mt)}IsFocused(){return this[A](Nt)}IsFullscreen(){return this[A](Pt)}IsMaximised(){return this[A](Ft)}IsMinimised(){return this[A](It)}Maximise(){return this[A](Lt)}Minimise(){return this[A](Rt)}Name(){return this[A](zt)}OpenDevTools(){return this[A](Bt)}RelativePosition(){return this[A](Vt)}Reload(){return this[A](Ht)}Resizable(){return this[A](Ut)}Restore(){return this[A](Wt)}SetPosition(e,t){return this[A](Gt,{x:e,y:t})}SetAlwaysOnTop(e){return this[A](Kt,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[A](qt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[A](Jt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[A](Yt,{enabled:e})}SetMaxSize(e,t){return this[A](Xt,{width:e,height:t})}SetMinSize(e,t){return this[A](Zt,{width:e,height:t})}SetRelativePosition(e,t){return this[A](Qt,{x:e,y:t})}SetResizable(e){return this[A]($t,{resizable:e})}SetSize(e,t){return this[A](en,{width:e,height:t})}SetTitle(e){return this[A](tn,{title:e})}SetZoom(e){return this[A](nn,{zoom:e})}Show(){return this[A](rn)}Size(){return this[A](an)}ToggleFullscreen(){return this[A](on)}ToggleMaximise(){return this[A](sn)}ToggleFrameless(){return this[A](cn)}UnFullscreen(){return this[A](ln)}UnMaximise(){return this[A](un)}UnMinimise(){return this[A](dn)}Width(){return this[A](fn)}Zoom(){return this[A](pn)}ZoomIn(){return this[A](mn)}ZoomOut(){return this[A](hn)}ZoomReset(){return this[A](gn)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=xn(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=n):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==t&&k.classList.remove(bt),t?(t.classList.contains(bt)||t.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=t):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||k&&!k.contains(e.relatedTarget))&&(k&&=(k.classList.remove(bt),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,k&&=(k.classList.remove(bt),null),Sn()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&Cn(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&An(),d&&(window._wails=window._wails||{}),d&&(window._wails.invoke=C,window._wails.clientId=_),d&&(window._wails.handlePlatformFileDrop=kn.HandlePlatformFileDrop.bind(kn)),d&&(window._wails.handleDragEnter=En,window._wails.handleDragLeave=Dn,window._wails.handleDragOver=On),d&&C(`wails:runtime:ready`);function jn(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}d&&jn(`/wails/custom.js`);function Mn(){return vt(1211788486)}function Nn(){return vt(853311305)}function Pn(e){return vt(465937298,e)}function Fn(e){return vt(2463093517,e)}var In=class{getRepoRoot(){return Nn()}setRepoRoot(e){return Fn(e)}async getModules(){return await Mn()??[]}runAction(e){return Pn(e)}};function Ln(e){switch(e){case`repo`:case`branch`:case`worktree`:return`source`;case`issue`:case`pr`:return`collaboration`;case`tag`:return`release`;default:return`all`}}function Rn(e,t){return t===`all`?e:e.filter(e=>Ln(e.id)===t)}var zn=`fastgit.desktop.prefs.v1`;function Bn(){return typeof window<`u`&&window.localStorage!==void 0}function Vn(){if(!Bn())return{};try{let e=window.localStorage.getItem(zn);if(!e)return{};let t=JSON.parse(e);if(!t||typeof t!=`object`)return{};let n=Array.isArray(t.repoNamespaces)?t.repoNamespaces.map(e=>String(e).trim()).filter(Boolean):void 0,r=typeof t.selectedRepoPath==`string`?t.selectedRepoPath.trim():void 0;return{...t,repoNamespaces:n,selectedRepoPath:r}}catch{return{}}}function Hn(e){Bn()&&window.localStorage.setItem(zn,JSON.stringify(e))}function Un(e){return`fastgit.desktop.tabs:${e}`}function Wn(e){if(!Bn()||!e)return null;try{let t=window.localStorage.getItem(Un(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!=`object`?null:{openedModuleIds:Array.isArray(n.openedModuleIds)?n.openedModuleIds.map(e=>String(e)):[],selectedModuleId:n.selectedModuleId?String(n.selectedModuleId):null}}catch{return null}}function Gn(e,t){!Bn()||!e||window.localStorage.setItem(Un(e),JSON.stringify(t))}var Kn=(0,l.createContext)(null);function qn(){let e=(0,l.useContext)(Kn);if(!e)throw Error(`useAppContext must be used within AppProvider`);return e}var Jn=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),j=e(((e,t)=>{t.exports=Jn()}))(),Yn={title:`Welcome`,command:`-`,exitCode:0,body:`请选择左侧模块并执行动作。`},Xn=new In;function Zn(e){return e.trim()}function Qn(e,...t){let n=new Set,r=[],i=e=>{let t=Zn(e);!t||n.has(t)||(n.add(t),r.push(t))};return e.forEach(i),t.forEach(i),r}function $n(e,t){let n=Zn(t);return n?[n,...e.filter(e=>Zn(e)!==n)]:e}function er(e,t){return t?e.includes(t)?e:[...e,t]:e}function tr(e){return Math.max(220,Math.min(420,e))}function nr(e,t,n){let r=Rn(e,t);return n[n.length-1]??r[0]?.id??e[0]?.id??null}function rr(){let e=Vn(),t=Zn(e.selectedRepoPath??``);return{repoPath:t,repoNamespaces:$n(Qn(e.repoNamespaces??[],t),t),repoStatus:`加载中...`,modules:[],selectedModuleId:null,openedModuleIds:[],selectedMenu:e.selectedMenu??`source`,modulePaneWidth:tr(e.modulePaneWidth??280),modulePaneCollapsed:e.modulePaneCollapsed??!1,busy:!1,output:Yn}}function ir({children:e}){let[t,n]=(0,l.useState)(rr),r=(0,l.useCallback)(e=>{n(t=>({...t,busy:e}))},[]),i=(0,l.useCallback)(async e=>{let t=Zn(e??``);r(!0);try{t&&await Xn.setRepoRoot(t);let[e,r]=await Promise.all([Xn.getRepoRoot(),Xn.getModules()]),i=Zn(e);n(e=>{let n=Wn(i),a=Rn(r,e.selectedMenu),o=n?.selectedModuleId??e.selectedModuleId,s=o&&a.some(e=>e.id===o)?o:a[0]?.id??r[0]?.id??null,c=new Set(r.map(e=>e.id)),l=(n?.openedModuleIds??e.openedModuleIds).filter(e=>c.has(e));return{...e,repoPath:i,repoNamespaces:$n(Qn(e.repoNamespaces,t,i),i),repoStatus:i?`当前项目: ${i}`:`请先选择项目命名空间`,modules:r,selectedModuleId:s,openedModuleIds:er(l,s)}})}catch(e){let r=String(e);n(e=>({...e,output:{title:t?`Set Project`:`Load Error`,command:t?`SetProjectRoot`:`bootstrap`,exitCode:1,body:r},repoStatus:t?`项目切换失败: ${r}`:`加载失败: ${r}`}))}finally{r(!1)}},[r]),a=(0,l.useCallback)(e=>{n(t=>({...t,selectedModuleId:e,openedModuleIds:er(t.openedModuleIds,e)}))},[]),o=(0,l.useCallback)(e=>{n(t=>{if(t.selectedMenu===e)return{...t,modulePaneCollapsed:!t.modulePaneCollapsed};let n=Rn(t.modules,e),r=t.selectedModuleId&&n.some(e=>e.id===t.selectedModuleId)?t.selectedModuleId:n[0]?.id??t.modules[0]?.id??null;return{...t,selectedMenu:e,selectedModuleId:r,openedModuleIds:er(t.openedModuleIds,r),modulePaneCollapsed:!1}})},[]),s=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.filter(t=>t!==e);if(t.selectedModuleId!==e)return{...t,openedModuleIds:n};let r=nr(t.modules,t.selectedMenu,n);return{...t,openedModuleIds:n,selectedModuleId:r}})},[]),c=(0,l.useCallback)(e=>{n(t=>t.openedModuleIds.includes(e)?{...t,openedModuleIds:[e],selectedModuleId:e}:t)},[]),u=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.indexOf(e);if(n<0)return t;let r=t.openedModuleIds.slice(0,n+1),i=t.selectedModuleId&&r.includes(t.selectedModuleId)?t.selectedModuleId:nr(t.modules,t.selectedMenu,r);return{...t,openedModuleIds:r,selectedModuleId:i}})},[]),d=(0,l.useCallback)((e,t)=>{e!==t&&n(n=>{let r=n.openedModuleIds.indexOf(e),i=n.openedModuleIds.indexOf(t);if(r<0||i<0)return n;let a=[...n.openedModuleIds];a.splice(r,1);let o=a.indexOf(t);return a.splice(o,0,e),{...n,openedModuleIds:a}})},[]),f=(0,l.useCallback)(()=>{n(e=>{let t=Rn(e.modules,e.selectedMenu).find(t=>!e.openedModuleIds.includes(t.id))??e.modules[0];return t?{...e,selectedModuleId:t.id,openedModuleIds:er(e.openedModuleIds,t.id),modulePaneCollapsed:!1}:e})},[]),p=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneWidth:tr(e)}))},[]),m=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneCollapsed:e}))},[]),h=(0,l.useCallback)(async e=>{let r=Zn(e);!r||r===t.repoPath||(n(e=>({...e,repoNamespaces:$n(Qn(e.repoNamespaces,r),r)})),await i(r))},[i,t.repoPath]),g=(0,l.useCallback)(async e=>{let t=Zn(e);t&&n(e=>({...e,repoNamespaces:Qn(e.repoNamespaces,t),repoStatus:t===e.repoPath?`当前项目: ${e.repoPath}`:`已添加项目命名空间: ${t}`}))},[]),_=(0,l.useCallback)(async e=>{let r=Zn(e);if(!r)return;let a=t.repoNamespaces.filter(e=>e!==r);if(a.length!==t.repoNamespaces.length){if(t.repoPath===r){if(a.length===0)return;n(e=>({...e,repoNamespaces:a})),await i(a[0]);return}n(e=>({...e,repoNamespaces:a}))}},[i,t.repoNamespaces,t.repoPath]),v=(0,l.useCallback)(async(e,i,a)=>{if(!t.repoPath){n(t=>({...t,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:`请先选择项目命名空间。`}}));return}r(!0);try{let t=await Xn.runAction({moduleID:e.id,actionID:i.id,values:a});n(n=>({...n,output:{title:`${e.title} / ${i.title}`,command:t.command,exitCode:t.exitCode,body:t.output||`(no output)`}}))}catch(t){n(n=>({...n,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:String(t)}}))}finally{r(!1)}},[r,t.repoPath]),y=(0,l.useMemo)(()=>t.selectedModuleId?t.modules.find(e=>e.id===t.selectedModuleId)??null:null,[t.modules,t.selectedModuleId]),b=(0,l.useMemo)(()=>Rn(t.modules,t.selectedMenu),[t.modules,t.selectedMenu]);(0,l.useEffect)(()=>{Hn({selectedMenu:t.selectedMenu,modulePaneWidth:t.modulePaneWidth,modulePaneCollapsed:t.modulePaneCollapsed,repoNamespaces:t.repoNamespaces,selectedRepoPath:t.repoPath})},[t.modulePaneCollapsed,t.modulePaneWidth,t.repoNamespaces,t.repoPath,t.selectedMenu]),(0,l.useEffect)(()=>{if(!t.repoPath)return;let e=new Set(t.modules.map(e=>e.id)),n=t.openedModuleIds.filter(t=>e.has(t)),r=t.selectedModuleId&&e.has(t.selectedModuleId)?t.selectedModuleId:null;Gn(t.repoPath,{openedModuleIds:n,selectedModuleId:r})},[t.modules,t.openedModuleIds,t.repoPath,t.selectedModuleId]);let x=(0,l.useMemo)(()=>({state:t,selectedModule:y,filteredModules:b,setSelectedModule:a,closeModuleTab:s,closeOtherModuleTabs:c,closeTabsToRight:u,reorderModuleTabs:d,addModuleTab:f,setSelectedMenu:o,setModulePaneWidth:p,setModulePaneCollapsed:m,refresh:i,addRepo:g,switchRepo:h,removeRepo:_,runAction:v}),[t,y,b,a,s,c,u,d,f,o,p,m,i,g,h,_,v]);return(0,j.jsx)(Kn.Provider,{value:x,children:e})}var ar=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),or=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),sr=e=>{let t=or(e);return t.charAt(0).toUpperCase()+t.slice(1)},cr=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),lr=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},ur={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},dr=(0,l.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,l.createElement)(`svg`,{ref:c,...ur,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:cr(`lucide`,i),...!a&&!lr(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,l.createElement)(e,t)),...Array.isArray(a)?a:[a]])),fr=(e,t)=>{let n=(0,l.forwardRef)(({className:n,...r},i)=>(0,l.createElement)(dr,{ref:i,iconNode:t,className:cr(`lucide-${ar(sr(e))}`,`lucide-${e}`,n),...r}));return n.displayName=sr(e),n},pr=fr(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),mr=fr(`git-fork`,[[`circle`,{cx:`12`,cy:`18`,r:`3`,key:`1mpf1b`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`path`,{d:`M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9`,key:`1uq4wg`}],[`path`,{d:`M12 12v3`,key:`158kv8`}]]),hr=fr(`layout-grid`,[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]),gr=fr(`panel-right-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m8 9 3 3-3 3`,key:`12hl5m`}]]),_r=fr(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),vr=fr(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),yr=fr(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]),br=fr(`tags`,[[`path`,{d:`M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z`,key:`16rjxf`}],[`path`,{d:`M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193`,key:`178nd4`}],[`circle`,{cx:`10.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`12ikhr`}]]),xr=fr(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function Sr(...e){return e.filter(Boolean).join(` `)}function Cr({variant:e=`default`,className:t,children:n,...r}){return(0,j.jsx)(`button`,{className:Sr(`ui-button`,`ui-button--${e}`,t),...r,children:n})}var wr={source:`源码与仓库`,collaboration:`协作与评审`,release:`发布与版本`,all:`全部模块`};function Tr(){let{state:e,filteredModules:t,setSelectedModule:n,setModulePaneCollapsed:r,refresh:i}=qn();return(0,j.jsxs)(`aside`,{className:`module-pane`,children:[(0,j.jsxs)(`div`,{className:`module-pane__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:wr[e.selectedMenu]??`模块`}),(0,j.jsxs)(`p`,{children:[t.length,` 个模块`]})]}),(0,j.jsxs)(`div`,{className:`module-pane__actions`,children:[(0,j.jsx)(Cr,{variant:`ghost`,onClick:()=>void i(),children:`刷新`}),(0,j.jsx)(Cr,{variant:`ghost`,className:`module-pane__collapse`,onClick:()=>r(!0),children:(0,j.jsx)(gr,{size:14})})]})]}),(0,j.jsxs)(`div`,{className:`module-pane__list`,children:[t.map(t=>(0,j.jsxs)(`button`,{className:Sr(`module-pane__item`,e.selectedModuleId===t.id&&`module-pane__item--active`),onClick:()=>n(t.id),type:`button`,children:[(0,j.jsx)(`strong`,{children:t.title}),(0,j.jsx)(`span`,{children:t.description})]},t.id)),t.length===0&&(0,j.jsx)(`div`,{className:`module-pane__empty`,children:`当前菜单下暂无模块`})]})]})}var Er=[{id:`source`,label:`源码`,icon:mr},{id:`collaboration`,label:`协作`,icon:pr},{id:`release`,label:`发布`,icon:br},{id:`all`,label:`全部`,icon:hr}];function Dr(){let{state:e,setSelectedMenu:t,refresh:n}=qn();return(0,j.jsxs)(`aside`,{className:`sidebar-menu-panel`,children:[(0,j.jsx)(`div`,{className:`sidebar-menu-panel__group`,children:Er.map(n=>{let r=n.icon;return(0,j.jsxs)(`button`,{className:Sr(`sidebar-menu-panel__item`,e.selectedMenu===n.id&&`sidebar-menu-panel__item--active`),onClick:()=>t(n.id),title:n.label,type:`button`,children:[(0,j.jsx)(r,{size:18,strokeWidth:2}),(0,j.jsx)(`span`,{children:n.label})]},n.id)})}),(0,j.jsxs)(`div`,{className:`sidebar-menu-panel__footer`,children:[(0,j.jsx)(Cr,{variant:`ghost`,className:`sidebar-menu-panel__refresh`,onClick:()=>void n(),children:(0,j.jsx)(vr,{size:14})}),(0,j.jsx)(`span`,{children:e.modulePaneCollapsed?`已收起`:e.busy?`运行中`:`空闲`})]})]})}function Or({className:e,...t}){return(0,j.jsx)(`input`,{className:Sr(`ui-input`,e),...t})}function kr(e){let t=new FormData(e),n={};for(let[e,r]of t.entries())n[e]=String(r).trim();return n}function Ar(){let{selectedModule:e,runAction:t}=qn();if(!e)return(0,j.jsx)(`section`,{className:`module-actions`,children:(0,j.jsx)(`div`,{className:`empty-state`,children:`未找到模块,请刷新。`})});let n=e.actions??[],r=n=>r=>{r.preventDefault(),t(e,n,kr(r.currentTarget))};return(0,j.jsxs)(`section`,{className:`module-actions`,children:[(0,j.jsxs)(`header`,{className:`module-actions__header`,children:[(0,j.jsx)(`h2`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsx)(`div`,{className:`module-actions__grid`,children:n.map((e,t)=>(0,j.jsxs)(`article`,{className:`action-card`,style:{animationDelay:`${t*60}ms`},children:[(0,j.jsxs)(`div`,{className:`action-card__meta`,children:[(0,j.jsx)(`h3`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsxs)(`form`,{onSubmit:r(e),className:`action-card__form`,children:[(0,j.jsx)(`div`,{className:`action-card__fields`,children:(e.fields??[]).map(e=>(0,j.jsxs)(`label`,{className:`action-field`,children:[(0,j.jsx)(`span`,{children:e.label}),(0,j.jsx)(Or,{name:e.key,placeholder:e.placeholder||e.label,defaultValue:e.default||``,required:!!e.required})]},e.key))}),(0,j.jsx)(`div`,{className:`action-card__footer`,children:(0,j.jsx)(Cr,{type:`submit`,children:`执行`})})]})]},e.id))})]})}function jr(){let{state:e}=qn();return(0,j.jsxs)(`section`,{className:`output-panel`,children:[(0,j.jsxs)(`header`,{className:`output-panel__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:e.output.title}),(0,j.jsx)(`p`,{children:e.output.command})]}),(0,j.jsxs)(`span`,{className:e.output.exitCode===0?`status-pill status-pill--ok`:`status-pill status-pill--error`,children:[`exit `,e.output.exitCode]})]}),(0,j.jsx)(`pre`,{className:`output-panel__body`,children:e.output.body})]})}var Mr=`data:image/svg+xml,%3csvg%20width='512'%20height='512'%20viewBox='0%200%20512%20512'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20role='img'%20aria-label='fastgit%20logo%20icon'%3e%3cdefs%3e%3clinearGradient%20id='bg'%20x1='72'%20y1='56'%20x2='448'%20y2='456'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%233C679F'/%3e%3cstop%20offset='1'%20stop-color='%231F2D44'/%3e%3c/linearGradient%3e%3clinearGradient%20id='stroke'%20x1='136'%20y1='152'%20x2='376'%20y2='360'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F0F3F8'/%3e%3cstop%20offset='1'%20stop-color='%23D6DFEF'/%3e%3c/linearGradient%3e%3c/defs%3e%3crect%20x='56'%20y='56'%20width='400'%20height='400'%20rx='96'%20fill='url(%23bg)'/%3e%3cpath%20d='M168%20336V208C168%20194.745%20178.745%20184%20192%20184H320C333.255%20184%20344%20194.745%20344%20208V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M256%20184V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'/%3e%3ccircle%20cx='168'%20cy='336'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='344'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='184'%20r='30'%20fill='%23E8EDF4'/%3e%3c/svg%3e`;function Nr(){let{state:e,addRepo:t,switchRepo:n,removeRepo:r}=qn(),[i,a]=(0,l.useState)(``),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(``);(0,l.useEffect)(()=>{s(e.repoPath)},[e.repoPath]);let d=i.trim().length>0,f=(0,l.useMemo)(()=>{let t=c.trim().toLowerCase();return t?e.repoNamespaces.filter(e=>e.toLowerCase().includes(t)):e.repoNamespaces},[c,e.repoNamespaces]),p=async()=>{let e=i.trim();e&&(await t(e),a(``))},m=async()=>{let e=i.trim();e&&(await n(e),a(``))};return(0,j.jsxs)(`section`,{className:`repo-settings`,"aria-label":`Project settings`,children:[(0,j.jsxs)(`header`,{className:`repo-settings__header`,children:[(0,j.jsx)(`h3`,{children:`Settings · Projects`}),(0,j.jsxs)(`p`,{children:[e.repoNamespaces.length,` 个项目`]})]}),(0,j.jsxs)(`div`,{className:`repo-settings__current`,children:[(0,j.jsx)(`span`,{children:`当前项目`}),(0,j.jsx)(`strong`,{children:e.repoPath||`未选择`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row workspace-panel__row--add`,children:[(0,j.jsx)(Or,{value:i,onChange:e=>a(e.target.value),placeholder:`/path/to/project (git repository)`}),(0,j.jsx)(Cr,{variant:`ghost`,onClick:()=>void p(),disabled:!d,children:`添加`}),(0,j.jsx)(Cr,{variant:`primary`,onClick:()=>void m(),disabled:!d,children:`添加并切换`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row`,children:[(0,j.jsx)(Or,{value:c,onChange:e=>u(e.target.value),placeholder:`筛选项目...`}),(0,j.jsxs)(`span`,{className:`repo-settings__count`,children:[f.length,` / `,e.repoNamespaces.length]})]}),(0,j.jsxs)(`div`,{className:`repo-list`,role:`list`,children:[f.map(t=>{let i=t===e.repoPath;return(0,j.jsxs)(`article`,{className:[`repo-item`,i?`repo-item--current`:``,t===o?`repo-item--selected`:``].filter(Boolean).join(` `),onClick:()=>s(t),role:`button`,tabIndex:0,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),s(t))},children:[(0,j.jsxs)(`div`,{className:`repo-item__meta`,children:[(0,j.jsx)(`strong`,{children:t.split(/[\\/]/).filter(Boolean).pop()||t}),(0,j.jsx)(`span`,{children:t})]}),(0,j.jsxs)(`div`,{className:`repo-item__actions`,children:[(0,j.jsx)(`span`,{className:i?`repo-badge repo-badge--active`:`repo-badge`,children:i?`当前`:`可切换`}),(0,j.jsx)(Cr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),n(t)},disabled:i,children:`切换`}),(0,j.jsx)(Cr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),r(t)},disabled:i,children:`移除`})]})]},t)}),f.length===0&&(0,j.jsx)(`div`,{className:`repo-list__empty`,children:`没有匹配的项目`})]}),(0,j.jsx)(`p`,{className:`repo-settings__status`,children:e.repoStatus})]})}function Pr(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??`workspace`}function Fr(e){return e.split(/[\\/]/).filter(Boolean)}function Ir(e){let t=new Map;for(let n of e){let r=Fr(n);if(r.length===0){t.set(n,n);continue}let i=r[r.length-1];for(let t=1;t<=r.length;t+=1){let a=r.slice(-t).join(`/`);if(!e.some(e=>e===n?!1:Fr(e).slice(-t).join(`/`)===a)){i=a;break}i=a}t.set(n,i)}return t}function Lr(){let{state:e,addModuleTab:t,closeModuleTab:n,closeOtherModuleTabs:r,closeTabsToRight:i,reorderModuleTabs:a,setSelectedModule:o,switchRepo:s}=qn(),c=(0,l.useMemo)(()=>Ir(e.repoNamespaces),[e.repoNamespaces]),u=e.repoPath?c.get(e.repoPath)??Pr(e.repoPath):`workspace`,[d,f]=(0,l.useState)(null),[p,m]=(0,l.useState)(null),[h,g]=(0,l.useState)(null),[_,v]=(0,l.useState)(!1),y=(0,l.useRef)(null),b=(0,l.useRef)(null),x=e.openedModuleIds.map(t=>e.modules.find(e=>e.id===t)).filter(e=>e!==void 0),ee=x.length,S=(0,l.useMemo)(()=>h?x.find(e=>e.id===h.moduleId)??null:null,[h,x]),C=S?x.findIndex(e=>e.id===S.id):-1,te=ee>1,ne=C>=0&&C{let e=e=>{if(g(null),!_)return;let t=e.target;t&&(b.current?.contains(t)||y.current?.contains(t)||v(!1))},t=e=>{e.key===`Escape`&&(g(null),v(!1))};return window.addEventListener(`pointerdown`,e),window.addEventListener(`keydown`,t),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,t)}},[_]);let re=(e,t)=>{f(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t)},w=(e,t)=>{e.preventDefault(),d&&d!==t&&m(t)},ie=(e,t)=>{e.preventDefault(),!(!d||d===t)&&(a(d,t),m(null),f(null))},ae=(e,t)=>{e.preventDefault(),e.stopPropagation(),g({x:e.clientX,y:e.clientY,moduleId:t})},oe=e=>{e(),g(null)};return(0,j.jsxs)(`header`,{className:`tabs-header app-drag-region`,children:[(0,j.jsxs)(`div`,{className:`tabs-repo app-no-drag-region`,children:[(0,j.jsx)(`img`,{className:`tabs-repo__logo`,src:Mr,alt:`fastgit logo`}),(0,j.jsx)(`span`,{children:u})]}),(0,j.jsx)(`div`,{className:`tabs-track app-no-drag-region`,children:x.map(t=>{let r=e.selectedModuleId===t.id;return(0,j.jsxs)(`div`,{className:[`tabs-track__item`,r?`tabs-track__item--active`:``,p===t.id?`tabs-track__item--drag-over`:``].filter(Boolean).join(` `),onClick:()=>o(t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o(t.id))},onContextMenu:e=>ae(e,t.id),draggable:ee>1,onDragStart:e=>re(e,t.id),onDragOver:e=>w(e,t.id),onDrop:e=>ie(e,t.id),onDragEnd:()=>{f(null),m(null)},role:`button`,tabIndex:0,"aria-label":`switch to ${t.title}`,"aria-pressed":r,children:[(0,j.jsx)(`span`,{children:t.title}),(0,j.jsx)(`button`,{className:`tabs-track__close`,onClick:e=>{e.stopPropagation(),n(t.id)},onContextMenu:e=>ae(e,t.id),type:`button`,"aria-label":`close ${t.title}`,children:(0,j.jsx)(xr,{size:13})})]},t.id)})}),(0,j.jsxs)(`div`,{className:`tabs-actions app-no-drag-region`,children:[(0,j.jsxs)(`select`,{className:`ui-input tabs-project-select`,value:e.repoPath,title:e.repoPath||`未选择项目`,onChange:e=>void s(e.target.value),children:[(0,j.jsx)(`option`,{value:``,children:e.repoNamespaces.length===0?`未配置项目`:`选择项目`}),e.repoNamespaces.map(e=>(0,j.jsx)(`option`,{value:e,children:c.get(e)??Pr(e)},e))]}),(0,j.jsx)(`button`,{ref:b,className:`tabs-settings`,onClick:()=>v(e=>!e),type:`button`,"aria-label":`open project settings`,children:(0,j.jsx)(yr,{size:14})}),(0,j.jsx)(`button`,{className:`tabs-add`,onClick:t,type:`button`,"aria-label":`new tab`,children:(0,j.jsx)(_r,{size:14})})]}),_&&(0,j.jsx)(`div`,{ref:y,className:`tabs-settings-panel app-no-drag-region`,onPointerDown:e=>e.stopPropagation(),children:(0,j.jsx)(Nr,{})}),h&&S&&(0,j.jsxs)(`div`,{className:`tabs-menu app-no-drag-region`,style:{left:`${h.x}px`,top:`${h.y}px`},onPointerDown:e=>e.stopPropagation(),children:[(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>n(S.id)),disabled:!te,children:`关闭标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>r(S.id)),disabled:!te,children:`关闭其他标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>i(S.id)),disabled:!ne,children:`关闭右侧标签`})]})]})}function Rr(){let{state:e,setModulePaneWidth:t}=qn(),[n,r]=(0,l.useState)(!1),i=n=>{if(window.innerWidth<=900||e.modulePaneCollapsed)return;r(!0);let i=n.clientX,a=e.modulePaneWidth,o=e=>{t(a+(e.clientX-i))},s=()=>{r(!1),window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s)},a={"--module-pane-width":`${e.modulePaneWidth}px`};return(0,j.jsxs)(`main`,{className:`desktop-shell`,children:[(0,j.jsx)(Lr,{}),(0,j.jsxs)(`section`,{className:[`desktop-body`,n?`desktop-body--dragging`:``,e.modulePaneCollapsed?`desktop-body--pane-collapsed`:``].filter(Boolean).join(` `),style:a,children:[(0,j.jsx)(Dr,{}),(0,j.jsxs)(`div`,{className:`module-pane-wrap`,children:[(0,j.jsx)(Tr,{}),(0,j.jsx)(`div`,{className:`module-pane-resizer`,onMouseDown:i,role:`separator`,"aria-orientation":`vertical`,"aria-label":`resize sidebar`})]}),(0,j.jsxs)(`div`,{className:`desktop-main`,children:[(0,j.jsx)(Ar,{}),(0,j.jsx)(jr,{})]})]})]})}function zr(){let{state:e,refresh:t}=qn(),n=(0,l.useRef)(e.repoPath);return(0,l.useEffect)(()=>{t(n.current)},[t]),(0,j.jsx)(Rr,{})}function Br(){return(0,j.jsx)(ir,{children:(0,j.jsx)(zr,{})})}var Vr=document.getElementById(`app`);if(!Vr)throw Error(`#app not found`);(0,u.createRoot)(Vr).render((0,j.jsx)(l.StrictMode,{children:(0,j.jsx)(Br,{})})); \ No newline at end of file diff --git a/desktop/frontend/dist/assets/index-BvrVHuHl.css b/desktop/frontend/dist/assets/index-BvrVHuHl.css new file mode 100644 index 0000000..ec64151 --- /dev/null +++ b/desktop/frontend/dist/assets/index-BvrVHuHl.css @@ -0,0 +1 @@ +@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e1e7ef;--bg-main:#edf2f8;--bg-topbar:#e3e8f0;--bg-topbar-active:#f1f4f9;--bg-pane:#e3e7ef;--bg-pane-hover:#dce3ed;--bg-card:#eef2f7;--bg-card-soft:#dfe5ee;--bg-input:#edf1f6;--bg-output:#e7edf6;--text-1:#1f2d44;--text-2:#5d708d;--text-3:#8b9ab0;--text-inverse:#fff;--text-output:#1f2d44;--line:#bfcbdb;--line-strong:#adbbd1;--line-output:#b5c4d8;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--brand-soft:#4f7fc41f;--brand-soft-strong:#4f7fc42e;--brand-line:#4f7fc485;--brand-line-strong:#4f7fc47a;--ok:#1b9b4a;--error:#d83f57;--ok-soft:#1b9b4a14;--ok-line:#1b9b4a40;--error-soft:#d83f5714;--error-line:#d83f5740;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14;--shadow-menu:0 8px 20px #131f322e;--highlight-stroke:#ffffff57}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-repo__logo{flex:0 0 14px;width:14px;height:14px;display:block}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{border-color:var(--brand-line);background:var(--brand-soft)}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-actions{align-items:center;gap:8px;margin-left:auto;display:inline-flex}.tabs-project-select{min-width:220px;height:28px;font-size:12px}.tabs-settings{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-settings-panel{z-index:40;border:1px solid var(--line);background:var(--bg-card);width:min(620px,100vw - 24px);box-shadow:var(--shadow-menu);border-radius:12px;padding:10px;position:fixed;top:46px;right:12px}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);min-width:150px;box-shadow:var(--shadow-menu);border-radius:10px;gap:3px;padding:6px;display:grid;position:fixed}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line);background:var(--bg-pane);color:var(--text-2);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;font-weight:600;display:grid}.sidebar-menu-panel__item:hover{color:var(--text-1);background:var(--bg-pane-hover)}.sidebar-menu-panel__item--active{color:var(--text-1);background:var(--bg-card-soft);box-shadow:inset 0 0 0 1px var(--line-strong)}.sidebar-menu-panel__footer{border-top:1px solid var(--line);color:var(--text-2);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{border-color:var(--line-strong);width:36px;height:32px;color:var(--text-2);padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:var(--brand-line-strong)}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 var(--highlight-stroke), var(--shadow-card);padding:12px}.workspace-panel__row{align-items:center;gap:8px;display:flex}.workspace-panel__row--add .ui-input{flex:1}.repo-settings{gap:8px;display:grid}.repo-settings__header{justify-content:space-between;align-items:baseline;display:flex}.repo-settings__header h3{margin:0;font-size:14px}.repo-settings__header p,.repo-settings__status,.repo-settings__count{color:var(--text-2);margin:0;font-size:12px}.repo-settings__current{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-topbar-active);gap:3px;padding:8px 10px;display:grid}.repo-settings__current span{color:var(--text-2);font-size:11px}.repo-settings__current strong{color:var(--text-1);word-break:break-all;font-size:12px}.repo-list{gap:8px;max-height:180px;margin-top:8px;display:grid;overflow:auto}.repo-item{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-card-soft);cursor:pointer;gap:7px;padding:8px;display:grid}.repo-item--selected{box-shadow:inset 0 0 0 1px var(--brand-line)}.repo-item--current{background:var(--bg-topbar-active);border-color:var(--line-strong)}.repo-item__meta{min-width:0}.repo-item__meta strong{color:var(--text-1);font-size:12px;display:block}.repo-item__meta span{color:var(--text-2);word-break:break-all;margin-top:2px;font-size:11px;display:block}.repo-item__actions{align-items:center;gap:6px;display:flex}.repo-item__actions .ui-button{min-height:28px;padding:0 10px;font-size:11px}.repo-badge{color:var(--text-2);border:1px solid var(--line);background:var(--bg-pane);border-radius:999px;padding:1px 8px;font-size:11px}.repo-badge--active{color:var(--brand-strong);border-color:var(--brand-line);background:var(--brand-soft)}.repo-list__empty{border:1px dashed var(--line-strong);border-radius:var(--radius-md);text-align:center;color:var(--text-2);padding:10px;font-size:12px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto}.tabs-project-select{width:140px;min-width:0}.tabs-settings-panel{top:84px}}@media (width<=640px){.tabs-actions{gap:4px}.tabs-project-select{width:110px}.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);box-shadow:0 1px 0 var(--highlight-stroke);gap:10px;padding:12px;animation:.24s both rise-in;display:grid}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button:disabled{cursor:not-allowed;color:var(--text-3);border-color:var(--line);background:var(--bg-pane)}.ui-button--primary{color:var(--text-inverse);background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--primary:disabled{color:var(--text-inverse);background:var(--line-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft-strong);outline:none}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-line)}.status-pill--error{color:var(--error);background:var(--error-soft);border-color:var(--error-line)}.output-panel__body{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);min-height:180px;max-height:30vh;color:var(--text-output);margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto} diff --git a/desktop/frontend/dist/assets/index-DAwICAMZ.js b/desktop/frontend/dist/assets/index-DAwICAMZ.js deleted file mode 100644 index 4eceed9..0000000 --- a/desktop/frontend/dist/assets/index-DAwICAMZ.js +++ /dev/null @@ -1,14 +0,0 @@ -var e=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports);(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function S(){}var C={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function ne(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return ne(e.type,t,e.props)}function ie(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ae(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var oe=/\/+/g;function se(e,t){return typeof e==`object`&&e&&e.key!=null?ae(``+e.key):t.toString(36)}function ce(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(S,S):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function le(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,le(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+se(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(oe,`$&/`)+`/`),le(o,r,i,``,function(e){return e})):o!=null&&(ie(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(oe,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{n.exports=t()})),r=e((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,ie());else{var t=n(l);t!==null&&se(x,t.startTime-e)}}var ee=!1,S=-1,C=5,te=-1;function ne(){return g?!0:!(e.unstable_now()-tet&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&se(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?ie():ee=!1}}}var ie;if(typeof y==`function`)ie=function(){y(re)};else if(typeof MessageChannel<`u`){var ae=new MessageChannel,oe=ae.port2;ae.port1.onmessage=re,ie=function(){oe.postMessage(null)}}else ie=function(){_(re,0)};function se(t,n){S=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(S),S=-1):h=!0,se(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,ie()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),i=e(((e,t)=>{t.exports=r()})),a=e((e=>{var t=n();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=e((e=>{var t=i(),r=n(),a=o();function s(e){var t=`https://react.dev/errors/`+e;if(1me||(e.current=pe[me],pe[me]=null,me--)}function D(e,t){me++,pe[me]=e.current,e.current=t}var ge=he(null),_e=he(null),ve=he(null),ye=he(null);function be(e,t){switch(D(ve,t),D(_e,e),D(ge,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}E(ge),D(ge,e)}function xe(){E(ge),E(_e),E(ve)}function Se(e){e.memoizedState!==null&&D(ye,e);var t=ge.current,n=Hd(t,e.type);t!==n&&(D(_e,e),D(ge,n))}function Ce(e){_e.current===e&&(E(ge),E(_e)),ye.current===e&&(E(ye),Qf._currentValue=fe)}var we,Te;function Ee(e){if(we===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);we=t&&t[1]||``,Te=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{De=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Ee(n):``}function ke(e,t){switch(e.tag){case 26:case 27:case 5:return Ee(e.type);case 16:return Ee(`Lazy`);case 13:return e.child!==t&&t!==null?Ee(`Suspense Fallback`):Ee(`Suspense`);case 19:return Ee(`SuspenseList`);case 0:case 15:return Oe(e.type,!1);case 11:return Oe(e.type.render,!1);case 1:return Oe(e.type,!0);case 31:return Ee(`Activity`);default:return``}}function Ae(e){try{var t=``,n=null;do t+=ke(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var je=Object.prototype.hasOwnProperty,Me=t.unstable_scheduleCallback,Ne=t.unstable_cancelCallback,Pe=t.unstable_shouldYield,Fe=t.unstable_requestPaint,Ie=t.unstable_now,Le=t.unstable_getCurrentPriorityLevel,Re=t.unstable_ImmediatePriority,ze=t.unstable_UserBlockingPriority,Be=t.unstable_NormalPriority,Ve=t.unstable_LowPriority,He=t.unstable_IdlePriority,Ue=t.log,We=t.unstable_setDisableYieldValue,Ge=null,Ke=null;function qe(e){if(typeof Ue==`function`&&We(e),Ke&&typeof Ke.setStrictMode==`function`)try{Ke.setStrictMode(Ge,e)}catch{}}var Je=Math.clz32?Math.clz32:Ze,Ye=Math.log,Xe=Math.LN2;function Ze(e){return e>>>=0,e===0?32:31-(Ye(e)/Xe|0)|0}var Qe=256,$e=262144,et=4194304;function tt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function nt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=tt(n))):i=tt(o):i=tt(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=tt(n))):i=tt(o)):i=tt(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function rt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function it(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function at(){var e=et;return et<<=1,!(et&62914560)&&(et=4194304),e}function ot(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function st(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function ct(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),yn=!1;if(vn)try{var bn={};Object.defineProperty(bn,"passive",{get:function(){yn=!0}}),window.addEventListener(`test`,bn,bn),window.removeEventListener(`test`,bn,bn)}catch{yn=!1}var xn=null,Sn=null,Cn=null;function wn(){if(Cn)return Cn;var e,t=Sn,n=t.length,r,i=`value`in xn?xn.value:xn.textContent,a=i.length;for(e=0;e=er),rr=` `,ir=!1;function ar(e,t){switch(e){case`keyup`:return Qn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function or(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var sr=!1;function cr(e,t){switch(e){case`compositionend`:return or(t);case`keypress`:return t.which===32?(ir=!0,rr):null;case`textInput`:return e=t.data,e===rr&&ir?null:e;default:return null}}function lr(e,t){if(sr)return e===`compositionend`||!$n&&ar(e,t)?(e=wn(),Cn=Sn=xn=null,sr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=jr(n)}}function Nr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Nr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Pr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Gt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Gt(e.document)}return t}function Fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Ir=vn&&`documentMode`in document&&11>=document.documentMode,Lr=null,Rr=null,zr=null,Br=!1;function Vr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Br||Lr==null||Lr!==Gt(r)||(r=Lr,`selectionStart`in r&&Fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),zr&&Ar(zr,r)||(zr=r,r=Ed(Rr,`onSelect`),0>=o,i-=o,Ni=1<<32-Je(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),o=a(_,o,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),N&&Fi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),o=a(y,o,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),N&&Fi(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return N&&Fi(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),N&&Fi(i,g),u}function b(e,r,a,c){if(typeof a==`object`&&a&&a.type===y&&a.key===null&&(a=a.props.children),typeof a==`object`&&a){switch(a.$$typeof){case _:a:{for(var l=a.key;r!==null;){if(r.key===l){if(l=a.type,l===y){if(r.tag===7){n(e,r.sibling),c=i(r,a.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===ie&&Na(l)===r.type){n(e,r.sibling),c=i(r,a.props),Ba(c,a),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}a.type===y?(c=bi(a.props.children,e.mode,c,a.key),c.return=e,e=c):(c=yi(a.type,a.key,a.props,null,e.mode,c),Ba(c,a),c.return=e,e=c)}return o(e);case v:a:{for(l=a.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),c=i(r,a.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=Ci(a,e.mode,c),c.return=e,e=c}return o(e);case ie:return a=Na(a),b(e,r,a,c)}if(de(a))return h(e,r,a,c);if(ce(a)){if(l=ce(a),typeof l!=`function`)throw Error(s(150));return a=l.call(a),g(e,r,a,c)}if(typeof a.then==`function`)return b(e,r,za(a),c);if(a.$$typeof===S)return b(e,r,ca(e,a),c);Va(e,a)}return typeof a==`string`&&a!==``||typeof a==`number`||typeof a==`bigint`?(a=``+a,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,a),c.return=e,e=c):(n(e,r),c=xi(a,e.mode,c),c.return=e,e=c),o(e)):n(e,r)}return function(e,t,n,r){try{Ra=0;var i=b(e,t,n,r);return La=null,i}catch(t){if(t===Da||t===ka)throw t;var a=hi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ua=Ha(!0),Wa=Ha(!1),Ga=!1;function Ka(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function qa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ja(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ya(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=fi(e),di(e,null,n),t}return ci(e,r,t,n),fi(e)}function Xa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ut(e,n)}}function Za(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Qa=!1;function $a(){if(Qa){var e=va;if(e!==null)throw e}}function eo(e,t,n,r){Qa=!1;var i=e.updateQueue;Ga=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===_a&&(Qa=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ga=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function to(e,t){if(typeof e!=`function`)throw Error(s(191,e));e.call(t)}function no(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=w.T,s={};w.T=s,Ls(e,!1,t,n);try{var c=i(),l=w.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Is(e,t,xa(c,r),pu(e)):Is(e,t,r,pu(e))}catch(n){Is(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{T.p=a,o!==null&&s.types!==null&&(o.types=s.types),w.T=o}}function Es(){}function Ds(e,t,n,r){if(e.tag!==5)throw Error(s(476));var i=Os(e).queue;Ts(e,i,t,fe,n===null?Es:function(){return ks(e),n(r)})}function Os(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:fe,baseState:fe,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ro,lastRenderedState:fe},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ro,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ks(e){var t=Os(e);t.next===null&&(t=e.alternate.memoizedState),Is(e,t.next.queue,{},pu())}function As(){return sa(Qf)}function js(){return B().memoizedState}function Ms(){return B().memoizedState}function Ns(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ja(n);var r=Ya(t,e,n);r!==null&&(hu(r,t,n),Xa(r,t,n)),t={cache:pa()},e.payload=t;return}t=t.return}}function Ps(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Rs(e)?zs(t,n):(n=li(e,t,n,r),n!==null&&(hu(n,e,r),Bs(n,t,r)))}function Fs(e,t,n){Is(e,t,n,pu())}function Is(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Rs(e))zs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,kr(s,o))return ci(e,t,i,0),K===null&&si(),!1}catch{}if(n=li(e,t,i,r),n!==null)return hu(n,e,r),Bs(n,t,r),!0}return!1}function Ls(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Rs(e)){if(t)throw Error(s(479))}else t=li(e,n,r,2),t!==null&&hu(t,e,2)}function Rs(e){var t=e.alternate;return e===I||t!==null&&t===I}function zs(e,t){yo=vo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Bs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ut(e,n)}}var Vs={readContext:sa,use:Io,useCallback:z,useContext:z,useEffect:z,useImperativeHandle:z,useLayoutEffect:z,useInsertionEffect:z,useMemo:z,useReducer:z,useRef:z,useState:z,useDebugValue:z,useDeferredValue:z,useTransition:z,useSyncExternalStore:z,useId:z,useHostTransitionStatus:z,useFormState:z,useActionState:z,useOptimistic:z,useMemoCache:z,useCacheRefresh:z};Vs.useEffectEvent=z;var Hs={readContext:sa,use:Io,useCallback:function(e,t){return No().memoizedState=[e,t===void 0?null:t],e},useContext:sa,useEffect:fs,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),us(4194308,4,vs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return us(4194308,4,e,t)},useInsertionEffect:function(e,t){us(4,2,e,t)},useMemo:function(e,t){var n=No();t=t===void 0?null:t;var r=e();if(bo){qe(!0);try{e()}finally{qe(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=No();if(n!==void 0){var i=n(t);if(bo){qe(!0);try{n(t)}finally{qe(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ps.bind(null,I,e),[r.memoizedState,e]},useRef:function(e){var t=No();return e={current:e},t.memoizedState=e},useState:function(e){e=Jo(e);var t=e.queue,n=Fs.bind(null,I,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:bs,useDeferredValue:function(e,t){return Cs(No(),e,t)},useTransition:function(){var e=Jo(!1);return e=Ts.bind(null,I,e.queue,!0,!1),No().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=I,i=No();if(N){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),K===null)throw Error(s(349));J&127||Uo(r,t,n)}i.memoizedState=n;var a={value:n,getSnapshot:t};return i.queue=a,fs(Go.bind(null,r,a,e),[e]),r.flags|=2048,cs(9,{destroy:void 0},Wo.bind(null,r,a,n,t),null),n},useId:function(){var e=No(),t=K.identifierPrefix;if(N){var n=Pi,r=Ni;n=(r&~(1<<32-Je(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=xo++,0<\/script>`,a=a.removeChild(a.firstChild);break;case`select`:a=typeof r.is==`string`?o.createElement(`select`,{is:r.is}):o.createElement(`select`),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=typeof r.is==`string`?o.createElement(i,{is:r.is}):o.createElement(i)}}a[_t]=t,a[vt]=r;a:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)a.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break a;for(;o.sibling===null;){if(o.return===null||o.return===t)break a;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=a;a:switch(Pd(a,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Fc(t)}}return H(t),Ic(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Fc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(s(166));if(e=ve.current,qi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=Bi,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[_t]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Wi(t,!0)}else e=Bd(e).createTextNode(r),e[_t]=t,t.stateNode=e}return H(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=qi(t),n!==null){if(e===null){if(!r)throw Error(s(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(s(557));e[_t]=t}else Ji(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;H(t),e=!1}else n=Yi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(ho(t),t):(ho(t),null);if(t.flags&128)throw Error(s(558))}return H(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=qi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(s(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(s(317));i[_t]=t}else Ji(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;H(t),i=!1}else i=Yi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(ho(t),t):(ho(t),null)}return ho(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),a=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Rc(t,t.updateQueue),H(t),null);case 4:return xe(),e===null&&Sd(t.stateNode.containerInfo),H(t),null;case 10:return ta(t.type),H(t),null;case 19:if(E(F),r=t.memoizedState,r===null)return H(t),null;if(i=(t.flags&128)!=0,a=r.rendering,a===null)if(i)zc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(a=go(e),a!==null){for(t.flags|=128,zc(r,!1),e=a.updateQueue,t.updateQueue=e,Rc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)vi(n,e),n=n.sibling;return D(F,F.current&1|2),N&&Fi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ie()>tu&&(t.flags|=128,i=!0,zc(r,!1),t.lanes=4194304)}else{if(!i)if(e=go(a),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Rc(t,e),zc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!a.alternate&&!N)return H(t),null}else 2*Ie()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,i=!0,zc(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(e=r.last,e===null?t.child=a:e.sibling=a,r.last=a)}return r.tail===null?(H(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ie(),e.sibling=null,n=F.current,D(F,i?n&1|2:n&1),N&&Fi(t,r.treeForkCount),e);case 22:case 23:return ho(t),so(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(H(t),t.subtreeFlags&6&&(t.flags|=8192)):H(t),n=t.updateQueue,n!==null&&Rc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&E(Ca),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),ta(P),H(t),null;case 25:return null;case 30:return null}throw Error(s(156,t.tag))}function Vc(e,t){switch(Ri(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ta(P),xe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(ho(t),t.alternate===null)throw Error(s(340));Ji()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(ho(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Ji()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return E(F),null;case 4:return xe(),null;case 10:return ta(t.type),null;case 22:case 23:return ho(t),so(),e!==null&&E(Ca),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return ta(P),null;case 25:return null;default:return null}}function Hc(e,t){switch(Ri(t),t.tag){case 3:ta(P),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&ho(t);break;case 13:ho(t);break;case 19:E(F);break;case 10:ta(t.type);break;case 22:case 23:ho(t),so(),e!==null&&E(Ca);break;case 24:ta(P)}}function Uc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Wc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Gc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{no(t,n)}catch(t){Z(e,e.return,t)}}}function Kc(e,t,n){n.props=Ys(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function qc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Jc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Yc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Xc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[vt]=t}catch(t){Z(e,e.return,t)}}function Zc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Qc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Zc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=ln));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(el(e,t,n),e=e.sibling;e!==null;)el(e,t,n),e=e.sibling}function tl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[_t]=e,t[vt]=n}catch(t){Z(e,e.return,t)}}var nl=!1,U=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Pr(e),Fr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break a}var o=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||i!==0&&f.nodeType!==3||(c=o+i),f!==a||r!==0&&f.nodeType!==3||(l=o+r),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===i&&(c=o),p===a&&++d===r&&(l=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,a=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(a,r,n),a[_t]=e,k(a),r=a;break a;case`link`:var o=Vf(`link`,`href`,i).get(r+(n.href||``));if(o){for(var c=0;cg&&(o=g,g=h,h=o);var _=Mr(s,h),v=Mr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,w.T=null,n=lu,lu=null;var a=au,o=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(s(331));var c=G;if(G|=4,Fl(a.current),Dl(a,a.current,o,n),G=c,id(0,!1),Ke&&typeof Ke.onPostCommitFiberRoot==`function`)try{Ke.onPostCommitFiberRoot(Ge,a)}catch{}return!0}finally{T.p=i,w.T=r,Vu(e,t)}}function Wu(e,t,n){t=Ti(n,t),t=tc(e.stateNode,t,2),e=Ya(e,t,2),e!==null&&(st(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=Ti(n,e),n=nc(2),r=Ya(t,n,2),r!==null&&(rc(n,r,t,e),st(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>Ie()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=at()),e=ui(e,t),e!==null&&(st(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Me(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Je(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=nt(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||rt(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Ie(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=qt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),k(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+qt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+qt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+qt(n.imageSizes)+`"]`)):i+=`[href="`+qt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),k(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+qt(r)+`"][href="`+qt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),k(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=Ot(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);k(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),k(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),k(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var i=(i=ve.current)?gf(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=Ot(i).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var a=Ot(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(jf(e)))&&!a._p&&(o.instance=a,o.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),a||Nf(i,e,n,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=Ot(i).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Af(e){return`href="`+qt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),k(t),e.head.appendChild(t))}function Pf(e){return`[src="`+qt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+qt(n.href)+`"]`);if(r)return t.instance=r,k(r),r;var i=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),k(r),Pd(r,`style`,i),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Af(n.href);var a=e.querySelector(jf(i));if(a)return t.state.loading|=4,t.instance=a,k(a),a;r=Mf(n),(i=mf.get(i))&&Rf(r,i),a=(e.ownerDocument||e).createElement(`link`),k(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),t.state.loading|=4,Lf(a,n.precedence,e),t.instance=a;case`script`:return a=Pf(n.src),(i=e.querySelector(Ff(a)))?(t.instance=i,k(i),i):(r=n,(i=mf.get(a))&&(r=h({},n),zf(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),k(i),Pd(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,k(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),k(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()})),l=n(),u=c(),d=typeof window<`u`&&typeof document<`u`,f=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function p(e=21){let t=``,n=e|0;for(;n--;)t+=f[Math.random()*64|0];return t}function m(){return window.location.origin+`/wails/runtime`}var h=512*1024,g=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10,IOS:11,Android:12}),_=p(),v=null;function y(e,t=``){return function(n,r=null){return b(e,n,t,r)}}async function b(e,t,n,r){if(v)return v.call(e,t,n,r);let i=new URL(m()),a={object:e,method:t};r!=null&&(a.args=r);let o={"x-wails-client-id":_,"Content-Type":`application/json`};n&&(o[`x-wails-window-name`]=n);let s=JSON.stringify(a),c;if(c=s.length>h?await x(i,o,s):await fetch(i,{method:`POST`,headers:o,body:s}),!c.ok)throw Error(await c.text());return(c.headers.get(`Content-Type`)?.indexOf(`application/json`)??-1)===-1?c.text():c.json()}async function x(e,t,n){let r=p(),i=new TextEncoder().encode(n),a=Math.ceil(i.length/h);for(let n=0;n{let i=e.get(t);if(i){if(e.delete(t),r){i.reject(Error(r));return}try{let e=JSON.parse(n??`{}`);if(!e.ok){i.reject(Error(e.error??`unknown runtime call error`));return}i.resolve(`text`in e?e.text:e.data)}catch(e){i.reject(e)}}},v={call(t,n,r,i){return new Promise((a,o)=>{let s=p();e.set(s,{resolve:a,reject:o});try{ee.invokeAsync(s,JSON.stringify({object:t,method:n,windowName:r,args:i??null,clientId:_}))}catch(t){e.delete(s),o(t)}})}}}g.System;var S=(function(){try{if(window.chrome?.webview?.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if(window.webkit?.messageHandlers?.external?.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external);if(window.wails?.invoke)return e=>window.wails.invoke(typeof e==`string`?e:JSON.stringify(e))}catch{}return console.warn(` -%c⚠️ Browser Environment Detected %c - -%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. -More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development -`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function C(e){S?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function re(){return!!window._wails?.environment?.Debug}function ie(){return new MouseEvent(`mousedown`).buttons===0}function ae(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}d&&document.addEventListener(`DOMContentLoaded`,()=>{}),d&&window.addEventListener(`contextmenu`,le);var oe=y(g.ContextMenu),se=0;function ce(e,t,n,r){oe(se,{id:e,x:t,y:n,data:r})}function le(e){let t=ae(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);ce(n,e.clientX,e.clientY,r)}else ue(e,t)}function ue(e,t){if(re())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{fe=e,fe||(pe=me=!1,Oe())});var _e=!1;function ve(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function ye(){if(!_e&&!ve()){window.addEventListener(`mousedown`,we,{capture:!0}),window.addEventListener(`mousemove`,we,{capture:!0}),window.addEventListener(`mouseup`,we,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,be,{capture:!0});_e=!0}}if(d){ye(),document.addEventListener(`DOMContentLoaded`,ye,{once:!0});let e=0,t=window.setInterval(()=>{if(_e){window.clearInterval(t);return}ye(),++e>100&&window.clearInterval(t)},50)}function be(e){(T||me)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var xe=0,Se=1,Ce=2;function we(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=xe,ge||(n=D|1<{n=e,r=t}),this.constructor[tt]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[$e]:{configurable:!1,enumerable:!1,writable:!0,value:null},[et]:{configurable:!1,enumerable:!1,writable:!1,value:rt(i,a)}});let o=at(i,a);try{e(it(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[et](new Ze(`Promise cancelled.`,{cause:t})),ut(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(Xe(t)||(t=st),Xe(n)||(n=ct),t===st&&n==ct)return new e(e=>e(this));let i={};return this[$e]=i,new e((e,r)=>{super.then(n=>{var a;this[$e]===i&&(this[$e]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[$e]===i&&(this[$e]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return Xe(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[tt](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>ot(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>ot(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>ot(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>ot(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function rt(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new Qe(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new Qe(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function it(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(Xe(r)){try{let r=n.cancel;if(Xe(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?rt(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=at(e,i);try{Reflect.apply(r,n,[it(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function at(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof Ze&&t.reason instanceof Ze&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new Qe(e.promise,n))}else t.settled=!0,e.reject(n)}}function ot(e,t,n){let r=[];for(let i of t){let t;try{if(!Xe(i.then)||(t=i.cancel,!Xe(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new Qe(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new Qe(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function st(e){return e}function ct(e){throw e}function lt(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function ut(e){let t=e[$e]??{};return`promise`in t||Object.assign(t,dt()),e[$e]??(t.resolve(),e[$e]=t),t.promise}var dt=Promise.withResolvers;dt=dt&&typeof dt==`function`?dt.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},d&&(window._wails=window._wails||{});var ft=y(g.Call),pt=y(g.CancelCall),mt=new Map,ht=0,gt=0;function _t(){let e;do e=p();while(mt.has(e));return e}function vt(e){let t=_t(),n=nt.withResolvers();mt.set(t,{resolve:n.resolve,reject:n.reject});let r=ft(ht,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,mt.delete(t),n.resolve(e)},e=>{i=!1,mt.delete(t),n.reject(e)});let a=()=>(mt.delete(t),pt(gt,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function yt(e,...t){return vt({methodID:e,args:t})}var bt=`data-file-drop-target`,xt=`file-drop-target-active`,O=null,St=0,Ct=1,wt=2,Tt=3,Et=4,Dt=5,Ot=6,k=7,kt=8,At=9,jt=10,Mt=11,Nt=12,Pt=13,Ft=14,It=15,Lt=16,Rt=17,zt=18,Bt=19,Vt=20,Ht=21,Ut=22,Wt=23,Gt=24,Kt=25,qt=26,Jt=27,Yt=28,Xt=29,Zt=30,Qt=31,$t=32,en=33,tn=34,nn=35,rn=36,an=37,on=38,sn=39,cn=40,ln=41,un=42,dn=43,fn=44,pn=45,mn=46,hn=47,gn=48,_n=49,vn=50,yn=51,bn=52;function xn(e){return e?e.closest(`[${bt}]`):null}function Sn(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function Cn(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var wn=!1;function Tn(){wn=!1,O&&=(O.classList.remove(xt),null)}function En(){window._wails?.flags?.enableFileDrop!==!1&&(wn=!0)}function Dn(){Tn()}function On(e,t){if(!wn||window._wails?.flags?.enableFileDrop===!1)return;let n=xn(document.elementFromPoint(e,t));O&&O!==n&&O.classList.remove(xt),n?(n.classList.add(xt),O=n):O=null}var A=Symbol(`caller`),kn=new class e{constructor(t=``){this[A]=y(g.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[A](St)}Center(){return this[A](Ct)}Close(){return this[A](wt)}DisableSizeConstraints(){return this[A](Tt)}EnableSizeConstraints(){return this[A](Et)}Focus(){return this[A](Dt)}ForceReload(){return this[A](Ot)}Fullscreen(){return this[A](k)}GetScreen(){return this[A](kt)}GetZoom(){return this[A](At)}Height(){return this[A](jt)}Hide(){return this[A](Mt)}IsFocused(){return this[A](Nt)}IsFullscreen(){return this[A](Pt)}IsMaximised(){return this[A](Ft)}IsMinimised(){return this[A](It)}Maximise(){return this[A](Lt)}Minimise(){return this[A](Rt)}Name(){return this[A](zt)}OpenDevTools(){return this[A](Bt)}RelativePosition(){return this[A](Vt)}Reload(){return this[A](Ht)}Resizable(){return this[A](Ut)}Restore(){return this[A](Wt)}SetPosition(e,t){return this[A](Gt,{x:e,y:t})}SetAlwaysOnTop(e){return this[A](Kt,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[A](qt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[A](Jt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[A](Yt,{enabled:e})}SetMaxSize(e,t){return this[A](Xt,{width:e,height:t})}SetMinSize(e,t){return this[A](Zt,{width:e,height:t})}SetRelativePosition(e,t){return this[A](Qt,{x:e,y:t})}SetResizable(e){return this[A]($t,{resizable:e})}SetSize(e,t){return this[A](en,{width:e,height:t})}SetTitle(e){return this[A](tn,{title:e})}SetZoom(e){return this[A](nn,{zoom:e})}Show(){return this[A](rn)}Size(){return this[A](an)}ToggleFullscreen(){return this[A](on)}ToggleMaximise(){return this[A](sn)}ToggleFrameless(){return this[A](cn)}UnFullscreen(){return this[A](ln)}UnMaximise(){return this[A](un)}UnMinimise(){return this[A](dn)}Width(){return this[A](fn)}Zoom(){return this[A](pn)}ZoomIn(){return this[A](mn)}ZoomOut(){return this[A](hn)}ZoomReset(){return this[A](gn)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=xn(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=xn(document.elementFromPoint(e.clientX,e.clientY));O&&O!==n&&O.classList.remove(xt),n?(n.classList.add(xt),e.dataTransfer.dropEffect=`copy`,O=n):(e.dataTransfer.dropEffect=`none`,O=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=xn(document.elementFromPoint(e.clientX,e.clientY));O&&O!==t&&O.classList.remove(xt),t?(t.classList.contains(xt)||t.classList.add(xt),e.dataTransfer.dropEffect=`copy`,O=t):(e.dataTransfer.dropEffect=`none`,O=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||O&&!O.contains(e.relatedTarget))&&(O&&=(O.classList.remove(xt),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,O&&=(O.classList.remove(xt),null),Sn()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&Cn(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&An(),d&&(window._wails=window._wails||{}),d&&(window._wails.invoke=C,window._wails.clientId=_),d&&(window._wails.handlePlatformFileDrop=kn.HandlePlatformFileDrop.bind(kn)),d&&(window._wails.handleDragEnter=En,window._wails.handleDragLeave=Dn,window._wails.handleDragOver=On),d&&C(`wails:runtime:ready`);function jn(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}d&&jn(`/wails/custom.js`);function Mn(){return yt(1211788486)}function Nn(){return yt(853311305)}function Pn(e){return yt(465937298,e)}function Fn(e){return yt(2463093517,e)}var In=class{getRepoRoot(){return Nn()}setRepoRoot(e){return Fn(e)}async getModules(){return await Mn()??[]}runAction(e){return Pn(e)}};function Ln(e){switch(e){case`repo`:case`branch`:case`worktree`:return`source`;case`issue`:case`pr`:return`collaboration`;case`tag`:return`release`;default:return`all`}}function Rn(e,t){return t===`all`?e:e.filter(e=>Ln(e.id)===t)}var zn=`fastgit.desktop.prefs.v1`;function Bn(){return typeof window<`u`&&window.localStorage!==void 0}function Vn(){if(!Bn())return{};try{let e=window.localStorage.getItem(zn);if(!e)return{};let t=JSON.parse(e);return t&&typeof t==`object`?t:{}}catch{return{}}}function Hn(e){Bn()&&window.localStorage.setItem(zn,JSON.stringify(e))}function Un(e){return`fastgit.desktop.tabs:${e}`}function Wn(e){if(!Bn()||!e)return null;try{let t=window.localStorage.getItem(Un(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!=`object`?null:{openedModuleIds:Array.isArray(n.openedModuleIds)?n.openedModuleIds.map(e=>String(e)):[],selectedModuleId:n.selectedModuleId?String(n.selectedModuleId):null}}catch{return null}}function Gn(e,t){!Bn()||!e||window.localStorage.setItem(Un(e),JSON.stringify(t))}var Kn=(0,l.createContext)(null);function qn(){let e=(0,l.useContext)(Kn);if(!e)throw Error(`useAppContext must be used within AppProvider`);return e}var Jn=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),j=e(((e,t)=>{t.exports=Jn()}))(),Yn={title:`Welcome`,command:`-`,exitCode:0,body:`请选择左侧模块并执行动作。`},Xn=new In;function Zn(e,t){return t?e.includes(t)?e:[...e,t]:e}function Qn(e){return Math.max(220,Math.min(420,e))}function $n(e,t,n){let r=Rn(e,t);return n[n.length-1]??r[0]?.id??e[0]?.id??null}function er(){let e=Vn();return{repoPath:``,repoStatus:`加载中...`,modules:[],selectedModuleId:null,openedModuleIds:[],selectedMenu:e.selectedMenu??`source`,modulePaneWidth:Qn(e.modulePaneWidth??280),modulePaneCollapsed:e.modulePaneCollapsed??!1,busy:!1,output:Yn}}function tr({children:e}){let[t,n]=(0,l.useState)(er),r=(0,l.useCallback)(e=>{n(t=>({...t,busy:e}))},[]),i=(0,l.useCallback)(async()=>{r(!0);try{let[e,t]=await Promise.all([Xn.getRepoRoot(),Xn.getModules()]);n(n=>{let r=Wn(e),i=Rn(t,n.selectedMenu),a=r?.selectedModuleId??n.selectedModuleId,o=a&&i.some(e=>e.id===a)?a:i[0]?.id??t[0]?.id??null,s=new Set(t.map(e=>e.id)),c=(r?.openedModuleIds??n.openedModuleIds).filter(e=>s.has(e));return{...n,repoPath:e,repoStatus:`当前仓库: ${e}`,modules:t,selectedModuleId:o,openedModuleIds:Zn(c,o)}})}catch(e){n(t=>({...t,output:{title:`Load Error`,command:`bootstrap`,exitCode:1,body:String(e)},repoStatus:`加载失败: ${String(e)}`}))}finally{r(!1)}},[r]),a=(0,l.useCallback)(e=>{n(t=>({...t,selectedModuleId:e,openedModuleIds:Zn(t.openedModuleIds,e)}))},[]),o=(0,l.useCallback)(e=>{n(t=>{if(t.selectedMenu===e)return{...t,modulePaneCollapsed:!t.modulePaneCollapsed};let n=Rn(t.modules,e),r=t.selectedModuleId&&n.some(e=>e.id===t.selectedModuleId)?t.selectedModuleId:n[0]?.id??t.modules[0]?.id??null;return{...t,selectedMenu:e,selectedModuleId:r,openedModuleIds:Zn(t.openedModuleIds,r),modulePaneCollapsed:!1}})},[]),s=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.filter(t=>t!==e);if(t.selectedModuleId!==e)return{...t,openedModuleIds:n};let r=$n(t.modules,t.selectedMenu,n);return{...t,openedModuleIds:n,selectedModuleId:r}})},[]),c=(0,l.useCallback)(e=>{n(t=>t.openedModuleIds.includes(e)?{...t,openedModuleIds:[e],selectedModuleId:e}:t)},[]),u=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.indexOf(e);if(n<0)return t;let r=t.openedModuleIds.slice(0,n+1),i=t.selectedModuleId&&r.includes(t.selectedModuleId)?t.selectedModuleId:$n(t.modules,t.selectedMenu,r);return{...t,openedModuleIds:r,selectedModuleId:i}})},[]),d=(0,l.useCallback)((e,t)=>{e!==t&&n(n=>{let r=n.openedModuleIds.indexOf(e),i=n.openedModuleIds.indexOf(t);if(r<0||i<0)return n;let a=[...n.openedModuleIds];a.splice(r,1);let o=a.indexOf(t);return a.splice(o,0,e),{...n,openedModuleIds:a}})},[]),f=(0,l.useCallback)(()=>{n(e=>{let t=Rn(e.modules,e.selectedMenu).find(t=>!e.openedModuleIds.includes(t.id))??e.modules[0];return t?{...e,selectedModuleId:t.id,openedModuleIds:Zn(e.openedModuleIds,t.id),modulePaneCollapsed:!1}:e})},[]),p=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneWidth:Qn(e)}))},[]),m=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneCollapsed:e}))},[]),h=(0,l.useCallback)(async e=>{let t=e.trim();if(t){r(!0);try{await Xn.setRepoRoot(t),await i()}catch(e){n(t=>({...t,repoStatus:`切换失败: ${String(e)}`,output:{title:`Set Repository`,command:`SetRepoRoot`,exitCode:1,body:String(e)}}))}finally{r(!1)}}},[i,r]),g=(0,l.useCallback)(async(e,t,i)=>{r(!0);try{let r=await Xn.runAction({moduleID:e.id,actionID:t.id,values:i});n(n=>({...n,output:{title:`${e.title} / ${t.title}`,command:r.command,exitCode:r.exitCode,body:r.output||`(no output)`}}))}catch(r){n(n=>({...n,output:{title:`${e.title} / ${t.title}`,command:`RunAction`,exitCode:1,body:String(r)}}))}finally{r(!1)}},[r]),_=(0,l.useMemo)(()=>t.selectedModuleId?t.modules.find(e=>e.id===t.selectedModuleId)??null:null,[t.modules,t.selectedModuleId]),v=(0,l.useMemo)(()=>Rn(t.modules,t.selectedMenu),[t.modules,t.selectedMenu]);(0,l.useEffect)(()=>{Hn({selectedMenu:t.selectedMenu,modulePaneWidth:t.modulePaneWidth,modulePaneCollapsed:t.modulePaneCollapsed})},[t.modulePaneCollapsed,t.modulePaneWidth,t.selectedMenu]),(0,l.useEffect)(()=>{if(!t.repoPath)return;let e=new Set(t.modules.map(e=>e.id)),n=t.openedModuleIds.filter(t=>e.has(t)),r=t.selectedModuleId&&e.has(t.selectedModuleId)?t.selectedModuleId:null;Gn(t.repoPath,{openedModuleIds:n,selectedModuleId:r})},[t.modules,t.openedModuleIds,t.repoPath,t.selectedModuleId]);let y=(0,l.useMemo)(()=>({state:t,selectedModule:_,filteredModules:v,setSelectedModule:a,closeModuleTab:s,closeOtherModuleTabs:c,closeTabsToRight:u,reorderModuleTabs:d,addModuleTab:f,setSelectedMenu:o,setModulePaneWidth:p,setModulePaneCollapsed:m,refresh:i,switchRepo:h,runAction:g}),[t,_,v,a,s,c,u,d,f,o,p,m,i,h,g]);return(0,j.jsx)(Kn.Provider,{value:y,children:e})}var nr=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),rr=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),ir=e=>{let t=rr(e);return t.charAt(0).toUpperCase()+t.slice(1)},ar=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),or=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},sr={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},cr=(0,l.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,l.createElement)(`svg`,{ref:c,...sr,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:ar(`lucide`,i),...!a&&!or(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,l.createElement)(e,t)),...Array.isArray(a)?a:[a]])),lr=(e,t)=>{let n=(0,l.forwardRef)(({className:n,...r},i)=>(0,l.createElement)(cr,{ref:i,iconNode:t,className:ar(`lucide-${nr(ir(e))}`,`lucide-${e}`,n),...r}));return n.displayName=ir(e),n},ur=lr(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),dr=lr(`git-fork`,[[`circle`,{cx:`12`,cy:`18`,r:`3`,key:`1mpf1b`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`path`,{d:`M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9`,key:`1uq4wg`}],[`path`,{d:`M12 12v3`,key:`158kv8`}]]),fr=lr(`layout-grid`,[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]),pr=lr(`panel-right-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m8 9 3 3-3 3`,key:`12hl5m`}]]),mr=lr(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),hr=lr(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),gr=lr(`tags`,[[`path`,{d:`M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z`,key:`16rjxf`}],[`path`,{d:`M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193`,key:`178nd4`}],[`circle`,{cx:`10.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`12ikhr`}]]),_r=lr(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function vr(...e){return e.filter(Boolean).join(` `)}function yr({variant:e=`default`,className:t,children:n,...r}){return(0,j.jsx)(`button`,{className:vr(`ui-button`,`ui-button--${e}`,t),...r,children:n})}var br={source:`源码与仓库`,collaboration:`协作与评审`,release:`发布与版本`,all:`全部模块`};function xr(){let{state:e,filteredModules:t,setSelectedModule:n,setModulePaneCollapsed:r,refresh:i}=qn();return(0,j.jsxs)(`aside`,{className:`module-pane`,children:[(0,j.jsxs)(`div`,{className:`module-pane__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:br[e.selectedMenu]??`模块`}),(0,j.jsxs)(`p`,{children:[t.length,` 个模块`]})]}),(0,j.jsxs)(`div`,{className:`module-pane__actions`,children:[(0,j.jsx)(yr,{variant:`ghost`,onClick:()=>void i(),children:`刷新`}),(0,j.jsx)(yr,{variant:`ghost`,className:`module-pane__collapse`,onClick:()=>r(!0),children:(0,j.jsx)(pr,{size:14})})]})]}),(0,j.jsxs)(`div`,{className:`module-pane__list`,children:[t.map(t=>(0,j.jsxs)(`button`,{className:vr(`module-pane__item`,e.selectedModuleId===t.id&&`module-pane__item--active`),onClick:()=>n(t.id),type:`button`,children:[(0,j.jsx)(`strong`,{children:t.title}),(0,j.jsx)(`span`,{children:t.description})]},t.id)),t.length===0&&(0,j.jsx)(`div`,{className:`module-pane__empty`,children:`当前菜单下暂无模块`})]})]})}var Sr=[{id:`source`,label:`源码`,icon:dr},{id:`collaboration`,label:`协作`,icon:ur},{id:`release`,label:`发布`,icon:gr},{id:`all`,label:`全部`,icon:fr}];function Cr(){let{state:e,setSelectedMenu:t,refresh:n}=qn();return(0,j.jsxs)(`aside`,{className:`sidebar-menu-panel`,children:[(0,j.jsx)(`div`,{className:`sidebar-menu-panel__group`,children:Sr.map(n=>{let r=n.icon;return(0,j.jsxs)(`button`,{className:vr(`sidebar-menu-panel__item`,e.selectedMenu===n.id&&`sidebar-menu-panel__item--active`),onClick:()=>t(n.id),title:n.label,type:`button`,children:[(0,j.jsx)(r,{size:18,strokeWidth:2}),(0,j.jsx)(`span`,{children:n.label})]},n.id)})}),(0,j.jsxs)(`div`,{className:`sidebar-menu-panel__footer`,children:[(0,j.jsx)(yr,{variant:`ghost`,className:`sidebar-menu-panel__refresh`,onClick:()=>void n(),children:(0,j.jsx)(hr,{size:14})}),(0,j.jsx)(`span`,{children:e.modulePaneCollapsed?`已收起`:e.busy?`运行中`:`空闲`})]})]})}function wr({className:e,...t}){return(0,j.jsx)(`input`,{className:vr(`ui-input`,e),...t})}function Tr(e){let t=new FormData(e),n={};for(let[e,r]of t.entries())n[e]=String(r).trim();return n}function Er(){let{selectedModule:e,runAction:t}=qn();if(!e)return(0,j.jsx)(`section`,{className:`module-actions`,children:(0,j.jsx)(`div`,{className:`empty-state`,children:`未找到模块,请刷新。`})});let n=e.actions??[],r=n=>r=>{r.preventDefault(),t(e,n,Tr(r.currentTarget))};return(0,j.jsxs)(`section`,{className:`module-actions`,children:[(0,j.jsxs)(`header`,{className:`module-actions__header`,children:[(0,j.jsx)(`h2`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsx)(`div`,{className:`module-actions__grid`,children:n.map((e,t)=>(0,j.jsxs)(`article`,{className:`action-card`,style:{animationDelay:`${t*60}ms`},children:[(0,j.jsxs)(`div`,{className:`action-card__meta`,children:[(0,j.jsx)(`h3`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsxs)(`form`,{onSubmit:r(e),className:`action-card__form`,children:[(0,j.jsx)(`div`,{className:`action-card__fields`,children:(e.fields??[]).map(e=>(0,j.jsxs)(`label`,{className:`action-field`,children:[(0,j.jsx)(`span`,{children:e.label}),(0,j.jsx)(wr,{name:e.key,placeholder:e.placeholder||e.label,defaultValue:e.default||``,required:!!e.required})]},e.key))}),(0,j.jsx)(`div`,{className:`action-card__footer`,children:(0,j.jsx)(yr,{type:`submit`,children:`执行`})})]})]},e.id))})]})}function Dr(){let{state:e}=qn();return(0,j.jsxs)(`section`,{className:`output-panel`,children:[(0,j.jsxs)(`header`,{className:`output-panel__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:e.output.title}),(0,j.jsx)(`p`,{children:e.output.command})]}),(0,j.jsxs)(`span`,{className:e.output.exitCode===0?`status-pill status-pill--ok`:`status-pill status-pill--error`,children:[`exit `,e.output.exitCode]})]}),(0,j.jsx)(`pre`,{className:`output-panel__body`,children:e.output.body})]})}function Or(){let{state:e,switchRepo:t}=qn(),[n,r]=(0,l.useState)(``),i=n||e.repoPath;return(0,j.jsxs)(`section`,{className:`workspace-panel`,children:[(0,j.jsxs)(`header`,{children:[(0,j.jsx)(`h2`,{children:`Workspace`}),(0,j.jsx)(`p`,{children:e.busy?`运行中...`:`准备就绪`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row`,children:[(0,j.jsx)(wr,{value:i,onChange:e=>r(e.target.value),placeholder:`/path/to/repository`}),(0,j.jsx)(yr,{variant:`primary`,onClick:()=>void t(i),children:`切换仓库`})]}),(0,j.jsx)(`p`,{className:`workspace-panel__status`,children:e.repoStatus})]})}var kr=`data:image/svg+xml,%3csvg%20width='512'%20height='512'%20viewBox='0%200%20512%20512'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20role='img'%20aria-label='fastgit%20logo%20icon'%3e%3cdefs%3e%3clinearGradient%20id='bg'%20x1='72'%20y1='56'%20x2='448'%20y2='456'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%233C679F'/%3e%3cstop%20offset='1'%20stop-color='%231F2D44'/%3e%3c/linearGradient%3e%3clinearGradient%20id='stroke'%20x1='136'%20y1='152'%20x2='376'%20y2='360'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F0F3F8'/%3e%3cstop%20offset='1'%20stop-color='%23D6DFEF'/%3e%3c/linearGradient%3e%3c/defs%3e%3crect%20x='56'%20y='56'%20width='400'%20height='400'%20rx='96'%20fill='url(%23bg)'/%3e%3cpath%20d='M168%20336V208C168%20194.745%20178.745%20184%20192%20184H320C333.255%20184%20344%20194.745%20344%20208V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M256%20184V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'/%3e%3ccircle%20cx='168'%20cy='336'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='344'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='184'%20r='30'%20fill='%23E8EDF4'/%3e%3c/svg%3e`;function Ar(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??`workspace`}function jr(){let{state:e,addModuleTab:t,closeModuleTab:n,closeOtherModuleTabs:r,closeTabsToRight:i,reorderModuleTabs:a,setSelectedModule:o}=qn(),s=Ar(e.repoPath),[c,u]=(0,l.useState)(null),[d,f]=(0,l.useState)(null),[p,m]=(0,l.useState)(null),h=e.openedModuleIds.map(t=>e.modules.find(e=>e.id===t)).filter(e=>e!==void 0),g=h.length,_=(0,l.useMemo)(()=>p?h.find(e=>e.id===p.moduleId)??null:null,[p,h]),v=_?h.findIndex(e=>e.id===_.id):-1,y=g>1,b=v>=0&&v{let e=()=>m(null),t=e=>{e.key===`Escape`&&m(null)};return window.addEventListener(`pointerdown`,e),window.addEventListener(`keydown`,t),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,t)}},[]);let x=(e,t)=>{u(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t)},ee=(e,t)=>{e.preventDefault(),c&&c!==t&&f(t)},S=(e,t)=>{e.preventDefault(),!(!c||c===t)&&(a(c,t),f(null),u(null))},C=(e,t)=>{e.preventDefault(),e.stopPropagation(),m({x:e.clientX,y:e.clientY,moduleId:t})},te=e=>{e(),m(null)};return(0,j.jsxs)(`header`,{className:`tabs-header app-drag-region`,children:[(0,j.jsxs)(`div`,{className:`tabs-repo app-no-drag-region`,children:[(0,j.jsx)(`img`,{className:`tabs-repo__logo`,src:kr,alt:`fastgit logo`}),(0,j.jsx)(`span`,{children:s})]}),(0,j.jsx)(`div`,{className:`tabs-track app-no-drag-region`,children:h.map(t=>{let r=e.selectedModuleId===t.id;return(0,j.jsxs)(`div`,{className:[`tabs-track__item`,r?`tabs-track__item--active`:``,d===t.id?`tabs-track__item--drag-over`:``].filter(Boolean).join(` `),onClick:()=>o(t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o(t.id))},onContextMenu:e=>C(e,t.id),draggable:g>1,onDragStart:e=>x(e,t.id),onDragOver:e=>ee(e,t.id),onDrop:e=>S(e,t.id),onDragEnd:()=>{u(null),f(null)},role:`button`,tabIndex:0,"aria-label":`switch to ${t.title}`,"aria-pressed":r,children:[(0,j.jsx)(`span`,{children:t.title}),(0,j.jsx)(`button`,{className:`tabs-track__close`,onClick:e=>{e.stopPropagation(),n(t.id)},onContextMenu:e=>C(e,t.id),type:`button`,"aria-label":`close ${t.title}`,children:(0,j.jsx)(_r,{size:13})})]},t.id)})}),(0,j.jsx)(`button`,{className:`tabs-add app-no-drag-region`,onClick:t,type:`button`,"aria-label":`new tab`,children:(0,j.jsx)(mr,{size:14})}),p&&_&&(0,j.jsxs)(`div`,{className:`tabs-menu app-no-drag-region`,style:{left:`${p.x}px`,top:`${p.y}px`},onPointerDown:e=>e.stopPropagation(),children:[(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>n(_.id)),disabled:!y,children:`关闭标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>r(_.id)),disabled:!y,children:`关闭其他标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>te(()=>i(_.id)),disabled:!b,children:`关闭右侧标签`})]})]})}function Mr(){let{state:e,setModulePaneWidth:t}=qn(),[n,r]=(0,l.useState)(!1),i=n=>{if(window.innerWidth<=900||e.modulePaneCollapsed)return;r(!0);let i=n.clientX,a=e.modulePaneWidth,o=e=>{t(a+(e.clientX-i))},s=()=>{r(!1),window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s)},a={"--module-pane-width":`${e.modulePaneWidth}px`};return(0,j.jsxs)(`main`,{className:`desktop-shell`,children:[(0,j.jsx)(jr,{}),(0,j.jsxs)(`section`,{className:[`desktop-body`,n?`desktop-body--dragging`:``,e.modulePaneCollapsed?`desktop-body--pane-collapsed`:``].filter(Boolean).join(` `),style:a,children:[(0,j.jsx)(Cr,{}),(0,j.jsxs)(`div`,{className:`module-pane-wrap`,children:[(0,j.jsx)(xr,{}),(0,j.jsx)(`div`,{className:`module-pane-resizer`,onMouseDown:i,role:`separator`,"aria-orientation":`vertical`,"aria-label":`resize sidebar`})]}),(0,j.jsxs)(`div`,{className:`desktop-main`,children:[(0,j.jsx)(Or,{}),(0,j.jsx)(Er,{}),(0,j.jsx)(Dr,{})]})]})]})}function Nr(){let{refresh:e}=qn();return(0,l.useEffect)(()=>{e()},[e]),(0,j.jsx)(Mr,{})}function Pr(){return(0,j.jsx)(tr,{children:(0,j.jsx)(Nr,{})})}var Fr=document.getElementById(`app`);if(!Fr)throw Error(`#app not found`);(0,u.createRoot)(Fr).render((0,j.jsx)(l.StrictMode,{children:(0,j.jsx)(Pr,{})})); \ No newline at end of file diff --git a/desktop/frontend/dist/assets/index-DDjpz5O3.css b/desktop/frontend/dist/assets/index-DDjpz5O3.css deleted file mode 100644 index 0fdd3f8..0000000 --- a/desktop/frontend/dist/assets/index-DDjpz5O3.css +++ /dev/null @@ -1 +0,0 @@ -@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e1e7ef;--bg-main:#edf2f8;--bg-topbar:#e3e8f0;--bg-topbar-active:#f1f4f9;--bg-pane:#e3e7ef;--bg-pane-hover:#dce3ed;--bg-card:#eef2f7;--bg-card-soft:#dfe5ee;--bg-input:#edf1f6;--bg-output:#e7edf6;--text-1:#1f2d44;--text-2:#5d708d;--text-3:#8b9ab0;--text-inverse:#fff;--text-output:#1f2d44;--line:#bfcbdb;--line-strong:#adbbd1;--line-output:#b5c4d8;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--brand-soft:#4f7fc41f;--brand-soft-strong:#4f7fc42e;--brand-line:#4f7fc485;--brand-line-strong:#4f7fc47a;--ok:#1b9b4a;--error:#d83f57;--ok-soft:#1b9b4a14;--ok-line:#1b9b4a40;--error-soft:#d83f5714;--error-line:#d83f5740;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14;--shadow-menu:0 8px 20px #131f322e;--highlight-stroke:#ffffff57}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-repo__logo{flex:0 0 14px;width:14px;height:14px;display:block}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{border-color:var(--brand-line);background:var(--brand-soft)}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;margin-left:auto;display:inline-flex}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);min-width:150px;box-shadow:var(--shadow-menu);border-radius:10px;gap:3px;padding:6px;display:grid;position:fixed}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line);background:var(--bg-pane);color:var(--text-2);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;font-weight:600;display:grid}.sidebar-menu-panel__item:hover{color:var(--text-1);background:var(--bg-pane-hover)}.sidebar-menu-panel__item--active{color:var(--text-1);background:var(--bg-card-soft);box-shadow:inset 0 0 0 1px var(--line-strong)}.sidebar-menu-panel__footer{border-top:1px solid var(--line);color:var(--text-2);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{border-color:var(--line-strong);width:36px;height:32px;color:var(--text-2);padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:var(--brand-line-strong)}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:auto 1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.workspace-panel,.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 var(--highlight-stroke), var(--shadow-card);padding:12px}.workspace-panel header{justify-content:space-between;align-items:baseline;margin-bottom:8px;display:flex}.workspace-panel h2{font-size:14px}.workspace-panel header p,.workspace-panel__status{color:var(--text-2);font-size:12px}.workspace-panel__row{gap:8px;display:flex}.workspace-panel__status{margin-top:8px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto auto}}@media (width<=640px){.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);box-shadow:0 1px 0 var(--highlight-stroke);gap:10px;padding:12px;animation:.24s both rise-in;display:grid}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button--primary{color:var(--text-inverse);background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft-strong);outline:none}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-line)}.status-pill--error{color:var(--error);background:var(--error-soft);border-color:var(--error-line)}.output-panel__body{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);min-height:180px;max-height:30vh;color:var(--text-output);margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto} diff --git a/desktop/frontend/dist/index.html b/desktop/frontend/dist/index.html index edabb44..0fcfe14 100644 --- a/desktop/frontend/dist/index.html +++ b/desktop/frontend/dist/index.html @@ -4,8 +4,8 @@ fastgit desktop - - + +
diff --git a/desktop/frontend/src/app/app.tsx b/desktop/frontend/src/app/app.tsx index 68928ac..3288d17 100644 --- a/desktop/frontend/src/app/app.tsx +++ b/desktop/frontend/src/app/app.tsx @@ -1,14 +1,15 @@ -import { useEffect } from "react"; +import { useEffect, useRef } from "react"; import { AppProvider } from "./providers/app-provider"; import { useAppContext } from "./providers/app-context"; import { DesktopLayout } from "../layouts/desktop-layout"; function AppBootstrap() { - const { refresh } = useAppContext(); + const { state, refresh } = useAppContext(); + const initialRepoPath = useRef(state.repoPath); useEffect(() => { - void refresh(); + void refresh(initialRepoPath.current); }, [refresh]); return ; diff --git a/desktop/frontend/src/app/providers/app-context.ts b/desktop/frontend/src/app/providers/app-context.ts index 8602589..04708b7 100644 --- a/desktop/frontend/src/app/providers/app-context.ts +++ b/desktop/frontend/src/app/providers/app-context.ts @@ -15,8 +15,10 @@ export interface AppContextValue { setSelectedMenu(menu: SidebarMenuType): void; setModulePaneWidth(width: number): void; setModulePaneCollapsed(collapsed: boolean): void; - refresh(): Promise; + refresh(preferredRepoPath?: string): Promise; + addRepo(path: string): Promise; switchRepo(path: string): Promise; + removeRepo(path: string): Promise; runAction(module: DesktopModule, action: ModuleAction, values: ActionRunRequest["values"]): Promise; } diff --git a/desktop/frontend/src/app/providers/app-provider.tsx b/desktop/frontend/src/app/providers/app-provider.tsx index 503a421..1cb81e0 100644 --- a/desktop/frontend/src/app/providers/app-provider.tsx +++ b/desktop/frontend/src/app/providers/app-provider.tsx @@ -20,6 +20,37 @@ const initialOutput: OperationOutput = { const backend = new BackendService(); +function normalizeRepoPath(path: string): string { + return path.trim(); +} + +function mergeRepoNamespaces(existing: string[], ...paths: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + + const append = (value: string) => { + const normalized = normalizeRepoPath(value); + if (!normalized || seen.has(normalized)) { + return; + } + seen.add(normalized); + result.push(normalized); + }; + + existing.forEach(append); + paths.forEach(append); + + return result; +} + +function prioritizeRepo(existing: string[], path: string): string[] { + const target = normalizeRepoPath(path); + if (!target) { + return existing; + } + return [target, ...existing.filter((item) => normalizeRepoPath(item) !== target)]; +} + function upsertOpened(opened: string[], moduleId: string | null): string[] { if (!moduleId) { return opened; @@ -39,8 +70,15 @@ function fallbackSelection(modules: DesktopModule[], selectedMenu: SidebarMenuTy function createInitialState(): AppState { const prefs = loadPrefs(); + const selectedRepoPath = normalizeRepoPath(prefs.selectedRepoPath ?? ""); + const repoNamespaces = prioritizeRepo( + mergeRepoNamespaces(prefs.repoNamespaces ?? [], selectedRepoPath), + selectedRepoPath + ); + return { - repoPath: "", + repoPath: selectedRepoPath, + repoNamespaces, repoStatus: "加载中...", modules: [], selectedModuleId: null, @@ -60,46 +98,58 @@ export function AppProvider({ children }: AppProviderProps) { setState((prev) => ({ ...prev, busy })); }, []); - const refresh = useCallback(async () => { - setBusy(true); - try { - const [repoPath, modules] = await Promise.all([backend.getRepoRoot(), backend.getModules()]); - setState((prev) => { - const storedTabs = loadWorkspaceTabs(repoPath); - const filtered = filterModulesByMenu(modules, prev.selectedMenu); - const selectedCandidate = storedTabs?.selectedModuleId ?? prev.selectedModuleId; - const nextSelected = - selectedCandidate && filtered.some((module) => module.id === selectedCandidate) - ? selectedCandidate - : filtered[0]?.id ?? modules[0]?.id ?? null; - const availableIDs = new Set(modules.map((module) => module.id)); - const openedCandidate = storedTabs?.openedModuleIds ?? prev.openedModuleIds; - const nextOpened = openedCandidate.filter((id) => availableIDs.has(id)); - - return { + const refresh = useCallback( + async (preferredRepoPath?: string) => { + const preferred = normalizeRepoPath(preferredRepoPath ?? ""); + setBusy(true); + try { + if (preferred) { + await backend.setRepoRoot(preferred); + } + + const [repoPathRaw, modules] = await Promise.all([backend.getRepoRoot(), backend.getModules()]); + const repoPath = normalizeRepoPath(repoPathRaw); + + setState((prev) => { + const storedTabs = loadWorkspaceTabs(repoPath); + const filtered = filterModulesByMenu(modules, prev.selectedMenu); + const selectedCandidate = storedTabs?.selectedModuleId ?? prev.selectedModuleId; + const nextSelected = + selectedCandidate && filtered.some((module) => module.id === selectedCandidate) + ? selectedCandidate + : filtered[0]?.id ?? modules[0]?.id ?? null; + const availableIDs = new Set(modules.map((module) => module.id)); + const openedCandidate = storedTabs?.openedModuleIds ?? prev.openedModuleIds; + const nextOpened = openedCandidate.filter((id) => availableIDs.has(id)); + + return { + ...prev, + repoPath, + repoNamespaces: prioritizeRepo(mergeRepoNamespaces(prev.repoNamespaces, preferred, repoPath), repoPath), + repoStatus: repoPath ? `当前项目: ${repoPath}` : "请先选择项目命名空间", + modules, + selectedModuleId: nextSelected, + openedModuleIds: upsertOpened(nextOpened, nextSelected), + }; + }); + } catch (error) { + const message = String(error); + setState((prev) => ({ ...prev, - repoPath, - repoStatus: `当前仓库: ${repoPath}`, - modules, - selectedModuleId: nextSelected, - openedModuleIds: upsertOpened(nextOpened, nextSelected), - }; - }); - } catch (error) { - setState((prev) => ({ - ...prev, - output: { - title: "Load Error", - command: "bootstrap", - exitCode: 1, - body: String(error), - }, - repoStatus: `加载失败: ${String(error)}`, - })); - } finally { - setBusy(false); - } - }, [setBusy]); + output: { + title: preferred ? "Set Project" : "Load Error", + command: preferred ? "SetProjectRoot" : "bootstrap", + exitCode: 1, + body: message, + }, + repoStatus: preferred ? `项目切换失败: ${message}` : `加载失败: ${message}`, + })); + } finally { + setBusy(false); + } + }, + [setBusy] + ); const setSelectedModule = useCallback((moduleId: string) => { setState((prev) => ({ @@ -240,35 +290,84 @@ export function AppProvider({ children }: AppProviderProps) { const switchRepo = useCallback( async (path: string) => { - const next = path.trim(); - if (!next) { + const next = normalizeRepoPath(path); + if (!next || next === state.repoPath) { return; } - setBusy(true); - try { - await backend.setRepoRoot(next); - await refresh(); - } catch (error) { + setState((prev) => ({ + ...prev, + repoNamespaces: prioritizeRepo(mergeRepoNamespaces(prev.repoNamespaces, next), next), + })); + await refresh(next); + }, + [refresh, state.repoPath] + ); + + const addRepo = useCallback(async (path: string) => { + const next = normalizeRepoPath(path); + if (!next) { + return; + } + + setState((prev) => ({ + ...prev, + repoNamespaces: mergeRepoNamespaces(prev.repoNamespaces, next), + repoStatus: + next === prev.repoPath + ? `当前项目: ${prev.repoPath}` + : `已添加项目命名空间: ${next}`, + })); + }, []); + + const removeRepo = useCallback( + async (path: string) => { + const target = normalizeRepoPath(path); + if (!target) { + return; + } + + const nextNamespaces = state.repoNamespaces.filter((repoPath) => repoPath !== target); + if (nextNamespaces.length === state.repoNamespaces.length) { + return; + } + + if (state.repoPath === target) { + if (nextNamespaces.length === 0) { + return; + } + setState((prev) => ({ ...prev, - repoStatus: `切换失败: ${String(error)}`, - output: { - title: "Set Repository", - command: "SetRepoRoot", - exitCode: 1, - body: String(error), - }, + repoNamespaces: nextNamespaces, })); - } finally { - setBusy(false); + await refresh(nextNamespaces[0]); + return; } + + setState((prev) => ({ + ...prev, + repoNamespaces: nextNamespaces, + })); }, - [refresh, setBusy] + [refresh, state.repoNamespaces, state.repoPath] ); const runAction = useCallback( async (module: DesktopModule, action: ModuleAction, values: Record) => { + if (!state.repoPath) { + setState((prev) => ({ + ...prev, + output: { + title: `${module.title} / ${action.title}`, + command: "RunAction", + exitCode: 1, + body: "请先选择项目命名空间。", + }, + })); + return; + } + setBusy(true); try { const result = await backend.runAction({ @@ -299,7 +398,7 @@ export function AppProvider({ children }: AppProviderProps) { setBusy(false); } }, - [setBusy] + [setBusy, state.repoPath] ); const selectedModule = useMemo(() => { @@ -319,8 +418,10 @@ export function AppProvider({ children }: AppProviderProps) { selectedMenu: state.selectedMenu, modulePaneWidth: state.modulePaneWidth, modulePaneCollapsed: state.modulePaneCollapsed, + repoNamespaces: state.repoNamespaces, + selectedRepoPath: state.repoPath, }); - }, [state.modulePaneCollapsed, state.modulePaneWidth, state.selectedMenu]); + }, [state.modulePaneCollapsed, state.modulePaneWidth, state.repoNamespaces, state.repoPath, state.selectedMenu]); useEffect(() => { if (!state.repoPath) { @@ -353,7 +454,9 @@ export function AppProvider({ children }: AppProviderProps) { setModulePaneWidth, setModulePaneCollapsed, refresh, + addRepo, switchRepo, + removeRepo, runAction, }), [ @@ -370,7 +473,9 @@ export function AppProvider({ children }: AppProviderProps) { setModulePaneWidth, setModulePaneCollapsed, refresh, + addRepo, switchRepo, + removeRepo, runAction, ] ); diff --git a/desktop/frontend/src/app/types.ts b/desktop/frontend/src/app/types.ts index 0d8eb01..90491e9 100644 --- a/desktop/frontend/src/app/types.ts +++ b/desktop/frontend/src/app/types.ts @@ -18,6 +18,7 @@ export interface OperationOutput { export interface AppState { repoPath: string; + repoNamespaces: string[]; repoStatus: string; modules: DesktopModule[]; selectedModuleId: string | null; diff --git a/desktop/frontend/src/features/workspace/repo-switcher.tsx b/desktop/frontend/src/features/workspace/repo-switcher.tsx index 993c717..1c13219 100644 --- a/desktop/frontend/src/features/workspace/repo-switcher.tsx +++ b/desktop/frontend/src/features/workspace/repo-switcher.tsx @@ -1,32 +1,140 @@ -import { useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { Button } from "../../components/ui/button"; import { Input } from "../../components/ui/input"; import { useAppContext } from "../../app/providers/app-context"; export function RepoSwitcher() { - const { state, switchRepo } = useAppContext(); + const { state, addRepo, switchRepo, removeRepo } = useAppContext(); const [draft, setDraft] = useState(""); + const [selectedPath, setSelectedPath] = useState(""); + const [query, setQuery] = useState(""); - const value = draft || state.repoPath; + useEffect(() => { + setSelectedPath(state.repoPath); + }, [state.repoPath]); + + const canAdd = draft.trim().length > 0; + + const filteredRepos = useMemo(() => { + const keyword = query.trim().toLowerCase(); + if (!keyword) { + return state.repoNamespaces; + } + return state.repoNamespaces.filter((repoPath) => repoPath.toLowerCase().includes(keyword)); + }, [query, state.repoNamespaces]); + + const onAddOnly = async () => { + const next = draft.trim(); + if (!next) { + return; + } + await addRepo(next); + setDraft(""); + }; + + const onAddAndSwitch = async () => { + const next = draft.trim(); + if (!next) { + return; + } + await switchRepo(next); + setDraft(""); + }; return ( -
-
-

Workspace

-

{state.busy ? "运行中..." : "准备就绪"}

+
+
+

Settings · Projects

+

{state.repoNamespaces.length} 个项目

-
+ +
+ 当前项目 + {state.repoPath || "未选择"} +
+ +
setDraft(event.target.value)} - placeholder="/path/to/repository" + placeholder="/path/to/project (git repository)" /> - + +
+ +
+ setQuery(event.target.value)} placeholder="筛选项目..." /> + + {filteredRepos.length} / {state.repoNamespaces.length} +
-

{state.repoStatus}

+ +
+ {filteredRepos.map((repoPath) => { + const isCurrent = repoPath === state.repoPath; + const isSelected = repoPath === selectedPath; + return ( +
setSelectedPath(repoPath)} + role="button" + tabIndex={0} + onKeyDown={(event) => { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + setSelectedPath(repoPath); + } + }} + > +
+ {repoPath.split(/[\\/]/).filter(Boolean).pop() || repoPath} + {repoPath} +
+
+ + {isCurrent ? "当前" : "可切换"} + + + +
+
+ ); + })} + {filteredRepos.length === 0 &&
没有匹配的项目
} +
+ +

{state.repoStatus}

); } diff --git a/desktop/frontend/src/features/workspace/top-tabs.tsx b/desktop/frontend/src/features/workspace/top-tabs.tsx index 9f8ab32..4764444 100644 --- a/desktop/frontend/src/features/workspace/top-tabs.tsx +++ b/desktop/frontend/src/features/workspace/top-tabs.tsx @@ -1,15 +1,53 @@ -import { useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import type { DragEvent, MouseEvent } from "react"; -import { Plus, X } from "lucide-react"; +import { Plus, Settings2, X } from "lucide-react"; import { useAppContext } from "../../app/providers/app-context"; import logoIcon from "../../assets/brand/fastgit-logo-icon.svg"; +import { RepoSwitcher } from "./repo-switcher"; function basename(path: string): string { const parts = path.split(/[\\/]/).filter(Boolean); return parts[parts.length - 1] ?? "workspace"; } +function pathSegments(path: string): string[] { + return path.split(/[\\/]/).filter(Boolean); +} + +function buildProjectLabels(paths: string[]): Map { + const labels = new Map(); + + for (const path of paths) { + const segments = pathSegments(path); + if (segments.length === 0) { + labels.set(path, path); + continue; + } + + let label = segments[segments.length - 1]; + for (let depth = 1; depth <= segments.length; depth += 1) { + const candidate = segments.slice(-depth).join("/"); + const duplicated = paths.some((otherPath) => { + if (otherPath === path) { + return false; + } + const otherSegments = pathSegments(otherPath); + return otherSegments.slice(-depth).join("/") === candidate; + }); + if (!duplicated) { + label = candidate; + break; + } + label = candidate; + } + + labels.set(path, label); + } + + return labels; +} + export function TopTabs() { const { state, @@ -19,11 +57,16 @@ export function TopTabs() { closeTabsToRight, reorderModuleTabs, setSelectedModule, + switchRepo, } = useAppContext(); - const repoName = basename(state.repoPath); + const projectLabels = useMemo(() => buildProjectLabels(state.repoNamespaces), [state.repoNamespaces]); + const repoName = state.repoPath ? projectLabels.get(state.repoPath) ?? basename(state.repoPath) : "workspace"; const [draggedId, setDraggedId] = useState(null); const [dragOverId, setDragOverId] = useState(null); const [menu, setMenu] = useState<{ x: number; y: number; moduleId: string } | null>(null); + const [settingsOpen, setSettingsOpen] = useState(false); + const settingsPanelRef = useRef(null); + const settingsButtonRef = useRef(null); const openedModules = state.openedModuleIds .map((id) => state.modules.find((module) => module.id === id)) .filter((module): module is NonNullable => module !== undefined); @@ -40,10 +83,24 @@ export function TopTabs() { const hasRight = menuIndex >= 0 && menuIndex < openedCount - 1; useEffect(() => { - const onPointerDown = () => setMenu(null); + const onPointerDown = (event: PointerEvent) => { + setMenu(null); + if (!settingsOpen) { + return; + } + const target = event.target as Node | null; + if (!target) { + return; + } + if (settingsButtonRef.current?.contains(target) || settingsPanelRef.current?.contains(target)) { + return; + } + setSettingsOpen(false); + }; const onKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") { setMenu(null); + setSettingsOpen(false); } }; window.addEventListener("pointerdown", onPointerDown); @@ -52,7 +109,7 @@ export function TopTabs() { window.removeEventListener("pointerdown", onPointerDown); window.removeEventListener("keydown", onKeyDown); }; - }, []); + }, [settingsOpen]); const handleDragStart = (event: DragEvent, moduleId: string) => { setDraggedId(moduleId); @@ -151,9 +208,45 @@ export function TopTabs() { })} - +
+ + + + + +
+ + {settingsOpen && ( +
event.stopPropagation()} + > + +
+ )} {menu && menuModule && (
-
diff --git a/desktop/frontend/src/lib/persistence.ts b/desktop/frontend/src/lib/persistence.ts index d006fbe..d570023 100644 --- a/desktop/frontend/src/lib/persistence.ts +++ b/desktop/frontend/src/lib/persistence.ts @@ -6,6 +6,8 @@ export interface DesktopPrefs { selectedMenu: SidebarMenuType; modulePaneWidth: number; modulePaneCollapsed: boolean; + repoNamespaces: string[]; + selectedRepoPath: string; } interface WorkspaceTabs { @@ -28,7 +30,21 @@ export function loadPrefs(): Partial { return {}; } const parsed = JSON.parse(raw) as Partial; - return parsed && typeof parsed === "object" ? parsed : {}; + if (!parsed || typeof parsed !== "object") { + return {}; + } + + const repoNamespaces = Array.isArray(parsed.repoNamespaces) + ? parsed.repoNamespaces.map((value) => String(value).trim()).filter(Boolean) + : undefined; + const selectedRepoPath = + typeof parsed.selectedRepoPath === "string" ? parsed.selectedRepoPath.trim() : undefined; + + return { + ...parsed, + repoNamespaces, + selectedRepoPath, + }; } catch { return {}; } diff --git a/desktop/frontend/src/styles/forms.css b/desktop/frontend/src/styles/forms.css index 93da46f..48a1644 100644 --- a/desktop/frontend/src/styles/forms.css +++ b/desktop/frontend/src/styles/forms.css @@ -22,6 +22,13 @@ background: var(--bg-pane-hover); } +.ui-button:disabled { + cursor: not-allowed; + color: var(--text-3); + border-color: var(--line); + background: var(--bg-pane); +} + .ui-button--primary { border-color: transparent; color: var(--text-inverse); @@ -33,6 +40,12 @@ border-color: transparent; } +.ui-button--primary:disabled { + color: var(--text-inverse); + border-color: transparent; + background: var(--line-strong); +} + .ui-button--ghost { background: transparent; } diff --git a/desktop/frontend/src/styles/layout.css b/desktop/frontend/src/styles/layout.css index ad1b4ae..e65a2a3 100644 --- a/desktop/frontend/src/styles/layout.css +++ b/desktop/frontend/src/styles/layout.css @@ -99,7 +99,32 @@ } .tabs-add { + width: 26px; + height: 26px; + border: 1px solid var(--line); + border-radius: 7px; + background: var(--bg-topbar-active); + color: var(--text-2); + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; +} + +.tabs-actions { margin-left: auto; + display: inline-flex; + align-items: center; + gap: 8px; +} + +.tabs-project-select { + min-width: 220px; + height: 28px; + font-size: 12px; +} + +.tabs-settings { width: 26px; height: 26px; border: 1px solid var(--line); @@ -112,6 +137,19 @@ cursor: pointer; } +.tabs-settings-panel { + position: fixed; + z-index: 40; + right: 12px; + top: 46px; + width: min(620px, calc(100vw - 24px)); + border: 1px solid var(--line); + border-radius: 12px; + background: var(--bg-card); + box-shadow: var(--shadow-menu); + padding: 10px; +} + .tabs-menu { position: fixed; z-index: 30; @@ -340,12 +378,11 @@ .desktop-main { min-height: 0; display: grid; - grid-template-rows: auto 1fr auto; + grid-template-rows: 1fr auto; gap: 10px; padding: 10px; } -.workspace-panel, .module-actions, .output-panel { border: 1px solid var(--line); @@ -355,30 +392,139 @@ padding: 12px; } -.workspace-panel header { +.workspace-panel__row { + display: flex; + align-items: center; + gap: 8px; +} + +.workspace-panel__row--add .ui-input { + flex: 1; +} + +.repo-settings { + display: grid; + gap: 8px; +} + +.repo-settings__header { display: flex; justify-content: space-between; align-items: baseline; - margin-bottom: 8px; } -.workspace-panel h2 { +.repo-settings__header h3 { + margin: 0; font-size: 14px; } -.workspace-panel header p, -.workspace-panel__status { +.repo-settings__header p, +.repo-settings__status, +.repo-settings__count { + margin: 0; color: var(--text-2); font-size: 12px; } -.workspace-panel__row { - display: flex; - gap: 8px; +.repo-settings__current { + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--bg-topbar-active); + padding: 8px 10px; + display: grid; + gap: 3px; +} + +.repo-settings__current span { + font-size: 11px; + color: var(--text-2); } -.workspace-panel__status { +.repo-settings__current strong { + font-size: 12px; + color: var(--text-1); + word-break: break-all; +} + +.repo-list { margin-top: 8px; + max-height: 180px; + overflow: auto; + display: grid; + gap: 8px; +} + +.repo-item { + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--bg-card-soft); + padding: 8px; + display: grid; + gap: 7px; + cursor: pointer; +} + +.repo-item--selected { + box-shadow: inset 0 0 0 1px var(--brand-line); +} + +.repo-item--current { + background: var(--bg-topbar-active); + border-color: var(--line-strong); +} + +.repo-item__meta { + min-width: 0; +} + +.repo-item__meta strong { + display: block; + font-size: 12px; + color: var(--text-1); +} + +.repo-item__meta span { + display: block; + margin-top: 2px; + font-size: 11px; + color: var(--text-2); + word-break: break-all; +} + +.repo-item__actions { + display: flex; + align-items: center; + gap: 6px; +} + +.repo-item__actions .ui-button { + min-height: 28px; + padding: 0 10px; + font-size: 11px; +} + +.repo-badge { + font-size: 11px; + color: var(--text-2); + border: 1px solid var(--line); + border-radius: 999px; + padding: 1px 8px; + background: var(--bg-pane); +} + +.repo-badge--active { + color: var(--brand-strong); + border-color: var(--brand-line); + background: var(--brand-soft); +} + +.repo-list__empty { + border: 1px dashed var(--line-strong); + border-radius: var(--radius-md); + padding: 10px; + text-align: center; + color: var(--text-2); + font-size: 12px; } @media (max-width: 1120px) { @@ -441,11 +587,28 @@ } .desktop-main { - grid-template-rows: auto auto auto; + grid-template-rows: auto auto; + } + + .tabs-project-select { + min-width: 0; + width: 140px; + } + + .tabs-settings-panel { + top: 84px; } } @media (max-width: 640px) { + .tabs-actions { + gap: 4px; + } + + .tabs-project-select { + width: 110px; + } + .workspace-panel__row { flex-direction: column; } From bb882359ef3244984029ab9cc074211ac95acd17 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 30 Jun 2026 16:06:06 +0800 Subject: [PATCH 08/16] Remove generated frontend bundle asset --- .../{index-4urArxMX.js => index-CKokO-kX.js} | 2 +- ...{index-BvrVHuHl.css => index-yhaLZGkG.css} | 2 +- desktop/frontend/dist/index.html | 4 +- .../src/app/providers/app-provider.tsx | 211 +++++++++++++++++- desktop/frontend/src/app/types.ts | 11 + .../src/features/output/output-panel.tsx | 27 ++- desktop/frontend/src/styles/output.css | 82 +++++++ 7 files changed, 333 insertions(+), 6 deletions(-) rename desktop/frontend/dist/assets/{index-4urArxMX.js => index-CKokO-kX.js} (89%) rename desktop/frontend/dist/assets/{index-BvrVHuHl.css => index-yhaLZGkG.css} (91%) diff --git a/desktop/frontend/dist/assets/index-4urArxMX.js b/desktop/frontend/dist/assets/index-CKokO-kX.js similarity index 89% rename from desktop/frontend/dist/assets/index-4urArxMX.js rename to desktop/frontend/dist/assets/index-CKokO-kX.js index bdfe51f..d1508bd 100644 --- a/desktop/frontend/dist/assets/index-4urArxMX.js +++ b/desktop/frontend/dist/assets/index-CKokO-kX.js @@ -11,4 +11,4 @@ Error generating stack: `+e.message+` %cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development -`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function C(e){S?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function re(){return!!window._wails?.environment?.Debug}function w(){return new MouseEvent(`mousedown`).buttons===0}function ie(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}d&&document.addEventListener(`DOMContentLoaded`,()=>{}),d&&window.addEventListener(`contextmenu`,ce);var ae=y(g.ContextMenu),oe=0;function se(e,t,n,r){ae(oe,{id:e,x:t,y:n,data:r})}function ce(e){let t=ie(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);se(n,e.clientX,e.clientY,r)}else le(e,t)}function le(e,t){if(re())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{de=e,de||(fe=pe=!1,De())});var ge=!1;function _e(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function ve(){if(!ge&&!_e()){window.addEventListener(`mousedown`,Ce,{capture:!0}),window.addEventListener(`mousemove`,Ce,{capture:!0}),window.addEventListener(`mouseup`,Ce,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,ye,{capture:!0});ge=!0}}if(d){ve(),document.addEventListener(`DOMContentLoaded`,ve,{once:!0});let e=0,t=window.setInterval(()=>{if(ge){window.clearInterval(t);return}ve(),++e>100&&window.clearInterval(t)},50)}function ye(e){(E||pe)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var be=0,xe=1,Se=2;function Ce(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=be,he||(n=O|1<{n=e,r=t}),this.constructor[et]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[Qe]:{configurable:!1,enumerable:!1,writable:!0,value:null},[$e]:{configurable:!1,enumerable:!1,writable:!1,value:nt(i,a)}});let o=it(i,a);try{e(rt(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[$e](new Xe(`Promise cancelled.`,{cause:t})),lt(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(Ye(t)||(t=ot),Ye(n)||(n=st),t===ot&&n==st)return new e(e=>e(this));let i={};return this[Qe]=i,new e((e,r)=>{super.then(n=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return Ye(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[et](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>at(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>at(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>at(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>at(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function nt(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new Ze(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new Ze(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function rt(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(Ye(r)){try{let r=n.cancel;if(Ye(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?nt(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=it(e,i);try{Reflect.apply(r,n,[rt(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function it(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof Xe&&t.reason instanceof Xe&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new Ze(e.promise,n))}else t.settled=!0,e.reject(n)}}function at(e,t,n){let r=[];for(let i of t){let t;try{if(!Ye(i.then)||(t=i.cancel,!Ye(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new Ze(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new Ze(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function ot(e){return e}function st(e){throw e}function ct(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function lt(e){let t=e[Qe]??{};return`promise`in t||Object.assign(t,ut()),e[Qe]??(t.resolve(),e[Qe]=t),t.promise}var ut=Promise.withResolvers;ut=ut&&typeof ut==`function`?ut.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},d&&(window._wails=window._wails||{});var dt=y(g.Call),ft=y(g.CancelCall),pt=new Map,mt=0,ht=0;function gt(){let e;do e=p();while(pt.has(e));return e}function _t(e){let t=gt(),n=tt.withResolvers();pt.set(t,{resolve:n.resolve,reject:n.reject});let r=dt(mt,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,pt.delete(t),n.resolve(e)},e=>{i=!1,pt.delete(t),n.reject(e)});let a=()=>(pt.delete(t),ft(ht,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function vt(e,...t){return _t({methodID:e,args:t})}var yt=`data-file-drop-target`,bt=`file-drop-target-active`,k=null,xt=0,St=1,Ct=2,wt=3,Tt=4,Et=5,Dt=6,Ot=7,kt=8,At=9,jt=10,Mt=11,Nt=12,Pt=13,Ft=14,It=15,Lt=16,Rt=17,zt=18,Bt=19,Vt=20,Ht=21,Ut=22,Wt=23,Gt=24,Kt=25,qt=26,Jt=27,Yt=28,Xt=29,Zt=30,Qt=31,$t=32,en=33,tn=34,nn=35,rn=36,an=37,on=38,sn=39,cn=40,ln=41,un=42,dn=43,fn=44,pn=45,mn=46,hn=47,gn=48,_n=49,vn=50,yn=51,bn=52;function xn(e){return e?e.closest(`[${yt}]`):null}function Sn(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function Cn(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var wn=!1;function Tn(){wn=!1,k&&=(k.classList.remove(bt),null)}function En(){window._wails?.flags?.enableFileDrop!==!1&&(wn=!0)}function Dn(){Tn()}function On(e,t){if(!wn||window._wails?.flags?.enableFileDrop===!1)return;let n=xn(document.elementFromPoint(e,t));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),k=n):k=null}var A=Symbol(`caller`),kn=new class e{constructor(t=``){this[A]=y(g.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[A](xt)}Center(){return this[A](St)}Close(){return this[A](Ct)}DisableSizeConstraints(){return this[A](wt)}EnableSizeConstraints(){return this[A](Tt)}Focus(){return this[A](Et)}ForceReload(){return this[A](Dt)}Fullscreen(){return this[A](Ot)}GetScreen(){return this[A](kt)}GetZoom(){return this[A](At)}Height(){return this[A](jt)}Hide(){return this[A](Mt)}IsFocused(){return this[A](Nt)}IsFullscreen(){return this[A](Pt)}IsMaximised(){return this[A](Ft)}IsMinimised(){return this[A](It)}Maximise(){return this[A](Lt)}Minimise(){return this[A](Rt)}Name(){return this[A](zt)}OpenDevTools(){return this[A](Bt)}RelativePosition(){return this[A](Vt)}Reload(){return this[A](Ht)}Resizable(){return this[A](Ut)}Restore(){return this[A](Wt)}SetPosition(e,t){return this[A](Gt,{x:e,y:t})}SetAlwaysOnTop(e){return this[A](Kt,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[A](qt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[A](Jt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[A](Yt,{enabled:e})}SetMaxSize(e,t){return this[A](Xt,{width:e,height:t})}SetMinSize(e,t){return this[A](Zt,{width:e,height:t})}SetRelativePosition(e,t){return this[A](Qt,{x:e,y:t})}SetResizable(e){return this[A]($t,{resizable:e})}SetSize(e,t){return this[A](en,{width:e,height:t})}SetTitle(e){return this[A](tn,{title:e})}SetZoom(e){return this[A](nn,{zoom:e})}Show(){return this[A](rn)}Size(){return this[A](an)}ToggleFullscreen(){return this[A](on)}ToggleMaximise(){return this[A](sn)}ToggleFrameless(){return this[A](cn)}UnFullscreen(){return this[A](ln)}UnMaximise(){return this[A](un)}UnMinimise(){return this[A](dn)}Width(){return this[A](fn)}Zoom(){return this[A](pn)}ZoomIn(){return this[A](mn)}ZoomOut(){return this[A](hn)}ZoomReset(){return this[A](gn)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=xn(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=n):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==t&&k.classList.remove(bt),t?(t.classList.contains(bt)||t.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=t):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||k&&!k.contains(e.relatedTarget))&&(k&&=(k.classList.remove(bt),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,k&&=(k.classList.remove(bt),null),Sn()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&Cn(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&An(),d&&(window._wails=window._wails||{}),d&&(window._wails.invoke=C,window._wails.clientId=_),d&&(window._wails.handlePlatformFileDrop=kn.HandlePlatformFileDrop.bind(kn)),d&&(window._wails.handleDragEnter=En,window._wails.handleDragLeave=Dn,window._wails.handleDragOver=On),d&&C(`wails:runtime:ready`);function jn(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}d&&jn(`/wails/custom.js`);function Mn(){return vt(1211788486)}function Nn(){return vt(853311305)}function Pn(e){return vt(465937298,e)}function Fn(e){return vt(2463093517,e)}var In=class{getRepoRoot(){return Nn()}setRepoRoot(e){return Fn(e)}async getModules(){return await Mn()??[]}runAction(e){return Pn(e)}};function Ln(e){switch(e){case`repo`:case`branch`:case`worktree`:return`source`;case`issue`:case`pr`:return`collaboration`;case`tag`:return`release`;default:return`all`}}function Rn(e,t){return t===`all`?e:e.filter(e=>Ln(e.id)===t)}var zn=`fastgit.desktop.prefs.v1`;function Bn(){return typeof window<`u`&&window.localStorage!==void 0}function Vn(){if(!Bn())return{};try{let e=window.localStorage.getItem(zn);if(!e)return{};let t=JSON.parse(e);if(!t||typeof t!=`object`)return{};let n=Array.isArray(t.repoNamespaces)?t.repoNamespaces.map(e=>String(e).trim()).filter(Boolean):void 0,r=typeof t.selectedRepoPath==`string`?t.selectedRepoPath.trim():void 0;return{...t,repoNamespaces:n,selectedRepoPath:r}}catch{return{}}}function Hn(e){Bn()&&window.localStorage.setItem(zn,JSON.stringify(e))}function Un(e){return`fastgit.desktop.tabs:${e}`}function Wn(e){if(!Bn()||!e)return null;try{let t=window.localStorage.getItem(Un(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!=`object`?null:{openedModuleIds:Array.isArray(n.openedModuleIds)?n.openedModuleIds.map(e=>String(e)):[],selectedModuleId:n.selectedModuleId?String(n.selectedModuleId):null}}catch{return null}}function Gn(e,t){!Bn()||!e||window.localStorage.setItem(Un(e),JSON.stringify(t))}var Kn=(0,l.createContext)(null);function qn(){let e=(0,l.useContext)(Kn);if(!e)throw Error(`useAppContext must be used within AppProvider`);return e}var Jn=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),j=e(((e,t)=>{t.exports=Jn()}))(),Yn={title:`Welcome`,command:`-`,exitCode:0,body:`请选择左侧模块并执行动作。`},Xn=new In;function Zn(e){return e.trim()}function Qn(e,...t){let n=new Set,r=[],i=e=>{let t=Zn(e);!t||n.has(t)||(n.add(t),r.push(t))};return e.forEach(i),t.forEach(i),r}function $n(e,t){let n=Zn(t);return n?[n,...e.filter(e=>Zn(e)!==n)]:e}function er(e,t){return t?e.includes(t)?e:[...e,t]:e}function tr(e){return Math.max(220,Math.min(420,e))}function nr(e,t,n){let r=Rn(e,t);return n[n.length-1]??r[0]?.id??e[0]?.id??null}function rr(){let e=Vn(),t=Zn(e.selectedRepoPath??``);return{repoPath:t,repoNamespaces:$n(Qn(e.repoNamespaces??[],t),t),repoStatus:`加载中...`,modules:[],selectedModuleId:null,openedModuleIds:[],selectedMenu:e.selectedMenu??`source`,modulePaneWidth:tr(e.modulePaneWidth??280),modulePaneCollapsed:e.modulePaneCollapsed??!1,busy:!1,output:Yn}}function ir({children:e}){let[t,n]=(0,l.useState)(rr),r=(0,l.useCallback)(e=>{n(t=>({...t,busy:e}))},[]),i=(0,l.useCallback)(async e=>{let t=Zn(e??``);r(!0);try{t&&await Xn.setRepoRoot(t);let[e,r]=await Promise.all([Xn.getRepoRoot(),Xn.getModules()]),i=Zn(e);n(e=>{let n=Wn(i),a=Rn(r,e.selectedMenu),o=n?.selectedModuleId??e.selectedModuleId,s=o&&a.some(e=>e.id===o)?o:a[0]?.id??r[0]?.id??null,c=new Set(r.map(e=>e.id)),l=(n?.openedModuleIds??e.openedModuleIds).filter(e=>c.has(e));return{...e,repoPath:i,repoNamespaces:$n(Qn(e.repoNamespaces,t,i),i),repoStatus:i?`当前项目: ${i}`:`请先选择项目命名空间`,modules:r,selectedModuleId:s,openedModuleIds:er(l,s)}})}catch(e){let r=String(e);n(e=>({...e,output:{title:t?`Set Project`:`Load Error`,command:t?`SetProjectRoot`:`bootstrap`,exitCode:1,body:r},repoStatus:t?`项目切换失败: ${r}`:`加载失败: ${r}`}))}finally{r(!1)}},[r]),a=(0,l.useCallback)(e=>{n(t=>({...t,selectedModuleId:e,openedModuleIds:er(t.openedModuleIds,e)}))},[]),o=(0,l.useCallback)(e=>{n(t=>{if(t.selectedMenu===e)return{...t,modulePaneCollapsed:!t.modulePaneCollapsed};let n=Rn(t.modules,e),r=t.selectedModuleId&&n.some(e=>e.id===t.selectedModuleId)?t.selectedModuleId:n[0]?.id??t.modules[0]?.id??null;return{...t,selectedMenu:e,selectedModuleId:r,openedModuleIds:er(t.openedModuleIds,r),modulePaneCollapsed:!1}})},[]),s=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.filter(t=>t!==e);if(t.selectedModuleId!==e)return{...t,openedModuleIds:n};let r=nr(t.modules,t.selectedMenu,n);return{...t,openedModuleIds:n,selectedModuleId:r}})},[]),c=(0,l.useCallback)(e=>{n(t=>t.openedModuleIds.includes(e)?{...t,openedModuleIds:[e],selectedModuleId:e}:t)},[]),u=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.indexOf(e);if(n<0)return t;let r=t.openedModuleIds.slice(0,n+1),i=t.selectedModuleId&&r.includes(t.selectedModuleId)?t.selectedModuleId:nr(t.modules,t.selectedMenu,r);return{...t,openedModuleIds:r,selectedModuleId:i}})},[]),d=(0,l.useCallback)((e,t)=>{e!==t&&n(n=>{let r=n.openedModuleIds.indexOf(e),i=n.openedModuleIds.indexOf(t);if(r<0||i<0)return n;let a=[...n.openedModuleIds];a.splice(r,1);let o=a.indexOf(t);return a.splice(o,0,e),{...n,openedModuleIds:a}})},[]),f=(0,l.useCallback)(()=>{n(e=>{let t=Rn(e.modules,e.selectedMenu).find(t=>!e.openedModuleIds.includes(t.id))??e.modules[0];return t?{...e,selectedModuleId:t.id,openedModuleIds:er(e.openedModuleIds,t.id),modulePaneCollapsed:!1}:e})},[]),p=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneWidth:tr(e)}))},[]),m=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneCollapsed:e}))},[]),h=(0,l.useCallback)(async e=>{let r=Zn(e);!r||r===t.repoPath||(n(e=>({...e,repoNamespaces:$n(Qn(e.repoNamespaces,r),r)})),await i(r))},[i,t.repoPath]),g=(0,l.useCallback)(async e=>{let t=Zn(e);t&&n(e=>({...e,repoNamespaces:Qn(e.repoNamespaces,t),repoStatus:t===e.repoPath?`当前项目: ${e.repoPath}`:`已添加项目命名空间: ${t}`}))},[]),_=(0,l.useCallback)(async e=>{let r=Zn(e);if(!r)return;let a=t.repoNamespaces.filter(e=>e!==r);if(a.length!==t.repoNamespaces.length){if(t.repoPath===r){if(a.length===0)return;n(e=>({...e,repoNamespaces:a})),await i(a[0]);return}n(e=>({...e,repoNamespaces:a}))}},[i,t.repoNamespaces,t.repoPath]),v=(0,l.useCallback)(async(e,i,a)=>{if(!t.repoPath){n(t=>({...t,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:`请先选择项目命名空间。`}}));return}r(!0);try{let t=await Xn.runAction({moduleID:e.id,actionID:i.id,values:a});n(n=>({...n,output:{title:`${e.title} / ${i.title}`,command:t.command,exitCode:t.exitCode,body:t.output||`(no output)`}}))}catch(t){n(n=>({...n,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:String(t)}}))}finally{r(!1)}},[r,t.repoPath]),y=(0,l.useMemo)(()=>t.selectedModuleId?t.modules.find(e=>e.id===t.selectedModuleId)??null:null,[t.modules,t.selectedModuleId]),b=(0,l.useMemo)(()=>Rn(t.modules,t.selectedMenu),[t.modules,t.selectedMenu]);(0,l.useEffect)(()=>{Hn({selectedMenu:t.selectedMenu,modulePaneWidth:t.modulePaneWidth,modulePaneCollapsed:t.modulePaneCollapsed,repoNamespaces:t.repoNamespaces,selectedRepoPath:t.repoPath})},[t.modulePaneCollapsed,t.modulePaneWidth,t.repoNamespaces,t.repoPath,t.selectedMenu]),(0,l.useEffect)(()=>{if(!t.repoPath)return;let e=new Set(t.modules.map(e=>e.id)),n=t.openedModuleIds.filter(t=>e.has(t)),r=t.selectedModuleId&&e.has(t.selectedModuleId)?t.selectedModuleId:null;Gn(t.repoPath,{openedModuleIds:n,selectedModuleId:r})},[t.modules,t.openedModuleIds,t.repoPath,t.selectedModuleId]);let x=(0,l.useMemo)(()=>({state:t,selectedModule:y,filteredModules:b,setSelectedModule:a,closeModuleTab:s,closeOtherModuleTabs:c,closeTabsToRight:u,reorderModuleTabs:d,addModuleTab:f,setSelectedMenu:o,setModulePaneWidth:p,setModulePaneCollapsed:m,refresh:i,addRepo:g,switchRepo:h,removeRepo:_,runAction:v}),[t,y,b,a,s,c,u,d,f,o,p,m,i,g,h,_,v]);return(0,j.jsx)(Kn.Provider,{value:x,children:e})}var ar=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),or=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),sr=e=>{let t=or(e);return t.charAt(0).toUpperCase()+t.slice(1)},cr=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),lr=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},ur={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},dr=(0,l.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,l.createElement)(`svg`,{ref:c,...ur,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:cr(`lucide`,i),...!a&&!lr(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,l.createElement)(e,t)),...Array.isArray(a)?a:[a]])),fr=(e,t)=>{let n=(0,l.forwardRef)(({className:n,...r},i)=>(0,l.createElement)(dr,{ref:i,iconNode:t,className:cr(`lucide-${ar(sr(e))}`,`lucide-${e}`,n),...r}));return n.displayName=sr(e),n},pr=fr(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),mr=fr(`git-fork`,[[`circle`,{cx:`12`,cy:`18`,r:`3`,key:`1mpf1b`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`path`,{d:`M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9`,key:`1uq4wg`}],[`path`,{d:`M12 12v3`,key:`158kv8`}]]),hr=fr(`layout-grid`,[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]),gr=fr(`panel-right-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m8 9 3 3-3 3`,key:`12hl5m`}]]),_r=fr(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),vr=fr(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),yr=fr(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]),br=fr(`tags`,[[`path`,{d:`M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z`,key:`16rjxf`}],[`path`,{d:`M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193`,key:`178nd4`}],[`circle`,{cx:`10.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`12ikhr`}]]),xr=fr(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function Sr(...e){return e.filter(Boolean).join(` `)}function Cr({variant:e=`default`,className:t,children:n,...r}){return(0,j.jsx)(`button`,{className:Sr(`ui-button`,`ui-button--${e}`,t),...r,children:n})}var wr={source:`源码与仓库`,collaboration:`协作与评审`,release:`发布与版本`,all:`全部模块`};function Tr(){let{state:e,filteredModules:t,setSelectedModule:n,setModulePaneCollapsed:r,refresh:i}=qn();return(0,j.jsxs)(`aside`,{className:`module-pane`,children:[(0,j.jsxs)(`div`,{className:`module-pane__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:wr[e.selectedMenu]??`模块`}),(0,j.jsxs)(`p`,{children:[t.length,` 个模块`]})]}),(0,j.jsxs)(`div`,{className:`module-pane__actions`,children:[(0,j.jsx)(Cr,{variant:`ghost`,onClick:()=>void i(),children:`刷新`}),(0,j.jsx)(Cr,{variant:`ghost`,className:`module-pane__collapse`,onClick:()=>r(!0),children:(0,j.jsx)(gr,{size:14})})]})]}),(0,j.jsxs)(`div`,{className:`module-pane__list`,children:[t.map(t=>(0,j.jsxs)(`button`,{className:Sr(`module-pane__item`,e.selectedModuleId===t.id&&`module-pane__item--active`),onClick:()=>n(t.id),type:`button`,children:[(0,j.jsx)(`strong`,{children:t.title}),(0,j.jsx)(`span`,{children:t.description})]},t.id)),t.length===0&&(0,j.jsx)(`div`,{className:`module-pane__empty`,children:`当前菜单下暂无模块`})]})]})}var Er=[{id:`source`,label:`源码`,icon:mr},{id:`collaboration`,label:`协作`,icon:pr},{id:`release`,label:`发布`,icon:br},{id:`all`,label:`全部`,icon:hr}];function Dr(){let{state:e,setSelectedMenu:t,refresh:n}=qn();return(0,j.jsxs)(`aside`,{className:`sidebar-menu-panel`,children:[(0,j.jsx)(`div`,{className:`sidebar-menu-panel__group`,children:Er.map(n=>{let r=n.icon;return(0,j.jsxs)(`button`,{className:Sr(`sidebar-menu-panel__item`,e.selectedMenu===n.id&&`sidebar-menu-panel__item--active`),onClick:()=>t(n.id),title:n.label,type:`button`,children:[(0,j.jsx)(r,{size:18,strokeWidth:2}),(0,j.jsx)(`span`,{children:n.label})]},n.id)})}),(0,j.jsxs)(`div`,{className:`sidebar-menu-panel__footer`,children:[(0,j.jsx)(Cr,{variant:`ghost`,className:`sidebar-menu-panel__refresh`,onClick:()=>void n(),children:(0,j.jsx)(vr,{size:14})}),(0,j.jsx)(`span`,{children:e.modulePaneCollapsed?`已收起`:e.busy?`运行中`:`空闲`})]})]})}function Or({className:e,...t}){return(0,j.jsx)(`input`,{className:Sr(`ui-input`,e),...t})}function kr(e){let t=new FormData(e),n={};for(let[e,r]of t.entries())n[e]=String(r).trim();return n}function Ar(){let{selectedModule:e,runAction:t}=qn();if(!e)return(0,j.jsx)(`section`,{className:`module-actions`,children:(0,j.jsx)(`div`,{className:`empty-state`,children:`未找到模块,请刷新。`})});let n=e.actions??[],r=n=>r=>{r.preventDefault(),t(e,n,kr(r.currentTarget))};return(0,j.jsxs)(`section`,{className:`module-actions`,children:[(0,j.jsxs)(`header`,{className:`module-actions__header`,children:[(0,j.jsx)(`h2`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsx)(`div`,{className:`module-actions__grid`,children:n.map((e,t)=>(0,j.jsxs)(`article`,{className:`action-card`,style:{animationDelay:`${t*60}ms`},children:[(0,j.jsxs)(`div`,{className:`action-card__meta`,children:[(0,j.jsx)(`h3`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsxs)(`form`,{onSubmit:r(e),className:`action-card__form`,children:[(0,j.jsx)(`div`,{className:`action-card__fields`,children:(e.fields??[]).map(e=>(0,j.jsxs)(`label`,{className:`action-field`,children:[(0,j.jsx)(`span`,{children:e.label}),(0,j.jsx)(Or,{name:e.key,placeholder:e.placeholder||e.label,defaultValue:e.default||``,required:!!e.required})]},e.key))}),(0,j.jsx)(`div`,{className:`action-card__footer`,children:(0,j.jsx)(Cr,{type:`submit`,children:`执行`})})]})]},e.id))})]})}function jr(){let{state:e}=qn();return(0,j.jsxs)(`section`,{className:`output-panel`,children:[(0,j.jsxs)(`header`,{className:`output-panel__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:e.output.title}),(0,j.jsx)(`p`,{children:e.output.command})]}),(0,j.jsxs)(`span`,{className:e.output.exitCode===0?`status-pill status-pill--ok`:`status-pill status-pill--error`,children:[`exit `,e.output.exitCode]})]}),(0,j.jsx)(`pre`,{className:`output-panel__body`,children:e.output.body})]})}var Mr=`data:image/svg+xml,%3csvg%20width='512'%20height='512'%20viewBox='0%200%20512%20512'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20role='img'%20aria-label='fastgit%20logo%20icon'%3e%3cdefs%3e%3clinearGradient%20id='bg'%20x1='72'%20y1='56'%20x2='448'%20y2='456'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%233C679F'/%3e%3cstop%20offset='1'%20stop-color='%231F2D44'/%3e%3c/linearGradient%3e%3clinearGradient%20id='stroke'%20x1='136'%20y1='152'%20x2='376'%20y2='360'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F0F3F8'/%3e%3cstop%20offset='1'%20stop-color='%23D6DFEF'/%3e%3c/linearGradient%3e%3c/defs%3e%3crect%20x='56'%20y='56'%20width='400'%20height='400'%20rx='96'%20fill='url(%23bg)'/%3e%3cpath%20d='M168%20336V208C168%20194.745%20178.745%20184%20192%20184H320C333.255%20184%20344%20194.745%20344%20208V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M256%20184V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'/%3e%3ccircle%20cx='168'%20cy='336'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='344'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='184'%20r='30'%20fill='%23E8EDF4'/%3e%3c/svg%3e`;function Nr(){let{state:e,addRepo:t,switchRepo:n,removeRepo:r}=qn(),[i,a]=(0,l.useState)(``),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(``);(0,l.useEffect)(()=>{s(e.repoPath)},[e.repoPath]);let d=i.trim().length>0,f=(0,l.useMemo)(()=>{let t=c.trim().toLowerCase();return t?e.repoNamespaces.filter(e=>e.toLowerCase().includes(t)):e.repoNamespaces},[c,e.repoNamespaces]),p=async()=>{let e=i.trim();e&&(await t(e),a(``))},m=async()=>{let e=i.trim();e&&(await n(e),a(``))};return(0,j.jsxs)(`section`,{className:`repo-settings`,"aria-label":`Project settings`,children:[(0,j.jsxs)(`header`,{className:`repo-settings__header`,children:[(0,j.jsx)(`h3`,{children:`Settings · Projects`}),(0,j.jsxs)(`p`,{children:[e.repoNamespaces.length,` 个项目`]})]}),(0,j.jsxs)(`div`,{className:`repo-settings__current`,children:[(0,j.jsx)(`span`,{children:`当前项目`}),(0,j.jsx)(`strong`,{children:e.repoPath||`未选择`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row workspace-panel__row--add`,children:[(0,j.jsx)(Or,{value:i,onChange:e=>a(e.target.value),placeholder:`/path/to/project (git repository)`}),(0,j.jsx)(Cr,{variant:`ghost`,onClick:()=>void p(),disabled:!d,children:`添加`}),(0,j.jsx)(Cr,{variant:`primary`,onClick:()=>void m(),disabled:!d,children:`添加并切换`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row`,children:[(0,j.jsx)(Or,{value:c,onChange:e=>u(e.target.value),placeholder:`筛选项目...`}),(0,j.jsxs)(`span`,{className:`repo-settings__count`,children:[f.length,` / `,e.repoNamespaces.length]})]}),(0,j.jsxs)(`div`,{className:`repo-list`,role:`list`,children:[f.map(t=>{let i=t===e.repoPath;return(0,j.jsxs)(`article`,{className:[`repo-item`,i?`repo-item--current`:``,t===o?`repo-item--selected`:``].filter(Boolean).join(` `),onClick:()=>s(t),role:`button`,tabIndex:0,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),s(t))},children:[(0,j.jsxs)(`div`,{className:`repo-item__meta`,children:[(0,j.jsx)(`strong`,{children:t.split(/[\\/]/).filter(Boolean).pop()||t}),(0,j.jsx)(`span`,{children:t})]}),(0,j.jsxs)(`div`,{className:`repo-item__actions`,children:[(0,j.jsx)(`span`,{className:i?`repo-badge repo-badge--active`:`repo-badge`,children:i?`当前`:`可切换`}),(0,j.jsx)(Cr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),n(t)},disabled:i,children:`切换`}),(0,j.jsx)(Cr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),r(t)},disabled:i,children:`移除`})]})]},t)}),f.length===0&&(0,j.jsx)(`div`,{className:`repo-list__empty`,children:`没有匹配的项目`})]}),(0,j.jsx)(`p`,{className:`repo-settings__status`,children:e.repoStatus})]})}function Pr(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??`workspace`}function Fr(e){return e.split(/[\\/]/).filter(Boolean)}function Ir(e){let t=new Map;for(let n of e){let r=Fr(n);if(r.length===0){t.set(n,n);continue}let i=r[r.length-1];for(let t=1;t<=r.length;t+=1){let a=r.slice(-t).join(`/`);if(!e.some(e=>e===n?!1:Fr(e).slice(-t).join(`/`)===a)){i=a;break}i=a}t.set(n,i)}return t}function Lr(){let{state:e,addModuleTab:t,closeModuleTab:n,closeOtherModuleTabs:r,closeTabsToRight:i,reorderModuleTabs:a,setSelectedModule:o,switchRepo:s}=qn(),c=(0,l.useMemo)(()=>Ir(e.repoNamespaces),[e.repoNamespaces]),u=e.repoPath?c.get(e.repoPath)??Pr(e.repoPath):`workspace`,[d,f]=(0,l.useState)(null),[p,m]=(0,l.useState)(null),[h,g]=(0,l.useState)(null),[_,v]=(0,l.useState)(!1),y=(0,l.useRef)(null),b=(0,l.useRef)(null),x=e.openedModuleIds.map(t=>e.modules.find(e=>e.id===t)).filter(e=>e!==void 0),ee=x.length,S=(0,l.useMemo)(()=>h?x.find(e=>e.id===h.moduleId)??null:null,[h,x]),C=S?x.findIndex(e=>e.id===S.id):-1,te=ee>1,ne=C>=0&&C{let e=e=>{if(g(null),!_)return;let t=e.target;t&&(b.current?.contains(t)||y.current?.contains(t)||v(!1))},t=e=>{e.key===`Escape`&&(g(null),v(!1))};return window.addEventListener(`pointerdown`,e),window.addEventListener(`keydown`,t),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,t)}},[_]);let re=(e,t)=>{f(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t)},w=(e,t)=>{e.preventDefault(),d&&d!==t&&m(t)},ie=(e,t)=>{e.preventDefault(),!(!d||d===t)&&(a(d,t),m(null),f(null))},ae=(e,t)=>{e.preventDefault(),e.stopPropagation(),g({x:e.clientX,y:e.clientY,moduleId:t})},oe=e=>{e(),g(null)};return(0,j.jsxs)(`header`,{className:`tabs-header app-drag-region`,children:[(0,j.jsxs)(`div`,{className:`tabs-repo app-no-drag-region`,children:[(0,j.jsx)(`img`,{className:`tabs-repo__logo`,src:Mr,alt:`fastgit logo`}),(0,j.jsx)(`span`,{children:u})]}),(0,j.jsx)(`div`,{className:`tabs-track app-no-drag-region`,children:x.map(t=>{let r=e.selectedModuleId===t.id;return(0,j.jsxs)(`div`,{className:[`tabs-track__item`,r?`tabs-track__item--active`:``,p===t.id?`tabs-track__item--drag-over`:``].filter(Boolean).join(` `),onClick:()=>o(t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o(t.id))},onContextMenu:e=>ae(e,t.id),draggable:ee>1,onDragStart:e=>re(e,t.id),onDragOver:e=>w(e,t.id),onDrop:e=>ie(e,t.id),onDragEnd:()=>{f(null),m(null)},role:`button`,tabIndex:0,"aria-label":`switch to ${t.title}`,"aria-pressed":r,children:[(0,j.jsx)(`span`,{children:t.title}),(0,j.jsx)(`button`,{className:`tabs-track__close`,onClick:e=>{e.stopPropagation(),n(t.id)},onContextMenu:e=>ae(e,t.id),type:`button`,"aria-label":`close ${t.title}`,children:(0,j.jsx)(xr,{size:13})})]},t.id)})}),(0,j.jsxs)(`div`,{className:`tabs-actions app-no-drag-region`,children:[(0,j.jsxs)(`select`,{className:`ui-input tabs-project-select`,value:e.repoPath,title:e.repoPath||`未选择项目`,onChange:e=>void s(e.target.value),children:[(0,j.jsx)(`option`,{value:``,children:e.repoNamespaces.length===0?`未配置项目`:`选择项目`}),e.repoNamespaces.map(e=>(0,j.jsx)(`option`,{value:e,children:c.get(e)??Pr(e)},e))]}),(0,j.jsx)(`button`,{ref:b,className:`tabs-settings`,onClick:()=>v(e=>!e),type:`button`,"aria-label":`open project settings`,children:(0,j.jsx)(yr,{size:14})}),(0,j.jsx)(`button`,{className:`tabs-add`,onClick:t,type:`button`,"aria-label":`new tab`,children:(0,j.jsx)(_r,{size:14})})]}),_&&(0,j.jsx)(`div`,{ref:y,className:`tabs-settings-panel app-no-drag-region`,onPointerDown:e=>e.stopPropagation(),children:(0,j.jsx)(Nr,{})}),h&&S&&(0,j.jsxs)(`div`,{className:`tabs-menu app-no-drag-region`,style:{left:`${h.x}px`,top:`${h.y}px`},onPointerDown:e=>e.stopPropagation(),children:[(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>n(S.id)),disabled:!te,children:`关闭标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>r(S.id)),disabled:!te,children:`关闭其他标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>i(S.id)),disabled:!ne,children:`关闭右侧标签`})]})]})}function Rr(){let{state:e,setModulePaneWidth:t}=qn(),[n,r]=(0,l.useState)(!1),i=n=>{if(window.innerWidth<=900||e.modulePaneCollapsed)return;r(!0);let i=n.clientX,a=e.modulePaneWidth,o=e=>{t(a+(e.clientX-i))},s=()=>{r(!1),window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s)},a={"--module-pane-width":`${e.modulePaneWidth}px`};return(0,j.jsxs)(`main`,{className:`desktop-shell`,children:[(0,j.jsx)(Lr,{}),(0,j.jsxs)(`section`,{className:[`desktop-body`,n?`desktop-body--dragging`:``,e.modulePaneCollapsed?`desktop-body--pane-collapsed`:``].filter(Boolean).join(` `),style:a,children:[(0,j.jsx)(Dr,{}),(0,j.jsxs)(`div`,{className:`module-pane-wrap`,children:[(0,j.jsx)(Tr,{}),(0,j.jsx)(`div`,{className:`module-pane-resizer`,onMouseDown:i,role:`separator`,"aria-orientation":`vertical`,"aria-label":`resize sidebar`})]}),(0,j.jsxs)(`div`,{className:`desktop-main`,children:[(0,j.jsx)(Ar,{}),(0,j.jsx)(jr,{})]})]})]})}function zr(){let{state:e,refresh:t}=qn(),n=(0,l.useRef)(e.repoPath);return(0,l.useEffect)(()=>{t(n.current)},[t]),(0,j.jsx)(Rr,{})}function Br(){return(0,j.jsx)(ir,{children:(0,j.jsx)(zr,{})})}var Vr=document.getElementById(`app`);if(!Vr)throw Error(`#app not found`);(0,u.createRoot)(Vr).render((0,j.jsx)(l.StrictMode,{children:(0,j.jsx)(Br,{})})); \ No newline at end of file +`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function C(e){S?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function re(){return!!window._wails?.environment?.Debug}function w(){return new MouseEvent(`mousedown`).buttons===0}function ie(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}d&&document.addEventListener(`DOMContentLoaded`,()=>{}),d&&window.addEventListener(`contextmenu`,ce);var ae=y(g.ContextMenu),oe=0;function se(e,t,n,r){ae(oe,{id:e,x:t,y:n,data:r})}function ce(e){let t=ie(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);se(n,e.clientX,e.clientY,r)}else le(e,t)}function le(e,t){if(re())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{de=e,de||(fe=pe=!1,De())});var ge=!1;function _e(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function ve(){if(!ge&&!_e()){window.addEventListener(`mousedown`,Ce,{capture:!0}),window.addEventListener(`mousemove`,Ce,{capture:!0}),window.addEventListener(`mouseup`,Ce,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,ye,{capture:!0});ge=!0}}if(d){ve(),document.addEventListener(`DOMContentLoaded`,ve,{once:!0});let e=0,t=window.setInterval(()=>{if(ge){window.clearInterval(t);return}ve(),++e>100&&window.clearInterval(t)},50)}function ye(e){(E||pe)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var be=0,xe=1,Se=2;function Ce(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=be,he||(n=O|1<{n=e,r=t}),this.constructor[et]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[Qe]:{configurable:!1,enumerable:!1,writable:!0,value:null},[$e]:{configurable:!1,enumerable:!1,writable:!1,value:nt(i,a)}});let o=it(i,a);try{e(rt(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[$e](new Xe(`Promise cancelled.`,{cause:t})),lt(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(Ye(t)||(t=ot),Ye(n)||(n=st),t===ot&&n==st)return new e(e=>e(this));let i={};return this[Qe]=i,new e((e,r)=>{super.then(n=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return Ye(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[et](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>at(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>at(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>at(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>at(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function nt(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new Ze(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new Ze(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function rt(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(Ye(r)){try{let r=n.cancel;if(Ye(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?nt(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=it(e,i);try{Reflect.apply(r,n,[rt(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function it(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof Xe&&t.reason instanceof Xe&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new Ze(e.promise,n))}else t.settled=!0,e.reject(n)}}function at(e,t,n){let r=[];for(let i of t){let t;try{if(!Ye(i.then)||(t=i.cancel,!Ye(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new Ze(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new Ze(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function ot(e){return e}function st(e){throw e}function ct(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function lt(e){let t=e[Qe]??{};return`promise`in t||Object.assign(t,ut()),e[Qe]??(t.resolve(),e[Qe]=t),t.promise}var ut=Promise.withResolvers;ut=ut&&typeof ut==`function`?ut.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},d&&(window._wails=window._wails||{});var dt=y(g.Call),ft=y(g.CancelCall),pt=new Map,mt=0,ht=0;function gt(){let e;do e=p();while(pt.has(e));return e}function _t(e){let t=gt(),n=tt.withResolvers();pt.set(t,{resolve:n.resolve,reject:n.reject});let r=dt(mt,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,pt.delete(t),n.resolve(e)},e=>{i=!1,pt.delete(t),n.reject(e)});let a=()=>(pt.delete(t),ft(ht,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function vt(e,...t){return _t({methodID:e,args:t})}var yt=`data-file-drop-target`,bt=`file-drop-target-active`,k=null,xt=0,St=1,Ct=2,wt=3,Tt=4,Et=5,Dt=6,Ot=7,kt=8,At=9,jt=10,Mt=11,Nt=12,Pt=13,Ft=14,It=15,Lt=16,Rt=17,zt=18,Bt=19,Vt=20,Ht=21,Ut=22,Wt=23,Gt=24,Kt=25,qt=26,Jt=27,Yt=28,Xt=29,Zt=30,Qt=31,$t=32,en=33,tn=34,nn=35,rn=36,an=37,on=38,sn=39,cn=40,ln=41,un=42,dn=43,fn=44,pn=45,mn=46,hn=47,gn=48,_n=49,vn=50,yn=51,bn=52;function xn(e){return e?e.closest(`[${yt}]`):null}function Sn(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function Cn(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var wn=!1;function Tn(){wn=!1,k&&=(k.classList.remove(bt),null)}function En(){window._wails?.flags?.enableFileDrop!==!1&&(wn=!0)}function Dn(){Tn()}function On(e,t){if(!wn||window._wails?.flags?.enableFileDrop===!1)return;let n=xn(document.elementFromPoint(e,t));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),k=n):k=null}var A=Symbol(`caller`),kn=new class e{constructor(t=``){this[A]=y(g.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[A](xt)}Center(){return this[A](St)}Close(){return this[A](Ct)}DisableSizeConstraints(){return this[A](wt)}EnableSizeConstraints(){return this[A](Tt)}Focus(){return this[A](Et)}ForceReload(){return this[A](Dt)}Fullscreen(){return this[A](Ot)}GetScreen(){return this[A](kt)}GetZoom(){return this[A](At)}Height(){return this[A](jt)}Hide(){return this[A](Mt)}IsFocused(){return this[A](Nt)}IsFullscreen(){return this[A](Pt)}IsMaximised(){return this[A](Ft)}IsMinimised(){return this[A](It)}Maximise(){return this[A](Lt)}Minimise(){return this[A](Rt)}Name(){return this[A](zt)}OpenDevTools(){return this[A](Bt)}RelativePosition(){return this[A](Vt)}Reload(){return this[A](Ht)}Resizable(){return this[A](Ut)}Restore(){return this[A](Wt)}SetPosition(e,t){return this[A](Gt,{x:e,y:t})}SetAlwaysOnTop(e){return this[A](Kt,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[A](qt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[A](Jt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[A](Yt,{enabled:e})}SetMaxSize(e,t){return this[A](Xt,{width:e,height:t})}SetMinSize(e,t){return this[A](Zt,{width:e,height:t})}SetRelativePosition(e,t){return this[A](Qt,{x:e,y:t})}SetResizable(e){return this[A]($t,{resizable:e})}SetSize(e,t){return this[A](en,{width:e,height:t})}SetTitle(e){return this[A](tn,{title:e})}SetZoom(e){return this[A](nn,{zoom:e})}Show(){return this[A](rn)}Size(){return this[A](an)}ToggleFullscreen(){return this[A](on)}ToggleMaximise(){return this[A](sn)}ToggleFrameless(){return this[A](cn)}UnFullscreen(){return this[A](ln)}UnMaximise(){return this[A](un)}UnMinimise(){return this[A](dn)}Width(){return this[A](fn)}Zoom(){return this[A](pn)}ZoomIn(){return this[A](mn)}ZoomOut(){return this[A](hn)}ZoomReset(){return this[A](gn)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=xn(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=n):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==t&&k.classList.remove(bt),t?(t.classList.contains(bt)||t.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=t):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||k&&!k.contains(e.relatedTarget))&&(k&&=(k.classList.remove(bt),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,k&&=(k.classList.remove(bt),null),Sn()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&Cn(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&An(),d&&(window._wails=window._wails||{}),d&&(window._wails.invoke=C,window._wails.clientId=_),d&&(window._wails.handlePlatformFileDrop=kn.HandlePlatformFileDrop.bind(kn)),d&&(window._wails.handleDragEnter=En,window._wails.handleDragLeave=Dn,window._wails.handleDragOver=On),d&&C(`wails:runtime:ready`);function jn(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}d&&jn(`/wails/custom.js`);function Mn(){return vt(1211788486)}function Nn(){return vt(853311305)}function Pn(e){return vt(465937298,e)}function Fn(e){return vt(2463093517,e)}var In=class{getRepoRoot(){return Nn()}setRepoRoot(e){return Fn(e)}async getModules(){return await Mn()??[]}runAction(e){return Pn(e)}};function Ln(e){switch(e){case`repo`:case`branch`:case`worktree`:return`source`;case`issue`:case`pr`:return`collaboration`;case`tag`:return`release`;default:return`all`}}function Rn(e,t){return t===`all`?e:e.filter(e=>Ln(e.id)===t)}var zn=`fastgit.desktop.prefs.v1`;function Bn(){return typeof window<`u`&&window.localStorage!==void 0}function Vn(){if(!Bn())return{};try{let e=window.localStorage.getItem(zn);if(!e)return{};let t=JSON.parse(e);if(!t||typeof t!=`object`)return{};let n=Array.isArray(t.repoNamespaces)?t.repoNamespaces.map(e=>String(e).trim()).filter(Boolean):void 0,r=typeof t.selectedRepoPath==`string`?t.selectedRepoPath.trim():void 0;return{...t,repoNamespaces:n,selectedRepoPath:r}}catch{return{}}}function Hn(e){Bn()&&window.localStorage.setItem(zn,JSON.stringify(e))}function Un(e){return`fastgit.desktop.tabs:${e}`}function Wn(e){if(!Bn()||!e)return null;try{let t=window.localStorage.getItem(Un(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!=`object`?null:{openedModuleIds:Array.isArray(n.openedModuleIds)?n.openedModuleIds.map(e=>String(e)):[],selectedModuleId:n.selectedModuleId?String(n.selectedModuleId):null}}catch{return null}}function Gn(e,t){!Bn()||!e||window.localStorage.setItem(Un(e),JSON.stringify(t))}var Kn=(0,l.createContext)(null);function qn(){let e=(0,l.useContext)(Kn);if(!e)throw Error(`useAppContext must be used within AppProvider`);return e}var Jn=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),j=e(((e,t)=>{t.exports=Jn()}))(),Yn={title:`Welcome`,command:`-`,exitCode:0,body:`请选择左侧模块并执行动作。`},Xn=new In,Zn=/^#(\d+)\s+\[([^\]]+)\]\s+(.+)$/,Qn=/^(.{2})\s+(.+)$/;function $n(e){let t=e.split(/\r?\n/).map(e=>e.trimEnd()),n=[];return t.forEach((e,t)=>{let r=e.trim();if(!r)return;let i=r.startsWith(`* `),a=i?r.slice(2).trim():r.replace(/^-+\s+/,``);a&&n.push({id:`${a}-${t}`,primary:a,active:i,badge:i?`current`:void 0})}),n}function er(e){return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map((e,t)=>({id:`${e}-${t}`,primary:e}))}function tr(e){return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).flatMap((e,t)=>{let n=e.match(Zn);return n?[{id:`${n[1]}-${t}`,primary:`#${n[1]} ${n[3]}`,badge:n[2]}]:[]})}function nr(e){let t=e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(t.length===0)return[];let n=t[0].match(/^#(\d+)\s+\[([^\]]+)\]$/);if(!n)return[];let r=t[1]??`PR #${n[1]}`,i=t.find(e=>/^https?:\/\//.test(e));return[{id:`pr-${n[1]}`,primary:`#${n[1]} ${r}`,badge:n[2],secondary:i,url:i}]}function rr(e){return e.split(/\r?\n/).map(e=>e.trimEnd()).filter(Boolean).flatMap((e,t)=>{let n=e.match(Qn);if(!n)return[];let r=n[1].replace(/\s/g,`·`);return[{id:`repo-${t}`,primary:n[2],badge:r}]})}function ir(e,t){let n=e.split(/\r?\n/),r=[],i=``,a=``,o=``,s=()=>{if(!i)return;let e=[a,o?o.slice(0,8):``].filter(Boolean).join(` · `);r.push({id:`${i}-${r.length}`,primary:i,secondary:e||void 0,active:i===t,badge:i===t?`current`:void 0})};return n.forEach(e=>{let t=e.trim();if(t){if(t.startsWith(`worktree `)){s(),i=t.slice(9).trim(),a=``,o=``;return}if(t.startsWith(`branch `)){a=t.slice(7).trim().replace(`refs/heads/`,``);return}t.startsWith(`HEAD `)&&(o=t.slice(5).trim())}}),s(),r}function ar(e,t,n){let r=t.trim();switch(e){case`branch_list`:{let e=$n(r);return{items:e,emptyHint:e.length===0?`暂无分支`:void 0}}case`tag_list`:{let e=er(r);return{items:e,emptyHint:r===`no tags`||e.length===0?`暂无标签`:void 0}}case`worktree_list`:{let e=ir(r,n);return{items:e,emptyHint:r===`no worktree`||e.length===0?`暂无 worktree`:void 0}}case`issue_list`:{let e=tr(r);return{items:e,emptyHint:r===`no open issues`||e.length===0?`暂无 open issues`:void 0}}case`pr_status`:return{items:nr(r),emptyHint:r===`no open PR for current branch`?`当前分支暂无 open PR`:void 0};case`repo_status`:return{items:rr(r),emptyHint:r===`working tree clean`?`工作区干净`:void 0};default:return{}}}function or(e){return e.trim()}function sr(e,...t){let n=new Set,r=[],i=e=>{let t=or(e);!t||n.has(t)||(n.add(t),r.push(t))};return e.forEach(i),t.forEach(i),r}function cr(e,t){let n=or(t);return n?[n,...e.filter(e=>or(e)!==n)]:e}function lr(e,t){return t?e.includes(t)?e:[...e,t]:e}function ur(e){return Math.max(220,Math.min(420,e))}function dr(e,t,n){let r=Rn(e,t);return n[n.length-1]??r[0]?.id??e[0]?.id??null}function fr(){let e=Vn(),t=or(e.selectedRepoPath??``);return{repoPath:t,repoNamespaces:cr(sr(e.repoNamespaces??[],t),t),repoStatus:`加载中...`,modules:[],selectedModuleId:null,openedModuleIds:[],selectedMenu:e.selectedMenu??`source`,modulePaneWidth:ur(e.modulePaneWidth??280),modulePaneCollapsed:e.modulePaneCollapsed??!1,busy:!1,output:Yn}}function pr({children:e}){let[t,n]=(0,l.useState)(fr),r=(0,l.useCallback)(e=>{n(t=>({...t,busy:e}))},[]),i=(0,l.useCallback)(async e=>{let t=or(e??``);r(!0);try{t&&await Xn.setRepoRoot(t);let[e,r]=await Promise.all([Xn.getRepoRoot(),Xn.getModules()]),i=or(e);n(e=>{let n=Wn(i),a=Rn(r,e.selectedMenu),o=n?.selectedModuleId??e.selectedModuleId,s=o&&a.some(e=>e.id===o)?o:a[0]?.id??r[0]?.id??null,c=new Set(r.map(e=>e.id)),l=(n?.openedModuleIds??e.openedModuleIds).filter(e=>c.has(e));return{...e,repoPath:i,repoNamespaces:cr(sr(e.repoNamespaces,t,i),i),repoStatus:i?`当前项目: ${i}`:`请先选择项目命名空间`,modules:r,selectedModuleId:s,openedModuleIds:lr(l,s)}})}catch(e){let r=String(e);n(e=>({...e,output:{title:t?`Set Project`:`Load Error`,command:t?`SetProjectRoot`:`bootstrap`,exitCode:1,body:r},repoStatus:t?`项目切换失败: ${r}`:`加载失败: ${r}`}))}finally{r(!1)}},[r]),a=(0,l.useCallback)(e=>{n(t=>({...t,selectedModuleId:e,openedModuleIds:lr(t.openedModuleIds,e)}))},[]),o=(0,l.useCallback)(e=>{n(t=>{if(t.selectedMenu===e)return{...t,modulePaneCollapsed:!t.modulePaneCollapsed};let n=Rn(t.modules,e),r=t.selectedModuleId&&n.some(e=>e.id===t.selectedModuleId)?t.selectedModuleId:n[0]?.id??t.modules[0]?.id??null;return{...t,selectedMenu:e,selectedModuleId:r,openedModuleIds:lr(t.openedModuleIds,r),modulePaneCollapsed:!1}})},[]),s=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.filter(t=>t!==e);if(t.selectedModuleId!==e)return{...t,openedModuleIds:n};let r=dr(t.modules,t.selectedMenu,n);return{...t,openedModuleIds:n,selectedModuleId:r}})},[]),c=(0,l.useCallback)(e=>{n(t=>t.openedModuleIds.includes(e)?{...t,openedModuleIds:[e],selectedModuleId:e}:t)},[]),u=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.indexOf(e);if(n<0)return t;let r=t.openedModuleIds.slice(0,n+1),i=t.selectedModuleId&&r.includes(t.selectedModuleId)?t.selectedModuleId:dr(t.modules,t.selectedMenu,r);return{...t,openedModuleIds:r,selectedModuleId:i}})},[]),d=(0,l.useCallback)((e,t)=>{e!==t&&n(n=>{let r=n.openedModuleIds.indexOf(e),i=n.openedModuleIds.indexOf(t);if(r<0||i<0)return n;let a=[...n.openedModuleIds];a.splice(r,1);let o=a.indexOf(t);return a.splice(o,0,e),{...n,openedModuleIds:a}})},[]),f=(0,l.useCallback)(()=>{n(e=>{let t=Rn(e.modules,e.selectedMenu).find(t=>!e.openedModuleIds.includes(t.id))??e.modules[0];return t?{...e,selectedModuleId:t.id,openedModuleIds:lr(e.openedModuleIds,t.id),modulePaneCollapsed:!1}:e})},[]),p=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneWidth:ur(e)}))},[]),m=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneCollapsed:e}))},[]),h=(0,l.useCallback)(async e=>{let r=or(e);!r||r===t.repoPath||(n(e=>({...e,repoNamespaces:cr(sr(e.repoNamespaces,r),r)})),await i(r))},[i,t.repoPath]),g=(0,l.useCallback)(async e=>{let t=or(e);t&&n(e=>({...e,repoNamespaces:sr(e.repoNamespaces,t),repoStatus:t===e.repoPath?`当前项目: ${e.repoPath}`:`已添加项目命名空间: ${t}`}))},[]),_=(0,l.useCallback)(async e=>{let r=or(e);if(!r)return;let a=t.repoNamespaces.filter(e=>e!==r);if(a.length!==t.repoNamespaces.length){if(t.repoPath===r){if(a.length===0)return;n(e=>({...e,repoNamespaces:a})),await i(a[0]);return}n(e=>({...e,repoNamespaces:a}))}},[i,t.repoNamespaces,t.repoPath]),v=(0,l.useCallback)(async(e,i,a)=>{if(!t.repoPath){n(t=>({...t,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:`请先选择项目命名空间。`}}));return}r(!0);try{let r=await Xn.runAction({moduleID:e.id,actionID:i.id,values:a}),o=r.exitCode===0?ar(i.id,r.output||``,t.repoPath):{};n(t=>({...t,output:{title:`${e.title} / ${i.title}`,command:r.command,exitCode:r.exitCode,body:r.output||`(no output)`,items:o.items,emptyHint:o.emptyHint}}))}catch(t){n(n=>({...n,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:String(t)}}))}finally{r(!1)}},[r,t.repoPath]),y=(0,l.useMemo)(()=>t.selectedModuleId?t.modules.find(e=>e.id===t.selectedModuleId)??null:null,[t.modules,t.selectedModuleId]),b=(0,l.useMemo)(()=>Rn(t.modules,t.selectedMenu),[t.modules,t.selectedMenu]);(0,l.useEffect)(()=>{Hn({selectedMenu:t.selectedMenu,modulePaneWidth:t.modulePaneWidth,modulePaneCollapsed:t.modulePaneCollapsed,repoNamespaces:t.repoNamespaces,selectedRepoPath:t.repoPath})},[t.modulePaneCollapsed,t.modulePaneWidth,t.repoNamespaces,t.repoPath,t.selectedMenu]),(0,l.useEffect)(()=>{if(!t.repoPath)return;let e=new Set(t.modules.map(e=>e.id)),n=t.openedModuleIds.filter(t=>e.has(t)),r=t.selectedModuleId&&e.has(t.selectedModuleId)?t.selectedModuleId:null;Gn(t.repoPath,{openedModuleIds:n,selectedModuleId:r})},[t.modules,t.openedModuleIds,t.repoPath,t.selectedModuleId]);let x=(0,l.useMemo)(()=>({state:t,selectedModule:y,filteredModules:b,setSelectedModule:a,closeModuleTab:s,closeOtherModuleTabs:c,closeTabsToRight:u,reorderModuleTabs:d,addModuleTab:f,setSelectedMenu:o,setModulePaneWidth:p,setModulePaneCollapsed:m,refresh:i,addRepo:g,switchRepo:h,removeRepo:_,runAction:v}),[t,y,b,a,s,c,u,d,f,o,p,m,i,g,h,_,v]);return(0,j.jsx)(Kn.Provider,{value:x,children:e})}var mr=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),hr=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),gr=e=>{let t=hr(e);return t.charAt(0).toUpperCase()+t.slice(1)},_r=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),vr=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},yr={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},br=(0,l.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,l.createElement)(`svg`,{ref:c,...yr,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:_r(`lucide`,i),...!a&&!vr(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,l.createElement)(e,t)),...Array.isArray(a)?a:[a]])),xr=(e,t)=>{let n=(0,l.forwardRef)(({className:n,...r},i)=>(0,l.createElement)(br,{ref:i,iconNode:t,className:_r(`lucide-${mr(gr(e))}`,`lucide-${e}`,n),...r}));return n.displayName=gr(e),n},Sr=xr(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),Cr=xr(`git-fork`,[[`circle`,{cx:`12`,cy:`18`,r:`3`,key:`1mpf1b`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`path`,{d:`M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9`,key:`1uq4wg`}],[`path`,{d:`M12 12v3`,key:`158kv8`}]]),wr=xr(`layout-grid`,[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]),Tr=xr(`panel-right-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m8 9 3 3-3 3`,key:`12hl5m`}]]),Er=xr(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),Dr=xr(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),Or=xr(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]),kr=xr(`tags`,[[`path`,{d:`M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z`,key:`16rjxf`}],[`path`,{d:`M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193`,key:`178nd4`}],[`circle`,{cx:`10.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`12ikhr`}]]),Ar=xr(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function jr(...e){return e.filter(Boolean).join(` `)}function Mr({variant:e=`default`,className:t,children:n,...r}){return(0,j.jsx)(`button`,{className:jr(`ui-button`,`ui-button--${e}`,t),...r,children:n})}var Nr={source:`源码与仓库`,collaboration:`协作与评审`,release:`发布与版本`,all:`全部模块`};function Pr(){let{state:e,filteredModules:t,setSelectedModule:n,setModulePaneCollapsed:r,refresh:i}=qn();return(0,j.jsxs)(`aside`,{className:`module-pane`,children:[(0,j.jsxs)(`div`,{className:`module-pane__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:Nr[e.selectedMenu]??`模块`}),(0,j.jsxs)(`p`,{children:[t.length,` 个模块`]})]}),(0,j.jsxs)(`div`,{className:`module-pane__actions`,children:[(0,j.jsx)(Mr,{variant:`ghost`,onClick:()=>void i(),children:`刷新`}),(0,j.jsx)(Mr,{variant:`ghost`,className:`module-pane__collapse`,onClick:()=>r(!0),children:(0,j.jsx)(Tr,{size:14})})]})]}),(0,j.jsxs)(`div`,{className:`module-pane__list`,children:[t.map(t=>(0,j.jsxs)(`button`,{className:jr(`module-pane__item`,e.selectedModuleId===t.id&&`module-pane__item--active`),onClick:()=>n(t.id),type:`button`,children:[(0,j.jsx)(`strong`,{children:t.title}),(0,j.jsx)(`span`,{children:t.description})]},t.id)),t.length===0&&(0,j.jsx)(`div`,{className:`module-pane__empty`,children:`当前菜单下暂无模块`})]})]})}var Fr=[{id:`source`,label:`源码`,icon:Cr},{id:`collaboration`,label:`协作`,icon:Sr},{id:`release`,label:`发布`,icon:kr},{id:`all`,label:`全部`,icon:wr}];function Ir(){let{state:e,setSelectedMenu:t,refresh:n}=qn();return(0,j.jsxs)(`aside`,{className:`sidebar-menu-panel`,children:[(0,j.jsx)(`div`,{className:`sidebar-menu-panel__group`,children:Fr.map(n=>{let r=n.icon;return(0,j.jsxs)(`button`,{className:jr(`sidebar-menu-panel__item`,e.selectedMenu===n.id&&`sidebar-menu-panel__item--active`),onClick:()=>t(n.id),title:n.label,type:`button`,children:[(0,j.jsx)(r,{size:18,strokeWidth:2}),(0,j.jsx)(`span`,{children:n.label})]},n.id)})}),(0,j.jsxs)(`div`,{className:`sidebar-menu-panel__footer`,children:[(0,j.jsx)(Mr,{variant:`ghost`,className:`sidebar-menu-panel__refresh`,onClick:()=>void n(),children:(0,j.jsx)(Dr,{size:14})}),(0,j.jsx)(`span`,{children:e.modulePaneCollapsed?`已收起`:e.busy?`运行中`:`空闲`})]})]})}function Lr({className:e,...t}){return(0,j.jsx)(`input`,{className:jr(`ui-input`,e),...t})}function Rr(e){let t=new FormData(e),n={};for(let[e,r]of t.entries())n[e]=String(r).trim();return n}function zr(){let{selectedModule:e,runAction:t}=qn();if(!e)return(0,j.jsx)(`section`,{className:`module-actions`,children:(0,j.jsx)(`div`,{className:`empty-state`,children:`未找到模块,请刷新。`})});let n=e.actions??[],r=n=>r=>{r.preventDefault(),t(e,n,Rr(r.currentTarget))};return(0,j.jsxs)(`section`,{className:`module-actions`,children:[(0,j.jsxs)(`header`,{className:`module-actions__header`,children:[(0,j.jsx)(`h2`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsx)(`div`,{className:`module-actions__grid`,children:n.map((e,t)=>(0,j.jsxs)(`article`,{className:`action-card`,style:{animationDelay:`${t*60}ms`},children:[(0,j.jsxs)(`div`,{className:`action-card__meta`,children:[(0,j.jsx)(`h3`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsxs)(`form`,{onSubmit:r(e),className:`action-card__form`,children:[(0,j.jsx)(`div`,{className:`action-card__fields`,children:(e.fields??[]).map(e=>(0,j.jsxs)(`label`,{className:`action-field`,children:[(0,j.jsx)(`span`,{children:e.label}),(0,j.jsx)(Lr,{name:e.key,placeholder:e.placeholder||e.label,defaultValue:e.default||``,required:!!e.required})]},e.key))}),(0,j.jsx)(`div`,{className:`action-card__footer`,children:(0,j.jsx)(Mr,{type:`submit`,children:`执行`})})]})]},e.id))})]})}function Br(){let{state:e}=qn(),t=!!(e.output.items&&e.output.items.length>0);return(0,j.jsxs)(`section`,{className:`output-panel`,children:[(0,j.jsxs)(`header`,{className:`output-panel__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:e.output.title}),(0,j.jsx)(`p`,{children:e.output.command})]}),(0,j.jsxs)(`span`,{className:e.output.exitCode===0?`status-pill status-pill--ok`:`status-pill status-pill--error`,children:[`exit `,e.output.exitCode]})]}),t?(0,j.jsx)(`ul`,{className:`output-list`,role:`list`,children:e.output.items?.map(e=>(0,j.jsxs)(`li`,{className:e.active?`output-list__item output-list__item--active`:`output-list__item`,children:[(0,j.jsxs)(`div`,{className:`output-list__main`,children:[(0,j.jsx)(`p`,{children:e.primary}),e.secondary?e.url?(0,j.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,children:e.secondary}):(0,j.jsx)(`span`,{children:e.secondary}):null]}),e.badge?(0,j.jsx)(`span`,{className:`output-list__badge`,children:e.badge}):null]},e.id))}):e.output.emptyHint?(0,j.jsx)(`div`,{className:`output-empty`,children:e.output.emptyHint}):(0,j.jsx)(`pre`,{className:`output-panel__body`,children:e.output.body})]})}var Vr=`data:image/svg+xml,%3csvg%20width='512'%20height='512'%20viewBox='0%200%20512%20512'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20role='img'%20aria-label='fastgit%20logo%20icon'%3e%3cdefs%3e%3clinearGradient%20id='bg'%20x1='72'%20y1='56'%20x2='448'%20y2='456'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%233C679F'/%3e%3cstop%20offset='1'%20stop-color='%231F2D44'/%3e%3c/linearGradient%3e%3clinearGradient%20id='stroke'%20x1='136'%20y1='152'%20x2='376'%20y2='360'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F0F3F8'/%3e%3cstop%20offset='1'%20stop-color='%23D6DFEF'/%3e%3c/linearGradient%3e%3c/defs%3e%3crect%20x='56'%20y='56'%20width='400'%20height='400'%20rx='96'%20fill='url(%23bg)'/%3e%3cpath%20d='M168%20336V208C168%20194.745%20178.745%20184%20192%20184H320C333.255%20184%20344%20194.745%20344%20208V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M256%20184V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'/%3e%3ccircle%20cx='168'%20cy='336'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='344'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='184'%20r='30'%20fill='%23E8EDF4'/%3e%3c/svg%3e`;function Hr(){let{state:e,addRepo:t,switchRepo:n,removeRepo:r}=qn(),[i,a]=(0,l.useState)(``),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(``);(0,l.useEffect)(()=>{s(e.repoPath)},[e.repoPath]);let d=i.trim().length>0,f=(0,l.useMemo)(()=>{let t=c.trim().toLowerCase();return t?e.repoNamespaces.filter(e=>e.toLowerCase().includes(t)):e.repoNamespaces},[c,e.repoNamespaces]),p=async()=>{let e=i.trim();e&&(await t(e),a(``))},m=async()=>{let e=i.trim();e&&(await n(e),a(``))};return(0,j.jsxs)(`section`,{className:`repo-settings`,"aria-label":`Project settings`,children:[(0,j.jsxs)(`header`,{className:`repo-settings__header`,children:[(0,j.jsx)(`h3`,{children:`Settings · Projects`}),(0,j.jsxs)(`p`,{children:[e.repoNamespaces.length,` 个项目`]})]}),(0,j.jsxs)(`div`,{className:`repo-settings__current`,children:[(0,j.jsx)(`span`,{children:`当前项目`}),(0,j.jsx)(`strong`,{children:e.repoPath||`未选择`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row workspace-panel__row--add`,children:[(0,j.jsx)(Lr,{value:i,onChange:e=>a(e.target.value),placeholder:`/path/to/project (git repository)`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:()=>void p(),disabled:!d,children:`添加`}),(0,j.jsx)(Mr,{variant:`primary`,onClick:()=>void m(),disabled:!d,children:`添加并切换`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row`,children:[(0,j.jsx)(Lr,{value:c,onChange:e=>u(e.target.value),placeholder:`筛选项目...`}),(0,j.jsxs)(`span`,{className:`repo-settings__count`,children:[f.length,` / `,e.repoNamespaces.length]})]}),(0,j.jsxs)(`div`,{className:`repo-list`,role:`list`,children:[f.map(t=>{let i=t===e.repoPath;return(0,j.jsxs)(`article`,{className:[`repo-item`,i?`repo-item--current`:``,t===o?`repo-item--selected`:``].filter(Boolean).join(` `),onClick:()=>s(t),role:`button`,tabIndex:0,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),s(t))},children:[(0,j.jsxs)(`div`,{className:`repo-item__meta`,children:[(0,j.jsx)(`strong`,{children:t.split(/[\\/]/).filter(Boolean).pop()||t}),(0,j.jsx)(`span`,{children:t})]}),(0,j.jsxs)(`div`,{className:`repo-item__actions`,children:[(0,j.jsx)(`span`,{className:i?`repo-badge repo-badge--active`:`repo-badge`,children:i?`当前`:`可切换`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),n(t)},disabled:i,children:`切换`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),r(t)},disabled:i,children:`移除`})]})]},t)}),f.length===0&&(0,j.jsx)(`div`,{className:`repo-list__empty`,children:`没有匹配的项目`})]}),(0,j.jsx)(`p`,{className:`repo-settings__status`,children:e.repoStatus})]})}function Ur(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??`workspace`}function Wr(e){return e.split(/[\\/]/).filter(Boolean)}function Gr(e){let t=new Map;for(let n of e){let r=Wr(n);if(r.length===0){t.set(n,n);continue}let i=r[r.length-1];for(let t=1;t<=r.length;t+=1){let a=r.slice(-t).join(`/`);if(!e.some(e=>e===n?!1:Wr(e).slice(-t).join(`/`)===a)){i=a;break}i=a}t.set(n,i)}return t}function Kr(){let{state:e,addModuleTab:t,closeModuleTab:n,closeOtherModuleTabs:r,closeTabsToRight:i,reorderModuleTabs:a,setSelectedModule:o,switchRepo:s}=qn(),c=(0,l.useMemo)(()=>Gr(e.repoNamespaces),[e.repoNamespaces]),u=e.repoPath?c.get(e.repoPath)??Ur(e.repoPath):`workspace`,[d,f]=(0,l.useState)(null),[p,m]=(0,l.useState)(null),[h,g]=(0,l.useState)(null),[_,v]=(0,l.useState)(!1),y=(0,l.useRef)(null),b=(0,l.useRef)(null),x=e.openedModuleIds.map(t=>e.modules.find(e=>e.id===t)).filter(e=>e!==void 0),ee=x.length,S=(0,l.useMemo)(()=>h?x.find(e=>e.id===h.moduleId)??null:null,[h,x]),C=S?x.findIndex(e=>e.id===S.id):-1,te=ee>1,ne=C>=0&&C{let e=e=>{if(g(null),!_)return;let t=e.target;t&&(b.current?.contains(t)||y.current?.contains(t)||v(!1))},t=e=>{e.key===`Escape`&&(g(null),v(!1))};return window.addEventListener(`pointerdown`,e),window.addEventListener(`keydown`,t),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,t)}},[_]);let re=(e,t)=>{f(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t)},w=(e,t)=>{e.preventDefault(),d&&d!==t&&m(t)},ie=(e,t)=>{e.preventDefault(),!(!d||d===t)&&(a(d,t),m(null),f(null))},ae=(e,t)=>{e.preventDefault(),e.stopPropagation(),g({x:e.clientX,y:e.clientY,moduleId:t})},oe=e=>{e(),g(null)};return(0,j.jsxs)(`header`,{className:`tabs-header app-drag-region`,children:[(0,j.jsxs)(`div`,{className:`tabs-repo app-no-drag-region`,children:[(0,j.jsx)(`img`,{className:`tabs-repo__logo`,src:Vr,alt:`fastgit logo`}),(0,j.jsx)(`span`,{children:u})]}),(0,j.jsx)(`div`,{className:`tabs-track app-no-drag-region`,children:x.map(t=>{let r=e.selectedModuleId===t.id;return(0,j.jsxs)(`div`,{className:[`tabs-track__item`,r?`tabs-track__item--active`:``,p===t.id?`tabs-track__item--drag-over`:``].filter(Boolean).join(` `),onClick:()=>o(t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o(t.id))},onContextMenu:e=>ae(e,t.id),draggable:ee>1,onDragStart:e=>re(e,t.id),onDragOver:e=>w(e,t.id),onDrop:e=>ie(e,t.id),onDragEnd:()=>{f(null),m(null)},role:`button`,tabIndex:0,"aria-label":`switch to ${t.title}`,"aria-pressed":r,children:[(0,j.jsx)(`span`,{children:t.title}),(0,j.jsx)(`button`,{className:`tabs-track__close`,onClick:e=>{e.stopPropagation(),n(t.id)},onContextMenu:e=>ae(e,t.id),type:`button`,"aria-label":`close ${t.title}`,children:(0,j.jsx)(Ar,{size:13})})]},t.id)})}),(0,j.jsxs)(`div`,{className:`tabs-actions app-no-drag-region`,children:[(0,j.jsxs)(`select`,{className:`ui-input tabs-project-select`,value:e.repoPath,title:e.repoPath||`未选择项目`,onChange:e=>void s(e.target.value),children:[(0,j.jsx)(`option`,{value:``,children:e.repoNamespaces.length===0?`未配置项目`:`选择项目`}),e.repoNamespaces.map(e=>(0,j.jsx)(`option`,{value:e,children:c.get(e)??Ur(e)},e))]}),(0,j.jsx)(`button`,{ref:b,className:`tabs-settings`,onClick:()=>v(e=>!e),type:`button`,"aria-label":`open project settings`,children:(0,j.jsx)(Or,{size:14})}),(0,j.jsx)(`button`,{className:`tabs-add`,onClick:t,type:`button`,"aria-label":`new tab`,children:(0,j.jsx)(Er,{size:14})})]}),_&&(0,j.jsx)(`div`,{ref:y,className:`tabs-settings-panel app-no-drag-region`,onPointerDown:e=>e.stopPropagation(),children:(0,j.jsx)(Hr,{})}),h&&S&&(0,j.jsxs)(`div`,{className:`tabs-menu app-no-drag-region`,style:{left:`${h.x}px`,top:`${h.y}px`},onPointerDown:e=>e.stopPropagation(),children:[(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>n(S.id)),disabled:!te,children:`关闭标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>r(S.id)),disabled:!te,children:`关闭其他标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>i(S.id)),disabled:!ne,children:`关闭右侧标签`})]})]})}function qr(){let{state:e,setModulePaneWidth:t}=qn(),[n,r]=(0,l.useState)(!1),i=n=>{if(window.innerWidth<=900||e.modulePaneCollapsed)return;r(!0);let i=n.clientX,a=e.modulePaneWidth,o=e=>{t(a+(e.clientX-i))},s=()=>{r(!1),window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s)},a={"--module-pane-width":`${e.modulePaneWidth}px`};return(0,j.jsxs)(`main`,{className:`desktop-shell`,children:[(0,j.jsx)(Kr,{}),(0,j.jsxs)(`section`,{className:[`desktop-body`,n?`desktop-body--dragging`:``,e.modulePaneCollapsed?`desktop-body--pane-collapsed`:``].filter(Boolean).join(` `),style:a,children:[(0,j.jsx)(Ir,{}),(0,j.jsxs)(`div`,{className:`module-pane-wrap`,children:[(0,j.jsx)(Pr,{}),(0,j.jsx)(`div`,{className:`module-pane-resizer`,onMouseDown:i,role:`separator`,"aria-orientation":`vertical`,"aria-label":`resize sidebar`})]}),(0,j.jsxs)(`div`,{className:`desktop-main`,children:[(0,j.jsx)(zr,{}),(0,j.jsx)(Br,{})]})]})]})}function Jr(){let{state:e,refresh:t}=qn(),n=(0,l.useRef)(e.repoPath);return(0,l.useEffect)(()=>{t(n.current)},[t]),(0,j.jsx)(qr,{})}function Yr(){return(0,j.jsx)(pr,{children:(0,j.jsx)(Jr,{})})}var Xr=document.getElementById(`app`);if(!Xr)throw Error(`#app not found`);(0,u.createRoot)(Xr).render((0,j.jsx)(l.StrictMode,{children:(0,j.jsx)(Yr,{})})); \ No newline at end of file diff --git a/desktop/frontend/dist/assets/index-BvrVHuHl.css b/desktop/frontend/dist/assets/index-yhaLZGkG.css similarity index 91% rename from desktop/frontend/dist/assets/index-BvrVHuHl.css rename to desktop/frontend/dist/assets/index-yhaLZGkG.css index ec64151..d440104 100644 --- a/desktop/frontend/dist/assets/index-BvrVHuHl.css +++ b/desktop/frontend/dist/assets/index-yhaLZGkG.css @@ -1 +1 @@ -@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e1e7ef;--bg-main:#edf2f8;--bg-topbar:#e3e8f0;--bg-topbar-active:#f1f4f9;--bg-pane:#e3e7ef;--bg-pane-hover:#dce3ed;--bg-card:#eef2f7;--bg-card-soft:#dfe5ee;--bg-input:#edf1f6;--bg-output:#e7edf6;--text-1:#1f2d44;--text-2:#5d708d;--text-3:#8b9ab0;--text-inverse:#fff;--text-output:#1f2d44;--line:#bfcbdb;--line-strong:#adbbd1;--line-output:#b5c4d8;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--brand-soft:#4f7fc41f;--brand-soft-strong:#4f7fc42e;--brand-line:#4f7fc485;--brand-line-strong:#4f7fc47a;--ok:#1b9b4a;--error:#d83f57;--ok-soft:#1b9b4a14;--ok-line:#1b9b4a40;--error-soft:#d83f5714;--error-line:#d83f5740;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14;--shadow-menu:0 8px 20px #131f322e;--highlight-stroke:#ffffff57}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-repo__logo{flex:0 0 14px;width:14px;height:14px;display:block}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{border-color:var(--brand-line);background:var(--brand-soft)}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-actions{align-items:center;gap:8px;margin-left:auto;display:inline-flex}.tabs-project-select{min-width:220px;height:28px;font-size:12px}.tabs-settings{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-settings-panel{z-index:40;border:1px solid var(--line);background:var(--bg-card);width:min(620px,100vw - 24px);box-shadow:var(--shadow-menu);border-radius:12px;padding:10px;position:fixed;top:46px;right:12px}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);min-width:150px;box-shadow:var(--shadow-menu);border-radius:10px;gap:3px;padding:6px;display:grid;position:fixed}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line);background:var(--bg-pane);color:var(--text-2);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;font-weight:600;display:grid}.sidebar-menu-panel__item:hover{color:var(--text-1);background:var(--bg-pane-hover)}.sidebar-menu-panel__item--active{color:var(--text-1);background:var(--bg-card-soft);box-shadow:inset 0 0 0 1px var(--line-strong)}.sidebar-menu-panel__footer{border-top:1px solid var(--line);color:var(--text-2);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{border-color:var(--line-strong);width:36px;height:32px;color:var(--text-2);padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:var(--brand-line-strong)}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 var(--highlight-stroke), var(--shadow-card);padding:12px}.workspace-panel__row{align-items:center;gap:8px;display:flex}.workspace-panel__row--add .ui-input{flex:1}.repo-settings{gap:8px;display:grid}.repo-settings__header{justify-content:space-between;align-items:baseline;display:flex}.repo-settings__header h3{margin:0;font-size:14px}.repo-settings__header p,.repo-settings__status,.repo-settings__count{color:var(--text-2);margin:0;font-size:12px}.repo-settings__current{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-topbar-active);gap:3px;padding:8px 10px;display:grid}.repo-settings__current span{color:var(--text-2);font-size:11px}.repo-settings__current strong{color:var(--text-1);word-break:break-all;font-size:12px}.repo-list{gap:8px;max-height:180px;margin-top:8px;display:grid;overflow:auto}.repo-item{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-card-soft);cursor:pointer;gap:7px;padding:8px;display:grid}.repo-item--selected{box-shadow:inset 0 0 0 1px var(--brand-line)}.repo-item--current{background:var(--bg-topbar-active);border-color:var(--line-strong)}.repo-item__meta{min-width:0}.repo-item__meta strong{color:var(--text-1);font-size:12px;display:block}.repo-item__meta span{color:var(--text-2);word-break:break-all;margin-top:2px;font-size:11px;display:block}.repo-item__actions{align-items:center;gap:6px;display:flex}.repo-item__actions .ui-button{min-height:28px;padding:0 10px;font-size:11px}.repo-badge{color:var(--text-2);border:1px solid var(--line);background:var(--bg-pane);border-radius:999px;padding:1px 8px;font-size:11px}.repo-badge--active{color:var(--brand-strong);border-color:var(--brand-line);background:var(--brand-soft)}.repo-list__empty{border:1px dashed var(--line-strong);border-radius:var(--radius-md);text-align:center;color:var(--text-2);padding:10px;font-size:12px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto}.tabs-project-select{width:140px;min-width:0}.tabs-settings-panel{top:84px}}@media (width<=640px){.tabs-actions{gap:4px}.tabs-project-select{width:110px}.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);box-shadow:0 1px 0 var(--highlight-stroke);gap:10px;padding:12px;animation:.24s both rise-in;display:grid}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button:disabled{cursor:not-allowed;color:var(--text-3);border-color:var(--line);background:var(--bg-pane)}.ui-button--primary{color:var(--text-inverse);background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--primary:disabled{color:var(--text-inverse);background:var(--line-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft-strong);outline:none}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-line)}.status-pill--error{color:var(--error);background:var(--error-soft);border-color:var(--error-line)}.output-panel__body{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);min-height:180px;max-height:30vh;color:var(--text-output);margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto} +@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e1e7ef;--bg-main:#edf2f8;--bg-topbar:#e3e8f0;--bg-topbar-active:#f1f4f9;--bg-pane:#e3e7ef;--bg-pane-hover:#dce3ed;--bg-card:#eef2f7;--bg-card-soft:#dfe5ee;--bg-input:#edf1f6;--bg-output:#e7edf6;--text-1:#1f2d44;--text-2:#5d708d;--text-3:#8b9ab0;--text-inverse:#fff;--text-output:#1f2d44;--line:#bfcbdb;--line-strong:#adbbd1;--line-output:#b5c4d8;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--brand-soft:#4f7fc41f;--brand-soft-strong:#4f7fc42e;--brand-line:#4f7fc485;--brand-line-strong:#4f7fc47a;--ok:#1b9b4a;--error:#d83f57;--ok-soft:#1b9b4a14;--ok-line:#1b9b4a40;--error-soft:#d83f5714;--error-line:#d83f5740;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14;--shadow-menu:0 8px 20px #131f322e;--highlight-stroke:#ffffff57}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-repo__logo{flex:0 0 14px;width:14px;height:14px;display:block}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{border-color:var(--brand-line);background:var(--brand-soft)}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-actions{align-items:center;gap:8px;margin-left:auto;display:inline-flex}.tabs-project-select{min-width:220px;height:28px;font-size:12px}.tabs-settings{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-settings-panel{z-index:40;border:1px solid var(--line);background:var(--bg-card);width:min(620px,100vw - 24px);box-shadow:var(--shadow-menu);border-radius:12px;padding:10px;position:fixed;top:46px;right:12px}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);min-width:150px;box-shadow:var(--shadow-menu);border-radius:10px;gap:3px;padding:6px;display:grid;position:fixed}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line);background:var(--bg-pane);color:var(--text-2);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;font-weight:600;display:grid}.sidebar-menu-panel__item:hover{color:var(--text-1);background:var(--bg-pane-hover)}.sidebar-menu-panel__item--active{color:var(--text-1);background:var(--bg-card-soft);box-shadow:inset 0 0 0 1px var(--line-strong)}.sidebar-menu-panel__footer{border-top:1px solid var(--line);color:var(--text-2);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{border-color:var(--line-strong);width:36px;height:32px;color:var(--text-2);padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:var(--brand-line-strong)}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 var(--highlight-stroke), var(--shadow-card);padding:12px}.workspace-panel__row{align-items:center;gap:8px;display:flex}.workspace-panel__row--add .ui-input{flex:1}.repo-settings{gap:8px;display:grid}.repo-settings__header{justify-content:space-between;align-items:baseline;display:flex}.repo-settings__header h3{margin:0;font-size:14px}.repo-settings__header p,.repo-settings__status,.repo-settings__count{color:var(--text-2);margin:0;font-size:12px}.repo-settings__current{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-topbar-active);gap:3px;padding:8px 10px;display:grid}.repo-settings__current span{color:var(--text-2);font-size:11px}.repo-settings__current strong{color:var(--text-1);word-break:break-all;font-size:12px}.repo-list{gap:8px;max-height:180px;margin-top:8px;display:grid;overflow:auto}.repo-item{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-card-soft);cursor:pointer;gap:7px;padding:8px;display:grid}.repo-item--selected{box-shadow:inset 0 0 0 1px var(--brand-line)}.repo-item--current{background:var(--bg-topbar-active);border-color:var(--line-strong)}.repo-item__meta{min-width:0}.repo-item__meta strong{color:var(--text-1);font-size:12px;display:block}.repo-item__meta span{color:var(--text-2);word-break:break-all;margin-top:2px;font-size:11px;display:block}.repo-item__actions{align-items:center;gap:6px;display:flex}.repo-item__actions .ui-button{min-height:28px;padding:0 10px;font-size:11px}.repo-badge{color:var(--text-2);border:1px solid var(--line);background:var(--bg-pane);border-radius:999px;padding:1px 8px;font-size:11px}.repo-badge--active{color:var(--brand-strong);border-color:var(--brand-line);background:var(--brand-soft)}.repo-list__empty{border:1px dashed var(--line-strong);border-radius:var(--radius-md);text-align:center;color:var(--text-2);padding:10px;font-size:12px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto}.tabs-project-select{width:140px;min-width:0}.tabs-settings-panel{top:84px}}@media (width<=640px){.tabs-actions{gap:4px}.tabs-project-select{width:110px}.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);box-shadow:0 1px 0 var(--highlight-stroke);gap:10px;padding:12px;animation:.24s both rise-in;display:grid}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button:disabled{cursor:not-allowed;color:var(--text-3);border-color:var(--line);background:var(--bg-pane)}.ui-button--primary{color:var(--text-inverse);background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--primary:disabled{color:var(--text-inverse);background:var(--line-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft-strong);outline:none}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-line)}.status-pill--error{color:var(--error);background:var(--error-soft);border-color:var(--error-line)}.output-panel__body{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);min-height:180px;max-height:30vh;color:var(--text-output);margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto}.output-list{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);align-content:start;gap:0;min-height:180px;max-height:30vh;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.output-list__item{border-bottom:1px solid var(--line-output);justify-content:space-between;align-items:flex-start;gap:12px;padding:10px 12px;display:flex}.output-list__item:last-child{border-bottom:0}.output-list__item--active{background:var(--brand-soft)}.output-list__main{gap:3px;min-width:0;display:grid}.output-list__main p{color:var(--text-output);font-size:13px;font-family:var(--font-heading);word-break:break-word;margin:0}.output-list__main span,.output-list__main a{color:var(--text-2);word-break:break-all;font-size:11px;text-decoration:none}.output-list__main a:hover{text-decoration:underline}.output-list__badge{border:1px solid var(--line-strong);background:var(--bg-card-soft);color:var(--text-2);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;line-height:1.6}.output-empty{border:1px dashed var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);min-height:180px;max-height:30vh;color:var(--text-2);place-items:center;padding:10px;font-size:12px;display:grid} diff --git a/desktop/frontend/dist/index.html b/desktop/frontend/dist/index.html index 0fcfe14..e35ec4b 100644 --- a/desktop/frontend/dist/index.html +++ b/desktop/frontend/dist/index.html @@ -4,8 +4,8 @@ fastgit desktop - - + +
diff --git a/desktop/frontend/src/app/providers/app-provider.tsx b/desktop/frontend/src/app/providers/app-provider.tsx index 1cb81e0..22f821b 100644 --- a/desktop/frontend/src/app/providers/app-provider.tsx +++ b/desktop/frontend/src/app/providers/app-provider.tsx @@ -5,7 +5,14 @@ import { BackendService } from "../../services/backend"; import { filterModulesByMenu } from "../../lib/module-groups"; import { loadPrefs, loadWorkspaceTabs, savePrefs, saveWorkspaceTabs } from "../../lib/persistence"; import { AppContext } from "./app-context"; -import type { AppState, DesktopModule, ModuleAction, OperationOutput, SidebarMenuType } from "../types"; +import type { + AppState, + DesktopModule, + ModuleAction, + OperationOutput, + OutputListItem, + SidebarMenuType, +} from "../types"; interface AppProviderProps { children: ReactNode; @@ -20,6 +27,205 @@ const initialOutput: OperationOutput = { const backend = new BackendService(); +const githubRowPattern = /^#(\d+)\s+\[([^\]]+)\]\s+(.+)$/; +const statusRowPattern = /^(.{2})\s+(.+)$/; + +function parseBranchItems(body: string): OutputListItem[] { + const lines = body.split(/\r?\n/).map((line) => line.trimEnd()); + const items: OutputListItem[] = []; + + lines.forEach((line, index) => { + const trimmed = line.trim(); + if (!trimmed) { + return; + } + + const active = trimmed.startsWith("* "); + const primary = active ? trimmed.slice(2).trim() : trimmed.replace(/^-+\s+/, ""); + if (!primary) { + return; + } + + items.push({ + id: `${primary}-${index}`, + primary, + active, + badge: active ? "current" : undefined, + }); + }); + + return items; +} + +function parseTagItems(body: string): OutputListItem[] { + return body + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean) + .map((tag, index) => ({ + id: `${tag}-${index}`, + primary: tag, + })); +} + +function parseIssueLikeItems(body: string): OutputListItem[] { + return body + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean) + .flatMap((line, index) => { + const match = line.match(githubRowPattern); + if (!match) { + return []; + } + return [ + { + id: `${match[1]}-${index}`, + primary: `#${match[1]} ${match[3]}`, + badge: match[2], + }, + ]; + }); +} + +function parsePrStatusItems(body: string): OutputListItem[] { + const lines = body.split(/\r?\n/).map((line) => line.trim()).filter(Boolean); + if (lines.length === 0) { + return []; + } + const header = lines[0]; + const match = header.match(/^#(\d+)\s+\[([^\]]+)\]$/); + if (!match) { + return []; + } + + const title = lines[1] ?? `PR #${match[1]}`; + const url = lines.find((line) => /^https?:\/\//.test(line)); + + return [ + { + id: `pr-${match[1]}`, + primary: `#${match[1]} ${title}`, + badge: match[2], + secondary: url, + url, + }, + ]; +} + +function parseRepoStatusItems(body: string): OutputListItem[] { + return body + .split(/\r?\n/) + .map((line) => line.trimEnd()) + .filter(Boolean) + .flatMap((line, index) => { + const match = line.match(statusRowPattern); + if (!match) { + return []; + } + const code = match[1].replace(/\s/g, "·"); + return [ + { + id: `repo-${index}`, + primary: match[2], + badge: code, + }, + ]; + }); +} + +function parseWorktreeItems(body: string, repoPath: string): OutputListItem[] { + const lines = body.split(/\r?\n/); + const items: OutputListItem[] = []; + + let path = ""; + let branch = ""; + let head = ""; + + const push = () => { + if (!path) { + return; + } + const details = [branch, head ? head.slice(0, 8) : ""].filter(Boolean).join(" · "); + items.push({ + id: `${path}-${items.length}`, + primary: path, + secondary: details || undefined, + active: path === repoPath, + badge: path === repoPath ? "current" : undefined, + }); + }; + + lines.forEach((rawLine) => { + const line = rawLine.trim(); + if (!line) { + return; + } + if (line.startsWith("worktree ")) { + push(); + path = line.slice("worktree ".length).trim(); + branch = ""; + head = ""; + return; + } + if (line.startsWith("branch ")) { + const ref = line.slice("branch ".length).trim(); + branch = ref.replace("refs/heads/", ""); + return; + } + if (line.startsWith("HEAD ")) { + head = line.slice("HEAD ".length).trim(); + } + }); + + push(); + return items; +} + +function toStructuredOutput(actionID: string, body: string, repoPath: string): Pick { + const normalized = body.trim(); + switch (actionID) { + case "branch_list": { + const items = parseBranchItems(normalized); + return { items, emptyHint: items.length === 0 ? "暂无分支" : undefined }; + } + case "tag_list": { + const items = parseTagItems(normalized); + return { items, emptyHint: normalized === "no tags" ? "暂无标签" : items.length === 0 ? "暂无标签" : undefined }; + } + case "worktree_list": { + const items = parseWorktreeItems(normalized, repoPath); + return { + items, + emptyHint: normalized === "no worktree" ? "暂无 worktree" : items.length === 0 ? "暂无 worktree" : undefined, + }; + } + case "issue_list": { + const items = parseIssueLikeItems(normalized); + return { + items, + emptyHint: normalized === "no open issues" ? "暂无 open issues" : items.length === 0 ? "暂无 open issues" : undefined, + }; + } + case "pr_status": { + const items = parsePrStatusItems(normalized); + return { + items, + emptyHint: normalized === "no open PR for current branch" ? "当前分支暂无 open PR" : undefined, + }; + } + case "repo_status": { + const items = parseRepoStatusItems(normalized); + return { + items, + emptyHint: normalized === "working tree clean" ? "工作区干净" : undefined, + }; + } + default: + return {}; + } +} + function normalizeRepoPath(path: string): string { return path.trim(); } @@ -375,6 +581,7 @@ export function AppProvider({ children }: AppProviderProps) { actionID: action.id, values, }); + const structured = result.exitCode === 0 ? toStructuredOutput(action.id, result.output || "", state.repoPath) : {}; setState((prev) => ({ ...prev, output: { @@ -382,6 +589,8 @@ export function AppProvider({ children }: AppProviderProps) { command: result.command, exitCode: result.exitCode, body: result.output || "(no output)", + items: structured.items, + emptyHint: structured.emptyHint, }, })); } catch (error) { diff --git a/desktop/frontend/src/app/types.ts b/desktop/frontend/src/app/types.ts index 90491e9..de456a6 100644 --- a/desktop/frontend/src/app/types.ts +++ b/desktop/frontend/src/app/types.ts @@ -9,11 +9,22 @@ export type { ActionRunRequest, CommandResult, DesktopModule, ModuleAction }; export type SidebarMenuType = "source" | "collaboration" | "release" | "all"; +export interface OutputListItem { + id: string; + primary: string; + secondary?: string; + badge?: string; + active?: boolean; + url?: string; +} + export interface OperationOutput { title: string; command: string; exitCode: number; body: string; + items?: OutputListItem[]; + emptyHint?: string; } export interface AppState { diff --git a/desktop/frontend/src/features/output/output-panel.tsx b/desktop/frontend/src/features/output/output-panel.tsx index 9e00d63..ee43766 100644 --- a/desktop/frontend/src/features/output/output-panel.tsx +++ b/desktop/frontend/src/features/output/output-panel.tsx @@ -2,6 +2,7 @@ import { useAppContext } from "../../app/providers/app-context"; export function OutputPanel() { const { state } = useAppContext(); + const hasList = Boolean(state.output.items && state.output.items.length > 0); return (
@@ -14,7 +15,31 @@ export function OutputPanel() { exit {state.output.exitCode}
-
{state.output.body}
+ {hasList ? ( +
    + {state.output.items?.map((item) => ( +
  • +
    +

    {item.primary}

    + {item.secondary ? ( + item.url ? ( + + {item.secondary} + + ) : ( + {item.secondary} + ) + ) : null} +
    + {item.badge ? {item.badge} : null} +
  • + ))} +
+ ) : state.output.emptyHint ? ( +
{state.output.emptyHint}
+ ) : ( +
{state.output.body}
+ )}
); } diff --git a/desktop/frontend/src/styles/output.css b/desktop/frontend/src/styles/output.css index 21590ca..9242327 100644 --- a/desktop/frontend/src/styles/output.css +++ b/desktop/frontend/src/styles/output.css @@ -59,3 +59,85 @@ font-size: 12px; line-height: 1.55; } + +.output-list { + margin: 0; + padding: 0; + list-style: none; + min-height: 180px; + max-height: 30vh; + overflow: auto; + border: 1px solid var(--line-output); + border-radius: var(--radius-lg); + background: var(--bg-output); + display: grid; + align-content: start; + gap: 0; +} + +.output-list__item { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; + padding: 10px 12px; + border-bottom: 1px solid var(--line-output); +} + +.output-list__item:last-child { + border-bottom: 0; +} + +.output-list__item--active { + background: var(--brand-soft); +} + +.output-list__main { + min-width: 0; + display: grid; + gap: 3px; +} + +.output-list__main p { + margin: 0; + color: var(--text-output); + font-size: 13px; + font-family: var(--font-heading); + word-break: break-word; +} + +.output-list__main span, +.output-list__main a { + color: var(--text-2); + font-size: 11px; + text-decoration: none; + word-break: break-all; +} + +.output-list__main a:hover { + text-decoration: underline; +} + +.output-list__badge { + flex: 0 0 auto; + border: 1px solid var(--line-strong); + border-radius: 999px; + background: var(--bg-card-soft); + color: var(--text-2); + padding: 1px 8px; + font-size: 11px; + line-height: 1.6; +} + +.output-empty { + min-height: 180px; + max-height: 30vh; + border: 1px dashed var(--line-output); + border-radius: var(--radius-lg); + background: var(--bg-output); + color: var(--text-2); + display: grid; + place-items: center; + font-size: 12px; + padding: 10px; +} From 06ac38ddd55fb8c082e585080433cf575d1c2300 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 30 Jun 2026 19:22:50 +0800 Subject: [PATCH 09/16] Remove stale frontend dist asset --- .../{index-CKokO-kX.js => index-DAEMvX1x.js} | 2 +- .../frontend/dist/assets/index-pTWD1XWh.css | 1 + .../frontend/dist/assets/index-yhaLZGkG.css | 1 - desktop/frontend/dist/index.html | 4 +- .../src/features/modules/module-actions.tsx | 264 +++++++++++++++--- desktop/frontend/src/styles/forms.css | 21 ++ desktop/frontend/src/styles/layout.css | 2 +- desktop/frontend/src/styles/modules.css | 196 +++++++++++-- desktop/frontend/src/styles/output.css | 14 +- 9 files changed, 436 insertions(+), 69 deletions(-) rename desktop/frontend/dist/assets/{index-CKokO-kX.js => index-DAEMvX1x.js} (93%) create mode 100644 desktop/frontend/dist/assets/index-pTWD1XWh.css delete mode 100644 desktop/frontend/dist/assets/index-yhaLZGkG.css diff --git a/desktop/frontend/dist/assets/index-CKokO-kX.js b/desktop/frontend/dist/assets/index-DAEMvX1x.js similarity index 93% rename from desktop/frontend/dist/assets/index-CKokO-kX.js rename to desktop/frontend/dist/assets/index-DAEMvX1x.js index d1508bd..a2d0134 100644 --- a/desktop/frontend/dist/assets/index-CKokO-kX.js +++ b/desktop/frontend/dist/assets/index-DAEMvX1x.js @@ -11,4 +11,4 @@ Error generating stack: `+e.message+` %cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development -`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function C(e){S?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function re(){return!!window._wails?.environment?.Debug}function w(){return new MouseEvent(`mousedown`).buttons===0}function ie(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}d&&document.addEventListener(`DOMContentLoaded`,()=>{}),d&&window.addEventListener(`contextmenu`,ce);var ae=y(g.ContextMenu),oe=0;function se(e,t,n,r){ae(oe,{id:e,x:t,y:n,data:r})}function ce(e){let t=ie(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);se(n,e.clientX,e.clientY,r)}else le(e,t)}function le(e,t){if(re())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{de=e,de||(fe=pe=!1,De())});var ge=!1;function _e(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function ve(){if(!ge&&!_e()){window.addEventListener(`mousedown`,Ce,{capture:!0}),window.addEventListener(`mousemove`,Ce,{capture:!0}),window.addEventListener(`mouseup`,Ce,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,ye,{capture:!0});ge=!0}}if(d){ve(),document.addEventListener(`DOMContentLoaded`,ve,{once:!0});let e=0,t=window.setInterval(()=>{if(ge){window.clearInterval(t);return}ve(),++e>100&&window.clearInterval(t)},50)}function ye(e){(E||pe)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var be=0,xe=1,Se=2;function Ce(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=be,he||(n=O|1<{n=e,r=t}),this.constructor[et]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[Qe]:{configurable:!1,enumerable:!1,writable:!0,value:null},[$e]:{configurable:!1,enumerable:!1,writable:!1,value:nt(i,a)}});let o=it(i,a);try{e(rt(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[$e](new Xe(`Promise cancelled.`,{cause:t})),lt(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(Ye(t)||(t=ot),Ye(n)||(n=st),t===ot&&n==st)return new e(e=>e(this));let i={};return this[Qe]=i,new e((e,r)=>{super.then(n=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return Ye(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[et](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>at(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>at(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>at(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>at(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function nt(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new Ze(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new Ze(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function rt(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(Ye(r)){try{let r=n.cancel;if(Ye(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?nt(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=it(e,i);try{Reflect.apply(r,n,[rt(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function it(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof Xe&&t.reason instanceof Xe&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new Ze(e.promise,n))}else t.settled=!0,e.reject(n)}}function at(e,t,n){let r=[];for(let i of t){let t;try{if(!Ye(i.then)||(t=i.cancel,!Ye(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new Ze(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new Ze(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function ot(e){return e}function st(e){throw e}function ct(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function lt(e){let t=e[Qe]??{};return`promise`in t||Object.assign(t,ut()),e[Qe]??(t.resolve(),e[Qe]=t),t.promise}var ut=Promise.withResolvers;ut=ut&&typeof ut==`function`?ut.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},d&&(window._wails=window._wails||{});var dt=y(g.Call),ft=y(g.CancelCall),pt=new Map,mt=0,ht=0;function gt(){let e;do e=p();while(pt.has(e));return e}function _t(e){let t=gt(),n=tt.withResolvers();pt.set(t,{resolve:n.resolve,reject:n.reject});let r=dt(mt,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,pt.delete(t),n.resolve(e)},e=>{i=!1,pt.delete(t),n.reject(e)});let a=()=>(pt.delete(t),ft(ht,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function vt(e,...t){return _t({methodID:e,args:t})}var yt=`data-file-drop-target`,bt=`file-drop-target-active`,k=null,xt=0,St=1,Ct=2,wt=3,Tt=4,Et=5,Dt=6,Ot=7,kt=8,At=9,jt=10,Mt=11,Nt=12,Pt=13,Ft=14,It=15,Lt=16,Rt=17,zt=18,Bt=19,Vt=20,Ht=21,Ut=22,Wt=23,Gt=24,Kt=25,qt=26,Jt=27,Yt=28,Xt=29,Zt=30,Qt=31,$t=32,en=33,tn=34,nn=35,rn=36,an=37,on=38,sn=39,cn=40,ln=41,un=42,dn=43,fn=44,pn=45,mn=46,hn=47,gn=48,_n=49,vn=50,yn=51,bn=52;function xn(e){return e?e.closest(`[${yt}]`):null}function Sn(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function Cn(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var wn=!1;function Tn(){wn=!1,k&&=(k.classList.remove(bt),null)}function En(){window._wails?.flags?.enableFileDrop!==!1&&(wn=!0)}function Dn(){Tn()}function On(e,t){if(!wn||window._wails?.flags?.enableFileDrop===!1)return;let n=xn(document.elementFromPoint(e,t));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),k=n):k=null}var A=Symbol(`caller`),kn=new class e{constructor(t=``){this[A]=y(g.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[A](xt)}Center(){return this[A](St)}Close(){return this[A](Ct)}DisableSizeConstraints(){return this[A](wt)}EnableSizeConstraints(){return this[A](Tt)}Focus(){return this[A](Et)}ForceReload(){return this[A](Dt)}Fullscreen(){return this[A](Ot)}GetScreen(){return this[A](kt)}GetZoom(){return this[A](At)}Height(){return this[A](jt)}Hide(){return this[A](Mt)}IsFocused(){return this[A](Nt)}IsFullscreen(){return this[A](Pt)}IsMaximised(){return this[A](Ft)}IsMinimised(){return this[A](It)}Maximise(){return this[A](Lt)}Minimise(){return this[A](Rt)}Name(){return this[A](zt)}OpenDevTools(){return this[A](Bt)}RelativePosition(){return this[A](Vt)}Reload(){return this[A](Ht)}Resizable(){return this[A](Ut)}Restore(){return this[A](Wt)}SetPosition(e,t){return this[A](Gt,{x:e,y:t})}SetAlwaysOnTop(e){return this[A](Kt,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[A](qt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[A](Jt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[A](Yt,{enabled:e})}SetMaxSize(e,t){return this[A](Xt,{width:e,height:t})}SetMinSize(e,t){return this[A](Zt,{width:e,height:t})}SetRelativePosition(e,t){return this[A](Qt,{x:e,y:t})}SetResizable(e){return this[A]($t,{resizable:e})}SetSize(e,t){return this[A](en,{width:e,height:t})}SetTitle(e){return this[A](tn,{title:e})}SetZoom(e){return this[A](nn,{zoom:e})}Show(){return this[A](rn)}Size(){return this[A](an)}ToggleFullscreen(){return this[A](on)}ToggleMaximise(){return this[A](sn)}ToggleFrameless(){return this[A](cn)}UnFullscreen(){return this[A](ln)}UnMaximise(){return this[A](un)}UnMinimise(){return this[A](dn)}Width(){return this[A](fn)}Zoom(){return this[A](pn)}ZoomIn(){return this[A](mn)}ZoomOut(){return this[A](hn)}ZoomReset(){return this[A](gn)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=xn(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=n):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==t&&k.classList.remove(bt),t?(t.classList.contains(bt)||t.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=t):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||k&&!k.contains(e.relatedTarget))&&(k&&=(k.classList.remove(bt),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,k&&=(k.classList.remove(bt),null),Sn()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&Cn(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&An(),d&&(window._wails=window._wails||{}),d&&(window._wails.invoke=C,window._wails.clientId=_),d&&(window._wails.handlePlatformFileDrop=kn.HandlePlatformFileDrop.bind(kn)),d&&(window._wails.handleDragEnter=En,window._wails.handleDragLeave=Dn,window._wails.handleDragOver=On),d&&C(`wails:runtime:ready`);function jn(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}d&&jn(`/wails/custom.js`);function Mn(){return vt(1211788486)}function Nn(){return vt(853311305)}function Pn(e){return vt(465937298,e)}function Fn(e){return vt(2463093517,e)}var In=class{getRepoRoot(){return Nn()}setRepoRoot(e){return Fn(e)}async getModules(){return await Mn()??[]}runAction(e){return Pn(e)}};function Ln(e){switch(e){case`repo`:case`branch`:case`worktree`:return`source`;case`issue`:case`pr`:return`collaboration`;case`tag`:return`release`;default:return`all`}}function Rn(e,t){return t===`all`?e:e.filter(e=>Ln(e.id)===t)}var zn=`fastgit.desktop.prefs.v1`;function Bn(){return typeof window<`u`&&window.localStorage!==void 0}function Vn(){if(!Bn())return{};try{let e=window.localStorage.getItem(zn);if(!e)return{};let t=JSON.parse(e);if(!t||typeof t!=`object`)return{};let n=Array.isArray(t.repoNamespaces)?t.repoNamespaces.map(e=>String(e).trim()).filter(Boolean):void 0,r=typeof t.selectedRepoPath==`string`?t.selectedRepoPath.trim():void 0;return{...t,repoNamespaces:n,selectedRepoPath:r}}catch{return{}}}function Hn(e){Bn()&&window.localStorage.setItem(zn,JSON.stringify(e))}function Un(e){return`fastgit.desktop.tabs:${e}`}function Wn(e){if(!Bn()||!e)return null;try{let t=window.localStorage.getItem(Un(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!=`object`?null:{openedModuleIds:Array.isArray(n.openedModuleIds)?n.openedModuleIds.map(e=>String(e)):[],selectedModuleId:n.selectedModuleId?String(n.selectedModuleId):null}}catch{return null}}function Gn(e,t){!Bn()||!e||window.localStorage.setItem(Un(e),JSON.stringify(t))}var Kn=(0,l.createContext)(null);function qn(){let e=(0,l.useContext)(Kn);if(!e)throw Error(`useAppContext must be used within AppProvider`);return e}var Jn=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),j=e(((e,t)=>{t.exports=Jn()}))(),Yn={title:`Welcome`,command:`-`,exitCode:0,body:`请选择左侧模块并执行动作。`},Xn=new In,Zn=/^#(\d+)\s+\[([^\]]+)\]\s+(.+)$/,Qn=/^(.{2})\s+(.+)$/;function $n(e){let t=e.split(/\r?\n/).map(e=>e.trimEnd()),n=[];return t.forEach((e,t)=>{let r=e.trim();if(!r)return;let i=r.startsWith(`* `),a=i?r.slice(2).trim():r.replace(/^-+\s+/,``);a&&n.push({id:`${a}-${t}`,primary:a,active:i,badge:i?`current`:void 0})}),n}function er(e){return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map((e,t)=>({id:`${e}-${t}`,primary:e}))}function tr(e){return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).flatMap((e,t)=>{let n=e.match(Zn);return n?[{id:`${n[1]}-${t}`,primary:`#${n[1]} ${n[3]}`,badge:n[2]}]:[]})}function nr(e){let t=e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(t.length===0)return[];let n=t[0].match(/^#(\d+)\s+\[([^\]]+)\]$/);if(!n)return[];let r=t[1]??`PR #${n[1]}`,i=t.find(e=>/^https?:\/\//.test(e));return[{id:`pr-${n[1]}`,primary:`#${n[1]} ${r}`,badge:n[2],secondary:i,url:i}]}function rr(e){return e.split(/\r?\n/).map(e=>e.trimEnd()).filter(Boolean).flatMap((e,t)=>{let n=e.match(Qn);if(!n)return[];let r=n[1].replace(/\s/g,`·`);return[{id:`repo-${t}`,primary:n[2],badge:r}]})}function ir(e,t){let n=e.split(/\r?\n/),r=[],i=``,a=``,o=``,s=()=>{if(!i)return;let e=[a,o?o.slice(0,8):``].filter(Boolean).join(` · `);r.push({id:`${i}-${r.length}`,primary:i,secondary:e||void 0,active:i===t,badge:i===t?`current`:void 0})};return n.forEach(e=>{let t=e.trim();if(t){if(t.startsWith(`worktree `)){s(),i=t.slice(9).trim(),a=``,o=``;return}if(t.startsWith(`branch `)){a=t.slice(7).trim().replace(`refs/heads/`,``);return}t.startsWith(`HEAD `)&&(o=t.slice(5).trim())}}),s(),r}function ar(e,t,n){let r=t.trim();switch(e){case`branch_list`:{let e=$n(r);return{items:e,emptyHint:e.length===0?`暂无分支`:void 0}}case`tag_list`:{let e=er(r);return{items:e,emptyHint:r===`no tags`||e.length===0?`暂无标签`:void 0}}case`worktree_list`:{let e=ir(r,n);return{items:e,emptyHint:r===`no worktree`||e.length===0?`暂无 worktree`:void 0}}case`issue_list`:{let e=tr(r);return{items:e,emptyHint:r===`no open issues`||e.length===0?`暂无 open issues`:void 0}}case`pr_status`:return{items:nr(r),emptyHint:r===`no open PR for current branch`?`当前分支暂无 open PR`:void 0};case`repo_status`:return{items:rr(r),emptyHint:r===`working tree clean`?`工作区干净`:void 0};default:return{}}}function or(e){return e.trim()}function sr(e,...t){let n=new Set,r=[],i=e=>{let t=or(e);!t||n.has(t)||(n.add(t),r.push(t))};return e.forEach(i),t.forEach(i),r}function cr(e,t){let n=or(t);return n?[n,...e.filter(e=>or(e)!==n)]:e}function lr(e,t){return t?e.includes(t)?e:[...e,t]:e}function ur(e){return Math.max(220,Math.min(420,e))}function dr(e,t,n){let r=Rn(e,t);return n[n.length-1]??r[0]?.id??e[0]?.id??null}function fr(){let e=Vn(),t=or(e.selectedRepoPath??``);return{repoPath:t,repoNamespaces:cr(sr(e.repoNamespaces??[],t),t),repoStatus:`加载中...`,modules:[],selectedModuleId:null,openedModuleIds:[],selectedMenu:e.selectedMenu??`source`,modulePaneWidth:ur(e.modulePaneWidth??280),modulePaneCollapsed:e.modulePaneCollapsed??!1,busy:!1,output:Yn}}function pr({children:e}){let[t,n]=(0,l.useState)(fr),r=(0,l.useCallback)(e=>{n(t=>({...t,busy:e}))},[]),i=(0,l.useCallback)(async e=>{let t=or(e??``);r(!0);try{t&&await Xn.setRepoRoot(t);let[e,r]=await Promise.all([Xn.getRepoRoot(),Xn.getModules()]),i=or(e);n(e=>{let n=Wn(i),a=Rn(r,e.selectedMenu),o=n?.selectedModuleId??e.selectedModuleId,s=o&&a.some(e=>e.id===o)?o:a[0]?.id??r[0]?.id??null,c=new Set(r.map(e=>e.id)),l=(n?.openedModuleIds??e.openedModuleIds).filter(e=>c.has(e));return{...e,repoPath:i,repoNamespaces:cr(sr(e.repoNamespaces,t,i),i),repoStatus:i?`当前项目: ${i}`:`请先选择项目命名空间`,modules:r,selectedModuleId:s,openedModuleIds:lr(l,s)}})}catch(e){let r=String(e);n(e=>({...e,output:{title:t?`Set Project`:`Load Error`,command:t?`SetProjectRoot`:`bootstrap`,exitCode:1,body:r},repoStatus:t?`项目切换失败: ${r}`:`加载失败: ${r}`}))}finally{r(!1)}},[r]),a=(0,l.useCallback)(e=>{n(t=>({...t,selectedModuleId:e,openedModuleIds:lr(t.openedModuleIds,e)}))},[]),o=(0,l.useCallback)(e=>{n(t=>{if(t.selectedMenu===e)return{...t,modulePaneCollapsed:!t.modulePaneCollapsed};let n=Rn(t.modules,e),r=t.selectedModuleId&&n.some(e=>e.id===t.selectedModuleId)?t.selectedModuleId:n[0]?.id??t.modules[0]?.id??null;return{...t,selectedMenu:e,selectedModuleId:r,openedModuleIds:lr(t.openedModuleIds,r),modulePaneCollapsed:!1}})},[]),s=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.filter(t=>t!==e);if(t.selectedModuleId!==e)return{...t,openedModuleIds:n};let r=dr(t.modules,t.selectedMenu,n);return{...t,openedModuleIds:n,selectedModuleId:r}})},[]),c=(0,l.useCallback)(e=>{n(t=>t.openedModuleIds.includes(e)?{...t,openedModuleIds:[e],selectedModuleId:e}:t)},[]),u=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.indexOf(e);if(n<0)return t;let r=t.openedModuleIds.slice(0,n+1),i=t.selectedModuleId&&r.includes(t.selectedModuleId)?t.selectedModuleId:dr(t.modules,t.selectedMenu,r);return{...t,openedModuleIds:r,selectedModuleId:i}})},[]),d=(0,l.useCallback)((e,t)=>{e!==t&&n(n=>{let r=n.openedModuleIds.indexOf(e),i=n.openedModuleIds.indexOf(t);if(r<0||i<0)return n;let a=[...n.openedModuleIds];a.splice(r,1);let o=a.indexOf(t);return a.splice(o,0,e),{...n,openedModuleIds:a}})},[]),f=(0,l.useCallback)(()=>{n(e=>{let t=Rn(e.modules,e.selectedMenu).find(t=>!e.openedModuleIds.includes(t.id))??e.modules[0];return t?{...e,selectedModuleId:t.id,openedModuleIds:lr(e.openedModuleIds,t.id),modulePaneCollapsed:!1}:e})},[]),p=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneWidth:ur(e)}))},[]),m=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneCollapsed:e}))},[]),h=(0,l.useCallback)(async e=>{let r=or(e);!r||r===t.repoPath||(n(e=>({...e,repoNamespaces:cr(sr(e.repoNamespaces,r),r)})),await i(r))},[i,t.repoPath]),g=(0,l.useCallback)(async e=>{let t=or(e);t&&n(e=>({...e,repoNamespaces:sr(e.repoNamespaces,t),repoStatus:t===e.repoPath?`当前项目: ${e.repoPath}`:`已添加项目命名空间: ${t}`}))},[]),_=(0,l.useCallback)(async e=>{let r=or(e);if(!r)return;let a=t.repoNamespaces.filter(e=>e!==r);if(a.length!==t.repoNamespaces.length){if(t.repoPath===r){if(a.length===0)return;n(e=>({...e,repoNamespaces:a})),await i(a[0]);return}n(e=>({...e,repoNamespaces:a}))}},[i,t.repoNamespaces,t.repoPath]),v=(0,l.useCallback)(async(e,i,a)=>{if(!t.repoPath){n(t=>({...t,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:`请先选择项目命名空间。`}}));return}r(!0);try{let r=await Xn.runAction({moduleID:e.id,actionID:i.id,values:a}),o=r.exitCode===0?ar(i.id,r.output||``,t.repoPath):{};n(t=>({...t,output:{title:`${e.title} / ${i.title}`,command:r.command,exitCode:r.exitCode,body:r.output||`(no output)`,items:o.items,emptyHint:o.emptyHint}}))}catch(t){n(n=>({...n,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:String(t)}}))}finally{r(!1)}},[r,t.repoPath]),y=(0,l.useMemo)(()=>t.selectedModuleId?t.modules.find(e=>e.id===t.selectedModuleId)??null:null,[t.modules,t.selectedModuleId]),b=(0,l.useMemo)(()=>Rn(t.modules,t.selectedMenu),[t.modules,t.selectedMenu]);(0,l.useEffect)(()=>{Hn({selectedMenu:t.selectedMenu,modulePaneWidth:t.modulePaneWidth,modulePaneCollapsed:t.modulePaneCollapsed,repoNamespaces:t.repoNamespaces,selectedRepoPath:t.repoPath})},[t.modulePaneCollapsed,t.modulePaneWidth,t.repoNamespaces,t.repoPath,t.selectedMenu]),(0,l.useEffect)(()=>{if(!t.repoPath)return;let e=new Set(t.modules.map(e=>e.id)),n=t.openedModuleIds.filter(t=>e.has(t)),r=t.selectedModuleId&&e.has(t.selectedModuleId)?t.selectedModuleId:null;Gn(t.repoPath,{openedModuleIds:n,selectedModuleId:r})},[t.modules,t.openedModuleIds,t.repoPath,t.selectedModuleId]);let x=(0,l.useMemo)(()=>({state:t,selectedModule:y,filteredModules:b,setSelectedModule:a,closeModuleTab:s,closeOtherModuleTabs:c,closeTabsToRight:u,reorderModuleTabs:d,addModuleTab:f,setSelectedMenu:o,setModulePaneWidth:p,setModulePaneCollapsed:m,refresh:i,addRepo:g,switchRepo:h,removeRepo:_,runAction:v}),[t,y,b,a,s,c,u,d,f,o,p,m,i,g,h,_,v]);return(0,j.jsx)(Kn.Provider,{value:x,children:e})}var mr=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),hr=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),gr=e=>{let t=hr(e);return t.charAt(0).toUpperCase()+t.slice(1)},_r=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),vr=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},yr={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},br=(0,l.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,l.createElement)(`svg`,{ref:c,...yr,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:_r(`lucide`,i),...!a&&!vr(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,l.createElement)(e,t)),...Array.isArray(a)?a:[a]])),xr=(e,t)=>{let n=(0,l.forwardRef)(({className:n,...r},i)=>(0,l.createElement)(br,{ref:i,iconNode:t,className:_r(`lucide-${mr(gr(e))}`,`lucide-${e}`,n),...r}));return n.displayName=gr(e),n},Sr=xr(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),Cr=xr(`git-fork`,[[`circle`,{cx:`12`,cy:`18`,r:`3`,key:`1mpf1b`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`path`,{d:`M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9`,key:`1uq4wg`}],[`path`,{d:`M12 12v3`,key:`158kv8`}]]),wr=xr(`layout-grid`,[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]),Tr=xr(`panel-right-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m8 9 3 3-3 3`,key:`12hl5m`}]]),Er=xr(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),Dr=xr(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),Or=xr(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]),kr=xr(`tags`,[[`path`,{d:`M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z`,key:`16rjxf`}],[`path`,{d:`M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193`,key:`178nd4`}],[`circle`,{cx:`10.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`12ikhr`}]]),Ar=xr(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function jr(...e){return e.filter(Boolean).join(` `)}function Mr({variant:e=`default`,className:t,children:n,...r}){return(0,j.jsx)(`button`,{className:jr(`ui-button`,`ui-button--${e}`,t),...r,children:n})}var Nr={source:`源码与仓库`,collaboration:`协作与评审`,release:`发布与版本`,all:`全部模块`};function Pr(){let{state:e,filteredModules:t,setSelectedModule:n,setModulePaneCollapsed:r,refresh:i}=qn();return(0,j.jsxs)(`aside`,{className:`module-pane`,children:[(0,j.jsxs)(`div`,{className:`module-pane__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:Nr[e.selectedMenu]??`模块`}),(0,j.jsxs)(`p`,{children:[t.length,` 个模块`]})]}),(0,j.jsxs)(`div`,{className:`module-pane__actions`,children:[(0,j.jsx)(Mr,{variant:`ghost`,onClick:()=>void i(),children:`刷新`}),(0,j.jsx)(Mr,{variant:`ghost`,className:`module-pane__collapse`,onClick:()=>r(!0),children:(0,j.jsx)(Tr,{size:14})})]})]}),(0,j.jsxs)(`div`,{className:`module-pane__list`,children:[t.map(t=>(0,j.jsxs)(`button`,{className:jr(`module-pane__item`,e.selectedModuleId===t.id&&`module-pane__item--active`),onClick:()=>n(t.id),type:`button`,children:[(0,j.jsx)(`strong`,{children:t.title}),(0,j.jsx)(`span`,{children:t.description})]},t.id)),t.length===0&&(0,j.jsx)(`div`,{className:`module-pane__empty`,children:`当前菜单下暂无模块`})]})]})}var Fr=[{id:`source`,label:`源码`,icon:Cr},{id:`collaboration`,label:`协作`,icon:Sr},{id:`release`,label:`发布`,icon:kr},{id:`all`,label:`全部`,icon:wr}];function Ir(){let{state:e,setSelectedMenu:t,refresh:n}=qn();return(0,j.jsxs)(`aside`,{className:`sidebar-menu-panel`,children:[(0,j.jsx)(`div`,{className:`sidebar-menu-panel__group`,children:Fr.map(n=>{let r=n.icon;return(0,j.jsxs)(`button`,{className:jr(`sidebar-menu-panel__item`,e.selectedMenu===n.id&&`sidebar-menu-panel__item--active`),onClick:()=>t(n.id),title:n.label,type:`button`,children:[(0,j.jsx)(r,{size:18,strokeWidth:2}),(0,j.jsx)(`span`,{children:n.label})]},n.id)})}),(0,j.jsxs)(`div`,{className:`sidebar-menu-panel__footer`,children:[(0,j.jsx)(Mr,{variant:`ghost`,className:`sidebar-menu-panel__refresh`,onClick:()=>void n(),children:(0,j.jsx)(Dr,{size:14})}),(0,j.jsx)(`span`,{children:e.modulePaneCollapsed?`已收起`:e.busy?`运行中`:`空闲`})]})]})}function Lr({className:e,...t}){return(0,j.jsx)(`input`,{className:jr(`ui-input`,e),...t})}function Rr(e){let t=new FormData(e),n={};for(let[e,r]of t.entries())n[e]=String(r).trim();return n}function zr(){let{selectedModule:e,runAction:t}=qn();if(!e)return(0,j.jsx)(`section`,{className:`module-actions`,children:(0,j.jsx)(`div`,{className:`empty-state`,children:`未找到模块,请刷新。`})});let n=e.actions??[],r=n=>r=>{r.preventDefault(),t(e,n,Rr(r.currentTarget))};return(0,j.jsxs)(`section`,{className:`module-actions`,children:[(0,j.jsxs)(`header`,{className:`module-actions__header`,children:[(0,j.jsx)(`h2`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsx)(`div`,{className:`module-actions__grid`,children:n.map((e,t)=>(0,j.jsxs)(`article`,{className:`action-card`,style:{animationDelay:`${t*60}ms`},children:[(0,j.jsxs)(`div`,{className:`action-card__meta`,children:[(0,j.jsx)(`h3`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsxs)(`form`,{onSubmit:r(e),className:`action-card__form`,children:[(0,j.jsx)(`div`,{className:`action-card__fields`,children:(e.fields??[]).map(e=>(0,j.jsxs)(`label`,{className:`action-field`,children:[(0,j.jsx)(`span`,{children:e.label}),(0,j.jsx)(Lr,{name:e.key,placeholder:e.placeholder||e.label,defaultValue:e.default||``,required:!!e.required})]},e.key))}),(0,j.jsx)(`div`,{className:`action-card__footer`,children:(0,j.jsx)(Mr,{type:`submit`,children:`执行`})})]})]},e.id))})]})}function Br(){let{state:e}=qn(),t=!!(e.output.items&&e.output.items.length>0);return(0,j.jsxs)(`section`,{className:`output-panel`,children:[(0,j.jsxs)(`header`,{className:`output-panel__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:e.output.title}),(0,j.jsx)(`p`,{children:e.output.command})]}),(0,j.jsxs)(`span`,{className:e.output.exitCode===0?`status-pill status-pill--ok`:`status-pill status-pill--error`,children:[`exit `,e.output.exitCode]})]}),t?(0,j.jsx)(`ul`,{className:`output-list`,role:`list`,children:e.output.items?.map(e=>(0,j.jsxs)(`li`,{className:e.active?`output-list__item output-list__item--active`:`output-list__item`,children:[(0,j.jsxs)(`div`,{className:`output-list__main`,children:[(0,j.jsx)(`p`,{children:e.primary}),e.secondary?e.url?(0,j.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,children:e.secondary}):(0,j.jsx)(`span`,{children:e.secondary}):null]}),e.badge?(0,j.jsx)(`span`,{className:`output-list__badge`,children:e.badge}):null]},e.id))}):e.output.emptyHint?(0,j.jsx)(`div`,{className:`output-empty`,children:e.output.emptyHint}):(0,j.jsx)(`pre`,{className:`output-panel__body`,children:e.output.body})]})}var Vr=`data:image/svg+xml,%3csvg%20width='512'%20height='512'%20viewBox='0%200%20512%20512'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20role='img'%20aria-label='fastgit%20logo%20icon'%3e%3cdefs%3e%3clinearGradient%20id='bg'%20x1='72'%20y1='56'%20x2='448'%20y2='456'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%233C679F'/%3e%3cstop%20offset='1'%20stop-color='%231F2D44'/%3e%3c/linearGradient%3e%3clinearGradient%20id='stroke'%20x1='136'%20y1='152'%20x2='376'%20y2='360'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F0F3F8'/%3e%3cstop%20offset='1'%20stop-color='%23D6DFEF'/%3e%3c/linearGradient%3e%3c/defs%3e%3crect%20x='56'%20y='56'%20width='400'%20height='400'%20rx='96'%20fill='url(%23bg)'/%3e%3cpath%20d='M168%20336V208C168%20194.745%20178.745%20184%20192%20184H320C333.255%20184%20344%20194.745%20344%20208V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M256%20184V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'/%3e%3ccircle%20cx='168'%20cy='336'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='344'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='184'%20r='30'%20fill='%23E8EDF4'/%3e%3c/svg%3e`;function Hr(){let{state:e,addRepo:t,switchRepo:n,removeRepo:r}=qn(),[i,a]=(0,l.useState)(``),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(``);(0,l.useEffect)(()=>{s(e.repoPath)},[e.repoPath]);let d=i.trim().length>0,f=(0,l.useMemo)(()=>{let t=c.trim().toLowerCase();return t?e.repoNamespaces.filter(e=>e.toLowerCase().includes(t)):e.repoNamespaces},[c,e.repoNamespaces]),p=async()=>{let e=i.trim();e&&(await t(e),a(``))},m=async()=>{let e=i.trim();e&&(await n(e),a(``))};return(0,j.jsxs)(`section`,{className:`repo-settings`,"aria-label":`Project settings`,children:[(0,j.jsxs)(`header`,{className:`repo-settings__header`,children:[(0,j.jsx)(`h3`,{children:`Settings · Projects`}),(0,j.jsxs)(`p`,{children:[e.repoNamespaces.length,` 个项目`]})]}),(0,j.jsxs)(`div`,{className:`repo-settings__current`,children:[(0,j.jsx)(`span`,{children:`当前项目`}),(0,j.jsx)(`strong`,{children:e.repoPath||`未选择`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row workspace-panel__row--add`,children:[(0,j.jsx)(Lr,{value:i,onChange:e=>a(e.target.value),placeholder:`/path/to/project (git repository)`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:()=>void p(),disabled:!d,children:`添加`}),(0,j.jsx)(Mr,{variant:`primary`,onClick:()=>void m(),disabled:!d,children:`添加并切换`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row`,children:[(0,j.jsx)(Lr,{value:c,onChange:e=>u(e.target.value),placeholder:`筛选项目...`}),(0,j.jsxs)(`span`,{className:`repo-settings__count`,children:[f.length,` / `,e.repoNamespaces.length]})]}),(0,j.jsxs)(`div`,{className:`repo-list`,role:`list`,children:[f.map(t=>{let i=t===e.repoPath;return(0,j.jsxs)(`article`,{className:[`repo-item`,i?`repo-item--current`:``,t===o?`repo-item--selected`:``].filter(Boolean).join(` `),onClick:()=>s(t),role:`button`,tabIndex:0,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),s(t))},children:[(0,j.jsxs)(`div`,{className:`repo-item__meta`,children:[(0,j.jsx)(`strong`,{children:t.split(/[\\/]/).filter(Boolean).pop()||t}),(0,j.jsx)(`span`,{children:t})]}),(0,j.jsxs)(`div`,{className:`repo-item__actions`,children:[(0,j.jsx)(`span`,{className:i?`repo-badge repo-badge--active`:`repo-badge`,children:i?`当前`:`可切换`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),n(t)},disabled:i,children:`切换`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),r(t)},disabled:i,children:`移除`})]})]},t)}),f.length===0&&(0,j.jsx)(`div`,{className:`repo-list__empty`,children:`没有匹配的项目`})]}),(0,j.jsx)(`p`,{className:`repo-settings__status`,children:e.repoStatus})]})}function Ur(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??`workspace`}function Wr(e){return e.split(/[\\/]/).filter(Boolean)}function Gr(e){let t=new Map;for(let n of e){let r=Wr(n);if(r.length===0){t.set(n,n);continue}let i=r[r.length-1];for(let t=1;t<=r.length;t+=1){let a=r.slice(-t).join(`/`);if(!e.some(e=>e===n?!1:Wr(e).slice(-t).join(`/`)===a)){i=a;break}i=a}t.set(n,i)}return t}function Kr(){let{state:e,addModuleTab:t,closeModuleTab:n,closeOtherModuleTabs:r,closeTabsToRight:i,reorderModuleTabs:a,setSelectedModule:o,switchRepo:s}=qn(),c=(0,l.useMemo)(()=>Gr(e.repoNamespaces),[e.repoNamespaces]),u=e.repoPath?c.get(e.repoPath)??Ur(e.repoPath):`workspace`,[d,f]=(0,l.useState)(null),[p,m]=(0,l.useState)(null),[h,g]=(0,l.useState)(null),[_,v]=(0,l.useState)(!1),y=(0,l.useRef)(null),b=(0,l.useRef)(null),x=e.openedModuleIds.map(t=>e.modules.find(e=>e.id===t)).filter(e=>e!==void 0),ee=x.length,S=(0,l.useMemo)(()=>h?x.find(e=>e.id===h.moduleId)??null:null,[h,x]),C=S?x.findIndex(e=>e.id===S.id):-1,te=ee>1,ne=C>=0&&C{let e=e=>{if(g(null),!_)return;let t=e.target;t&&(b.current?.contains(t)||y.current?.contains(t)||v(!1))},t=e=>{e.key===`Escape`&&(g(null),v(!1))};return window.addEventListener(`pointerdown`,e),window.addEventListener(`keydown`,t),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,t)}},[_]);let re=(e,t)=>{f(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t)},w=(e,t)=>{e.preventDefault(),d&&d!==t&&m(t)},ie=(e,t)=>{e.preventDefault(),!(!d||d===t)&&(a(d,t),m(null),f(null))},ae=(e,t)=>{e.preventDefault(),e.stopPropagation(),g({x:e.clientX,y:e.clientY,moduleId:t})},oe=e=>{e(),g(null)};return(0,j.jsxs)(`header`,{className:`tabs-header app-drag-region`,children:[(0,j.jsxs)(`div`,{className:`tabs-repo app-no-drag-region`,children:[(0,j.jsx)(`img`,{className:`tabs-repo__logo`,src:Vr,alt:`fastgit logo`}),(0,j.jsx)(`span`,{children:u})]}),(0,j.jsx)(`div`,{className:`tabs-track app-no-drag-region`,children:x.map(t=>{let r=e.selectedModuleId===t.id;return(0,j.jsxs)(`div`,{className:[`tabs-track__item`,r?`tabs-track__item--active`:``,p===t.id?`tabs-track__item--drag-over`:``].filter(Boolean).join(` `),onClick:()=>o(t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o(t.id))},onContextMenu:e=>ae(e,t.id),draggable:ee>1,onDragStart:e=>re(e,t.id),onDragOver:e=>w(e,t.id),onDrop:e=>ie(e,t.id),onDragEnd:()=>{f(null),m(null)},role:`button`,tabIndex:0,"aria-label":`switch to ${t.title}`,"aria-pressed":r,children:[(0,j.jsx)(`span`,{children:t.title}),(0,j.jsx)(`button`,{className:`tabs-track__close`,onClick:e=>{e.stopPropagation(),n(t.id)},onContextMenu:e=>ae(e,t.id),type:`button`,"aria-label":`close ${t.title}`,children:(0,j.jsx)(Ar,{size:13})})]},t.id)})}),(0,j.jsxs)(`div`,{className:`tabs-actions app-no-drag-region`,children:[(0,j.jsxs)(`select`,{className:`ui-input tabs-project-select`,value:e.repoPath,title:e.repoPath||`未选择项目`,onChange:e=>void s(e.target.value),children:[(0,j.jsx)(`option`,{value:``,children:e.repoNamespaces.length===0?`未配置项目`:`选择项目`}),e.repoNamespaces.map(e=>(0,j.jsx)(`option`,{value:e,children:c.get(e)??Ur(e)},e))]}),(0,j.jsx)(`button`,{ref:b,className:`tabs-settings`,onClick:()=>v(e=>!e),type:`button`,"aria-label":`open project settings`,children:(0,j.jsx)(Or,{size:14})}),(0,j.jsx)(`button`,{className:`tabs-add`,onClick:t,type:`button`,"aria-label":`new tab`,children:(0,j.jsx)(Er,{size:14})})]}),_&&(0,j.jsx)(`div`,{ref:y,className:`tabs-settings-panel app-no-drag-region`,onPointerDown:e=>e.stopPropagation(),children:(0,j.jsx)(Hr,{})}),h&&S&&(0,j.jsxs)(`div`,{className:`tabs-menu app-no-drag-region`,style:{left:`${h.x}px`,top:`${h.y}px`},onPointerDown:e=>e.stopPropagation(),children:[(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>n(S.id)),disabled:!te,children:`关闭标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>r(S.id)),disabled:!te,children:`关闭其他标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>i(S.id)),disabled:!ne,children:`关闭右侧标签`})]})]})}function qr(){let{state:e,setModulePaneWidth:t}=qn(),[n,r]=(0,l.useState)(!1),i=n=>{if(window.innerWidth<=900||e.modulePaneCollapsed)return;r(!0);let i=n.clientX,a=e.modulePaneWidth,o=e=>{t(a+(e.clientX-i))},s=()=>{r(!1),window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s)},a={"--module-pane-width":`${e.modulePaneWidth}px`};return(0,j.jsxs)(`main`,{className:`desktop-shell`,children:[(0,j.jsx)(Kr,{}),(0,j.jsxs)(`section`,{className:[`desktop-body`,n?`desktop-body--dragging`:``,e.modulePaneCollapsed?`desktop-body--pane-collapsed`:``].filter(Boolean).join(` `),style:a,children:[(0,j.jsx)(Ir,{}),(0,j.jsxs)(`div`,{className:`module-pane-wrap`,children:[(0,j.jsx)(Pr,{}),(0,j.jsx)(`div`,{className:`module-pane-resizer`,onMouseDown:i,role:`separator`,"aria-orientation":`vertical`,"aria-label":`resize sidebar`})]}),(0,j.jsxs)(`div`,{className:`desktop-main`,children:[(0,j.jsx)(zr,{}),(0,j.jsx)(Br,{})]})]})]})}function Jr(){let{state:e,refresh:t}=qn(),n=(0,l.useRef)(e.repoPath);return(0,l.useEffect)(()=>{t(n.current)},[t]),(0,j.jsx)(qr,{})}function Yr(){return(0,j.jsx)(pr,{children:(0,j.jsx)(Jr,{})})}var Xr=document.getElementById(`app`);if(!Xr)throw Error(`#app not found`);(0,u.createRoot)(Xr).render((0,j.jsx)(l.StrictMode,{children:(0,j.jsx)(Yr,{})})); \ No newline at end of file +`,`background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;`,`background: transparent;`,`color: #ffffff; font-style: italic; font-weight: bold;`),null})();function C(e){S?.(e)}function te(){return window._wails?.environment?.OS===`windows`}function ne(){return window._wails?.environment?.OS===`linux`}function re(){return!!window._wails?.environment?.Debug}function w(){return new MouseEvent(`mousedown`).buttons===0}function ie(e){return e.target instanceof HTMLElement?e.target:!(e.target instanceof HTMLElement)&&e.target instanceof Node?e.target.parentElement??document.body:document.body}d&&document.addEventListener(`DOMContentLoaded`,()=>{}),d&&window.addEventListener(`contextmenu`,ce);var ae=y(g.ContextMenu),oe=0;function se(e,t,n,r){ae(oe,{id:e,x:t,y:n,data:r})}function ce(e){let t=ie(e),n=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu`).trim();if(n){e.preventDefault();let r=window.getComputedStyle(t).getPropertyValue(`--custom-contextmenu-data`);se(n,e.clientX,e.clientY,r)}else le(e,t)}function le(e,t){if(re())return;switch(window.getComputedStyle(t).getPropertyValue(`--default-contextmenu`).trim()){case`show`:return;case`hide`:e.preventDefault();return}if(t.isContentEditable)return;let n=window.getSelection(),r=n&&n.toString().length>0;if(r)for(let e=0;e{de=e,de||(fe=pe=!1,De())});var ge=!1;function _e(){let e=window._wails?.environment?.OS;if(e===`ios`||e===`android`)return!0;let t=navigator.userAgent||navigator.vendor||window.opera||``;return/android|iphone|ipad|ipod|iemobile|wpdesktop/i.test(t)}function ve(){if(!ge&&!_e()){window.addEventListener(`mousedown`,Ce,{capture:!0}),window.addEventListener(`mousemove`,Ce,{capture:!0}),window.addEventListener(`mouseup`,Ce,{capture:!0});for(let e of[`click`,`contextmenu`,`dblclick`])window.addEventListener(e,ye,{capture:!0});ge=!0}}if(d){ve(),document.addEventListener(`DOMContentLoaded`,ve,{once:!0});let e=0,t=window.setInterval(()=>{if(ge){window.clearInterval(t);return}ve(),++e>100&&window.clearInterval(t)},50)}function ye(e){(E||pe)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault())}var be=0,xe=1,Se=2;function Ce(e){let t,n=e.buttons;switch(e.type){case`mousedown`:t=be,he||(n=O|1<{n=e,r=t}),this.constructor[et]!==Promise)throw TypeError(`CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.`);let i={promise:this,resolve:n,reject:r,get oncancelled(){return t??null},set oncancelled(e){t=e??void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[Qe]:{configurable:!1,enumerable:!1,writable:!0,value:null},[$e]:{configurable:!1,enumerable:!1,writable:!1,value:nt(i,a)}});let o=it(i,a);try{e(rt(i,a),o)}catch(e){a.resolving?console.log(`Unhandled exception in CancellablePromise executor.`,e):o(e)}}cancel(t){return new e(e=>{Promise.all([this[$e](new Xe(`Promise cancelled.`,{cause:t})),lt(this)]).then(()=>e(),()=>e())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener(`abort`,()=>void this.cancel(e.reason),{capture:!0}),this}then(t,n,r){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.then called on an invalid object.`);if(Ye(t)||(t=ot),Ye(n)||(n=st),t===ot&&n==st)return new e(e=>e(this));let i={};return this[Qe]=i,new e((e,r)=>{super.then(n=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(t(n))}catch(e){r(e)}},t=>{var a;this[Qe]===i&&(this[Qe]=null),(a=i.resolve)==null||a.call(i);try{e(n(t))}catch(e){r(e)}})},async e=>{try{return r?.(e)}finally{await this.cancel(e)}})}catch(e,t){return this.then(void 0,e,t)}finally(t,n){if(!(this instanceof e))throw TypeError(`CancellablePromise.prototype.finally called on an invalid object.`);return Ye(t)?this.then(n=>e.resolve(t()).then(()=>n),n=>e.resolve(t()).then(()=>{throw n}),n):this.then(t,t,n)}static get[et](){return Promise}static all(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.all(n).then(e,t)},e=>at(r,n,e));return r}static allSettled(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.allSettled(n).then(e,t)},e=>at(r,n,e));return r}static any(t){let n=Array.from(t),r=n.length===0?e.resolve(n):new e((e,t)=>{Promise.any(n).then(e,t)},e=>at(r,n,e));return r}static race(t){let n=Array.from(t),r=new e((e,t)=>{Promise.race(n).then(e,t)},e=>at(r,n,e));return r}static cancel(t){let n=new e(()=>{});return n.cancel(t),n}static timeout(t,n){let r=new e(()=>{});return AbortSignal&&typeof AbortSignal==`function`&&AbortSignal.timeout&&typeof AbortSignal.timeout==`function`?AbortSignal.timeout(t).addEventListener(`abort`,()=>void r.cancel(n)):setTimeout(()=>void r.cancel(n),t),r}static sleep(t,n){return new e(e=>{setTimeout(()=>e(n),t)})}static reject(t){return new e((e,n)=>n(t))}static resolve(t){return t instanceof e?t:new e(e=>e(t))}static withResolvers(){let t={oncancelled:null};return t.promise=new e((e,n)=>{t.resolve=e,t.reject=n},e=>{var n;(n=t.oncancelled)==null||n.call(t,e)}),t}};function nt(e,t){let n;return r=>{if(t.settled||(t.settled=!0,t.reason=r,e.reject(r),Promise.prototype.then.call(e.promise,void 0,e=>{if(e!==r)throw e})),!(!t.reason||!e.oncancelled))return n=new Promise(n=>{try{n(e.oncancelled(t.reason.cause))}catch(t){Promise.reject(new Ze(e.promise,t,`Unhandled exception in oncancelled callback.`))}}).catch(t=>{Promise.reject(new Ze(e.promise,t,`Unhandled rejection in oncancelled callback.`))}),e.oncancelled=null,n}}function rt(e,t){return n=>{if(!t.resolving){if(t.resolving=!0,n===e.promise){if(t.settled)return;t.settled=!0,e.reject(TypeError(`A promise cannot be resolved with itself.`));return}if(n!=null&&(typeof n==`object`||typeof n==`function`)){let r;try{r=n.then}catch(n){t.settled=!0,e.reject(n);return}if(Ye(r)){try{let r=n.cancel;if(Ye(r)){let i=e=>{Reflect.apply(r,n,[e])};t.reason?nt(Object.assign(Object.assign({},e),{oncancelled:i}),t)(t.reason):e.oncancelled=i}}catch{}let i={root:t.root,resolving:!1,get settled(){return this.root.settled},set settled(e){this.root.settled=e},get reason(){return this.root.reason}},a=it(e,i);try{Reflect.apply(r,n,[rt(e,i),a])}catch(e){a(e)}return}}t.settled||(t.settled=!0,e.resolve(n))}}}function it(e,t){return n=>{if(!t.resolving)if(t.resolving=!0,t.settled){try{if(n instanceof Xe&&t.reason instanceof Xe&&Object.is(n.cause,t.reason.cause))return}catch{}Promise.reject(new Ze(e.promise,n))}else t.settled=!0,e.reject(n)}}function at(e,t,n){let r=[];for(let i of t){let t;try{if(!Ye(i.then)||(t=i.cancel,!Ye(t)))continue}catch{continue}let a;try{a=Reflect.apply(t,i,[n])}catch(t){Promise.reject(new Ze(e,t,`Unhandled exception in cancel method.`));continue}a&&r.push((a instanceof Promise?a:Promise.resolve(a)).catch(t=>{Promise.reject(new Ze(e,t,`Unhandled rejection in cancel method.`))}))}return Promise.all(r)}function ot(e){return e}function st(e){throw e}function ct(e){try{if(e instanceof Error||typeof e!=`object`||e.toString!==Object.prototype.toString)return``+e}catch{}try{return JSON.stringify(e)}catch{}try{return Object.prototype.toString.call(e)}catch{}return``}function lt(e){let t=e[Qe]??{};return`promise`in t||Object.assign(t,ut()),e[Qe]??(t.resolve(),e[Qe]=t),t.promise}var ut=Promise.withResolvers;ut=ut&&typeof ut==`function`?ut.bind(Promise):function(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},d&&(window._wails=window._wails||{});var dt=y(g.Call),ft=y(g.CancelCall),pt=new Map,mt=0,ht=0;function gt(){let e;do e=p();while(pt.has(e));return e}function _t(e){let t=gt(),n=tt.withResolvers();pt.set(t,{resolve:n.resolve,reject:n.reject});let r=dt(mt,Object.assign({"call-id":t},e)),i=!0;r.then(e=>{i=!1,pt.delete(t),n.resolve(e)},e=>{i=!1,pt.delete(t),n.reject(e)});let a=()=>(pt.delete(t),ft(ht,{"call-id":t}).catch(e=>{console.error(`Error while requesting binding call cancellation:`,e)}));return n.oncancelled=()=>i?a():r.then(a),n.promise}function vt(e,...t){return _t({methodID:e,args:t})}var yt=`data-file-drop-target`,bt=`file-drop-target-active`,k=null,xt=0,St=1,Ct=2,wt=3,Tt=4,Et=5,Dt=6,Ot=7,kt=8,At=9,jt=10,Mt=11,Nt=12,Pt=13,Ft=14,It=15,Lt=16,Rt=17,zt=18,Bt=19,Vt=20,Ht=21,Ut=22,Wt=23,Gt=24,Kt=25,qt=26,Jt=27,Yt=28,Xt=29,Zt=30,Qt=31,$t=32,en=33,tn=34,nn=35,rn=36,an=37,on=38,sn=39,cn=40,ln=41,un=42,dn=43,fn=44,pn=45,mn=46,hn=47,gn=48,_n=49,vn=50,yn=51,bn=52;function xn(e){return e?e.closest(`[${yt}]`):null}function Sn(){return window.chrome?.webview?.postMessageWithAdditionalObjects==null?!1:window._wails?.flags?.enableFileDrop===!0}function Cn(e,t,n){window.chrome?.webview?.postMessageWithAdditionalObjects&&window.chrome.webview.postMessageWithAdditionalObjects(`file:drop:${e}:${t}`,n)}var wn=!1;function Tn(){wn=!1,k&&=(k.classList.remove(bt),null)}function En(){window._wails?.flags?.enableFileDrop!==!1&&(wn=!0)}function Dn(){Tn()}function On(e,t){if(!wn||window._wails?.flags?.enableFileDrop===!1)return;let n=xn(document.elementFromPoint(e,t));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),k=n):k=null}var A=Symbol(`caller`),kn=new class e{constructor(t=``){this[A]=y(g.Window,t);for(let t of Object.getOwnPropertyNames(e.prototype))t!==`constructor`&&typeof this[t]==`function`&&(this[t]=this[t].bind(this))}Get(t){return new e(t)}Position(){return this[A](xt)}Center(){return this[A](St)}Close(){return this[A](Ct)}DisableSizeConstraints(){return this[A](wt)}EnableSizeConstraints(){return this[A](Tt)}Focus(){return this[A](Et)}ForceReload(){return this[A](Dt)}Fullscreen(){return this[A](Ot)}GetScreen(){return this[A](kt)}GetZoom(){return this[A](At)}Height(){return this[A](jt)}Hide(){return this[A](Mt)}IsFocused(){return this[A](Nt)}IsFullscreen(){return this[A](Pt)}IsMaximised(){return this[A](Ft)}IsMinimised(){return this[A](It)}Maximise(){return this[A](Lt)}Minimise(){return this[A](Rt)}Name(){return this[A](zt)}OpenDevTools(){return this[A](Bt)}RelativePosition(){return this[A](Vt)}Reload(){return this[A](Ht)}Resizable(){return this[A](Ut)}Restore(){return this[A](Wt)}SetPosition(e,t){return this[A](Gt,{x:e,y:t})}SetAlwaysOnTop(e){return this[A](Kt,{alwaysOnTop:e})}SetBackgroundColour(e,t,n,r){return this[A](qt,{r:e,g:t,b:n,a:r})}SetFrameless(e){return this[A](Jt,{frameless:e})}SetFullscreenButtonEnabled(e){return this[A](Yt,{enabled:e})}SetMaxSize(e,t){return this[A](Xt,{width:e,height:t})}SetMinSize(e,t){return this[A](Zt,{width:e,height:t})}SetRelativePosition(e,t){return this[A](Qt,{x:e,y:t})}SetResizable(e){return this[A]($t,{resizable:e})}SetSize(e,t){return this[A](en,{width:e,height:t})}SetTitle(e){return this[A](tn,{title:e})}SetZoom(e){return this[A](nn,{zoom:e})}Show(){return this[A](rn)}Size(){return this[A](an)}ToggleFullscreen(){return this[A](on)}ToggleMaximise(){return this[A](sn)}ToggleFrameless(){return this[A](cn)}UnFullscreen(){return this[A](ln)}UnMaximise(){return this[A](un)}UnMinimise(){return this[A](dn)}Width(){return this[A](fn)}Zoom(){return this[A](pn)}ZoomIn(){return this[A](mn)}ZoomOut(){return this[A](hn)}ZoomReset(){return this[A](gn)}HandlePlatformFileDrop(e,t,n){if(window._wails?.flags?.enableFileDrop===!1)return;let r=xn(document.elementFromPoint(t,n));if(!r)return;let i={id:r.id,classList:Array.from(r.classList),attributes:{}};for(let e=0;e{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}t++;let n=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==n&&k.classList.remove(bt),n?(n.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=n):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragover`,e=>{if(!e.dataTransfer?.types.includes(`Files`))return;if(e.preventDefault(),window._wails?.flags?.enableFileDrop===!1){e.dataTransfer.dropEffect=`none`;return}let t=xn(document.elementFromPoint(e.clientX,e.clientY));k&&k!==t&&k.classList.remove(bt),t?(t.classList.contains(bt)||t.classList.add(bt),e.dataTransfer.dropEffect=`copy`,k=t):(e.dataTransfer.dropEffect=`none`,k=null)},!1),e.addEventListener(`dragleave`,e=>{e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&e.relatedTarget!==null&&(t--,(t===0||k&&!k.contains(e.relatedTarget))&&(k&&=(k.classList.remove(bt),null),t=0)))},!1),e.addEventListener(`drop`,e=>{if(e.dataTransfer?.types.includes(`Files`)&&(e.preventDefault(),window._wails?.flags?.enableFileDrop!==!1&&(t=0,k&&=(k.classList.remove(bt),null),Sn()))){let t=[];if(e.dataTransfer.items){for(let n of e.dataTransfer.items)if(n.kind===`file`){let e=n.getAsFile();e&&t.push(e)}}else if(e.dataTransfer.files)for(let n of e.dataTransfer.files)t.push(n);t.length>0&&Cn(e.clientX,e.clientY,t)}},!1)}typeof window<`u`&&typeof document<`u`&&An(),d&&(window._wails=window._wails||{}),d&&(window._wails.invoke=C,window._wails.clientId=_),d&&(window._wails.handlePlatformFileDrop=kn.HandlePlatformFileDrop.bind(kn)),d&&(window._wails.handleDragEnter=En,window._wails.handleDragLeave=Dn,window._wails.handleDragOver=On),d&&C(`wails:runtime:ready`);function jn(e){return fetch(e,{method:`HEAD`}).then(t=>{if(t.ok&&(t.headers.get(`content-type`)||``).toLowerCase().includes(`javascript`)){let t=document.createElement(`script`);t.src=e,document.head.appendChild(t)}}).catch(()=>{})}d&&jn(`/wails/custom.js`);function Mn(){return vt(1211788486)}function Nn(){return vt(853311305)}function Pn(e){return vt(465937298,e)}function Fn(e){return vt(2463093517,e)}var In=class{getRepoRoot(){return Nn()}setRepoRoot(e){return Fn(e)}async getModules(){return await Mn()??[]}runAction(e){return Pn(e)}};function Ln(e){switch(e){case`repo`:case`branch`:case`worktree`:return`source`;case`issue`:case`pr`:return`collaboration`;case`tag`:return`release`;default:return`all`}}function Rn(e,t){return t===`all`?e:e.filter(e=>Ln(e.id)===t)}var zn=`fastgit.desktop.prefs.v1`;function Bn(){return typeof window<`u`&&window.localStorage!==void 0}function Vn(){if(!Bn())return{};try{let e=window.localStorage.getItem(zn);if(!e)return{};let t=JSON.parse(e);if(!t||typeof t!=`object`)return{};let n=Array.isArray(t.repoNamespaces)?t.repoNamespaces.map(e=>String(e).trim()).filter(Boolean):void 0,r=typeof t.selectedRepoPath==`string`?t.selectedRepoPath.trim():void 0;return{...t,repoNamespaces:n,selectedRepoPath:r}}catch{return{}}}function Hn(e){Bn()&&window.localStorage.setItem(zn,JSON.stringify(e))}function Un(e){return`fastgit.desktop.tabs:${e}`}function Wn(e){if(!Bn()||!e)return null;try{let t=window.localStorage.getItem(Un(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!=`object`?null:{openedModuleIds:Array.isArray(n.openedModuleIds)?n.openedModuleIds.map(e=>String(e)):[],selectedModuleId:n.selectedModuleId?String(n.selectedModuleId):null}}catch{return null}}function Gn(e,t){!Bn()||!e||window.localStorage.setItem(Un(e),JSON.stringify(t))}var Kn=(0,l.createContext)(null);function qn(){let e=(0,l.useContext)(Kn);if(!e)throw Error(`useAppContext must be used within AppProvider`);return e}var Jn=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),j=e(((e,t)=>{t.exports=Jn()}))(),Yn={title:`Welcome`,command:`-`,exitCode:0,body:`请选择左侧模块并执行动作。`},Xn=new In,Zn=/^#(\d+)\s+\[([^\]]+)\]\s+(.+)$/,Qn=/^(.{2})\s+(.+)$/;function $n(e){let t=e.split(/\r?\n/).map(e=>e.trimEnd()),n=[];return t.forEach((e,t)=>{let r=e.trim();if(!r)return;let i=r.startsWith(`* `),a=i?r.slice(2).trim():r.replace(/^-+\s+/,``);a&&n.push({id:`${a}-${t}`,primary:a,active:i,badge:i?`current`:void 0})}),n}function er(e){return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map((e,t)=>({id:`${e}-${t}`,primary:e}))}function tr(e){return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).flatMap((e,t)=>{let n=e.match(Zn);return n?[{id:`${n[1]}-${t}`,primary:`#${n[1]} ${n[3]}`,badge:n[2]}]:[]})}function nr(e){let t=e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(t.length===0)return[];let n=t[0].match(/^#(\d+)\s+\[([^\]]+)\]$/);if(!n)return[];let r=t[1]??`PR #${n[1]}`,i=t.find(e=>/^https?:\/\//.test(e));return[{id:`pr-${n[1]}`,primary:`#${n[1]} ${r}`,badge:n[2],secondary:i,url:i}]}function rr(e){return e.split(/\r?\n/).map(e=>e.trimEnd()).filter(Boolean).flatMap((e,t)=>{let n=e.match(Qn);if(!n)return[];let r=n[1].replace(/\s/g,`·`);return[{id:`repo-${t}`,primary:n[2],badge:r}]})}function ir(e,t){let n=e.split(/\r?\n/),r=[],i=``,a=``,o=``,s=()=>{if(!i)return;let e=[a,o?o.slice(0,8):``].filter(Boolean).join(` · `);r.push({id:`${i}-${r.length}`,primary:i,secondary:e||void 0,active:i===t,badge:i===t?`current`:void 0})};return n.forEach(e=>{let t=e.trim();if(t){if(t.startsWith(`worktree `)){s(),i=t.slice(9).trim(),a=``,o=``;return}if(t.startsWith(`branch `)){a=t.slice(7).trim().replace(`refs/heads/`,``);return}t.startsWith(`HEAD `)&&(o=t.slice(5).trim())}}),s(),r}function ar(e,t,n){let r=t.trim();switch(e){case`branch_list`:{let e=$n(r);return{items:e,emptyHint:e.length===0?`暂无分支`:void 0}}case`tag_list`:{let e=er(r);return{items:e,emptyHint:r===`no tags`||e.length===0?`暂无标签`:void 0}}case`worktree_list`:{let e=ir(r,n);return{items:e,emptyHint:r===`no worktree`||e.length===0?`暂无 worktree`:void 0}}case`issue_list`:{let e=tr(r);return{items:e,emptyHint:r===`no open issues`||e.length===0?`暂无 open issues`:void 0}}case`pr_status`:return{items:nr(r),emptyHint:r===`no open PR for current branch`?`当前分支暂无 open PR`:void 0};case`repo_status`:return{items:rr(r),emptyHint:r===`working tree clean`?`工作区干净`:void 0};default:return{}}}function or(e){return e.trim()}function sr(e,...t){let n=new Set,r=[],i=e=>{let t=or(e);!t||n.has(t)||(n.add(t),r.push(t))};return e.forEach(i),t.forEach(i),r}function cr(e,t){let n=or(t);return n?[n,...e.filter(e=>or(e)!==n)]:e}function lr(e,t){return t?e.includes(t)?e:[...e,t]:e}function ur(e){return Math.max(220,Math.min(420,e))}function dr(e,t,n){let r=Rn(e,t);return n[n.length-1]??r[0]?.id??e[0]?.id??null}function fr(){let e=Vn(),t=or(e.selectedRepoPath??``);return{repoPath:t,repoNamespaces:cr(sr(e.repoNamespaces??[],t),t),repoStatus:`加载中...`,modules:[],selectedModuleId:null,openedModuleIds:[],selectedMenu:e.selectedMenu??`source`,modulePaneWidth:ur(e.modulePaneWidth??280),modulePaneCollapsed:e.modulePaneCollapsed??!1,busy:!1,output:Yn}}function pr({children:e}){let[t,n]=(0,l.useState)(fr),r=(0,l.useCallback)(e=>{n(t=>({...t,busy:e}))},[]),i=(0,l.useCallback)(async e=>{let t=or(e??``);r(!0);try{t&&await Xn.setRepoRoot(t);let[e,r]=await Promise.all([Xn.getRepoRoot(),Xn.getModules()]),i=or(e);n(e=>{let n=Wn(i),a=Rn(r,e.selectedMenu),o=n?.selectedModuleId??e.selectedModuleId,s=o&&a.some(e=>e.id===o)?o:a[0]?.id??r[0]?.id??null,c=new Set(r.map(e=>e.id)),l=(n?.openedModuleIds??e.openedModuleIds).filter(e=>c.has(e));return{...e,repoPath:i,repoNamespaces:cr(sr(e.repoNamespaces,t,i),i),repoStatus:i?`当前项目: ${i}`:`请先选择项目命名空间`,modules:r,selectedModuleId:s,openedModuleIds:lr(l,s)}})}catch(e){let r=String(e);n(e=>({...e,output:{title:t?`Set Project`:`Load Error`,command:t?`SetProjectRoot`:`bootstrap`,exitCode:1,body:r},repoStatus:t?`项目切换失败: ${r}`:`加载失败: ${r}`}))}finally{r(!1)}},[r]),a=(0,l.useCallback)(e=>{n(t=>({...t,selectedModuleId:e,openedModuleIds:lr(t.openedModuleIds,e)}))},[]),o=(0,l.useCallback)(e=>{n(t=>{if(t.selectedMenu===e)return{...t,modulePaneCollapsed:!t.modulePaneCollapsed};let n=Rn(t.modules,e),r=t.selectedModuleId&&n.some(e=>e.id===t.selectedModuleId)?t.selectedModuleId:n[0]?.id??t.modules[0]?.id??null;return{...t,selectedMenu:e,selectedModuleId:r,openedModuleIds:lr(t.openedModuleIds,r),modulePaneCollapsed:!1}})},[]),s=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.filter(t=>t!==e);if(t.selectedModuleId!==e)return{...t,openedModuleIds:n};let r=dr(t.modules,t.selectedMenu,n);return{...t,openedModuleIds:n,selectedModuleId:r}})},[]),c=(0,l.useCallback)(e=>{n(t=>t.openedModuleIds.includes(e)?{...t,openedModuleIds:[e],selectedModuleId:e}:t)},[]),u=(0,l.useCallback)(e=>{n(t=>{let n=t.openedModuleIds.indexOf(e);if(n<0)return t;let r=t.openedModuleIds.slice(0,n+1),i=t.selectedModuleId&&r.includes(t.selectedModuleId)?t.selectedModuleId:dr(t.modules,t.selectedMenu,r);return{...t,openedModuleIds:r,selectedModuleId:i}})},[]),d=(0,l.useCallback)((e,t)=>{e!==t&&n(n=>{let r=n.openedModuleIds.indexOf(e),i=n.openedModuleIds.indexOf(t);if(r<0||i<0)return n;let a=[...n.openedModuleIds];a.splice(r,1);let o=a.indexOf(t);return a.splice(o,0,e),{...n,openedModuleIds:a}})},[]),f=(0,l.useCallback)(()=>{n(e=>{let t=Rn(e.modules,e.selectedMenu).find(t=>!e.openedModuleIds.includes(t.id))??e.modules[0];return t?{...e,selectedModuleId:t.id,openedModuleIds:lr(e.openedModuleIds,t.id),modulePaneCollapsed:!1}:e})},[]),p=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneWidth:ur(e)}))},[]),m=(0,l.useCallback)(e=>{n(t=>({...t,modulePaneCollapsed:e}))},[]),h=(0,l.useCallback)(async e=>{let r=or(e);!r||r===t.repoPath||(n(e=>({...e,repoNamespaces:cr(sr(e.repoNamespaces,r),r)})),await i(r))},[i,t.repoPath]),g=(0,l.useCallback)(async e=>{let t=or(e);t&&n(e=>({...e,repoNamespaces:sr(e.repoNamespaces,t),repoStatus:t===e.repoPath?`当前项目: ${e.repoPath}`:`已添加项目命名空间: ${t}`}))},[]),_=(0,l.useCallback)(async e=>{let r=or(e);if(!r)return;let a=t.repoNamespaces.filter(e=>e!==r);if(a.length!==t.repoNamespaces.length){if(t.repoPath===r){if(a.length===0)return;n(e=>({...e,repoNamespaces:a})),await i(a[0]);return}n(e=>({...e,repoNamespaces:a}))}},[i,t.repoNamespaces,t.repoPath]),v=(0,l.useCallback)(async(e,i,a)=>{if(!t.repoPath){n(t=>({...t,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:`请先选择项目命名空间。`}}));return}r(!0);try{let r=await Xn.runAction({moduleID:e.id,actionID:i.id,values:a}),o=r.exitCode===0?ar(i.id,r.output||``,t.repoPath):{};n(t=>({...t,output:{title:`${e.title} / ${i.title}`,command:r.command,exitCode:r.exitCode,body:r.output||`(no output)`,items:o.items,emptyHint:o.emptyHint}}))}catch(t){n(n=>({...n,output:{title:`${e.title} / ${i.title}`,command:`RunAction`,exitCode:1,body:String(t)}}))}finally{r(!1)}},[r,t.repoPath]),y=(0,l.useMemo)(()=>t.selectedModuleId?t.modules.find(e=>e.id===t.selectedModuleId)??null:null,[t.modules,t.selectedModuleId]),b=(0,l.useMemo)(()=>Rn(t.modules,t.selectedMenu),[t.modules,t.selectedMenu]);(0,l.useEffect)(()=>{Hn({selectedMenu:t.selectedMenu,modulePaneWidth:t.modulePaneWidth,modulePaneCollapsed:t.modulePaneCollapsed,repoNamespaces:t.repoNamespaces,selectedRepoPath:t.repoPath})},[t.modulePaneCollapsed,t.modulePaneWidth,t.repoNamespaces,t.repoPath,t.selectedMenu]),(0,l.useEffect)(()=>{if(!t.repoPath)return;let e=new Set(t.modules.map(e=>e.id)),n=t.openedModuleIds.filter(t=>e.has(t)),r=t.selectedModuleId&&e.has(t.selectedModuleId)?t.selectedModuleId:null;Gn(t.repoPath,{openedModuleIds:n,selectedModuleId:r})},[t.modules,t.openedModuleIds,t.repoPath,t.selectedModuleId]);let x=(0,l.useMemo)(()=>({state:t,selectedModule:y,filteredModules:b,setSelectedModule:a,closeModuleTab:s,closeOtherModuleTabs:c,closeTabsToRight:u,reorderModuleTabs:d,addModuleTab:f,setSelectedMenu:o,setModulePaneWidth:p,setModulePaneCollapsed:m,refresh:i,addRepo:g,switchRepo:h,removeRepo:_,runAction:v}),[t,y,b,a,s,c,u,d,f,o,p,m,i,g,h,_,v]);return(0,j.jsx)(Kn.Provider,{value:x,children:e})}var mr=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),hr=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),gr=e=>{let t=hr(e);return t.charAt(0).toUpperCase()+t.slice(1)},_r=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),vr=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},yr={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},br=(0,l.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,l.createElement)(`svg`,{ref:c,...yr,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:_r(`lucide`,i),...!a&&!vr(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,l.createElement)(e,t)),...Array.isArray(a)?a:[a]])),xr=(e,t)=>{let n=(0,l.forwardRef)(({className:n,...r},i)=>(0,l.createElement)(br,{ref:i,iconNode:t,className:_r(`lucide-${mr(gr(e))}`,`lucide-${e}`,n),...r}));return n.displayName=gr(e),n},Sr=xr(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),Cr=xr(`git-fork`,[[`circle`,{cx:`12`,cy:`18`,r:`3`,key:`1mpf1b`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`path`,{d:`M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9`,key:`1uq4wg`}],[`path`,{d:`M12 12v3`,key:`158kv8`}]]),wr=xr(`layout-grid`,[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]),Tr=xr(`panel-right-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m8 9 3 3-3 3`,key:`12hl5m`}]]),Er=xr(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),Dr=xr(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),Or=xr(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]),kr=xr(`tags`,[[`path`,{d:`M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z`,key:`16rjxf`}],[`path`,{d:`M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193`,key:`178nd4`}],[`circle`,{cx:`10.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`12ikhr`}]]),Ar=xr(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function jr(...e){return e.filter(Boolean).join(` `)}function Mr({variant:e=`default`,className:t,children:n,...r}){return(0,j.jsx)(`button`,{className:jr(`ui-button`,`ui-button--${e}`,t),...r,children:n})}var Nr={source:`源码与仓库`,collaboration:`协作与评审`,release:`发布与版本`,all:`全部模块`};function Pr(){let{state:e,filteredModules:t,setSelectedModule:n,setModulePaneCollapsed:r,refresh:i}=qn();return(0,j.jsxs)(`aside`,{className:`module-pane`,children:[(0,j.jsxs)(`div`,{className:`module-pane__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:Nr[e.selectedMenu]??`模块`}),(0,j.jsxs)(`p`,{children:[t.length,` 个模块`]})]}),(0,j.jsxs)(`div`,{className:`module-pane__actions`,children:[(0,j.jsx)(Mr,{variant:`ghost`,onClick:()=>void i(),children:`刷新`}),(0,j.jsx)(Mr,{variant:`ghost`,className:`module-pane__collapse`,onClick:()=>r(!0),children:(0,j.jsx)(Tr,{size:14})})]})]}),(0,j.jsxs)(`div`,{className:`module-pane__list`,children:[t.map(t=>(0,j.jsxs)(`button`,{className:jr(`module-pane__item`,e.selectedModuleId===t.id&&`module-pane__item--active`),onClick:()=>n(t.id),type:`button`,children:[(0,j.jsx)(`strong`,{children:t.title}),(0,j.jsx)(`span`,{children:t.description})]},t.id)),t.length===0&&(0,j.jsx)(`div`,{className:`module-pane__empty`,children:`当前菜单下暂无模块`})]})]})}var Fr=[{id:`source`,label:`源码`,icon:Cr},{id:`collaboration`,label:`协作`,icon:Sr},{id:`release`,label:`发布`,icon:kr},{id:`all`,label:`全部`,icon:wr}];function Ir(){let{state:e,setSelectedMenu:t,refresh:n}=qn();return(0,j.jsxs)(`aside`,{className:`sidebar-menu-panel`,children:[(0,j.jsx)(`div`,{className:`sidebar-menu-panel__group`,children:Fr.map(n=>{let r=n.icon;return(0,j.jsxs)(`button`,{className:jr(`sidebar-menu-panel__item`,e.selectedMenu===n.id&&`sidebar-menu-panel__item--active`),onClick:()=>t(n.id),title:n.label,type:`button`,children:[(0,j.jsx)(r,{size:18,strokeWidth:2}),(0,j.jsx)(`span`,{children:n.label})]},n.id)})}),(0,j.jsxs)(`div`,{className:`sidebar-menu-panel__footer`,children:[(0,j.jsx)(Mr,{variant:`ghost`,className:`sidebar-menu-panel__refresh`,onClick:()=>void n(),children:(0,j.jsx)(Dr,{size:14})}),(0,j.jsx)(`span`,{children:e.modulePaneCollapsed?`已收起`:e.busy?`运行中`:`空闲`})]})]})}function Lr({className:e,...t}){return(0,j.jsx)(`input`,{className:jr(`ui-input`,e),...t})}function Rr(e){return e.endsWith(`_list`)||e.endsWith(`_status`)?`列表`:e.endsWith(`_view`)?`详情`:e.endsWith(`_create`)||e.endsWith(`_publish`)?`新增`:e.endsWith(`_delete`)||e.endsWith(`_remove`)?`删除`:e.endsWith(`_checkout`)||e.endsWith(`_switch`)?`切换`:e.endsWith(`_pull`)||e.endsWith(`_push`)||e.endsWith(`_sync`)||e.endsWith(`_merge`)?`执行`:`操作`}function zr(e){return(e.id.endsWith(`_list`)||e.id.endsWith(`_status`))&&(e.fields?.length??0)===0}function Br(e){return e.find(zr)??e[0]??null}function Vr(e){let t={};for(let n of e?.fields??[])t[n.key]=n.default||``;return t}function Hr(e){return e?(e.fields?.length??0)>0?`填写并执行`:`立即执行`:`执行`}function Ur(){let{selectedModule:e,runAction:t}=qn(),n=e?.actions??[],[r,i]=(0,l.useState)(null),[a,o]=(0,l.useState)(!1),[s,c]=(0,l.useState)({}),u=(0,l.useRef)(``),d=n.find(e=>e.id===r)??Br(n);if((0,l.useEffect)(()=>{let e=Br(n);i(e?.id??null),o(!1),c(Vr(e)),u.current=``},[e?.id,n]),(0,l.useEffect)(()=>{if(!e||!d||!zr(d))return;let n=`${e.id}:${d.id}`;u.current!==n&&(u.current=n,t(e,d,{}))},[d,t,e]),!e)return(0,j.jsx)(`section`,{className:`module-actions`,children:(0,j.jsx)(`div`,{className:`empty-state`,children:`未找到模块,请刷新。`})});if(n.length===0||!d)return(0,j.jsxs)(`section`,{className:`module-actions`,children:[(0,j.jsxs)(`header`,{className:`module-actions__header`,children:[(0,j.jsx)(`h2`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsx)(`div`,{className:`empty-state`,children:`该模块暂时没有可执行动作。`})]});let f=e=>{i(e.id),c(Vr(e)),o(!0)},p=()=>{o(!1),c(Vr(d))},m=e=>{i(e.id),!zr(e)&&(e.fields?.length??0)>0&&f(e)},h=(n,r)=>{e&&t(e,n,r)};return(0,j.jsxs)(`section`,{className:`module-actions`,children:[(0,j.jsxs)(`header`,{className:`module-actions__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:e.title}),(0,j.jsx)(`p`,{children:e.description})]}),(0,j.jsxs)(`div`,{className:`module-actions__summary`,children:[(0,j.jsxs)(`span`,{children:[n.length,` 个功能`]}),(0,j.jsx)(`strong`,{children:Rr(d.id)})]})]}),(0,j.jsx)(`div`,{className:`module-actions__tabs`,role:`tablist`,"aria-label":`${e.title} actions`,children:n.map(e=>{let t=d.id===e.id;return(0,j.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":t,className:t?`module-actions__tab module-actions__tab--active`:`module-actions__tab`,onClick:()=>m(e),children:[(0,j.jsx)(`span`,{children:e.title}),(0,j.jsx)(`small`,{children:Rr(e.id)})]},e.id)})}),(0,j.jsxs)(`section`,{className:`module-toolbar`,children:[(0,j.jsxs)(`div`,{className:`module-toolbar__meta`,children:[(0,j.jsx)(`h3`,{children:d.title}),(0,j.jsx)(`p`,{children:d.description})]}),(0,j.jsxs)(`div`,{className:`module-toolbar__actions`,children:[(d.fields?.length??0)>0?(0,j.jsxs)(`span`,{className:`module-toolbar__hint`,children:[d.fields?.length,` 个参数`]}):(0,j.jsx)(`span`,{className:`module-toolbar__hint`,children:`无额外参数`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:()=>h(d,{}),disabled:(d.fields?.length??0)>0,children:`刷新`}),(0,j.jsx)(Mr,{variant:`primary`,onClick:()=>{if((d.fields?.length??0)>0){f(d);return}h(d,{})},children:Hr(d)})]})]}),a?(0,j.jsx)(`div`,{className:`action-dialog__backdrop`,onClick:p,children:(0,j.jsxs)(`section`,{className:`action-dialog`,role:`dialog`,"aria-modal":`true`,"aria-label":d.title,onClick:e=>e.stopPropagation(),children:[(0,j.jsxs)(`header`,{className:`action-dialog__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h3`,{children:d.title}),(0,j.jsx)(`p`,{children:d.description})]}),(0,j.jsx)(`button`,{type:`button`,className:`action-dialog__close`,onClick:p,"aria-label":`close dialog`,children:`×`})]}),(0,j.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),h(d,s),p()},className:`action-dialog__form`,children:[(0,j.jsx)(`div`,{className:`action-dialog__fields`,children:(d.fields??[]).map(e=>(0,j.jsxs)(`label`,{className:`action-field`,children:[(0,j.jsx)(`span`,{children:e.label}),e.key.toLowerCase().includes(`body`)?(0,j.jsx)(`textarea`,{className:`ui-textarea`,name:e.key,placeholder:e.placeholder||e.label,value:s[e.key]??``,required:!!e.required,onChange:t=>c(n=>({...n,[e.key]:t.target.value}))}):(0,j.jsx)(Lr,{name:e.key,placeholder:e.placeholder||e.label,value:s[e.key]??``,required:!!e.required,onChange:t=>c(n=>({...n,[e.key]:t.target.value}))})]},e.key))}),(0,j.jsxs)(`footer`,{className:`action-dialog__footer`,children:[(0,j.jsx)(Mr,{type:`button`,variant:`ghost`,onClick:p,children:`取消`}),(0,j.jsx)(Mr,{type:`submit`,variant:`primary`,children:`执行`})]})]})]})}):null]})}function Wr(){let{state:e}=qn(),t=!!(e.output.items&&e.output.items.length>0);return(0,j.jsxs)(`section`,{className:`output-panel`,children:[(0,j.jsxs)(`header`,{className:`output-panel__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{children:e.output.title}),(0,j.jsx)(`p`,{children:e.output.command})]}),(0,j.jsxs)(`span`,{className:e.output.exitCode===0?`status-pill status-pill--ok`:`status-pill status-pill--error`,children:[`exit `,e.output.exitCode]})]}),t?(0,j.jsx)(`ul`,{className:`output-list`,role:`list`,children:e.output.items?.map(e=>(0,j.jsxs)(`li`,{className:e.active?`output-list__item output-list__item--active`:`output-list__item`,children:[(0,j.jsxs)(`div`,{className:`output-list__main`,children:[(0,j.jsx)(`p`,{children:e.primary}),e.secondary?e.url?(0,j.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,children:e.secondary}):(0,j.jsx)(`span`,{children:e.secondary}):null]}),e.badge?(0,j.jsx)(`span`,{className:`output-list__badge`,children:e.badge}):null]},e.id))}):e.output.emptyHint?(0,j.jsx)(`div`,{className:`output-empty`,children:e.output.emptyHint}):(0,j.jsx)(`pre`,{className:`output-panel__body`,children:e.output.body})]})}var Gr=`data:image/svg+xml,%3csvg%20width='512'%20height='512'%20viewBox='0%200%20512%20512'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20role='img'%20aria-label='fastgit%20logo%20icon'%3e%3cdefs%3e%3clinearGradient%20id='bg'%20x1='72'%20y1='56'%20x2='448'%20y2='456'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%233C679F'/%3e%3cstop%20offset='1'%20stop-color='%231F2D44'/%3e%3c/linearGradient%3e%3clinearGradient%20id='stroke'%20x1='136'%20y1='152'%20x2='376'%20y2='360'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F0F3F8'/%3e%3cstop%20offset='1'%20stop-color='%23D6DFEF'/%3e%3c/linearGradient%3e%3c/defs%3e%3crect%20x='56'%20y='56'%20width='400'%20height='400'%20rx='96'%20fill='url(%23bg)'/%3e%3cpath%20d='M168%20336V208C168%20194.745%20178.745%20184%20192%20184H320C333.255%20184%20344%20194.745%20344%20208V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M256%20184V256'%20stroke='url(%23stroke)'%20stroke-width='28'%20stroke-linecap='round'/%3e%3ccircle%20cx='168'%20cy='336'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='344'%20cy='256'%20r='30'%20fill='%23E8EDF4'/%3e%3ccircle%20cx='256'%20cy='184'%20r='30'%20fill='%23E8EDF4'/%3e%3c/svg%3e`;function Kr(){let{state:e,addRepo:t,switchRepo:n,removeRepo:r}=qn(),[i,a]=(0,l.useState)(``),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(``);(0,l.useEffect)(()=>{s(e.repoPath)},[e.repoPath]);let d=i.trim().length>0,f=(0,l.useMemo)(()=>{let t=c.trim().toLowerCase();return t?e.repoNamespaces.filter(e=>e.toLowerCase().includes(t)):e.repoNamespaces},[c,e.repoNamespaces]),p=async()=>{let e=i.trim();e&&(await t(e),a(``))},m=async()=>{let e=i.trim();e&&(await n(e),a(``))};return(0,j.jsxs)(`section`,{className:`repo-settings`,"aria-label":`Project settings`,children:[(0,j.jsxs)(`header`,{className:`repo-settings__header`,children:[(0,j.jsx)(`h3`,{children:`Settings · Projects`}),(0,j.jsxs)(`p`,{children:[e.repoNamespaces.length,` 个项目`]})]}),(0,j.jsxs)(`div`,{className:`repo-settings__current`,children:[(0,j.jsx)(`span`,{children:`当前项目`}),(0,j.jsx)(`strong`,{children:e.repoPath||`未选择`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row workspace-panel__row--add`,children:[(0,j.jsx)(Lr,{value:i,onChange:e=>a(e.target.value),placeholder:`/path/to/project (git repository)`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:()=>void p(),disabled:!d,children:`添加`}),(0,j.jsx)(Mr,{variant:`primary`,onClick:()=>void m(),disabled:!d,children:`添加并切换`})]}),(0,j.jsxs)(`div`,{className:`workspace-panel__row`,children:[(0,j.jsx)(Lr,{value:c,onChange:e=>u(e.target.value),placeholder:`筛选项目...`}),(0,j.jsxs)(`span`,{className:`repo-settings__count`,children:[f.length,` / `,e.repoNamespaces.length]})]}),(0,j.jsxs)(`div`,{className:`repo-list`,role:`list`,children:[f.map(t=>{let i=t===e.repoPath;return(0,j.jsxs)(`article`,{className:[`repo-item`,i?`repo-item--current`:``,t===o?`repo-item--selected`:``].filter(Boolean).join(` `),onClick:()=>s(t),role:`button`,tabIndex:0,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),s(t))},children:[(0,j.jsxs)(`div`,{className:`repo-item__meta`,children:[(0,j.jsx)(`strong`,{children:t.split(/[\\/]/).filter(Boolean).pop()||t}),(0,j.jsx)(`span`,{children:t})]}),(0,j.jsxs)(`div`,{className:`repo-item__actions`,children:[(0,j.jsx)(`span`,{className:i?`repo-badge repo-badge--active`:`repo-badge`,children:i?`当前`:`可切换`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),n(t)},disabled:i,children:`切换`}),(0,j.jsx)(Mr,{variant:`ghost`,onClick:e=>{e.stopPropagation(),r(t)},disabled:i,children:`移除`})]})]},t)}),f.length===0&&(0,j.jsx)(`div`,{className:`repo-list__empty`,children:`没有匹配的项目`})]}),(0,j.jsx)(`p`,{className:`repo-settings__status`,children:e.repoStatus})]})}function qr(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??`workspace`}function Jr(e){return e.split(/[\\/]/).filter(Boolean)}function Yr(e){let t=new Map;for(let n of e){let r=Jr(n);if(r.length===0){t.set(n,n);continue}let i=r[r.length-1];for(let t=1;t<=r.length;t+=1){let a=r.slice(-t).join(`/`);if(!e.some(e=>e===n?!1:Jr(e).slice(-t).join(`/`)===a)){i=a;break}i=a}t.set(n,i)}return t}function Xr(){let{state:e,addModuleTab:t,closeModuleTab:n,closeOtherModuleTabs:r,closeTabsToRight:i,reorderModuleTabs:a,setSelectedModule:o,switchRepo:s}=qn(),c=(0,l.useMemo)(()=>Yr(e.repoNamespaces),[e.repoNamespaces]),u=e.repoPath?c.get(e.repoPath)??qr(e.repoPath):`workspace`,[d,f]=(0,l.useState)(null),[p,m]=(0,l.useState)(null),[h,g]=(0,l.useState)(null),[_,v]=(0,l.useState)(!1),y=(0,l.useRef)(null),b=(0,l.useRef)(null),x=e.openedModuleIds.map(t=>e.modules.find(e=>e.id===t)).filter(e=>e!==void 0),ee=x.length,S=(0,l.useMemo)(()=>h?x.find(e=>e.id===h.moduleId)??null:null,[h,x]),C=S?x.findIndex(e=>e.id===S.id):-1,te=ee>1,ne=C>=0&&C{let e=e=>{if(g(null),!_)return;let t=e.target;t&&(b.current?.contains(t)||y.current?.contains(t)||v(!1))},t=e=>{e.key===`Escape`&&(g(null),v(!1))};return window.addEventListener(`pointerdown`,e),window.addEventListener(`keydown`,t),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,t)}},[_]);let re=(e,t)=>{f(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t)},w=(e,t)=>{e.preventDefault(),d&&d!==t&&m(t)},ie=(e,t)=>{e.preventDefault(),!(!d||d===t)&&(a(d,t),m(null),f(null))},ae=(e,t)=>{e.preventDefault(),e.stopPropagation(),g({x:e.clientX,y:e.clientY,moduleId:t})},oe=e=>{e(),g(null)};return(0,j.jsxs)(`header`,{className:`tabs-header app-drag-region`,children:[(0,j.jsxs)(`div`,{className:`tabs-repo app-no-drag-region`,children:[(0,j.jsx)(`img`,{className:`tabs-repo__logo`,src:Gr,alt:`fastgit logo`}),(0,j.jsx)(`span`,{children:u})]}),(0,j.jsx)(`div`,{className:`tabs-track app-no-drag-region`,children:x.map(t=>{let r=e.selectedModuleId===t.id;return(0,j.jsxs)(`div`,{className:[`tabs-track__item`,r?`tabs-track__item--active`:``,p===t.id?`tabs-track__item--drag-over`:``].filter(Boolean).join(` `),onClick:()=>o(t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o(t.id))},onContextMenu:e=>ae(e,t.id),draggable:ee>1,onDragStart:e=>re(e,t.id),onDragOver:e=>w(e,t.id),onDrop:e=>ie(e,t.id),onDragEnd:()=>{f(null),m(null)},role:`button`,tabIndex:0,"aria-label":`switch to ${t.title}`,"aria-pressed":r,children:[(0,j.jsx)(`span`,{children:t.title}),(0,j.jsx)(`button`,{className:`tabs-track__close`,onClick:e=>{e.stopPropagation(),n(t.id)},onContextMenu:e=>ae(e,t.id),type:`button`,"aria-label":`close ${t.title}`,children:(0,j.jsx)(Ar,{size:13})})]},t.id)})}),(0,j.jsxs)(`div`,{className:`tabs-actions app-no-drag-region`,children:[(0,j.jsxs)(`select`,{className:`ui-input tabs-project-select`,value:e.repoPath,title:e.repoPath||`未选择项目`,onChange:e=>void s(e.target.value),children:[(0,j.jsx)(`option`,{value:``,children:e.repoNamespaces.length===0?`未配置项目`:`选择项目`}),e.repoNamespaces.map(e=>(0,j.jsx)(`option`,{value:e,children:c.get(e)??qr(e)},e))]}),(0,j.jsx)(`button`,{ref:b,className:`tabs-settings`,onClick:()=>v(e=>!e),type:`button`,"aria-label":`open project settings`,children:(0,j.jsx)(Or,{size:14})}),(0,j.jsx)(`button`,{className:`tabs-add`,onClick:t,type:`button`,"aria-label":`new tab`,children:(0,j.jsx)(Er,{size:14})})]}),_&&(0,j.jsx)(`div`,{ref:y,className:`tabs-settings-panel app-no-drag-region`,onPointerDown:e=>e.stopPropagation(),children:(0,j.jsx)(Kr,{})}),h&&S&&(0,j.jsxs)(`div`,{className:`tabs-menu app-no-drag-region`,style:{left:`${h.x}px`,top:`${h.y}px`},onPointerDown:e=>e.stopPropagation(),children:[(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>n(S.id)),disabled:!te,children:`关闭标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>r(S.id)),disabled:!te,children:`关闭其他标签`}),(0,j.jsx)(`button`,{type:`button`,className:`tabs-menu__item`,onClick:()=>oe(()=>i(S.id)),disabled:!ne,children:`关闭右侧标签`})]})]})}function Zr(){let{state:e,setModulePaneWidth:t}=qn(),[n,r]=(0,l.useState)(!1),i=n=>{if(window.innerWidth<=900||e.modulePaneCollapsed)return;r(!0);let i=n.clientX,a=e.modulePaneWidth,o=e=>{t(a+(e.clientX-i))},s=()=>{r(!1),window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s)},a={"--module-pane-width":`${e.modulePaneWidth}px`};return(0,j.jsxs)(`main`,{className:`desktop-shell`,children:[(0,j.jsx)(Xr,{}),(0,j.jsxs)(`section`,{className:[`desktop-body`,n?`desktop-body--dragging`:``,e.modulePaneCollapsed?`desktop-body--pane-collapsed`:``].filter(Boolean).join(` `),style:a,children:[(0,j.jsx)(Ir,{}),(0,j.jsxs)(`div`,{className:`module-pane-wrap`,children:[(0,j.jsx)(Pr,{}),(0,j.jsx)(`div`,{className:`module-pane-resizer`,onMouseDown:i,role:`separator`,"aria-orientation":`vertical`,"aria-label":`resize sidebar`})]}),(0,j.jsxs)(`div`,{className:`desktop-main`,children:[(0,j.jsx)(Ur,{}),(0,j.jsx)(Wr,{})]})]})]})}function Qr(){let{state:e,refresh:t}=qn(),n=(0,l.useRef)(e.repoPath);return(0,l.useEffect)(()=>{t(n.current)},[t]),(0,j.jsx)(Zr,{})}function $r(){return(0,j.jsx)(pr,{children:(0,j.jsx)(Qr,{})})}var ei=document.getElementById(`app`);if(!ei)throw Error(`#app not found`);(0,u.createRoot)(ei).render((0,j.jsx)(l.StrictMode,{children:(0,j.jsx)($r,{})})); \ No newline at end of file diff --git a/desktop/frontend/dist/assets/index-pTWD1XWh.css b/desktop/frontend/dist/assets/index-pTWD1XWh.css new file mode 100644 index 0000000..9fe6caf --- /dev/null +++ b/desktop/frontend/dist/assets/index-pTWD1XWh.css @@ -0,0 +1 @@ +@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e1e7ef;--bg-main:#edf2f8;--bg-topbar:#e3e8f0;--bg-topbar-active:#f1f4f9;--bg-pane:#e3e7ef;--bg-pane-hover:#dce3ed;--bg-card:#eef2f7;--bg-card-soft:#dfe5ee;--bg-input:#edf1f6;--bg-output:#e7edf6;--text-1:#1f2d44;--text-2:#5d708d;--text-3:#8b9ab0;--text-inverse:#fff;--text-output:#1f2d44;--line:#bfcbdb;--line-strong:#adbbd1;--line-output:#b5c4d8;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--brand-soft:#4f7fc41f;--brand-soft-strong:#4f7fc42e;--brand-line:#4f7fc485;--brand-line-strong:#4f7fc47a;--ok:#1b9b4a;--error:#d83f57;--ok-soft:#1b9b4a14;--ok-line:#1b9b4a40;--error-soft:#d83f5714;--error-line:#d83f5740;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14;--shadow-menu:0 8px 20px #131f322e;--highlight-stroke:#ffffff57}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-repo__logo{flex:0 0 14px;width:14px;height:14px;display:block}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{border-color:var(--brand-line);background:var(--brand-soft)}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-actions{align-items:center;gap:8px;margin-left:auto;display:inline-flex}.tabs-project-select{min-width:220px;height:28px;font-size:12px}.tabs-settings{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-settings-panel{z-index:40;border:1px solid var(--line);background:var(--bg-card);width:min(620px,100vw - 24px);box-shadow:var(--shadow-menu);border-radius:12px;padding:10px;position:fixed;top:46px;right:12px}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);min-width:150px;box-shadow:var(--shadow-menu);border-radius:10px;gap:3px;padding:6px;display:grid;position:fixed}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line);background:var(--bg-pane);color:var(--text-2);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;font-weight:600;display:grid}.sidebar-menu-panel__item:hover{color:var(--text-1);background:var(--bg-pane-hover)}.sidebar-menu-panel__item--active{color:var(--text-1);background:var(--bg-card-soft);box-shadow:inset 0 0 0 1px var(--line-strong)}.sidebar-menu-panel__footer{border-top:1px solid var(--line);color:var(--text-2);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{border-color:var(--line-strong);width:36px;height:32px;color:var(--text-2);padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:var(--brand-line-strong)}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:auto minmax(0,1fr);gap:10px;min-height:0;padding:10px;display:grid}.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 var(--highlight-stroke), var(--shadow-card);padding:12px}.workspace-panel__row{align-items:center;gap:8px;display:flex}.workspace-panel__row--add .ui-input{flex:1}.repo-settings{gap:8px;display:grid}.repo-settings__header{justify-content:space-between;align-items:baseline;display:flex}.repo-settings__header h3{margin:0;font-size:14px}.repo-settings__header p,.repo-settings__status,.repo-settings__count{color:var(--text-2);margin:0;font-size:12px}.repo-settings__current{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-topbar-active);gap:3px;padding:8px 10px;display:grid}.repo-settings__current span{color:var(--text-2);font-size:11px}.repo-settings__current strong{color:var(--text-1);word-break:break-all;font-size:12px}.repo-list{gap:8px;max-height:180px;margin-top:8px;display:grid;overflow:auto}.repo-item{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-card-soft);cursor:pointer;gap:7px;padding:8px;display:grid}.repo-item--selected{box-shadow:inset 0 0 0 1px var(--brand-line)}.repo-item--current{background:var(--bg-topbar-active);border-color:var(--line-strong)}.repo-item__meta{min-width:0}.repo-item__meta strong{color:var(--text-1);font-size:12px;display:block}.repo-item__meta span{color:var(--text-2);word-break:break-all;margin-top:2px;font-size:11px;display:block}.repo-item__actions{align-items:center;gap:6px;display:flex}.repo-item__actions .ui-button{min-height:28px;padding:0 10px;font-size:11px}.repo-badge{color:var(--text-2);border:1px solid var(--line);background:var(--bg-pane);border-radius:999px;padding:1px 8px;font-size:11px}.repo-badge--active{color:var(--brand-strong);border-color:var(--brand-line);background:var(--brand-soft)}.repo-list__empty{border:1px dashed var(--line-strong);border-radius:var(--radius-md);text-align:center;color:var(--text-2);padding:10px;font-size:12px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto}.tabs-project-select{width:140px;min-width:0}.tabs-settings-panel{top:84px}}@media (width<=640px){.tabs-actions{gap:4px}.tabs-project-select{width:110px}.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto auto auto;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:flex-start;gap:12px;padding-bottom:10px;display:flex}.module-actions__header h2{font-size:18px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__summary{flex:none;justify-items:end;gap:3px;display:grid}.module-actions__summary span{color:var(--text-2);font-size:11px}.module-actions__summary strong{color:var(--text-1);font-size:13px}.module-actions__tabs{align-items:stretch;gap:8px;padding-bottom:2px;display:flex;overflow-x:auto}.module-actions__tab{border:1px solid var(--line);background:linear-gradient(180deg, var(--bg-topbar-active) 0%, var(--bg-card) 100%);min-width:124px;color:var(--text-2);cursor:pointer;border-radius:12px;flex:none;justify-items:start;gap:3px;padding:10px 12px;transition:border-color .18s,background .18s,transform .18s;display:grid}.module-actions__tab:hover{border-color:var(--brand-line);transform:translateY(-1px)}.module-actions__tab span{color:var(--text-1);font-size:13px;font-weight:700;line-height:1.3}.module-actions__tab small{color:var(--text-2);font-size:11px}.module-actions__tab--active{border-color:var(--brand-line);background:linear-gradient(#4f7fc429 0%,#4f7fc40f 100%);box-shadow:inset 0 0 0 1px #4f7fc429}.module-toolbar{border:1px solid var(--line);border-radius:var(--radius-lg);background:radial-gradient(circle at top left, #4f7fc424, transparent 38%), linear-gradient(180deg, var(--bg-card) 0%, var(--bg-card-soft) 100%);justify-content:space-between;align-items:center;gap:12px;padding:12px;display:flex}.module-toolbar__meta h3{font-size:16px}.module-toolbar__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.module-toolbar__actions{flex:none;align-items:center;gap:8px;display:inline-flex}.module-toolbar__hint{color:var(--text-2);border:1px solid var(--line);background:var(--bg-topbar-active);border-radius:999px;padding:5px 10px;font-size:12px}.action-dialog__backdrop{z-index:120;background:#11192659;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.action-dialog{border:1px solid var(--line);background:var(--bg-card);width:min(560px,100vw - 40px);max-height:min(640px,100vh - 40px);box-shadow:var(--shadow-menu);border-radius:14px;gap:10px;padding:12px;display:grid;overflow:auto}.action-dialog__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.action-dialog__header h3{font-size:15px}.action-dialog__header p{color:var(--text-2);margin-top:3px;font-size:12px}.action-dialog__close{border:1px solid var(--line-strong);background:var(--bg-topbar-active);width:30px;height:30px;color:var(--text-2);cursor:pointer;border-radius:8px;font-size:20px;line-height:1}.action-dialog__form{gap:10px;display:grid}.action-dialog__fields{gap:8px;display:grid}.action-dialog__footer{justify-content:flex-end;gap:8px;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=900px){.module-toolbar{flex-direction:column;align-items:stretch}.module-toolbar__actions{flex-wrap:wrap;justify-content:flex-end;width:100%}}@media (width<=640px){.module-actions__header{flex-direction:column}.module-actions__summary{justify-items:start}.module-actions__tab{min-width:112px}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button:disabled{cursor:not-allowed;color:var(--text-3);border-color:var(--line);background:var(--bg-pane)}.ui-button--primary{color:var(--text-inverse);background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--primary:disabled{color:var(--text-inverse);background:var(--line-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft-strong);outline:none}.ui-textarea{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:110px;font:inherit;color:var(--text-1);background:var(--bg-input);resize:vertical;padding:9px 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft-strong);outline:none}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{grid-template-rows:auto minmax(0,1fr);gap:10px;min-height:0;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-line)}.status-pill--error{color:var(--error);background:var(--error-soft);border-color:var(--error-line)}.output-panel__body{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);height:100%;min-height:0;color:var(--text-output);margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto}.output-list{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);align-content:start;gap:0;height:100%;min-height:0;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.output-list__item{border-bottom:1px solid var(--line-output);justify-content:space-between;align-items:flex-start;gap:12px;padding:10px 12px;display:flex}.output-list__item:last-child{border-bottom:0}.output-list__item--active{background:var(--brand-soft)}.output-list__main{gap:3px;min-width:0;display:grid}.output-list__main p{color:var(--text-output);font-size:13px;font-family:var(--font-heading);word-break:break-word;margin:0}.output-list__main span,.output-list__main a{color:var(--text-2);word-break:break-all;font-size:11px;text-decoration:none}.output-list__main a:hover{text-decoration:underline}.output-list__badge{border:1px solid var(--line-strong);background:var(--bg-card-soft);color:var(--text-2);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;line-height:1.6}.output-empty{border:1px dashed var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);height:100%;min-height:0;color:var(--text-2);place-items:center;padding:10px;font-size:12px;display:grid} diff --git a/desktop/frontend/dist/assets/index-yhaLZGkG.css b/desktop/frontend/dist/assets/index-yhaLZGkG.css deleted file mode 100644 index d440104..0000000 --- a/desktop/frontend/dist/assets/index-yhaLZGkG.css +++ /dev/null @@ -1 +0,0 @@ -@import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;700;800&family=Sora:wght@500;600;700&display=swap";:root{--font-heading:"Sora", "Avenir Next", sans-serif;--font-body:"Manrope", "PingFang SC", "Segoe UI", sans-serif;--bg-app:#e1e7ef;--bg-main:#edf2f8;--bg-topbar:#e3e8f0;--bg-topbar-active:#f1f4f9;--bg-pane:#e3e7ef;--bg-pane-hover:#dce3ed;--bg-card:#eef2f7;--bg-card-soft:#dfe5ee;--bg-input:#edf1f6;--bg-output:#e7edf6;--text-1:#1f2d44;--text-2:#5d708d;--text-3:#8b9ab0;--text-inverse:#fff;--text-output:#1f2d44;--line:#bfcbdb;--line-strong:#adbbd1;--line-output:#b5c4d8;--brand:#4f7fc4;--brand-strong:#3c679f;--accent:#13ad9f;--brand-soft:#4f7fc41f;--brand-soft-strong:#4f7fc42e;--brand-line:#4f7fc485;--brand-line-strong:#4f7fc47a;--ok:#1b9b4a;--error:#d83f57;--ok-soft:#1b9b4a14;--ok-line:#1b9b4a40;--error-soft:#d83f5714;--error-line:#d83f5740;--radius-xl:14px;--radius-lg:11px;--radius-md:9px;--shadow-card:0 8px 26px #121c2c14;--shadow-menu:0 8px 20px #131f322e;--highlight-stroke:#ffffff57}*{box-sizing:border-box}html,body,#app{height:100%}body{color:var(--text-1);background:var(--bg-app);font-family:var(--font-body);margin:0}h1,h2,h3,h4{font-family:var(--font-heading);letter-spacing:.01em;margin:0}p{margin:0}@keyframes rise-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.app-drag-region{-webkit-app-region:drag}.app-no-drag-region{-webkit-app-region:no-drag}.desktop-shell{background:var(--bg-main);grid-template-rows:40px 1fr;height:100%;display:grid}.tabs-header{border-bottom:1px solid var(--line);background:var(--bg-topbar);align-items:center;gap:8px;padding:0 10px;display:flex}.tabs-repo{border:1px solid var(--line);height:26px;color:var(--text-2);background:var(--bg-topbar-active);white-space:nowrap;border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:inline-flex}.tabs-repo__logo{flex:0 0 14px;width:14px;height:14px;display:block}.tabs-track{align-items:stretch;gap:3px;min-width:0;display:flex;overflow-x:auto}.tabs-track__item{min-width:90px;height:30px;color:var(--text-2);font-family:var(--font-heading);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 12px;font-size:12px;display:grid}.tabs-track__item span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tabs-track__item--active{background:var(--bg-topbar-active);border-color:var(--line);border-bottom-color:var(--bg-topbar-active);color:var(--text-1)}.tabs-track__item--drag-over{border-color:var(--brand-line);background:var(--brand-soft)}.tabs-track__close{width:18px;height:18px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;padding:0;display:inline-flex}.tabs-track__close:hover{color:var(--text-1);background:var(--bg-pane-hover)}.tabs-add{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-actions{align-items:center;gap:8px;margin-left:auto;display:inline-flex}.tabs-project-select{min-width:220px;height:28px;font-size:12px}.tabs-settings{border:1px solid var(--line);background:var(--bg-topbar-active);width:26px;height:26px;color:var(--text-2);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;display:inline-flex}.tabs-settings-panel{z-index:40;border:1px solid var(--line);background:var(--bg-card);width:min(620px,100vw - 24px);box-shadow:var(--shadow-menu);border-radius:12px;padding:10px;position:fixed;top:46px;right:12px}.tabs-menu{z-index:30;border:1px solid var(--line);background:var(--bg-topbar-active);min-width:150px;box-shadow:var(--shadow-menu);border-radius:10px;gap:3px;padding:6px;display:grid;position:fixed}.tabs-menu__item{color:var(--text-1);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font-size:12px}.tabs-menu__item:hover{background:var(--bg-pane-hover)}.tabs-menu__item:disabled{color:var(--text-3);cursor:not-allowed}.desktop-body{grid-template-columns:72px var(--module-pane-width,280px) minmax(0, 1fr);min-height:0;transition:grid-template-columns .18s;display:grid}.desktop-body--pane-collapsed{grid-template-columns:72px 0 minmax(0,1fr)}.desktop-body--dragging *{cursor:col-resize!important}.module-pane-wrap{min-width:0;transition:opacity .18s;position:relative;overflow:hidden}.desktop-body--pane-collapsed .module-pane-wrap{opacity:0}.sidebar-menu-panel{border-right:1px solid var(--line);background:var(--bg-pane);color:var(--text-2);grid-template-rows:1fr auto;min-height:0;display:grid}.sidebar-menu-panel__group{flex-direction:column;align-items:center;gap:8px;padding:12px 0;display:flex}.sidebar-menu-panel__item{width:56px;min-height:50px;color:var(--text-2);cursor:pointer;background:0 0;border:0;border-radius:12px;align-content:center;justify-items:center;gap:4px;font-size:11px;font-weight:600;display:grid}.sidebar-menu-panel__item:hover{color:var(--text-1);background:var(--bg-pane-hover)}.sidebar-menu-panel__item--active{color:var(--text-1);background:var(--bg-card-soft);box-shadow:inset 0 0 0 1px var(--line-strong)}.sidebar-menu-panel__footer{border-top:1px solid var(--line);color:var(--text-2);justify-items:center;gap:6px;padding:10px 8px;font-size:11px;display:grid}.sidebar-menu-panel__refresh{border-color:var(--line-strong);width:36px;height:32px;color:var(--text-2);padding:0}.module-pane{border-right:1px solid var(--line);background:var(--bg-pane);grid-template-rows:auto 1fr;min-height:0;display:grid}.module-pane-resizer{cursor:col-resize;z-index:5;background:0 0;width:4px;height:100%;position:absolute;top:0;right:-2px}.module-pane-resizer:hover{background:var(--brand-line-strong)}.module-pane__header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px;display:flex}.module-pane__actions{align-items:center;gap:6px;display:inline-flex}.module-pane__collapse{width:34px;min-height:34px;padding:0}.module-pane__header h2{font-size:13px;font-family:var(--font-heading)}.module-pane__header p{color:var(--text-2);margin-top:2px;font-size:12px}.module-pane__list{align-content:start;gap:6px;min-height:0;padding:8px;display:grid;overflow:auto}.module-pane__item{color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;padding:10px}.module-pane__item:hover{background:var(--bg-pane-hover)}.module-pane__item--active{background:var(--bg-topbar-active);border-color:var(--line-strong);box-shadow:var(--shadow-card)}.module-pane__item strong{font-size:13px;display:block}.module-pane__item span{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.35;display:block}.module-pane__empty{border:1px dashed var(--line-strong);color:var(--text-2);border-radius:9px;padding:12px;font-size:12px}.desktop-main{grid-template-rows:1fr auto;gap:10px;min-height:0;padding:10px;display:grid}.module-actions,.output-panel{border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg-card);box-shadow:0 1px 0 var(--highlight-stroke), var(--shadow-card);padding:12px}.workspace-panel__row{align-items:center;gap:8px;display:flex}.workspace-panel__row--add .ui-input{flex:1}.repo-settings{gap:8px;display:grid}.repo-settings__header{justify-content:space-between;align-items:baseline;display:flex}.repo-settings__header h3{margin:0;font-size:14px}.repo-settings__header p,.repo-settings__status,.repo-settings__count{color:var(--text-2);margin:0;font-size:12px}.repo-settings__current{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-topbar-active);gap:3px;padding:8px 10px;display:grid}.repo-settings__current span{color:var(--text-2);font-size:11px}.repo-settings__current strong{color:var(--text-1);word-break:break-all;font-size:12px}.repo-list{gap:8px;max-height:180px;margin-top:8px;display:grid;overflow:auto}.repo-item{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--bg-card-soft);cursor:pointer;gap:7px;padding:8px;display:grid}.repo-item--selected{box-shadow:inset 0 0 0 1px var(--brand-line)}.repo-item--current{background:var(--bg-topbar-active);border-color:var(--line-strong)}.repo-item__meta{min-width:0}.repo-item__meta strong{color:var(--text-1);font-size:12px;display:block}.repo-item__meta span{color:var(--text-2);word-break:break-all;margin-top:2px;font-size:11px;display:block}.repo-item__actions{align-items:center;gap:6px;display:flex}.repo-item__actions .ui-button{min-height:28px;padding:0 10px;font-size:11px}.repo-badge{color:var(--text-2);border:1px solid var(--line);background:var(--bg-pane);border-radius:999px;padding:1px 8px;font-size:11px}.repo-badge--active{color:var(--brand-strong);border-color:var(--brand-line);background:var(--brand-soft)}.repo-list__empty{border:1px dashed var(--line-strong);border-radius:var(--radius-md);text-align:center;color:var(--text-2);padding:10px;font-size:12px}@media (width<=1120px){.desktop-body{grid-template-columns:64px var(--module-pane-width,240px) minmax(0, 1fr)}}@media (width<=900px){.desktop-shell{grid-template-rows:auto 1fr}.desktop-body,.desktop-body--pane-collapsed{grid-template-rows:auto auto 1fr;grid-template-columns:1fr}.sidebar-menu-panel{border-right:0;border-bottom:1px solid var(--line);grid-template-rows:auto;grid-template-columns:1fr auto;align-items:center;min-height:auto;padding:0 8px}.sidebar-menu-panel__group{flex-direction:row;justify-content:center;padding:8px 0}.sidebar-menu-panel__item{width:60px;min-height:46px}.sidebar-menu-panel__footer{border-top:0;border-left:1px solid var(--line);grid-auto-flow:column;align-items:center;padding:8px}.module-pane{border-right:0;border-bottom:1px solid var(--line)}.module-pane-resizer{display:none}.desktop-main{grid-template-rows:auto auto}.tabs-project-select{width:140px;min-width:0}.tabs-settings-panel{top:84px}}@media (width<=640px){.tabs-actions{gap:4px}.tabs-project-select{width:110px}.workspace-panel__row{flex-direction:column}.tabs-header{padding:0 6px}.tabs-repo{display:none}}.module-actions{grid-template-rows:auto 1fr;gap:10px;min-height:0;animation:.22s both rise-in;display:grid}.module-actions__header{border-bottom:1px solid var(--line);padding-bottom:10px}.module-actions__header h2{font-size:17px}.module-actions__header p{color:var(--text-2);margin-top:4px;font-size:13px}.module-actions__grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));align-content:start;gap:10px;min-height:0;display:grid;overflow:auto}.action-card{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--bg-card-soft);box-shadow:0 1px 0 var(--highlight-stroke);gap:10px;padding:12px;animation:.24s both rise-in;display:grid}.action-card__meta h3{font-size:14px}.action-card__meta p{color:var(--text-2);margin-top:4px;font-size:12px;line-height:1.45}.action-card__form{gap:10px;display:grid}.action-card__fields{gap:8px;display:grid}.action-card__footer{justify-content:flex-end;display:flex}.empty-state{border:1px dashed var(--line-strong);border-radius:var(--radius-lg);min-height:120px;color:var(--text-2);background:var(--bg-card-soft);place-items:center;display:grid}@media (width<=760px){.module-actions__grid{grid-template-columns:1fr}}.ui-button{appearance:none;border:1px solid var(--line-strong);border-radius:var(--radius-md);min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-topbar-active);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:12px;font-weight:700;transition:border-color .18s,background .18s;display:inline-flex}.ui-button:hover{border-color:var(--line-strong);background:var(--bg-pane-hover)}.ui-button:disabled{cursor:not-allowed;color:var(--text-3);border-color:var(--line);background:var(--bg-pane)}.ui-button--primary{color:var(--text-inverse);background:var(--brand);border-color:#0000}.ui-button--primary:hover{background:var(--brand-strong);border-color:#0000}.ui-button--primary:disabled{color:var(--text-inverse);background:var(--line-strong);border-color:#0000}.ui-button--ghost{background:0 0}.ui-input{border:1px solid var(--line-strong);border-radius:var(--radius-md);width:100%;min-width:0;min-height:36px;font:inherit;color:var(--text-1);background:var(--bg-input);padding:0 11px;font-size:13px;transition:border-color .2s,box-shadow .2s}.ui-input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft-strong);outline:none}.action-field{gap:4px;display:grid}.action-field span{color:var(--text-2);font-size:12px}.output-panel{gap:10px;display:grid}.output-panel__header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.output-panel__header h2{font-size:14px}.output-panel__header p{color:var(--text-2);word-break:break-all;margin-top:4px;font-size:12px}.status-pill{border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;min-width:72px;height:26px;font-size:11px;font-weight:700;display:inline-flex}.status-pill--ok{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-line)}.status-pill--error{color:var(--error);background:var(--error-soft);border-color:var(--error-line)}.output-panel__body{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);min-height:180px;max-height:30vh;color:var(--text-output);margin:0;padding:11px;font-family:JetBrains Mono,SF Mono,Menlo,monospace;font-size:12px;line-height:1.55;overflow:auto}.output-list{border:1px solid var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);align-content:start;gap:0;min-height:180px;max-height:30vh;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.output-list__item{border-bottom:1px solid var(--line-output);justify-content:space-between;align-items:flex-start;gap:12px;padding:10px 12px;display:flex}.output-list__item:last-child{border-bottom:0}.output-list__item--active{background:var(--brand-soft)}.output-list__main{gap:3px;min-width:0;display:grid}.output-list__main p{color:var(--text-output);font-size:13px;font-family:var(--font-heading);word-break:break-word;margin:0}.output-list__main span,.output-list__main a{color:var(--text-2);word-break:break-all;font-size:11px;text-decoration:none}.output-list__main a:hover{text-decoration:underline}.output-list__badge{border:1px solid var(--line-strong);background:var(--bg-card-soft);color:var(--text-2);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;line-height:1.6}.output-empty{border:1px dashed var(--line-output);border-radius:var(--radius-lg);background:var(--bg-output);min-height:180px;max-height:30vh;color:var(--text-2);place-items:center;padding:10px;font-size:12px;display:grid} diff --git a/desktop/frontend/dist/index.html b/desktop/frontend/dist/index.html index e35ec4b..82eac5e 100644 --- a/desktop/frontend/dist/index.html +++ b/desktop/frontend/dist/index.html @@ -4,8 +4,8 @@ fastgit desktop - - + +
diff --git a/desktop/frontend/src/features/modules/module-actions.tsx b/desktop/frontend/src/features/modules/module-actions.tsx index 8bc0b5a..3db81db 100644 --- a/desktop/frontend/src/features/modules/module-actions.tsx +++ b/desktop/frontend/src/features/modules/module-actions.tsx @@ -1,21 +1,86 @@ -import { FormEvent } from "react"; +import { FormEvent, useEffect, useRef, useState } from "react"; import { Button } from "../../components/ui/button"; import { Input } from "../../components/ui/input"; import { useAppContext } from "../../app/providers/app-context"; +import type { ModuleAction } from "../../app/types"; -function collectValues(form: HTMLFormElement): Record { - const payload = new FormData(form); - const values: Record = {}; +function classifyAction(actionID: string): string { + if (actionID.endsWith("_list") || actionID.endsWith("_status")) { + return "列表"; + } + if (actionID.endsWith("_view")) { + return "详情"; + } + if (actionID.endsWith("_create") || actionID.endsWith("_publish")) { + return "新增"; + } + if (actionID.endsWith("_delete") || actionID.endsWith("_remove")) { + return "删除"; + } + if (actionID.endsWith("_checkout") || actionID.endsWith("_switch")) { + return "切换"; + } + if (actionID.endsWith("_pull") || actionID.endsWith("_push") || actionID.endsWith("_sync") || actionID.endsWith("_merge")) { + return "执行"; + } + return "操作"; +} + +function isLandingAction(action: ModuleAction): boolean { + return (action.id.endsWith("_list") || action.id.endsWith("_status")) && (action.fields?.length ?? 0) === 0; +} + +function pickDefaultAction(actions: ModuleAction[]): ModuleAction | null { + return actions.find(isLandingAction) ?? actions[0] ?? null; +} - for (const [key, raw] of payload.entries()) { - values[key] = String(raw).trim(); +function defaultValuesFor(action: ModuleAction | null): Record { + const out: Record = {}; + for (const field of action?.fields ?? []) { + out[field.key] = field.default || ""; } - return values; + return out; +} + +function actionVerb(action: ModuleAction | null): string { + if (!action) { + return "执行"; + } + return (action.fields?.length ?? 0) > 0 ? "填写并执行" : "立即执行"; } export function ModuleActions() { const { selectedModule, runAction } = useAppContext(); + const actions = selectedModule?.actions ?? []; + const [activeActionId, setActiveActionId] = useState(null); + const [dialogOpen, setDialogOpen] = useState(false); + const [draftValues, setDraftValues] = useState>({}); + const lastAutoRunKeyRef = useRef(""); + + const activeAction = actions.find((action) => action.id === activeActionId) ?? pickDefaultAction(actions); + + useEffect(() => { + const nextAction = pickDefaultAction(actions); + setActiveActionId(nextAction?.id ?? null); + setDialogOpen(false); + setDraftValues(defaultValuesFor(nextAction)); + lastAutoRunKeyRef.current = ""; + }, [selectedModule?.id, actions]); + + useEffect(() => { + if (!selectedModule || !activeAction || !isLandingAction(activeAction)) { + return; + } + + const nextKey = `${selectedModule.id}:${activeAction.id}`; + if (lastAutoRunKeyRef.current === nextKey) { + return; + } + + lastAutoRunKeyRef.current = nextKey; + void runAction(selectedModule, activeAction, {}); + }, [activeAction, runAction, selectedModule]); if (!selectedModule) { return ( @@ -25,49 +90,178 @@ export function ModuleActions() { ); } - const actions = selectedModule.actions ?? []; + if (actions.length === 0 || !activeAction) { + return ( +
+
+

{selectedModule.title}

+

{selectedModule.description}

+
+
该模块暂时没有可执行动作。
+
+ ); + } - const onSubmit = (action: (typeof actions)[number]) => (event: FormEvent) => { - event.preventDefault(); - const values = collectValues(event.currentTarget); + const openDialog = (action: ModuleAction) => { + setActiveActionId(action.id); + setDraftValues(defaultValuesFor(action)); + setDialogOpen(true); + }; + + const closeDialog = () => { + setDialogOpen(false); + setDraftValues(defaultValuesFor(activeAction)); + }; + + const onActionClick = (action: ModuleAction) => { + setActiveActionId(action.id); + if (isLandingAction(action)) { + return; + } + if ((action.fields?.length ?? 0) > 0) { + openDialog(action); + } + }; + + const executeAction = (action: ModuleAction, values: Record) => { + if (!selectedModule) { + return; + } void runAction(selectedModule, action, values); }; + const onPrimaryExecute = () => { + if ((activeAction.fields?.length ?? 0) > 0) { + openDialog(activeAction); + return; + } + executeAction(activeAction, {}); + }; + + const onDialogSubmit = (event: FormEvent) => { + event.preventDefault(); + executeAction(activeAction, draftValues); + closeDialog(); + }; + return (
-

{selectedModule.title}

-

{selectedModule.description}

+
+

{selectedModule.title}

+

{selectedModule.description}

+
+
+ {actions.length} 个功能 + {classifyAction(activeAction.id)} +
-
- {actions.map((action, index) => ( -
-
-

{action.title}

-

{action.description}

-
-
-
- {(action.fields ?? []).map((field) => ( +
+ {actions.map((action) => { + const active = activeAction.id === action.id; + return ( + + ); + })} +
+ +
+
+

{activeAction.title}

+

{activeAction.description}

+
+
+ {(activeAction.fields?.length ?? 0) > 0 ? ( + {activeAction.fields?.length} 个参数 + ) : ( + 无额外参数 + )} + + +
+
+ + {dialogOpen ? ( +
+
event.stopPropagation()} + > +
+
+

{activeAction.title}

+

{activeAction.description}

+
+ +
+ +
+ {(activeAction.fields ?? []).map((field) => (