1import{d as it,r as y,c as O,w as da,D as ye,u as l,K as v,B as a,z as p,E as f,G as n,F as de,V as ce,U as K,C as c,q as ae,o as ca,a as ua,k as x,A,Q as P,W as V,H,a2 as rt}from"./vendor-vue-Dzwqm9Y9.js";import{a as dt,g as he,j as q,_ as C,h as nt}from"./index-D4B9XJED.js";import{_ as pa}from"./AppLayout.vue_vue_type_script_setup_true_lang-964gbyG2.js";import{T as ma}from"./TablePageLayout-BSHryiYN.js";import{D as xa}from"./DataTable-CpLnuJXJ.js";import{P as ya}from"./Pagination-B13-Vhh-.js";import{_ as Fe}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-DkHWYJXe.js";import{_ as ha}from"./EmptyState.vue_vue_type_script_setup_true_lang-BZop-dpC.js";import{u as ct}from"./vendor-i18n-BuoWFzps.js";import{S as W}from"./Select-BjYX9AhD.js";import{u as ba,p as va,_ as _a,a as fa,b as ga}from"./proxyExpiry-CQ3wIhEf.js";import{u as ka}from"./useClipboard-Cj86XNkg.js";import{u as wa}from"./useTableSelection-SzTxF-Vr.js";import{g as Ca}from"./usePersistedPageSize-x0WpaIWh.js";import"./vendor-misc-B-nM3tYW.js";import"./AppHeader.vue_vue_type_style_index_0_scoped_59fb3e77_lang-C9_N2XZy.js";import"./LocaleSwitcher-BANwbqFd.js";/* empty css */import"./platformColors-h1bYIP5J.js";import"./PlatformIcon.vue_vue_type_script_setup_true_lang-C_SSDXYQ.js";const Sa={class:"text-sm text-gray-600 dark:text-dark-300"},Pa={class:"rounded-lg border border-amber-200 bg-amber-50 p-3 text-xs text-amber-600 dark:border-amber-800 dark:bg-amber-900/20 dark:text-amber-400"},$a={class:"input-label"},Ea={class:"flex items-center justify-between gap-3 rounded-lg border border-dashed border-gray-300 bg-gray-50 px-4 py-3 dark:border-dark-600 dark:bg-dark-800"},Da={class:"min-w-0"},Ta={class:"truncate text-sm text-gray-700 dark:text-dark-200"},Va={key:0,class:"space-y-2 rounded-xl border border-gray-200 p-4 dark:border-dark-700"},qa={class:"text-sm font-medium text-gray-900 dark:text-white"},Ia={class:"text-sm text-gray-700 dark:text-dark-300"},Ua={key:0,class:"mt-2"},za={class:"text-sm font-medium text-red-600 dark:text-red-400"},Aa={class:"mt-2 max-h-48 overflow-auto rounded-lg bg-gray-50 p-3 font-mono text-xs dark:bg-dark-800"},Ma={class:"flex justify-end gap-3"},Ba=["disabled"],Fa=["disabled"],Ra=it({__name:"ImportDataModal",props:{show:{type:Boolean}},emits:["close","imported"],setup(Pe,{emit:s}){const h=Pe,se=s,{t:g}=ct(),X=dt(),G=y(!1),M=y(!1),Z=y(null),I=y(null),B=y(null),Y=O(()=>{var b;return((b=Z.value)==null?void 0:b.name)||""}),F=O(()=>{var b;return((b=I.value)==null?void 0:b.errors)||[]});da(()=>h.show,b=>{b&&(Z.value=null,M.value=!1,I.value=null,B.value&&(B.value.value=""))});const oe=()=>{var b;(b=B.value)==null||b.click()},R=b=>{var _;const T=b.target;Z.value=((_=T.files)==null?void 0:_[0])||null},S=()=>{G.value||(M.value&&(M.value=!1,se("imported")),se("close"))},J=async b=>{if(typeof b.text=="function")return b.text();if(typeof b.arrayBuffer=="function"){const T=await b.arrayBuffer();return new TextDecoder().decode(T)}return await new Promise((T,_)=>{const $=new FileReader;$.onload=()=>T(String($.result??"")),$.onerror=()=>_($.error||new Error(g("common.fileReadFailed"))),$.readAsText(b)})},le=async()=>{if(!Z.value){X.showError(g("admin.proxies.dataImportSelectFile"));return}G.value=!0;try{const b=await J(Z.value),T=JSON.parse(b),_=await q.proxies.importData({data:T});I.value=_;const $={proxy_created:_.proxy_created,proxy_reused:_.proxy_reused,proxy_failed:_.proxy_failed};_.proxy_failed>0?(M.value||(M.value=_.proxy_created>0||_.proxy_reused>0),X.showError(g("admin.proxies.dataImportCompletedWithErrors",$))):(M.value=!1,X.showSuccess(g("admin.proxies.dataImportSuccess",$)),se("imported"))}catch(b){b instanceof SyntaxError?X.showError(g("admin.proxies.dataImportParseFailed")):X.showError((b==null?void 0:b.message)||g("admin.proxies.dataImportFailed"))}finally{G.value=!1}};return(b,T)=>(c(),ye(he,{show:Pe.show,title:l(g)("admin.proxies.dataImportTitle"),width:"normal","close-on-click-outside":"",onClose:S},{footer:v(()=>[a("div",Ma,[a("button",{class:"btn btn-secondary",type:"button",disabled:G.value,onClick:S},n(l(g)("common.cancel")),9,Ba),a("button",{class:"btn btn-primary",type:"submit",form:"import-proxy-data-form",disabled:G.value},n(G.value?l(g)("admin.proxies.dataImporting"):l(g)("admin.proxies.dataImportButton")),9,Fa)])]),default:v(()=>[a("form",{id:"import-proxy-data-form",class:"space-y-4",onSubmit:K(le,["prevent"])},[a("div",Sa,n(l(g)("admin.proxies.dataImportHint")),1),a("div",Pa,n(l(g)("admin.proxies.dataImportWarning")),1),a("div",null,[a("label",$a,n(l(g)("admin.proxies.dataImportFile")),1),a("div",Ea,[a("div",Da,[a("div",Ta,n(Y.value||l(g)("admin.proxies.dataImportSelectFile")),1),T[0]||(T[0]=a("div",{class:"text-xs text-gray-500 dark:text-dark-400"},"JSON (.json)",-1))]),a("button",{type:"button",class:"btn btn-secondary shrink-0",onClick:oe},n(l(g)("common.chooseFile")),1)]),a("input",{ref_key:"fileInput",ref:B,type:"file",class:"hidden",accept:"application/json,.json",onChange:R},null,544)]),I.value?(c(),p("div",Va,[a("div",qa,n(l(g)("admin.proxies.dataImportResult")),1),a("div",Ia,n(l(g)("admin.proxies.dataImportResultSummary",I.value)),1),F.value.length?(c(),p("div",Ua,[a("div",za,n(l(g)("admin.proxies.dataImportErrors")),1),a("div",Aa,[(c(!0),p(de,null,ce(F.value,(_,$)=>(c(),p("div",{key:$,class:"whitespace-pre-wrap"},n(_.kind)+" "+n(_.name||_.proxy_key||"-")+" â "+n(_.message),1))),128))])])):f("",!0)])):f("",!0)],32)]),_:1},8,["show","title"]))}}),La={class:"flex flex-wrap items-center gap-3"},ja={class:"relative w-full sm:w-64"},Ha=["placeholder"],Oa={class:"w-full sm:w-40"},Qa={class:"w-full sm:w-36"},Na={class:"flex flex-1 flex-wrap items-center justify-end gap-2"},Wa=["disabled","title"],Ka=["disabled","title"],Ga=["disabled","title"],Ya=["disabled","title"],Ja=["checked"],Xa=["checked","onChange"],Za={class:"font-medium text-gray-900 dark:text-white"},es={key:1,class:"text-sm text-gray-400"},ts={class:"flex items-center gap-1.5"},as={class:"code text-xs"},ss={class:"relative"},os=["title","onClick","onContextmenu"],ls={key:0,class:"absolute left-0 top-full z-50 mt-1 w-auto min-w-[180px] rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-dark-500 dark:bg-dark-700"},rs=["onClick"],ns={class:"truncate font-mono text-gray-600 dark:text-gray-300"},is={key:0,class:"flex items-center gap-1.5"},ds={class:"flex flex-col text-xs"},cs={key:0,class:"text-gray-700 dark:text-gray-200"},us={key:1,class:"font-mono text-gray-500 dark:text-gray-400"},ps=["onClick"],ms={key:1,class:"text-sm text-gray-400"},xs={class:"flex items-center gap-2"}
1,ys=["src","alt"],hs={key:1,class:"text-sm text-gray-700 dark:text-gray-200"},bs={key:2,class:"text-sm text-gray-400"},vs=["onClick"],_s={key:1,class:"inline-flex items-center rounded bg-gray-100 px-2 py-0.5 text-xs font-medium text-gray-800 dark:bg-dark-600 dark:text-gray-300"},fs={class:"flex flex-col gap-1"},gs=["title"],ks={key:2,class:"text-sm text-gray-400"},ws=["title"],Cs={key:0,class:"text-sm text-gray-400"},Ss={key:1,class:"flex flex-col text-xs"},Ps={class:"text-gray-700 dark:text-gray-200"},$s={class:"text-xs text-gray-600 dark:text-gray-300"},Es={class:"flex items-center gap-1"},Ds=["onClick","disabled"],Ts={key:0,class:"h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},Vs={class:"text-xs"},qs=["onClick","disabled"],Is={key:0,class:"h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},Us={class:"text-xs"},zs=["onClick"],As={class:"text-xs"},Ms=["onClick"],Bs={class:"text-xs"},Fs={class:"mb-6 flex items-center justify-between gap-3 border-b border-gray-200 dark:border-dark-600"},Rs={class:"flex min-w-0 shrink-0"},Ls={class:"input-label"},js=["placeholder"],Hs={class:"input-label"},Os={class:"grid grid-cols-2 gap-4"},Qs={class:"input-label"},Ns=["placeholder"],Ws={class:"input-label"},Ks=["placeholder"],Gs={class:"input-label"},Ys=["placeholder"],Js={class:"input-label"},Xs={class:"relative"},Zs=["type","placeholder"],eo={class:"input-label"},to={class:"mb-2 flex flex-wrap gap-2"},ao=["onClick"],so=["placeholder"],oo={class:"input-label"},lo={key:0},ro={class:"input-label"},no={key:1,class:"space-y-5"},io={class:"input-label"},co=["placeholder"],uo={class:"input-hint mt-2"},po={key:0,class:"rounded-lg bg-gray-50 p-4 dark:bg-dark-700"},mo={class:"flex items-center gap-4 text-sm"},xo={class:"flex items-center gap-1.5"},yo={class:"text-gray-700 dark:text-gray-300"},ho={key:0,class:"flex items-center gap-1.5"},bo={class:"text-amber-600 dark:text-amber-400"},vo={key:1,class:"flex items-center gap-1.5"},_o={class:"text-gray-500 dark:text-gray-400"},fo={class:"flex justify-end gap-3"},go=["disabled"],ko={key:0,class:"-ml-1 mr-2 h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},wo=["disabled"],Co={key:0,class:"-ml-1 mr-2 h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},So={class:"input-label"},Po={class:"input-label"},$o={class:"grid grid-cols-2 gap-4"},Eo={class:"input-label"},Do={class:"input-label"},To={class:"input-label"},Vo={class:"input-label"},qo={class:"relative"},Io=["type","placeholder"],Uo={class:"input-label"},zo={class:"input-label"},Ao={class:"mb-2 flex flex-wrap gap-2"},Mo=["onClick"],Bo=["placeholder"],Fo={class:"input-label"},Ro={key:0},Lo={class:"input-label"},jo={class:"flex justify-end gap-3"},Ho=["disabled"],Oo={key:0,class:"-ml-1 mr-2 h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},Qo={key:0,class:"space-y-4"},No={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-dark-600 dark:bg-dark-700"},Wo={class:"flex items-center justify-between gap-4"},Ko={class:"text-sm text-gray-500 dark:text-gray-400"},Go={class:"mt-1 text-sm text-gray-700 dark:text-gray-200"},Yo={class:"text-right"},Jo={class:"text-2xl font-semibold text-gray-900 dark:text-white"},Xo={class:"text-xs text-gray-500 dark:text-gray-400"},Zo={class:"mt-3 grid grid-cols-2 gap-2 text-xs text-gray-600 dark:text-gray-300"},el={class:"max-h-80 overflow-auto rounded-lg border border-gray-200 dark:border-dark-600"},tl={class:"min-w-full divide-y divide-gray-200 text-sm dark:divide-dark-700"},al={class:"bg-gray-50 text-xs uppercase text-gray-500 dark:bg-dark-800 dark:text-dark-400"},sl={class:"whitespace-nowrap px-3 py-2 text-left"},ol={class:"whitespace-nowrap px-3 py-2 text-left"},ll={class:"whitespace-nowrap px-3 py-2 text-left"},rl={class:"px-3 py-2 text-left"},nl={class:"divide-y divide-gray-200 bg-white dark:divide-dark-700 dark:bg-dark-900"},il={class:"whitespace-nowrap px-3 py-2 text-gray-900 dark:text-white"},dl={class:"whitespace-nowrap px-3 py-2"},cl={class:"whitespace-nowrap px-3 py-2 text-gray-600 dark:text-gray-300"},ul={class:"whitespace-nowrap px-3 py-2 text-gray-600 dark:text-gray-300"},pl={class:"px-3 py-2 text-gray-600 dark:text-gray-300"},ml={key:0,class:"ml-1 text-xs text-gray-400"},xl={class:"flex justify-end"},yl={key:0,class:"flex items-center justify-center py-8 text-sm text-gray-500"},hl={key:1,class:"py-6 text-center text-sm text-gray-500"},bl={key:2,class:"max-h-80 overflow-auto"},vl={class:"min-w-full divide-y divide-gray-200 text-sm dark:divide-dark-700"},_l={class:"bg-gray-50 text-xs uppercase text-gray-500 dark:bg-dark-800 dark:text-dark-400"},fl={class:"px-4 py-2 text-left"},gl={class:"px-4 py-2 text-left"},kl={class:"px-4 py-2 text-left"},wl={class:"divide-y divide-gray-200 bg-white dark:divide-dark-700 dark:bg-dark-900"},Cl={class:"px-4 py-2 font-medium text-gray-900 dark:text-white"},Sl={class:"px-4 py-2"},Pl={class:"px-4 py-2 text-gray-600 dark:text-gray-300"},$l={class:"flex justify-end"},Gl=it({__name:"ProxiesView",setup(Pe){const{t:s}=ct(),h=dt(),{copyToClipboard:se}=ka(),g=O(()=>[{key:"select",label:"",sortable:!1},{key:"name",label:s("admin.proxies.columns.name"),sortable:!0},{key:"protocol",label:s("admin.proxies.columns.protocol"),sortable:!0},{key:"address",label:s("admin.proxies.columns.address"),sortable:!1},{key:"auth",label:s("admin.proxies.columns.auth"),sortable:!1},{key:"location",label:s("admin.proxies.columns.location"),sortable:!1},{key:"account_count",label:s("admin.proxies.columns.accounts"),sortable:!0},{key:"latency",label:s("admin.proxies.columns.latency"),sortable:!1},{key:"expiry",label:s("admin.proxies.columns.expiry"),sortable:!0},{key:"created_at",label:s("admin.proxies.columns.createdAt"),sortable:!0},{key:"status",label:s("admin.proxies.columns.status"),sortable:!0},{key:"actions",label:s("admin.proxies.columns.actions"),sortable:!1}]),X=O(()=>[{value:"",label:s("admin.proxies.allProtocols")},{value:"http",label:"HTTP"},{value:"https",label:"HTTPS"},{value:"socks5",label:"SOCKS5"},{value:"socks5h",label:"SOCKS5H"}]),G=O(()=>[{value:"",label:s("admin.proxies.allStatus")},{value:"active",label:s("admin.accounts.status.active")},{value:"inactive",label:s("admin.accounts.status.inactive")},{value:"expired",label:s("admin.proxies.expired")}]),M=O(()=>[{value:"http",label:s("admin.proxies.protocols.http")},{value:"https",label:s("admin.proxies.protocols.https")},{value:"socks5",label:s("admin.proxies.protocols.socks5")},{value:"socks5h",label:s("admin.proxies.protocols.socks5h")}]),Z=O(()=>[{value:"active",label:s("admin.accounts.status.active")},{value:"inactive",label:s("admin.accounts.status.inactive")}]),I=y([]),B=ae(new Set),Y=y(null),F=y(!1),oe=y(""),R=ae({protocol:"",status:""}),S=ae({page:1,page_size:Ca(),total:0,pages:0}),J=ae({sort_by:"id",sort_order:"desc"}),le=y(!1),b=y(!1),T=y(!1),_=y(!1),$=y(!1),be=y(!1),ve=y(!1),ue=y(!1),_e=y(!1),$e=y(!1),E=y(!1),Ee=y(!1),re=y(new Set),ne=y(new Set),fe=y(!1),pe=y(!1),Re=y(null),{selectedSet:me,selectedCount:ee,allVisibleSelected:ut,isSelected:pt,select:Le,deselect:je,clear:mt,removeMany:xt,toggleVisible:yt,batchUpdate:ht}=wa({rows:I,getId:t=>t.id});ba(Re,{isSelected:pt,select:Le,deselect:je,batchUpdate:ht});const De=y(null),xe=y([]),Te=y(!1),Q=y(null),ie=y(null),Ve=y(!1),qe=y(null),U=y(null),te=y("standard"),ge=y(""),k=ae({total:0,valid:0,invalid:0,duplicate:0,proxies:[]}),m=ae({name:"",protocol:"http",host:"",port:8080,username:"",password:"",expires_at:"",fallback_mode:"none",backup_proxy_id:null,expiry_warn_days:7}),u=ae({name:"",protocol:"http",host:"",port:8080,username:"",password:"",status:"active",expires_at:"",fallback_mode:"none",backup_proxy_id:null,expiry_warn_days:7}),He=y([]),bt=async()=>{He.value=await q.proxies.getAllWithCount()},Oe=t=>He.value.filter(e=>e.id!==t).map(e=>({label:`${e.name} (${e.host}:${e.port})`,value:e.id}));let N=null;const vt=t=>
1{if(!t||typeof t!="object")return!1;const e=t;return e.name==="AbortError"||e.code==="ERR_CANCELED"},_t=(t,e)=>{if(e.target.checked){Le(t);return}je(t)},ft=t=>{const e=t.target;yt(e.checked)},Qe=()=>({protocol:R.protocol||void 0,status:R.status||void 0,search:oe.value||void 0,sort_by:J.sort_by,sort_order:J.sort_order}),D=async()=>{N&&N.abort();const t=new AbortController;N=t,F.value=!0;try{const e=await q.proxies.list(S.page,S.page_size,Qe(),{signal:t.signal});if(t.signal.aborted||N!==t)return;I.value=e.items,S.total=e.total,S.pages=e.pages}catch(e){if(vt(e))return;h.showError(s("admin.proxies.failedToLoad")),console.error("Error loading proxies:",e)}finally{N===t&&(F.value=!1,N=null)}},Ne=()=>{S.page=1,D()};let Ie;const gt=()=>{clearTimeout(Ie),Ie=setTimeout(()=>{S.page=1,D()},300)},kt=t=>{S.page=t,D()},wt=t=>{S.page_size=t,S.page=1,D()},Ct=(t,e)=>{J.sort_by=t,J.sort_order=e,S.page=1,D()},ke=()=>{le.value=!1,te.value="standard",m.name="",m.protocol="http",m.host="",m.port=8080,m.username="",m.password="",m.expires_at="",m.fallback_mode="none",m.backup_proxy_id=null,m.expiry_warn_days=7,b.value=!1,ge.value="",k.total=0,k.valid=0,k.invalid=0,k.duplicate=0,k.proxies=[]},St=()=>{be.value=!1,D()},Pt=t=>{const e=t.trim();if(!e)return null;const r=/^(https?|socks5h?):\/\/(?:([^:@\[\]]+):([^@\[\]]+)@)?(\[[0-9a-f:.]+\]|[^:\[\]]+):(\d+)$/i,d=e.match(r);if(!d)return null;const[,o,i,w,L,Be]=d,j=parseInt(Be,10);if(j<1||j>65535)return null;const z=L.replace(/^\[|\]$/g,"").trim();return{protocol:o.toLowerCase(),host:z,port:j,username:(i==null?void 0:i.trim())||"",password:(w==null?void 0:w.trim())||""}},$t=()=>{const t=ge.value.split(` 2`).filter(i=>i.trim()),e=new Set,r=[];let d=0,o=0;for(const i of t){const w=Pt(i);if(!w){d++;continue}const L=`${w.host}:${w.port}:${w.username}:${w.password}`;if(e.has(L)){o++;continue}e.add(L),r.push(w)}k.total=t.length,k.valid=r.length,k.invalid=d,k.duplicate=o,k.proxies=r},Et=async()=>{var t,e;if(k.valid!==0){E.value=!0;try{const r=await q.proxies.batchCreate(k.proxies),d=r.created||0,o=r.skipped||0;d>0?h.showSuccess(s("admin.proxies.batchImportSuccess",{created:d,skipped:o})):h.showInfo(s("admin.proxies.batchImportAllSkipped",{skipped:o})),ke(),D()}catch(r){h.showError(((e=(t=r.response)==null?void 0:t.data)==null?void 0:e.detail)||s("admin.proxies.failedToImport")),console.error("Error batch creating proxies:",r)}finally{E.value=!1}}},Dt=async()=>{var t,e;if(!m.name.trim()){h.showError(s("admin.proxies.nameRequired"));return}if(!m.host.trim()){h.showError(s("admin.proxies.hostRequired"));return}if(m.port<1||m.port>65535){h.showError(s("admin.proxies.portInvalid"));return}E.value=!0;try{await q.proxies.create({name:m.name.trim(),protocol:m.protocol,host:m.host.trim(),port:m.port,username:m.username.trim()||null,password:m.password.trim()||null,expires_at:m.expires_at?Math.floor(new Date(m.expires_at).getTime()/1e3):null,fallback_mode:m.fallback_mode,backup_proxy_id:m.fallback_mode==="proxy"?m.backup_proxy_id:null,expiry_warn_days:m.expiry_warn_days}),h.showSuccess(s("admin.proxies.proxyCreated")),ke(),D()}catch(r){h.showError(((e=(t=r.response)==null?void 0:t.data)==null?void 0:e.detail)||s("admin.proxies.failedToCreate")),console.error("Error creating proxy:",r)}finally{E.value=!1}},Tt=t=>{Q.value=t,u.name=t.name,u.protocol=t.protocol,u.host=t.host,u.port=t.port,u.username=t.username||"",u.password=t.password||"",u.status=t.status==="expired"?"inactive":t.status,u.expires_at=t.expires_at?t.expires_at.slice(0,10):"",u.fallback_mode=t.fallback_mode||"none",u.backup_proxy_id=t.backup_proxy_id??null,u.expiry_warn_days=t.expiry_warn_days??7,_.value=!1,$.value=!1,T.value=!0},Ue=()=>{T.value=!1,Q.value=null,_.value=!1,$.value=!1},Vt=async()=>{var t,e;if(Q.value){if(!u.name.trim()){h.showError(s("admin.proxies.nameRequired"));return}if(!u.host.trim()){h.showError(s("admin.proxies.hostRequired"));return}if(u.port<1||u.port>65535){h.showError(s("admin.proxies.portInvalid"));return}E.value=!0;try{const r={name:u.name.trim(),protocol:u.protocol,host:u.host.trim(),port:u.port,username:u.username.trim(),status:u.status,expires_at:u.expires_at?Math.floor(new Date(u.expires_at).getTime()/1e3):null,fallback_mode:u.fallback_mode,backup_proxy_id:u.fallback_mode==="proxy"?u.backup_proxy_id:null,expiry_warn_days:u.expiry_warn_days};$.value&&(r.password=u.password.trim()),await q.proxies.update(Q.value.id,r),h.showSuccess(s("admin.proxies.proxyUpdated")),Ue(),D()}catch(r){h.showError(((e=(t=r.response)==null?void 0:t.data)==null?void 0:e.detail)||s("admin.proxies.failedToUpdate")),console.error("Error updating proxy:",r)}finally{E.value=!1}}},we=(t,e)=>{const r=I.value.find(d=>d.id===t);r&&(e.success?(r.latency_status="success",r.latency_ms=e.latency_ms,r.ip_address=e.ip_address,r.country=e.country,r.country_code=e.country_code,r.region=e.region,r.city=e.city):(r.latency_status="failed",r.latency_ms=void 0,r.ip_address=void 0,r.country=void 0,r.country_code=void 0,r.region=void 0,r.city=void 0),r.latency_message=e.message)},qt=t=>t.challenge_count>0?"challenge":t.failed_count>0?"failed":t.warn_count>0?"warn":"healthy",We=(t,e)=>{const r=I.value.find(d=>d.id===t);r&&(r.quality_status=qt(e),r.quality_score=e.score,r.quality_grade=e.grade,r.quality_summary=e.summary,r.quality_checked=e.checked_at)},Ke=t=>
2[t.country,t.city].filter(Boolean).join(" · "),It=t=>`https://unpkg.com/flag-icons/flags/4x3/${t.toLowerCase()}.svg`,Ut=t=>{re.value=new Set([...re.value,t])},zt=t=>{const e=new Set(re.value);e.delete(t),re.value=e},Ge=t=>{ne.value=new Set([...ne.value,t])},Ye=t=>{const e=new Set(ne.value);e.delete(t),ne.value=e},Je=async(t,e)=>{var r,d;Ut(t);try{const o=await q.proxies.testProxy(t);if(we(t,o),e)if(o.success){const i=o.latency_ms?s("admin.proxies.proxyWorkingWithLatency",{latency:o.latency_ms}):s("admin.proxies.proxyWorking");h.showSuccess(i)}else h.showError(o.message||s("admin.proxies.proxyTestFailed"));return o}catch(o){const i=((d=(r=o.response)==null?void 0:r.data)==null?void 0:d.detail)||s("admin.proxies.failedToTest");return we(t,{success:!1,message:i}),e&&h.showError(i),console.error("Error testing proxy:",o),null}finally{zt(t)}},At=async t=>{await Je(t.id,!0)},Mt=async t=>{var e,r;Ge(t.id);try{const d=await q.proxies.checkProxyQuality(t.id);qe.value=t,U.value=d,Ve.value=!0;const o=d.items.find(i=>i.target==="base_connectivity");o&&o.status==="pass"&&we(t.id,{success:!0,latency_ms:d.base_latency_ms,message:d.summary,ip_address:d.exit_ip,country:d.country,country_code:d.country_code}),We(t.id,d),h.showSuccess(s("admin.proxies.qualityCheckDone",{score:d.score,grade:d.grade}))}catch(d){const o=((r=(e=d.response)==null?void 0:e.data)==null?void 0:r.detail)||s("admin.proxies.qualityCheckFailed");h.showError(o),console.error("Error checking proxy quality:",d)}finally{Ye(t.id)}},Bt=async t=>{if(t.length===0)return{total:0,healthy:0,warn:0,challenge:0,failed:0};const e=3;let r=0,d=0,o=0,i=0,w=0;const L=async()=>{for(;r<t.length;){const j=t[r];r++,Ge(j);try{const z=await q.proxies.checkProxyQuality(j);if(I.value.find(Se=>Se.id===j)){const Se=z.items.find(ia=>ia.target==="base_connectivity");Se&&Se.status==="pass"&&we(j,{success:!0,latency_ms:z.base_latency_ms,message:z.summary,ip_address:z.exit_ip,country:z.country,country_code:z.country_code})}We(j,z),z.challenge_count>0?i++:z.failed_count>0?w++:z.warn_count>0?o++:d++}catch{w++}finally{Ye(j)}}},Be=Array.from({length:Math.min(e,t.length)},()=>L());return await Promise.all(Be),{total:t.length,healthy:d,warn:o,challenge:i,failed:w}},Xe=()=>{Ve.value=!1,qe.value=null,U.value=null},Ft=t=>t==="pass"?"badge-success":t==="warn"?"badge-warning":"badge-danger",Rt=t=>s(t==="pass"?"admin.proxies.qualityStatusPass":t==="warn"?"admin.proxies.qualityStatusWarn":t==="challenge"?"admin.proxies.qualityStatusChallenge":"admin.proxies.qualityStatusFail"),Ze=[7,30,90,180],Lt=t=>{const e=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),d=String(t.getDate()).padStart(2,"0");return`${e}-${r}-${d}`},et=t=>{const e=t?new Date(`${t}T00:00:00`):new Date;return e.setHours(0,0,0,0),e},Ce=(t,e)=>{const r=Number(e);if(!r||r<=0)return"";const d=et(t);return d.setDate(d.getDate()+r),Lt(d)},tt=(t,e)=>{if(!e)return null;const r=new Date(`${e}T00:00:00`);return Math.round((r.getTime()-et(t).getTime())/864e5)},ze=O(()=>{var t;return(t=Q.value)!=null&&t.created_at?Q.value.created_at.slice(0,10):""}),Ae=O({get:()=>tt("",m.expires_at),set:t=>{m.expires_at=Ce("",t)}}),Me=O({get:()=>tt(ze.value,u.expires_at),set:t=>{u.expires_at=Ce(ze.value,t)}}),jt=t=>{const{key:e,params:r}=fa(t.expires_at,t.status);return r?s(e,r):s(e)},Ht=t=>va(t.expires_at,t.status),Ot=t=>t==="healthy"?"badge-success":t==="warn"?"badge-warning":"badge-danger",Qt=t=>s(t==="healthy"?"admin.proxies.qualityStatusHealthy":t==="warn"?"admin.proxies.qualityStatusWarn":t==="challenge"?"admin.proxies.qualityStatusChallenge":"admin.proxies.qualityStatusFail"),Nt=t=>{switch(t){case"base_connectivity":return s("admin.proxies.qualityTargetBase");case"openai":return"OpenAI";case"anthropic":return"Anthropic";case"gemini":return"Gemini";case"grok":return"Grok";case"kimi":return"Kimi";case"zhipu":return"Zhipu GLM";case"deepseek":return"DeepSeek";case"minimax":return"MiniMax";default:return t}},at=async()=>{const e=[];let r=1,d=1;for(;r<=d;){const o=await q.proxies.list(r,200,{protocol:R.protocol||void 0,status:R.status,search:oe.value||void 0,sort_by:J.sort_by,sort_order:J.sort_order});e.push(...o.items),d=o.pages||1,r++}return e},Wt=async t=>{if(t.length===0)return;const e=5;let r=0;const d=async()=>{for(;r<t.length;){const i=t[r];r++,await Je(i,!1)}},o=Array.from({length:Math.min(e,t.length)},()=>d());await Promise.all(o)},Kt=async()=>{var t,e;if(!fe.value){fe.value=!0;try{let r=[];if(ee.value>0?r=Array.from(me.value):r=(await at()).map(o=>o.id),r.length===0){h.showInfo(s("admin.proxies.batchTestEmpty"));return}await Wt(r),h.showSuccess(s("admin.proxies.batchTestDone",{count:r.length})),D()}catch(r){h.showError(((e=(t=r.response)==null?void 0:t.data)==null?void 0:e.detail)||s("admin.proxies.batchTestFailed")),console.error("Error batch testing proxies:",r)}finally{fe.value=!1}}},Gt=async()=>{var t,e;if(!pe.value){pe.value=!0;try{let r=[];if(ee.value>0?r=Array.from(me.value):r=(await at()).map(i=>i.id),r.length===0){h.showInfo(s("admin.proxies.batchQualityEmpty"));return}const d=await Bt(r);h.showSuccess(s("admin.proxies.batchQualityDone",{count:d.total,healthy:d.healthy,warn:d.warn,challenge:d.challenge,failed:d.failed})),D()}catch(r){h.showError(((e=(t=r.response)==null?void 0:t.data)==null?void 0:e.detail)||s("admin.proxies.batchQualityFailed")),console.error("Error batch checking quality:",r)}finally{pe.value=!1}}},Yt=()=>{const t=new Date,e=r=>String(r).padStart(2,"0");return`${t.getFullYear()}${e(t.getMonth()+1)}${e(t.getDate())}${e(t.getHours())}${e(t.getMinutes())}${e(t.getSeconds())}`},Jt=async()=>
2{if(!Ee.value){Ee.value=!0;try{const t=await q.proxies.exportData(ee.value>0?{ids:Array.from(me.value)}:{filters:Qe()}),r=`sub2api-proxy-${Yt()}.json`,d=new Blob([JSON.stringify(t,null,2)],{type:"application/json"}),o=URL.createObjectURL(d),i=document.createElement("a");i.href=o,i.download=r,i.click(),URL.revokeObjectURL(o),h.showSuccess(s("admin.proxies.dataExported"))}catch(t){h.showError((t==null?void 0:t.message)||s("admin.proxies.dataExportFailed"))}finally{Ee.value=!1,_e.value=!1}}},Xt=t=>{if((t.account_count||0)>0){h.showError(s("admin.proxies.deleteBlockedInUse"));return}ie.value=t,ve.value=!0},Zt=()=>{ee.value!==0&&(ue.value=!0)},ea=async()=>{var t,e;if(ie.value)try{await q.proxies.delete(ie.value.id),h.showSuccess(s("admin.proxies.proxyDeleted")),ve.value=!1,xt([ie.value.id]),ie.value=null,D()}catch(r){h.showError(((e=(t=r.response)==null?void 0:t.data)==null?void 0:e.detail)||s("admin.proxies.failedToDelete")),console.error("Error deleting proxy:",r)}},ta=async()=>{var e,r,d,o;const t=Array.from(me.value);if(t.length===0){ue.value=!1;return}try{const i=await q.proxies.batchDelete(t),w=((e=i.deleted_ids)==null?void 0:e.length)||0,L=((r=i.skipped)==null?void 0:r.length)||0;w>0?h.showSuccess(s("admin.proxies.batchDeleteDone",{deleted:w,skipped:L})):L>0&&h.showInfo(s("admin.proxies.batchDeleteSkipped",{skipped:L})),mt(),ue.value=!1,D()}catch(i){h.showError(((o=(d=i.response)==null?void 0:d.data)==null?void 0:o.detail)||s("admin.proxies.batchDeleteFailed")),console.error("Error batch deleting proxies:",i)}},aa=async t=>{var e,r;De.value=t,xe.value=[],Te.value=!0,$e.value=!0;try{xe.value=await q.proxies.getProxyAccounts(t.id)}catch(d){h.showError(((r=(e=d.response)==null?void 0:e.data)==null?void 0:r.detail)||s("admin.proxies.accountsFailed")),console.error("Error loading proxy accounts:",d)}finally{Te.value=!1}},st=()=>{$e.value=!1,De.value=null,xe.value=[]};function sa(t){const e=t.username?encodeURIComponent(t.username):"",r=t.password?encodeURIComponent(t.password):"";return e&&r?`${e}:${r}@`:e?`${e}@`:r?`:${r}@`:""}function ot(t){return`${t.protocol}://${sa(t)}${t.host}:${t.port}`}function oa(t){const e=t.username||t.password,r=ot(t),d=[{label:r,value:r}];if(e){const o=r.replace(/^[^:]+:\/\//,"");d.push({label:o,value:o})}return d.push({label:`${t.host}:${t.port}`,value:`${t.host}:${t.port}`}),d}function la(t){se(ot(t),s("admin.proxies.urlCopied")),Y.value=null}function ra(t){Y.value=Y.value===t?null:t}function na(t){se(t,s("admin.proxies.urlCopied")),Y.value=null}function lt(){Y.value=null}return ca(()=>{D(),bt(),document.addEventListener("click",lt)}),ua(()=>{clearTimeout(Ie),N==null||N.abort(),document.removeEventListener("click",lt)}),(t,e)=>(c(),ye(pa,null,{default:v(()=>{var r,d;return[x(ma,null,{filters:v(()=>[a("div",La,[a("div",ja,[x(C,{name:"search",size:"md",class:"absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500"}),P(a("input",{"onUpdate:modelValue":e[0]||(e[0]=o=>oe.value=o),type:"text",placeholder:l(s)("admin.proxies.searchProxies"),class:"input pl-10",onInput:gt},null,40,Ha),[[V,oe.value]])]),a("div",Oa,[x(W,{modelValue:R.protocol,"onUpdate:modelValue":e[1]||(e[1]=o=>R.protocol=o),options:X.value,placeholder:l(s)("admin.proxies.allProtocols"),onChange:Ne},null,8,["modelValue","options","placeholder"])]),a("div",Qa,[x(W,{modelValue:R.status,"onUpdate:modelValue":e[2]||(e[2]=o=>R.status=o),options:G.value,placeholder:l(s)("admin.proxies.allStatus"),onChange:Ne},null,8,["modelValue","options","placeholder"])]),a("div",Na,[a("button",{onClick:D,disabled:F.value,class:"btn btn-secondary",title:l(s)("common.refresh")},[x(C,{name:"refresh",size:"md",class:A(F.value?"animate-spin":"")},null,8,["class"])],8,Wa),a("button",{onClick:Kt,disabled:fe.value||F.value,class:"btn btn-secondary",title:l(s)("admin.proxies.testConnection")},[x(C,{name:"play",size:"md",class:"mr-2"}),H(" "+n(l(s)("admin.proxies.testConnection")),1)],8,Ka),a("button",{onClick:Gt,disabled:pe.value||F.value,class:"btn btn-secondary",title:l(s)("admin.proxies.batchQualityCheck")},[x(C,{name:"shield",size:"md",class:A(["mr-2",pe.value?"animate-pulse":""])},null,8,["class"]),H(" "+n(l(s)("admin.proxies.batchQualityCheck")),1
2)],8,Ga),a("button",{onClick:Zt,disabled:l(ee)===0,class:"btn btn-danger",title:l(s)("admin.proxies.batchDeleteAction")},[x(C,{name:"trash",size:"md",class:"mr-2"}),H(" "+n(l(s)("admin.proxies.batchDeleteAction")),1)],8,Ya),a("button",{onClick:e[3]||(e[3]=o=>be.value=!0),class:"btn btn-secondary"},n(l(s)("admin.proxies.dataImport")),1),a("button",{onClick:e[4]||(e[4]=o=>_e.value=!0),class:"btn btn-secondary"},n(l(ee)>0?l(s)("admin.proxies.dataExportSelected"):l(s)("admin.proxies.dataExport")),1),a("button",{onClick:e[5]||(e[5]=o=>le.value=!0),class:"btn btn-primary"},[x(C,{name:"plus",size:"md",class:"mr-2"}),H(" "+n(l(s)("admin.proxies.createProxy")),1)])])])]),table:v(()=>[a("div",{ref_key:"proxyTableRef",ref:Re,class:"flex min-h-0 flex-1 flex-col overflow-hidden"},[x(xa,{columns:g.value,data:I.value,loading:F.value,"server-side-sort":!0,"default-sort-key":"id","default-sort-order":"desc",onSort:Ct},{"header-select":v(()=>[a("input",{type:"checkbox",class:"h-4 w-4 cursor-pointer rounded border-gray-300 text-primary-600 focus:ring-primary-500",checked:l(ut),onClick:e[6]||(e[6]=K(()=>{},["stop"])),onChange:e[7]||(e[7]=o=>ft(o))},null,40,Ja)]),"cell-select":v(({row:o})=>[a("input",{type:"checkbox",class:"h-4 w-4 cursor-pointer rounded border-gray-300 text-primary-600 focus:ring-primary-500",checked:l(me).has(o.id),onClick:e[8]||(e[8]=K(()=>{},["stop"])),onChange:i=>_t(o.id,i)},null,40,Xa)]),"cell-name":v(({value:o})=>[a("span",Za,n(o),1)]),"cell-protocol":v(({value:o})=>[o?(c(),p("span",{key:0,class:A(["badge",o.startsWith("socks5")?"badge-primary":"badge-gray"])},n(o.toUpperCase()),3)):(c(),p("span",es,"-"))]),"cell-address":v(({row:o})=>[a("div",ts,[a("code",as,n(o.host)+":"+n(o.port),1),a("div",ss,[a("button",{type:"button",class:"rounded p-0.5 text-gray-400 hover:text-primary-600 dark:hover:text-primary-400",title:l(s)("admin.proxies.copyProxyUrl"),onClick:K(i=>la(o),["stop"]),onContextmenu:K(i=>ra(o.id),["prevent"])},[x(C,{name:"copy",size:"sm"})],40,os),Y.value===o.id?(c(),p("div",ls,[(c(!0),p(de,null,ce(oa(o),i=>(c(),p("button",{key:i.label,class:"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs hover:bg-gray-100 dark:hover:bg-dark-600",onClick:K(w=>na(i.value),["stop"])},[a("span",ns,n(i.label),1)],8,rs))),128))])):f("",!0)])])]),"cell-auth":v(({row:o})=>[o.username||o.password?(c(),p("div",is,[a("div",ds,[o.username?(c(),p("span",cs,n(o.username),1)):f("",!0),o.password?(c(),p("span",us,n(B.has(o.id)?o.password:"â¢â¢â¢â¢â¢â¢"),1)):f("",!0)]),o.password?(c(),p("button",{key:0,type:"button",class:"ml-1 rounded p-0.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",onClick:K(i=>B.has(o.id)?B.delete(o.id):B.add(o.id),["stop"])},[x(C,{name:B.has(o.id)?"eyeOff":"eye",size:"sm"},null,8,["name"])],8,ps)):f("",!0)])):(c(),p("span",ms,"-"))]),"cell-location":v(({row:o})=>[a("div",xs,[o.country_code?(c(),p("img",{key:0,src:It(o.country_code),alt:o.country||o.country_code,class:"h-4 w-6 rounded-sm"},null,8,ys)):f("",!0),Ke(o)?(c(),p("span",hs,n(Ke(o)),1)):(c(),p("span",bs,"-"))])]),"cell-account_count":v(({row:o,value:i})=>[(i||0)>0?(c(),p("button",{key:0,type:"button",class:"inline-flex items-center rounded bg-gray-100 px-2 py-0.5 text-xs font-medium text-primary-700 hover:bg-gray-200 dark:bg-dark-600 dark:text-primary-300 dark:hover:bg-dark-500",onClick:w=>aa(o)},n(l(s)("admin.groups.accountsCount",{count:i||0})),9,vs)):(c(),p("span",_s,n(l(s)("admin.groups.accountsCount",{count:0})),1))]),"cell-latency":v(({row:o})=>[a("div",fs,[o.latency_status==="failed"?(c(),p("span",{key:0,class:"badge badge-danger",title:o.latency_message||void 0},n(l(s)("admin.proxies.latencyFailed")),9,gs)):typeof o.latency_ms=="number"?(c(),p("span",{key:1,class:A(["badge",o.latency_ms<200?"badge-success":"badge-warning"])},n(o.latency_ms)+"ms ",3)):(c(),p("span",ks,"-")),typeof o.quality_checked=="number"?(c(),p("div",{key:3,class:"flex items-center gap-1 text-xs text-gray-500 dark:text-gray-400",title:o.quality_summary||void 0},[a("span",null,n(l(s)("admin.proxies.qualityInline",{grade:o.quality_grade||"-",score:o.quality_score??"-"})),1),a("span",{class:A(["badge",Ot(o.quality_status)])},n(Qt(o.quality_status)),3)],8,ws)):f("",!0)])]),"cell-expiry":v(({row:o})=>[o.expires_at?(c(),p("div",Ss,[a("span",Ps,n(l(nt)(o.expires_at)),1),a("span",{class:A(Ht(o))},n(jt(o)),3)])):(c(),p("span",Cs,n(l(s)("admin.proxies.neverExpires")),1))]),"cell-created_at":v(({row:o})=>[a("span",$s,n(l(nt)(o.created_at)),1)]),"cell-status":v(({value:o})=>[a("span",{class:A(["badge",o==="active"?"badge-success":"badge-danger"])},n(l(s)("admin.accounts.status."+o)),3)]),"cell-actions":v(({row:o})=>[a("div",Es,[a("button",{onClick:i=>At(o),disabled:re.value.has(o.id),class:"flex flex-col items-center gap-0.5 rounded-lg p-1.5 text-gray-500 transition-colors hover:bg-emerald-50 hover:text-emerald-600 disabled:cursor-not-allowed disabled:opacity-50 dark:hover:bg-emerald-900/20 dark:hover:text-emerald-400"},[re.value.has(o.id)?(c(),p("svg",Ts,[...e[41]||(e[41]=[a("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),a("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):(c(),ye(C,{key:1,name:"checkCircle",size:"sm"}
2)),a("span",Vs,n(l(s)("admin.proxies.testConnection")),1)],8,Ds),a("button",{onClick:i=>Mt(o),disabled:ne.value.has(o.id),class:"flex flex-col items-center gap-0.5 rounded-lg p-1.5 text-gray-500 transition-colors hover:bg-blue-50 hover:text-blue-600 disabled:cursor-not-allowed disabled:opacity-50 dark:hover:bg-blue-900/20 dark:hover:text-blue-400"},[ne.value.has(o.id)?(c(),p("svg",Is,[...e[42]||(e[42]=[a("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),a("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):(c(),ye(C,{key:1,name:"shield",size:"sm"})),a("span",Us,n(l(s)("admin.proxies.qualityCheck")),1)],8,qs),a("button",{onClick:i=>Tt(o),class:"flex flex-col items-center gap-0.5 rounded-lg p-1.5 text-gray-500 transition-colors hover:bg-gray-100 hover:text-primary-600 dark:hover:bg-dark-700 dark:hover:text-primary-400"},[x(C,{name:"edit",size:"sm"}),a("span",As,n(l(s)("common.edit")),1)],8,zs),a("button",{onClick:i=>Xt(o),class:"flex flex-col items-center gap-0.5 rounded-lg p-1.5 text-gray-500 transition-colors hover:bg-red-50 hover:text-red-600 dark:hover:bg-red-900/20 dark:hover:text-red-400"},[x(C,{name:"trash",size:"sm"}),a("span",Bs,n(l(s)("common.delete")),1)],8,Ms)])]),empty:v(()=>[x(ha,{title:l(s)("admin.proxies.noProxiesYet"),description:l(s)("admin.proxies.createFirstProxy"),"action-text":l(s)("admin.proxies.createProxy"),onAction:e[9]||(e[9]=o=>le.value=!0)},null,8,["title","description","action-text"])]),_:1},8,["columns","data","loading"])],512)]),pagination:v(()=>[S.total>0?(c(),ye(ya,{key:0,page:S.page,total:S.total,"page-size":S.page_size,"onUpdate:page":kt,"onUpdate:pageSize":wt},null,8,["page","total","page-size"])):f("",!0)]),_:1}),x(he,{show:le.value,title:l(s)("admin.proxies.createProxy"),width:"normal",onClose:ke},{footer:v(()=>[a("div",fo,[a("button",{onClick:ke,type:"button",class:"btn btn-secondary"},n(l(s)("common.cancel")),1),te.value==="standard"?(c(),p("button",{key:0,type:"submit",form:"create-proxy-form",disabled:E.value,class:"btn btn-primary"},[E.value?(c(),p("svg",ko,[...e[45]||(e[45]=[a("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),a("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):f("",!0),H(" "+n(E.value?l(s)("admin.proxies.creating"):l(s)("common.create")),1)],8,go)):(c(),p("button",{key:1,onClick:Et,type:"button",disabled:E.value||k.valid===0,class:"btn btn-primary"},[E.value?(c(),p("svg",Co,[...e[46]||(e[46]=[a("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),a("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):f("",!0),H(" "+n(E.value?l(s)("admin.proxies.importing"):l(s)("admin.proxies.importProxies",{count:k.valid})),1)],8,wo))])]),default:v(()=>[a("div",Fs,[a("div",Rs,[a("button",{type:"button",onClick:e[10]||(e[10]=o=>te.value="standard"),class:A(["-mb-px border-b-2 px-4 py-2 text-sm font-medium transition-colors",te.value==="standard"?"border-primary-500 text-primary-600 dark:text-primary-400":"border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"])},[x(C,{name:"plus",size:"sm",class:"mr-1.5 inline"}),H(" "+n(l(s)("admin.proxies.standardAdd")),1)],2),a("button",{type:"button",onClick:e[11]||(e[11]=o=>te.value="batch"),class:A(["-mb-px border-b-2 px-4 py-2 text-sm font-medium transition-colors",te.value==="batch"?"border-primary-500 text-primary-600 dark:text-primary-400":"border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"])},[e[43]||(e[43]=a("svg",{class:"mr-1.5 inline h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"1.5"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M3.75 12h16.5m-16.5 3.75h16.5M3.75 19.5h16.5M5.625 4.5h12.75a1.875 1.875 0 010 3.75H5.625a1.875 1.875 0 010-3.75z"})],-1)),H(" "+n(l(s)("admin.proxies.batchAdd")),1)],2)]),x(_a)]),te.value==="standard"?(c(),p("form",{key:0,id:"create-proxy-form",onSubmit:K(Dt,["prevent"]),class:"space-y-5"},[a("div",null,[a("label",Ls,n(l(s)("admin.proxies.name")),1),P(a("input",{"onUpdate:modelValue":e[12]||(e[12]=o=>m.name=o),type:"text",required:"",class:"input",placeholder:l(s)("admin.proxies.enterProxyName")},null,8,js),[[V,m.name]])]),a("div",null,[a("label",Hs,n(l(s)("admin.proxies.protocol")),1),x(W,{modelValue:m.protocol,"onUpdate:modelValue":e[13]||(e[13]=o=>m.protocol=o),options:M.value},null,8,["modelValue","options"])]),a("div",Os,[a("div",null,[a("label",Qs,n(l(s)("admin.proxies.host")),1),P(a("input",{"onUpdate:modelValue":e[14]||(e[14]=o=>m.host=o),type:"text",required:"",placeholder:l(s)("admin.proxies.form.hostPlaceholder"),class:"input"},null,8,Ns),[[V,m.host]])]),a("div",null,[a("label",Ws,n(l(s)("admin.proxies.port")),1),P(a("input",{"onUpdate:modelValue":e[15]||(e[15]=o=>m.port=o),type:"number",required:"",min:"1",max:"65535",placeholder:l(s)("admin.proxies.form.portPlaceholder"),class:"input"},null,8,Ks),[[V,m.port,void 0,{number:!0}]])])]),a("div",null,[a("label",Gs,n(l(s)("admin.proxies.username")),1),P(a("input",{"onUpdate:modelValue":e[16]||(e[16]=o=>m.username=o),type:"text",class:"input",placeholder:l(s)("admin.proxies.optionalAuth")},null,8,Ys),[[V,m.username]])]),a("div",null,[a("label",Js,n(l(s)("admin.proxies.password")),1),a("div",Xs,[P(a("input",{"onUpdate:modelValue":e[17]||(e[17]=o=>m.password=o),type:b.value?"text":"password",class:"input pr-10",placeholder:l(s)("admin.proxies.optionalAuth")},null,8,Zs),[[rt,m.password]]),a("button",{type:"button",class:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",onClick:e[18]||(e[18]=o=>b.value=!b.value)},[x(C,{name:b.value?"eyeOff":"eye",size:"md"},null,8,["name"])])])]),a("div",null,[a("label",eo,n(l(s)("admin.proxies.expiresAt")),1),a("div",to,[(c(),p(de,null,ce(Ze,o=>a("button",{key:o,type:"button",class:A(["btn btn-sm",m.expires_at===Ce("",o)?"btn-primary":"btn-secondary"]),onClick:i=>Ae.value=o},n(l(s)("admin.proxies.nDays",{days:o})),11,ao)),64))]),P(a("input",{"onUpdate:modelValue":e[19]||(e[19]=o=>Ae.value=o),type:"number",min:"0",class:"input mb-2",placeholder:l(s)("admin.proxies.expiryDaysPlaceholder")},null,8,so),[[V,Ae.value,void 0,{number:!0}]]),P(a("input",{"onUpdate:modelValue":e[20]||(e[20]=o=>m.expires_at=o),type:"date",max:"9999-12-31",class:"input"},null,512),[[V,m.expires_at]])]),a("div",null,[a("label",oo,n(l(s)("admin.proxies.fallbackMode")),1),x(W,{modelValue:m.fallback_mode,"onUpdate:modelValue":e[21]||(e[21]=o=>m.fallback_mode=o),options:[{label:l(s)("admin.proxies.fallbackNone"),value:"none"},{label:l(s)("admin.proxies.fallbackProxy"),value:"proxy"},{label:l(s)("admin.proxies.fallbackDirect"),value:"direct"}]},null,8,["modelValue","options"])]),m.fallback_mode==="proxy"?(c(),p("div",lo,[a("label",ro,n(l(s)("admin.proxies.backupProxy")),1),x(W,{modelValue:m.backup_proxy_id,"onUpdate:modelValue":e[22]||(e[22]=o=>m.backup_proxy_id=o),options:Oe()},null,8,["modelValue","options"])])):f("",!0)],32)):(c(),p("div",no,[a("div",null,[a("label",io,n(l(s)("admin.proxies.batchInput")),1),P(a("textarea",{"onUpdate:modelValue":e[23]||(e[23]=o=>ge.value=o),rows:"10",class:"input font-mono text-sm",placeholder:l(s)("admin.proxies.batchInputPlaceholder"),onInput:$t},null,40,co),[[V,ge.value]]),a("p",uo,n(l(s)("admin.proxies.batchInputHint")),1)]),k.total>0?(c(),p("div",po,[a("div",mo,[a("div",xo,[x(C,{name:"checkCircle",size:"sm","stroke-width":2,class:"text-primary-500"}),a("span",yo,n(l(s)("admin.proxies.parsedCount",{count:k.valid})),1)]),k.invalid>0?(c(),p("div",ho,[x(C,{name:"exclamationCircle",size:"sm","stroke-width":2,class:"text-amber-500"}),a("span",bo,n(l(s)("admin.proxies.invalidCount",{count:k.invalid})),1)])):f("",!0),k.duplicate>0?(c(),p("div",vo,[e[44]||(e[44]=a("svg",{class:"h-4 w-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.7
25"})],-1)),a("span",_o,n(l(s)("admin.proxies.duplicateCount",{count:k.duplicate})),1)])):f("",!0)])])):f("",!0)]))]),_:1},8,["show","title"]),x(he,{show:T.value,title:l(s)("admin.proxies.editProxy"),width:"normal",onClose:Ue},{footer:v(()=>[a("div",jo,[a("button",{onClick:Ue,type:"button",class:"btn btn-secondary"},n(l(s)("common.cancel")),1),Q.value?(c(),p("button",{key:0,type:"submit",form:"edit-proxy-form",disabled:E.value,class:"btn btn-primary"},[E.value?(c(),p("svg",Oo,[...e[47]||(e[47]=[a("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),a("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):f("",!0),H(" "+n(E.value?l(s)("admin.proxies.updating"):l(s)("common.update")),1)],8,Ho)):f("",!0)])]),default:v(()=>{var o;return[Q.value?(c(),p("form",{key:0,id:"edit-proxy-form",onSubmit:K(Vt,["prevent"]),class:"space-y-5"},[a("div",null,[a("label",So,n(l(s)("admin.proxies.name")),1),P(a("input",{"onUpdate:modelValue":e[24]||(e[24]=i=>u.name=i),type:"text",required:"",class:"input"},null,512),[[V,u.name]])]),a("div",null,[a("label",Po,n(l(s)("admin.proxies.protocol")),1),x(W,{modelValue:u.protocol,"onUpdate:modelValue":e[25]||(e[25]=i=>u.protocol=i),options:M.value},null,8,["modelValue","options"])]),a("div",$o,[a("div",null,[a("label",Eo,n(l(s)("admin.proxies.host")),1),P(a("input",{"onUpdate:modelValue":e[26]||(e[26]=i=>u.host=i),type:"text",required:"",class:"input"},null,512),[[V,u.host]])]),a("div",null,[a("label",Do,n(l(s)("admin.proxies.port")),1),P(a("input",{"onUpdate:modelValue":e[27]||(e[27]=i=>u.port=i),type:"number",required:"",min:"1",max:"65535",class:"input"},null,512),[[V,u.port,void 0,{number:!0}]])])]),a("div",null,[a("label",To,n(l(s)("admin.proxies.username")),1),P(a("input",{"onUpdate:modelValue":e[28]||(e[28]=i=>u.username=i),type:"text",class:"input"},null,512),[[V,u.username]])]),a("div",null,[a("label",Vo,n(l(s)("admin.proxies.password")),1),a("div",qo,[P(a("input",{"onUpdate:modelValue":e[29]||(e[29]=i=>u.password=i),type:_.value?"text":"password",placeholder:l(s)("admin.proxies.leaveEmptyToKeep"),class:"input pr-10",onInput:e[30]||(e[30]=i=>$.value=!0)},null,40,Io),[[rt,u.password]]),a("button",{type:"button",class:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",onClick:e[31]||(e[31]=i=>_.value=!_.value)},[x(C,{name:_.value?"eyeOff":"eye",size:"md"},null,8,["name"])])])]),a("div",null,[a("label",Uo,n(l(s)("admin.proxies.status")),1),x(W,{modelValue:u.status,"onUpdate:modelValue":e[32]||(e[32]=i=>u.status=i),options:Z.value},null,8,["modelValue","options"])]),a("div",null,[a("label",zo,n(l(s)("admin.proxies.expiresAt")),1),a("div",Ao,[(c(),p(de,null,ce(Ze,i=>a("button",{key:i,type:"button",class:A(["btn btn-sm",u.expires_at===Ce(ze.value,i)?"btn-primary":"btn-secondary"]),onClick:w=>Me.value=i},n(l(s)("admin.proxies.nDays",{days:i})),11,Mo)),64))]),P(a("input",{"onUpdate:modelValue":e[33]||(e[33]=i=>Me.value=i),type:"number",min:"0",class:"input mb-2",placeholder:l(s)("admin.proxies.expiryDaysPlaceholder")},null,8,Bo),[[V,Me.value,void 0,{number:!0}]]),P(a("input",{"onUpdate:modelValue":e[34]||(e[34]=i=>u.expires_at=i),type:"date",max:"9999-12-31",class:"input"},null,512),[[V,u.expires_at]])]),a("div",null,[a("label",Fo,n(l(s)("admin.proxies.fallbackMode")),1),x(W,{modelValue:u.fallback_mode,"onUpdate:modelValue":e[35]||(e[35]=i=>u.fallback_mode=i),options:[{label:l(s)("admin.proxies.fallbackNone"),value:"none"},{label:l(s)("admin.proxies.fallbackProxy"),value:"proxy"},{label:l(s)("admin.proxies.fallbackDirect"),value:"direct"}]},null,8,["modelValue","options"])]),u.fallback_mode==="proxy"?(c(),p("div",Ro,[a("label",Lo,n(l(s)("admin.proxies.backupProxy")),1),x(W,{modelValue:u.backup_proxy_id,"onUpdate:modelValue":e[36]||(e[36]=i=>u.backup_proxy_id=i),options:Oe((o=Q.value)==null?void 0:o.id)},null,8,["modelValue","options"])])):f("",!0)],32)):f("",!0)]}),_:1},8,["show","title"]),x(Fe,{show:ve.value,title:l(s)("admin.proxies.deleteProxy"),message:l(s)("admin.proxies.deleteConfirm",{name:(r=ie.value)==null?void 0:r.name}),"confirm-text":l(s)("common.delete"),"cancel-text":l(s)("common.cancel"),danger:!0,onConfirm:ea,onCancel:e[37]||(e[37]=o=>ve.value=!1)},null,8,["show","title","message","confirm-text","cancel-text"]),x(Fe,{show:ue.value,title:l(s)("admin.proxies.batchDelete"),message:l(s)("admin.proxies.batchDeleteConfirm",{count:l(ee)}),"confirm-text":l(s)("common.delete"),"cancel-text":l(s)("common.cancel"),danger:!0,onConfirm:ta,onCancel:e[38]||(e[38]=o=>ue.value=!1)},null,8,["show","title","message","confirm-text","cancel-text"]),x(Fe,{show:_e.value,title:l(s)("admin.proxies.dataExport"),message:l(s)("admin.proxies.dataExportConfirmMessage"),"confirm-text":l(s)("admin.proxies.dataExportConfirm"),"cancel-text":l(s)("common.cancel"),onConfirm:Jt,onCancel:e[39]||(e[39]=o=>_e.value=!1)},null,8,["show","title","message","confirm-text","cancel-text"]),x(Ra,{show:be.value,onClose:e[40]||(e[40]=o=>be.value=!1),onImported:St},null,8,["show"]),x(he,{show:Ve.value,title:l(s)("admin.proxies.qualityReportTitle"),width:"normal",onClose:Xe},{footer:v(()=>[a("div",xl,[a("button",{onClick:Xe,class:"btn btn-secondary"},n(l(s)("common.close")),1)])]),default:v(()=>{var o;return[U.value?(c(),p("div",Qo,[a("div",No,[a("div",Wo,[a("div",null,[a("div",Ko,n(((o=qe.value)==null?void 0:o.name)||"-"),1),a("div",Go,n(U.value.summary),1)]),a("div",Yo,[a("div",Jo,n(U.value.score),1),a("div",Xo,n(l(s)("admin.proxies.qualityGrade",{grade:U.value.grade})),1)])]),a("div",Zo,[a("div",null,n(l(s)("admin.proxies.qualityExitIP"))+": "+n(U.value.exit_ip||"-"),1),a("div",null,n(l(s)("admin.proxies.qualityCountry"))+": "+n(U.value.country||"-"),1),a("div",null,n(l(s)("admin.proxies.qualityBaseLatency"))+": "+n(typeof U.value.base_latency_ms=="number"?`${U.value.base_latency_ms}ms`:"-"),1),a("div",null,n(l(s)("admin.proxies.qualityCheckedAt"))+": "+n(new Date(U.value.checked_at*1e3).toLocaleStr
2ing()),1)])]),a("div",el,[a("table",tl,[a("thead",al,[a("tr",null,[a("th",sl,n(l(s)("admin.proxies.qualityTableTarget")),1),a("th",ol,n(l(s)("admin.proxies.qualityTableStatus")),1),e[48]||(e[48]=a("th",{class:"whitespace-nowrap px-3 py-2 text-left"},"HTTP",-1)),a("th",ll,n(l(s)("admin.proxies.qualityTableLatency")),1),a("th",rl,n(l(s)("admin.proxies.qualityTableMessage")),1)])]),a("tbody",nl,[(c(!0),p(de,null,ce(U.value.items,i=>(c(),p("tr",{key:i.target},[a("td",il,n(Nt(i.target)),1),a("td",dl,[a("span",{class:A(["badge whitespace-nowrap",Ft(i.status)])},n(Rt(i.status)),3)]),a("td",cl,n(i.http_status??"-"),1),a("td",ul,n(typeof i.latency_ms=="number"?`${i.latency_ms}ms`:"-"),1),a("td",pl,[a("span",null,n(i.message||"-"),1),i.cf_ray?(c(),p("span",ml,"(cf-ray: "+n(i.cf_ray)+")",1)):f("",!0)])]))),128))])])])])):f("",!0)]}),_:1},8,["show","title"]),x(he,{show:$e.value,title:l(s)("admin.proxies.accountsTitle",{name:((d=De.value)==null?void 0:d.name)||""}),width:"normal",onClose:st},{footer:v(()=>[a("div",$l,[a("button",{onClick:st,class:"btn btn-secondary"},n(l(s)("common.close")),1)])]),default:v(()=>[Te.value?(c(),p("div",yl,[x(C,{name:"refresh",size:"md",class:"mr-2 animate-spin"}),H(" "+n(l(s)("common.loading")),1)])):xe.value.length===0?(c(),p("div",hl,n(l(s)("admin.proxies.accountsEmpty")),1)):(c(),p("div",bl,[a("table",vl,[a("thead",_l,[a("tr",null,[a("th",fl,n(l(s)("admin.proxies.accountName")),1),a("th",gl,n(l(s)("admin.accounts.columns.platformType")),1),a("th",kl,n(l(s)("admin.proxies.accountNotes")),1)])]),a("tbody",wl,[(c(!0),p(de,null,ce(xe.value,o=>(c(),p("tr",{key:o.id},[a("td",Cl,n(o.name),1),a("td",Sl,[x(ga,{platform:o.platform,type:o.type},null,8,["platform","type"])]),a("td",Pl,n(o.notes||"-"),1)]))),128))])])]))]),_:1},8,["show","title"])]}),_:1}))}});export{Gl as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.