PageSourceSearch

https://soloapp.cn/assets/ProxiesView-B_IpWHQq.js

js soloapp.cn collected 2026-10-02 01:21:53 UTC 51,368 bytes, 2 lines download raw bytes

1import{d as nt,r as h,c as L,w as ia,H as xe,u as l,J as v,B as a,z as p,D as _,G as n,F as ne,L as ie,V as W,C as c,q as ae,o as da,a as ca,k as x,A as U,R as E,W as V,K as R,a2 as lt}from"./vendor-vue-CNokyTVe.js";import{a as it,g as ye,k as q,_ as C,j as rt}from"./index-DP2Z749b.js";import{_ as ua}from"./AppLayout.vue_vue_type_script_setup_true_lang-DA3QqGQe.js";import{T as pa}from"./TablePageLayout-CavzqImL.js";import{D as ma}from"./DataTable-CSNQ-xLu.js";import{P as xa}from"./Pagination-BppI-mJq.js";import{_ as Fe}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-CmtphKkd.js";import{_ as ya}from"./EmptyState.vue_vue_type_script_setup_true_lang-qrSDwWZV.js";import{u as dt}from"./vendor-i18n-CJe1LeE7.js";import{S as N}from"./Select-S_YpYAoi.js";import{u as ha,p as ba,_ as va,a as _a,b as ga}from"./proxyExpiry-DurUljys.js";import{u as fa}from"./useClipboard-CR8lmECi.js";import{u as ka}from"./useTableSelection-6A4hJL3S.js";import{g as wa}from"./usePersistedPageSize-x0WpaIWh.js";import"./vendor-misc-CSmvsGIg.js";import"./AppHeader.vue_vue_type_style_index_0_scoped_e9be4349_lang-xG_yv2rf.js";import"./LocaleSwitcher-pcuQ_98X.js";/* empty css                                                                       */import"./PlatformIcon.vue_vue_type_script_setup_true_lang-BQDLGfe7.js";const Ca={class:"text-sm text-gray-600 dark:text-dark-300"},Sa={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"},Pa={class:"input-label"},$a={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"},Ea={class:"min-w-0"},Da={class:"truncate text-sm text-gray-700 dark:text-dark-200"},Ta={key:0,class:"space-y-2 rounded-xl border border-gray-200 p-4 dark:border-dark-700"},Va={class:"text-sm font-medium text-gray-900 dark:text-white"},qa={class:"text-sm text-gray-700 dark:text-dark-300"},Ia={key:0,class:"mt-2"},Ua={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"},za={class:"flex justify-end gap-3"},Ba=["disabled"],Ma=["disabled"],Fa=nt({__name:"ImportDataModal",props:{show:{type:Boolean}},emits:["close","imported"],setup(Pe,{emit:s}){const y=Pe,de=s,{t:k}=dt(),Y=it(),K=h(!1),G=h(null),X=h(null),A=h(null),Z=L(()=>{var b;return((b=G.value)==null?void 0:b.name)||""}),j=L(()=>{var b;return((b=X.value)==null?void 0:b.errors)||[]});ia(()=>y.show,b=>{b&&(G.value=null,X.value=null,A.value&&(A.value.value=""))});const H=()=>{var b;(b=A.value)==null||b.click()},se=b=>{var w;const P=b.target;G.value=((w=P.files)==null?void 0:w[0])||null},z=()=>{K.value||de("close")},D=async b=>{if(typeof b.text=="function")return b.text();if(typeof b.arrayBuffer=="function"){const P=await b.arrayBuffer();return new TextDecoder().decode(P)}return await new Promise((P,w)=>{const S=new FileReader;S.onload=()=>P(String(S.result??"")),S.onerror=()=>w(S.error||new Error("Failed to read file")),S.readAsText(b)})},J=async()=>{if(!G.value){Y.showError(k("admin.proxies.dataImportSelectFile"));return}K.value=!0;try{const b=await D(G.value),P=JSON.parse(b),w=await q.proxies.importData({data:P});X.value=w;const S={proxy_created:w.proxy_created,proxy_reused:w.proxy_reused,proxy_failed:w.proxy_failed};w.proxy_failed>0?Y.showError(k("admin.proxies.dataImportCompletedWithErrors",S)):(Y.showSuccess(k("admin.proxies.dataImportSuccess",S)),de("imported"))}catch(b){b instanceof SyntaxError?Y.showError(k("admin.proxies.dataImportParseFailed")):Y.showError((b==null?void 0:b.message)||k("admin.proxies.dataImportFailed"))}finally{K.value=!1}};return(b,P)=>(c(),xe(ye,{show:Pe.show,title:l(k)("admin.proxies.dataImportTitle"),width:"normal","close-on-click-outside":"",onClose:z},{footer:v(()=>[a("div",za,[a("button",{class:"btn btn-secondary",type:"button",disabled:K.value,onClick:z},n(l(k)("common.cancel")),9,Ba),a("button",{class:"btn btn-primary",type:"submit",form:"import-proxy-data-form",disabled:K.value},n(K.value?l(k)("admin.proxies.dataImporting"):l(k)("admin.proxies.dataImportButton")),9,Ma)])]),default:v(()=>[a("form",{id:"import-proxy-data-form",class:"space-y-4",onSubmit:W(J,["prevent"])},[a("div",Ca,n(l(k)("admin.proxies.dataImportHint")),1),a("div",Sa,n(l(k)("admin.proxies.dataImportWarning")),1),a("div",null,[a("label",Pa,n(l(k)("admin.proxies.dataImportFile")),1),a("div",$a,[a("div",Ea,[a("div",Da,n(Z.value||l(k)("admin.proxies.dataImportSelectFile")),1),P[0]||(P[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:H},n(l(k)("common.chooseFile")),1)]),a("input",{ref_key:"fileInput",ref:A,type:"file",class:"hidden",accept:"application/json,.json",onChange:se},null,544)]),X.value?(c(),p("div",Ta,[a("div",Va,n(l(k)("admin.proxies.dataImportResult")),1),a("div",qa,n(l(k)("admin.proxies.dataImportResultSummary",X.value)),1),j.value.length?(c(),p("div",Ia,[a("div",Ua,n(l(k)("admin.proxies.dataImportErrors")),1),a("div",Aa,[(c(!0),p(ne,null,ie(j.value,(w,S)=>(c(),p("div",{key:S,class:"whitespace-pre-wrap"},n(w.kind)+" "+n(w.name||w.proxy_key||"-")+" — "+n(w.message),1))),128))])])):_("",!0)])):_("",!0)],32)]),_:1},8,["show","title"]))}}),Ra={class:"flex flex-wrap items-center gap-3"},La={class:"relative w-full sm:w-64"},ja=["placeholder"],Ha={class:"w-full sm:w-40"},Oa={class:"w-full sm:w-36"},Qa={class:"flex flex-1 flex-wrap items-center justify-end gap-2"},Na=["disabled","title"],Wa=["disabled","title"],Ka=["disabled","title"],Ga=["disabled","title"],Ja=["checked"],Ya=["checked","onChange"],Xa={class:"font-medium text-gray-900 dark:text-white"},Za={key:1,class:"text-sm text-gray-400"},es={class:"flex items-center gap-1.5"},ts={class:"code text-xs"},as={class:"relative"},ss=["title","onClick","onContextmenu"],os={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"},ls=["onClick"],rs={class:"truncate font-mono text-gray-600 dark:text-gray-300"},ns={key:0,class:"flex items-center gap-1.5"},is={class:"flex flex-col text-xs"},ds={key:0,class:"text-gray-700 dark:text-gray-200"},cs={key:1,class:"font-mono text-gray-500 dark:text-gray-400"}
1,us=["onClick"],ps={key:1,class:"text-sm text-gray-400"},ms={class:"flex items-center gap-2"},xs=["src","alt"],ys={key:1,class:"text-sm text-gray-700 dark:text-gray-200"},hs={key:2,class:"text-sm text-gray-400"},bs=["onClick"],vs={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"},_s={class:"flex flex-col gap-1"},gs=["title"],fs={key:2,class:"text-sm text-gray-400"},ks=["title"],ws={key:0,class:"text-sm text-gray-400"},Cs={key:1,class:"flex flex-col text-xs"},Ss={class:"text-gray-700 dark:text-gray-200"},Ps={class:"text-xs text-gray-600 dark:text-gray-300"},$s={class:"flex items-center gap-1"},Es=["onClick","disabled"],Ds={key:0,class:"h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},Ts={class:"text-xs"},Vs=["onClick","disabled"],qs={key:0,class:"h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},Is={class:"text-xs"},Us=["onClick"],As={class:"text-xs"},zs=["onClick"],Bs={class:"text-xs"},Ms={class:"mb-6 flex items-center justify-between gap-3 border-b border-gray-200 dark:border-dark-600"},Fs={class:"flex min-w-0 shrink-0"},Rs={class:"input-label"},Ls=["placeholder"],js={class:"input-label"},Hs={class:"grid grid-cols-2 gap-4"},Os={class:"input-label"},Qs=["placeholder"],Ns={class:"input-label"},Ws=["placeholder"],Ks={class:"input-label"},Gs=["placeholder"],Js={class:"input-label"},Ys={class:"relative"},Xs=["type","placeholder"],Zs={class:"input-label"},eo={class:"mb-2 flex flex-wrap gap-2"},to=["onClick"],ao=["placeholder"],so={class:"input-label"},oo={key:0},lo={class:"input-label"},ro={key:1,class:"space-y-5"},no={class:"input-label"},io=["placeholder"],co={class:"input-hint mt-2"},uo={key:0,class:"rounded-lg bg-gray-50 p-4 dark:bg-dark-700"},po={class:"flex items-center gap-4 text-sm"},mo={class:"flex items-center gap-1.5"},xo={class:"text-gray-700 dark:text-gray-300"},yo={key:0,class:"flex items-center gap-1.5"},ho={class:"text-amber-600 dark:text-amber-400"},bo={key:1,class:"flex items-center gap-1.5"},vo={class:"text-gray-500 dark:text-gray-400"},_o={class:"flex justify-end gap-3"},go=["disabled"],fo={key:0,class:"-ml-1 mr-2 h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},ko=["disabled"],wo={key:0,class:"-ml-1 mr-2 h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},Co={class:"input-label"},So={class:"input-label"},Po={class:"grid grid-cols-2 gap-4"},$o={class:"input-label"},Eo={class:"input-label"},Do={class:"input-label"},To={class:"input-label"},Vo={class:"relative"},qo=["type","placeholder"],Io={class:"input-label"},Uo={class:"input-label"},Ao={class:"mb-2 flex flex-wrap gap-2"},zo=["onClick"],Bo=["placeholder"],Mo={class:"input-label"},Fo={key:0},Ro={class:"input-label"},Lo={class:"flex justify-end gap-3"},jo=["disabled"],Ho={key:0,class:"-ml-1 mr-2 h-4 w-4 animate-spin",fill:"none",viewBox:"0 0 24 24"},Oo={key:0,class:"space-y-4"},Qo={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-dark-600 dark:bg-dark-700"},No={class:"flex items-center justify-between gap-4"},Wo={class:"text-sm text-gray-500 dark:text-gray-400"},Ko={class:"mt-1 text-sm text-gray-700 dark:text-gray-200"},Go={class:"text-right"},Jo={class:"text-2xl font-semibold text-gray-900 dark:text-white"},Yo={class:"text-xs text-gray-500 dark:text-gray-400"},Xo={class:"mt-3 grid grid-cols-2 gap-2 text-xs text-gray-600 dark:text-gray-300"},Zo={class:"max-h-80 overflow-auto rounded-lg border border-gray-200 dark:border-dark-600"},el={class:"min-w-full divide-y divide-gray-200 text-sm dark:divide-dark-700"},tl={class:"bg-gray-50 text-xs uppercase text-gray-500 dark:bg-dark-800 dark:text-dark-400"},al={class:"whitespace-nowrap px-3 py-2 text-left"},sl={class:"whitespace-nowrap px-3 py-2 text-left"},ol={class:"whitespace-nowrap px-3 py-2 text-left"},ll={class:"px-3 py-2 text-left"},rl={class:"divide-y divide-gray-200 bg-white dark:divide-dark-700 dark:bg-dark-900"},nl={class:"whitespace-nowrap px-3 py-2 text-gray-900 dark:text-white"},il={class:"whitespace-nowrap px-3 py-2"},dl={class:"whitespace-nowrap px-3 py-2 text-gray-600 dark:text-gray-300"},cl={class:"whitespace-nowrap px-3 py-2 text-gray-600 dark:text-gray-300"},ul={class:"px-3 py-2 text-gray-600 dark:text-gray-300"},pl={key:0,class:"ml-1 text-xs text-gray-400"},ml={class:"flex justify-end"},xl={key:0,class:"flex items-center justify-center py-8 text-sm text-gray-500"},yl={key:1,class:"py-6 text-center text-sm text-gray-500"},hl={key:2,class:"max-h-80 overflow-auto"},bl={class:"min-w-full divide-y divide-gray-200 text-sm dark:divide-dark-700"},vl={class:"bg-gray-50 text-xs uppercase text-gray-500 dark:bg-dark-800 dark:text-dark-400"},_l={class:"px-4 py-2 text-left"},gl={class:"px-4 py-2 text-left"},fl={class:"px-4 py-2 text-left"},kl={class:"divide-y divide-gray-200 bg-white dark:divide-dark-700 dark:bg-dark-900"},wl={class:"px-4 py-2 font-medium text-gray-900 dark:text-white"},Cl={class:"px-4 py-2"},Sl={class:"px-4 py-2 text-gray-600 dark:text-gray-300"},Pl={class:"flex justify-end"},Wl=nt({__name:"ProxiesView",setup(Pe){const{t:s}=dt(),y=it(),{copyToClipboard:de}=fa(),k=L(()=>[{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}]),Y=L(()=>[{value:"",label:s("admin.proxies.allProtocols")},{value:"http",label:"HTTP"},{value:"https",label:"HTTPS"},{value:"socks5",label:"SOCKS5"},{value:"socks5h",label:"SOCKS5H"}]),K=L(()=>[{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")}]),G=L(()=>[{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")}]),X=L(()=>[{value:"active",label:s("admin.accounts.status.active")},{value:"inactive",label:s("admin.accounts.status.inactive")}]),A=h([]),Z=ae(new Set),j=h(null),H=h(!1),se=h(""),z=ae({protocol:"",status:""}),D=ae({page:1,page_size:wa(),total:0,pages:0}),J=ae({sort_by:"id",sort_order:"desc"}),b=h(!1),P=h(!1),w=h(!1),S=h(!1),he=h(!1),be=h(!1),ve=h(!1),ce=h(!1),_e=h(!1),$e=h(!1),T=h(!1),Ee=h(!1),oe=h(new Set),le=h(new Set),ge=h(!1),ue=h(!1),Re=h(null),{selectedSet:pe,selectedCount:ee,allVisibleSelected:ct,isSelected:ut,select:Le,deselect:je,clear:pt,removeMany:mt,toggleVisible:xt,batchUpdate:yt}=ka({rows:A,getId:t=>t.id});ha(Re,{isSelected:ut,select:Le,deselect:je,batchUpdate:yt});const De=h(null),me=h([]),Te=h(!1),O=h(null),re=h(null),Ve=h(!1),qe=h(null),I=h(null),te=h("standard"),fe=h(""),g=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=h([]),ht=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 Q=null;const bt=t=>{if(!t||typeof t!="object")return!1;const e=t;return e.name==="AbortError"||e.code==="ERR_CANCELED"},vt=(t,e)=>{if(e.target.checked){Le(t);return}je(t)},_t=t=>{const e=t.target;xt(e.checked)},Qe=()=>({protocol:z.protocol||void 0,status:z.status||void 0,search:se.value||void 0,sort_by:J.sort_by,sort_order:J.sort_order}),$=async()=>{Q&&Q.abort();const t=new AbortController;Q=t,H.value=!0;try{const e=await q.proxies.list(D.page,D.page_size,Qe(),{signal:t.signal});if(t.signal.aborted||Q!==t)return;A.value=e.items,D.total=e.total,D.pages=e.pages}catch(e){if(bt(e))return;y.showError(s("admin.proxies.failedToLoad")),console.error("Error loading proxies:",e)}finally{Q===t&&(H.value=!1,Q=null)}};let Ie;const gt=()=>{clearTimeout(Ie),Ie=setTimeout(()=>{D.page=1,$()},300)},ft=t=>{D.page=t,$()},kt=t=>{D.page_size=t,D.page=1,$()},wt=(t,e)=>{J.sort_by=t,J.sort_order=e,D.page=1,$()},ke=()=>{b.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,P.value=!1,fe.value="",g.total=0,g.valid=0,g.invalid=0,g.duplicate=0,g.proxies=[]},Ct=()=>{be.value=!1,$()},St=t=>{const e=t.trim();if(!e)return null;const r=/^(https?|socks5h?):\/\/(?:([^:@]+):([^@]+)@)?([^:]+):(\d+)$/i,d=e.match(r);if(!d)return null;const[,o,i,f,B,Me]=d,M=parseInt(Me,10);return M<1||M>65535?null:{protocol:o.toLowerCase(),host:B.trim(),port:M,username:(i==null?void 0:i.trim())||"",password:(f==null?void 0:f.trim())||""}},Pt=()=>{const t=fe.value.split(`
2`).filter(i=>i.trim()),e=new Set,r=[];let d=0,o=0;for(const i of t){const f=St(i);if(!f){d++;continue}const B=`${f.host}:${f.port}:${f.username}:${f.password}`;if(e.has(B)){o++;continue}e.add(B),r.push(f)}g.total=t.length,g.valid=r.length,g.invalid=d,g.duplicate=o,g.proxies=r},$t=async()=>{var t,e;if(g.valid!==0){T.value=!0;try{const r=await q.proxies.batchCreate(g.proxies),d=r.created||0,o=r.skipped||0;d>0?y.showSuccess(s("admin.proxies.batchImportSuccess",{created:d,skipped:o})):y.showInfo(s("admin.proxies.batchImportAllSkipped",{skipped:o})),ke(),$()}catch(r){y.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{T.value=!1}}},Et=async()=>{var t,e;if(!m.name.trim()){y.showError(s("admin.proxies.nameRequired"));return}if(!m.host.trim()){y.showError(s("admin.proxies.hostRequired"));return}if(m.port<1||m.port>65535){y.showError(s("admin.proxies.portInvalid"));return}T.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}),y.showSuccess(s("admin.proxies.proxyCreated")),ke(),$()}catch(r){y.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{T.value=!1}},Dt=t=>{O.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.
2status=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,S.value=!1,he.value=!1,w.value=!0},Ue=()=>{w.value=!1,O.value=null,S.value=!1,he.value=!1},Tt=async()=>{var t,e;if(O.value){if(!u.name.trim()){y.showError(s("admin.proxies.nameRequired"));return}if(!u.host.trim()){y.showError(s("admin.proxies.hostRequired"));return}if(u.port<1||u.port>65535){y.showError(s("admin.proxies.portInvalid"));return}T.value=!0;try{const r={name:u.name.trim(),protocol:u.protocol,host:u.host.trim(),port:u.port,username:u.username.trim()||null,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};he.value&&(r.password=u.password.trim()||null),await q.proxies.update(O.value.id,r),y.showSuccess(s("admin.proxies.proxyUpdated")),Ue(),$()}catch(r){y.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{T.value=!1}}},we=(t,e)=>{const r=A.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)},Vt=t=>t.challenge_count>0?"challenge":t.failed_count>0?"failed":t.warn_count>0?"warn":"healthy",Ne=(t,e)=>{const r=A.value.find(d=>d.id===t);r&&(r.quality_status=Vt(e),r.quality_score=e.score,r.quality_grade=e.grade,r.quality_summary=e.summary,r.quality_checked=e.checked_at)},We=t=>[t.country,t.city].filter(Boolean).join(" · "),qt=t=>`https://unpkg.com/flag-icons/flags/4x3/${t.toLowerCase()}.svg`,It=t=>{oe.value=new Set([...oe.value,t])},Ut=t=>{const e=new Set(oe.value);e.delete(t),oe.value=e},Ke=t=>{le.value=new Set([...le.value,t])},Ge=t=>{const e=new Set(le.value);e.delete(t),le.value=e},Je=async(t,e)=>{var r,d;It(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");y.showSuccess(i)}else y.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&&y.showError(i),console.error("Error testing proxy:",o),null}finally{Ut(t)}}
2,At=async t=>{await Je(t.id,!0)},zt=async t=>{var e,r;Ke(t.id);try{const d=await q.proxies.checkProxyQuality(t.id);qe.value=t,I.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}),Ne(t.id,d),y.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");y.showError(o),console.error("Error checking proxy quality:",d)}finally{Ge(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,f=0;const B=async()=>{for(;r<t.length;){const M=t[r];r++,Ke(M);try{const F=await q.proxies.checkProxyQuality(M);if(A.value.find(Se=>Se.id===M)){const Se=F.items.find(na=>na.target==="base_connectivity");Se&&Se.status==="pass"&&we(M,{success:!0,latency_ms:F.base_latency_ms,message:F.summary,ip_address:F.exit_ip,country:F.country,country_code:F.country_code})}Ne(M,F),F.challenge_count>0?i++:F.failed_count>0?f++:F.warn_count>0?o++:d++}catch{f++}finally{Ge(M)}}},Me=Array.from({length:Math.min(e,t.length)},()=>B());return await Promise.all(Me),{total:t.length,healthy:d,warn:o,challenge:i,failed:f}},Ye=()=>{Ve.value=!1,qe.value=null,I.value=null},Mt=t=>t==="pass"?"badge-success":t==="warn"?"badge-warning":"badge-danger",Ft=t=>s(t==="pass"?"admin.proxies.qualityStatusPass":t==="warn"?"admin.proxies.qualityStatusWarn":t==="challenge"?"admin.proxies.qualityStatusChallenge":"admin.proxies.qualityStatusFail"),Xe=[7,30,90,180],Rt=t=>{const e=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),d=String(t.getDate()).padStart(2,"0");return`${e}-${r}-${d}`},Ze=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=Ze(t);return d.setDate(d.getDate()+r),Rt(d)},et=(t,e)=>{if(!e)return null;const r=new Date(`${e}T00:00:00`);return Math.round((r.getTime()-Ze(t).getTime())/864e5)},Ae=L(()=>{var t;return(t=O.value)!=null&&t.created_at?O.value.created_at.slice(0,10):""}),ze=L({get:()=>et("",m.expires_at),set:t=>{m.expires_at=Ce("",t)}}),Be=L({get:()=>et(Ae.value,u.expires_at),set:t=>{u.expires_at=Ce(Ae.value,t)}}),Lt=t=>{const{key:e,params:r}=_a(t.expires_at,t.status);return r?s(e,r):s(e)},jt=t=>ba(t.expires_at,t.status),Ht=t=>t==="healthy"?"badge-success":t==="warn"?"badge-warning":"badge-danger",Ot=t=>s(t==="healthy"?"admin.proxies.qualityStatusHealthy":t==="warn"?"admin.proxies.qualityStatusWarn":t==="challenge"?"admin.proxies.qualityStatusChallenge":"admin.proxies.qualityStatusFail"),Qt=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";default:return t}},tt=async()=>{const e=[];let r=1,d=1;for(;r<=d;){const o=await q.proxies.list(r,200,{protocol:z.protocol||void 0,status:z.status,search:se.value||void 0,sort_by:J.sort_by,sort_order:J.sort_order});e.push(...o.items),d=o.pages||1,r++}return e},Nt=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)},Wt=async()=>{var t,e;if(!ge.value){ge.value=!0;try{let r=[];if(ee.value>0?r=Array.from(pe.value):r=(await tt()).map(o=>o.id),r.length===0){y.showInfo(s("admin.proxies.batchTestEmpty"));return}await Nt(r),y.showSuccess(s("admin.proxies.batchTestDone",{count:r.length})),$()}catch(r){y.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{ge.value=!1}}},Kt=async()=>{var t,e;if(!ue.value){ue.value=!0;try{let r=[];if(ee.value>0?r=Array.from(pe.value):r=(await tt()).map(i=>i.id),r.length===0){y.showInfo(s("admin.proxies.batchQualityEmpty"));return}const d=await Bt(r);y.showSuccess(s("admin.proxies.batchQualityDone",{count:d.total,healthy:d.healthy,warn:d.warn,challenge:d.challenge,failed:d.failed})),$()}catch(r){y.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{ue.value=!1}}},Gt=()=>{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(pe.value)}:{filters:Qe()}),r=`sub2api-proxy-${Gt()}.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),y.showSuccess(s("admin.proxies.dataExported"))}catch(t){y.showError((t==null?void 0:t.message)||s("admin.proxies.dataExportFailed"))}finally{Ee.value=!1,_e.value=!1}}},Yt=t=>{if((t.account_count||0)>0){y.showError(s("admin.proxies.deleteBlockedInUse"));return}re.value=t,ve.value=!0},Xt=()=>{ee.value!==0&&(ce.value=!0)},Zt=async()=>{var t,e;if(re.value)try{await q.proxies.delete(re.value.id),y.showSuccess(s("admin.proxies.proxyDeleted")),ve.value=!1,mt([re.value.id]),re.value=null,$()}catch(r){y.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)}},ea=async()=>{var e,r,d,o;const t=Array.from(pe.value);if(t.length===0){ce.value=!1;return}try{const i=await q.proxies.batchDelete(t),f=((e=i.deleted_ids)==null?void 0:e.length)||0,B=((r=i.skipped)==null?void 0:r.length)||0;f>0?y.showSuccess(s("admin.proxies.batchDeleteDone",{deleted:f,skipped:B})):B>0&&y.showInfo(s("admin.proxies.batchDeleteSkipped",{skipped:B})),pt(),ce.value=!1,$()}catch(i){y.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)}},ta=async t=>{var e,r;De.value=t,me.value=[],Te.value=!0,$e.value=!0;try{me.value=await q.proxies.getProxyAccounts(t.id)}catch(d){y.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}},at=()=>{$e.value=!1,De.value=null,me.value=[]};function aa(t){const e=t.username?encodeURIComponent(t.username):"",r=t.password?encodeURIComponent(t.password):"";return e&&r?`${e}:${r}@`:e?`${e}@`:r?`:${r}@`:""}function st(t){return`${t.protocol}://${aa(t)}${t.host}:${t.port}`}function sa(t){const e=t.username||t.password,r=st(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 oa(t){de(st(t),s("admin.proxies.urlCopied")),j.value=null}function la(t){j.value=j.value===t?null:t}function ra(t){de(t,s("admin.proxies.urlCopied")),j.value=null}function ot(){j.value=null}return da(()=>{$(),ht(),document.addEventListener("click",ot)}),ca(()=>{clearTimeout(Ie),Q==null||Q.abort(),document.removeEventListener("click",ot)}),(t,e)=>(c(),xe(ua,null,{default:v(()=>{var r,d;return[x(pa,null,{filters:v(()=>[a("div",Ra,[a("div",La,[x(C,{name:"search",size:"md",class:"absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500"}),E(a("input",{"onUpdate:modelValue":e[0]||(e[0]=o=>se.value=o),type:"text",placeholder:l(s)("admin.proxies.searchProxies"),class:"input pl-10",onInput:gt},null,40,ja),[[V,se.value]])]),a("div",Ha,[x(N,{modelValue:z.protocol,"onUpdate:modelValue":e[1]||(e[1]=o=>z.protocol=o),options:Y.value,placeholder:l(s)("admin.proxies.allProtocols"),onChange:$},null,8,["modelValue","options","placeholder"])]),a("div",Oa,[x(N,{modelValue:z.status,"onUpdate:modelValue":e[2]||(e[2]=o=>z.status=o),options:K.value,placeholder:l(s)("admin.proxies.allStatus"),onChange:$},null,8,["modelValue","options","placeholder"])]),a("div",Qa,[a("button",{onClick:$,disabled:H.value,class:"btn btn-secondary",title:l(s)("common.refresh")},[x(C,{name:"refresh",size:"md",class:U(H.value?"animate-spin":"")},null,8,["class"])],8,Na),a("button",{onClick:Wt,disabled:ge.value||H.value,class:"btn btn-secondary",title:l(s)("admin.proxies.testConnection")},[x(C,{name:"play",size:"md",class:"mr-2"}),R(" "+n(l(s)("admin.proxies.testConnection")),1)],8,Wa),a("button",{onClick:Kt,disabled:ue.value||H.value,class:"btn btn-secondary",title:l(s)("admin.proxies.batchQualityCheck")},[x(C,{name:"shield",size:"md",class:U(["mr-2",ue.value?"animate-pulse":""])},null,8,["class"]),R(" "+n(l(s)("admin.proxies.batchQualityCheck")),1
2)],8,Ka),a("button",{onClick:Xt,disabled:l(ee)===0,class:"btn btn-danger",title:l(s)("admin.proxies.batchDeleteAction")},[x(C,{name:"trash",size:"md",class:"mr-2"}),R(" "+n(l(s)("admin.proxies.batchDeleteAction")),1)],8,Ga),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=>b.value=!0),class:"btn btn-primary"},[x(C,{name:"plus",size:"md",class:"mr-2"}),R(" "+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(ma,{columns:k.value,data:A.value,loading:H.value,"server-side-sort":!0,"default-sort-key":"id","default-sort-order":"desc",onSort:wt},{"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(ct),onClick:e[6]||(e[6]=W(()=>{},["stop"])),onChange:e[7]||(e[7]=o=>_t(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(pe).has(o.id),onClick:e[8]||(e[8]=W(()=>{},["stop"])),onChange:i=>vt(o.id,i)},null,40,Ya)]),"cell-name":v(({value:o})=>[a("span",Xa,n(o),1)]),"cell-protocol":v(({value:o})=>[o?(c(),p("span",{key:0,class:U(["badge",o.startsWith("socks5")?"badge-primary":"badge-gray"])},n(o.toUpperCase()),3)):(c(),p("span",Za,"-"))]),"cell-address":v(({row:o})=>[a("div",es,[a("code",ts,n(o.host)+":"+n(o.port),1),a("div",as,[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:W(i=>oa(o),["stop"]),onContextmenu:W(i=>la(o.id),["prevent"])},[x(C,{name:"copy",size:"sm"})],40,ss),j.value===o.id?(c(),p("div",os,[(c(!0),p(ne,null,ie(sa(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:W(f=>ra(i.value),["stop"])},[a("span",rs,n(i.label),1)],8,ls))),128))])):_("",!0)])])]),"cell-auth":v(({row:o})=>[o.username||o.password?(c(),p("div",ns,[a("div",is,[o.username?(c(),p("span",ds,n(o.username),1)):_("",!0),o.password?(c(),p("span",cs,n(Z.has(o.id)?o.password:"••••••"),1)):_("",!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:W(i=>Z.has(o.id)?Z.delete(o.id):Z.add(o.id),["stop"])},[x(C,{name:Z.has(o.id)?"eyeOff":"eye",size:"sm"},null,8,["name"])],8,us)):_("",!0)])):(c(),p("span",ps,"-"))]),"cell-location":v(({row:o})=>[a("div",ms,[o.country_code?(c(),p("img",{key:0,src:qt(o.country_code),alt:o.country||o.country_code,class:"h-4 w-6 rounded-sm"},null,8,xs)):_("",!0),We(o)?(c(),p("span",ys,n(We(o)),1)):(c(),p("span",hs,"-"))])]),"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:f=>ta(o)},n(l(s)("admin.groups.accountsCount",{count:i||0})),9,bs)):(c(),p("span",vs,n(l(s)("admin.groups.accountsCount",{count:0})),1))]),"cell-latency":v(({row:o})=>[a("div",_s,[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:U(["badge",o.latency_ms<200?"badge-success":"badge-warning"])},n(o.latency_ms)+"ms ",3)):(c(),p("span",fs,"-")),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:U(["badge",Ht(o.quality_status)])},n(Ot(o.quality_status)),3)],8,ks)):_("",!0)])]),"cell-expiry":v(({row:o})=>[o.expires_at?(c(),p("div",Cs,[a("span",Ss,n(l(rt)(o.expires_at)),1),a("span",{class:U(jt(o))},n(Lt(o)),3)])):(c(),p("span",ws,n(l(s)("admin.proxies.neverExpires")),1))]),"cell-created_at":v(({row:o})=>[a("span",Ps,n(l(rt)(o.created_at)),1)]),"cell-status":v(({value:o})=>[a("span",{class:U(["badge",o==="active"?"badge-success":"badge-danger"])},n(l(s)("admin.accounts.status."+o)),3)]),"cell-actions":v(({row:o})=>[a("div",$s,[a("button",{onClick:i=>At(o),disabled:oe.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"},[oe.value.has(o.id)?(c(),p("svg",Ds,[...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(),xe(C,{key:1,name:"checkCircle",size:"sm"}
2)),a("span",Ts,n(l(s)("admin.proxies.testConnection")),1)],8,Es),a("button",{onClick:i=>zt(o),disabled:le.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"},[le.value.has(o.id)?(c(),p("svg",qs,[...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(),xe(C,{key:1,name:"shield",size:"sm"})),a("span",Is,n(l(s)("admin.proxies.qualityCheck")),1)],8,Vs),a("button",{onClick:i=>Dt(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,Us),a("button",{onClick:i=>Yt(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,zs)])]),empty:v(()=>[x(ya,{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=>b.value=!0)},null,8,["title","description","action-text"])]),_:1},8,["columns","data","loading"])],512)]),pagination:v(()=>[D.total>0?(c(),xe(xa,{key:0,page:D.page,total:D.total,"page-size":D.page_size,"onUpdate:page":ft,"onUpdate:pageSize":kt},null,8,["page","total","page-size"])):_("",!0)]),_:1}),x(ye,{show:b.value,title:l(s)("admin.proxies.createProxy"),width:"normal",onClose:ke},{footer:v(()=>[a("div",_o,[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:T.value,class:"btn btn-primary"},[T.value?(c(),p("svg",fo,[...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)])])):_("",!0),R(" "+n(T.value?l(s)("admin.proxies.creating"):l(s)("common.create")),1)],8,go)):(c(),p("button",{key:1,onClick:$t,type:"button",disabled:T.value||g.valid===0,class:"btn btn-primary"},[T.value?(c(),p("svg",wo,[...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)])])):_("",!0),R(" "+n(T.value?l(s)("admin.proxies.importing"):l(s)("admin.proxies.importProxies",{count:g.valid})),1)],8,ko))])]),default:v(()=>[a("div",Ms,[a("div",Fs,[a("button",{type:"button",onClick:e[10]||(e[10]=o=>te.value="standard"),class:U(["-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"}),R(" "+n(l(s)("admin.proxies.standardAdd")),1)],2),a("button",{type:"button",onClick:e[11]||(e[11]=o=>te.value="batch"),class:U(["-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)),R(" "+n(l(s)("admin.proxies.batchAdd")),1)],2)]),x(va)]),te.value==="standard"?(c(),p("form",{key:0,id:"create-proxy-form",onSubmit:W(Et,["prevent"]),class:"space-y-5"},[a("div",null,[a("label",Rs,n(l(s)("admin.proxies.name")),1),E(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,Ls),[[V,m.name]])]),a("div",null,[a("label",js,n(l(s)("admin.proxies.protocol")),1),x(N,{modelValue:m.protocol,"onUpdate:modelValue":e[13]||(e[13]=o=>m.protocol=o),options:G.value},null,8,["modelValue","options"])]),a("div",Hs,[a("div",null,[a("label",Os,n(l(s)("admin.proxies.host")),1),E(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,Qs),[[V,m.host]])]),a("div",null,[a("label",Ns,n(l(s)("admin.proxies.port")),1),E(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,Ws),[[V,m.port,void 0,{number:!0}]])])]),a("div",null,[a("label",Ks,n(l(s)("admin.proxies.username")),1),E(a("input",{"onUpdate:modelValue":e[16]||(e[16]=o=>m.username=o),type:"text",class:"input",placeholder:l(s)("admin.proxies.optionalAuth")},null,8,Gs),[[V,m.username]])]),a("div",null,[a("label",Js,n(l(s)("admin.proxies.password")),1),a("div",Ys,[E(a("input",{"onUpdate:modelValue":e[17]||(e[17]=o=>m.password=o),type:P.value?"text":"password",class:"input pr-10",placeholder:l(s)("admin.proxies.optionalAuth")},null,8,Xs),[[lt,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=>P.value=!P.value)},[x(C,{name:P.value?"eyeOff":"eye",size:"md"},null,8,["name"])])])]),a("div",null,[a("label",Zs,n(l(s)("admin.proxies.expiresAt")),1),a("div",eo,[(c(),p(ne,null,ie(Xe,o=>a("button",{key:o,type:"button",class:U(["btn btn-sm",m.expires_at===Ce("",o)?"btn-primary":"btn-secondary"]),onClick:i=>ze.value=o},n(l(s)("admin.proxies.nDays",{days:o})),11,to)),64))]),E(a("input",{"onUpdate:modelValue":e[19]||(e[19]=o=>ze.value=o),type:"number",min:"0",class:"input mb-2",placeholder:l(s)("admin.proxies.expiryDaysPlaceholder")},null,8,ao),[[V,ze.value,void 0,{number:!0}]]),E(a("input",{"onUpdate:modelValue":e[20]||(e[20]=o=>m.expires_at=o),type:"date",class:"input"},null,512),[[V,m.expires_at]])]),a("div",null,[a("label",so,n(l(s)("admin.proxies.fallbackMode")),1),x(N,{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",oo,[a("label",lo,n(l(s)("admin.proxies.backupProxy")),1),x(N,{modelValue:m.backup_proxy_id,"onUpdate:modelValue":e[22]||(e[22]=o=>m.backup_proxy_id=o),options:Oe()},null,8,["modelValue","options"])])):_("",!0)],32)):(c(),p("div",ro,[a("div",null,[a("label",no,n(l(s)("admin.proxies.batchInput")),1),E(a("textarea",{"onUpdate:modelValue":e[23]||(e[23]=o=>fe.value=o),rows:"10",class:"input font-mono text-sm",placeholder:l(s)("admin.proxies.batchInputPlaceholder"),onInput:Pt},null,40,io),[[V,fe.value]]),a("p",co,n(l(s)("admin.proxies.batchInputHint")),1)]),g.total>0?(c(),p("div",uo,[a("div",po,[a("div",mo,[x(C,{name:"checkCircle",size:"sm","stroke-width":2,class:"text-primary-500"}),a("span",xo,n(l(s)("admin.proxies.parsedCount",{count:g.valid})),1)]),g.invalid>0?(c(),p("div",yo,[x(C,{name:"exclamationCircle",size:"sm","stroke-width":2,class:"text-amber-500"}),a("span",ho,n(l(s)("admin.proxies.invalidCount",{count:g.invali
2d})),1)])):_("",!0),g.duplicate>0?(c(),p("div",bo,[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.75"})],-1)),a("span",vo,n(l(s)("admin.proxies.duplicateCount",{count:g.duplicate})),1)])):_("",!0)])])):_("",!0)]))]),_:1},8,["show","title"]),x(ye,{show:w.value,title:l(s)("admin.proxies.editProxy"),width:"normal",onClose:Ue},{footer:v(()=>[a("div",Lo,[a("button",{onClick:Ue,type:"button",class:"btn btn-secondary"},n(l(s)("common.cancel")),1),O.value?(c(),p("button",{key:0,type:"submit",form:"edit-proxy-form",disabled:T.value,class:"btn btn-primary"},[T.value?(c(),p("svg",Ho,[...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)])])):_("",!0),R(" "+n(T.value?l(s)("admin.proxies.updating"):l(s)("common.update")),1)],8,jo)):_("",!0)])]),default:v(()=>{var o;return[O.value?(c(),p("form",{key:0,id:"edit-proxy-form",onSubmit:W(Tt,["prevent"]),class:"space-y-5"},[a("div",null,[a("label",Co,n(l(s)("admin.proxies.name")),1),E(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",So,n(l(s)("admin.proxies.protocol")),1),x(N,{modelValue:u.protocol,"onUpdate:modelValue":e[25]||(e[25]=i=>u.protocol=i),options:G.value},null,8,["modelValue","options"])]),a("div",Po,[a("div",null,[a("label",$o,n(l(s)("admin.proxies.host")),1),E(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",Eo,n(l(s)("admin.proxies.port")),1),E(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",Do,n(l(s)("admin.proxies.username")),1),E(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",To,n(l(s)("admin.proxies.password")),1),a("div",Vo,[E(a("input",{"onUpdate:modelValue":e[29]||(e[29]=i=>u.password=i),type:S.value?"text":"password",placeholder:l(s)("admin.proxies.leaveEmptyToKeep"),class:"input pr-10",onInput:e[30]||(e[30]=i=>he.value=!0)},null,40,qo),[[lt,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=>S.value=!S.value)},[x(C,{name:S.value?"eyeOff":"eye",size:"md"},null,8,["name"])])])]),a("div",null,[a("label",Io,n(l(s)("admin.proxies.status")),1),x(N,{modelValue:u.status,"onUpdate:modelValue":e[32]||(e[32]=i=>u.status=i),options:X.value},null,8,["modelValue","options"])]),a("div",null,[a("label",Uo,n(l(s)("admin.proxies.expiresAt")),1),a("div",Ao,[(c(),p(ne,null,ie(Xe,i=>a("button",{key:i,type:"button",class:U(["btn btn-sm",u.expires_at===Ce(Ae.value,i)?"btn-primary":"btn-secondary"]),onClick:f=>Be.value=i},n(l(s)("admin.proxies.nDays",{days:i})),11,zo)),64))]),E(a("input",{"onUpdate:modelValue":e[33]||(e[33]=i=>Be.value=i),type:"number",min:"0",class:"input mb-2",placeholder:l(s)("admin.proxies.expiryDaysPlaceholder")},null,8,Bo),[[V,Be.value,void 0,{number:!0}]]),E(a("input",{"onUpdate:modelValue":e[34]||(e[34]=i=>u.expires_at=i),type:"date",class:"input"},null,512),[[V,u.expires_at]])]),a("div",null,[a("label",Mo,n(l(s)("admin.proxies.fallbackMode")),1),x(N,{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",Fo,[a("label",Ro,n(l(s)("admin.proxies.backupProxy")),1),x(N,{modelValue:u.backup_proxy_id,"onUpdate:modelValue":e[36]||(e[36]=i=>u.backup_proxy_id=i),options:Oe((o=O.value)==null?void 0:o.id)},null,8,["modelValue","options"])])):_("",!0)],32)):_("",!0)]}),_:1},8,["show","title"]),x(Fe,{show:ve.value,title:l(s)("admin.proxies.deleteProxy"),message:l(s)("admin.proxies.deleteConfirm",{name:(r=re.value)==null?void 0:r.name}),"confirm-text":l(s)("common.delete"),"cancel-text":l(s)("common.cancel"),danger:!0,onConfirm:Zt,onCancel:e[37]||(e[37]=o=>ve.value=!1)},null,8,["show","title","message","confirm-text","cancel-text"]),x(Fe,{show:ce.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:ea,onCancel:e[38]||(e[38]=o=>ce.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(Fa,{show:be.value,onClose:e[40]||(e[40]=o=>be.value=!1),onImported:Ct},null,8,["show"]),x(ye,{show:Ve.value,title:l(s)("admin.proxies.qualityReportTitle"),width:"normal",onClose:Ye},{footer:v(()=>[a("div",ml,[a("button",{onClick:Ye,class:"btn btn-secondary"},n(l(s)("common.close")),1)])]),default:v(()=>{var o;return[I.value?(c(),p("div",Oo,[a("div",Qo,[a("div",No,[a("div",null,[a("div",Wo,n(((o=qe.value)==null?void 0:o.name)||"-"),1),a("div",Ko,n(I.value.summary),1)]),a("div",Go,[a("div",Jo,n(I.value.score),1),a("div",Yo,n(l(s)("admin.proxies.qualityGrade",{grade:I.value.grade})),1)])]),a("div",Xo,[a("div",null,n(l(s)("admin.proxies.qualityExitIP"))+": "+n(I.value.exit_ip||"-"),1),a("div",null,n(l(s)("admin.proxies.qualityCountry"))+": "+n(I.value.country||"-"),1),a("div",null,n(l(s)("admin.proxies.qualityBaseLatency"))+": "+n(typeof I.value.base_latency_ms=="number"?`${I.value.base_latency_ms}ms`:"-"),1),a("div",null,n(l(s)("admin.proxies.qualityCheckedAt"))+": "+n(new Date(I.value.checked_at*1e3).toLocaleStr
2ing()),1)])]),a("div",Zo,[a("table",el,[a("thead",tl,[a("tr",null,[a("th",al,n(l(s)("admin.proxies.qualityTableTarget")),1),a("th",sl,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",ol,n(l(s)("admin.proxies.qualityTableLatency")),1),a("th",ll,n(l(s)("admin.proxies.qualityTableMessage")),1)])]),a("tbody",rl,[(c(!0),p(ne,null,ie(I.value.items,i=>(c(),p("tr",{key:i.target},[a("td",nl,n(Qt(i.target)),1),a("td",il,[a("span",{class:U(["badge whitespace-nowrap",Mt(i.status)])},n(Ft(i.status)),3)]),a("td",dl,n(i.http_status??"-"),1),a("td",cl,n(typeof i.latency_ms=="number"?`${i.latency_ms}ms`:"-"),1),a("td",ul,[a("span",null,n(i.message||"-"),1),i.cf_ray?(c(),p("span",pl,"(cf-ray: "+n(i.cf_ray)+")",1)):_("",!0)])]))),128))])])])])):_("",!0)]}),_:1},8,["show","title"]),x(ye,{show:$e.value,title:l(s)("admin.proxies.accountsTitle",{name:((d=De.value)==null?void 0:d.name)||""}),width:"normal",onClose:at},{footer:v(()=>[a("div",Pl,[a("button",{onClick:at,class:"btn btn-secondary"},n(l(s)("common.close")),1)])]),default:v(()=>[Te.value?(c(),p("div",xl,[x(C,{name:"refresh",size:"md",class:"mr-2 animate-spin"}),R(" "+n(l(s)("common.loading")),1)])):me.value.length===0?(c(),p("div",yl,n(l(s)("admin.proxies.accountsEmpty")),1)):(c(),p("div",hl,[a("table",bl,[a("thead",vl,[a("tr",null,[a("th",_l,n(l(s)("admin.proxies.accountName")),1),a("th",gl,n(l(s)("admin.accounts.columns.platformType")),1),a("th",fl,n(l(s)("admin.proxies.accountNotes")),1)])]),a("tbody",kl,[(c(!0),p(ne,null,ie(me.value,o=>(c(),p("tr",{key:o.id},[a("td",wl,n(o.name),1),a("td",Cl,[x(ga,{platform:o.platform,type:o.type},null,8,["platform","type"])]),a("td",Sl,n(o.notes||"-"),1)]))),128))])])]))]),_:1},8,["show","title"])]}),_:1}))}});export{Wl 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.