@undefineds.co/xpod 0.4.3 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/cloud.json +1 -1
- package/config/main.json +36 -2
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +3 -0
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +1 -1
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +2 -1
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +101 -32
- package/dist/api/ai-gateway/connect/DeviceCodeProtocol.d.ts +80 -0
- package/dist/api/ai-gateway/connect/DeviceCodeProtocol.js +3 -0
- package/dist/api/ai-gateway/connect/FileSessionImportAdapter.d.ts +38 -0
- package/dist/api/ai-gateway/connect/FileSessionImportAdapter.js +63 -0
- package/dist/api/ai-gateway/connect/LoopbackAuthorizationCallbackReceiver.d.ts +24 -0
- package/dist/api/ai-gateway/connect/LoopbackAuthorizationCallbackReceiver.js +136 -0
- package/dist/api/ai-gateway/connect/OAuthConnectAdapter.d.ts +2 -0
- package/dist/api/ai-gateway/connect/OAuthConnectAdapter.js +2 -1
- package/dist/api/ai-gateway/connect/OAuthIntegrationRegistry.d.ts +17 -13
- package/dist/api/ai-gateway/connect/OAuthIntegrationRegistry.js +52 -19
- package/dist/api/ai-gateway/connect/OpenAiSubscriptionSessionImportAdapter.d.ts +4 -28
- package/dist/api/ai-gateway/connect/OpenAiSubscriptionSessionImportAdapter.js +7 -58
- package/dist/api/ai-gateway/connect/ProviderAuthorizationProfiles.d.ts +4 -0
- package/dist/api/ai-gateway/connect/ProviderAuthorizationProfiles.js +116 -0
- package/dist/api/ai-gateway/connect/SessionImportProfiles.d.ts +10 -0
- package/dist/api/ai-gateway/connect/SessionImportProfiles.js +112 -0
- package/dist/api/ai-gateway/connect/index.d.ts +125 -23
- package/dist/api/ai-gateway/connect/index.js +1277 -260
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.d.ts +4 -1
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +154 -19
- package/dist/api/ai-gateway/providers/DeepSeekRuntimeAdapter.js +10 -6
- package/dist/api/ai-gateway/providers/ModelsDevCatalog.d.ts +7 -0
- package/dist/api/ai-gateway/providers/ModelsDevCatalog.js +25 -1
- package/dist/api/ai-gateway/providers/OfferingAuthorization.d.ts +24 -0
- package/dist/api/ai-gateway/providers/OfferingAuthorization.js +37 -0
- package/dist/api/ai-gateway/providers/OpenAiRuntimeAdapter.d.ts +1 -1
- package/dist/api/ai-gateway/providers/OpenAiRuntimeAdapter.js +5 -3
- package/dist/api/ai-gateway/providers/ProviderRegistry.d.ts +6 -3
- package/dist/api/ai-gateway/providers/ProviderRegistry.js +55 -16
- package/dist/api/ai-gateway/providers/ProviderRuntimeAdapter.d.ts +2 -0
- package/dist/api/ai-gateway/providers/ProviderRuntimeAdapter.js +37 -4
- package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js +7 -0
- package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.js +2 -1
- package/dist/api/ai-gateway/routing/ModelRouter.js +3 -1
- package/dist/api/container/common.js +30 -40
- package/dist/api/container/index.js +6 -2
- package/dist/api/container/routes.js +5 -22
- package/dist/api/handlers/AiClientConfigurationHandler.js +39 -1
- package/dist/api/handlers/AiGatewayManagementHandler.d.ts +3 -0
- package/dist/api/handlers/AiGatewayManagementHandler.js +173 -58
- package/dist/api/service/AiClientConfigurationService.d.ts +4 -15
- package/dist/api/service/AiClientConfigurationService.js +17 -64
- package/dist/cli/commands/start.js +2 -0
- package/dist/components/components.jsonld +1 -0
- package/dist/components/context.jsonld +80 -0
- package/dist/http/InternalPodDataHttpHandler.d.ts +3 -0
- package/dist/http/InternalPodDataHttpHandler.js +13 -2
- package/dist/http/InternalPodDataHttpHandler.jsonld +12 -0
- package/dist/identity/oidc/RememberedClientPromptFactory.d.ts +1 -1
- package/dist/identity/oidc/RememberedClientPromptFactory.js +5 -2
- package/dist/identity/oidc/RememberedConsentHandler.js +1 -1
- package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +1 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.js +26 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +4 -0
- package/dist/identity/oidc/SessionBoundIdentityProviderFactory.d.ts +10 -0
- package/dist/identity/oidc/SessionBoundIdentityProviderFactory.js +21 -0
- package/dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld +172 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -2
- package/dist/runtime/component-parameter-keys.js +18 -2
- package/dist/storage/accessors/MixDataAccessor.js +6 -2
- package/dist/storage/rdf/PostgresRdfEngine.js +10 -2
- package/dist/storage/rdf/RdfContentTypes.js +4 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +3 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +13 -16
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +1 -3
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.d.ts +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.js +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +4 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +127 -57
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +6 -4
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +436 -83
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +3 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +212 -76
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +6 -4
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +58 -41
- package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.d.ts +4 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.js +63 -4
- package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.d.ts +46 -6
- package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.js +143 -14
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.d.ts +19 -3
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.js +45 -7
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/codex.d.ts +7 -1
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/codex.js +305 -40
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/index.cjs +383 -50
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/json-env-adapter.js +3 -2
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/pi.js +12 -3
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/transaction.d.ts +2 -0
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/transaction.js +39 -4
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/types.d.ts +8 -1
- package/node_modules/@undefineds.co/ai-connections/dist/client-visuals.d.ts +2 -0
- package/node_modules/@undefineds.co/ai-connections/dist/client-visuals.js +14 -0
- package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/controller.js +216 -57
- package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +3 -1
- package/node_modules/@undefineds.co/ai-connections/dist/index.js +16 -2
- package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.js +6 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js +27 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql/builder/update-builder.js +12 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/builder.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/array.js +8 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/default.js +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js +27 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/update-builder.js +12 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/builder.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/array.js +8 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/default.js +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js +3 -3
- package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +31 -0
- package/package.json +2 -2
- package/static/app/assets/{index-BikOyGPu.js → index-BCZVzMpj.js} +44 -44
- package/static/app/assets/inrupt-smoke.js +2 -2
- package/static/app/assets/main.css +1 -1
- package/static/app/assets/main.js +10 -10
- package/static/auth-callback/assets/{AiConfigContext-DrCH6ckh.js → AiConfigContext-DVkh8Kg2.js} +1 -1
- package/static/auth-callback/assets/{AiConfigPage-DVrlSSdA.js → AiConfigPage-HWVWpe-P.js} +1 -1
- package/static/auth-callback/assets/{DocumentProcessingPanel-_Md-v2R2.js → DocumentProcessingPanel-DDq-mH17.js} +1 -1
- package/static/auth-callback/assets/{IndexLifecyclePanel-BbWwe23H.js → IndexLifecyclePanel-Cx4cjrdP.js} +1 -1
- package/static/auth-callback/assets/{IndexSubjectPanel-upH9MjU-.js → IndexSubjectPanel-DzSw8M9j.js} +1 -1
- package/static/auth-callback/assets/{ModelAssignmentsPanel-CVGH4t4g.js → ModelAssignmentsPanel-BsRxGc2p.js} +1 -1
- package/static/auth-callback/assets/ModelsPage-DEe1lo6Q.js +10 -0
- package/static/auth-callback/assets/{NetworkPage-Dcbrb1fd.js → NetworkPage-DBiEh1Oz.js} +1 -1
- package/static/auth-callback/assets/{PaneListHeader-DrY-1wBq.js → PaneListHeader-lEEgjyN9.js} +1 -1
- package/static/auth-callback/assets/{SearchIndexingPanel-Dw25y53v.js → SearchIndexingPanel-CZCUUGt6.js} +1 -1
- package/static/auth-callback/assets/{StatusSubjectPanel-BHlz9rNF.js → StatusSubjectPanel-21qdueMr.js} +1 -1
- package/static/auth-callback/assets/{StatusWorkspace-BH7exQP5.js → StatusWorkspace-R8RKsqVz.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsPage-BYLKnM9f.js → SystemSettingsPage-BQ4e-4Wy.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsSubjectPanel-DT34LKku.js → SystemSettingsSubjectPanel-BopXD7SE.js} +1 -1
- package/static/auth-callback/assets/{activity-DdULRcSI.js → activity-DSfmTGfY.js} +1 -1
- package/static/auth-callback/assets/ai-connections-C03UWyPh.js +1 -0
- package/static/auth-callback/assets/{auth-callback-D7l2P25I.js → auth-callback-DleaitAS.js} +91 -91
- package/static/auth-callback/assets/auth-callback-vPSC2d2F.css +1 -0
- package/static/auth-callback/assets/{badge-j4zjFnmg.js → badge-B0aLu1sl.js} +1 -1
- package/static/auth-callback/assets/{download-DGXoks01.js → download-D_bFwdYJ.js} +1 -1
- package/static/auth-callback/assets/{external-link-CvbgXXaI.js → external-link-DRfjTaQu.js} +1 -1
- package/static/auth-callback/assets/{index-LRWvKJ2i.js → index-CG23cLYQ.js} +1 -1
- package/static/auth-callback/assets/{index-BOK3j1dz.js → index-CyV9ejwx.js} +1 -1
- package/static/auth-callback/assets/{index-browser-C1Qpe0g4.js → index-browser-D70paxIg.js} +1 -1
- package/static/auth-callback/assets/{key-round-CmgS5UdQ.js → key-round-BjV_mVYH.js} +1 -1
- package/static/auth-callback/assets/{rotate-ccw-c4CSG6Rq.js → rotate-ccw-CKoOAfse.js} +1 -1
- package/static/auth-callback/assets/{skeleton-ZPMTiRSM.js → skeleton-BZNjZaHx.js} +1 -1
- package/static/auth-callback/assets/{waypoints-xjyBflU5.js → waypoints-DoaJVzZv.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout-B9nj6F5J.js → workspace-layout-CaP46_ZR.js} +1 -1
- package/static/auth-callback/auth-callback.html +2 -2
- package/static/dashboard/assets/{AiConfigContext-BWOOSYNr.js → AiConfigContext-BSrR27yD.js} +1 -1
- package/static/dashboard/assets/{AiConfigPage-CG2kQ9Wy.js → AiConfigPage-D65Z2LET.js} +1 -1
- package/static/dashboard/assets/{DocumentProcessingPanel-B4VXajfj.js → DocumentProcessingPanel-DyTe7Nei.js} +1 -1
- package/static/dashboard/assets/{IndexLifecyclePanel-CWCy0CC8.js → IndexLifecyclePanel-fK8ZGlrL.js} +1 -1
- package/static/dashboard/assets/{IndexSubjectPanel-CSgyQnG_.js → IndexSubjectPanel-CZPGor7v.js} +1 -1
- package/static/dashboard/assets/{ModelAssignmentsPanel-CdGIGidT.js → ModelAssignmentsPanel-CfYn5LMQ.js} +1 -1
- package/static/dashboard/assets/ModelsPage-djlJsghe.js +25 -0
- package/static/dashboard/assets/{NetworkPage-COia9NCH.js → NetworkPage-Coj6GnPl.js} +1 -1
- package/static/dashboard/assets/{PaneListHeader-SZWyr602.js → PaneListHeader-CUuFNSsZ.js} +1 -1
- package/static/dashboard/assets/{SearchIndexingPanel-D6PZtG6k.js → SearchIndexingPanel-CyJLioXS.js} +1 -1
- package/static/dashboard/assets/{StatusSubjectPanel-CxRD4kv0.js → StatusSubjectPanel-Cv26GSVC.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-D3PfmY9-.js → StatusWorkspace-CDjFrsmB.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsPage-COg1MmMj.js → SystemSettingsPage-BuNOyNoa.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsSubjectPanel-BSVVB9Ol.js → SystemSettingsSubjectPanel-B2dasdez.js} +1 -1
- package/static/dashboard/assets/{activity-BJJx5cN-.js → activity-D1d2j_4Z.js} +1 -1
- package/static/dashboard/assets/ai-connections-C03UWyPh.js +1 -0
- package/static/dashboard/assets/{badge-elmrFSCj.js → badge-BeAAv6sp.js} +1 -1
- package/static/dashboard/assets/{dashboard-IvQrNmru.js → dashboard-BnGrUGv8.js} +68 -68
- package/static/dashboard/assets/dashboard-vPSC2d2F.css +1 -0
- package/static/dashboard/assets/{download-C3FH2KzG.js → download-DfFGiZRn.js} +1 -1
- package/static/dashboard/assets/{external-link-Bx7F0uKb.js → external-link-IsjU_LC9.js} +1 -1
- package/static/dashboard/assets/{index-liRoRIP1.js → index-BWQTucPe.js} +1 -1
- package/static/dashboard/assets/{index-M4-kWiGz.js → index-Dj75OjnW.js} +1 -1
- package/static/dashboard/assets/{key-round-CXg0bKAj.js → key-round-BJ_9wmQ_.js} +1 -1
- package/static/dashboard/assets/{rotate-ccw-yxJKOBrX.js → rotate-ccw-D3JGiFbR.js} +1 -1
- package/static/dashboard/assets/{skeleton-x9jNGrQT.js → skeleton-CC4nc-z-.js} +1 -1
- package/static/dashboard/assets/{waypoints-CTKeRsGp.js → waypoints-h7sqFqiG.js} +1 -1
- package/static/dashboard/assets/{workspace-layout--YkgkS38.js → workspace-layout-ZAPTOHhs.js} +1 -1
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/{AiConfigContext-CelxXFcQ.js → AiConfigContext-lGkWpvKP.js} +1 -1
- package/static/settings/assets/{AiConfigPage-BaP-EovM.js → AiConfigPage-BbZWIBZq.js} +1 -1
- package/static/settings/assets/{DocumentProcessingPanel-DzLZluFv.js → DocumentProcessingPanel-DvYdjT-V.js} +1 -1
- package/static/settings/assets/{IndexLifecyclePanel-Bzj1-_oI.js → IndexLifecyclePanel-W5OGQZj7.js} +1 -1
- package/static/settings/assets/{IndexSubjectPanel-B263QLUh.js → IndexSubjectPanel-g_Aa5soq.js} +1 -1
- package/static/settings/assets/{ModelAssignmentsPanel-BAdT4UR0.js → ModelAssignmentsPanel-COlMBKXj.js} +1 -1
- package/static/settings/assets/ModelsPage-mApKi-aw.js +10 -0
- package/static/settings/assets/{NetworkPage-BK6a7l4g.js → NetworkPage-BDT05JUq.js} +1 -1
- package/static/settings/assets/{PaneListHeader-BAS2ICPq.js → PaneListHeader-CByhNpMG.js} +1 -1
- package/static/settings/assets/{SearchIndexingPanel-Cb_p-NgW.js → SearchIndexingPanel-BFAyzXls.js} +1 -1
- package/static/settings/assets/{StatusSubjectPanel-CcjqUua6.js → StatusSubjectPanel-Bz_XZ3VU.js} +1 -1
- package/static/settings/assets/{StatusWorkspace-7Ibty3_k.js → StatusWorkspace-CeVypHcW.js} +1 -1
- package/static/settings/assets/{SystemSettingsPage-DPSz4dg4.js → SystemSettingsPage-Dh7cQIfx.js} +1 -1
- package/static/settings/assets/{SystemSettingsSubjectPanel-Cb4HkKT5.js → SystemSettingsSubjectPanel-CSnpciO0.js} +1 -1
- package/static/settings/assets/{activity-Qhsr5Pxu.js → activity-DXz3EfFN.js} +1 -1
- package/static/settings/assets/ai-connections-C03UWyPh.js +1 -0
- package/static/settings/assets/{badge-B1vf2qCl.js → badge-1ZA144i4.js} +1 -1
- package/static/settings/assets/{download-CYNt0aZ-.js → download-CUHimlYa.js} +1 -1
- package/static/settings/assets/{external-link-ClKb39NT.js → external-link-BYHSVj2Z.js} +1 -1
- package/static/settings/assets/{index-y8ew3MLM.js → index-DKPDMdW5.js} +1 -1
- package/static/settings/assets/{index-browser-DJhvgpNI.js → index-browser-BaEFz0e0.js} +1 -1
- package/static/settings/assets/{index-BgiIDSch.js → index-viSgSvbO.js} +1 -1
- package/static/settings/assets/{key-round-5d-DrJz-.js → key-round-COByPOg8.js} +1 -1
- package/static/settings/assets/{rotate-ccw-CHZY7kS5.js → rotate-ccw-BC2EN6cE.js} +1 -1
- package/static/settings/assets/{settings-D5VRWyx6.js → settings-DLH9XUoT.js} +86 -86
- package/static/settings/assets/settings-vPSC2d2F.css +1 -0
- package/static/settings/assets/{skeleton-FNabNxNE.js → skeleton-B0-FOhKL.js} +1 -1
- package/static/settings/assets/{waypoints-BnL_8ljo.js → waypoints-DGMsvqWo.js} +1 -1
- package/static/settings/assets/{workspace-layout-D5q3F59S.js → workspace-layout-B0SVrJIu.js} +1 -1
- package/static/settings/settings.html +2 -2
- package/static/auth-callback/assets/ModelsPage-BpkVFKbf.js +0 -10
- package/static/auth-callback/assets/ai-connections-Bm52UO7Y.js +0 -1
- package/static/auth-callback/assets/auth-callback-01yz-UDU.css +0 -1
- package/static/dashboard/assets/ModelsPage-Chd5UK0D.js +0 -25
- package/static/dashboard/assets/ai-connections-Bm52UO7Y.js +0 -1
- package/static/dashboard/assets/dashboard-01yz-UDU.css +0 -1
- package/static/settings/assets/ModelsPage-C0NFa1zq.js +0 -10
- package/static/settings/assets/ai-connections-Bm52UO7Y.js +0 -1
- package/static/settings/assets/settings-01yz-UDU.css +0 -1
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import{j as o,r as p,P as vt,o as Nn,q as Yt,x as Xr,z as Ma,X as Oa,f as _,i as Ka,E as Ta,F as Wr,H as Mn,I as On,J as Yr,K as Zr,M as de,Q as nt,T as fr,U as Kn,V as pe,W as Zt,Y as U,Z as ht,_ as et,$ as En,a0 as Ht,a1 as ct,a2 as Te,a3 as La,a4 as qa,a5 as ve,a6 as He,a7 as _r,a8 as Qa,a9 as Tn,aa as Ne,ab as Ye,ac as _t,ad as $r,ae as eo,af as to,B as T,ag as Ha,ah as Va,ai as fe,aj as Ke,t as we,ak as Ja,al as L,am as J,an as ye,ao as za,ap as Ga,u as Xa}from"./settings-D5VRWyx6.js";import{A as no,a as Wa,n as ro,b as Ya,d as Za}from"./ai-connections-Bm52UO7Y.js";import{W as _a,T as $a}from"./workspace-layout-D5q3F59S.js";import{a as $t,P as es,c as De,h as ts,g as ns,R as rs,d as os,F as as,D as oo,e as ao,u as Qt,C as ss,i as is,b as so,f as cs,A as ls}from"./index-BgiIDSch.js";import{B as pt}from"./badge-B1vf2qCl.js";import{r as ds,a as us,b as fs}from"./index-browser-DJhvgpNI.js";var ps=Object.defineProperty,je=(e,t)=>ps(e,"name",{value:t,configurable:!0}),Ln="Dialog",[io,vu]=Xr(Ln),[ms,Me]=io(Ln),hs=je(e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:a,onOpenChange:s,modal:i=!0}=e,l=p.useRef(null),d=p.useRef(null),[f,u]=ao({prop:r,defaultProp:a??!1,onChange:s,caller:Ln}),[m,g]=p.useState(0),[y,R]=p.useState(0);return o.jsx(ms,{scope:t,triggerRef:l,contentRef:d,contentId:Qt(),titleId:Qt(),descriptionId:Qt(),titlePresent:m>0,descriptionPresent:y>0,setTitleCount:g,setDescriptionCount:R,open:f,onOpenChange:u,onOpenToggle:p.useCallback(()=>u(h=>!h),[u]),modal:i,children:n})},"Dialog"),co="DialogPortal",[gs,lo]=io(co,{forceMount:void 0}),As=je(e=>{const{__scopeDialog:t,forceMount:n,children:r,container:a}=e,s=Me(co,t);return o.jsx(gs,{scope:t,forceMount:n,children:p.Children.map(r,i=>o.jsx($t,{present:n||s.open,children:o.jsx(es,{asChild:!0,container:a,children:i})}))})},"DialogPortal"),In="DialogOverlay",uo=p.forwardRef(je(function(t,n){const r=lo(In,t.__scopeDialog),{forceMount:a=r.forceMount,...s}=t,i=Me(In,t.__scopeDialog);return i.modal?o.jsx($t,{present:a||i.open,children:o.jsx(xs,{...s,ref:n})}):null},"DialogOverlay")),ys=Ma("DialogOverlay.RemoveScroll"),xs=p.forwardRef(je(function(t,n){const{__scopeDialog:r,...a}=t,s=Me(In,r),i=ns(),l=Yt(n,i);return o.jsx(rs,{as:ys,allowPinchZoom:!0,shards:[s.contentRef],children:o.jsx(vt.div,{"data-state":qn(s.open),...a,ref:l,style:{pointerEvents:"auto",...a.style}})})},"DialogOverlayImpl")),yt="DialogContent",fo=p.forwardRef(je(function(t,n){const r=lo(yt,t.__scopeDialog),{forceMount:a=r.forceMount,...s}=t,i=Me(yt,t.__scopeDialog);return o.jsx($t,{present:a||i.open,children:i.modal?o.jsx(bs,{...s,ref:n}):o.jsx(ws,{...s,ref:n})})},"DialogContent")),bs=p.forwardRef(je(function(t,n){const r=Me(yt,t.__scopeDialog),a=p.useRef(null),s=Yt(n,r.contentRef,a);return p.useEffect(()=>{const i=a.current;if(i)return ts(i)},[]),o.jsx(po,{...t,ref:s,trapFocus:r.open,disableOutsidePointerEvents:r.open,onCloseAutoFocus:De(t.onCloseAutoFocus,i=>{i.preventDefault(),r.triggerRef.current?.focus()}),onPointerDownOutside:De(t.onPointerDownOutside,i=>{const l=i.detail.originalEvent,d=l.button===0&&l.ctrlKey===!0;(l.button===2||d)&&i.preventDefault()}),onFocusOutside:De(t.onFocusOutside,i=>i.preventDefault())})},"DialogContentModal")),ws=p.forwardRef(je(function(t,n){const r=Me(yt,t.__scopeDialog),a=p.useRef(!1),s=p.useRef(!1);return o.jsx(po,{...t,ref:n,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:i=>{t.onCloseAutoFocus?.(i),i.defaultPrevented||(a.current||r.triggerRef.current?.focus(),i.preventDefault()),a.current=!1,s.current=!1},onInteractOutside:i=>{t.onInteractOutside?.(i),i.defaultPrevented||(a.current=!0,i.detail.originalEvent.type==="pointerdown"&&(s.current=!0));const l=i.target;r.triggerRef.current?.contains(l)&&i.preventDefault(),i.detail.originalEvent.type==="focusin"&&s.current&&i.preventDefault()}})},"DialogContentNonModal")),po=p.forwardRef(je(function(t,n){const{__scopeDialog:r,trapFocus:a,onOpenAutoFocus:s,onCloseAutoFocus:i,...l}=t,d=Me(yt,r);return os(),o.jsx(o.Fragment,{children:o.jsx(as,{asChild:!0,loop:!0,trapped:a,onMountAutoFocus:s,onUnmountAutoFocus:i,children:o.jsx(oo,{role:"dialog",id:d.contentId,"aria-describedby":d.descriptionPresent?d.descriptionId:void 0,"aria-labelledby":d.titlePresent?d.titleId:void 0,"data-state":qn(d.open),...l,ref:n,deferPointerDownOutside:!0,onDismiss:()=>d.onOpenChange(!1)})})})},"DialogContentImpl")),vs="DialogTitle",mo=p.forwardRef(je(function(t,n){const{__scopeDialog:r,...a}=t,s=Me(vs,r),{setTitleCount:i}=s;return Nn(()=>(i(l=>l+1),()=>i(l=>l-1)),[i]),o.jsx(vt.h2,{id:s.titleId,...a,ref:n})},"DialogTitle")),Cs="DialogDescription",ho=p.forwardRef(je(function(t,n){const{__scopeDialog:r,...a}=t,s=Me(Cs,r),{setDescriptionCount:i}=s;return Nn(()=>(i(l=>l+1),()=>i(l=>l-1)),[i]),o.jsx(vt.p,{id:s.descriptionId,...a,ref:n})},"DialogDescription")),Es="DialogClose",Is=p.forwardRef(je(function(t,n){const{__scopeDialog:r,...a}=t,s=Me(Es,r);return o.jsx(vt.button,{type:"button",...a,ref:n,onClick:De(t.onClick,()=>s.onOpenChange(!1))})},"DialogClose"));function qn(e){return e?"open":"closed"}je(qn,"getState");const go=hs,ks=As,Ao=p.forwardRef(({className:e,...t},n)=>o.jsx(uo,{ref:n,className:_("fixed inset-0 z-50 bg-black/40","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t}));Ao.displayName=uo.displayName;const Qn=p.forwardRef(({className:e,children:t,variant:n="center",...r},a)=>o.jsxs(ks,{children:[o.jsx(Ao,{}),o.jsxs(fo,{ref:a,className:_(n==="sheet-left"?"fixed inset-y-0 left-0 z-50 flex h-dvh w-[min(88vw,320px)] flex-col border-r bg-background p-0 shadow-[16px_0_30px_rgba(15,23,42,0.08)] duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:slide-out-to-left-full data-[state=open]:slide-in-from-left-full rounded-none":n==="sheet-right"?"fixed inset-y-0 right-0 z-50 flex h-dvh w-full max-w-4xl flex-col border-l bg-background p-0 shadow-[-16px_0_30px_rgba(15,23,42,0.08)] duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-right-full rounded-none":"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg",e),...r,children:[t,o.jsxs(Is,{className:_("absolute right-4 top-4 rounded-xl opacity-70 transition-all hover:opacity-100 hover:bg-muted/50 p-1 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",Ka),children:[o.jsx(Oa,{className:"h-4 w-4"}),o.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));Qn.displayName=fo.displayName;const Hn=({className:e,...t})=>o.jsx("div",{className:_("flex flex-col space-y-1.5 text-center sm:text-left",e),...t});Hn.displayName="DialogHeader";const Vn=({className:e,...t})=>o.jsx("div",{className:_("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});Vn.displayName="DialogFooter";const Jn=p.forwardRef(({className:e,...t},n)=>o.jsx(mo,{ref:n,className:_("text-lg font-semibold leading-none tracking-tight",e),...t}));Jn.displayName=mo.displayName;const Ps=p.forwardRef(({className:e,...t},n)=>o.jsx(ho,{ref:n,className:_("text-sm text-muted-foreground",e),...t}));Ps.displayName=ho.displayName;var js=Object.defineProperty,ce=(e,t)=>js(e,"name",{value:t,configurable:!0}),[zn,Cu]=Xr("Tooltip",[so]),Gn=so(),Us="TooltipProvider",Fs=700,kn="tooltip.open",[Ss,Xn]=zn(Us),Rs=ce(e=>{const{__scopeTooltip:t,delayDuration:n=Fs,skipDelayDuration:r=300,disableHoverableContent:a=!1,children:s}=e,i=p.useRef(!0),l=p.useRef(!1),d=p.useRef(0);return p.useEffect(()=>{const f=d.current;return()=>window.clearTimeout(f)},[]),o.jsx(Ss,{scope:t,isOpenDelayedRef:i,delayDuration:n,onOpen:p.useCallback(()=>{r<=0||(window.clearTimeout(d.current),i.current=!1)},[r]),onClose:p.useCallback(()=>{r<=0||(window.clearTimeout(d.current),d.current=window.setTimeout(()=>i.current=!0,r))},[r]),isPointerInTransitRef:l,onPointerInTransitChange:p.useCallback(f=>{l.current=f},[]),disableHoverableContent:a,children:s})},"TooltipProvider"),Pn="Tooltip",[Bs,en]=zn(Pn),Ds=ce(e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:a,onOpenChange:s,disableHoverableContent:i,delayDuration:l}=e,d=Xn(Pn,e.__scopeTooltip),f=Gn(t),[u,m]=p.useState(null),[g,y]=p.useState(void 0),R=Qt(),h=p.useRef(0),I=i??d.disableHoverableContent,j=l??d.delayDuration,w=p.useRef(!1),[D,E]=ao({prop:r,defaultProp:a??!1,onChange:ce(M=>{M?(d.onOpen(),document.dispatchEvent(new CustomEvent(kn))):d.onClose(),s?.(M)},"onChange"),caller:Pn}),Q=p.useMemo(()=>D?w.current?"delayed-open":"instant-open":"closed",[D]),G=p.useCallback(()=>{window.clearTimeout(h.current),h.current=0,w.current=!1,E(!0)},[E]),Z=p.useCallback(()=>{window.clearTimeout(h.current),h.current=0,E(!1)},[E]),C=p.useCallback(()=>{window.clearTimeout(h.current),h.current=window.setTimeout(()=>{w.current=!0,E(!0),h.current=0},j)},[j,E]);p.useEffect(()=>()=>{h.current&&(window.clearTimeout(h.current),h.current=0)},[]);const F=g??R;return o.jsx(cs,{...f,children:o.jsx(Bs,{scope:t,contentId:F,setContentId:y,open:D,stateAttribute:Q,trigger:u,onTriggerChange:m,onTriggerEnter:p.useCallback(()=>{d.isOpenDelayedRef.current?C():G()},[d.isOpenDelayedRef,C,G]),onTriggerLeave:p.useCallback(()=>{I?Z():(window.clearTimeout(h.current),h.current=0)},[Z,I]),onOpen:G,onClose:Z,disableHoverableContent:I,children:n})})},"Tooltip"),pr="TooltipTrigger",Ns=p.forwardRef(ce(function(t,n){const{__scopeTooltip:r,...a}=t,s=en(pr,r),i=Xn(pr,r),l=Gn(r),d=p.useRef(null),f=Yt(n,d,s.onTriggerChange),u=p.useRef(!1),m=p.useRef(!1),g=p.useCallback(()=>u.current=!1,[]);return p.useEffect(()=>()=>document.removeEventListener("pointerup",g),[g]),o.jsx(ls,{asChild:!0,...l,children:o.jsx(vt.button,{"aria-describedby":s.open?s.contentId:void 0,"data-state":s.stateAttribute,...a,ref:f,onPointerMove:De(t.onPointerMove,y=>{y.pointerType!=="touch"&&!m.current&&!i.isPointerInTransitRef.current&&(s.onTriggerEnter(),m.current=!0)}),onPointerLeave:De(t.onPointerLeave,()=>{s.onTriggerLeave(),m.current=!1}),onPointerDown:De(t.onPointerDown,()=>{s.open&&s.onClose(),u.current=!0,document.addEventListener("pointerup",g,{once:!0})}),onFocus:De(t.onFocus,()=>{u.current||s.onOpen()}),onBlur:De(t.onBlur,s.onClose),onClick:De(t.onClick,s.onClose)})})},"TooltipTrigger")),Ms="TooltipPortal",[Eu,Os]=zn(Ms,{forceMount:void 0}),xt="TooltipContent",Ks=p.forwardRef(ce(function(t,n){const r=Os(xt,t.__scopeTooltip),{forceMount:a=r.forceMount,side:s="top",...i}=t,l=en(xt,t.__scopeTooltip);return o.jsx($t,{present:a||l.open,children:l.disableHoverableContent?o.jsx(yo,{side:s,...i,ref:n}):o.jsx(Ts,{side:s,...i,ref:n})})},"TooltipContent")),Ts=p.forwardRef(ce(function(t,n){const r=en(xt,t.__scopeTooltip),a=Xn(xt,t.__scopeTooltip),s=p.useRef(null),i=Yt(n,s),[l,d]=p.useState(null),{trigger:f,onClose:u}=r,m=s.current,{onPointerInTransitChange:g}=a,y=p.useCallback(()=>{d(null),g(!1)},[g]),R=p.useCallback((h,I)=>{const j=h.currentTarget,w={x:h.clientX,y:h.clientY},D=xo(w,j.getBoundingClientRect()),E=bo(w,D),Q=wo(I.getBoundingClientRect()),G=Co([...E,...Q]);d(G),g(!0)},[g]);return p.useEffect(()=>()=>y(),[y]),p.useEffect(()=>{if(f&&m){const h=ce(j=>R(j,m),"handleTriggerLeave"),I=ce(j=>R(j,f),"handleContentLeave");return f.addEventListener("pointerleave",h),m.addEventListener("pointerleave",I),()=>{f.removeEventListener("pointerleave",h),m.removeEventListener("pointerleave",I)}}},[f,m,R,y]),p.useEffect(()=>{if(l){const h=ce(I=>{const j=I.target,w={x:I.clientX,y:I.clientY},D=f?.contains(j)||m?.contains(j),E=!vo(w,l);D?y():E&&(y(),u())},"handleTrackPointerGrace");return document.addEventListener("pointermove",h),()=>document.removeEventListener("pointermove",h)}},[f,m,l,u,y]),o.jsx(yo,{...t,ref:i})},"TooltipContentHoverable")),Ls=Ta("TooltipContent"),yo=p.forwardRef(ce(function(t,n){const{__scopeTooltip:r,children:a,"aria-label":s,id:i,onEscapeKeyDown:l,onPointerDownOutside:d,...f}=t,u=en(xt,r),m=Gn(r),{onClose:g}=u;p.useEffect(()=>(document.addEventListener(kn,g),()=>document.removeEventListener(kn,g)),[g]),p.useEffect(()=>{if(u.trigger){const R=ce(h=>{h.target instanceof Node&&h.target.contains(u.trigger)&&g()},"handleScroll");return window.addEventListener("scroll",R,{capture:!0}),()=>window.removeEventListener("scroll",R,{capture:!0})}},[u.trigger,g]);const{setContentId:y}=u;return Nn(()=>(y(i),()=>{y(void 0)}),[i,y]),o.jsx(oo,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:l,onPointerDownOutside:d,onFocusOutside:R=>R.preventDefault(),onDismiss:g,children:o.jsxs(ss,{"data-state":u.stateAttribute,role:s?void 0:"tooltip",id:s?void 0:u.contentId,...m,...f,ref:n,style:{...f.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[o.jsx(Ls,{children:a}),s?o.jsx(is,{id:u.contentId,role:"tooltip",children:s}):null]})})},"TooltipContentImpl"));function xo(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),a=Math.abs(t.right-e.x),s=Math.abs(t.left-e.x);switch(Math.min(n,r,a,s)){case s:return"left";case a:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}ce(xo,"getExitSideFromRect");function bo(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}ce(bo,"getPaddedExitPoints");function wo(e){const{top:t,right:n,bottom:r,left:a}=e;return[{x:a,y:t},{x:n,y:t},{x:n,y:r},{x:a,y:r}]}ce(wo,"getPointsFromRect");function vo(e,t){const{x:n,y:r}=e;let a=!1;for(let s=0,i=t.length-1;s<t.length;i=s++){const l=t[s],d=t[i],f=l.x,u=l.y,m=d.x,g=d.y;u>r!=g>r&&n<(m-f)*(r-u)/(g-u)+f&&(a=!a)}return a}ce(vo,"isPointInPolygon");function Co(e){const t=e.slice();return t.sort((n,r)=>n.x<r.x?-1:n.x>r.x?1:n.y<r.y?-1:n.y>r.y?1:0),Eo(t)}ce(Co,"getHull");function Eo(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r<e.length;r++){const a=e[r];for(;t.length>=2;){const s=t[t.length-1],i=t[t.length-2];if((s.x-i.x)*(a.y-i.y)>=(s.y-i.y)*(a.x-i.x))t.pop();else break}t.push(a)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const a=e[r];for(;n.length>=2;){const s=n[n.length-1],i=n[n.length-2];if((s.x-i.x)*(a.y-i.y)>=(s.y-i.y)*(a.x-i.x))n.pop();else break}n.push(a)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}ce(Eo,"getHullPresorted");var qs=Rs,Qs=Ds,Hs=Ns,Io=Ks;const ko=qs,tn=Qs,nn=Hs,Ct=p.forwardRef(({className:e,sideOffset:t=4,...n},r)=>o.jsx(Io,{ref:r,sideOffset:t,className:_("z-50 overflow-hidden rounded-md border border-border/50 bg-popover","px-2 py-1 text-xs text-popover-foreground shadow-md","animate-in fade-in-0 zoom-in-95","data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95","data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2","data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n}));Ct.displayName=Io.displayName;function Vs(e){const t=Wr(e).type;return Array.isArray(t)&&t.includes(Mn.AccessControlResource)}async function rn(e,t){if(!Ut(e))return{resourceAcl:null,fallbackAcl:null};try{const n=await Po(e,t);return n===null?{resourceAcl:null,fallbackAcl:await jo(e,t)}:{resourceAcl:n,fallbackAcl:null}}catch(n){if(n instanceof jn)return{resourceAcl:null,fallbackAcl:null};throw n}}async function Po(e,t){if(!Ut(e))return null;try{const n=await Yr(e.internal_resourceInfo.aclUrl,t);if(Vs(n))throw new jn(e,n);return Zr({...n,internal_accessTo:de(e)})}catch(n){if(n instanceof jn)throw n;return null}}async function jo(e,t){const n=new URL(de(e)),r=n.pathname;if(r==="/")return null;const a=Js(r),s=new URL(a,n.origin).href,i=await nt(s,t);if(!Ut(i))return null;const l=await Po(i,t);return l===null?jo(i,t):l}function Js(e){const t=e.substring(e.length-1)==="/"?e.substring(0,e.length-1):e;return`${e.substring(0,t.lastIndexOf("/"))}/`}function Xe(e){return Kn(e).filter(zs)}function zs(e){return pe(e,Zt.type).includes(U.Authorization)}function Wn(e,t){return e.filter(n=>Gs(n,t))}function Gs(e,t){return pe(e,U.accessTo).includes(t)}function on(e,t){return e.filter(n=>Xs(n,t))}function Xs(e,t){return pe(e,U.default).includes(t)||pe(e,U.defaultForNew).includes(t)}function Et(e){const t=pe(e,U.mode);return t.includes(Se.write)?{read:t.includes(Se.read),append:!0,write:!0,control:t.includes(Se.control)}:{read:t.includes(Se.read),append:t.includes(Se.append),write:!1,control:t.includes(Se.control)}}function It(e){return e.reduce((t,n)=>t.write||n.write?{read:t.read||n.read,append:!0,write:!0,control:t.control||n.control}:{read:t.read||n.read,append:t.append||n.append,write:!1,control:t.control||n.control},{read:!1,append:!1,write:!1,control:!1})}function Ws(e){return Xe(e).filter(Ys).reduce(La,e)}function Ys(e){return qa(e.predicates,ve.namedNode(e.url),ve.defaultGraph()).some(t=>!Zs(t))?!1:He(e,U.accessTo)===null&&He(e,U.default)===null&&He(e,U.defaultForNew)===null||He(e,U.mode)===null||He(e,U.agent)===null&&He(e,U.agentGroup)===null&&He(e,U.agentClass)===null}function Zs(e){const{predicate:t}=e,{object:n}=e;return!!(t.equals(ve.namedNode(Zt.type))&&n.equals(ve.namedNode(U.Authorization))||t.equals(ve.namedNode(U.accessTo))||t.equals(ve.namedNode(U.default))||t.equals(ve.namedNode(U.defaultForNew))||t.equals(ve.namedNode(U.mode))&&Object.values(Se).some(r=>n.equals(ve.namedNode(r)))||t.equals(ve.namedNode(U.agent))||t.equals(ve.namedNode(U.agentGroup))||t.equals(ve.namedNode(U.agentClass))||t.equals(ve.namedNode(U.origin)))}const Se={read:"http://www.w3.org/ns/auth/acl#Read",append:"http://www.w3.org/ns/auth/acl#Append",write:"http://www.w3.org/ns/auth/acl#Write",control:"http://www.w3.org/ns/auth/acl#Control"};function _s(e,t,n){return e.filter(r=>pe(r,n).includes(t))}function $s(e,t){const n={};return e.forEach(r=>{const a=pe(r,t),s=Et(r);a.forEach(i=>{n[i]=typeof n[i]>"u"?s:It([n[i],s])})}),n}function Uo(e){let t=ct();return t=et(t,Zt.type,U.Authorization),e.read&&(t=Te(t,U.mode,Se.read)),e.append&&!e.write&&(t=Te(t,U.mode,Se.append)),e.write&&(t=Te(t,U.mode,Se.write)),e.control&&(t=Te(t,U.mode,Se.control)),t}function ei(e){let t=ct();t=et(t,Zt.type,U.Authorization);function n(r,a,s){return pe(r,s).reduce((i,l)=>Te(i,s,l),a)}return t=n(e,t,U.accessTo),t=n(e,t,U.default),t=n(e,t,U.defaultForNew),t=n(e,t,U.agent),t=n(e,t,U.agentGroup),t=n(e,t,U.agentClass),t=n(e,t,U.origin),t=n(e,t,U.mode),t}function kt(e,t){return Object.assign(On(e),{internal_acl:t})}const ti=[U.agent,U.agentClass,U.agentGroup,U.origin];function ni(e,t,n,r,a){if(!pe(e,n).includes(t)){const l=Uo({read:!1,append:!1,write:!1,control:!1});return[e,l]}const s=En(e,n,t);let i=ei(e);return i=En(i,U.accessTo,r),i=et(i,n,t),ti.filter(l=>l!==n).forEach(l=>{i=Ht(i,l)}),[s,i]}function Fo(e,t,n,r,a){let s=e;Kn(e).forEach(d=>{const[f,u]=ni(d,a,n,e.internal_accessTo);s=ht(s,f),s=ht(s,u)});let i=Uo(t);i=et(i,U.accessTo,e.internal_accessTo),i=et(i,n,a);const l=ht(s,i);return Ws(l)}function So(e,t){return kt(e,{resourceAcl:t,fallbackAcl:null})}function ri(e){return e.internal_acl.resourceAcl}class jn extends Error{constructor(t,n){super(`[${fr(t)}] is governed by Access Control Policies in [${fr(n)}] rather than by Web Access Control.`)}}function Pt(e){return e.internal_acl.resourceAcl!==null&&de(e)===e.internal_acl.resourceAcl.internal_accessTo&&e.internal_resourceInfo.aclUrl===de(e.internal_acl.resourceAcl)}function Yn(e){return Pt(e)?e.internal_acl.resourceAcl:null}function jt(e){return e.internal_acl.fallbackAcl!==null}function oi(e){return jt(e)?e.internal_acl.fallbackAcl:null}function ai(e){return Zr({...Qa(),internal_accessTo:de(e),internal_resourceInfo:{sourceIri:e.internal_resourceInfo.aclUrl,isRawData:!1,linkedResources:{}}})}function si(e){const t=ai(e),n=Xe(e.internal_acl.fallbackAcl);return on(n,e.internal_acl.fallbackAcl.internal_accessTo).map(i=>(i=Ht(i,U.default),i=Ht(i,U.defaultForNew),i=et(i,U.accessTo,de(e)),i=et(i,U.default,de(e)),i)).reduce(ht,t)}async function ii(e,t,n){if(!Ut(e))throw new Error(`Could not determine the location of the ACL for the Resource at [${de(e)}]; possibly the current user does not have Control access to that Resource. Try calling \`hasAccessibleAcl()\` before calling \`saveAclFor()\`.`);return{...await _r(e.internal_resourceInfo.aclUrl,t,n),internal_accessTo:de(e)}}function Ut(e){return typeof e.internal_resourceInfo.aclUrl=="string"}function Ro(e,t){return Pt(e)?li(e.internal_acl.resourceAcl,t):jt(e)?fi(e.internal_acl.fallbackAcl,t):null}function ci(e){if(Pt(e)){const t=Yn(e);return di(t)}if(jt(e)){const t=oi(e);return pi(t)}return null}function li(e,t){const n=Xe(e),r=Wn(n,e.internal_accessTo),s=Bo(r,t).map(Et);return It(s)}function di(e){const t=Xe(e),n=Wn(t,e.internal_accessTo),r=Do(n);return No(r)}function ui(e,t,n){return Fo(e,n,U.agent,"resource",t)}function fi(e,t){const n=Xe(e),r=on(n,e.internal_accessTo),s=Bo(r,t).map(Et);return It(s)}function pi(e){const t=Xe(e),n=on(t,e.internal_accessTo),r=Do(n);return No(r)}function Bo(e,t){return _s(e,t,U.agent)}function Do(e){return e.filter(mi)}function mi(e){return He(e,U.agent)!==null}function No(e){return $s(e,U.agent)}function Mo(e){return Pt(e)?hi(e.internal_acl.resourceAcl):jt(e)?gi(e.internal_acl.fallbackAcl):null}function hi(e){const t=Xe(e),n=Wn(t,e.internal_accessTo),a=Oo(n,Tn.Agent).map(Et);return It(a)}function gi(e){const t=Xe(e),n=on(t,e.internal_accessTo),a=Oo(n,Tn.Agent).map(Et);return It(a)}function Ai(e,t){return Fo(e,t,U.agentClass,"resource",Tn.Agent)}function Oo(e,t){return e.filter(n=>yi(n,t))}function yi(e,t){return pe(e,U.agentClass).includes(t)}async function Ko(e,t){if(typeof e.internal_resourceInfo.aclUrl!="string")return null;try{return await nt(e.internal_resourceInfo.aclUrl,t)}catch{return null}}const ke="http://www.w3.org/ns/solid/acp#",Y={AccessControlResource:ke.concat("AccessControlResource"),PublicAgent:ke.concat("PublicAgent"),access:ke.concat("access"),accessControl:ke.concat("accessControl"),agent:ke.concat("agent"),allOf:ke.concat("allOf"),allow:ke.concat("allow"),anyOf:ke.concat("anyOf"),apply:ke.concat("apply"),deny:ke.concat("deny"),memberAccessControl:ke.concat("memberAccessControl"),noneOf:ke.concat("noneOf")},fn="http://www.w3.org/ns/auth/acl#",st={Append:fn.concat("Append"),Read:fn.concat("Read"),Write:fn.concat("Write")};async function To(e,t){const n=xe(e),r=await _r(de(n),n,t);return bi(e,r)}function xi(e){return typeof e.internal_acp=="object"&&e.internal_acp!==null&&typeof e.internal_acp.acr=="object"&&e.internal_acp.acr!==null}function xe(e){if(!xi(e))throw new Error(`An Access Control Resource for [${de(e)}] is not available. This could be because the current user is not allowed to see it, or because their Pod Server does not support Access Control Resources.`);return e.internal_acp.acr}function bi(e,t){return Object.assign(On(e),{internal_acp:{...e.internal_acp,acr:t}})}function Lo(e){const t=xe(e),n=de(t);return Ne(t,n)}function qo(e){const t=Lo(e);return t===null?[]:pe(t,Y.accessControl)}function Qo(e,t,n){const r=xe(e);return Array.from(new Set(t.map(a=>{const s=Ne(r,a);return s!==null?pe(s,n):[]}).reduce((a,s)=>a.concat(s),[])))}function wi(e){return Qo(e,qo(e),Y.apply)}function vi(e){return Qo(e,qo(e),Y.access)}function Ho(e,t){const n=pe(e,t);return{read:n.includes(st.Read),append:n.includes(st.Append),write:n.includes(st.Write),controlRead:!1,controlWrite:!1}}function Ci(e){return Ho(e,Y.allow)}function Ei(e){return Ho(e,Y.deny)}function mr(e,t,n){const r=Ye(t,Y.allOf).map(f=>Ne(xe(e),f)).filter(f=>f!==null),a=r.every(f=>Ye(f,Y.agent).includes(n)),s=Ye(t,Y.anyOf).map(f=>Ne(xe(e),f)).filter(f=>f!==null),i=s.some(f=>Ye(f,Y.agent).includes(n)),l=Ye(t,Y.noneOf).map(f=>Ne(xe(e),f)).filter(f=>f!==null),d=l.some(f=>Ye(f,Y.agent).includes(n));return r.length+s.length>0&&(r.length===0||a)&&(s.length===0||i)&&(l.length===0||!d)}function hr(e,t,n){const r=Ci(e),a=Ei(e);return n==="control"?{read:t.read,append:t.append,write:t.write,controlRead:(t.controlRead||r.read)&&!a.read,controlWrite:(t.controlWrite||r.write)&&!a.write}:{read:(t.read||r.read)&&!a.read,append:(t.append||r.append)&&!a.append,write:(t.write||r.write)&&!a.write,controlRead:t.controlRead,controlWrite:t.controlWrite}}async function an(e,t){let n={read:!1,append:!1,write:!1,controlRead:!1,controlWrite:!1};return wi(e).map(s=>Ne(xe(e),s)).filter(s=>s!==null).forEach(s=>{mr(e,s,t)&&(n=hr(s,n,"resource"))}),vi(e).map(s=>Ne(xe(e),s)).filter(s=>s!==null).forEach(s=>{mr(e,s,t)&&(n=hr(s,n,"control"))}),n}function Vo(e,t){var n,r,a,s;if(e.controlRead!==e.controlWrite)throw new Error("For Pods using Web Access Control, controlRead and controlWrite must be equal.");return{read:(n=e.read)!==null&&n!==void 0?n:t.read,append:(r=e.append)!==null&&r!==void 0?r:t.append,write:(a=e.write)!==null&&a!==void 0?a:t.write,control:(s=e.controlRead)!==null&&s!==void 0?s:t.control}}function Zn(e){return{read:e.read,write:e.write,append:e.append,controlRead:e.control,controlWrite:e.control}}async function Ii(e,t,n,r){const a=await rn(e,r),s=n(kt(e,a),t);return s===null?null:Zn(s)}async function ki(e,t,n){const r=await rn(e,n),a=t(kt(e,r));return a===null?null:Zn(a)}async function Pi(e,t,n){const r=await rn(e,n),a=t(kt(e,r));if(a===null)return null;const s={};for(const[i,l]of Object.entries(a))s[i]=Zn(l);return s}function Jo(e,t,n){return Ii(e,t,Ro,n)}function zo(e,t){return ki(e,Mo,t)}function ji(e,t){return Pi(e,ci,t)}async function Go(e,t){if(!Ut(e))return null;const n=await rn(e,t),r=kt(e,n);let a;if(Pt(r))a=ri(r);else if(jt(r))a=si(r);else return null;return So(r,a)}async function Xo(e,t,n){let r=null;try{return r=await ii(e,t,n),So(e,r)}catch{return null}}async function Ui(e,t,n,r,a){const s=await Go(e,a);if(s===null)return null;const i=Yn(s),l=n(s),d=Vo(t,l),f=r(i,d);return Xo(s,f,a)}async function Fi(e,t,n,r,a,s){const i=await Go(e,s);if(i===null)return null;const l=r(i,t),d=Yn(i),f=Vo(n,l),u=a(d,t,f);return Xo(i,u,s)}async function Si(e,t,n,r){return Fi(e,t,n,Ro,ui,r)}async function Ri(e,t,n){return Ui(e,t,Mo,Ai,n)}async function Bi(e,t){const n=await Ko(e,t);if(n===null)return null;const r=Wr(n).type;return Array.isArray(r)&&r.includes(Y.AccessControlResource)?de(n):null}async function Ft(e,t){const n=await Bi(e,t);if(n===null)return null;let r;try{r=await Yr(n,t)}catch{return null}return{...e,internal_acp:{acr:{...r,accessTo:de(e)}}}}async function Wo(e,t,n){const r=await nt(e,n),a=await Ft(r,n);return a===null?Jo(r,t,n):an(a,t)}function Di(e){return Array.from(new Set(Kn(xe(e)).map(t=>Ye(t,Y.agent)).reduce((t,n)=>t.concat(n),[])))}async function Ni(e){return(await Promise.all(Di(e).map(async t=>({[t]:await an(e,t)})))).reduce((t,n)=>({...t,...n}),{})}async function Mi(e,t){const n=await nt(e,t),r=await Ft(n,t);return r===null?ji(n,t):Ni(r)}async function Oi(e){return an(e,Y.PublicAgent)}async function Yo(e,t){const n=await nt(e,t),r=await Ft(n,t);return r===null?zo(n,t):Oi(r)}function St(e,t){return Object.assign(On(e),{internal_acp:{...e.internal_acp,acr:ht(e.internal_acp.acr,t)}})}const gt="defaultAccessControl",Vt="defaultAcrAccessControl";function _n(e,t){const n=xe(e);return de(n).concat("#").concat(t)}function $n(e,t,n){return _n(e,t).concat("AgentMatcher").concat(n.charAt(0).toUpperCase()+n.slice(1)).concat("Policy")}function Zo(e,t){const n=xe(e),r=_n(e,t),a=Ne(n,r);return a===null||typeof a>"u"?ct({url:r}):a}function gr(e){return e.includes("Member")?Y.memberAccessControl:Y.accessControl}function _o(e,t){const n=_n(e,t),r=xe(e);let a=Lo(e);return(a===null||typeof a>"u")&&(a=ct({url:de(r)})),pe(a,gr(t)).includes(n)?e:(a=_t(a).addUrl(gr(t),n).build(),St(e,a))}function Ki(e,t){const n=_o(e,Vt),r=Zo(n,Vt);return St(n,_t(r).addUrl(Y.access,t).build())}function Ti(e,t){const n=_o(e,gt),r=Zo(n,gt);return St(n,_t(r).addUrl(Y.apply,t).build())}function Li(e,t,n){const r=$n(e,t,n);return r.includes("Acr")?Ki(e,r):Ti(e,r)}function $o(e,t,n){return $n(e,t,n).concat("Matcher")}function qi(e,t,n){let r=Ht(e,n);return(t.read||t.controlRead)&&(r=Te(r,n,st.Read)),t.append&&(r=Te(r,n,st.Append)),(t.write||t.controlWrite)&&(r=Te(r,n,st.Write)),r}const Ar=Y.anyOf;function Qi(e,t,n){const r=$n(e,t,n),a=$o(e,t,n);let s=Ne(xe(e),r);return s||(e=Li(e,t,n),s=ct({url:r}),s=qi(s,{[n]:!0},Y.allow)),pe(s,Ar).includes(a)?e:(s=_t(s).addUrl(Ar,a).build(),St(e,s))}function Hi(e,t){return Te(e,Mn.agent,t)}function Vi(e,t){return En(e,Mn.agent,t)}function dt(e,t,n,r,a){var s;const i=$o(e,n,r),l=Qi(e,n,r),d=(s=Ne(xe(l),i))!==null&&s!==void 0?s:ct({url:i});return St(l,a==="add"?Hi(d,t):Vi(d,t))}async function ea(e,t,n){const r=await an(e,t);return typeof n.read=="boolean"&&r.read!==n.read&&(e=dt(e,t,gt,"read",n.read?"add":"remove")),typeof n.append=="boolean"&&r.append!==n.append&&(e=dt(e,t,gt,"append",n.append?"add":"remove")),typeof n.write=="boolean"&&r.write!==n.write&&(e=dt(e,t,gt,"write",n.write?"add":"remove")),typeof n.controlRead=="boolean"&&r.controlRead!==n.controlRead&&(e=dt(e,t,Vt,"controlRead",n.controlRead?"add":"remove")),typeof n.controlWrite=="boolean"&&r.controlWrite!==n.controlWrite&&(e=dt(e,t,Vt,"controlWrite",n.controlWrite?"add":"remove")),e}async function Ji(e,t,n,r){const a=await nt(e,r),s=await Ft(a,r);if(s===null)return await Si(a,t,n,r),Jo(a,t,r);try{return await To(await ea(s,t,n),r),await Wo(e,t,r)}catch{return null}}async function zi(e,t){return ea(e,Y.PublicAgent,t)}async function Gi(e,t,n){const r=await nt(e,n),a=await Ft(r,n);if(a===null)return await Ri(r,t,n),zo(r,n);try{return await To(await zi(a,t),n),await Yo(e,n)}catch{return null}}const Xi=Object.freeze(Object.defineProperty({__proto__:null,getAclServerResourceInfo:Ko,getAgentAccess:Wo,getAgentAccessAll:Mi,getPublicAccess:Yo,setAgentAccess:Ji,setPublicAccess:Gi},Symbol.toStringTag,{value:"Module"}));function Wi(e){if(!ta(e))throw new Error("Applet layout descriptor must be an object");if(typeof e.type!="string")throw new Error("Applet layout descriptor type must be a string");switch(e.type){case"single-pane":case"two-pane":return yr(e.context),e;case"three-pane":return yr(e.context),e;default:throw new Error(`Unsupported applet layout type: ${e.type}`)}}function ta(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function yr(e){if(e!==void 0){if(!ta(e))throw new Error("Applet layout descriptor context must be an object");if("collapsible"in e&&typeof e.collapsible!="boolean")throw new Error("Applet layout descriptor context.collapsible must be a boolean");if("initiallyCollapsed"in e&&typeof e.initiallyCollapsed!="boolean")throw new Error("Applet layout descriptor context.initiallyCollapsed must be a boolean")}}function Yi(e){const t=e.access??Xi;return{inspectAgentAccess:n=>Zi(n,e.fetch,t),ensureAgentAccess:async n=>{try{for(const r of n.resources){await _i(r.url,r.mediaType,e.fetch);const a=await t.setAgentAccess(r.url,n.service.webId,ec(r.access),{fetch:e.fetch});if(!a||!na(a,r.access))return Oe("permissionDenied",n,"Pod did not grant the requested service access.")}return Oe("granted",n)}catch(r){return Oe("permissionDenied",n,Un(r))}},revokeAgentAccess:async n=>{try{for(const r of n.resources)if(!await t.setAgentAccess(r.url,n.service.webId,{read:!1,append:!1,write:!1,controlRead:!1,controlWrite:!1},{fetch:e.fetch}))return Oe("permissionDenied",n,"Pod did not revoke the service access.");return Oe("missing",n)}catch(r){return Oe("permissionDenied",n,Un(r))}}}}async function Zi(e,t,n){try{for(const r of e.resources){const a=await n.getAgentAccess(r.url,e.service.webId,{fetch:t});if(!a||!na(a,r.access))return Oe("missing",e)}return Oe("granted",e)}catch(r){return Oe("permissionDenied",e,Un(r))}}async function _i(e,t,n){const r=await n(e,{method:"HEAD"});if(r.ok)return;if(r.status!==404)throw new Error(`Unable to inspect Pod resource (${r.status}).`);await $i(e,n);const a=await n(e,{method:"PUT",headers:{"content-type":t},body:`# Created by the Xpod applet permission broker.
|
|
2
|
-
`});if(!a.ok)throw new Error(`Unable to create Pod resource (${a.status}).`)}async function $i(e,t){const n=new URL(e),r=[];let a=new URL("./",n);for(;a.pathname!=="/";){const s=await t(a.href,{method:"HEAD"});if(s.ok)break;if(s.status!==404)throw new Error(`Unable to inspect Pod container (${s.status}).`);r.push(a.href),a=new URL("../",a)}for(const s of r.reverse()){const i=await t(s,{method:"PUT",headers:{"content-type":"text/turtle",link:'<http://www.w3.org/ns/ldp#BasicContainer>; rel="type"'},body:""});if(!i.ok&&i.status!==409)throw new Error(`Unable to create Pod container (${i.status}).`)}}function ec(e){return{read:e.read===!0,append:e.append===!0,write:e.write===!0,controlRead:!1,controlWrite:!1}}function na(e,t){return(!t.read||e.read===!0)&&(!t.append||e.append===!0)&&(!t.write||e.write===!0)}function Oe(e,t,n){return{status:e,resources:t.resources,...n?{message:n}:{}}}function Un(e){return e instanceof Error?e.message:"Unable to update Pod service access."}const tc=Wi;function nc(e,t){return rc(e,t)}function rc(e,t){const n=oc(e),r=e.createController(t);return n.type==="single-pane"?{layout:"single-pane",controller:r,element:p.createElement(n.render,{controller:r,host:t})}:n.type==="two-pane"?{layout:"two-pane",controller:r,slots:{listHeader:p.createElement(n.slots.listHeader,{controller:r,host:t}),list:p.createElement(n.slots.list,{controller:r,host:t}),mainHeader:p.createElement(n.slots.mainHeader,{controller:r,host:t}),main:p.createElement(n.slots.main,{controller:r,host:t})}}:{layout:"three-pane",controller:r,contextConfig:n.contextConfig,slots:{listHeader:p.createElement(n.slots.listHeader,{controller:r,host:t}),list:p.createElement(n.slots.list,{controller:r,host:t}),mainHeader:p.createElement(n.slots.mainHeader,{controller:r,host:t}),main:p.createElement(n.slots.main,{controller:r,host:t}),context:p.createElement(n.slots.context,{controller:r,host:t})}}}function oc(e){if("layout"in e){const t=ic(e.layout),n=tc(t.descriptor),r=n.type;if(e.manifest.layout!==r)throw new Error(`Applet manifest layout ${e.manifest.layout} does not match descriptor layout ${r}`);if(r==="single-pane"){if(!("render"in t))throw new Error("Applet descriptor single-pane render must be a function");return Ze(t.render,"Applet descriptor single-pane render"),{type:"single-pane",render:t.render}}if(!("slots"in t))throw new Error(`Applet descriptor declares ${r} but no slots were provided`);return r==="two-pane"?(Fn(t.slots,"Applet descriptor two-pane"),{type:"two-pane",slots:t.slots}):(ac(t.slots,"Applet descriptor three-pane"),{type:"three-pane",contextConfig:n.context,slots:t.slots})}if(e.manifest.layout==="single-pane"){if(!("render"in e))throw new Error("Applet manifest declares single-pane but no single-pane renderer was provided");return Ze(e.render,"Applet single-pane render"),{type:"single-pane",render:e.render}}if(e.manifest.layout==="two-pane"&&"slots"in e)return Fn(e.slots,"Applet two-pane"),{type:"two-pane",slots:e.slots};throw new Error(`Applet manifest declares ${e.manifest.layout} but no supported applet layout was provided`)}function Fn(e,t){sc(e,t),Ze(e.listHeader,`${t} slot listHeader`),Ze(e.list,`${t} slot list`),Ze(e.mainHeader,`${t} slot mainHeader`),Ze(e.main,`${t} slot main`)}function ac(e,t){Fn(e,t),Ze(e.context,`${t} slot context`)}function sc(e,t){if(typeof e!="object"||e===null)throw new Error(`${t} slots must be an object`)}function Ze(e,t){if(typeof e!="function")throw new Error(`${t} must be a function`)}function ic(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("Applet descriptor layout must be an object");if(!("descriptor"in e)||e.descriptor===void 0)throw new Error("Applet descriptor required");return e}const cc=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),ra=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();var lc={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const dc=p.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:a="",children:s,iconNode:i,...l},d)=>p.createElement("svg",{ref:d,...lc,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:ra("lucide",a),...l},[...i.map(([f,u])=>p.createElement(f,u)),...Array.isArray(s)?s:[s]]));const q=(e,t)=>{const n=p.forwardRef(({className:r,...a},s)=>p.createElement(dc,{ref:s,iconNode:t,className:ra(`lucide-${cc(e)}`,r),...a}));return n.displayName=`${e}`,n};const uc=[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]],fc=q("ArrowDown",uc);const pc=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],mc=q("ArrowUp",pc);const hc=[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]],gc=q("Bot",hc);const Ac=[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]],Jt=q("Box",Ac);const yc=[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]],oa=q("Brain",yc);const xc=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],pn=q("Check",xc);const bc=[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]],wc=q("CodeXml",bc);const vc=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],aa=q("Copy",vc);const Cc=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],er=q("ExternalLink",Cc);const Ec=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],Ic=q("EyeOff",Ec);const kc=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],Pc=q("Eye",kc);const jc=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]],sa=q("Globe",jc);const Uc=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],ia=q("Image",Uc);const Fc=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],Sc=q("Info",Fc);const Rc=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],zt=q("KeyRound",Rc);const Bc=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],ze=q("LoaderCircle",Bc);const Dc=[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]],Nc=q("LogOut",Dc);const Mc=[["rect",{x:"14",y:"4",width:"4",height:"16",rx:"1",key:"zuxfzm"}],["rect",{x:"6",y:"4",width:"4",height:"16",rx:"1",key:"1okwgv"}]],Oc=q("Pause",Mc);const Kc=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],ca=q("Pencil",Kc);const Tc=[["line",{x1:"9",x2:"9",y1:"4",y2:"20",key:"ovs5a5"}],["path",{d:"M4 7c0-1.7 1.3-3 3-3h13",key:"10pag4"}],["path",{d:"M18 20c-1.7 0-3-1.3-3-3V4",key:"1gaosr"}]],Lc=q("Pi",Tc);const qc=[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]],la=q("Play",qc);const Qc=[["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m18 3-4 4h6l-4 4",key:"16psg9"}]],Hc=q("PlugZap",Qc);const Vc=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],sn=q("Plus",Vc);const Jc=[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]],zc=q("RefreshCcw",Jc);const Gc=[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]],Sn=q("RotateCw",Gc);const Xc=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],da=q("Search",Xc);const Wc=[["path",{d:"M20 7h-9",key:"3s1dr2"}],["path",{d:"M14 17H5",key:"gfn3mx"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],Yc=q("Settings2",Wc);const Zc=[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]],_c=q("SquareTerminal",Zc);const $c=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]],el=q("Square",$c);const tl=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],tr=q("Trash2",tl);const nl=[["path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1",key:"18etb6"}],["path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4",key:"xoc0q4"}]],rl=q("Wallet",nl),ol="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAB7CAAAewgFu0HU+AAA0PUlEQVR4nO2dZ1gUZ9fH/7O7swMEkCJSROyKmgQ1VuyKsaBRQJSIIUEFGyjmERVbjMaGHUVB0ViIEnkpRlGMEmMkiSjWCLF3rIiKtK3zfvCaDTEwO7tsQ+f3Jc9zueyc3Z3/3Oec+5xzE05OTjR4eHiqRGBsA3h4TBleIDw8LPAC4eFhgRcIDw8LvEB4eFjgBcLDwwIvEB4eFniB8PCwwAuEh4cFXiA8PCzwAuHhYYEXCA8PC7xAeHhY4AXCw8MCLxAeHhZ4gfDwsMALhIeHBV4gPDws8ALh4WGBFwgPDwu8QHh4WOAFwsPDAi8QHh4WeIHw8LDAC4SHhwVeIDw8LPAC4eFhgRcIDw8LvEB4eFgQGduAd5U2bdqgTp06EIlEsLGxQb169UCSJJydnfHq1SuUlZVBKpXiyZMnUCgUuHr1KoqKivDy5Utjm85TCV4gOsDMzAzNmzeHm5sbPDw80L59e7Rq1Qrm5uYQCoUQi8Vq3+PRo0coKytDXl4e7t+/j4yMDFy7dg2lpaUG+AQ81UHw54NoT/PmzdG7d294eXmhc+fOoChK9W8KhQJKpRIAVP+tCoIgAAAikQgCwT8eb3l5OW7cuIFffvkF586dw2+//YaKigo9fRKe6uAFogXe3t7o1q0bAgICQFEUBAIBZDIZqxA0RSAQgCRJAIBcLkdeXh5Wr16NkydP8kIxILxAOCIQCNC/f3+EhYWhbdu2EIlEkMlkoGkaNK3fr1AgEEAoFEKhUODChQv46aefkJycjFevXun1ujy8QNRCEAQ6d+6MadOmoXfv3gAAqVSqd1FUhUAggEgkAkEQuHr1KqZMmYK8vDyD2/E+IbS0tFxobCNMmZCQEKxatQotW7aERCKBQqEwmi00TUOhUEChUKBevXrw8fEBRVEoLS3FkydPjGbXuwy/glRD+/btMWvWLPTs2VPn8YWuYOKU0tJSfP311zhw4IBRVrZ3GV4gVRAUFIR58+bBysoKEolE6/cRCAQgCAJCoVCVrXqbyquCtjDxSXBwMI4fP671+/D8F14gb+Ht7Y3NmzeDIAiNb1qCIECSpOpvKyoqUFxcjBcvXuDevXuQyWR49uwZrK2tYWdnB7FYDFtbW9jb28PJyUn1PgqFAnK5XKNrCwQClJSUID09HYsWLeIzXTqCF0glJk2ahMjISIhEIo1cKqFQCJHozZ7r7du3kZubi+TkZDx48AASiQRlZWV49erVv9wfZt/DwsICFhYW6Nq1K9q1awdPT0/Y29ujXr16kMvlUCqVnN0mJojPyspCWFgYn+XSAbxAAJAkiaioKEyaNAlyuZzzysHEAPfv38euXbtw48YNnD59GkVFRTWyxdXVFePHj4ePjw9sbW1B0zSkUimnvycIAmKxGJcuXcLIkSNB0zScnJzg4uKCZs2awcHBAWKxGAKBAC9evABN0yAIAs+ePcP9+/dx8eJFSKVSVFRU8PEMeIEAAL744gtER0dzjjeYFeP58+c4evQo1q9fjzt37ujUJoFAgKZNm6JHjx4YPXo03N3doVQqOa1sNE3DzMwMd+7cQZ06dUCSJEiShFgsrjYWYty68vJy3Lt3DwUFBTh//jwuXbqE3Nzc97bk5b0XiLm5OXJzc2FlZcXp5hMKhXj+/DlSUlIQHx+P58+f6z31S5IkIiMjER4eDqVSCblczunpLhQKVa97+78A/iOWymUvzP+WSCS4c+cOzpw5g/379yMnJwcymUwnn6s28F4LxNXVFYmJiWjWrBmnoFgsFqOiogJ+fn44f/68ASz8N76+vpg2bRoaN25ssLRz5c1JmUyGs2fP4tChQ8jIyMDDhw8NYoMxea8FkpmZCQ8PD7WuFeNS5ebmIioqCpcvXzaQhVVz7NgxuLu7a5zpqilMfAMAt27dwpYtW7Bz506D2mBo3tud9MjISPj4+KgVB/Pk3LFjB6ZMmYLHjx8byML/0q1bN0RHR6Nhw4YwMzMzShDNVCnb2dmhb9++aNu2LV6/fo2ioqJ3MrX8Xq4gHTt2RHJysiqDo47Zs2cjKSnJAJZVjZmZGUJDQ1UpaFPZ2WeyeDRN4/z58wgPD8etW7eMbZZOee9abgUCASZOnKja5WaDoiicP38eqampBrLu3zg4OGDs2LHIyMjA7NmzQdM0JBKJSYgDeNPnIpFIIJPJ0L59e+zevRsdOnQwtlk65b1bQSwsLHDt2jW1/jtFUbh9+zZ69epllKxNnz59EB0dDVdXVyiVSq1tIAgCBEGoSuarg2uDFxsikQilpaVYsGAB0tLSOO/dmDLvXcttZGQkhEKhWoHk5+fjyy+/NLg42rdvj5EjR2LUqFGgKErrWrDKDVdMucvNmzdRUlKiKoUpKSmBUCiEg4MD2rRpA7FYDGtra1VnpKZl/XK5HBYWFli3bh2GDx+OyMhIPHjwQCv7TYX3agUhCAIFBQVqn2wURaFdu3YGDcgbN26Mr7/+Gn5+fqrEgKZPcpFIpFolXrx4gUOHDuH+/fvIzs5Gfn4+ysvLq/1bMzMzuLm5oVWrVmjUqBE+/vhj9O/fXyUyTe2hKAo5OTkYM2YMSkpKNPocpsR7tYJERkZycq0WLFhgMHGIxWL06dMHixcvRoMGDbRqxmJWi5cvXyIjIwNHjhxBfn4+CgoKOL9HRUUFrl27hmvXrgF48zDx9PRE79690b17d7i7u0MsFnNeUSUSCdq3b4+QkBCsXbtWo89jSrw3K4i9vT2OHz8Oa2tr1te9ePECPXv2xOvXr/VqD0mS+OKLL+Dv7w8PDw/VDrkmVBbG6dOnsXr1aly6dEnntopEInTt2hWRkZHo2LEjZxEz+yYJCQlYvHhxrYxJ3psVZNy4cXBwcFDr0+fm5rK6IrqgQYMGiI2NRceOHQFA4ziDufFevHiBo0ePIj4+Hvn5+fowFcCb2OLkyZO4ePEili9fjiFDhkAsFqsVClNkyXz3kydPNpkMHFfe2RWkZcuWaNSoEfr164e2bduiVatWamumaJrGV199hRMnTujFptatW6N///4ICQmBnZ2daugDV5iyD6VSiezsbEyfPh1Pnz41eBvwRx99BB8fH3z11Vf/GlXEBkVRiImJwbJly/RsnW55pwRibW2Nvn37wt/fH+3atYOtra3q39Q97QiCwOvXr/Hhhx/q3C4zMzPMmzcPfn5+sLGx0SptKxAIIBAIcP/+faxfvx6pqalGd1kmTJiAhQsXcnK5mHRzv379cP36dQNZWHPeCRfLyckJn332GUaOHIk2bdoAeOMWaOK6iMVixMfH69QukUiEzp07IyIiAt26dYNCodDYnWLijGfPnmH+/Pk4evQoysrKdGqntsTHx+PDDz/EiBEjoFQqIZVKWVuLCYLAmDFj8M033xjYUu2p1SsIRVEYOXIkoqKiYGNjA5qmtd63oCgK9evX15mPPGDAAEyZMgXu7u6wtLTU+GlfuYxjz549WL9+Pe7fv68T23QJSZIYO3YsJkyYACcnJ7WfU6FQYMyYMfjzzz8NZGHNqJUCEQqFGDBgAGbOnIlmzZqBIAjOPRJVIRAIkJGRgUmTJtXYNisrK0RERGDy5MkAoFGHIoNYLEZZWRkOHz6MPXv21IqbqVOnTti2bRusrKxYXycUCqFUKvHJJ5+gsLDQQNZpT61zsVq2bIlFixahW7duqpGfuqhqrek0EAcHB4wbNw4DBw5Ey5YttdrPYDr+bty4gXnz5uktWaAPTp8+jVWrVmHx4sWsq7BCoYBYLMbSpUsRGhpqQAu1o1atIDY2Njh27Bjq16+v0+mGFRUVCAwMxNmzZ7X6ex8fHyxYsACOjo5auXlMv0l+fj4OHz6MLVu2oLi4WCtbjMkHH3yAU6dOwcbGRu2qqVQqMWrUKJw5c8ZA1mlHranmDQwMxK+//gpnZ2dIJBKd9kJIJBKtJoC4uLhg9erViImJgaOjI6RSqUbiIAgCFEWhoqICK1aswLBhw7Bq1apaKQ4AKC0txbhx4/7VslsdFEVh6dKlBrJMe0x+BWFSpOPGjdM6PapuwHRhYSEGDRqEZ8+ecX5fsViMnJwcODk5aVynxGz0SSQSnDhxAnFxcbUizuBKSEgI5s+fr/Y7oSgKnTt3xr179wxkmeaY/AoSFRWFcePGqfoOuCAUCkFRFCiK4lTCIZFINA4YY2Nj4eTkpHF/BkmSEIlEOHnyJPz8/DBu3Di9iIMgCAQFBSEtLQ0nT57E3r174e/vD3Nzc51f6222bt2KK1eucNpE7Ny5s97tqQkmvYJ4e3sjISFBo3hDLBbj9evXePLkCX7++Wfk5+djxYoVqqrUqrh9+zb69OnD2S4nJyccPnwYNjY2nDoSgX/StoWFhdiwYQN27Nihl40+KysreHp6IiQkBJ6eniAIQrUHoVAocP78eSQlJSElJUWvLbLt27dHRkYG676PUCjEb7/9hsDAQL3ZUVNMMoslEAjg5+eHNWvWcM5SMTdgXl4eoqKicO7cOSgUCrRt21btTaxpPGNnZ8fJz2agKAqFhYXYvn079uzZo7dJ7AMHDkRERAQ8PDwA/LfGiyAIfPLJJ/jkk0/wxRdfICIiAleuXNGLLefOnUNKSgp8fX2rfRAoFAq0bt1aL9fXFSbpYn322WeIiYn5V5cbGxRFQSgUIjY2VpUZMeYxBcAbwVIUBZIkkZmZif79+2Pt2rV6EUfdunUxc+ZMxMXF4eOPP4ZEIqnyyc0UD0qlUnh4eCA1NRVRUVFo3ry5zm0CgE2bNqmtHLC0tISXl5derq8LTG4FGT58ONavX8853qAoCunp6di1a5fJBLoikQg0TePcuXNYt24dfv31V710Jrq4uCAsLAw9e/ZE06ZNIZPJOLttEokEVlZWmDp1KgIDA5GSkoK1a9fq9JTdFy9e4OnTp3B0dKz2NRRFwdPTE8eOHdPZdXWJSa0g5ubmmDhxIgiC4Lxy7N+/H5MmTTIZcZAkiYcPH2Ls2LEYNmwYjh49qnNxMEV/WVlZCA4ORtOmTVFRUaFxmQxTG2Zra4vQ0FAkJibi008/5Vyhq45Xr16pTX7QNI1PP/2Us7tqaExqBWndujVat26t9odm0qQnTpzA7NmzDWQdNwoKCjBq1Cjcvn1b5+9NkiR69eqF4cOH47PPPgPwT5xRkxuMEXC7du0QHx+PU6dOYdu2bThx4kSNxF1WVqa23ZamaTRs2FDra+gbk1pBYmJi1D69GHHs3bsXQUFBOnUJdMH169f1MqjAzc0NSUlJ2L59O/z8/ABUP32EiX80SSQAb4QiFArRu3dv7N69G999992/zi3RhrNnz6r9TUUikd7ioJpiMgJZvXo1mjRpwqntdMOGDfjf//5n9H6IqmA7TUob7OzsEBgYiPT0dHh6egJAtXsvJEmCoijI5XIkJCQgNzcXQqGQdar721SedRUUFIQDBw5g4sSJsLe318r+Y8eOsabYGZjuSlPDJATSoUMH+Pj4qM3Li0QinDlzBkuXLn3nz66wsLBAaGgojh07hmXLlqFu3brVCoMpWSksLERsbCyGDh2K+fPnIygoCBMnTsSlS5dUB/ZwhRGKi4sLFixYgGPHjmm1X8F1wHW7du00fm9DYBIxyDfffAOSJFlTs8xZfwsXLjScYUaAIAi4uroiJiYGXbp0UaW6qxMGc+OfOXMGs2fP/ldvenFxMQ4ePIjjx48jIiIC48aNg7m5uUalMTKZDARBoF69eli+fDl69eqFuLg4XLx4kVMqnct0GJqmUa9ePU72GBqjC6RTp07o0KGD2nw5SZLYtWuX0Ser65N27dphwoQJ6NOnj9oDRBlX7u+//0ZSUhISExOrXYFLS0uxZMkS/Pbbbxg2bBj8/PxgZmbGubuRqVAmCAJDhw5Fnz59kJWVhfj4eE7HQJSVlYEkyWpFyRz4Y4oY3cVau3Ytp0zJ5cuXMX/+fANYZBy+/fZbJCUlYdiwYTA3N682vmLqzEpLSzFt2jQMHDgQCQkJnMpGTp48iRkzZmDQoEE4evSo2lOn3oaZDUxRFIYNG4Yff/wRI0eOhIWFBevf3b9/n/UaCoUCzs7OnGwwNEYViKOjI5ydnVmXe5qmQVGUajjAu0SdOnUwdOhQpKenIzQ0FBYWFtXGGcz3IJPJcPjwYfj5+SElJUWrM0KuXLmCCRMmYMWKFXjy5Mm/DiHlAhOfmJubY+3atUhJSUFQUBAsLS2rfL2zs7PagRmmOg7IqC6Wu7u72mDbzMwMly5dwh9//GEgq/QPQRAYMmQIpk6dqpqiwubuME/fzZs349ixYzr5LsrLyxETE4Ndu3ZhyJAhCA8Ph5ubm0ZDJZj4yMPDAx4eHggKCsLUqVP/M6PL2tparbtoqqdVGXUFadWqFevEceDN02rGjBkGskj/ODo6IioqChs3bkSbNm1QUVHB6RCfx48fIzY2VucPipcvXyIxMRHDhg3DkSNHVG0CXDNeleu7WrdujbS0NCxcuFA1XUbd7wu8+XxPnz6t0efQF0ZbQUiSRKdOndS+7uDBg3qdGmgoGjRogGnTpqFHjx5wc3NT1U1x8f+VSiVcXV2RkZGBzMxMxMXFobCwUKdHsD1+/BihoaHo27cv/Pz80L9/f4hEIo2uIZVKYWFhgQkTJmDkyJH4v//7Pxw4cIDT32oyR9iQGG0FoSgK3bt3Z30NQRD4/fffjV6ZWxMIgsCAAQPw888/IzAwEA0aNKi2booZDlcVcrkcrq6umDBhAn755RdERUXp3FapVIrMzEyEhIRgzJgxKCgoAEVRqnMJucDUd1lbWyMkJARLly7llISp6dAMfWE0gTg4OKgdEUMQhEnOglIHTdMgSRKDBg3Cpk2bsG3bNnzwwQeQSCTVrhpisVjVGkxRVJWvYYbhWVpaYvLkyfj+++/h6empUYDNlezsbHz++efYvXs37t27p5HbVdnWNm3acHrAMVPlTQ2jCWTAgAFqX0MQRK07804mk6Fhw4aqc9SHDx9e7UYf8E/aNicnBz4+PggNDVWN+6nuxmemGA4cOBB79uzB7t27MXToUJ1XxN66dQszZ86Er68vVq9eDZlMBrFYrJFQ1LmRTHxlqoMqjBaD9OvXT+1kcJFIhLt37xrQqprTokULJCcnq4Y5VBeAkyQJgUCA4uJi7NmzB6tXr1ZVvh45cgSBgYGYO3cubG1toVAo/hMLMHsSAoEAvXv3RteuXeHu7o74+Hid32wPHz7EqlWr8Ndff2HOnDlo3LgxKIrSyeglgiBw9epVHVmqe4y2gnh4eLAGgCKRqNatHsCbnL+9vT3rMAeKovD06VOsWbMGn332Gb799tv/lIX/8MMPGDx4MHbs2IGioqJqXRxmT4IgCHz99ddITU1FSEgImjZtqvPPduTIEQwePBihoaHIzc3914lW2qJQKJCammqytXVGE4iVlRXr5pBIJDKZJihNqM6dYnrmKYpCdnY2/Pz8sHLlStan5507dxAVFYWhQ4dix44dIElStfK8DZNubdWqFRYtWoTk5GT069dP525XaWkpMjMz4evrixUrVkAmk2kcn1SmuLjYpCdIGkUg1e24vk1Nn06mAhNLXLx4EbNmzUJgYKBGq+Pdu3cRFRWF6dOn49KlSxAIBFVmlpiaKYlEAkdHR2zZsgUrV65E27ZtdfVRVMhkMsTExGD06NHYvn07pFKp6vBPTaioqNDbEAtdYBSBcJ3NZMhDNPWBSCQCRVF49OgRIiIiMHjwYOzatUvrkpmkpCSMGjUKM2bMQH5+vmpYRVXIZDKQJInAwEDs27cPq1at0ssD59SpU5g7dy4GDRqEzMxMjYN4Gxsb+Pr66twuXWEUgZhq3Y2uYDr6SkpKcODAAYwaNQqpqak6ee/i4mJVUWNycjIqKirUxidmZmYIDAzEgQMH4Ovrqza9rg3Xr1/HhAkTsHHjRgBvkhBc3DszMzOsWrUKAwcO1LlNusAoAuH6hKkN4/HfhnlKx8fHq9K2+kg2lJaWYurUqaq9Cpqmq/1elUolKioq0K5dO2zYsAE//vgjfH19db6iSKVSLF26FKNHj8aFCxc4dVcye0abNm3Cp59+qlN7dIFRBML1kExdllIYiuLiYowdOxYLFy7E33//rffr5ebmYubMmRg+fDhrwR9BEJBIJJDL5SqhLFy4EA0aNNC5TdnZ2Rg9ejSWLFnCaRVRKBQQiURYsmQJ64ggY2AUgXA5WJ6maQwaNMgA1uiWS5cuGSUrc/78eU4Vscz+iVwux/jx45Geno7FixfDxcVFpxmvV69eISEhAYcPH+YUvDP1ZqZ2ZojR0rwlJSWsrpZMJjPZRn42jDnfSZPgmBGKk5MTxo8fj59//hn+/v46m4kFvPkNw8LC8PPPP3MSiUwmQ3BwMD744AOd2VBTjCaQixcvsvrANE0bZBK5PjC1IWjMqKSqNuOYtHCdOnWwdu1a7Ny5E3369NFZfCKTyTB+/Hhs375dbdGjUqkESZL49ttvdXJtXWA0gZw5c0bt00qhUMDOzs5AFr27lJSUID8/H2ZmZtXOymLKWby8vLBjxw78+OOPqp6OmiKTyTB37lysWLFC7UqiUCgwbNgwnV27phhNIJmZmWpfQ9M06tevbwBr3m3Ky8sRGhqKNWvW4NmzZxCLxVWuEIzbRRAEunXrhj179mD69OmwsbHRiR3r16/H3bt31a6wFhYWWL9+vU6uWVOMJpAbN26o3UGlaVoncYipuTyGRigUQi6XY+XKlRgyZAgSEhJU9V1VfTfM/omdnR1mzpyJ9PR0TJ06Fba2tjW2JSMjQ+0gOZlMhjZt2mDIkCE1vl5NMZpAJBIJTp8+zfoamqbRo0cPTpP5qkMul6tNF1MUpXYyx7tCQUEB5s+fDz8/P2RnZ7NONlEoFJBKpWjWrBmioqLwww8/oFevXjUK5BMSEvDw4UO17yGTyRAeHq7TpIE2GO3qcrkcly5dUvs6T09PrcdeAm9mMqnbd3F1dcWJEycQHh5usvOZdM2NGzfg7++PsLAwnD17VjWY721omlY1P3l4eGDPnj2IiYnR+jd59OgRQkJC1D70lEolWrRogb59+2p1HV1hVHneuHFDbbeZtbU1Jk2apPU1CgoK1HbE0TQNFxcXREVFYefOnbUyvawtqampCAgIwP/+9z+8fPlSNfS6KmQyGRQKBfz8/LBx40atS1bOnz+P1NRUtQG7UChEhw4dtLqGrjCqQC5fvqy2D0AqlSIwMBAff/yxVteQSCQIDQ3F6dOnVWnEqpDJZJDJZOjZsycSExOxceNGtT3z7wqlpaVITk6Gt7c3Nm/ejNevX1cbtzHxSe/eveHu7q71NWNjYzk1dhn7iDajCuTBgwdqG/ppmoZYLMaaNWu0jhMeP34MPz8/TJw4Ebdu3ao2OGWyOBYWFvDz80NycjKioqJ0lsUxde7du4dFixZh8ODBKCsrU/v6Fi1aaH2t69evq+0kpGlaNTfMWBh99OjKlSvVLrVKpRItW7bE1KlTtb6OXC5HZmYmfHx88MMPP6gmolfldzOTOaRSKcLDw5GcnAxfX1/UrVtX6+vXJm7fvs2pJL8mVcEymQxbtmxh/e1pmjb6SFKjC2T79u24ffu22myFUqnEtGnTalzMVlhYiMjISAwePBg//vijahBBdSsKMxBt48aNOHjwIEaPHg2FQmGyLaK1iYMHD3J6nTFFYnSBAG8GN6vrEWFuyJkzZ9b4ejRN4/Lly4iIiEBAQADOnTsHsVjMWo4hk8ng5uaG6OhozJ07V6NZUTzVc/XqVbVji4xZBm8SAjly5AjOnj2r1tWSSCTw8fFBcHCwzjb/Tp8+jcDAQHz33Xe4evUqzMzMWHu+lUolvLy83pt0sL65evWq2rqvrl27Gsia/2ISAgGAkJAQFBcXq3W1hEIhli5dinnz5un0NNbY2Fj4+vpi+fLlquFtVf1wzEwqNnj3izvPnz9n/XeZTKaXnnqumIxAioqKMH36dLWvYwYTTJ48GdHR0TotjX7x4gViYmIwfvx4ZGVloby8XONBBMYUR20UprrTgJVKJVxcXAxkzX8xGYEAwO+//447d+6odZ+YXHxgYCBmzZqlUxtomsbRo0fx5ZdfwtfXFz/99JNqPi2XG7BRo0b46KOPdGoTF9zc3Ez2GDM2uIyWVSgUNSo3qgkmJZBXr14hPj6e82QMpsFm7dq1aNy4sU5tUSgUqkA+NjYWDx8+VJWLs1G/fn3s3LkTEyZMgJubm05tqgo7OztMmzYNhw4dgqurq96vp2u47LcAMFrbg0kJBHgzUXDGjBmcnhjMkLaAgADs378fUVFROg+ey8vL8d1332HEiBFYunQp7t69y+p2KZVK2NraYuHChTh06BAWLVqklz5roVCIOXPmIDMzE7Nnz4atrW2tdLG4usjG+mwmJxDgzfynZcuWcRoPxOx+29vbIywsDImJiXByctK5TXfu3MGGDRvg5eWFrKwsiMXiauu7mOI+GxsbhISEYO/evTrNxPTu3Ru7du1CeHg46tevrzrXvDbCdTI9lzMY9YFJCkShUCAmJgbPnz/nnKli9iq6deuGxMREjB8/Xi8uTnl5OSZOnIhJkybhwoULrP4xI5SWLVti586d+P777+Hl5aX1tXv27Ink5GQkJCSgT58+tVoYDFwFYqwJNyYpEABo1qwZ7O3tNR4yV1FRgdatW2Px4sVITU1FRESEzocAlJSUYP/+/Rg6dCgCAgJw+/btauu7gDfiNTc3x8CBA7F7925s2rQJDg4OnK9nbW2NadOm4ccff0T37t0hFovfmQNNuYyhFQgEnGMVXWOyAtF28DJBEJBKpZBIJHB2dsasWbOwZcsWTse9aYpcLkdOTg4CAgKwb98+1f5JVate5fouHx8fJCUlISAggFUoTk5OCA8PR0ZGBmbNmqUasFDVQ4MgiFrZOdmwYUPWfycIwqhnh5ikQMRiMfr371/jH5y5ofr27Yvdu3cjISEBHTt21HmX2oMHDzBt2jQMHjwYGzZsQHl5OWt9l0Qigbu7O9asWYNDhw4hJCTkPzYNHDgQaWlpqvM4mF38t2EmlhAEUSvdrdatW7MG4CRJ4q+//jKgRf/GZAWi7smiCUwJu7e3N1JTUxEZGamXEvb8/HwsXboUQUFBePDgger0qKpgYiYXFxcsWrQIa9euRcOGDdG6dWusW7cOcXFxaNiwoWrI29tU3u3Pz8832CRHXePq6sraNEcQBA4dOmRAi/6NUc9Jrw6SJOHq6qr2eGSSJDk/NRUKBRQKBQQCASIiIjBo0CBs3boV6enpKC0t1YXZKnJycjB48GAMHz4cgwYNgqenJ2Qy2X9WAKYqAABGjhwJLy8vWFtbQyQSqY5WrgrmrJHjx48jLS0N6enpkMlkGDp0qE4/hyFo3ry52t9ZV4O/tcEkV5DOnTtzet2jR480PryF2YVv3rw5oqOjcfToUb1MFi8sLERCQgICAwMxb948KJVK1nZWiUSiOlRIIpFU6XYwxykolUokJSXhyy+/RHJyskpktS0G4VJxoFQqjRagA7VYIAKBABMnTkRiYqKq+UkTZDIZ5HI5GjVqhM2bN2P16tVo0aKFzm+yiooKbNu2DcHBwcjMzMSrV6+qtVWpVFbrj5MkiZcvX2L//v3w9vbGjBkzamXMUZmpU6eyZuMIgsCDBw8MaNF/MUkXi+v+RW5uLnJzc3H8+HEEBASoMl9cU6BMCbtQKMTo0aPx6aefqoY56zqNevz4cRw/fhwNGzbE8uXL0aNHD7W5fYIgVOdsnD9/HiEhISgoKNCpXcaiTZs2GDBgAGsanyAIowbogImuIA4ODmr3PyqXoh86dAhjx46Fj48PLl68CIqiNCpuY9yaOnXqYPz48cjMzIS3t7fOm6Latm0LX19fuLu7q/18IpEIYrEYt2/fxvLlyzFmzJh3RhwAMHv2bLW/EUEQuHHjhoEsqhqTXEFcXFxYMxsCgeA/VaByuVzV/BQWFoaRI0fCzs4Ocrmc82YjI5RWrVohLi4Op0+fxs6dO3HgwIEa1QKRJIlly5Zh6NChsLa2hlwur/bzMQH4w4cPsXjxYpw6darWH0X3Nh06dICXl5fa4LyiogJ//PGHgayqGpNcQdTFEwKBoNpGm6KiIixatAheXl5YunQpXr9+DYqiNLrBmc04T09PbNy4EStXrtSqUpaiKPTr1w/79u3D6NGjYWFhAYlEUqU4mGPbgDdZsNGjRyM9Pf2dEwdJkli1ahWn+Km4uBi//fabAayqHpNcQR49egRbW9tqn/zMYStsPH78GBs3bkROTg7mzJmDLl26AECV6daqqDzIOTAwEP369cPu3buRlpamtskHAIYNG4bJkyejWbNmMDc3Z41pSJJERUUFDhw4gNTUVBw/fvydPceROcNd3cBAiqKwcOFCwxjFgkmuIBUVFazZJKVSybk/4MyZMxgzZgymTp2KEydOQCAQaHT2BSMUBwcHREZGIi0tDSNGjKj2PWxtbbF48WLExcXhww8/BEmS1YqDSds+efIEU6ZMQXh4OLKyst5ZcQBAcHCw2tVcJBLhypUrOHDggIGsqh6TFEhhYaHavQ2apjnvhjOTAwMCAhAWFoYXL16w7klUhVwuh1QqRb169bB+/XokJibC09NTZaezszMWLlyIgwcPYvz48ZBKpdWuVkxauqCgAJs3b4a3tzcyMzPfaWEAQEREBFxdXdV+TrlcbhKrB2CiLlZeXh6n8wnr1q2Lly9favTe6enpuH79OsLDw9G5c2c4OTlp5HZJpVIQBIHevXujQ4cOyM7ORlZWFmbNmoW6deuqihKrQiAQQCQSQSaTISYmBhs2bEBpaWmtbHTSBKFQiMmTJ2P69OlqA3ORSITMzEyjnPNYFSa5ghw5ckTta2ia1nqwcV5eHiZOnAg/Pz9s3boVAKo9eam6a0skElAUhYEDB2LlypWwtbWttm4KgKoc/vLlywgODsaKFStQUlKiU3GYqtAWLVqEOXPmqH0dQRCQy+UmdZCnSQrkwYMHaoM4RiA12fm+desWFixYgBkzZuDRo0cQCoVa7Z+wCYPJTmVlZSE4OBhDhw7FL7/8onN3ytLSskajQPWBSCTC6tWrMXbsWMhkMrUCFovFiI+PNylX0yQFIpfL1Z4+BQDdu3fXSVXuvn37MGDAAMyYMUM13LqmJfEkSYKiKMhkMmzcuBHBwcE4duyYWhdDGzp27IiEhAQ0b95c5+9dE/z9/eHv719tD0tlBAIBSkpK8P333xvIOm6YpEDKysqQlZWl9nUNGzbU2UDpoqIiJCUlwd/fH8ePH4dCoWDtEmSDoig8evQIe/fuxaBBg7BkyRK91E116tQJu3fvRkpKCnr27Knz99eWZs2aYfv27Vi5ciWn1zMPo9mzZ5vcvo9JBulKpRI5OTnw9/dXe4N6enri+vXrOrv248ePERQUhD59+sDb2xsjRowAwK0nmtno++OPPxAeHo6HDx/qzK7KWFhYYMqUKZg+fbqqUcpUWnC/++47fP7557CwsOCU/GDqzZhiTlPDJFcQADh69ChEIhGr36pQKODv76/za8vlchw9ehQRERHw8/NTldVXVZtF07RqP+PGjRuYO3cugoKC9CIOS0tLfP7558jKysL06dNVrcVcfHZ9lMJX/m1atmyJlStXIjg4GCRJcrKLpmkQBIH58+ebpDgAE11BgDdlBseOHcOAAQOqfTrK5XJ88skncHZ2xqNHj/RiR05ODkaNGoXRo0fDz88Pjo6OoGkaCoUCQqEQAoEABQUF+Oabb5CTk4PCwkK92NGrVy9ER0fDzc0NCoVCI5ft9evXeP36tUbX4yIoa2tr9OrVC+PGjcPHH38MR0dHjWIsMzMzbNu2DQkJCRrZZkgIJycn08wN4s2UwtzcXNYvXSAQqDJE+sbe3h4jRozA559/DhcXFzx8+BAnT55UnXGiD5o3b44pU6bA19dXtYfCNZ1L0zTMzMyQlpaGyZMnc74mSZK4cOEC6zQYgiBQXl6OOnXqAIBKtFyExdh15swZ+Pn5mXRfi0kLBHhTKlKvXj3Wm0IqlWL8+PEGK2wzNzeHubk5JBKJztt1GVxcXBAZGYkBAwbA1tYWUqlU430OiqLw4MED9O/fX6MN1caNG+Pw4cNqp1QKBAKNU7JMtXJKSgqioqI0XtkMjcnGIAw5OTlqU67m5ubYuHEjmjRpYhCbysvLUVRUpBdxkCSJYcOG4aeffkJAQAAsLS2rbcGtDmZYxO+//47hw4drXG1Qr149TmlubcRRWlqKBQsWICwszOTFAdQCgWRmZqq9ORQKBezt7bFv3z6jn2mnLSRJwt/fHykpKYiLi4OzszMqKio0ugmZvZeysjKsX78eX375pVZNVo6OjhoVdHKBGU00ffp0VfVCbcBkg3SGw4cPIz8/Hx9++CFrqlUmk8HJyQlTpkzBvHnzDGhhzWnSpAkWL16MPn36AIAq5tIk88TsvSQmJmL//v24efOm1vboUiBMy/Bff/2F+Ph4k81WVYfJxyDAP8G6urw6QRBQKBTo3Lkznj17ZkALtaNJkyYYOXIkRo4cCWdnZ43jDKb4kSAIZGdnY86cOTXeExIKhdiyZQu8vLxqVNvFxBp5eXlITk7Gjh079FJFoG9qhUAAYPLkyZg/f77aXhGSJHH79m3MmzcPv/76q+EM1ACKojBp0iSEhoaqGsOYKmGuCIVC0DSNS5cuYe/evdi3b59OskEWFha4efOmVjczc6Y9M0v3xIkTmDFjBoqKimpsl7EweReLYevWrWjWrBkCAgJYd42lUikaN26MHTt2YOXKlYiNjTWglewQBIEuXbpg+vTp6NGjh2o0KvNvXBAKhRCJRCgqKsLMmTORkZGhUxu//PJLjf+GWS0A4O7du/jll1/www8/4MqVK2qLTk2dWrOCAG9Wh9OnT3Oa+s78aJs2bcKSJUuMXiHatWtXTJs2DZ6enqrJiZrAzOAtLS3FkSNHsG7dOp2W2DDcuHEDJEmyulcEQajcO+DNRuStW7dw4sQJ7NixQ2+btsag1qwgwJtAfNWqVVi1apVaF4ApRQ8NDYVCoUBsbCxevXplIEv/wdraGmFhYZgyZQoEAoFWdVMikQgCgQCxsbE4dOgQzp07pxdbfXx8YGFhwWof40Y9ffoU165dw549e1BQUIAzZ87oxSZjU6tWEACwsbFBUlISPDw8OPnJzJP3ypUrSElJwa5duwwyTt/a2hq+vr6YPHkyGjRooJVPz6RGHzx4gGXLlul1Rq1IJMLOnTvRrVs31tdRFIXNmzdjzZo1KCsrM/rKrG9qnUCANwc6xsbGonfv3pwzPyRJQiAQ4OrVq5g2bRr++usvvfy4devWRUBAAMaMGYOGDRuqhmZrmp0SCATIy8vD4cOHsX37dr2L2tnZGUeOHIG1tTXr654+fYoePXrUyoyUNtQqF4uhqKgIo0ePRnR0NEaNGsXp5mMyPC1btsS+fftw4cIFnDx5Er/88gv+/vvvGqU0RSIRPvroIwQHB6NLly6qkUSapm2Z1U6pVGLTpk1YvXq1wc7m8/f3h4ODA+uNTxAEfvrpJ5MprTcEtXIFqczWrVsxZMgQjZ5oTADPHD+QkpKCjIwMFBcX49atWygqKlJ7qEuDBg3QsmVLODk5wcvLCz169ABJklAqlVqlWymKglQqRXZ2NrZs2WLQoQVNmzZFdna22u9QLpejd+/eRh8obUhqvUCsrKzw559/wt7eXqsnNtOwo1AoUFpaihcvXuDOnTt4+PAhHj9+DKVSCSsrKwgEAtA0jTp16qBt27awtraGg4ODaseZ62SUt6/PZINOnDiBJUuW4Nq1awZ1X+zs7HDw4EG143hEIhFOnz4NX19fg9lmCtRKF6syr1+/Rp8+fTBhwgRMnjwZSqWS84moNE2rJpQIBAJYWFjAysqK0+lWSqUSCoVC69NXmRKMFy9eYOfOnaqj2wyJtbU1MjMz4erqqtZtEgqF2Lt3r4EsMx1q/QpSGV9fX3z99ddo3LixSfcYMGXoO3bsQEZGBu7cuWNwGwQCAfbt24du3bqpXbEEAgHKy8vh7u5usqOF9EWtX0Eqk5qainPnziEtLQ1OTk5aZZD0ReW6qRMnTmDOnDm4deuW0ewJCAhAp06d1JbuMN/dxIkTTeJ7NDTvlEAA4M6dO/Dz84O3tze++OILODk5gSAIo+brBQIBXr58iZs3b2LPnj1IS0vT2jWrKebm5ggLC8O4ceNUPeFsmJmZITY2FsePHzeQhabFO+VivY2NjQ2GDRuGOXPmwNraGjRNa3ReiK6gKAqHDx/G2LFjDXrdt2nSpAmio6PRrVs31jNKGCiKwqVLlzBgwAADWWh6CC0tLRca2wh9UVFRgYsXLyIzMxMEQaBOnTr44IMP1LaS6hqFQoGmTZuiZcuWePnyJe7du2fQ6wPAxx9/jLS0NLRo0aLaM9crQxAEnjx5An9/f5SUlBjIStPjnV5B3sbW1hbu7u4IDg5Gx44dYW9vr6pC1TYjJRQKOVWsMpuAALBy5UrExcUZ5PRWV1dXfPbZZwgNDUW9evU4bfIxQxW++uorTnOS32XeK4FUxsbGBgMGDICHhweaNWuG+vXra9TTrlQqoVQq8eTJE9SvX19tsMvACCUzMxPp6ek4duyYXnrbCYJAREQEQkNDYW1trUpLc4GiKKSmpmLKlCk6t6u28d4KpDIkScLKygpNmzZFo0aN0KhRI9StWxdKpRJCoRB16tRR7Zc8fvwYN27cQF5enur/x8XFcTpz7+1rAsC1a9eQlZWFzZs3q93BV4eVlRXc3NzQpUsXDB48GJ6enqoxQVzel8m0JSYmYs6cOUZLJJgSvEB0gKOjI/bu3YtWrVpxXkmAfzcaFRQU4Ndff0VRURH++OMPnD59GjKZrNr9HJFIBDMzMwgEAtjZ2WHQoEHw9vZGixYtVFPeNREsQRAQCoVYt24dVq1axfnv3nV4gegIBwcHbNiwAb169dKq7ISpNqZpGkqlEjdv3sTDhw/x7NkzSKVSFBcX48mTJ7C0tISDgwMaNGgAJycnWFlZwd7eHubm5qo5vdqM4wGAmTNnIikpSaO/fdfhBaJDKIrCiBEjMHv2bNjY2GjdbkoQhKpJig0mDmJcKE3ds8rXWbRoETZv3qyVve8yvED0gJeXF7Zv364a4myKMO7d33//jejo6Fo3jsdQvNP7IMbi1q1bOHnyJKytrdG6dWutRnTqC+YAUYVCgfXr1yMyMhJ5eXnGNstk4VcQPUIQBDw9PREdHY0mTZpw2r3Wpy3MPszZs2cRHx+PgwcPvpf1VZrAC8QAODo6YsqUKRg1ahQsLS1VwbShbk6KokDTNE6dOoWUlBQkJye/V12BNYEXiAFxc3PDqFGj4OXlhdatW6sOCNL1zco0gTHp5p9//hl//vkn4uLidHqd9wFeIEbggw8+wMCBAxEUFARHR0e4ubn9q+KYyUypG7Na+b/MYT4Md+7cQXZ2NrZu3YqbN2/W+gFuxoIXiBERCARwcnKCu7s7unfvjoEDB8LMzAxisRg2NjacBkjL5XJUVFSguLgYp06dwqlTp3Dv3j1cv34dT5484YVRQ3iBmBBWVlYwNzeHvb09PvzwQ7i7u6vObjczM4OVlRVKS0tRVFSEwsJCyGQyFBYW4vnz58jLy6vVM3BNFV4gtQiCIPisk4Ex+QN0eP6BF4fh4QXCw8MCLxAeHhZ4gfDwsMALhIeHBV4gPDws8ALh4WGBFwgPDwu8QHh4WOAFwsPDAi8QHh4WeIHw8LDAC4SHhwVeIDw8LPAC4eFhgRcIDw8LvEB4eFjgBcLDwwIvEB4eFniB8PCwwAuEh4cFXiA8PCzwAuHhYYEXCA8PC7xAeHhY4AXCw8MCLxAeHhZ4gfDwsPD/VcaK0anhRJcAAAAASUVORK5CYII=",al="data:image/png;base64,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",sl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAABf4UlEQVR4nO2dCXwURfb4q2cmIZAgIKfc942CgOItwqJyeCG4uKugsIt4oIgiq66gizcgcq14/rw51PUWXQXBVURAFAQ5REREFBJBjgSSmen/51v0m3+lnZlMkplczPt8OjPp6a6urnr3e/XKUkkoDFhKKY/zaSulAhGuq6qUqqeUaqiUauJ8NlJK1XaOY5VSGUqpKkqpNKVUqlLK57QNBJVSfqVUrlLqkFIqWyl1QCn1m1IqUyn1q1Jqu1Jqh1Jqm/Odc/sj9Mdr9DnofCYhBmDQkhB9fIQogs5hQqpDAG2UUh2VUm2VUq0cYqjpEEBJAASU5RDKFqXUOufYqJT6QSmV57reY7wTxJIkmAiQJJDoUgIubkI1pVQnpdQpSqkeSqnODoHAoSOBm2NbET4jgR3hU+6VIxwEHAnztVLqc6XUZ0qptUqp313XIb2S0iUMJAkkP1Eol9oE4pyglDpLKdVLKdVVKVU3zP0BA7HMtkpqfOXZJoJbEQgXVWyVUmqRUmqxUmqNixHIPcEksSQJRFQNE0GwDU5VSvVXSvVWSrVz3SO2h8m9y+o42q5DbBETvlVKfaSUesuRMNg6JoMIhlEtk1CBQTircHmxJSCG2Y5K4kasPIeITJ29vB7iAMgL8xvv/m9nLFKN8fFEIK4kVCCwHI5oAvbEJKXUBheiBBwEEtWpIh+R3nWDMzYdXGPGGCYJpQKBcD8B3KqDlFLvubjo0UQUhSGWPKXUu86YMXYCbimchHJOGBjXtzo6t4kURztRFEQstnEwduNcjookoZQzcHtvmiulHlZK7TIm2l+BbIqSsln8xjnG8iFnbAWSNko5szGYvEeUUvtchJGUFvGTKvuUUrOUUi2NcU/aKGUQTIlRXyk11UUYTGpSWsTvCIYhFKR0gwhzkoRSjmNI/GK8S5VKEkbiCcVv/L/LmYOMMPOThFJUp/7sctUmCaN0JcoGZ04EkmpXCYLXFcfABZkkjLIpUd5TSh0fYe6SkEDvVCWl1AQni5WJSBrfZesIGITCHE00IvNJaZIAMPXYM5RSXxqTYXKs5FG2Dr/xfaUzd+HmNAnFALE1UpRS9xqSIqlOlT/7JKCU+pczl+bcJqGYKhW2xjJjwJPqVPk7AgZDW+bMKZAMMBYBTPE7wllKakfIQE0e5evIcz73O3Mbbs6TEAVE7LJc9UljYJO2RsU5/Mb3J42lyUmVqwCQAWrjGHXCcZK2RsW2TVY6c27iQBIi2Bv9lFK7DeIo7YlMHiqhh8wx1Vr6OjiQtEsMMNdwjzYGLqlSHT2H35AqNzi4IIUzjmowB2Gq4e1IeqmObi/X1DDM86gDeXF84i87A5O0N47uI2ioXC8b0fejjkg8RgXC/xrEUdoTlDzKxpHnfH7o4IiJMxUexBivbQT/ksSRPGzXITixzMEVE3eOCuJY7RqI5JE8bNchuLH6aCASEZFJ4kgedjGJpMKpW/JCtZLEkTxU8YiklgunEgol4Wf2OC+X7pS4PMnxeycjpkkoDAjOfOHUST7o4G+wPBOI1K1Fb1yolDonSRxHMVieIwf80g4eYZuW5ZzjdEApm5MRQXAHRnu+K15WrtNH5rpEZfI4mg7LYyvLG9u1Hq6zol0jOAROJTwtJZGc3OtQPFHRy5wXk4UySThawPIekQwgxLHNVaU256uURqcob7WmSvnSlH14nwr8tknlbl2qcjd/oILZmf9f2iBlwuNsnoNTPyulbnbO+RPS/UQ0anT4eqXUjKRadZSCx6tUMKC8NVqojN4TVFrHgcqTXkXz/xDuOxoWmlVgz68q54vH1cElDyo772A+4goDglPkbs1MFJFYCZIcvNW5TlULhiKZeHaUEkdah0HqmIFzlPeYGiqYAzY4OIztIdsmarvDUsrnVZ40pXJ/XKt+n/sX5f91bTQisQ3c6uvYuIJ7cYN4I63se9fS8TZUd16kwvmtkxADcXQZpqoPeUYrRLbff+R8NJSDUIJ+ZVVJUcH9meq3J/+k/Du/iqZuBZ0G9zre0e8MHCxzBCKZl6nOTkWdHWqusJHPJIQBh+OnNDld1bxmqbIDIL1jU8QKAb+yKvtUIGu7yprVVQWzswxJ88erHRz7ytkZLDee28fFk7OLeJvlEAeyNEkcRxVYGjctX5qqdtGTR9QoCKQwxAF4fcrOyVO+uo1U1fMmH5EekdsQZ1BnB/fiypTjRSBiIF2tlLoqaZQfpeBBetgq7YS/qpRGbZR9SNSqIoA3RQUPBlXaiVcoX91OWmWLQiSCf1c5OBg35hwPApFNMNs5HqukWnW0gn3EPq7cdfgR1cpTTA3eDipPJUtV7jLsyP/RJZFoMDMcXAzEA7+L24C4IohvPGdUp0h6rI42sI74ar3VGirfcZ2VnWdEyIvRJjSX2rznEZRCikS72uNRXq+3ioOLUuLUKk0CEaqlTm63pN1xFIN1BA+9tdooT+U0pYLiYCpWo8pGS6veVHmqHHvE7naeEw68Xq83PT3db1kWuHh3PLSZ4hCIGEc9lFL/SKpWRztY+q+ncs0jWBA9pyr2JtHUKmUoq9Ix+Z4TDvLy8tS+ffu8tq11vfEObhaLaReVQKSXuHTnGO0kVaujHawEhLx0YmPMBCc46PF4PE8Y69qLhJtFfRvuCziSg/0fkqpVEuIPTog5eGifCub8ZpyMDpZFMEb5K1Wq1LFly5ai3RQJ1z3FIA48BUnVKgkJhKBOAg5kbtRJjaGkrdjAm5ubG9i5cyc42tZIS0k4gYiomu5sZGOeS0IS4ge2rSyfpQ5verdQ6pt9hIisQCCgDh48WMlx/ToJX4klEPFaXaqU6p2UHklIHNhKeT0qsD9H5Xz9gnOq0ClWgq+9HZwtNL56Cu9T0LGOh4pKkUlIQkwQ8CtPFY/KXvqQCv6+3YnSFykHUeOtZVkPHXfccVUKi7eFIRAoL+jUz20Wr0hlEpLwBwjkKSsjRR3esEwdXHLvkQRIHVcpEmib2bbtZjt37hxdWFvEV0jDvK5SapzzkDKtWnm93pA+akUJLoUDuQcdtrxBcd47FggkckycNemeqikq94ev1d6XLlZ2IO//r2MvBBBVT0tLU9nZ2apRo0beKlWqBLOyssZlZmY+7eweEFNavKeQ6tWtSqkaRh5+mQUmkiMYDIa+x3rIPeUNQIrivHcsR4EAMrMoqrAHt1byKk8Vn8pZuUDtebKnCh74NdpakKiQkpKiOnU6sstb7dq1rf79+wfbt28P7v7DsvSadyteEkQorYlS6pqyLj1AEpDj2muvVQMGDNCclHOxAvdy/aZNm9S4cePU4cOHxStSpsHn8ym/36+GDRumLrvsskK/dyxjsmLFCjVx4kT9f6QxYaksazksyxdiv3JlNIwMHrJV7vefquz/PaoOrXvFuaFoxAEwbytXsi+PUps3b1aVKlXybtiwgcb+VqlSpamHDh36KRYpYhXCE/Bvh0DKbCo7KgUTh2j96aefVM2aNYvVXo8ePdTy5cu12lKWJYoQx3XXXadmzmR5duKgadOmatu2bSFG5EYlKyVNpZ9xm/LWaKLsgF8jufOLsvW6DkG5I0zcPvy78mduUHnblyv/zq+dpqQ0UNwZk+AuIYob47FEV9aSN1JKHXCorcxuT+CITrtKlSr2jz/+aPv9fjs3N1d/FubIy8vTn6effrpuz+uNsWRNKRw+n09/XnfddTZg9j9eR05Ojm771VdftVNSUmyPx1OoPnqcwyrwWssp+xN/vHBwQ/CXDUQbx2P/EVGlHi4Pda1MAvnpp5/0pAYCODAKB8FgUH+edtppZZpAhDiuv/76EHFI3+MFubm5+vOtt96y09LSTGSLfHh8ocPy+myvL9X2cHhT8v2W76B2VoLxgs+MjIw85//JLhwvNEguPXrKb2VdehxtBFKSxPHKK6+ExiAacUT6DYkjvxUkfWIiwELihEkgaWlpgsdZTp3fIq8ZETsDz1WZlx4ViUAKQhAhjtGjR5cYcViWFRW5+Z3r3NfI+VgJIp4EEqUt2RPxVheuF1p6VHJKqdjlYd/AikIg0Q5sAD7HjBmTMOLAhgHmz58fE3EkArlLaD/E7xwcL7QUEYq6xEVxZfqo6AQikiORxCGS4+WXXw4hfGGN8njMYQkcgtOXFEWKiGW/0KG0JIGUEeK45ZZbSow4PIbtEM8jWruikom6VtQ+VK5c2T7uuOOiqXF+B7c/cOF8zMTRxlWEq8wfFZFAeCchjjvuuCPhxDF37tzQM70xvLcgMJ/Sz4IOUdvkfrftYrYpxBLrWEm71apVs1u0aJGvPfNw7glalpXnrBeJmUhE1PyrvBjnFZVAwhEH9kFJSI5Y39njIF9qaqrm2rESibxfLBKiKCpeJHvIdU5we5IL9yOCGCus491cXozzikggJnHceeedCSMOMchN4igKQnq9Xk0g4kSI5UiUChdpPE3JVbNmTbtp06Yatz0ez2YH5ws01CVo0rO8EUdFIhCTOCZOnJhw4njhhReKRRyqGAhfUgQC8dapUyf0TAiZwCc47vShp4sGohIIlUrKlXpVUQikpIhD1CqIQ5C7JL1VKoajMKpeNHzgYEwzMjL+cB4ctywLO/uxgtQsES+sutrh3JyUICVIICUtOZ577jn9zEqVKpUIJ7ci2AW8M31wq2fhDPgEHCJBdhRUGVSkR+/ySBzlnUBKmjiefPLJEBLKc/kOorr7lZqaWmwCEkJ0jyXnUX843M+WPhWkuslvnTt3ttPT0wvdL8uyBNd7R1OzRLTMKI/qVXkmkEjEEW8Qterxxx/Ph3wmMrrf1ev1agKJ5/zQpkkMvDvPiDVaHwbB9XdsCrP/Ydy6YX/D1euoWTMKUrP4YaPTSFKClACBlLTkmDNnTogYUGlErQFBwxGClQDVq6D8rILucwf9ol0fI4GImrUx0kazEiDpXB6ydisKgZjEce+99+ZD5HiCtDlr1qzQ+7iRpgR0fTuec1wQUZj2SyxE7kgQji4umsgnUsaWV/WqvBGISRz33XdfPkSOJ0ibM2bMiEgcR9thhX9/wfmxJk0IYcjayXOiWfFJiN/SYJasskz2vvvuU//4xz/0d5bOxhOkTZbh3nDDDXrpcLj15Kmpqfo818cTatasqX7//fd87dIfnpV/uW58gLaPP/541bBhQ1W9enW97Hr16tVq7969oXeWSi+yPFvAcn6wbbuXUmqK0IQsqeUf6st3d65P1rtKMHGwxn3y5Mkh4pByPYkkDhAiHBHSl3gVeDCRkGeCqOa5aAUfigq0zdGuXTvVokULtX37drVx40ZVtWpVdcYZZ1CwIV8fwoFtsypYQzeHFkKVe2RmznBETLC8i86yqmKZxum0adPyqUAloVYV1ThWxZgHkgajqDWFVYMiHjgbGjVqZLdp0yafqxc1Nlxbbm+X8xl0vkMLIdoQlkJBuHJrf5R1Ailt4ijtuVFhjnBxj1jH0m18S7JkjRo1QvEWSSk5+eST9TUxxEj0enWPxxNaaWiWrGM3niQkWK2aPn26uvHGGxNqc0ybNi2qzZEo8Hg8qkoVCUZHB9SecGqdqEGoZpRviqZSmXYF74otVa1aNT0O8hvPQc2qV6+eGjRokKpcubK+/uSTT9bF5YBjjz02X1+CwaDQQmjguHJLeY1/mJylrEkQU3LgZjW5fDxB2pw6dWqpSQ6Px6M5eLRr4OhweOZIpEC4DOBOnTrZDRs2zDev4eZaVMd27drZbdu2zRd5l8+uXbuSuaufybggSUaNGqW/k581YsQIuVbjfvv27bfYtp0vHtLCUK2SNkicCCQccUg0O15AX8sCcagYCah69er5+sf/xxxzTKjfJrFEegeJxEsOGUfVqlVDgU6Jf5jzduWVV4ba5hN1TKLvTZo0kf5p3O/QoUNehw4doIkQ9HMaKhdLa8sDgZSE5DCJg0BjWSYOy0Fit7SAmwvXb9mypZ67gtqCEEBsd5KluXLQJBCe2bFjx3xRdYz5CGtXRIOCJkJQ7g30skQgJS05Jk2aVOrEkRpDLlW01YYg67HHHluoMTbf9YILLgils8vYSyJm48aNQ//zecUVV+hkTTxsQkxG21JY7jZtVzkE0jEmyyoJhTLIZ82apYtoYzSKQRgPwAClfQzye++9V915552hAFxpFdo+5phjCtxuIVogki2cf/tNNuosGMz3bN68uTruuOPUgQMHdD+IfwCMB+N+ySWXaONctoTAKP/qq690EJP/3UFLp2324AzBZw71JFWsYkgQU3LMnj074WrVhAkTQpy5LKpVqojzV9jru3fvbrdq1UpLgrPOOstu3ry5Po8KhlqHpDDdwrVr17avuuqqSM/0O+c+EwmSoZRq6BBKMsUkDpLj8ccfV6NGjUqIK1ckB9sQ3H333fo758rDFg0FQVHegXFnWwa2OEASUJG/T58++rdu3brpyDqSQtqvUaOGOuWUU/T1kZp02oUmMpi945wapaEfk1A4EL+8EMff/vY3rTIkSq2qiMRRFIAhSU7bCSecoGMeb7/9tjrrrLN0HhipJ5zbvXu3ztFirDj/6aefqh9//PEP+VhmThb77iil6psFGsqte7c0VSzTyGMhUkmqVaU93qqUD9NThRr117/+Nd/qSIx2cAGPF78TowlXhNu1NsRMOdGFHIaW9wBhaRGISRwUP0i0t6qi2RzKQWTJ1yrKvUWtmeX+30UwQgtDPc7mOMo5kYRCqlXovS+88IL6y1/+klC1asKECSG1ykylKO9g27beaBMobEazeKVQsxh3vp944omqZ88jFXyipbKEA/kNZuScakQLDQrVqySUOHHcfvvt6p577gkRR0UC27b12AEY0LGm3cscyHdpi/ytjIyMiATCNW7mIv+HYTraefV6RXDxlpSKJWKdgzq2iVKrqL8L/OMf/6hwapUKc/B+sapaZuq+mVZiFn+IlNpPSny457jGVmjhP5CY7HSZ9GAVAMKR4DQvv/yy3k02EZIDyYS6wWKq+++//6jwVvn9/pA7tiAQKSArE0Xa0kZubq4+55YuAqeeeqqqW7fuH34Lt7pQvLvrHGpJGulRJIiZ5zNv3ryES44bb7yx0JJD8p1iyWcqz0fLli3tevXq5Ztz0lQYM3KuZNyKkYUttLAOlngkLp+UIFElhxiEc+fOVYMHD06o5LjpppvUo48+qtsvrEGO/i1LTMPp62UJ0tLSChVIlXdgbUf79u1Dc0OMo23btiozM1OvQwckfSSWFBh3+02aNLGctSiaNnY71JKMg7gkCNtAiy6LBEmk5JB+su+gcMDijoOZMVu3bt1Snx/l6iMp59HctFJw2j0WzK+sO7nkkkvsCy+8MGz7JED27t07lMTIQWp7pLGQcbvwwguDTqFraEPvGV3qA1YWCeSkk07S7SWSOKSPHG7iKGp2LoYqqpb8L0XiSnt+VCEPjGkWTTlV2EMHOVasI4GAhgwZohH+2muvtW+//Xa7S5cuobFzZ/VK1u/gwYPz4Yu7iqTca1kWtKEOl/ZAlDUCETtg5MiRehJee+21hK0ElGetXr06hNwmghR1LUpFiLSnOuvMw0kZsQcvvfRSu0ePHjqlHWkC4ZgeroJsETNIiKRxebigjfJvnCdKgmRnZ9tbt27Nh8jxBp7F8euvv+olo6ZhDtevyK5dVcy55mjfvr3dv3//0H6EcpiuX64D8U0pKgRkSIt8dYjJ+K1evXoAq4QTFQIk+YzCAZs2bVINGjTQxlpxaz7Fo41oIA4AkuootjBv3jx9nmcmosBaRQArTKJhnTp1tKHOedOxwifJjBSCOHjwoMaNffv25TPeZZy5tkOHDjowu2PHjmSBuFg8S4kkDkAmsXbt2tpLxkIriJxnxztdvqKA7RABXj8OvHdk8coiKal0wjVUO1m7dq2usoiHjzGVQnrSlhxcv2HDBjV79uzQAq6kilVGwIyDYJOIk6Agb8/RdqSkpGjjnUolp556amjuL7/88tDyWq6RIhCoTeb6dVG/TFslwrMCsMaKldxTjkG4HrGPzp07q6VLl6rx48erQ4cOhWIkRzNYTjwHaUHsA26PytS3b1/N/Rk3ztWqVSs0VhJtJ9JObOO8887TOV+SmSCqlXtsnWf5Pc5e6EkoQyDry1EHSDV59dVXdXqEJC8erWA7NsWePXu0vcbip2+++UaddtppmmgWLVqkDh8+rAYOHJgvqZPvHKxL5zoYjhSaE/XZtEdE5W3durWmjWSgsIyCuRZk27Zt9nnnnRd2J6Wj1YOVatTBYkw4hypFnS3TQ9W6dWu7Z8+e2pOFKxcPFWoW584///xwz9C0kJaWthvyySkNbpCEggFOJinujRs3Vu+9956uYgInRJpEU7nKYmpJPEAMc9So888/XzszRFXCOEeC7N+/P7QcIT09XRvvbdq0Uc2aNdOezbPPPltLD2mvY8eO2gNmgrPORNNGMlmxHADvIfGZzz77zD7hhBNC3PNoipV4HclJpgCSQkqZyhZykvIuAUJ+N5M3zz33XG3YS8UTJApLdZs1a6alkLOUQdNC27ZtdbJi7MWIklBqAKeDqyFNqMqBAT906NCQsSm1oARwGVdEeyU9PV21bNlSSwoMdLEXJOUd6SKrDAGSShkbkhkpbP39999ru4Vrpb3XXntN2zRIFSQS49akSRN11VVX/UYrmc6zobAklHGQtSFkqf7f//2fevrpp0PEgWdH1C4QAlUsEeqWx+MpceKTd+DZqFa9evXKFwikPxjtrAfhkIAxu039+uuvuqgc40G5H36H0fzpT39SI0eO1Et+ITgJLp544olsUYHqlQWB/Fqib3oUQKIrHEqQC0K56qqr1Oeff66jv1u3btWeL3Txr7/+WiMFEO++2M6zSxJ4JhIgJydHvf7669rOAESqYkcgDXDhNm3aVEsO7JQhQ4boT9LgiZ5jh0hAkPHhHEumu3TpotuGUGA0ENvu3bt3QiBHEuiTEBeQyHu4kpaJipmwNuKTTz5RI0aM0C5M/P3mGhCuc68RKQ7YYdZ1lwRA+BAJEW7UJHGH836kj8AgkBiUe0VaUPuKOmUQCYQB8Zx77rn6N+bogw8+UAsXLtRjOG7cOHXNNddoNQuJA7GsW7duBwSy3Xl+xXR7lCDIXn/r1q1TWVlZoaJmiQRBEj6nTp2q3n33XVW/fn29fBXOCbHQLyY+0oY05QV+++03PaZwd+wPARAeSQATIE3kueee0+9M7AhVk7no3bu3/h/EZ1yYl4svvljX6UUiLVmyRLfNxjrNmze33nzzTfXiiy9q2kgWjosDyDoRCjngCaE+7OLFi0N9SHQ/zJjJrl27dAVzxgJPD5muLVq0KNdLcS1nbkklYREUWbziqcIDRX3eBg0a5KuVxf+ko8h2B4wDtXtlERbeKzbSMZ9D202aNAni7Xr00Ud1/aDWTiyk3BNJaRGIEMdLL72Ub30BEyV7oCcyZd4E8xmTJ0/W7kyQBASqSPlcxx57rHbnSgo7qz+dVYAayVkU9fDDD+tUeNaq9+rVK3TvxRdfHNrss1+/fnpNCSsNcZ1XqVJF00CdOnWyO3fu3AoV62dZWug0kIRCgKxNpz7W5Zdfns/bgp5OTat+/frp1GmxGUrCgEftGjt2rPrf//6n1QgKPJfVtemxgPQb9YqgqWTaYpjjxcP+wP5iLjC4BwwYoFWqX375Re3cuVONHj1au24ZH2rzMh94r7777ju1a9cu7exAHXNiK5zL/Oqrr7SRfsAw1EudQMrTBJrEccUVV4SIwkyCwzbALkC3feedd0Lu0UQb8GL/UOGcmAnuTImZlOekx/r16+t3kg1Kya1q3bq1jmNAILwzNgdI//HHH+s90zkw4nHvip2ImxyDv1GjRpq4IDQMfCQv3/v06QNNHHEDKqX+r6zsMFUcNaAkVSxRq55//vlQvyP13cybGj9+fKhPiVjCG03lQgWsVauW7kd5XZLr8/l0qjtLACR6To4V6pKoXETEKdmEGgVOEDkX9QuVE/sCtZNrUatY116zZk17zJgxLNvNo6TQpEmTnjMJ87ayQCDuIsJllUAEsU3iKKjfJgFhKH733XehtiSFpCQMeJ57zjnnhMarvNkllrOGA0Kh7xADBjsEIkmLMsYgv8wLhCHGOZ/U1uIeCI10E1Srf/3rX9TVynPaZlvC0IrCb5zPUl1hWFr+9cKqVahJRLHdalU0kHUJ3ItLEZWL1YP8XxIxE0l6ZEOZDz/8UN11112hfhUmKu7xeLQ7tTRVYdRa+oBKRN9Rn/gfW4tAH4DaRcyDeUFlIgX+zDPP1NeTrEjsCHWL5EXiJIwN6fIHDhywsGkGDhy4ziSIDc7CKf4vsxgqwbHSAtlr8JlnntFGXazE4W6Dd0BPZmKuv/56rTuXZMwEoFL8f//7X00w0qdYkD4YDGpdvjRA0kqwQ9gch/iHEL4QOjEOYj4ECYl5XHjhhZoZrVmzRhMQ123bti2UcoItArFgy+CW37lzp9fr9fpr1KgBTYSAEoFbynpWb6SCxCWhYomK8sQTT8SsVsX6Lmx0//XXX4dshkSrXOb7ZGZm2pdddlmoX9FsE1/xynnGZf75pGhc/fr19fd27dppF64Uh6MyDHER+U5eFaWAzO2jp0yZYo8dO1bfc/PNN+sdb7FBqlSpEqB00LBhw6CFFC158Qw6tsdXbBjqxELKZDGHSDlA5vLKRIDsNUgxBTh+USRHtO0NVq1apVfFPfLIIzpdBChovUe8kh5xm6LqoXZQLHvv3r2hVJlAmLEWV7H57iVVfUWeSZYAuViMDwmJuHLpA9+RDHynSDXjispFqVIKjf/888+6n+yKy71E15E07HhLlkHz5s2Dl1xyiWf37t1fQxPz5s3zQggiVz9XZRzMNGbznByJqD7iJg6JM8TLVhL1hsQ59jYcNmyYRgCJmSQSzJgJeUgrV65Uf/7zn0NruAHeXcZVlq6a704bxBskc7i4UJCqZy6V5TuqE6k92BkcnOcT9Yp3IS+LDVWJjfAb9gU5WM8++2wod2vx4sX6PAmfLBP45ptvNC2sW7dOd0TY1BllPZpulpAMd15+i5eKJWrII488kvDFSabKhdqwbNmyElW5THfwkiVLdATaMt5VxljqFMt5vEBEoeORxiLbsZnVJd1eK9QrUkbExSsVS8zqJUTZubdPnz72ggUL7LPPPluflyg6S3D5jhcL9Yv78HhddtllQX478cQToQVNG7AGkY1fOxH1MltMLpKKJRwtnp4VMfpQe8aMGRMKTCXKy2aqXN9++632uPBs4aiJTi+X9+Pg2W+99ZaOvhOBJnLNeaQH/TD330CFISgn26hFA6lJFQloF0mKp1AcMjhFpL4V9/IciaILSPo6fSNjV54hwUGCiPQTjxXvgnShfc7RHs+DQSxZssQ6++yzdw8dOvRr6ZJglBDKu0qp8x1D3VsW9hyPBQSJOHhZROzGjRuLXFlR9H9SpYlAl/QGNtJf+k7G6WOPPabXTCfaLhHgOabKeuDAAb3mhMj0F198ofX8H374IVSgzSQY2U7NBLFZhNBYmxGuMqJcK+pTNJDFUmY7fKJ+4X4ne4DnsNaDlHZsDKLm2FisyKT/uHXpLykmGRkZgaysLG+/fv3emzJlSl/btk3hoY11OnazIz7zSnO9s4jVWJ4thZo5pJYtQZ8dO3YUWcWSe0jwK41C0LKFMe/B/3hlFi1aFOpbSWUoBwKBsAmWBw4csGfNmqXnCDUF9QpVK5yHy1SXwnn+TLVZauOKqoTHiU9zzTnfuY5IuGQFyDWcp2LJ1Vdfrb1c/I/6R2CQZEYygVHRSFCkoglr0lGt8FyB8w7ujzVpQkCzipSUlC4ejweq0ftEi95X0gRSFISKJ4GY+4PIxJXk+/AeTB7IJ5FhkHDatGklmhnsrviITSZ22fbt23XfJL3DHCOzCDQ6PogseMT/ZgV15gtmYBKBuGMlnUQKMZgEwpYHAwcO1O5ZsVG4B2IQm4QsXdJKGDui7RACWySYBMlvXF+vXr1g586dg+3bt+9s0oToHlqU5OXlfRMMBjcj6RgX0TfLOiSqj6UV1UfXJ3iIrixFzvCu3HHHHTrwRfJdSWQGC4g9IB4t2brZ0d21bSFJgKLuUiia88yNBPSkTi7eIhIFAVFfuc9UqcVTSDtcKyquJFtiV3AOtY3ncQ3BPvqF3UHmLu7b999/X28NzTJcruV5uIOlpi/jW7169eCdd95ptW3bdvO6deu+cdRFjVSmcu5zVKsPHOqGjaryAOU5OzXa1sggFwgiVcnRo1npdtJJJ+lVcCWRGRwOTNc6dohUAuF/+ghhYAATY+E8qeUgLb/xbsQeIBpJWZENOIlqi7MAAHkp0HDllVfqCDntCdAu2dEQAbYFdifuccYJZnLcccfpVHaA/hH7wIbiGrIHOMe48qxWrVoFqdb48ccff0C50TPPPDOkXpkEItTwhuPJimtQIZFrEcoLIRcGZKzgijgbpKAACERgDOP91ltvDXHukt4/3eNIC/oEN6e/xBIgApAVw57zGMVS1I1yPV27dtVeKPorsQnxQkEg5FDRDv9zsPYcgzpcDpgENEk9MSUq0oLni8EPoSBZWBfy5JNP6oIWPBsiI4gYCAQ8bHeQk5MD7pMrF0IokwiEDX3mLKLKZ8UXFyJ5LMpjVZGSAOk/OVtwRSQKk867oT6AiJMnT9YRcNyZJe1pS0lJ0VxaNuIkNwrElLXwVDOUYtIgL0RO9Jv+UUABiYLKAxcX1QomwPuhLrVq1Uq3yZYFb7zxhnYlU0xBiERc0uJpQ3UTVRAVlCAgQN8gsP/85z+6XcZS6gZQOqhbt27B9evXe6pUqfLzQw89BO4rE+/dEgTRgkP7LVGzYnGRxororr2o87lfiyNhzP2y3c8pj2CuSuRgwiU2IPq/6NCkU6CCLFiwoMRiJgDPgUBAYirRi0tduDh9lCg9yIubGpWJ78RZuJ9KLCJdRK0ikRB1Byki72hGzlGfICqpTIK6hJSCIETNEzsESSZEJBXypeILUmzZsmW4eoMQ7IgRI94eOXJk9qBBg9DXw0oQZfwwz9lP3SNBmnDgrogdK0jQxy0ui5MqIukR5SFlviCQ/oMYkoFqvheqC5xQ4hX4+9mamlQVIZ5Eq1y5ubkasUkzAWl5Hv3iHCogdgdIjEHOe8DFkRDEUZAkqFJIBdnpydysCGTmuvXr1+v2+A31C8mJygmBoBqRJkIOmxSMA2iLseFZ9I1raBdVEOlG+zAb2nCChh7UrXbt2s3l/kGDBuV7TzdGwnrA2k+VUlg4HrxZBSGuOXmx5ERJ1NjkdEXxmAmHKa8AkwC5TECFYPIBEAXuKF6gcAAi6K3CPB6tX4MwX375ZcJVLp/PpxGdZwNisPOJKghnx5kAEtI3fgOJUZMowg2ys1fHGWecEUpZRwXq3r27JgaMaKLi4imTwtOMDcTGcyEyJA7tYoSblRZpX/CQ62A0qKuyTPqcc87hM+jz+Txr1679bsSIEeC8NXjw4HxIGA6TwTjIkX2P+T8s1gr3d6tG5rZYYkS5QbiFe/IKM5mmJ6U8rWM3AQSGAAB5BxADLgkwkcJIoo2N6OQgGl6d008/Xf373/9OqMqVl5en9Xhq3bK92fLlyzXyg6zsB4hBDscmARKVCY4NN6c/SBWQFWkHIUFEAN4t2mP9BoQOUnM9TASi4xOCIvLNGg7GjvO8L6oeapkQCFKF6yAmiAjGw9iKXYRtg3qFdFu5cuVcB+fzqVeRCEQI4gVc8oFAwGumEphg7u3mPieSJBLyFhepzWeXV5VK3Lnyncli0sU9ySRzSPG3aO2YmcFIFbJYqbKCrp0Ilct2tAAIApXKiSdoQ533wDaCWCEaAGlDX1jlRyo696BesbqRNHSYAdIDooJwSGeBYLiWsqIgN7bYiy++qAnsuuuu0+1CaGT0Ur0FYhEbiOfTDlnKOA14Bn1EqkFIECIrowKBQF7NmjXB9bDCIBKBcH6DZVmLHUkQcKszZr6Me7dQ6WQkIpB7w6kN7nvEXjHVNnmucNdEpbqXJEAEqBjmGEM8IJEsI40FZDxAipdffln16NFDIw9jGM+auj6fT6s8YiOw/0afPn00wYCccGjZi4NatyA7RjPSBQYAstIXyZ3jWpAX6UlZHhgF7w0xXHTRRfpajHoqJ0IUSBMOrqFtCAugLWwPvGBIEIiWsZAt2ug3BMdQUR3ltNNOW5SVlbVxwoQJYb22kVIr9cUpKSmPBYPBP8lJQUQxiMNtW1WQGuXectcEcdOZKoW04SZC6Ye5DLc8u3dRASQ4KICxKWswCgPiRYJTwol79uyp/vWvf6nbbrstNL7RpHss4PV6tXRDQoCUxDek7A5ITh94Ls+AIPjEKGf3WIgJhMbzBJIC9JOSoeIC5uAe1m7gxqZdlijTd7xnr7zyivZCQQRIKilJ2r9/f81UsFGIovNsnkfAkeREiFfWsw8YMMDq1q3b4x999BFdCEsgkdiuNtZzc3PfsW17S6SbzWxK9yIa3UgU3TkcMsukuSfOrDMl/1cEI90EJhWkkfdkLJhEjE9JyygMQCCoNRJEZLUg+jtIJbZJUVJVLGducBzA5SFqpB9ICndnRSRqEc8gck0MAzy44IILQi5YAnXcw4E0wFvFu2OrgMzcDxLTBqoQa+chJvZA5xqkE6oWBIHLmE/Gjd/wfqG2ITVFVeW9GV+IDiIG/dq2bevdtm3blsOHD7/Da919991hRWskAmHUwLzDlmXNMdeIuJda/qHBQrhrw10XqxQQKSZrFEoySJYICGfLiauSAygKxzelLKoLBi16OYaruNoL40G0nT6CaBAuRrbYDRAzxjIIjvSSLQeIgRDtNtdtyJoO1CPOoxKhDkJwEBpSSdaD4JG6+uqrtW2Dh45UdggUacN3HAL0BXUL4qNt1C+kC54w+kc/AKewdxDinT179py+ffseDmecC0TDZC1F/H7/M84uVB4yY/NdEAUpY5lMt7QoLKJHkmAVAXgfOCYcFESTc0VtSxICIYQ5c+bo4B5bTIOg4nEUPT2W5wScecLYBkFJfQH52NAHiQBiSoAPzg1nh+BBfCLYeKhAfoiUz06dOulETNQp0kskZwr7hTU5XI8UwYaBOCBC7kFyYaRzHe5haQ/pRt9Q9yAa3vHGG2+kLXvAgAHeXr167bnvvvuedph/RMMsWkEkiaxnBgKBZzwez9iqVav6s7OzfSYSu7MwZaDFXnEjr3kuXAGAaCDSSZ4vxFXRiEMAjihxhniAzBNzBgI9+OCDmlhYuz18+HBtD4jjRNRaK4orXQxhCAAkRELhScIeoS0IXLYsEG8WcQwkBRwde0CkEYTK/wQb8XShYkF4XM+zH330UX0tbeHtQp2CIHAMsPIRew2HAIujRAuBIPnE+4UUwxO2bdu2wMknn+xLT09/asyYMVlEzhcsWBCRQArShYJO6vv0QCBwAJcv632h0EggKo+IUwEZZFOFKqxaZBKV7pyRj8PEml4x+a04R2kD3E/Uq3iCOFgYLwiFFYsgHflTxE9I6hO1zOPYhWZwl0O2NwO5QX6QGfuB6/gfg1zwhHfASyWGOvu+IymwQUBy2hMb4YYbbtDFvkWFA/FZ/gtBcA2fbJ1GH+k3/YBIkBYQCm0IYdMuhHrzzTdrlYuSTR988IH3scceOzhmzJjpoCVr1qONVUEl9YKOfvajUurp7Ozs0azVkfuirRF3e57MZbRFzZky4waRbB55jlS4KI77tzQDkCAnCJIo97WoU0IIfEef55g3b55eltqmTRvteoX74io1nSIQL+eQELRBsA+uj0qINABJKasD0m7ZskXbJKhGcHXu4fmoVNxDcW8p8iYb4LBUFtWS+2kb9YhgpBAU88vafapUImUgGIiFtR/YQ/QB4iJQiKsYQ/70008PLF++3NegQYPnd+zYsf3SSy+NKj2AWGpOgsVgymSv1zv88OHDlZ2VYEiWiHWR3P+7PVFFhWgqGefhWgzQ/PnzdQn8wq5JF8nHwKJLi9RLJJhIKgASMOmJfrabUPifyDjIGQwGte4P10ZtwlWKbYC0QG1B/eN3QVYkApICAsA7hdpFuzgESPe49NJLdZoJiMz/BBVBeggHKQNC4+5FBUN9mzFjhn4e7l2YBd4pnofNgeSDuOgb0oPvROC59/nnnw+ViOXZTzzxBL+zctHTqFGjg88+++wDxx57rMUqwwLnJsZxhG0QLHzEsqybnDKlPuHQdMaUJIWxKwoD8jy35DJrKQlCixpQFJCEt5ICEEs2miwrwNh16dJFG8wQEP1j7DGUMcBBWrg3rlS4PYwJ1QqXrMQw+JRypyA89XEx4pEI2FcQEZID5MYVy/2oUXjaIDK4PkSIbYLk4HqyAzD4CRqyUApVDMkDoTF+qFTETgBJayEwuHXrVv+BAwd8vXr1mjJt2rRbCrI9BGKtWqylSCAQuN/n8w1VSlVjXbLH47HwXMBNBGELq5ZEqlJYGCKTwJdIMtFBYylFEw0SRehuAFnggiUFYrNJ1oO8K5KAvnAO12pmZmYoQg0igsiclwxeEBQODdL37ds3lOsk3jL+h3lKPANODkGIhwlioA0QHDVOFlshuSUKTzUVJBFqGmn9tIeLFqRHAhH8wxYi2Ed/IVBwEuKkfc6xVn3EiBGeLVu27Pnoo48etu0jClBMYxXjmEr6yS6l1EN8tywrQGdRA9xeqlhUGjOh0Z3YaK5tztcJRzKEs3vM39xeMjkEMSTrVLJMOcwgZUl7x0TNKSkAcYlGmxIW1UVyviQSf+jQodB4QByoWSAj93GgziBZiH0gSXDron5JgWvxZoEnEBQIi5cLe4SIN21yHoSG0EhAhOMjaVCdWFILISA18LIR90CaMF+kn6AG009ULtmgFKL561//qlNM6A9esTfffDOwYsUKT7t27R5avnz5rxMnTkQjikl3Lcxu8JpI/H7/9JSUlL/XqVOn6a5du4K5ubn5qMGNvGZ6invBlG7U0bFF/xV9GAh3XzSkLSg7OJxrOF5rSMpTTEZ2WhI1UnLAQDaZD1Sbbt26aVWHiDxEgGoFpwfJQWhsAgx5uD27bCENIDTmEASV2rmMCyoUSAyRYOBLRXu+Q0AgvyyxpW0Md4iP/yEkPFVkD6Ne4cXimRARwLWSZ4XEY90+bUJEoNhLL73kff/997cGg0E8V55IUfPiEgizDjFkB4PBcVlZWQtYK2KqISI9TLEtXg93jpVZBM3MFjYliWk4xhJhN5MWIyXlmTlkpqTBUGTSYlX13O5mrpH3iWdSYDxBVCAIBGKQPccBVBt+l+AdyLdixYrQeEpemGTFSgIl0kC8ixjYfEcqMJ54xCRYyHgQMxFPGecBiA5CwO2L+xdDm2DgZ599plUxVCzaw6hH9aJ9VDz6yJoOEjIlhV3sGqQcvxE8pFTQypUrPevXrx/3+OOPo3PHLD2AwvoQdcXFQCDwSm5u7odivLvXg7izdGWQTbVJzpmVxN0JkPK7Wx2LVuA4UmDLXBnpRnj6y0SLquV+F8kmNtuWfghRmNUQy6oEgavzngBEIn2XlXYgqzsQm+e41aXQAu+HOkUk/qab8NconfeEagORIXlAVAgJ1UkkB8iNyoQXCxWKDUaxW+gHuVWoQrJ3B+1wj2gTUtlFikRATBA47aNOEVGHKCBA/sfIB5YtWxZIS0vzdu/eHVx9Zf78+RpfCzNmhZEg+Qx2n893g23bbJngcyohYvjoC0ydXzZa5DsTEY4jyzk34rsJz0R8SbbL1zFHIrgzVcN5vUxEBglQI9yZwea7mP0MOyhGbKesEghIK8DYyTszXhjRsmMs0gPkCzrrxdk6QAJ1kr2LGx0khliYV6SRLNpC2khshGvxhuFlQi2izjH4gIQQosPJg1cMBwAqFXEQjHhsEggHaUMbSBOuwaVMdjJufPqLAU+gE/sFwqFAw+7duykQx++HW7RoMZp3XrduXaEnpihRKG2L5Obmsl7kfsuyWFAVMI1zyecRToTOKgafIF647FxzLYmcN9dju5H+Dy9jPB8wuX+klAt+5xMiMVNkzOebfXX3wR3dLy8AJ4Z7m/OG6iI2A96fgwcP6tgHCAqXRtWBkDCwGS9ZlAShyBybjAR7gevh/qyZJ3CIuxfieO2117Sqhc0Cx0cqYHRzD0QHYZEBjCOAOsucg2ggFFQw+sc1ZCfTFyL0pKNIPd527doFrrnmGu+mTZvuv+uuu77FrXv33XcXOqhUFAkSirDn5uben5qaeqlSihUo1Pj0iiQwEYtzbv3eLSlMzst9Zhq7SVhybbgAmnneRFpT/TEhUqq8Kf1EzJuEY7qmTfvL/C00UGUgZcUt/UB4UWeFIeFxguMTQ8AVK6V6du/erd8JJGUfDdaRo0aB9ACfEA+IDdGJ9IbxQIDch/oFUuOuxeOEoU/72AkY9kgMJJRUXqc/3A8h4erlf9qGCMnmxaCHOGhHzpO0iGcOVatx48aBxo0b+5YsWbJm1apV9zsxjyJNRFEJRDAgNxgM/s2yrE8ZaLa8SklJsRgEJsHMaxLVRxDIjHC7EdhEdEFiRL2ZZuI2+iMRm3yaapLo2W5HgXm/26Yw1TfzfyFmd+JlWSMS+oNqgxsWNUnyrVCN4Oy8F9wYZAP4v1q1alrV4h6QG7sDO4W1GBjDgqQYwxDTSy+9pMdC1nRIAiO4AE5wn7kJJ2khSAaMe9qhfZ7HPRjuSBTGDkmCxEGCcA8qHYTBRqqojfQJYkMasZUdXq3s7OxgVlbWSMuychcsWBAxnb0gKE6iD3qKz+/3sxvPAx6Px/vzzz8H6DiiWhBL1BwmR5LXeCFe1LQr3GqQiVQMMKKW+4Sw5AhnOJuGfyRCkWe4bYZoeWJub5pb7XO3XxzgHVB3irujrNxLJBpOD/dHKkj/WcMB42FhE+oJYwyCw/DWrl2rA3EE31iYhIoFtwcRMb7JAqYtvE8QEe2jKYDY5FSB0Mw5Hi1+HzdunFaRkBTMDVu/SXoQBEE/+B1pJi5cpMj999+vs3RJfyetXiqdkG/F8/BwIXmwi7788stA9+7dvePGjbvf6/V+ftdddyEEiuxSLKoEyefVysvLm5CSktJn//793XJycgLVq1f38jIYYbwokw2HQE/kxaSmE4MCNxNXrnBnM2VePCkgJklp6J4Cpv4sSMtkcI8YoOHUN/N+0+UrxGcSthicZp/M+wVijdXECrJYSDxrIEBhwHwv7idTF1sB1624RWE8tIt6IhVUOEf8g+evX79eG81weQgLtys2B4QEI2ReMKQxkrEhIByAMYOwZCkuhAWh0y5qEHjB3iu0h2TgmXiv6AvECJ4wFyA+bZHeQn9wEqCyIeWEGfJOECZtfPHFF4ELLrjAN2DAgJWDBg26e+XKld6JEycG2NG3qFDcVFEpY++3LOtKr9erczt27dpFJooeDNFxEemSo8PAIn4R0+IS5lPKWJrRdamcwQRIhq4pDcxD7B8mQ5AcgpGylAKyp7YZt9CDYbQtUs90K0dbx+22ScJJxcIA4yY5bkWJspt9QVViHFijbTpJaBsuj2pDGoeU4yHPCc6cnp6ur+U7kgUpAJLTH+YThEXagLBUdsRdKwTNmDOf/A9BkLKOWxiEZz6RQFKZnes5D1ODsSKtUNHIKOZ5GPj0kT7jwYJAxcaR/RHZYoGtuTMzM7NfeumlKy3LyiMZMdaUkkgQL9eL9i+npKRcbVnWU6mpqWxe4TMX3MAd3Gnp4gLmRUFY4SRS9AwDkAGGo0jZeuHo0oZbKphqE4jN4EkpHKm+h+RiYOGQbiQGKbhOjPNoblt5t3A2hvStOFtISC5TuF2bCgIQV3KUpFSn2B0wLgxnkA0Jz3cpjYOERh0DUVu1aqXefvtt/f5wcyo3QmS4UWmb3xlD2pWiE5K+Y67VkXR0xvySSy4JpauzngOJJPYOUg5bhjYxxMVlS7yEKDpzj7SQEj8mY83IyPCnpKT4vv/+++EszXC0o2Ln78RrsYG2R/Ly8ugYqw9ZdehHDCNe0XOFqwuIugJ3kqxPcb/KdaIKMHgccCwToSMhspSEkZKT4kGTHCwpSGa6ceV+MkjxrZt5XSYhhAsEuu0aCagVZ+FVuIBrLPfAZLiPT8ZLgmvizgYgCGIIIB4AIoJwEAhjAxIjSbZs2aK5OfeRaoIkII2DtgWhpTIkY8K4wfmRRDIvzBHSiTgHv+MIIAuYCLjExegf3izm56mnntKeNGwiPpk7Kpig4lFMDs0DScM74G5Gde/fv79/wIABxOOesSzr6QkTJsSFOOJhg/zBHqlTp851OTk5XTIyMjpnZWUFMjMzsVHypZPku8khCjiXGe2W3CAmWaKo7jgKHIzJguNIVT2uZ6BFtTM5mTxf7CK3BOAc0sq9F6DpnZJrTeTlN7caVNxUE54j1dxjBVOVxMCWd4L7044klsKJQUCIAKRDuuAFglvz3owlwbvWrVuHnB/YLuj/sm6D+AZzJgQCF8cDxTgwH5Jiwv/sZSKeJ4gPIqF/EAXnGSt+w/4A+UF6+oVbmfYhOiQccRcIjtgMUgn7FcdQ//79fT6f76vx48dfN3bsWOIdccvziedyNW2P/PTTTzkXXXTRoIYNG+6pVq0aAcUgL8JAiycrnOdHOL0QgnB0EBFEYTLM84L0QghMkBjtPE/89+5dizjHb1wjRGJ6xCTd2x09N93UgCl1iiIlQEpUmWjgblfiC+74Ddxc1mvwO+oP58iExYVLch9pGHiAkAhwX1QWGAUFFGBAMAbSzlFxQGju79KlSyjgC0HAvVFxQGCIhPXsRLd5Js+HQPBe8ckyV0ldgRjwOKHasVoRtY/5IipOkJAAH5KbeeFebAlRyyFqJAlSh/dGauEBBVfeeeed4JlnnulZvnz5noMHDw5q3LhxjrMIKm6pDPGUIKEA4lNPPfXdgAEDLt+8efO7WOvOXoeWxEbc3JYBFted/B8uzcPM1WKwmAzReWXppyCwabSb/wuSAYL07hiL/CYJjOGknxBIJBukICiK4S2JhDxX1l7znXFFp4f7oruDeGTawqEhBlykqE4gNzYeyC8Fo5EaeKpoB4IVJwpElpWVpRkJkhwCgNsToxBbjrYx3JHa/I7dA1JDDAQOJZUE5OfZIDfPp1+knnAN1dSRTLTLeBPzYF7F9iGFhDnkenavRYpwLXtQnnfeeRzWjTfeOIRi6060PK5ZoonKj9A6oMfjucHn800PBoN6BaKZmSuIhTiHI+Hyg8sxIQSOhJgAUW/gOnB4M6gnv4dDYJBC9vkzpY5Z2A7bCA4qsQEhRLgfYlyW3ZoOAfP57piLm0DdaSrFcQHLXhkCst83CMgnCMkY8T8cnvfGdsAYxx3LOZCX+AVEgnsXbo7UQKXBNUsbEBvIv337dk0McGwQnHgH0lwi72TeitSQKiMUqyYOAtHI1mwgNoSE4c+9xD9oF8nCuEmGMEXn+GTJLAQHTqD68T64g8ETJAqayAUXXODv06cPjqAbhg4dOnPRokW+nj17xn1RTcISiM466yxC/f5jjjlmaqVKlcYEg8E8v9+fInvtiR8djodRh8hHBYALsvLMXPUG8B1ElgX/pjtVJBCTSLsgtSzG4XqQgcEFuUAWrjFVJyFW0bfheujaUrrTtF/EPQqY6qIZGJX4gpyPVyRdjHCez1oH3J0gOSDcH7ctKgrMYcqUKRq5yJ7F4IYY4NKMB+srQFCIgN/pL+oSqpTsyV6tWjXtjmUcQUoxsFHdIAwIQNz5jDkr/ZhPnDJEs3HR0r5k+vIM2mVcKT5NW4888kgogIzkgwCQIhD0tGnTQnEv3lvKmp5++ul5O3fuTAkEAtPWrFkzJl4eq7BjrhIES5Ys0Ub7wYMHb27WrNm8Fi1apHg8Hj+Dw8tLpqjYFhjccCf0TQiBgRZjWWwJM0gICGKDHEwAkwE3BLnhUEgFCIdz6LogDd4bjE8hKrcrVqQAHJH+mBzbnXvlzicDpFqhO+oOoFrwbrEkN7p/FwOcNuk3/WOVHRyWZ4DMt9xyi0Y+ODVjzPuCpCAyjEG8SjAhIuIwJXKrUFvg6niKUJN4htSlatSokUZM2UZApC/qF9KI87IsFsZHzAItQLYoQBJDPKhFuGchMpgke5ngsTK9hKI5MJ/EvZB+EKvEVuhXrVq1/HXr1k357rvv5kMczo5QCVt8k+gUVNq3unbt6s3JyXnvxx9/7JWdne1v1aqVj3IyiFKAXB4QGFGLgUjRY6QBVS0YMDgQ3FICje5cKxLaiPbKHhJMHCKaSWRCIR4QE65HwAlDEaJg8NF/TXuASZAgl9SONT1n5oS663CZxGCqXXI9ej0SzVy5Fw7MJcCSIQtgbMME6DOcFGSEGSApuFYKH8DRaR/bQvY2pB36S8oO6hFjDzHBPAjwSWav7CXInKxevVoTCoxJltyidvJ8niWrAJFKSH2IhXHmE+Ji3qT0KO1zHoJDZcPNy720gSQRApAt1WBu9I+xYjzof+PGjf1du3b11a9ff9HMmTPPcwij2MHAaJDoPQN0x1etWuVfv379RXl5eV8Eg0Ffbm4ugUTNZZhoqX+EeGcw4I4YZRK7gJgkV0eWiwIgNpKHT7JFaQt9GMOOe2RREJ+iNjCRPI92qeBHtFbqT/E8DEnOi0g3i6wJV4cjS30md2zElA6i5olxDeGCrBAe/eGZEC8IBkh6iwTSeAbvLQmBgBAdSAw3hqnAaXkmblIQClUHwrn99ts1QsJs6APSBBcpLl6eCQKT60SbkjMl48s7pqenawbB86RGMJICyYPKxu/YHCQporLRX2ffDS0BSBFBcqFuMaeohTA/qaQIs4LoGGsIS0qYoiLym+xCy/WnnHKKf/jw4b42bdp8Ydv2hWzXPHHiRN47oYtv4u3Filbw4UBKSko/pdR/t2/f3nnZsmX+K664wsfgMphMMIjJIDPJEuWWPSDQX1GN4MJMqqgbcCjR92W3VdQEskdlURD34MIkcsv15gpCOJV4wEAK4Vi0yXeRWCAHrlBZSy1bHUcCUUXgyJJeIZ4j2oRz0jdJZRHElMg/v0FgBMNQPWAmJOOBYJKVi2rECj1UKRANly2IyzNQvRgDCIiiB7w3EoFxFQMajs7zxFmCl0q2gJO9zjMyMjRB422iPeaK8cGekbQPxhvJj4qGzUMAkoAi74lmwHxBLLyHpLgDxDmwP4mNQLQwQLxXMK1Ro0ZpSUJ/MzMz/d27d/exQG/btm39Xn755QPs51GU9R2FhZJc5aO3UGjZsmXt7du3f1CvXr3OrVu39q9du9aHYYnhx8o1PClwJQYXxJK9HOBMID9qknB89GZJaxDPC5PFvSATSCALtYjmghBwV9HZ8fPTLkQCUoBMIAUqAIjNZJmJlLJZjKRUiGHvdhoAYj+BrPQDJIOLivtYotuignG9SEMQmD7BVbkOQpWSOxRyhjBpk9q6tMm9xDcwjimeAFLL8lcYDl4rEFBiPwDPhbD4nTZQbTCQmQvZBi4rK0u3Lc4PDlnXgQSQckssc6VtiIZ3QgqQz8XzIRCYAX1GkvAOAG1DAEhHjHLGBOLmGsaN90FV3L59u59A4BNPPPHVTz/91OfAgQO7S4o49HyqkgVtUNWrV6/2rl27PggGg50rVarkr1y5MmkqOmKKYcfgw0XIwoSzYugxwLKYhuAXE0o9JkEu2fKX7yAjSMV9cCc4GKoX0ggpADFyLV4cWQ7M8+gDXBFCATnhqMLdmWSeCZGBRHynn7LlsOnNAkngklwnEgnCBtEkoAciu+M6pGPQVyl+IBmwtIeeDuFCyDCBmTNn6mtAOOwKVFKexXcpTg2DAXHFZQr3F5uMfsI8+I37UGtAWmwT+s71+/fvD63gI90DBgSxsRJQ1qZDzPSJxEOpQAKhQyy8G4jP1gWSBYz9wj2UEmUzHSnOjfrFXJHrhWRxlgf7K1Wq5OvXr99XM2fO7FO/fv3dsRZ8ixeU9L5l2rP1yy+/7K5SpUqflJSUz9PS0nxdu3b1Swo8ejSL++F4UlMJDsdkombAbUA2VA0MRTEupYQNXipxI4OgDDb6LJPGZPAMCAREYuJBApCBlWqIf5CP9lC7QBRUBhCR5+PFgSjoE8iA+gO35R5UMHFhQlycB4kgUs4jEZh07sNT505xAdFBcq7jeTwbZgEHBnEYC5F63C9ZzxjQIDkcV/bdQNUaOnSoJgbGjneDsAEQGaeGrPqEgBgDsnEZe/qBnSLFHWrWrKkdAzAIGBjEAfIz3qNHj9bX0jbnpX+oUxIjgslAFFI9kt/oK8QoLnjmjH6yAAqJQkGHQYMG+YcOHepLS0v7/LXXXtPEAe6UJHHouVElD7ygB1GZl5fXJycn56M1a9b4kCRwSQlU4RZEz2ZSZDMVVAAkCRz2rrvuCi2kQjJImoisJ+C+YcOG6cln4FFdrr/+eq06cT/IzuRLvIW2WfGGmKctVA84I4jA7yAuHFgyAfhNVC9UGxAK7ilqE4TAdyZcIt8gKuqjlBjl/cSDBoIgvWiLggQgMc/i3eCqEDteK5iEqDciLZAmzz77rCZSEJn3YhxQc8SOkucgzXh3EBfuzrX0U/Y1F8Mb4hw+fLh+DmopgIqLSso5DHXeA6lIHAX7kd8I6EEQskwBuxHbhXnjOUhqGBSMA2LlmdhIOCFQr1Fra9So4e/bt6+vd+/eH06ZMqWPx+PRalUi3bmRoLR2vhTDfX9ubm7fzMzMuU6tX/YfsRlcCh3DPUFE2eqLSUYFwXsjxQAolS+GL0SByiScFC4MR4RLgXwgLVwPg50JQ0VAX/773/+uOR+cV9IjIDYpSiAxE/rDMyV9AqTmejgs58WlipGK3STELLYLCI7UQ/fHZUt72F30GQIEwVE10L1BFNkSgPZARggdxJYMaDi32DIAXBqk5ryoO0KwAN9hAPwmNhT95PlE0mkTicT7yArOVatWhYpbCIMAIHzsvKlTp4bKfkoGAmPJvEmAkffHtS4pLngSIWi+Q/ikwji5eva5557rnzFjhm/u3Llzs7Oz+44YMWL/P//5zxKzOUrDi1UQkRCtGxIMBnd6PJ4x+/bts2vXrh0cOnSoB6TBOwIiobKAMHB0kBMpgQQh0Y1zqEcgn7mtMHo+SIpHBH0XDgXygKhidMIpmSgQHS5K+oSoQACIBEKioqGqYaAiXXgGyC+GOkgNgGRIE9zFSCSxYUz1Rr+8Yy/hWQLJCKLxPwg7efJkTQiUyMFo5d3g1HBi3oF+8Ay+0x7nkUZ4hOg7SM0BsiKRkFxmTppUYYfJwDhAXIiT77IvB8TfunVrjeSoRiAy48mY8a58SnawxI4gSJgZxAHQBiqceMSklCjELswJicf59PT04B133IGd6Vu9evUjSqmb33//fSah1IhDz78qXdAvTh3svLy8m9PT00c7ZWc8O3bsCIAciG/UKZAFQxvEQeeHMwnnIu6BJwX1ABEOoiE9mHSIiQkCaBukgLiYeJAc9eWhhx7Sagd2D6qDLLCSxD2xd+C+tI3tQZwF6QJBIQ2IA2AbmSn7AHYORirX008Ilk1qWF2HCxOkRCIiCflfov+ymIw+3HfffXpjGYiZ+/HI8V2Wm4Ls9E1WBNIPDlQX3tOdpMknfZFsaBgP7mLemTZhSKhJW7duVbfeeqt+BmqdpAdJ6ojkhjG+4rBgzGmH9+A8TMEEjHzSTOgr/UA6NmvWLNCwYUPP4cOHPa+//vqNlmXdDE6YOHK0Eggg6cnePXv2zOjUqVP/gwcPZr3wwgveM888E11UBxFJlGMiQQBUAEE4VAPUFDgS1zFpICyITwoEEzVr1ixNMBARiAPR0JbYCqhz6MD8z+TiCEDXh5OSQIdKhsojiXsgI/0gTYOJhpBBbjbHRBcHuaTCBxICDoz6hvQCsSFCDFO8cbTB7xjVXIOxC7Ei9WAAZLzSb1RFmAWJf9yPV4n3Es8bthYIKi5SYSiyrl2CmnznWqSBEDMMQKQC7w9Rw0QWLlyopSREI5nR3M+4Mt6cl8Ao32kfOwUJDQHh6UPayk64OBqwjZBSzAOxkjlz5vgHDx7MmqHMiRMn9l+zZs10ykc5AcBSr8BX1qqd6aSzqlWrtjl06NCLF198cdeDBw/6KR/Zpk0bC2SD08GBEOOoX4h5IsbiLULtIKhFro/UeJKIPAgvJWeQHrSB3QIXhRPSnpPSoCcZBIE4aEPWQKBLg5AgLQjBWmvup00iu3BsUZtkh1ZUDRCE+1ErUL9AEAgJ4qBfcGr6yXbNPItnkFsFURLgRIWiTWwojG+kHhKCNiEW3gVGgcqJ/UCbMAlUGLg7IOtZeCbXMj4QGzYDBM770E/sKZjIL7/8ork844HtxzuasR/3unshIllTQx9kbb1kE6ABIOUPHTpkoyWcccYZviuuuILNCv9y0UUXbWQ14N13311ype7LsA0SDvxOFvDGHTt2nNm9e/fpvXr1Go56s2nTpsDixYu9cDdEPkiL7x6EwYsDAsGFsSPgvkiF2267TU8QkwO3Rb8HKSEO1AQ4NioBXA2dHe4nxiucHA4MEpAxiyRBWnA/E4wEu/POO3X7zzzzjH7G9OnTtYSRek6oYvQR1Q1JhS2A1waEod8SOac92kbnh7iwG5AiEsEHaVENcVlDXLiDaQNDF2SGQWCT4Kqlv3B4gD5JRRAzgImaJlsnIyHolyA/BA1h8J7ZTv1byWh2V2IEzLoDcg32Gv3GruK8BHNhPrzvunXrAuecc463WrVqvq1btz7VvXv30Q0aNMhm7ssScZRFAiEgxgB5GDCv1zti3759n3/00UcYbRkNGjTwDxkyxAciIyVASIxUpAaTDZKA9EyKFBSD28IN4ZpEoTGAUQ9AQBCbCcPzw71cD9cFSSAOOKGkk4NAUhUEaYN9AELTLoiA6gTRkb4NUvEcuDcuWxCaPk2YMEGrYUgEEIlAp+zQeu2112oOi3REPeM3iA3Vjn7QjsR2UFV4Z/oCokOIELm4lgXMonaSw8VYoE7985//1NKR5+JMQMrJIjSJ0VRx1nNAjKhMMBieL8WuZbMcyWOTNH/eW/YKQVWDIEVyoxFQs2DhwoUHDh06RKr6k9hQTnS8TBFHmSQQc3fdQCDgeeONN55USi0fOXLk43Pnzu0xZ84c+5lnnrGbNWvmwe3IBKKekHaClMBNSoEyEB9EhOsygSAmBEAEFxsGzgoSwB1BaFQ3EJ37UJ9AGCLtTCqfUkWQtiA6cp9QgVBTULOwdfgfpwETjjcHDg8XRjpIQiHPRxUDqSXhEOQi4Mb1IBMIiCGOO5g+4oZGOt57770a4TDokSr0FW4t3iLxlplLcsWLhqRB/eOZxINId4cIkbQQAjaVmcIv9Yr37t2r+89Y4+kTNy/Pl0LXXAdTYQyYDxgC7wGzQLojjdgqo3nz5latWrV8K1as+DwQCPzdsqy1bKQ5f/58ttEo/fKT5YhAlGOgBRC7n3zyyVrbts8MBAJ3tW7d+nY8HETfWaCfkZFhERDEYEeioIOjx8Nt4bJMNPo2uj8TzISjPiHu0b0xZkFiEBbEJ2pNmj0SAu+TBOZAYpAIBMLtyicEh/on94C8eNgoigbiol4h0eCqID3XYOdADCDlpEmTNPGJK5k+wOG5B2nF/3B+iBmJKVVF6BvGPZIEBwHPkWLP4roFBNlRd3gmwVcI+IEHHtBSi7GRbF1Je5HcM8DvxHuQOCIFZUUmRMFv9IkxwJZDVYPJMMY8E+Zy4MAB4lqBK6+80nf88ccHN2zYcP++ffsmrlq1Cve+b8GCBdRUK1VEqwgQUno//vjjM+64446V06ZNsxs1aqSL1rHm/fHHH7c/+ugje8CAAfbbb79t9+7dW3tB2N3U6/Xal1xyCUEo8Yzo46yzzrI//PBD+4orrtDrmwcOHGizl/aZZ55pH3PMMfqamjVr2lWqVNHfhw4dar/wwgt2x44dtRSbNWuWPWPGDN1uu3bt7Pvuu09fd//999s///yzvWLFCvvRRx+1X3/9dfvf//43hc3sfv362ew1P3fuXPvFF1/U1/bv39/+y1/+Yv/3v//V/e3SpYv93Xff6b41btxYP//555+3v//+e/vVV1+1K1eubFOcYMKECTb777FJDGNw/vnn22effTbr//U7c57+nHbaaXpMuIZ7U1JS9H38xrMoulatWjW7R48e+j76wO+VnE/uoy3zO21wcP3xxx9vX3vttfbFF1+s+8rzL7jgAnvkyJGoTHbTpk3tsWPHfvnWW2+dwRw6BFEWPKgFQnkiXWvChAksymfQU5966qnbA4HAuBdeeKHy0qVLA23btkWSeDDi4aaoJHBeqUkLVyNmAWeGQ6KmkNqCyjF+/HgtPdCv4fbEKPgNzkkbqC+4LFGxUKfg3KhJXAdXRhIhOeDguGWJicChiV9I8QTUJ9QQbBokA2oTgTF+xzOG5MNuQlqhMmIj0B9ZNou0Qn1BzSLQhjGPmxj7CW4uC6tkD0bJJuY3VCQMf/qG1w/VjDHARY6UQA2V/DGkoEgUcyWjuImRXrK7lJQ7wg5jywFcx6hcfr8/2LlzZ4jR6/P5ckaNGvXg5Zdf/gC7LrCJzeDBg4NlwYVb0QhEAwM8ZMgQpDZrlo/fsWPHg1u2bDmP/994443A9OnTPeyBTdwEnRh1BWLAFconeUZ4unDhgizo5bhFQSyQVrJ5IQQ8VSA+0V+MbggF+wRC4F4xVHGxopODjKyUwyuFHQIykx6CAwEViTgGz6FvAP2BQEFO1C/aQj3D9Yrah10FgfI7BAeC0x/ehevxjkH4MAG8YqhBGPX8L0E97mVsIAYOXMWoRahAECEqGpFsMyWF34jW//bbb6Ft2CAqCJLnQeT0G+KRQCH3/vrrr0ihQMeOHfU6n7p16763dOnS8Y0aNVojczd48OCytzddFCgXYs4EBjgQCCBNfDfddNOahx9++PwbbrhhSO/evTeymU+tWrUsqqg0b94cUa8RDQ8PnJqD7xxwPWwJ4gmydx4EhQ7Nb3h4sGnweEltWQx6JBA6PxFhEBEDn9+RJmShgqQgEQYq50A+PFzEZbA5MLw5j+EMkWLs4/3CzUy/8Cgh6fBgUdUcgoAY8cBJ7ATJhH3ENUIIPEdWCcqiMAgSTxv2D94++gszAHhX+ksiotgd4gFDStBP20nGlDw0pBheLpFMEDhjlZmZae/ZswfJbnXp0oXE042NGzcesnXr1r4QB3Ykv5U34ijrRno0sFG1cA06yy5Jdny7c+fO1+/du/fmbdu21Xb03MCyZcvYmddC9QK5JdIuRR5YdAQygIR4mDByUWHgrnBROD+eGLgvRAESIREgLDg9CA4SidoFQoM0srIPhEUyob4QBUddIihHGyAt/+NMQDJJhByJxTkpzMC7EFtBxcMYhuuDsKTggLQY7NTNRfJBvHjGICTWl4DQuGdxMSPppGwPfRZVifYZD8mIhnhQ03JzczUh8Ez6yvvJ0mOIE7sFbpWamuqrV6+er0OHDrszMzOnLliwYCYrSJ0MXFUW3bcVVsUKByK6mfT69es36NSp002DBg0amZeXVxVuznrmtWvXspmjBTdFr4d7ow6hguDZQb/GDiBqjA0AcoJYxErInUL6oHJxHZwatzE2ApmpIB0qFe0+/PDD2p5BImC3yMIpEBBi4Fl4zlDZkFYQAggIYRGbQYKA4AC2A7YLWbP0U6qpI02wY4iZoILhQoYgIQLiGrTHNVKDF9uAayB8KTRNMFFsFSQLxOuoRTrvS5bkTpo0SRMptgmp7E4g1R42bBhlZX1Im1WrVu1v3br1k2+//fZky7J+djY3Smi1kZKCCkEgxrswKQSiUI9aZmRkjMnLy7siNTW1KjGSm266yX/22Wd7xowZ4wHhWLGILo00wL6gXCY2CT5/VBZctRAHcQOQEUQn7oFRixMATo9xDLKRz4Sbk2AdSEl7cFzsEdnnG85M+zyX3yBWvsO1QUQABIVIsIXQ+eHcXIeNgTSAAJEOxDEAJBfXID1wd0vMBscE0hGJxHhA6NgtOAGkWjr2hVmtEcInxQYbg2fs3bs3tJMs4+f1eoMNGza0GzZs6KWdHTt27G/WrNlTffv2nfHAAw98T3+cTAhdbaR00SEJBRGKBtu2my9YsOCh9PT03enp6drd+fPPP/tXrFjhnz59ehD3Lq7UpUuX2p988on95ptv2p06dbJ79uyp3bS//PKLjS//gw8+sDt06KBdy7gwf/vtN3vt2rX2PffcYz/99NP6902bNtl79+61v/zyS+0OxuUJQv3000/2gw8+aHft2lW7f+fPn29v3rzZ/v333+2FCxfq9tavX28vWbLEXr16tb18+XJ748aN9uWXX243adJEt0+bPHv06NH6WlzRuLKfe+45gqZ2/fr17cWLF2tXde3ate3x48drtzRu2Dp16tinnHKK3aJFC/vGG2+0+/TpY59++unaZYsrF3ctyYHXXHMNkkH/j6u20hE3b7Bu3bqoSH7umTRpEs/YlZ6e/rBSqrmMM0thbduuSAy3YgP6r7MvtoZmzZrVTUtLGzdv3rxvn3rqKY0gxBLat2+fN2/evACIcemll2rCgK6IOyxYsMAeMWKEvW3bNh37mDJliv3xxx/reAvbDL/11luauCAq2pw9e7YmAJD5hBNOsMeNG6djGT/88IMmApCa39lg6L333tPPInaycuVKe8OGDZqITjrpJPuRRx7R1xHXoC9DhgzRv0PEDRo00AcxFGI2ID2ITKyD3yFMYkSnnnqqjltIrIJYBHET3oPzfELA/C6xDeIzVatW1ecqVaoU8Hq9BPNCMZVGjRp9e9JJJ92KoJPgHoQhtkZFhAr7YiyywS5h8kif3rp166+HDx9+6N133+0yfPjwwZs2bXpv9uzZfvawW7lypefSSy8NTpgwwX/hhRcG8W6hCmGAY7SjkpCsiAqGzo4ejyqFdwo1Rvb0ljX0xE8wllFXSD1HVcEewU6Q6oG4Y1GFsBdkzw3ZFxxVB52ftkidwT5AVUJtu+eee7RaiCMAuwc7g8VgJGbyHNQ+rkNFQm3jXvpMpgGOClzcsr5eSodKasrvv/8ezMnJIbIdJFuhZs2avk6dOpFdvdDr9Q7evn17ly+++OJhj8fzKzXJwR/WiJfmgqYkxA8s8dpJztHMmTM7VK1addITTzyxIScnR3Ntcr2eeOIJDNC8b775JrBmzRp70aJF9meffaYlA8fVV19tz5w5U6tfwPvvv685L5wdFWfr1q026dzffvutVkn4n6XEqEpIn507d2qphEo0fPhwrVqxOysq17vvvmuz9BQ1CK7ft29frdqhWo0aNUpLLFSt//3vf/oeJAnSjzb+/ve/21OnTrXbtGmjJQv3EO1HClx00UX2vffeq6UBB9F72seQTk1NzUtNTQ0giSQq7/P5Npx22mmTvv76607makRx2aqjBI6aFzVAL+N0jEhZ0Zi6du3aM3///feBp5xySt/s7OzGeIPYGoDcKcqlfv7559app57qOf744y3ZOxDDGIMdj5Gs2yDCzX18EkchDoNDAOMajxMeIfbVgNPjVsZThnTBqOZa4iVE54muE2hEUhFsRAJgpCPN4Px4pvCs8YkjACcABj4SATcy0oy+YZzjjcIDh1TBdsKugIC++eYbXXFfD8oRlelH27bfUUq9FggElrKC2BkzxosLyk0EPAlxAEd3zhcLWrx4ccabb77Z59RTT50xYsSI9SNHjsTXrw1npMjevXuDt912W97GjRv927dvDzRr1iw4aNAgzf1ZT080GQmBPYENsn37di0pMNSROJxHamCkY2tgm5ALhl3yz3/+U3P7u+++m8VE2hhHSvBc7A0cAEgg8rRuu+02LQG++uor/Ts5VhjZ5ESR5vHOO+9wDwhNGo7/wQcfzPP5fEHJ0xLbwuv1rvd6vdO9Xm8fYoTmWJx11lm+imxfJCFGwPuCQY+tIuecVXO+wYMHn7hnz56xmZmZ72RnZ/+Ct+rEE0/UiYWoUSBsx44d/Z999lnexIkT87Zu3YqHLHjLLbcE8YoBGO8kKsK98XTVq1fPnjx5su33+3UCYq9evbRhjSGOioSBDWG8/PLL2vvEM3AqYGTv379f34Nah+eK5MxFixaRSh4cN24ce2bkeTyevDZt2kAUdo0aNbSKRjIkROTxeH7x+Xzv+Hy+m1NSUrqGCRZ7ncMq+Zkoe1BeI+lxBWf9c0CIZcGCBZ7BgwdbFEhWSn05f/78L5VSU2zbrrZz585Os2fPPnXnzp09xo4de0L37t2bfPrpp16CbQT9COwRsCO+AMcn6xebAPWGuEO3bt0sIvOk6ZMYmZKSYrH2gzwrnANE+yU/ixQYvE0E+ZAOXOd4mLTKddNNN2l1ccmSJRaG96hRo7zkWhGrcdSpwJw5c7YNHjz4q3Xr1lGkb1kwGFwbDAZ/D4MHonKW++BePCFJIFGIxckgtiZOnKjrCluWBWL9zzkgppSBAwc2Pffcc9tUrly5w86dOzusWrWqRW5ubqOaNWvWHDNmTJWPPvrIIujHZjBSKJtAIIE6crJYHoxNw+o7iIzgoJQewq7485//bJEvBSERLGRlISksROixa0g1+dOf/pTdv3//rNWrV29funTpZo/HsyEtLe2bvXv3bhw0aNA2y7JyXVsp8D76nWSf+1Ib8CRUPFVs8eLFPmfjlj+As5UBdTtbbt68uaff7x+2ZcuWO3744YfHvvjii//06NHjk/T09HVKqW3XX3/97oULF+5v0qTJ4Xbt2gWIp5D4d9FFF0Gghy+88ML93bt3352SkrKtadOm6/r06fPJ1KlTX2vWrNmc7t273/nee+8NO+GEE3oqpVq9/vrrR2qFhgevwwyTqpMqHPw/oKXpAoBhw8gAAAAASUVORK5CYII=",il="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAB7CAAAewgFu0HU+AAAcFUlEQVR4nO2deZxcVZn3v6e2TmdPOp193/eErCSBJIAsggFHRZ3RQXFB0VFfxwwzvr6O+jroqOiMozICI4hRlB1BBAGRPYlsWSELgSQknaXTSTqddDq13DN/PH3pztK3q6rvvbX08/18+hPodNU96Tq/c57tPMcs+7xjURTljEQKPQBFKWZUIIrigQpEUTxQgSiKByoQRfFABaIoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8iMWihR6CooRLOpP9z8Zy+WFF6WyoiaUoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8UIEoigcqEEXxQAWiKB6oQBTFAxWIonigAlEUD1QgiuKBCkRRPFCBKIoHKhBF8UAFoigeqEAUxQMViKJ4oAJRFA9UIIrigQpEUTxQgSiKByoQRfFABaIoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8UIEoigcqEEXxQAWiKB6oQBTFAxWIonigAlEUD1QgiuJBrNADUArH4Gq44gLD8Sb49UM2p+uROwsqkE7M/73GMHyQ/LfjGH71oC3sgIoQNbEKTCwKXbtAr+7Qtxf06QndKiEa8CfzniUwbCAkU/K1YKaMQTkZ3UFCJBaFAf1gwkgYMdgwbABU9YEeXSEWA2MAC+kMHG6AN3bCrfdbjjf5O44uFXD+fEMq3fK9If1hzDB45XV/n1XqqEACpiIBo4fCvGmGKWNhxCCZoMbI31vb8qdr4BigqrdMWDD87Lf+mj69e8DIIeA4J39/+gTDK6+rmdUaFUgAJOIwcjAsmGmYNVlMmVhU/i6TkR3CtjMPExFoOAar1/s/YSePkfEkWwkkk4FzZ8MvH/D9cSVNpxeIMVARh3islZnTTDoDJ5Jio7c3oQH694XFc+DsGYbRQ2US2maTKZnKfkyJOKxeJ+bVntrc/03tMXeqOe17GQeq+8BlS+Dhp/1/ZqnSKQRijDigQwdCv97iBwwfZOjZTRziRFzEEY2cLJBMBlJpmdzHjsORY1B7EPbVWfbXwd46iBjZLWZNNsyaBH16yWvd1+VKIg5PrISf3GGzEmU+TB0r/7ZTSabg75cZNmy17KgJ5tmlRtkKpEc3mQjjRhgmj4H+VWJ7u6ZOa7wmojl9sQUM1ooJZCLiZIOswvmIwiUSgde2wU9/G5w4AHr1aHuciTj8/88brr/FsmV7cGMoFcpKIJVdYO5UmDfVMGmM7BbuBHcccGzHJnBrjIFuzcLw6z2TSfjFffY059lPZk3y/nvHgd494ZufM6x4yPLYC2febcIkGoW/u9QwbBA885LluVfCe3ZZCGRgP7jkHMP86ZIdNkY+6Gyc4Xyx1t+JE43C62/C1h3+veeZmDbetPs7SaWhsgI++0HD4tlw7+OWDVuhKRns2Nri2g8ZLloo/z1rkiHjWFauCefZJS2QIQPgivMM584WX8J1iIM0T4IiGiEUk6Zvr9PDu2ci07zjThkLE0cbdu+DJ1fLjnK0Mfhxgix0ly2GC85u2aXjMVg827ByTTgfckkKpFslvP9Cw4ULxfnO5BglKlbCqIWqSLTkW9rDNpukxkio+mNXGC5bAisetDz1YqDDBODSxXDNleakz9ZxJOoYFiUlEGPgrInw2Q8ZBvYrH2GAfPBjhwf/nHRaEpG5YC3vZN379YYv/b1h3Aj45QP2pGy8X3RJwEeXiRhPWzQMNPpcWeBFyQgkGoFPfcBwySKJ9pSLMFzSGZg4Wlbqt/cG95xjTeSukFak0rJQLVsKXSoMP/mNf6ZOr+4wewq8711SRJlKn9lcPtzg2yPbpSQEMrAfLP+4YfxImUhBrFrFQGUFfPoDhm/eGFwka98BSzRiOhRgcE2vCxdIWPrPq7x/3hjo2Q1GDJaar25dJdzuRha7dzUMHSClNX2b80htLYARI3mosCh6gUwZC9d9wtDbI3ZfLjgOzJwIn3q/4ZZ7gsmFrN/q33u5icX1WyVxeirdKmHBDFg40zBmuOSmzpSHcnGc9he/jAP7D3Zs3LlQ1AIZOgC+do2hW2X57hqnkkxJKfrgasMvf2/Zvtvf9/c7jNy3F1y8UHImLok4nD8f/uYCw6Bq+V7GafFlOiL8I0cJNctftOdBRg2Bb/2DobKi84jDJZmCWZPhe182zJjg//sfOy5+nB+kM3De/Jb/HzoA/u0LhmubAynueZNMRnaIjojDGNk99h7o+LizpSgFMrAffP1aQ3UfWXk6I8mUrMT/eq3hM1eaNkpe8mPjG/4dyHIciWwNqpYqhu9/xTBxtCxqfi9ssShsetPf92z3meE+rn369IRvfM7Qt2f5+xztkXFkpb9sCYwaavjR7dYX+3v9Vsu8af4pLuPAP3/SMLBK8ixBfW7GwIsbw80CF9UOEovCVz9tGFwdTtKsFHCaCyAnj4HvftkwbVzH33Pt5o6/R2syGTGJKxLB7fjuDrp+SzDv3xZFJZBPvs8wcVTn8zmyIZkSU+brnzVcuKCtKuPsOHQE9p0h6tQRUulgzeF4TM7HhE3RCOTd58Il56hZ5UUqLRPlc39r+NtL81dIwzHY9nbHRBY2R47CC2vCf25RCKRbJVx1ucm6Rqgz44ZLP/xu+MyVhngeXqTjwO2/tyUjEGPgrd1Qdzj8ZxeFQL7zfwxdu2RXZaq0+CWXLYHlV+c3y/fUysnFRIiFf/kSi8L/3GsLci6l4AI5f74cWVW/I3dSaclUf/sLhq6Vub/+joct9Q3FbWol4vD4ynCTg60pqED694Wr32tUHHni1kTNmADXXW3o0S231x9ugB//2hIpUoEYIyblb/5QOOO7oAK58mJDrx6FHEF54Gbe/+VTufskL22EPz5bnKZWNAK/fdiGWr17KgUTyIAquHiRRq38IpmSJhVf/6z4c7lwyz2W1euKRyTGyFj+9ALc9afCnhAtiECMgS98xGgy0GdSaakG/uJHTc6lJP+xwvLShuIQSSwKT66Gm+8qfFyzIAIZOkAcc41a+U8yBQtnyqm/XCZ743H491+0iKQQjnssKnmeB/8CN/7OFkUdXkEEsnRu7g6lkj3JFCyZA//4sdxmeTIlInnoKbH/vc5u+E0iDg2NIoxf3GeLxvQ2yz7vhLqPVSTg7h+ZDp8LULwxRlbjlWvgh7fnPuHOnw9X/42he2Ww9VWxqPy5ZhPcdLdl975gnpUvoe8gS+fKnyqOYHFDwGfPgC9flbvj/uRquO6Hlvqj/o8tEpEdIx6TDPl/rrB842fFJw4oQLn70rkdOw+t5EYqDYvOgoqE4fqbcrPr99TCH562XHW56bDJE422nEFJpmDjdnhyleXZlwvXkC4bQhXIsIEwfFDnPQRVKJIpmDMF/u1Lhu/fajlUn/1rRw9tvxPjmYi36pTv9jHeUyum1KubLK9ty/09C0GoApk3Tfrn5hK9cn/Jp0ZVWl88o7RPMgVTxsAP/tHwvVttVmfTKxIwdVzuZUDxGGzdKeff99dZdu6Bmlo5Kltqn1doAjEGxgzLLqrSevWBlvYwjiPfN0a269bnqq2Vn7FWw8dtkUxBdV9phPFfv7btXrc2akh+kaya/fCdmy0Hc9ipipVQd5ChA7K4WSkuh3m27JC7OHbtlV90Y5N8wJGICKhbpVz4Ut3XUN1Xrjar6gPdK1s+VLeBtdJCKi3XH/zrtYaHn4E7H7UcacMRHzW0uVVpjqv+4QZpDFEOhOuDDPLuiJ6IS5Lod4/YHBok23de27snjBsuF2ROGAmjh0nDMmNKu7G132QysgMvWyq3Td33hOWJlScvJsbAhQvMO7+7XOjavEid8HXUhSE0gQzqJx9KWwKJRsVO/Z9785vByRTsr5Ov51+V96jqLTfKzplimDxWrkYACRJ09khaxpGvAVXwuQ8bLpgPf3xWrhVoSkqlw9jh+dXK9e5OXge5ipHQ/hlL53n7H0G0/687LMc0X1hj6VoJ08bBObMMU8eKeErBBGsdHnXxczd0e+2OHwkTRhnee4G01pkwqgO+XJGWz+dDaAJZMKP98G6Qq07jcbkYc/U6S1VvWLZULtwZ0v/k7uXFRDwGB+vhrV2wa5+Iom8vCZWPGirC8aMiofW/f+Rgcc47sngcbSyfHTo0gQzu7/1Ls5acs735UndYWvff85jULF28yDBisPxdsQglEZf2PDfcdno2OxaFMcPh8maRJ+L+HRvw499fe6i4k3+5EIpAIhHadfasFSc7TI42wsPPwOMrLUvmwOXnSdt9x+fr1fLh7b3wo1+dudQjnYHNb8EN2y1TxkrzhhGDi+dszb664lloOkootVg9u7VvBlgLVb3CGM3pJFNy7vmffiiVpEeOyqrsV//afNj0Fu1mvK2FDVtl3M+/enr+qFDUHiyfUGEoU6BbFg0FHAs9uwc/Fi+aTkiYefkPLA8/01IRWwjmTJbKg2xoOgHf+4Xl7scKLxJjwm0uHTShfPyxLJ7i7jAVCThRYPu19hDcdJflr+ulqcTIIWLWhJmh79kDvvopw9rNcPyEJN7WbbG8vLHtJNyvH5Ir0T787sIVhLod2MuFcASSQ7nC9PHw4obgxpILr74Om9+ycl/e4uYuGyFNvExGnjdrcsv3Llpo2FEjuaK2+uve9ajkIS5bUhifxAB79of/3KAIxcTK9nx0JiOZ3WKisUmaGnz3lhbfJCzc+95dUSZTEuJdfrWhqveZX2OtHDz66/rCnC93rJwMLBcK3jiuNRlHylGKDWth1Tr4yvctr78ZzsRzo37f/rll+Q2WJ1eLf5FKy2WX73uX90LykzukYjdMfyQek123nAhFILmc/+jWhby6BIbBgcPwrRstjzwXfJQrHoOnX4KXX5NG0z+/y7Kn2flNZ+BdZ3u/vr4B/vtOG6rTbgzc81j5RLAgJIHkEhPvWgk9ugY3lo7S2AT//TvLrx6UiRCkSI61NlVa5WaMgUNZNFN7Y6eYh2FF4qyVKuxyIhSBNOVQ1tmjq5gQxc69j8NP77Ck08F0/0hn5Pz+6KFyvdl7lko1AohP9/SL2b3PH5+Rm22DzukYAzv3lF+1dChry/EcBFLZRSZCsa9E1kpjg+NNlq983BCJ+BsGdhzo3hV+sFxCtl1Oucx0687sZmLGgZvvtnznS4aKhH/jOxVjpF6s3AhlB2k4lr0dnHHgvRcUVyTLi5Vr5fSc4/i/Sru+WywmEazWq3M6B7N1Rw088KQNNLhggO27g7nbvZCEFsXKdnXNZMSsCHK185tXXpeiQoP/ImnrCPH4Ebm9z32PS0VzUKZWOgO7yyj/4RKaQHbuyc1Wnzc1uLEEwap1cMu9NpRuhOkMfOCi3HbZjAM/+21wy/uJpJpYHWLVWpv16mUtLJpVOmaWyxMrCaVLuuOIT5JtrZbL628Fd41ZxpEK5HIjNIE8/2r2P5tKw6TRhS9ezJVkCq6/2bLpreBFkkrDx64w9O+b/WsOHCKQTomJOPx1feGPCARBaAKpqc0tBNi9K5w/L7jxBMkNt1l27Qs2QWetdIn5f58xDKrO7jVdElARkHB/fmeZeefNhFpqUrM/+0ljDEyfYIrifEOu7D8I//Er+05j5qBIpWHEYLhhueGCs713rf5V8OkrsxdTtkSj0iCuXLtlhnraYfd+GNAvu53EceQymIiBTAkuTlt3wA9us1z3iWA72afSclT5ix8xXLQQnnnJsnOvZOG7VMguM3WcYcYE6NPTnzPsrYlGYOXaEvyAsiQ0gVgrkazZk9v/WZdYFGZPEfu2FHnuFbkW7ZJzgu2ekmnuPDlxFEwaLTd3JVPy+3N3FffqaL+pPwqr1vr/vsVCqCbWlu02p7osa+H9F5agjdWKW++3bNwWvNPudiZxRVARl9U9mZKvIAQajcCL68szvOsSqkBe2ghHjmX/86m0rIrTxgc3pqBJpuBHt8vCENYZd8dpaQwXJNEoPPpc+ZpXELJA0hmxzXNJpqXS8MGLc7/euJioOwzX31ReZRjxmHyWxV4z11FCPzC1MoeEocuEUeJgljJrN0sSsZSF3ppUGr5/axkpvg1CF0g+Dl1FHJZ/vLR9kYwjE6quvvRFEo1I/dmBw4UeSfCELpBkCp56MbdJkkrDxNEnNzAoVX7yG1uSuR2XSESOL9x8ty3LzPmpFORM+h+eyi2aBbzTzqZLCVX5nom1m3nnmuVSJBaF239vOXCo0CMJh4J8THvrct+ebXOc/9LFgQwpNBwH7nrUciJZeiKJRCQS+afnCz2S8CjIR3TkKLzyWu62eDpTHrtI/VH4xo2WaAil8X6STMFt95e/Y96agq1hN99t37lzMFscRw5SXf8lU9C+uX6w+S3pB1wqDnsiDisetGVZ0u5FQafZI8/lPkFSaTlxePGi4mjU3BFWPGip2V/YJtnZ4JazP/xMoUcSPgX9aB56yuZVH+RYuOZKw7jh/o8pTA43SFueME4h5osxcp3Bzfd0LtPKpaAC2VML9/85953AWqnyXX61oUtFMGMLi1deh/ueKF5TKx4Tc3h/XaFHUhgKvrn/6fn8VtBUWu78/udPmoL0oPWTex6z7KgpvqhWIi7iLZZm4oUgOmHeN75ZyAE0Nkl0atZkk3NxnXuqLhE3rNkUzPhAdrhp4+CScwxjhsn/H6z371xFMgUb3oALFxpi0eJovhaNyBn2n97RORKCbVFwgQC8tg0WnWXo1T33yWEtTBkrd2Zs3h7I8KjuAz/+qmHyGJg50XDePMP0iVJAWVPrz3VjR45KUePCmbkvFH4Ti0oo+ls3WhpyqL4uR4pCICAfyPzp+YWlMo5M3PoGafTsN2OGwQVnG5KplhLygf3kqoY5U+TE4A4f2m7u2CO74ZSx4V7W0xpjZPe4/ibL9t2FGUMxUTQCeXsv9OtjmDAqv3MMkQjMm2rYV4fvH2yXCrh08ckru3veom8vEfasyYY9tR27Xcm9c3DaODk7XoidJBqRqxNWrQv/2cVIUbmFt94nNT75OO1O87HTL37E8K4F/uZIvCZ9Ki0+1PgR8LVrDB96d8ciUukMfO2/JCEXdvg3EYc/Pgt/XhXuc4uZotlBQCbHhjfgvPn5dTOxVoSxYIaYPa9t82dcGQeGDpQrotsyozKOCGPGBMPUcYa39+bfpM1a2PiGmHBdK8Nx2hNxePZl2T2UFopKIACHjsg2P3Nifs6qtWCR1/fqYVi/xR9TxVoxpbyEa608a2AVLJlrMMiJu3z8ifoG2PSmRM4swYokEZfDXP+5wgbaXKIUKTqBgOwiwwcZRg3Jb3K7DZ8njYYJo1puiu0IdYfh0nOzO/rrOGIezZxomDTasO1tmfA5P7PebX8UXGQrGhWf7fqbbId/R+VIUQoEYN1mmDjaUN0n/9Uz48CQ/jB3mqFmf8fu706nYfc+OG9edpPV3U0G94dzZxsOH8kv0vXaNnnNzIkGJ6Bd5Lu3WPZ10kx5exStQJIpOVx08SJZtTsikt494JxZhmjEsGV7/ibX7v0wZphh2MAcrnNorkCeP90wsMqwbkvueZMNb0j4d+o4/yNb0QjMn2ZIpiVp29nzHqdStAIB+cD2H5TJ3ZHV03FkIkwbD9PHG3btI+8TcQcOw7mzcgsiuOIeO1zaqb65SzLxubBhK8SikiPB+OeTWCudGedOlQTo5DGGirj4grlcnVeuFLVAQG5Hqj0kH2Akkv/EcP2Sgf1gyRzDkWOwa2/uDdXSjmT9u3bJfQwZR7Lyi2cbGhpzS2paKzuq65P4aW45zeZgIi6lO/OnGxbPNgyuNhw97m9ZTalR9AIBeHMXNByFedMkMtSRDyvTvJvMn26YOVF2goZjUqqSDfOnNUeo8syzOM3h4PnTDb17GDZvz60l6MZtMmFnTTZEO7BgnAnXb3Ks3BU5fiScP98wcaQIct+BYFuoFiMlIRCQK43rG2DmpI7tJNAyEar7iOgWzzFMGCVVwceaziyWXt1h2VK5kyPRAZ/Ifb5jpd/XtHGGNZuzFyjIzrNrn+yqFYlgylLc3xFIoGPRWYazJkkx5f46uVGqM2CWfT6o2EgwnD0drvukIWL8W82i0ZZS80P1sL1GHPKD9ZaKhDjl40dAVe/mFdbHCRmPSR3aigctT67OzQmfOAq+8BEZXxCNqU/FPVawpxbufNTyl7+Wv+lVcgIByW9c9wlD317+VNK2prVYWuM4wZkX7jNffg3uf8Kyfmv2E69PT/iHvzPMner/1QZtEY+JX/jlf7c0NAb/vEJSMiZWaw4ckq7i40cYBlThq8PqmhanfgW5jLgm19ABsHiOYdo4CW0fb4Kj7ZheTSfkmoXGJpg8OpxmFm4i9JHnyj/SVaQHPdunpha+eaPlMx80LJ59ss1cilgrZlIkAtObw9GNx8XfqKmV8+tHGy3HGsVPSjVfaWCtmD4nTohfMma4HEc2zSZoUGXzyXRp/76zpWQFAuLY/niF5Y2dcNXlsur6bXKFjeNAsrkdUkVCcjct1z9I6Mzalpoz97vu/SDRiFxUlM64py1bRad8mNDxmIzt2ZdzCyyUKiUtEJAP/sG/wPbdlk9/wDBicLArZ1hYK1fPtV6lvULLESPnVtZulvtIjhyDcSNgyWw5YzO4GrpWnv4M9+skmp9zqi9mrXQ4eepFuPMR2yl2kJJ00tuiR1e46gq50NLPKFexE43Kv/cPT8uZmlMnbjwGA6qkLmzkYBhUbajqLTcJ9+gmt9/GWi2V6TScSMHRRgmt19XDzhq53nrnXmjsBDuHS1kJBGSVnTUJPrpMGixknPK8vxvEX4lFpfzl53daXtyQWxQrEYfKCojHT94tMo6YaydOQFMnyXe0RcmbWKdirYRLN26zXHE+vGexoVcPEUk5mQTxmES+Vq4VcRw6kvt7uPcXKm1TdjvIqfSvgisvMpw7S2zwUheKmzPZXwe3PWB5YU35J+sKSdkLxGXYQLj8PMM5s6BbZemZXrGomFT1R+HR5+CBP9tOEUUqNJ1GICD+ycB+UoB36WJx6v0MgQaBG1atOwxPvwSPv2DZvb/Qo+o8dCqBtKZ/X5g/XU77jR56cr7gjKHPEDBGolGt7w3Z9CasWmd55uX8z7Ao+dNpBeISjcCIwTBvmmSvRw+VUm835+C2E/J7h4lEWgThPivjSMnIzhpp9rB2k2Xdls4Tri5GOr1AWhOJQL8+MHUsjB0u1ysM6Ccn7s7UILv1TtNGrg1jzpzgS6Wl1urQEakertlv2bJdzq0frC9ek6+zoQLxIBqB7t2kZGNwNVT3leLIvr3kqyIu5pDrQLuFgo7TEgRIpaUk48hRyVfUHrQcOCyHj2pq5bCWhlqLl7LLg/hJxpFMcn2DNHJrvU9EI5BIiEgScRFJvHmXSaZEHMmUtBtKpXVHKFVUIHmSccREOt5U6JEoQVJUvXkVpdhQgSiKByoQRfFABaIoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8UIEoigcqEEXxQAWiKB6oQBTFAxWIonigAlEUD1QgiuKBCkRRPFCBKIoHKhBF8UAFoigeqEAUxQMViKJ4oAJRFA9UIIrigQpEUTxQgSiKB7FYtP0fUpRyIpfrJGJ694SitI2aWIrigQpEUTxQgSiKByoQRfFABaIoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8+F/HlmZaTNWRSgAAAABJRU5ErkJggg==",cl="data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Crect width='200' height='200' fill='%23FF6A00'/%3E%3Ctext x='100' y='122' font-family='Arial,Helvetica,sans-serif' font-size='76' font-weight='700' fill='%23FFFFFF' text-anchor='middle'%3EAli%3C/text%3E%3C/svg%3E",ll={openai:ol,anthropic:al,kimi:sl,bailian:cl,deepseek:il},dl={kimi:"#000000"};function ua(e){return ll[e]}function Gt(e){return dl[e]}const ue=[{id:"openai",name:"OpenAI",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"OpenAI 模型与编码能力",homeUrl:"https://openai.com",apiKeyUrl:"https://platform.openai.com/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.openai.com/v1"},{id:"anthropic",name:"Anthropic",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"Claude 模型与编码能力",homeUrl:"https://www.anthropic.com",apiKeyUrl:"https://console.anthropic.com/settings/keys",apiKeyPlaceholder:"sk-ant-...",defaultBaseUrl:"https://api.anthropic.com"},{id:"kimi",name:"Kimi",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"Moonshot AI 模型服务",homeUrl:"https://www.moonshot.cn",apiKeyUrl:"https://platform.moonshot.cn/console/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.moonshot.cn/v1"},{id:"bailian",name:"百炼",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"阿里云百炼模型服务",homeUrl:"https://www.aliyun.com/product/bailian",apiKeyUrl:"https://bailian.console.aliyun.com/#/api-key",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1"},{id:"deepseek",name:"DeepSeek",browserMode:"connectUnsupported",browserLabel:"不支持登录",description:"DeepSeek 模型服务",homeUrl:"https://www.deepseek.com",apiKeyUrl:"https://platform.deepseek.com/api_keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.deepseek.com/v1"},{id:"zhipu",name:"智谱 AI",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"智谱 AI / GLM 模型服务",homeUrl:"https://open.bigmodel.cn",apiKeyUrl:"https://open.bigmodel.cn/usercenter/apikeys",apiKeyPlaceholder:"id.secret-...",defaultBaseUrl:"https://open.bigmodel.cn/api/paas/v4"},{id:"ollama",name:"Ollama",browserMode:"connectUnsupported",browserLabel:"本地服务",description:"本地 Ollama 模型服务",homeUrl:"https://ollama.com",defaultBaseUrl:"http://localhost:11434/v1"},{id:"custom",name:"Custom",browserMode:"browserAssistedApiKey",browserLabel:"配置",description:"OpenAI / Anthropic 兼容的自定义模型服务",homeUrl:"https://undefineds.co",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://example.com/v1"}],nr=[{id:"keys",label:"API Keys",title:"API KEYS"}];if(ue.map(e=>e.id).join(",")!==no.join(","))throw new Error("AI Connection provider UI is out of sync with the client catalog");function ul(e){const t=e.solid.session.getSnapshot(),n=e.solid.pod,r=n?.status==="ready"?n:void 0,s=t.status==="authenticated"&&r!==void 0?fl(Wa({webId:t.webId,podBaseUrl:r.current.podUrl,authenticatedFetch:e.solid.session.fetch}),e.capabilities.aiConnectionsPodStore):null;let i="keys",l="openai",d,f="",u={},m={},g,y=0,R;const h=new Set,I=()=>h.forEach(w=>w()),j={client:s,openExternal:e.navigation.openExternal,clientConfigurationBridge:e.capabilities.aiClientConfiguration,get selectedSection(){return i},get selectedProvider(){return l},get selectedCredentialId(){return d},get searchQuery(){return f},get providerStates(){return u},get providerSummaries(){return m},get providerLoadError(){return g},selectSection(w){i!==w&&(i=w,I())},selectProvider(w,D){const E=w==="custom"?D:void 0;i==="provider"&&l===w&&d===E||(i="provider",l=w,d=E,I())},selectFirstUnconfiguredProvider(){const w=ue.findIndex(Q=>Q.id===l),E=(w<0?ue:[...ue.slice(w+1),...ue.slice(0,w+1)]).find(Q=>u[Q.id]==="unconfigured"&&Q.id!==l)??ue.find(Q=>u[Q.id]==="unconfigured")??ue[0];E&&j.selectProvider(E.id)},setSearchQuery(w){f!==w&&(f=w,I())},setProviderState(w,D){if(u[w]===D)return;y+=1,u={...u,[w]:D};const E=yl(w,D);E&&(m={...m,[w]:E}),I()},async loadProviders(){if(s)return R||(R=(async()=>{const w=y+1;y=w,g=void 0,I();try{const D=await s.listProviders();if(w!==y)return;m=Object.fromEntries(D.map(E=>[E.id,E])),u=Object.fromEntries(ue.map(E=>[E.id,hl(m[E.id])])),I()}catch(D){if(w!==y)return;g=xl(D),I()}finally{R=void 0}})(),R)},subscribe(w){return h.add(w),()=>h.delete(w)}};return j}function fl(e,t){return t?{...e,listProviders:async()=>t.listProviders(),listModels:t.listModels?async()=>t.listModels():e.listModels,createApiKeyCredential:t.createApiKeyCredential?async(n,r)=>t.createApiKeyCredential(n,r):e.createApiKeyCredential,createLocalCredential:t.createLocalCredential?async(n,r)=>r.offeringId==="official-subscription"?e.createLocalCredential(n,r):t.createLocalCredential(n,r):e.createLocalCredential,updateProviderCredential:t.updateProviderCredential?async(n,r,a)=>t.updateProviderCredential(n,r,a):e.updateProviderCredential,deleteProviderCredential:t.deleteProviderCredential?async(n,r)=>t.deleteProviderCredential(n,r):e.deleteProviderCredential,pollDevice:t.saveOAuthCredential?async(n,r)=>{const a=await e.pollDevice(n,r);if(a.status!=="completed"||!a.oauthCredential)return a;const s=await t.saveOAuthCredential(n,a.oauthCredential),{oauthCredential:i,...l}=a;return{...l,credentialId:s?.id??a.credentialId}}:e.pollDevice,refreshOAuthCredential:t.readCredentialSecret&&t.updateOAuthCredential?async(n,r,a,s)=>{const l=(await t.listProviders()).find(y=>y.id===n)?.credentials.find(y=>y.id===r);if(!l)throw new Error("oauth_credential_not_found");const d=await t.readCredentialSecret(n,r),f=typeof d.refreshToken=="string"?d.refreshToken:void 0;if(!f)throw new Error("oauth_refresh_token_required");const u=await e.refreshOAuthCredential(n,r,f,l.version);if(u.status!=="completed"||!u.oauthCredential)return u;await t.updateOAuthCredential(n,r,l.version,u.oauthCredential);const{oauthCredential:m,...g}=u;return g}:e.refreshOAuthCredential,quota:t.readCredentialSecret?async(n,r=!1,a)=>{const i=(await t.listProviders()).find(m=>m.id===n)?.credentials??[],l=a?.credentialId??a?.credentialIri,d=l?i.find(m=>m.id===l):i.find(m=>m.enabled&&(!a?.offeringId||m.offeringId===a.offeringId));if(!d)throw new Error("quota_credential_not_found");const f=await t.readCredentialSecret(n,d.id),u=hn(f,d.authMode);if(!u)throw new Error("credential_secret_unavailable");return e.quotaFromSecret(n,{credentialId:d.id,credentialIri:d.id,authMode:d.authMode==="deviceCode"||d.authMode==="oauth"?"deviceCodeOAuth":"apiKey",offeringId:d.offeringId,baseUrl:d.baseUrl,proxyUrl:d.proxyUrl,compatibility:d.compatibility,secret:u})}:e.quota,disconnect:async(n,r)=>!r||!t.deleteProviderCredential?e.disconnect(n,r):await t.deleteProviderCredential(n,r),testProviderCredential:t.readCredentialSecret?async(n,r)=>{const s=(await t.listProviders()).find(u=>u.id===n)?.credentials.find(u=>u.id===r.credentialId);if(!s)throw new Error("test_credential_not_found");const i=await t.readCredentialSecret(n,s.id),l=hn(i,s.authMode);if(!l)throw new Error("test_secret_missing");let d;try{d=await e.discoverModels(n,{credentialId:s.id,offeringId:s.offeringId,authMode:s.authMode==="deviceCode"||s.authMode==="oauth"?"deviceCodeOAuth":s.authMode==="local"?"local":"apiKey",secret:l,baseUrl:s.baseUrl,proxyUrl:s.proxyUrl,compatibility:s.compatibility})}catch(u){throw await t.markCredentialHealth?.(n,s.id,"invalid",s.version).catch(()=>{}),u}const f=await t.markCredentialHealth?.(n,s.id,"healthy",s.version);return{ok:!0,credentialId:s.id,...f?{credential:f}:{},modelCount:d.models.length,observedAt:d.observedAt}}:e.testProviderCredential,discoverModels:t.readCredentialSecret?async(n,r)=>{const i=(await t.listProviders()).find(u=>u.id===n)?.credentials.filter(u=>u.enabled&&(!r?.offeringId||u.offeringId===r.offeringId)&&(!r?.credentialId||u.id===r.credentialId))??[];if(i.length===0)throw new Error("models_credential_not_found");const l=await Promise.allSettled(i.map(async u=>{const m=await t.readCredentialSecret(n,u.id),g=hn(m,u.authMode);if(!g)throw new Error("models_secret_missing");const y=await e.discoverModels(n,{credentialId:u.id,offeringId:u.offeringId,authMode:u.authMode==="deviceCode"||u.authMode==="oauth"?"deviceCodeOAuth":u.authMode==="local"?"local":"apiKey",secret:g,baseUrl:u.baseUrl,proxyUrl:u.proxyUrl,compatibility:r?.compatibility??u.compatibility});return{...y,models:y.models.map(R=>({...R,offeringId:u.offeringId,...n==="custom"?{credentialId:u.id}:{}}))}})),d=l.flatMap(u=>u.status==="fulfilled"?[u.value]:[]);if(d.length===0)throw l[0].reason;t.saveDiscoveredModels&&await Promise.all(d.map(u=>t.saveDiscoveredModels(n,u.credential,u.models)));const f=[...new Map(d.flatMap(u=>u.models).map(u=>[`${("offeringId"in u?u.offeringId:void 0)??""}\0${("resourceId"in u?u.resourceId:void 0)??u.id}`,u])).values()];return{...d[0],models:f}}:e.discoverModels,saveModelSelection:t.saveModelSelection?async(n,r,a)=>t.saveModelSelection(n,r,a):e.saveModelSelection}:e}function rr(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedSection??"provider",()=>e.selectedSection??"provider")}function or(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedProvider,()=>e.selectedProvider)}function fa(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedCredentialId,()=>e.selectedCredentialId)}function pa(e){return p.useSyncExternalStore(e.subscribe,()=>e.searchQuery,()=>e.searchQuery)}function pl(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerStates,()=>e.providerStates)}function ml(e){return p.useSyncExternalStore(e.subscribe,()=>br(e.providerSummaries),()=>br(e.providerSummaries))}function ar(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerSummaries,()=>e.providerSummaries)}function ma(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerLoadError,()=>e.providerLoadError)}function hl(e){if(!e||e.status==="unconfigured"||e.status==="unavailable")return"unconfigured";if(e.status==="configured")return"configured";if(e.status==="attention")return"attention";const t=ha(e);return t?.authMode==="oauth"||t?.authMode==="deviceCode"?"connected":"configured"}const xr=new WeakMap;function br(e){const t=xr.get(e);if(t)return t;const n=Object.fromEntries(Object.values(e).filter(ga).map(r=>[r.id,gl(r)]));return xr.set(e,n),n}function gl(e){const t=ha(e),n=e.status==="available"?"connected":e.status==="attention"?"reauthRequired":"disconnected",r=t?.authMode;return{provider:e.id,status:n,authMode:r==="oauth"||r==="deviceCode"?"deviceCodeOAuth":r?"browserAssistedApiKey":void 0,accountLabel:t?.label,expiresAt:t?.expiresAt,reauthRequired:n==="reauthRequired"?!0:void 0,credentialIri:t?.id,version:t?.version,connect:{modes:Al(e),configured:e.status!=="unavailable"}}}function Al(e){const t=[...e.offerings.flatMap(n=>n.authModes??[]),...e.credentials.map(n=>n.authMode)].map(n=>n==="oauth"||n==="deviceCode"?"deviceCodeOAuth":n==="apiKey"||n==="local"?"browserAssistedApiKey":void 0).filter(ga);return t.length>0?[...new Set(t)]:["browserAssistedApiKey"]}function ha(e){return e.credentials.find(t=>t.enabled)??e.credentials[0]}function yl(e,t){if(t==="configured")return{id:e,name:mn(e),offerings:[],credentials:[wr(e,"apiKey")],selectedModels:[],status:"available"};if(t==="connected")return{id:e,name:mn(e),offerings:[],credentials:[wr(e,"deviceCode")],selectedModels:[],status:"available"};if(t!=="attention"&&t!=="loading")return{id:e,name:mn(e),offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function wr(e,t){return{id:`${e}:current`,offeringId:t==="deviceCode"||t==="oauth"?"official-subscription":"api-platform",authMode:t,enabled:!0,priority:0,health:"healthy",version:0}}function mn(e){return ue.find(t=>t.id===e)?.name??e}function hn(e,t){if(t==="deviceCode"||t==="oauth"){const r=typeof e.accessToken=="string"&&e.accessToken.trim()?e.accessToken:void 0;return r?{type:"oauth",accessToken:r}:void 0}if(t==="local")return{type:"local"};const n=typeof e.apiKey=="string"&&e.apiKey.trim()?e.apiKey:void 0;return n?{type:"apiKey",apiKey:n}:void 0}function ga(e){return e!==void 0}function xl(e){return ro(e)}function bl({controller:e}){const t=p.useContext(_a),n=rr(e),r=or(e),a=fa(e),s=pa(e).trim().toLocaleLowerCase(),i=pl(e),l=ar(e),d=ma(e),f=ue.reduce((h,I)=>{if(I.id!=="custom")return[...h,{...I}];const j=l.custom?.credentials??[];return[...h,...j.length>0?j.map(w=>({...I,name:w.label||I.name,credentialId:w.id})):[{...I}]]},[]),u=s?f.filter(h=>gn(h,l).toLocaleLowerCase().includes(s)):f,m=[...nr.map(h=>({kind:"section",id:h.id,label:h.label})),...u.map(h=>({kind:"provider",provider:h}))],g=p.useRef([]),y=m.findIndex(h=>h.kind==="section"?n===h.id:n==="provider"&&h.provider.id===r&&h.provider.credentialId===a),R=h=>{h.kind==="section"?e.selectSection(h.id):e.selectProvider(h.provider.id,h.provider.credentialId),t?.mode==="stack"&&t.openMain()};return o.jsxs("div",{role:"listbox","aria-label":"AI 服务","aria-orientation":"vertical",className:"py-2",children:[o.jsx("section",{className:"mb-3","aria-label":"API Keys",children:m.filter(h=>h.kind==="section").map(h=>{const I=m.indexOf(h);return o.jsxs(vr,{index:I,selected:n===h.id,tabbable:y===I||y<0&&I===0,label:h.label,optionRefs:g,onActivate:()=>R(h),onMove:j=>Cr(m,j,e,g),children:[o.jsx(wl,{section:h.id}),o.jsx("span",{className:_("min-w-0 flex-1 truncate text-sm font-medium",n===h.id?"text-foreground":"text-foreground/80"),children:h.label})]},h.id)})}),o.jsxs("section",{children:[o.jsx("h2",{className:"px-5 py-1 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:"Provider"}),u.map(h=>{const I=m.findIndex(D=>D.kind==="provider"&&D.provider.id===h.id&&D.provider.credentialId===h.credentialId),j=n==="provider"&&r===h.id&&h.credentialId===a,w=i[h.id]??"loading";return o.jsxs(vr,{index:I,selected:j,tabbable:j||y<0&&I===0,label:gn(h,l),describedBy:`ai-connections-provider-${h.id}-${h.credentialId??"default"}-status`,optionRefs:g,onActivate:()=>R({kind:"provider",provider:h}),onMove:D=>Cr(m,D,e,g),children:[o.jsxs($r,{className:"h-9 w-9 shrink-0 rounded-md border border-border/20",style:Gt(h.id)?{backgroundColor:Gt(h.id)}:void 0,children:[o.jsx(eo,{src:ua(h.id),className:"object-cover"}),o.jsx(to,{className:"rounded-md bg-muted text-[10px] font-bold uppercase text-muted-foreground",children:Cl(h.id)})]}),o.jsx("span",{className:_("min-w-0 flex-1 truncate text-sm font-medium",j?"text-foreground":"text-foreground/80"),children:gn(h,l)}),o.jsx(vl,{state:w,statusId:`ai-connections-provider-${h.id}-${h.credentialId??"default"}-status`})]},`${h.id}:${h.credentialId??"default"}`)}),u.length===0?o.jsx("p",{className:"p-8 text-center text-xs text-muted-foreground",children:"无结果"}):null]}),d?o.jsxs("p",{className:"px-4 py-2 text-xs text-destructive",children:["Provider 状态读取失败:",d]}):null]})}function vr({index:e,selected:t,tabbable:n,label:r,describedBy:a,statusId:s,optionRefs:i,onActivate:l,onMove:d,children:f}){const u=m=>{if(m.key==="ArrowDown")d(e+1);else if(m.key==="ArrowUp")d(e-1);else if(m.key==="Home")d(0);else if(m.key==="End")d(Number.POSITIVE_INFINITY);else if(m.key==="Enter"||m.key===" "){m.preventDefault(),l();return}else return;m.preventDefault()};return o.jsx("button",{ref:m=>{i.current[e]=m},type:"button",role:"option","aria-selected":t,"aria-label":r,"aria-describedby":a??s,tabIndex:n?0:-1,onClick:l,onKeyDown:u,className:_("group flex w-full items-center gap-3 border-l-[3px] border-transparent px-4 py-3 text-left transition-colors",t?"border-l-primary bg-accent/80":"hover:bg-muted/40"),children:f})}function Cr(e,t,n,r){const a=Math.min(Math.max(t,0),e.length-1),s=e[a];s&&(s.kind==="section"?n.selectSection(s.id):n.selectProvider(s.provider.id,s.provider.credentialId),r.current[a]?.focus())}function wl({section:e}){return o.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border/20 bg-muted text-muted-foreground",children:o.jsx(zt,{className:"h-4 w-4","aria-hidden":"true"})})}function vl({state:e,statusId:t}){const n=e==="configured"||e==="connected";return o.jsxs("span",{id:t,role:"status","aria-live":"polite",className:"flex shrink-0 items-center gap-1.5",children:[n?o.jsx("span",{className:"h-2 w-2 rounded-full bg-primary","aria-hidden":"true"}):null,o.jsx("span",{className:"text-[11px] font-normal text-muted-foreground",children:El(e)})]})}function Cl(e){switch(e){case"openai":return"OA";case"anthropic":return"A";case"kimi":return"K";case"bailian":return"百";case"deepseek":return"DS";case"zhipu":return"智";case"ollama":return"O";case"custom":return"C"}}function gn(e,t){return e.name||t[e.id]?.name||e.id}function El(e){switch(e){case"unconfigured":return"未设置";case"configured":return"已配置";case"connected":return"已连接";case"attention":return"需处理";default:return"读取中"}}const Il={"official-subscription":"账号订阅","subscription-key":"Token 套餐","api-platform":"API 平台","pay-as-you-go":"按量付费","token-plan":"Token 套餐","token-plan-team":"Token 套餐(团队版)","coding-plan":"Coding 套餐",local:"本地服务","openai-compatible":"OpenAI 兼容","anthropic-compatible":"Anthropic 兼容"},kl=/[一-鿿]/u;function Xt(e){const t=e.label?.trim();return t&&kl.test(t)?t:Il[e.id]??t??Pl(e)}function Pl(e){return e.kind==="oauth-subscription"?"账号订阅":e.kind==="api-platform"?"API 平台":e.kind==="token-plan"?"Token 套餐":e.label?e.label:e.authModes?.some(t=>t==="oauth"||t==="deviceCode")?"账号登录":e.authModes?.some(t=>t==="apiKey")?"API Key":e.id}function jl({providerName:e,offeringName:t,quota:n,busy:r,disabled:a=!1,credentialLabel:s,error:i,onRefresh:l}){return o.jsxs("div",{className:"space-y-3 border-t border-border/40 pt-3",children:[o.jsxs("div",{className:"flex items-center justify-between gap-2",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx(rl,{className:"h-4 w-4 text-primary"}),o.jsx("div",{className:"text-sm font-medium text-foreground/90",children:"剩余额度"})]}),o.jsxs(T,{variant:"ghost",size:"sm","aria-label":`刷新 ${e} ${t}额度`,disabled:r||a,onClick:l,children:[o.jsx(zc,{className:"mr-2 h-3.5 w-3.5"}),"刷新"]})]}),s?o.jsxs("p",{className:"text-xs text-muted-foreground",children:["凭证:",s]}):null,i?o.jsx("p",{className:"text-sm text-destructive",children:i}):n?n.status==="unsupported"?o.jsxs(o.Fragment,{children:[o.jsx("p",{className:"text-sm",children:"官方额度接口不支持"}),o.jsxs("p",{className:"text-xs text-muted-foreground",children:["来源:",n.source]})]}):n.status==="error"?o.jsx("p",{className:"text-sm text-destructive",children:"额度查询失败"}):o.jsxs("div",{className:"space-y-3 text-sm",children:[typeof n.balance=="number"?o.jsxs("div",{children:["余额:",n.balance]}):null,n.windows.map((d,f)=>o.jsxs("div",{className:"space-y-1.5",children:[o.jsxs("div",{className:"flex items-center justify-between gap-3",children:[o.jsx("span",{className:"font-medium text-foreground",children:Er(d.name)}),o.jsx("span",{className:"text-muted-foreground",children:Ul(d)})]}),mt(d)!==void 0?o.jsx("div",{"aria-label":`${Er(d.name)}剩余 ${String(mt(d))}%`,className:"h-1.5 overflow-hidden rounded-full bg-muted",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":mt(d),children:o.jsx("div",{className:"h-full rounded-full bg-primary",style:{width:`${String(mt(d))}%`}})}):null,d.resetsAt?o.jsxs("p",{className:"text-xs text-muted-foreground",children:["重置:",Ir(d.resetsAt)]}):null]},`${String(d.name)}-${f}`)),o.jsxs("p",{className:"text-xs text-muted-foreground",children:["更新:",Ir(n.observedAt)]}),o.jsxs("p",{className:"text-xs text-muted-foreground",children:["来源:",n.source,n.stale?" · 数据可能已过期":""]})]}):o.jsx("p",{className:"text-xs text-muted-foreground",children:s?"尚未检查":"连接后可查询"})]})}function Er(e){switch(e){case"five-hour":return"5 小时限制";case"weekly":return"周限制";case"monthly":return"月限制";case"weekly-opus":return"Opus 周限制";case"weekly-sonnet":return"Sonnet 周限制";case"available_balance":return"可用余额";case"voucher_balance":return"赠送余额";case"cash_balance":return"现金余额";default:return typeof e=="string"&&e?e:"额度"}}function mt(e){if(!(typeof e.remaining!="number"||typeof e.limit!="number"||e.limit<=0))return Math.max(0,Math.min(100,Math.round(e.remaining/e.limit*1e4)/100))}function Ul(e){const t=mt(e);if(t!==void 0)return`剩余 ${String(t)}%`;if(typeof e.remaining=="number"){const n=typeof e.currency=="string"?` ${e.currency}`:"";return`剩余 ${String(e.remaining)}${n}`}return"官方数据可用"}function Ir(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function Fl({definition:e,product:t,status:n,accountLabel:r,attempt:a,attemptOfferingId:s,apiKey:i,baseUrl:l="",busy:d,disabled:f=!1,error:u,suppressError:m=!1,quotas:g={},onApiKeyChange:y,onBaseUrlChange:R,onBeginApiKey:h,onBeginOffering:I,onBeginBrowser:j,onSaveApiKey:w,onDisconnect:D,onCreateApiKeyCredential:E,onCreateLocalCredential:Q,onUpdateCredential:G,onDeleteCredential:Z,onTestCredential:C,onReorderCredentials:F,onRefreshQuota:M,onDismissError:te}){const V=[{id:"api-platform",label:"API Key",kind:"api-platform",authModes:["apiKey"]}],Ue=t?.credentials??[],Ee=t?.offerings.length?t.offerings:V;return o.jsx(ko,{children:o.jsxs("section",{className:"space-y-4","aria-label":"当前连接",children:[o.jsxs("div",{className:"flex items-center gap-2 border-b border-border/40 pb-2",children:[o.jsx(Yc,{className:"h-4 w-4 text-primary"}),o.jsx("h3",{className:"text-sm font-medium text-foreground/90",children:"当前连接"})]}),o.jsxs("div",{className:"space-y-3",children:[Ee.map(B=>{const ne=ql(B,e),X=s===B.id?a:void 0,re=Ue.filter(K=>K.offeringId===B.id).sort((K,z)=>K.priority-z.priority),me=u?.offeringId===B.id?u.message:void 0,se=re.find(K=>K.enabled)??re[0],be=g[B.id],he=se&&be?.credentialId===se.id?be:void 0,ge=o.jsx(jl,{providerName:e.name,offeringName:Xt(B),quota:he?.quota,busy:he?.busy??!1,disabled:f||!!t&&!se,credentialLabel:se?_e(se):void 0,error:he?.error,onRefresh:()=>M?.(B,se)});if(B.lifecycle==="unavailable")return o.jsx(We,{offering:B,children:o.jsx("p",{className:"text-sm text-muted-foreground",children:B.kind==="oauth-subscription"?"暂不可用:账号订阅需在 Xpod 桌面版中导入本机客户端(如 Codex CLI)的登录态,浏览器中无法完成。":"暂不可用:该 Offering 尚未提供可用的连接流程。"})},B.id);if(me&&X?.status==="unsupported"&&ne==="deviceCodeOAuth")return o.jsxs(We,{offering:B,children:[o.jsxs("div",{className:"rounded-md border border-border/60 bg-muted/30 px-3 py-3",children:[o.jsx("p",{className:"text-sm font-medium text-foreground",children:"当前部署未启用账号授权"}),o.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"仍可使用其他已提供的接入方式。"})]}),ge]},B.id);if(me&&ne==="deviceCodeOAuth")return o.jsxs(We,{offering:B,children:[o.jsx(Ha,{title:"登录未完成",description:me,primaryLabel:"重试登录",onPrimary:()=>I?.(B,ne),secondaryLabel:"关闭",onSecondary:te??(()=>{})}),ge]},B.id);if(Ql(X)&&ne==="deviceCodeOAuth")return o.jsxs(We,{offering:B,children:[o.jsx(Va,{title:"正在连接",detail:X?.userCode?`验证码:${X.userCode}`:"请在打开的页面完成授权。",providerLabel:Xt(B),providerHost:e.name}),ge]},B.id);if(ne==="deviceCodeOAuth")return o.jsxs(We,{offering:B,children:[o.jsx("div",{className:"space-y-2",children:re.map(K=>o.jsx(Rn,{credential:K,label:K.label?Bn(K.label):_e(K),busy:d,disabled:f,onToggle:G,onTest:C,onDelete:()=>D(K),deleteAriaLabel:`${K.label?Bn(K.label):_e(K)} 移除`},K.id))}),o.jsx("div",{className:"flex flex-wrap gap-2",children:o.jsxs(T,{size:"sm",disabled:d||f,onClick:()=>I?.(B,ne),children:[d?o.jsx(ze,{className:"mr-2 h-4 w-4 animate-spin"}):o.jsx(er,{className:"mr-2 h-4 w-4"}),re.length?"添加账号":"登录"]})}),ge]},B.id);if(B.authModes?.includes("local")){const K=e.id==="openai"&&B.id==="official-subscription";return o.jsx(We,{offering:B,children:o.jsxs("div",{className:"space-y-2",children:[re.map(z=>o.jsx(Rn,{credential:z,label:z.label??"本地 Ollama",busy:d,disabled:f,onToggle:G,onTest:C,onDelete:()=>Z?.(z),deleteAriaLabel:`删除 ${z.label??"本地 Ollama"}`},z.id)),re.length===0?o.jsxs("div",{className:"space-y-2",children:[K?o.jsx("p",{className:"text-xs text-muted-foreground",children:"从当前设备已有的 OpenAI 登录导入,不会发起新的浏览器授权。"}):null,o.jsxs(T,{variant:"outline",size:"sm",disabled:d||f||!Q,onClick:()=>{Q?.(B)},children:[d?o.jsx(ze,{className:"mr-2 h-4 w-4 animate-spin"}):o.jsx(sn,{className:"mr-2 h-4 w-4"}),Ol(B)]})]}):null]})},B.id)}return o.jsxs(We,{offering:B,children:[o.jsx(Kl,{definition:e,offering:B,status:n,accountLabel:r,credentials:re,attempt:a,apiKey:i,baseUrl:l,busy:d,disabled:f,error:me,onApiKeyChange:y,onBaseUrlChange:R,onBeginApiKey:h,onBeginBrowser:j,onSaveApiKey:w,onDisconnect:D,onCreateApiKeyCredential:E?K=>E(B,K):void 0,onUpdateCredential:G,onDeleteCredential:Z,onTestCredential:C,onMoveCredential:(K,z)=>F?.(B,re,K,z)}),ge]},B.id)}),u&&!u.offeringId&&!m?o.jsx("p",{className:"rounded-md border border-destructive/30 px-3 py-2 text-sm text-destructive",children:u.message}):null]})]})})}function We({offering:e,children:t}){const n=e.endpoints??[],r=Xt(e),a=e.kind?Dl(e.kind):void 0,s=a&&a!==r?[a]:[];return o.jsxs("section",{className:"space-y-3 rounded-lg border border-border/50 bg-card p-3","aria-labelledby":`offering-${e.id}`,children:[o.jsxs("div",{className:"flex items-start justify-between gap-3",children:[o.jsxs("div",{children:[o.jsx("h4",{id:`offering-${e.id}`,className:"text-sm font-medium text-foreground",children:r}),s.length?o.jsx("div",{className:"mt-1 flex items-center gap-2 text-xs text-muted-foreground",children:s.map(i=>o.jsx("span",{children:i},i))}):null]}),o.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-x-3 gap-y-1 text-xs",children:[o.jsx("span",{className:"text-muted-foreground",children:Nl(e)}),e.consoleUrl?o.jsx(Nt,{href:e.consoleUrl,label:"控制台"}):null,e.subscriptionUrl?o.jsx(Nt,{href:e.subscriptionUrl,label:"订阅与账单"}):null,e.quota?.url?o.jsx(Nt,{href:e.quota.url,label:"额度与用量"}):null,e.usagePolicyUrl?o.jsx(Nt,{href:e.usagePolicyUrl,label:"使用政策"}):null]})]}),n.length?o.jsx("dl",{className:"space-y-1 text-[11px] text-muted-foreground",children:n.map(i=>o.jsxs("div",{className:"flex min-w-0 items-baseline gap-2",children:[o.jsx("dt",{className:"shrink-0 text-foreground/70",children:Bl(i.protocol)}),o.jsx("dd",{className:"min-w-0 truncate font-mono",title:i.baseUrl,children:Rl(i.baseUrl)})]},`${i.protocol}:${i.baseUrl}`))}):null,t]})}function Nt({href:e,label:t}){return o.jsx("a",{href:e,target:"_blank",rel:"noreferrer",className:"text-primary hover:underline",children:t})}function Sl(e){const t=e.modelDiscovery?.endpointProtocol;return e.endpoints?.find(n=>n.protocol===t)?.baseUrl??e.endpoints?.[0]?.baseUrl}function Rl(e){try{const t=new URL(e);return`${t.host}${t.pathname.replace(/\/$/u,"")}`}catch{return e}}function Bl(e){return e==="responses"?"Responses API":e==="chatCompletions"?"Chat API":e==="anthropic"?"Anthropic API":e}function Dl(e){return e==="oauth-subscription"?"账号订阅":e==="api-platform"?"API 平台":e==="token-plan"?"Token 套餐":e}function Nl(e){const t=(e.authModes??[]).map(n=>n==="local"?Ml(e):n==="oauth"||n==="deviceCode"?"账号授权":"API Key");return[...new Set(t)].join(" / ")}function Ml(e){return e.id==="official-subscription"&&e.productLabel==="OpenAI"?"本地会话":"本地服务"}function Ol(e){return e.id==="official-subscription"&&e.productLabel==="OpenAI"?"导入本机 OpenAI 登录":"连接本地 Ollama"}function Kl({definition:e,offering:t,status:n,accountLabel:r,credentials:a,attempt:s,apiKey:i,baseUrl:l,busy:d,disabled:f,error:u,onApiKeyChange:m,onBaseUrlChange:g,onBeginApiKey:y,onBeginBrowser:R,onSaveApiKey:h,onDisconnect:I,onCreateApiKeyCredential:j,onUpdateCredential:w,onDeleteCredential:D,onTestCredential:E,onMoveCredential:Q}){const G=s?.mode==="browserAssistedApiKey"&&s.status==="pending",Z=n==="configured",C=n==="connected",F=!!j,[M,te]=p.useState(!1),[V,Ue]=p.useState(),[Ee,B]=p.useState(),[ne,X]=p.useState(""),[re,me]=p.useState(""),[se,be]=p.useState(""),[he,ge]=p.useState(""),[K,z]=p.useState(),[Re,W]=p.useState(!1),$=()=>{Ue("create"),B(void 0),X(""),me(""),be(""),ge(""),z(void 0),W(!1)},H=N=>{Ue("edit"),B(N),X(N.label??""),me(""),be(N.baseUrl??""),ge(N.proxyUrl??""),z(void 0),W(!1)},O=()=>{Ue(void 0),B(void 0),X(""),me(""),be(""),ge(""),z(void 0),W(!1)},Be=async()=>{let N;try{N=Ya(he)}catch{z("Proxy URL 格式无效(支持 http、https)");return}if(z(void 0),V==="create"){const ee=re.trim();if(!ee||!j)return;try{await j({apiKey:ee,label:ne.trim()||void 0,baseUrl:se.trim()||void 0,proxyUrl:N,priority:Hl(a)}),O()}catch(Fe){z(Fe instanceof Error?Fe.message:"保存失败,请重试")}return}if(V==="edit"&&Ee&&w){const ee=he.trim()!==(Ee.proxyUrl??"").trim();try{await w(Ee,{label:ne.trim()||void 0,baseUrl:se.trim()||void 0,...ee?{proxyUrl:N}:{}}),O()}catch(Fe){z(Fe instanceof Error?Fe.message:"保存失败,请重试")}}};return o.jsxs("div",{className:"space-y-4",children:[o.jsx("div",{children:a.length>0?o.jsx("div",{className:"space-y-2",children:a.map((N,ee)=>o.jsx(Rn,{credential:N,label:_e(N),busy:d,disabled:f,onToggle:w,onTest:E,onEdit:()=>H(N),onDelete:()=>D?.(N),deleteAriaLabel:`删除 ${_e(N)}`,beforeActions:o.jsxs(o.Fragment,{children:[o.jsx(T,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":`上移 ${_e(N)}`,disabled:ee===0||f||d,onClick:()=>Q?.(ee,ee-1),children:o.jsx(mc,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}),o.jsx(T,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":`下移 ${_e(N)}`,disabled:ee===a.length-1||f||d,onClick:()=>Q?.(ee,ee+1),children:o.jsx(fc,{"aria-hidden":"true",className:"h-3.5 w-3.5"})})]})},N.id))}):r?o.jsx("p",{className:"text-xs text-muted-foreground",children:Bn(r)}):o.jsx("p",{className:"text-xs text-muted-foreground",children:"Provider 凭证保存在当前 Pod,由 Pod 权限保护。"})}),s?.userCode?o.jsxs("div",{className:"border-l-2 border-primary bg-muted/30 px-3 py-2 text-sm",children:["验证码:",o.jsx("strong",{className:"font-mono",children:s.userCode})]}):null,o.jsxs("div",{className:"flex flex-wrap gap-2",children:[j?o.jsxs(T,{variant:"outline",size:"sm",disabled:d||f,onClick:$,children:[o.jsx(sn,{className:"mr-2 h-4 w-4"}),"添加 API Key"]}):null,F?null:C?o.jsxs(o.Fragment,{children:[o.jsxs(T,{variant:"outline",size:"sm",disabled:d||f,onClick:R,children:[d?o.jsx(ze,{className:"mr-2 h-4 w-4 animate-spin"}):o.jsx(Sn,{className:"mr-2 h-4 w-4"}),"重新连接"]}),o.jsxs(T,{variant:"ghost",size:"sm",disabled:d||f,onClick:I,children:[o.jsx(Nc,{className:"mr-2 h-4 w-4"}),"断开连接"]})]}):Z?o.jsxs(o.Fragment,{children:[o.jsxs(T,{variant:"outline",size:"sm","aria-label":"更新 API Key",disabled:d||f,onClick:y,children:[o.jsx(zt,{className:"mr-2 h-4 w-4"}),"更新 API Key"]}),o.jsx(T,{variant:"ghost",size:"sm",disabled:d||f,onClick:I,children:"移除配置"})]}):o.jsxs(o.Fragment,{children:[o.jsxs(T,{variant:"outline",size:"sm",disabled:d||f||e.browserMode==="connectUnsupported",onClick:R,children:[d?o.jsx(ze,{className:"mr-2 h-4 w-4 animate-spin"}):o.jsx(er,{className:"mr-2 h-4 w-4"}),e.browserLabel]}),o.jsxs(T,{variant:"outline",size:"sm","aria-label":`${e.name} API Key`,disabled:d||f,onClick:y,children:[o.jsx(zt,{className:"mr-2 h-4 w-4"}),"配置 API Key"]})]})]}),V?o.jsxs("div",{className:"space-y-2 rounded-lg border border-border/50 bg-muted/10 p-3",children:[V==="edit"?o.jsx(fe,{autoComplete:"off","aria-label":`${e.name} API Key 标签`,placeholder:"名称,例如 Work key",value:ne,onChange:N=>X(N.target.value)}):null,V==="create"?o.jsx(fe,{type:M?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:re,onChange:N=>me(N.target.value),className:"font-mono"}):null,V==="edit"||Re?o.jsxs(o.Fragment,{children:[o.jsx(fe,{autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:Sl(t)||e.defaultBaseUrl||"默认服务地址",value:se,onChange:N=>be(N.target.value),className:"font-mono text-xs"}),o.jsx(fe,{autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Proxy URL 输入`,placeholder:"http://127.0.0.1:7890",value:he,onChange:N=>ge(N.target.value),className:"font-mono text-xs"})]}):null,K?o.jsx("p",{className:"text-xs text-destructive",children:K}):null,o.jsxs("div",{className:"flex flex-wrap gap-2",children:[o.jsx(T,{size:"sm","aria-label":V==="create"?`保存 ${e.name} API Key`:"保存凭证",disabled:d||f||V==="create"&&!re.trim(),onClick:Be,children:V==="create"?"保存 API Key":"保存凭证"}),o.jsx(T,{variant:"ghost",size:"sm",onClick:O,children:"取消"}),V==="create"?o.jsx(T,{variant:"ghost",size:"sm",onClick:()=>W(N=>!N),children:Re?"收起高级设置":"高级设置"}):null]})]}):null,G?o.jsxs("div",{className:"space-y-2",children:[o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsx("span",{className:"text-sm font-medium",children:"API Key"}),e.apiKeyUrl?o.jsx("a",{href:e.apiKeyUrl,target:"_blank",rel:"noreferrer",className:"text-xs text-primary hover:underline",children:"获取 API Key"}):null]}),o.jsxs("div",{className:"group relative",children:[o.jsx(fe,{type:M?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:i,onChange:N=>m(N.target.value),className:"border-border/60 bg-muted/20 pr-10 font-mono transition-colors focus:border-primary/50 focus:bg-background"}),o.jsx("div",{className:"absolute bottom-1 right-1 top-1 flex items-center",children:o.jsx(T,{variant:"ghost",size:"icon",className:"h-full w-8 rounded hover:bg-muted",onClick:()=>te(N=>!N),"aria-label":M?"隐藏 API Key":"显示 API Key",children:M?o.jsx(Ic,{className:"h-4 w-4 text-muted-foreground"}):o.jsx(Pc,{className:"h-4 w-4 text-muted-foreground"})})})]}),g?o.jsxs("div",{className:"space-y-1.5",children:[o.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:"Base URL(选填)"}),o.jsx(fe,{autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:e.defaultBaseUrl||"默认服务地址",value:l,onChange:N=>g(N.target.value),className:"border-border/60 bg-muted/20 font-mono text-xs transition-colors focus:border-primary/50 focus:bg-background"}),o.jsxs("p",{className:"break-all font-mono text-[11px] text-muted-foreground opacity-80",children:[o.jsx("span",{className:"mr-1 select-none opacity-50",children:"预览:"}),(l.trim()||e.defaultBaseUrl||"").replace(/\/+$/,""),"/chat/completions"]})]}):null,o.jsx(T,{size:"sm","aria-label":`保存 ${e.name} API Key`,disabled:!i.trim()||d||f,onClick:h,children:"保存 API Key"})]}):null,u?o.jsx("p",{className:"text-sm text-destructive",children:u}):null]})}function Rn({credential:e,label:t,busy:n,disabled:r,beforeActions:a,onToggle:s,onTest:i,onEdit:l,onDelete:d,deleteAriaLabel:f}){const u=r||n,m=Ll(e.health),g=`${e.enabled?"已启用":"已停用"} · ${Tl(e.health)}`;return o.jsxs("div",{"data-credential-state":e.enabled?"enabled":"disabled",className:_("flex items-center gap-3 rounded-lg border p-3 transition-colors",e.enabled?m.row:"border-border/50 bg-muted/40 opacity-70"),children:[o.jsxs(tn,{children:[o.jsx(nn,{asChild:!0,children:o.jsx("span",{"aria-label":g,className:_("h-2 w-2 shrink-0 rounded-full",e.enabled?m.dot:"bg-muted-foreground/40")})}),o.jsx(Ct,{className:"text-xs",children:g})]}),o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsx("p",{className:"truncate text-sm font-medium text-foreground",children:t}),e.maskedHint?o.jsx("p",{className:"mt-1 truncate font-mono text-xs text-muted-foreground",children:e.maskedHint}):null]}),o.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[a,i?o.jsx(Mt,{label:`测试连接 ${t}`,disabled:u,onClick:()=>i(e),children:o.jsx(Hc,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,l?o.jsx(Mt,{label:`编辑 ${t}`,disabled:u,onClick:l,children:o.jsx(ca,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,s?o.jsx(Mt,{label:`${e.enabled?"停用":"启用"} ${t}`,disabled:u,onClick:()=>s(e,{enabled:!e.enabled}),children:e.enabled?o.jsx(Oc,{"aria-hidden":"true",className:"h-3.5 w-3.5"}):o.jsx(la,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,d?o.jsx(Mt,{label:f??`删除 ${t}`,disabled:u,onClick:d,children:o.jsx(tr,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null]})]})}function Mt({label:e,disabled:t,onClick:n,children:r}){return o.jsxs(tn,{children:[o.jsx(nn,{asChild:!0,children:o.jsx(T,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":e,disabled:t,onClick:n,children:r})}),o.jsx(Ct,{className:"text-xs",children:e})]})}function Tl(e){return e==="healthy"?"有效":e==="unknown"?"未验证":e==="expired"?"已过期":"错误"}function Ll(e){return e==="healthy"?{row:"border-emerald-500/40 bg-emerald-500/5",dot:"bg-emerald-500"}:e==="unknown"?{row:"border-border/50 bg-background",dot:"bg-muted-foreground/50"}:{row:"border-destructive/40 bg-destructive/5",dot:"bg-destructive"}}function ql(e,t){const n=e.authModes??[];return n.some(r=>r==="oauth"||r==="deviceCode")?"deviceCodeOAuth":n.some(r=>r==="apiKey"||r==="local")||t.browserMode==="connectUnsupported"?"browserAssistedApiKey":t.browserMode}function Ql(e){return e?.status==="pending"||e?.status==="authorization_pending"||e?.status==="slow_down"}function Hl(e){return e.length===0?10:Math.max(...e.map(t=>t.priority))+10}function _e(e){return e.label?.trim()?e.label:e.maskedHint?`API Key · ${e.maskedHint}`:e.authMode==="oauth"||e.authMode==="deviceCode"?"已授权账号":"API Key"}function Bn(e){const t=e.indexOf("@");if(t>0){const n=e.slice(0,t);return`${n.length>1?`${n[0]}***${n[n.length-1]}`:`${n[0]}***`}${e.slice(t)}`}return e.length<=2?`${e[0]??""}***`:`${e[0]}***${e[e.length-1]}`}function Vl({definition:e,product:t,status:n,accountLabel:r,attempt:a,attemptOfferingId:s,apiKey:i,baseUrl:l="",busy:d,disabled:f=!1,error:u,quotas:m,models:g,verifyPending:y=!1,onApiKeyChange:R,onBaseUrlChange:h,onBeginApiKey:I,onBeginOffering:j,onBeginBrowser:w,onSaveApiKey:D,onDisconnect:E,onCreateApiKeyCredential:Q,onCreateLocalCredential:G,onUpdateCredential:Z,onDeleteCredential:C,onTestCredential:F,onReorderCredentials:M,onRefreshQuota:te,onVerify:V,onAddModel:Ue,onEditModel:Ee,onDeleteModel:B,selectedModelIds:ne,onModelSelectionChange:X,onDismissError:re}){const me=n==="configured",se=n==="connected",be=g.length===0&&u?.message&&!u.offeringId?u.message:void 0,[he,ge]=p.useState(""),[K,z]=p.useState(),[Re,W]=p.useState(ne??[]),$=ne??Re,H=p.useMemo(()=>new Map(t?.offerings.map(P=>[P.id,{id:P.id,label:Xt(P)}])??[]),[t?.offerings]),O=p.useMemo(()=>{const P=he.trim().toLocaleLowerCase();return P?g.filter(oe=>Gl(oe,H).includes(P)):g},[g,he,H]),Be=O.filter(P=>P.availability!=="unavailable"),N=Be.filter(P=>$.includes(An(P))).length,ee=Be.length>0&&N===Be.length,Fe=N>0&&!ee,Rt=g.filter(P=>P.availability==="unavailable").length,ln=async P=>{try{await navigator.clipboard.writeText(P),z(P),setTimeout(()=>z(oe=>oe===P?void 0:oe),1500)}catch{z(void 0)}},dn=P=>{const oe=new Set($);oe.has(P)?oe.delete(P):oe.add(P);const Ie=[...oe];ne===void 0&&W(Ie),X?.(e.id,Ie)},lt=()=>{const P=new Set($);for(const Ie of Be){const qe=An(Ie);ee?P.delete(qe):P.add(qe)}const oe=[...P];ne===void 0&&W(oe),X?.(e.id,oe)};return o.jsx(ko,{children:o.jsxs("div",{className:"space-y-8",children:[o.jsxs("header",{className:"flex items-start justify-between gap-4",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs($r,{className:"h-9 w-9 shrink-0 rounded-lg border border-border/50 bg-muted/50 shadow-sm",style:Gt(e.id)?{backgroundColor:Gt(e.id)}:void 0,children:[o.jsx(eo,{src:ua(e.id),className:"object-cover"}),o.jsx(to,{className:"rounded-lg bg-transparent text-sm font-bold uppercase text-muted-foreground",children:zl(e.id)})]}),o.jsxs("div",{className:"flex flex-col justify-center gap-0.5",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("h2",{className:"text-base font-semibold leading-none tracking-tight text-foreground",children:e.name}),o.jsxs(tn,{children:[o.jsx(nn,{asChild:!0,children:o.jsx("button",{type:"button","aria-label":"提供商说明",className:"cursor-help rounded-sm text-muted-foreground/50 focus:outline-none focus-visible:text-foreground",children:o.jsx(Sc,{"aria-hidden":"true",className:"h-3.5 w-3.5"})})}),o.jsx(Ct,{className:"max-w-xs text-xs",children:e.description})]})]}),o.jsxs("a",{href:e.homeUrl,target:"_blank",rel:"noreferrer",className:"flex items-center gap-0.5 text-[10px] leading-none text-muted-foreground transition-colors hover:text-primary",children:["访问官网 ",o.jsx(er,{"aria-hidden":"true",className:"h-2.5 w-2.5"})]})]})]}),o.jsx(pt,{variant:se||me?"default":"secondary",children:Xl(n)})]}),o.jsx(Fl,{definition:e,product:t,status:n,accountLabel:r,attempt:a,attemptOfferingId:s,apiKey:i,baseUrl:l,busy:d,disabled:f,error:u,suppressError:!!be,quotas:m,onApiKeyChange:R,onBaseUrlChange:h,onBeginApiKey:I,onBeginOffering:j,onBeginBrowser:w,onSaveApiKey:D,onDisconnect:E,onCreateApiKeyCredential:t?.offerings.length?Q:void 0,onCreateLocalCredential:t?.offerings.length?G:void 0,onUpdateCredential:Z,onDeleteCredential:C,onTestCredential:F,onReorderCredentials:M,onRefreshQuota:te,onDismissError:re}),o.jsxs("section",{className:"space-y-4",children:[o.jsxs("div",{"data-testid":"provider-models-header",className:"flex flex-col gap-3 border-b border-border/40 pb-4 sm:flex-row sm:items-center sm:justify-between",children:[o.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1",children:[o.jsx(Jt,{className:"h-4 w-4 shrink-0 text-primary"}),o.jsx("h3",{className:"shrink-0 text-sm font-medium text-foreground/90",children:"可用模型"}),o.jsxs("span",{className:"text-xs text-muted-foreground",children:["共 ",g.length," · 已加入 ",$.length," · 已失效 ",Rt]})]}),o.jsxs("div",{"data-testid":"provider-models-actions",className:"flex w-full flex-wrap items-center gap-2 sm:w-auto sm:flex-nowrap sm:justify-end",children:[(me||se)&&(V||Ue)?o.jsxs(o.Fragment,{children:[Ue?o.jsxs(T,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:f||d,onClick:Ue,children:[o.jsx(sn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"添加模型"]}):null,V&&g.length>0?o.jsxs(T,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:f||d||y,onClick:V,children:[y?o.jsx(ze,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):o.jsx(Sn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),y?"同步中...":"刷新模型"]}):V?o.jsxs(T,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:f||d||y,onClick:V,children:[y?o.jsx(ze,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):o.jsx(Sn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),y?"同步中...":"同步模型"]}):null]}):null,o.jsxs("div",{className:"relative w-full sm:w-auto",children:[o.jsx(da,{className:"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),o.jsx(fe,{value:he,onChange:P=>ge(P.target.value),placeholder:"搜索模型...",className:"h-8 w-full bg-background pl-8 text-xs sm:w-[232px]",autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0})]})]})]}),g.length===0?o.jsx("div",{className:"rounded-lg border border-dashed border-border/50 bg-muted/5 py-12 text-center text-sm text-muted-foreground",children:be?o.jsx("p",{className:"text-destructive",children:be}):"暂无可用模型"}):O.length===0?o.jsx("div",{className:"rounded-lg border border-dashed border-border/50 bg-muted/5 py-12 text-center text-sm text-muted-foreground",children:"未找到匹配的模型"}):o.jsxs("div",{className:"grid gap-2",children:[o.jsx("div",{className:"flex items-center justify-between px-1 py-1",children:o.jsxs("button",{type:"button",role:"checkbox","aria-label":"全选当前结果","aria-checked":Fe?"mixed":ee,disabled:f||d||Be.length===0,onClick:lt,className:"flex items-center gap-2 text-xs text-muted-foreground disabled:opacity-50",children:[o.jsx("span",{className:_("flex h-4 w-4 items-center justify-center rounded border",ee||Fe?"border-primary bg-primary text-primary-foreground":"border-border"),children:Fe?o.jsx("span",{"aria-hidden":"true",children:"−"}):o.jsx(pn,{"aria-hidden":"true",className:_("h-3 w-3",!ee&&"invisible")})}),"全选当前结果"]})}),O.map(P=>{const oe=An(P),Ie=$.includes(oe),qe=P.availability==="unavailable",Bt=P.displayName??P.id,rt=Aa(P,H),un=[...(P.inputModalities??[]).filter(ot=>ot!=="text"),...P.capabilities??[]];return o.jsxs("div",{className:_("group flex items-center gap-3 rounded-lg border bg-card p-3 transition-all duration-200 hover:border-border/60 hover:bg-accent/30",Ie?"border-primary/40 bg-primary/[0.03]":"border-border/40",qe&&"opacity-75"),children:[o.jsx("button",{type:"button",role:"checkbox","aria-checked":Ie,"aria-label":`${Ie?"取消选择":"选择"} ${Bt}`,className:_("flex h-5 w-5 shrink-0 items-center justify-center rounded border transition-colors focus:outline-none focus-visible:border-ring",Ie?"border-primary bg-primary text-primary-foreground":"border-border text-transparent hover:border-primary/60"),disabled:f||d||qe&&!Ie,onClick:()=>dn(oe),children:o.jsx(pn,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}),o.jsx("div",{className:"shrink-0 rounded bg-muted/50 p-2 text-muted-foreground transition-colors group-hover:text-primary",children:o.jsx(Jt,{className:"h-4 w-4"})}),o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("span",{className:"truncate text-sm font-medium text-foreground/90",children:Bt}),o.jsx("div",{className:"flex items-center gap-1",children:un.map(ot=>o.jsx(Jl,{type:ot},ot))}),rt?o.jsx(pt,{variant:"outline",className:"shrink-0 text-[10px] font-normal","aria-label":`模型来源:${rt.label}`,title:rt.id,children:rt.label}):null,P.custom?o.jsx(pt,{variant:"outline",className:"shrink-0 text-[10px] font-normal",children:"手工"}):null,qe?o.jsx(pt,{variant:"destructive",className:"shrink-0 text-[10px] font-normal",children:"已失效"}):null]}),P.displayName?o.jsxs("div",{className:"mt-0.5 flex items-center gap-1.5",children:[o.jsx("code",{className:"max-w-[300px] truncate font-mono text-[10px] text-muted-foreground opacity-70",children:P.id}),o.jsx("button",{type:"button",onClick:()=>{ln(P.id)},className:"rounded p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground group-hover:opacity-100 group-focus-within:opacity-100 focus:opacity-100","aria-label":`复制 ${P.displayName} ID`,title:"复制 ID",children:K===P.id?o.jsx(pn,{"aria-hidden":"true",className:"h-3 w-3 text-primary"}):o.jsx(aa,{"aria-hidden":"true",className:"h-3 w-3"})})]}):null]}),P.custom&&(Ee||B)?o.jsxs("div",{className:"flex shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 focus-within:opacity-100",children:[Ee?o.jsx(T,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":`编辑 ${P.displayName??P.id}`,onClick:()=>Ee(P),children:o.jsx(ca,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null,B?o.jsx(T,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":`删除 ${P.displayName??P.id}`,onClick:()=>B(P),children:o.jsx(tr,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null]}):null]},oe)})]})]})]})})}function Jl({type:e}){const t={image:{icon:ia,label:"视觉识别",className:"text-green-500"},web:{icon:sa,label:"联网搜索",className:"text-blue-500"},tool_call:{icon:Jt,label:"函数调用",className:"text-orange-500"},reasoning:{icon:oa,label:"推理",className:"text-purple-500"}}[e];if(!t)return null;const n=t.icon;return o.jsxs(tn,{children:[o.jsx(nn,{asChild:!0,children:o.jsx("button",{type:"button","aria-label":t.label,className:"flex cursor-help items-center justify-center rounded-sm opacity-80 transition-opacity hover:opacity-100 focus:outline-none focus-visible:opacity-100",children:o.jsx(n,{"aria-hidden":"true",className:_("h-3.5 w-3.5",t.className)})})}),o.jsx(Ct,{children:t.label})]})}function zl(e){switch(e){case"openai":return"OA";case"anthropic":return"A";case"kimi":return"K";case"bailian":return"百";case"deepseek":return"DS";case"zhipu":return"智";case"ollama":return"O";case"custom":return"C"}}function An(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function Gl(e,t){const n=Aa(e,t);return[e.id,e.displayName,n?.label,n?.id].filter(Boolean).join(`
|
|
3
|
-
`).toLocaleLowerCase()}function Aa(e,t){if(e.offeringId)return t.get(e.offeringId)??{id:e.offeringId,label:e.offeringId}}function Xl(e){switch(e){case"pending":return"连接中";case"configured":return"已配置";case"connected":return"已连接";case"disconnected":return"未设置";case"reauthRequired":return"需要重新登录";case"failed":return"连接失败";default:return"未检查"}}const Wl=[{id:"image",label:"视觉识别",icon:ia}],Yl=[{id:"tool_call",label:"函数调用",icon:Jt},{id:"reasoning",label:"推理",icon:oa},{id:"web",label:"联网搜索",icon:sa}];function Zl({open:e,providerName:t,initialValue:n,error:r,saving:a=!1,onOpenChange:s,onSave:i}){const l=!!n,[d,f]=p.useState(""),[u,m]=p.useState(""),[g,y]=p.useState([]),[R,h]=p.useState([]);p.useEffect(()=>{e&&(f(n?.id??""),m(n?.name??""),y(n?.inputModalities??[]),h(n?.capabilities??[]))},[n,e]);const I=d.trim(),j=!!I&&!a,w=(E,Q,G)=>{Q(E.includes(G)?E.filter(Z=>Z!==G):[...E,G])},D=(E,Q,G)=>{const Z=Q.includes(E.id),C=E.icon;return o.jsxs("button",{type:"button","aria-pressed":Z,disabled:a,onClick:()=>w(Q,G,E.id),className:_("flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors",Z?"border-primary/50 bg-primary/10 text-primary":"border-border/60 text-muted-foreground hover:border-border hover:text-foreground"),children:[o.jsx(C,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),E.label]},E.id)};return o.jsx(go,{open:e,onOpenChange:s,children:o.jsxs(Qn,{className:"max-w-md",children:[o.jsx(Hn,{children:o.jsxs(Jn,{children:[l?"编辑模型":"添加模型"," · ",t]})}),o.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[o.jsxs("div",{className:"flex flex-col gap-2",children:[o.jsx(Ke,{htmlFor:"ai-model-id",children:"模型 ID"}),o.jsx(fe,{id:"ai-model-id",value:d,disabled:l||a,placeholder:"例如 gpt-4o-mini",onChange:E=>f(E.target.value)})]}),o.jsxs("div",{className:"flex flex-col gap-2",children:[o.jsx(Ke,{htmlFor:"ai-model-name",children:"显示名称"}),o.jsx(fe,{id:"ai-model-name",value:u,disabled:a,placeholder:"留空则使用模型 ID",onChange:E=>m(E.target.value)})]}),o.jsxs("div",{className:"flex flex-col gap-2",children:[o.jsx(Ke,{children:"输入模态"}),o.jsx("div",{className:"flex flex-wrap gap-2",children:Wl.map(E=>D(E,g,y))})]}),o.jsxs("div",{className:"flex flex-col gap-2",children:[o.jsx(Ke,{children:"能力标记"}),o.jsx("div",{className:"flex flex-wrap gap-2",children:Yl.map(E=>D(E,R,h))})]}),r?o.jsx("p",{className:"text-xs text-destructive",role:"alert",children:r}):null]}),o.jsxs(Vn,{children:[o.jsx(T,{variant:"outline",disabled:a,onClick:()=>s(!1),children:"取消"}),o.jsx(T,{disabled:!j,onClick:()=>i({id:I,name:u.trim(),inputModalities:g,capabilities:R}),children:a?"保存中...":"保存"})]})]})})}const ya=["codex","claude-code","pi","codebuddy"],ut={codex:"Codex","claude-code":"Claude Code",pi:"Pi",codebuddy:"CodeBuddy"};function _l({client:e,className:t="h-4 w-4"}){switch(e){case"claude-code":return o.jsx(gc,{className:t,"aria-hidden":"true"});case"pi":return o.jsx(Lc,{className:t,"aria-hidden":"true"});case"codebuddy":return o.jsx(wc,{className:t,"aria-hidden":"true"});default:return o.jsx(_c,{className:t,"aria-hidden":"true"})}}function $l(e,t,n){const r=n??"<粘贴 Xpod API Key>",a=t.trim().replace(/\/+$/,""),s=a.endsWith("/v1")?a:`${a}/v1`,i=a.replace(/\/v1$/,"");switch(e){case"codex":return["# ~/.codex/config.toml",'model_provider = "xpod"',"","[model_providers.xpod]",'name = "Xpod AI Connection"',`base_url = ${JSON.stringify(s)}`,'wire_api = "responses"',"requires_openai_auth = true","","# ~/.codex/auth.json(合并到现有 JSON)",JSON.stringify({OPENAI_API_KEY:r},null,2)].join(`
|
|
4
|
-
`);case"claude-code":return["# ~/.claude/settings.json(合并 env 到现有 JSON)",JSON.stringify({env:{ANTHROPIC_BASE_URL:i,ANTHROPIC_AUTH_TOKEN:r}},null,2)].join(`
|
|
5
|
-
`);case"pi":return["# ~/.pi/agent/settings.json(合并到现有 JSON,并将 <model-id> 替换为实际模型)",JSON.stringify({defaultProvider:"xpod",defaultModel:"<model-id>"},null,2),"","# ~/.pi/agent/models.json(合并 providers.xpod 到现有 JSON)",JSON.stringify({providers:{xpod:{baseUrl:s,apiKey:r,authHeader:!0,api:"openai-responses",models:[{id:"<model-id>",name:"<model-id>"}]}}},null,2)].join(`
|
|
6
|
-
`);case"codebuddy":return["# ~/.codebuddy/settings.json(合并 env 到现有 JSON)",JSON.stringify({env:{CODEBUDDY_BASE_URL:s,CODEBUDDY_API_KEY:r}},null,2)].join(`
|
|
7
|
-
`)}}const kr="我的 API Key";function ed({client:e,clientConfigurationBridge:t}){const[n,r]=p.useState([]),[a,s]=p.useState(!0),[i,l]=p.useState(kr),[d,f]=p.useState(""),[u,m]=p.useState(!1),[g,y]=p.useState(),[R,h]=p.useState(),[I,j]=p.useState();p.useEffect(()=>{let C=!0;return s(!0),j(void 0),e.listGatewayKeys().then(F=>{C&&r(F.filter(M=>!M.revokedAt))}).catch(F=>{C&&j(ft(F))}).finally(()=>{C&&s(!1)}),()=>{C=!1}},[e]);const w=async(C,F=d)=>{const M=F?$l(F,e.apiBase,C):td(e.apiBase,C);if(!navigator.clipboard?.writeText)throw new Error("当前浏览器无法访问剪贴板,请从下方复制新创建的 API Key。");await navigator.clipboard.writeText(M)},D=async(C,F)=>{if(!t){await w(C,F);return}const M=await t.plan({client:F,endpoint:e.apiBase});if(M.confirmation?.required)throw await w(C,F),new Error(`${ut[F]} 需要确认后才能写入;配置已复制。`);await t.apply({client:F,planId:M.planId,apiKey:C});const te=await t.verify({client:F,planId:M.planId});if(te.status!=="configured")throw new Error(te.message??`${ut[F]} 配置验证失败。`)},E=async()=>{const C=i.trim();if(!C){j("请填写 API Key 名称。");return}m(!0),j(void 0),h(void 0);try{const F=await e.createGatewayKey({name:C,...d?{appliedClient:d}:{}});r(M=>[F.record,...M.filter(te=>te.id!==F.record.id)]),h(F.plaintext),l(kr),d?await D(F.plaintext,d):await w(F.plaintext)}catch(F){j(ft(F))}finally{m(!1)}},Q=async(C,F)=>{y(C.id),j(void 0);try{const M=await e.updateGatewayKey(C.id,{enabled:F});r(te=>te.map(V=>V.id===C.id?M:V))}catch(M){j(ft(M))}finally{y(void 0)}},G=async C=>{y(C.id),j(void 0);try{const F=await e.revealGatewayKey(C.id),M=Pr(C.appliedClients?.[0])??d;await w(F,M)}catch(F){j(ft(F))}finally{y(void 0)}},Z=async C=>{y(C.id),j(void 0);try{await e.deleteGatewayKey(C.id),r(F=>F.filter(M=>M.id!==C.id))}catch(F){j(ft(F))}finally{y(void 0)}};return o.jsxs("section",{className:"space-y-6","aria-label":"API Keys",children:[o.jsx("p",{className:"max-w-3xl text-sm text-muted-foreground",children:"API Key 用于访问 Xpod Gateway。Provider 密钥不会写入客户端;客户端只获得 Xpod 地址和这里创建的 Key。"}),o.jsxs("div",{className:"rounded-xl border border-border/70 p-4",children:[o.jsxs("div",{className:"grid gap-3 lg:grid-cols-[minmax(14rem,1fr)_minmax(12rem,20rem)_auto] lg:items-end",children:[o.jsxs("label",{className:"space-y-1.5",children:[o.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:"名称"}),o.jsx(fe,{"aria-label":"API Key 名称",value:i,onChange:C=>l(C.target.value)})]}),o.jsxs("label",{className:"space-y-1.5",children:[o.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:"应用到(可选)"}),o.jsxs("select",{"aria-label":"应用到客户端",value:d,onChange:C=>f(C.target.value),className:"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus-visible:border-ring",children:[o.jsx("option",{value:"",children:"仅复制通用配置"}),ya.map(C=>o.jsx("option",{value:C,children:ut[C]},C))]})]}),o.jsxs(T,{"aria-label":"创建 API Key",className:"w-full whitespace-nowrap lg:w-auto",disabled:u||!i.trim(),onClick:()=>{E()},children:[u?o.jsx(ze,{className:"mr-2 h-4 w-4 animate-spin"}):o.jsx(zt,{className:"mr-2 h-4 w-4"}),d&&t?"创建并应用配置":"创建并复制配置"]})]}),d&&!t?o.jsxs("p",{className:"mt-3 text-xs text-muted-foreground",children:["当前 Web 环境不支持自动写入,将复制 ",ut[d]," 配置。"]}):null]}),R?o.jsxs("div",{"aria-label":"新创建的 API Key",className:"rounded-lg border border-primary/25 bg-primary/5 p-4",children:[o.jsx("p",{className:"text-sm font-medium",children:"API Key 已创建,配置已复制"}),o.jsx("code",{className:"mt-2 block overflow-x-auto text-xs text-muted-foreground",children:R})]}):null,I?o.jsx("p",{role:"alert",className:"rounded-md border border-destructive/30 px-3 py-2 text-sm text-destructive",children:I}):null,o.jsxs("div",{className:"space-y-2",children:[o.jsxs("div",{className:"flex items-center justify-between gap-3 border-b border-border/60 pb-2",children:[o.jsx("h2",{className:"text-sm font-medium",children:"已创建"}),o.jsxs("span",{className:"text-xs text-muted-foreground",children:[n.length," 个 API Key"]})]}),a?o.jsxs("div",{className:"flex items-center gap-2 py-6 text-sm text-muted-foreground",children:[o.jsx(ze,{className:"h-4 w-4 animate-spin"}),"正在读取 API Keys"]}):n.length===0?o.jsx("p",{className:"py-8 text-center text-sm text-muted-foreground",children:"尚未创建 API Key。"}):o.jsx("div",{className:"overflow-hidden rounded-xl border border-border/70",children:n.map(C=>{const F=!!C.disabledAt,M=C.name||"未命名 API Key",te=g===C.id;return o.jsxs("div",{"data-key-state":F?"disabled":"active",className:_("grid min-h-16 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 border-b border-border/60 px-4 py-3 last:border-b-0 md:grid-cols-[minmax(0,1.4fr)_minmax(10rem,.8fr)_auto]",F?"bg-muted/30 text-muted-foreground":"bg-emerald-500/[0.035]"),children:[o.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[o.jsx("span",{className:"truncate text-sm font-medium",children:M}),o.jsx("code",{className:"shrink-0 text-xs text-muted-foreground",children:C.maskedHint??nd(C.id)}),o.jsx(pt,{variant:"secondary",children:F?"已停用":"已启用"})]}),o.jsx("div",{className:"hidden min-w-0 text-xs text-muted-foreground md:block",children:C.lastUsedAt?`最后使用 ${rd(C.lastUsedAt)}`:"暂无调用记录 · 尚未使用"}),o.jsxs("div",{className:"flex items-center justify-end gap-1",children:[(C.appliedClients??[]).map(Pr).filter(od).map(V=>o.jsx("span",{title:ut[V],className:"flex h-8 w-8 items-center justify-center text-muted-foreground",children:o.jsx(_l,{client:V})},V)),o.jsx(T,{variant:"ghost",size:"icon","aria-label":`${F?"启用":"停用"} ${M}`,title:`${F?"启用":"停用"} ${M}`,disabled:te,onClick:()=>{Q(C,F)},children:F?o.jsx(la,{className:"h-4 w-4"}):o.jsx(el,{className:"h-4 w-4"})}),o.jsx(T,{variant:"ghost",size:"icon","aria-label":`复制 ${M} 配置`,title:`复制 ${M} 配置`,disabled:te,onClick:()=>{G(C)},children:o.jsx(aa,{className:"h-4 w-4"})}),o.jsx(T,{variant:"ghost",size:"icon","aria-label":`删除 ${M}`,title:`删除 ${M}`,disabled:te,onClick:()=>{Z(C)},children:o.jsx(tr,{className:"h-4 w-4"})})]})]},C.id)})})]})]})}function Pr(e){return e&&ya.includes(e)?e:void 0}function td(e,t){return[`XPOD_BASE_URL=${e.replace(/\/+$/u,"")}/v1`,`XPOD_API_KEY=${t}`].join(`
|
|
8
|
-
`)}function nd(e){return`••••••••${e.slice(-8)}`}function rd(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function ft(e){return e instanceof Error&&e.message?e.message:"API Key 操作失败,请重试。"}function od(e){return e!==void 0}const ad={};function sd({client:e,openExternal:t=pd,clientConfigurationBridge:n,selectedSection:r="provider",selectedProvider:a,selectedCredentialId:s,providerSummaries:i=ad,providerProducts:l={},providerLoadError:d,onProviderStateChange:f,onModelSelectionChange:u}){const[m,g]=p.useState({}),[y,R]=p.useState([]),[h,I]=p.useState({}),[j,w]=p.useState({}),[D,E]=p.useState({}),[Q,G]=p.useState({}),[Z,C]=p.useState({}),[F,M]=p.useState({}),[te,V]=p.useState({}),[Ue,Ee]=p.useState({}),[B,ne]=p.useState({}),[X,re]=p.useState(),[me,se]=p.useState(),[be,he]=p.useState(!1),[ge,K]=p.useState({}),z=p.useRef(0),Re=p.useRef({}),W={...l,...ge},$=p.useCallback((c,A)=>{g(v=>({...v,[c]:A})),f?.(c,dd(A))},[f]);p.useEffect(()=>{g(Object.fromEntries(Object.values(i).filter(Br).map(c=>[c.provider,c.status==="connected"&&c.authMode==="browserAssistedApiKey"?"configured":c.status]))),C(Object.fromEntries(Object.values(i).filter(Br).map(c=>[c.provider,c.baseUrl??""])))},[i]),p.useEffect(()=>{I(c=>{const A={...c};let v=!1;for(const[b,x]of Object.entries(l)){if(!x)continue;const S=x.selectedModels.map(Ve),ae=c[b];(!ae||ae.join("\0")!==S.join("\0"))&&(A[b]=S,v=!0)}return v?A:c})},[l]),p.useEffect(()=>{let c=!0;return e.listModels().then(A=>{c&&R(A)}).catch(()=>{}),()=>{c=!1,z.current+=1}},[e]);const H=(c,A)=>{M(v=>({...v,[c]:A}))},O=(c,A,v)=>{V(b=>({...b,[c]:A?{message:A,offeringId:v}:void 0}))},Be=p.useCallback(async c=>{const A=c.verificationUriComplete??c.authorizationUrl??c.verificationUri;A&&await t(A)},[t]),N=async c=>{H(c,!0),O(c),E(A=>({...A,[c]:void 0}));try{const A=await e.beginConnect(c,"browserAssistedApiKey");w(b=>({...b,[c]:A}));const v=Dn(A.status);if($(c,v?"pending":A.status==="completed"?"configured":"failed"),!v&&A.status!=="completed"){O(c,A.message??jr(A.status));return}await Be(A)}catch(A){$(c,"failed"),O(c,le(A))}finally{H(c,!1)}},ee=async c=>{if(c.browserMode!=="connectUnsupported"){if(c.browserMode==="browserAssistedApiKey"){await N(c.id);return}await Rt(c.id,c.browserMode)}},Fe=async(c,A,v)=>{if(v==="browserAssistedApiKey"){await N(c);return}await Rt(c,v,A.id)},Rt=async(c,A,v)=>{if(A==="connectUnsupported")return;H(c,!0),O(c),E(x=>({...x,[c]:v}));const b=z.current+1;z.current=b;try{const x=await e.beginConnect(c,A);if(w(S=>({...S,[c]:x})),!Dn(x.status)){const S=x.status==="completed";$(c,S?"connected":"failed"),S||O(c,x.status==="unsupported"?"当前部署未启用账号授权":x.message??jr(x.status),v),H(c,!1);return}$(c,"pending"),await Be(x),ld(e,c,x,b,z,{onAttempt:S=>w(ae=>({...ae,[c]:S})),onConnected:()=>$(c,"connected"),onFailed:S=>{$(c,"failed"),O(c,S,v)},onFinished:()=>H(c,!1)})}catch(x){$(c,"failed"),O(c,le(x),v),H(c,!1)}},ln=async c=>{const A=Q[c.id]?.trim(),v=Z[c.id]??i[c.id]?.baseUrl??"",b=j[c.id];if(!(!A||!b)){H(c.id,!0),O(c.id);try{const x=await e.completeApiKey(c.id,b,A,void 0,v.trim());w(S=>({...S,[c.id]:x})),G(S=>({...S,[c.id]:""})),$(c.id,"configured"),we({description:"API Key 已保存"})}catch(x){O(c.id,le(x)),$(c.id,"failed")}finally{H(c.id,!1)}}},dn=async(c,A)=>{const v=A?W[c]?.credentials.find(b=>b.id===A)?.offeringId:void 0;H(c,!0),O(c);try{await e.disconnect(c,A),w(b=>({...b,[c]:void 0})),E(b=>({...b,[c]:void 0})),Ee(b=>({...b,[c]:v?{...b[c],[v]:void 0}:void 0})),A?(K(b=>({...b,[c]:Fr(W[c],c,A)})),we({description:"已从当前 Pod 移除账号"})):($(c,"disconnected"),we({description:"已断开连接"}))}catch(b){O(c,le(b),v)}finally{H(c,!1)}},lt=(c,A)=>{K(v=>({...v,[c]:Ur(W[c],c,A)})),$(c,A.authMode==="apiKey"||A.authMode==="local"?"configured":"connected")},P=async(c,A,v=!1)=>{ne(b=>({...b,[c]:!0})),O(c);try{const b=A?await e.discoverModels(c,A):await e.discoverModels(c),x=W[c]?.selectedModels??[],S=hd(c,A);try{const ie=(await e.listModels()).filter(Ae=>Ae.provider===c);R(Ae=>{const Qe=yn(Ae,c,ie,S),Dt=yn(Qe,c,b.models,S);return Rr(Dt,c,x,b.models,S)})}catch{R(ae=>Rr(yn(ae,c,b.models,S),c,x,b.models,S))}try{const ie=(await e.listProviders()).find(Ae=>Ae.id===c);ie&&K(Ae=>({...Ae,[c]:ie}))}catch{}return v&&we({variant:b.models.length>0?"success":"default",description:b.models.length>0?`连接成功,已同步 ${b.models.length} 个模型`:"连接成功,但服务商未返回任何模型。请确认该服务支持 /models 接口,或使用「添加模型」手工录入。"}),!0}catch(b){const x=le(b);return O(c,x,A?.offeringId),!1}finally{ne(b=>({...b,[c]:!1}))}},oe=async(c,A,v)=>{H(c,!0),O(c);try{const b=await e.createApiKeyCredential(c,{offeringId:A.id,apiKey:v.apiKey,label:v.label,baseUrl:v.baseUrl,proxyUrl:v.proxyUrl,priority:v.priority});lt(c,b),we({description:"API Key 已添加"}),await P(c,{offeringId:b.offeringId,credentialId:b.id})}catch(b){const x=le(b);throw O(c,x,A.id),new Error(x)}finally{H(c,!1)}},Ie=async(c,A)=>{H(c,!0),O(c);try{const v=c==="openai"&&A.id==="official-subscription",b=await e.createLocalCredential(c,{offeringId:A.id,label:v?"OpenAI Subscription":"Local Ollama",...v?{}:{baseUrl:A.endpoints?.[0]?.baseUrl},priority:10});lt(c,b),we({description:v?"本机 OpenAI 登录已导入":"本地 Ollama 已连接"}),A.modelDiscovery?.strategy!=="unsupported"&&await P(c,{offeringId:b.offeringId,credentialId:b.id})}catch(v){const b=le(v);throw O(c,b,A.id),new Error(b)}finally{H(c,!1)}},qe=async(c,A,v)=>{H(c,!0),O(c);try{const b=await e.updateProviderCredential(c,A.id,{expectedVersion:A.version,...v});lt(c,b),we({description:"凭证已更新"}),b.enabled&&await P(c,{offeringId:b.offeringId,credentialId:b.id})}catch(b){const x=le(b);throw O(c,x,A.offeringId),new Error(x)}finally{H(c,!1)}},Bt=async(c,A)=>{H(c,!0),O(c);try{await e.deleteProviderCredential(c,A.id),K(v=>({...v,[c]:Fr(W[c],c,A.id)})),we({description:"凭证已删除"})}catch(v){O(c,le(v),A.offeringId)}finally{H(c,!1)}},rt=async(c,A)=>{H(c,!0),O(c);try{const v=await e.testProviderCredential(c,{credentialId:A.id}),b=ud(v);K(x=>({...x,[c]:b?Ur(W[c],c,b):Sr(W[c],c,A.id,"healthy")})),we({variant:"success",description:"测试通过"})}catch(v){const b=(await e.listProviders().catch(()=>[])).find(x=>x.id===c);K(x=>({...x,[c]:b??Sr(W[c],c,A.id,"invalid")})),O(c,le(v),A.offeringId)}finally{H(c,!1)}},un=async(c,A,v,b,x)=>{if(x<0||x>=v.length)return;const S=[...v],[ae]=S.splice(b,1);if(ae){S.splice(x,0,ae),H(c,!0),O(c);try{const ie=[];for(const[Ae,Qe]of S.entries()){const Dt=(Ae+1)*10;if(Qe.priority===Dt){ie.push(Qe);continue}ie.push(await e.updateProviderCredential(c,Qe.id,{expectedVersion:Qe.version,priority:Dt}))}K(Ae=>({...Ae,[c]:fd(W[c],c,A,ie)})),we({description:"顺序已保存"})}catch(ie){O(c,le(ie),A.id)}finally{H(c,!1)}}},ot=async(c,A,v)=>{const b=x=>{Ee(S=>({...S,[c]:{...S[c],[A.id]:{busy:!1,...S[c]?.[A.id],...x}}}))};b({busy:!0,error:void 0,credentialId:v?.id});try{const x=await e.quota(c,!0,{offeringId:A.id,...v?{credentialId:v.id,credentialIri:v.id}:{}});b({quota:x,busy:!1,error:void 0,credentialId:v?.id})}catch(x){b({busy:!1,error:le(x),credentialId:v?.id})}},Fa=async c=>{await P(c,c==="custom"&&s?{credentialId:s}:void 0,!0)},dr=p.useCallback(async()=>{try{R(await e.listModels())}catch{}},[e]),ur=(c,A)=>{se(void 0),re({provider:c,model:A})},Sa=async c=>{if(!X)return;const A=!!X.model;he(!0),se(void 0);try{await e.saveProviderModel(X.provider,{id:c.id,displayName:c.name||void 0,inputModalities:c.inputModalities.length>0?c.inputModalities:void 0,capabilities:c.capabilities.length>0?c.capabilities:void 0}),re(void 0),we({description:A?"模型已更新":"模型已添加"}),await dr()}catch(v){se(le(v))}finally{he(!1)}},Ra=async(c,A)=>{O(c);try{await e.deleteProviderModel(c,A.id),R(v=>v.filter(b=>!(b.provider===c&&b.id===A.id))),we({description:"模型已移除"}),dr()}catch(v){O(c,le(v))}},Ba=p.useCallback((c,A)=>{const v=[...new Set(A)],b=h[c]??W[c]?.selectedModels.map(Ve)??[],x=(Re.current[c]??0)+1;Re.current[c]=x,I(S=>({...S,[c]:v})),(async()=>{try{const S=[...y.filter(ie=>ie.provider===c),...W[c]?.selectedModels??[]],ae=v.map(ie=>{const Ae=S.find(Qe=>Ve(Qe)===ie);return Ae?Ad(Ae):{id:ie}});c==="custom"?await e.saveModelSelection?.(c,ae,s):await e.saveModelSelection?.(c,ae),Re.current[c]===x&&u?.(c,v)}catch(S){if(Re.current[c]!==x)return;I(ae=>({...ae,[c]:b})),u?.(c,b),we({variant:"destructive",description:le(S)})}})()},[e,W,Re,y,u,s,h]),Da=o.jsxs("section",{children:[d?o.jsxs("p",{className:"mb-4 rounded-md border border-destructive/30 px-3 py-2 text-sm text-destructive",children:["Provider 状态读取失败:",d]}):null,ue.filter(c=>c.id===(a??"openai")).map(c=>{const A=W[c.id],v=gd(y.filter(x=>x.provider===c.id&&(c.id!=="custom"||!s||x.credentialId===s)),A?.selectedModels??[]),b=h[c.id]??A?.selectedModels.map(Ve)??[];return o.jsx(Vl,{definition:c,product:A,status:cd(m[c.id],A),accountLabel:i[c.id]?.accountLabel,attempt:j[c.id],attemptOfferingId:D[c.id],apiKey:Q[c.id]??"",baseUrl:Z[c.id]??i[c.id]?.baseUrl??"",busy:!!F[c.id],error:te[c.id],quotas:Ue[c.id],models:v,selectedModelIds:b,onApiKeyChange:x=>G(S=>({...S,[c.id]:x})),onBaseUrlChange:x=>C(S=>({...S,[c.id]:x})),onBeginApiKey:()=>{N(c.id)},onBeginOffering:(x,S)=>{Fe(c.id,x,S)},onBeginBrowser:()=>{ee(c)},onSaveApiKey:()=>{ln(c)},onDisconnect:x=>{dn(c.id,x?.id)},onCreateApiKeyCredential:(x,S)=>oe(c.id,x,S),onCreateLocalCredential:x=>Ie(c.id,x),onUpdateCredential:(x,S)=>qe(c.id,x,S),onDeleteCredential:x=>{Bt(c.id,x)},onTestCredential:x=>{rt(c.id,x)},onReorderCredentials:(x,S,ae,ie)=>{un(c.id,x,S,ae,ie)},onRefreshQuota:(x,S)=>{ot(c.id,x,S)},verifyPending:!!B[c.id],onVerify:()=>{Fa(c.id)},onAddModel:()=>ur(c.id),onEditModel:x=>ur(c.id,x),onDeleteModel:x=>{Ra(c.id,x)},onModelSelectionChange:Ba,onDismissError:()=>O(c.id)},c.id)})]}),Na=o.jsx(ed,{client:e,clientConfigurationBridge:n});return o.jsxs("div",{"data-testid":"ai-connections-panel",className:"mx-auto w-full max-w-5xl space-y-10 px-4 py-6 sm:px-8 sm:py-8",children:[o.jsx(Ja,{}),r==="keys"?Na:null,r==="provider"?Da:null,r==="provider"&&X?o.jsx(Zl,{open:!0,providerName:ue.find(c=>c.id===X.provider)?.name??X.provider,initialValue:X.model?{id:X.model.id,name:X.model.displayName??"",inputModalities:X.model.inputModalities??[],capabilities:X.model.capabilities??[]}:void 0,error:me,saving:be,onOpenChange:c=>{c||re(void 0)},onSave:c=>{Sa(c)}}):null]})}function id(e){if(!e||e.status==="unconfigured"||e.status==="unavailable")return"disconnected";if(e.status==="configured")return"configured";if(e.status==="attention")return"reauthRequired";const t=e.credentials.find(n=>n.enabled)??e.credentials[0];return t?.authMode==="oauth"||t?.authMode==="deviceCode"?"connected":"configured"}function cd(e,t){return e==="pending"||e==="failed"?e:t?id(t):e??"unknown"}async function ld(e,t,n,r,a,s){let i=n;try{for(;a.current===r&&Dn(i.status);){if(await md(Math.max(1,i.intervalSeconds??2)*1e3),a.current!==r)return;i=await e.pollDevice(t,i),s.onAttempt(i)}i.status==="completed"?s.onConnected():a.current===r&&s.onFailed(i.message||`连接${i.status==="expired"?"已过期":"失败"}`)}catch(l){a.current===r&&s.onFailed(le(l))}finally{a.current===r&&s.onFinished()}}function Dn(e){return e==="pending"||e==="authorization_pending"||e==="slow_down"}function jr(e){return e==="expired"?"连接已过期,请重新开始":e==="cancelled"?"连接已取消":e==="unsupported"?"当前 Provider 不支持此连接方式":"连接失败"}function dd(e){return e==="configured"?"configured":e==="connected"?"connected":e==="failed"||e==="reauthRequired"?"attention":e==="pending"?"loading":"unconfigured"}function Ur(e,t,n){const r=e??cn(t),a=xa([...r.credentials.filter(s=>s.id!==n.id),n]);return{...r,credentials:a,status:sr(a)}}function Fr(e,t,n){const r=e??cn(t),a=r.credentials.filter(s=>s.id!==n);return{...r,credentials:a,status:sr(a)}}function Sr(e,t,n,r){const a=e??cn(t),s=a.credentials.map(i=>i.id===n?{...i,health:r}:i);return{...a,credentials:s,status:s.some(i=>i.enabled&&i.health==="invalid")?"attention":sr(s)}}function ud(e){const t=e.credential;if(!t||typeof t!="object")return;const n=t;return typeof n.id=="string"&&typeof n.offeringId=="string"&&(n.authMode==="oauth"||n.authMode==="deviceCode"||n.authMode==="apiKey"||n.authMode==="local")&&typeof n.version=="number"?n:void 0}function sr(e){if(e.length===0)return"unconfigured";const t=e.filter(n=>n.enabled);return t.length===0?"configured":t.some(n=>n.health==="expired"||n.health==="invalid")?"attention":"available"}function fd(e,t,n,r){const a=e??cn(t),s=new Set(r.map(i=>i.id));return{...a,offerings:a.offerings.some(i=>i.id===n.id)?a.offerings:[...a.offerings,n],credentials:xa([...a.credentials.filter(i=>i.offeringId!==n.id||!s.has(i.id)),...r])}}function cn(e){return{id:e,name:ue.find(t=>t.id===e)?.name??e,offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function xa(e){return[...e].sort((t,n)=>t.priority-n.priority)}function pd(e){window.open(e,"_blank","noopener,noreferrer")}function md(e){return new Promise(t=>window.setTimeout(t,e))}function le(e){const t=ro(e);return t==="AI Connection request failed. Please try again."?"请求未完成。请确认 Xpod 正在运行且登录仍有效,然后重试。":t}function hd(e,t){return e==="custom"?t?.credentialId?{markMissing:!0,credentialId:t.credentialId}:{markMissing:!t}:t?.offeringId?{markMissing:!0,offeringId:t.offeringId}:{markMissing:!t}}function yn(e,t,n,r={markMissing:!1}){const a=new Set(n.map(i=>i.id)),s=e.map(i=>r.markMissing&&i.provider===t&&!i.custom&&!a.has(i.id)&&(r.offeringId===void 0||i.offeringId===r.offeringId)&&(r.credentialId===void 0||i.credentialId===r.credentialId)?it({...i,availability:"unavailable"}):i);for(const i of n){const l=i,d="provider"in i,f=l.offeringId??(d?void 0:r.offeringId),u=l.credentialId??(d?void 0:r.credentialId),m=s.findIndex(g=>g.provider!==t?!1:l.resourceId&&g.resourceId?l.resourceId===g.resourceId:u!==void 0?g.id===l.id&&g.credentialId===u:f!==void 0?g.id===l.id&&g.offeringId===f:g.id===l.id&&g.offeringId===void 0);m===-1?s.push(it({...l,id:l.id,provider:t,availability:l.availability??"available",...f?{offeringId:f}:{},...u?{credentialId:u}:{}})):s[m]=it({...s[m],...l,provider:t,displayName:l.displayName??s[m].displayName,availability:l.availability??"available",...f?{offeringId:f}:{},...u?{credentialId:u}:{}})}return s}function Rr(e,t,n,r,a){if(!a.markMissing||n.length===0)return e;const s=new Set(r.map(l=>l.id)),i=[...e];for(const l of n.filter(d=>d.provider===t)){if(l.custom||a.offeringId!==void 0&&l.offeringId!==a.offeringId||a.credentialId!==void 0&&l.credentialId!==a.credentialId||s.has(l.id))continue;const d=Ve(l),f=i.findIndex(m=>m.provider===t&&Ve(m)===d),u=it({...l,availability:"unavailable"});f===-1?i.push(u):i[f]=it({...i[f],...u,displayName:i[f].displayName??u.displayName})}return i}function gd(e,t){const n=[...e];for(const r of t){const a=n.findIndex(s=>Ve(s)===Ve(r));if(a===-1){n.push(r);continue}n[a]=it({...n[a],...r,displayName:n[a].displayName??r.displayName,availability:n[a].availability==="unavailable"?"unavailable":r.availability})}return n}function it(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Ve(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function Ad(e){return{id:e.id,...e.offeringId?{offeringId:e.offeringId}:{},...e.resourceId?{resourceId:e.resourceId}:{}}}function Br(e){return e!==void 0}function yd({controller:e}){const t=rr(e),n=or(e),r=fa(e),a=ml(e),s=ar(e),i=ma(e),l=ue.find(y=>y.id===n),d=n==="custom"?s.custom?.credentials.find(y=>y.id===r):void 0,f=nr.find(y=>y.id===t)?.title,u=d?.label??s[n]?.name??l?.name??n,m=f??`${u} 详情`,g=n==="custom"&&r&&s.custom?{...s,custom:{...s.custom,name:u,offerings:xd(s.custom,d),credentials:s.custom.credentials.filter(y=>y.id===r),selectedModels:s.custom.selectedModels.filter(y=>y.credentialId===r)}}:s;return p.useEffect(()=>{e.client&&e.loadProviders()},[e]),e.client?o.jsx("section",{role:"region","aria-label":m,children:o.jsx(sd,{client:e.client,clientConfigurationBridge:e.clientConfigurationBridge,selectedSection:t,selectedProvider:n,selectedCredentialId:r,openExternal:e.openExternal,providerSummaries:a,providerProducts:g,providerLoadError:i,onProviderStateChange:e.setProviderState})}):o.jsxs("section",{role:"alert","aria-label":"AI Connections unavailable",children:[o.jsx("h2",{children:"AI Connections 尚未就绪"}),o.jsx("p",{children:"宿主需要先提供已登录的 WebID 和可用的 Pod。"})]})}function xd(e,t){if(!t)return e.offerings;const n=t.compatibility??(t.offeringId==="anthropic-compatible"?"anthropic":"openai"),r=e.offerings.find(a=>a.id===t.offeringId)??e.offerings[0];return r?[{...r,id:t.offeringId,label:n==="auto"?"自动探测":n==="anthropic"?"Anthropic 兼容":"OpenAI 兼容",endpoints:t.baseUrl?[{protocol:n==="anthropic"?"anthropic":"chatCompletions",baseUrl:t.baseUrl}]:r.endpoints,modelDiscovery:n==="anthropic"?{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"}:n==="auto"?{strategy:"auto",path:"/models",endpointProtocol:"auto"}:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"}}]:[]}function bd({open:e,saving:t=!1,error:n,onOpenChange:r,onSave:a}){const[s,i]=p.useState(""),[l,d]=p.useState("auto"),[f,u]=p.useState(""),[m,g]=p.useState(""),[y,R]=p.useState(""),[h,I]=p.useState();p.useEffect(()=>{e&&(i(""),d("auto"),u(""),g(""),R(""),I(void 0))},[e]);const j=()=>{I(void 0);let w;try{w=wd(f)}catch{I("Base URL 必须是有效的 http(s) 地址。");return}const D=s.trim(),E=m.trim();if(!D){I("请输入 Provider 名称。");return}if(!E){I("请输入 API Key。");return}a({offeringId:vd(l),apiKey:E,label:D,baseUrl:w,priority:10,compatibility:l,...y.trim()?{proxyUrl:y.trim()}:{}})};return o.jsx(go,{open:e,onOpenChange:r,children:o.jsxs(Qn,{className:"max-w-md",style:{maxHeight:"calc(100vh - 2rem)",overflowY:"auto"},"aria-describedby":"ai-custom-provider-description",children:[o.jsx(Hn,{children:o.jsx(Jn,{children:"添加自定义 Provider"})}),o.jsx("p",{id:"ai-custom-provider-description",className:"text-sm text-muted-foreground",children:"用 OpenAI/Anthropic 兼容协议接入第三方模型服务。Xpod 会把真实 API Key 存进当前 Pod。"}),o.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[o.jsxs("div",{className:"flex flex-col gap-2",children:[o.jsx(Ke,{htmlFor:"ai-custom-provider-name",children:"Provider 名称"}),o.jsx(fe,{id:"ai-custom-provider-name",value:s,disabled:t,placeholder:"例如 OpenRouter",onChange:w=>i(w.target.value)})]}),o.jsxs("div",{className:"flex flex-col gap-2",children:[o.jsx(Ke,{htmlFor:"ai-custom-provider-compatibility",children:"兼容协议"}),o.jsxs("select",{id:"ai-custom-provider-compatibility",value:l,disabled:t,"aria-label":"兼容协议",className:"h-9 rounded-md border border-input bg-background px-3 text-sm",onChange:w=>d(w.target.value),children:[o.jsx("option",{value:"auto",children:"自动探测"}),o.jsx("option",{value:"openai",children:"OpenAI 兼容优先"}),o.jsx("option",{value:"anthropic",children:"Anthropic 兼容优先"})]})]}),o.jsxs("div",{className:"flex flex-col gap-2",children:[o.jsx(Ke,{htmlFor:"ai-custom-provider-base-url",children:"Base URL"}),o.jsx(fe,{id:"ai-custom-provider-base-url",value:f,disabled:t,placeholder:"https://openrouter.ai/api 或 https://openrouter.ai/api/v1",onChange:w=>u(w.target.value)}),o.jsx("p",{className:"text-xs text-muted-foreground",children:"裸域名会自动补齐为 /v1。"})]}),o.jsxs("div",{className:"flex flex-col gap-2",children:[o.jsx(Ke,{htmlFor:"ai-custom-provider-api-key",children:"API Key"}),o.jsx(fe,{id:"ai-custom-provider-api-key",type:"password",value:m,disabled:t,autoComplete:"new-password","data-lpignore":"true",onChange:w=>g(w.target.value)})]}),o.jsxs("div",{className:"flex flex-col gap-2",children:[o.jsx(Ke,{htmlFor:"ai-custom-provider-proxy-url",children:"Proxy URL(可选)"}),o.jsx(fe,{id:"ai-custom-provider-proxy-url",value:y,disabled:t,placeholder:"http://127.0.0.1:7890",onChange:w=>R(w.target.value)})]}),h||n?o.jsx("p",{className:"text-sm text-destructive",children:h??n}):null]}),o.jsxs(Vn,{children:[o.jsx(T,{type:"button",variant:"outline",disabled:t,onClick:()=>r(!1),children:"取消"}),o.jsx(T,{type:"button",disabled:t,onClick:j,children:"保存自定义 Provider"})]})]})})}function wd(e){const t=e.trim(),n=new URL(t);if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error("invalid_custom_base_url");n.hash="";const r=n.pathname.replace(/\/+$/u,"");return!r||r===""?n.pathname="/v1":n.pathname=r,n.href.replace(/\/$/u,"")}function vd(e){return e==="anthropic"?"anthropic-compatible":"openai-compatible"}function Cd({controller:e}){const t=pa(e),[n,r]=p.useState(!1),[a,s]=p.useState(!1),[i,l]=p.useState(),d=async f=>{if(!e.client){l("请先登录后再添加自定义 Provider。");return}s(!0),l(void 0);let u;try{const m=await e.client.createApiKeyCredential("custom",f);u=m.id,await e.client.discoverModels("custom",{offeringId:m.offeringId,credentialId:m.id,compatibility:f.compatibility}),e.selectProvider("custom",m.id),await e.loadProviders(),r(!1)}catch(m){u&&await e.client.deleteProviderCredential("custom",u).catch(()=>{}),l(m instanceof Error?m.message:"AI Connection request failed. Please try again.")}finally{s(!1)}};return o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"flex h-full min-w-0 items-center gap-2 px-3",children:[o.jsxs("div",{className:"relative min-w-0 flex-1",children:[o.jsx(da,{"aria-hidden":"true",className:"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),o.jsx(fe,{type:"search","aria-label":"搜索 Provider",placeholder:"搜索 Provider",value:t,onChange:f=>e.setSearchQuery(f.target.value),className:"h-8 border-transparent bg-muted/50 pl-8 text-xs focus-visible:bg-background"})]}),o.jsx(T,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 shrink-0","aria-label":"添加 AI Connection",title:"添加 AI Connection",onClick:()=>r(!0),children:o.jsx(sn,{className:"h-4 w-4","aria-hidden":"true"})})]}),o.jsx(bd,{open:n,saving:a,error:i,onOpenChange:r,onSave:f=>{d(f)}})]})}function Ed({controller:e}){const t=rr(e),n=or(e),r=ar(e),a=ue.find(i=>i.id===n),s=nr.find(i=>i.id===t)?.title??r[n]?.name??a?.name??n;return o.jsx("div",{className:"flex h-full min-w-0 items-center px-4",children:o.jsx("h1",{className:"truncate text-sm font-medium text-foreground",children:s})})}const Id=["navigation.openExternal","aiClientConfiguration"];function kd(e){const t=xn(e,"Extension manifest");Dr(t.extensionId,"extensionId"),at(t.name,"name"),at(t.version,"version"),at(t.sdkVersion,"sdkVersion");const n=xn(t.contributes,"contributes");if(!Array.isArray(n.applets)||n.applets.length===0)throw new Error("Extension manifest must contribute at least one Applet");const r=new Set;for(const a of n.applets){const s=xn(a,"Applet manifest"),i=Dr(s.appId,"appId");if(r.has(i))throw new Error(`Extension manifest has duplicate appId: ${i}`);if(r.add(i),at(s.name,"Applet name"),at(s.entry,"Applet entry"),!Array.isArray(s.commands))throw new Error("Applet commands must be an array");if(s.layout!=="single-pane"&&s.layout!=="two-pane")throw new Error("Applet layout must be single-pane or two-pane")}if(!Array.isArray(t.dataModels))throw new Error("Extension dataModels must be an array");if(!Array.isArray(t.hostCapabilities))throw new Error("Extension hostCapabilities must be an array");for(const a of t.hostCapabilities)if(!Id.includes(a))throw new Error(`Extension manifest requested unknown Host capability: ${String(a)}`);return e}function xn(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function at(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string`);return e}function Dr(e,t){const n=at(e,t);let r;try{r=new URL(n)}catch{throw new Error(`${t} must be a valid HTTPS URL`)}if(r.protocol!=="https:")throw new Error(`${t} must be a valid HTTPS URL`);return n}const ba=kd({extensionId:"https://undefineds.co/extensions/ai-connections",name:"AI Connection",version:"0.1.0",sdkVersion:"1",contributes:{applets:[{appId:"https://undefineds.co/applets/ai-connections",name:"AI Connection",entry:".",commands:[],layout:"two-pane"}]},dataModels:[],hostCapabilities:["navigation.openExternal","aiClientConfiguration"]}),wa=ba.contributes.applets[0],Pd={manifest:wa,createController:ul,activate(e){e.loadProviders()},slots:{listHeader:Cd,list:bl,mainHeader:Ed,main:yd}},jd={manifest:ba,applets:{[wa.appId]:Pd}};function Ud(){return jd}var Fd=ds(),Sd=us();const bt=Array.from(new Set([...no,"zhipu","ollama","custom"]));function Rd(e){Nd(),za({createQueryEngine:async()=>new fs.QueryEngine});const t=new URL("settings/-/sparql",e.podUrl).toString();return L.setSparqlEndpoint(t),J.setSparqlEndpoint(t),ye.setSparqlEndpoint(t),{async listModels(){return await e.database.init?.(ye),(await e.database.select().from(ye).execute()).map(Ld).filter(At)},async listProviders(){await e.database.init?.(L,J,ye);const n=await e.database.select().from(L).execute(),r=await e.database.select().from(J).execute(),a=await e.database.select().from(ye).execute();return Md(e,n,r,a)},async createApiKeyCredential(n,r){const a=Pe(n);if(!a)throw new Error("unsupported_provider");await e.database.init?.(L,J);const s=L.buildId({id:`${a}-${crypto.randomUUID()}`}),i=1,l=r.offeringId??Wt(a,"apiKey"),d=r.baseUrl??Hr(a,l),f=Cn(r.proxyUrl),u={id:s,provider:a==="custom"?Qd(s):wn(a,l),service:"ai",authMode:"apiKey",status:"active",accountLabel:r.label,label:r.label,baseUrl:d,proxyUrl:f,keyVersion:String(i),reauthRequired:!1,encryptedSecret:Ot(e,a,s,{type:"apiKey",apiKey:r.apiKey}),encryptionAlgorithm:"PLAINTEXT",metadata:{offeringId:l,priority:r.priority??100,enabled:!0,health:"unknown",baseUrl:d,...r.compatibility?{compatibility:r.compatibility}:{}}};return await e.database.insert(L).values(u).execute(),Ce(e,a,u)},async createLocalCredential(n,r){const a=Pe(n);if(!a)throw new Error("unsupported_provider");await e.database.init?.(L,J);const s=L.buildId({id:`${a}-local-${crypto.randomUUID()}`}),i=r.offeringId??Wt(a,"local"),l=r.baseUrl??Hr(a,i),d={id:s,provider:wn(a,i),service:"ai",authMode:"local",status:"active",accountLabel:r.label??"Local",label:r.label??"Local",baseUrl:l,keyVersion:"1",reauthRequired:!1,encryptedSecret:Ot(e,a,s,{type:"local"}),encryptionAlgorithm:"PLAINTEXT",metadata:{offeringId:i,priority:r.priority??100,enabled:!0,health:"unknown",baseUrl:l}};return await e.database.insert(L).values(d).execute(),Ce(e,a,d)},async saveOAuthCredential(n,r){const a=Pe(n);if(!a)throw new Error("unsupported_provider");await e.database.init?.(L,J);const s=L.buildId({id:`${a}-oauth-${crypto.randomUUID()}`}),i={id:s,provider:wn(a,"official-subscription"),service:"ai",authMode:"deviceCodeOAuth",status:"active",accountLabel:"OAuth",label:"OAuth",expiresAt:r.expiresAt,scopes:r.scope?r.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:"1",reauthRequired:!1,encryptedSecret:Ot(e,a,s,{type:"deviceCodeOAuth",accessToken:r.accessToken,refreshToken:r.refreshToken,expiresAt:r.expiresAt,scope:r.scope,idToken:r.idToken}),encryptionAlgorithm:"PLAINTEXT",metadata:{offeringId:"official-subscription",priority:100,enabled:!0,health:"healthy",authoritativeSubject:r.accountSubject}};return await e.database.insert(L).values(i).execute(),Ce(e,a,i)},async updateOAuthCredential(n,r,a,s){const i=Pe(n);if(!i)throw new Error("unsupported_provider");await e.database.init?.(L,J);const l=await e.database.findById(L,r),d=l&&Ce(e,i,l);if(!l||!d||d.authMode!=="deviceCode")throw new Error("oauth_credential_not_found");if(d.version!==a)throw new Error("credential_version_conflict");const f={expiresAt:s.expiresAt,scopes:s.scope?s.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:String(a+1),reauthRequired:!1,status:"active",encryptedSecret:Ot(e,i,r,{type:"deviceCodeOAuth",accessToken:s.accessToken,refreshToken:s.refreshToken,expiresAt:s.expiresAt,scope:s.scope,idToken:s.idToken}),metadata:{...Le(l.metadata),enabled:!0,health:"healthy",authoritativeSubject:s.accountSubject??k(Le(l.metadata)?.authoritativeSubject)}},u=await e.database.updateById(L,r,f);if(!u)throw new Error("credential_version_conflict");return Ce(e,i,u)},async updateProviderCredential(n,r,a){const s=Pe(n);if(!s)throw new Error("unsupported_provider");await e.database.init?.(L,J);const i=await e.database.findById(L,r),l=i&&Ce(e,s,i);if(!i||!l)throw new Error("credential_not_found");if(l.version!==a.expectedVersion)throw new Error("credential_version_conflict");const d={...Le(i.metadata),...a.priority===void 0?{}:{priority:a.priority},...a.enabled===void 0?{}:{enabled:a.enabled},...a.baseUrl===void 0?{}:{baseUrl:a.baseUrl},...a.proxyUrl===void 0?{}:{proxyUrl:Cn(a.proxyUrl)}},f={...a.label===void 0?{}:{accountLabel:a.label,label:a.label},...a.baseUrl===void 0?{}:{baseUrl:a.baseUrl},...a.proxyUrl===void 0?{}:{proxyUrl:Cn(a.proxyUrl)},...a.enabled===void 0?{}:{status:a.enabled?"active":"disabled"},keyVersion:String(l.version+1),metadata:d},u=await e.database.updateById(L,r,f);if(!u)throw new Error("credential_update_failed");const m=Ce(e,s,u);if(!m)throw new Error("credential_update_failed");return m},async markCredentialHealth(n,r,a,s){const i=Pe(n);if(!i)throw new Error("unsupported_provider");await e.database.init?.(L);const l=await e.database.findById(L,r),d=l&&Ce(e,i,l);if(!l||!d)throw new Error("credential_not_found");if(d.version!==s)throw new Error("credential_version_conflict");const f=await e.database.updateById(L,r,{keyVersion:String(d.version+1),metadata:{...Le(l.metadata),health:a}});if(!f)throw new Error("credential_update_failed");const u=Ce(e,i,f);if(!u)throw new Error("credential_update_failed");return u},async deleteProviderCredential(n,r){const a=Pe(n);if(!a)throw new Error("unsupported_provider");await e.database.init?.(L,J);const s=await e.database.findById(L,r),i=s&&Ce(e,a,s);if(i)return await e.database.deleteById(L,r),i},async readCredentialSecret(n,r){const a=Pe(n);if(!a)throw new Error("unsupported_provider");const s=await e.database.findById(L,r);if(!s||!Ce(e,a,s))throw new Error("credential_not_found");const i=Pa(e,a,r,s.encryptedSecret);if(!i)throw new Error("credential_secret_unavailable");return i},async saveDiscoveredModels(n,r,a){const s=Pe(n);if(!s)throw new Error("unsupported_provider");await e.database.init?.(L,J,ye),await Vd(e.database,s);const i=await Nr(e,r),l=Or(s,i);await Kr(e.database,l,wt(s));const d=await e.database.select().from(ye).execute(),f=new Set(d.map(g=>k(g.id)).filter(At)),u=a.map(qd).filter(At),m=new Set(u.map(g=>g.id));for(const g of d.filter(y=>Je(k(y.isProvidedBy),l))){const y=$e(k(g.id),l);y&&!m.has(y)&&k(g.status)!=="unavailable"&&await e.database.updateById(ye,String(g.id),{status:"unavailable"})}for(const g of u)await Jd(e.database,l,g,f)},async saveModelSelection(n,r,a){const s=Pe(n);if(!s)throw new Error("unsupported_provider");await e.database.init?.(J,ye);const i=s==="custom"&&a?await Nr(e,a):null;if(s==="custom"&&a&&!i)throw new Error("credential_not_found");const l=i?Or(s,i):J.buildId({id:s});await Kr(e.database,l,wt(s));const f=(await e.database.select().from(J).execute()).find(h=>Je(k(h.id),l)),u=k(f?.id)??l,m=Ea(f?.hasModel),g=await e.database.select().from(ye).execute(),y=[...new Set(r.map(h=>zd(s,h,g,i?l:void 0)))];if(!await e.database.updateById(J,u,{hasModel:y}))throw new Error("provider_model_selection_update_failed");e.authenticatedFetch&&await Dd(e,u,m,y)}}}const Bd="https://undefineds.co/ns#hasModel";async function Dd(e,t,n,r){const a=bn(J,e.podUrl,t),s=n.map(u=>bn(ye,e.podUrl,u)),i=r.map(u=>bn(ye,e.podUrl,u)),l=u=>u.map(m=>`<${a}> <${Bd}> <${m}> .`).join(`
|
|
9
|
-
`),d=[s.length>0?`DELETE DATA { ${l(s)} }`:void 0,i.length>0?`INSERT DATA { ${l(i)} }`:void 0].filter(u=>!!u);if(d.length===0)return;const f=await e.authenticatedFetch(a.split("#",1)[0],{method:"PATCH",headers:{"content-type":"application/sparql-update"},body:d.join(`;
|
|
10
|
-
`)});if(!f.ok)throw new Error(`provider_model_selection_persist_failed:${f.status}`)}function bn(e,t,n){return/^https?:\/\//u.test(n)?n:e.buildIri(t,{id:n})}async function Nr(e,t){const n=await e.database.findById(L,t);return n||((await e.database.select().from(L).execute()).find(a=>{const s=k(a.id);return s===t||(s?L.buildIri(e.podUrl,{id:s})===t:!1)})??null)}function Nd(){Mr(Fd.ActionObserverHttp.prototype),Mr(Sd.ActionObserverHttp.prototype)}function Mr(e){const t=e;if(t.__xpodObservedActorsPatch)return;const n=t.onRun;t.onRun=function(r,a,s){return Array.isArray(this.observedActors)||(this.observedActors=[]),n.call(this,r,a,s)},t.__xpodObservedActorsPatch=!0}function Md(e,t,n,r){const a=t.filter(s=>k(s.service)==="ai").filter(s=>k(s.status)!=="revoked");return bt.map(s=>{const i=a.map(u=>Ce(e,s,u)).filter(At).sort((u,m)=>u.priority-m.priority||u.id.localeCompare(m.id)),l=n.find(u=>tt(k(u.id))===s),f=Ea(l?.hasModel).map(u=>Td(s,u,r));return{id:s,name:s==="custom"?i.find(u=>u.label)?.label??wt(s):wt(s),offerings:s==="custom"?Gd(a.filter(u=>Ce(e,s,u))):Ia(s,e.openAiSubscriptionImportAvailable===!0),credentials:i,selectedModels:f,status:au(i)}})}function Ot(e,t,n,r){return JSON.stringify({algorithm:"PLAINTEXT",encoding:"base64",ciphertext:Od(r),webId:e.webId,credentialIri:L.buildIri(e.podUrl,{id:n}),provider:t})}function Od(e){const t=new TextEncoder().encode(JSON.stringify(e));let n="";for(const r of t)n+=String.fromCharCode(r);return btoa(n)}function Ce(e,t,n){const r=k(n.id);if(!r)return;const a=cr(k(n.provider))??cu(r);if(a!==t)return;const s=Le(n.metadata),i=du(n.authMode);if(i)return{id:r,provider:a,offeringId:k(s?.offeringId)??lr(k(n.provider))??Wt(a,i),authMode:i,label:k(n.accountLabel)??k(n.label),enabled:Jr(s?.enabled)??k(n.status)==="active",priority:Vr(s?.priority)??100,health:uu(s?.health)??(Jr(n.reauthRequired)?"expired":"healthy"),maskedHint:su(e,a,r,n.encryptedSecret),baseUrl:k(n.baseUrl),proxyUrl:lu(k(n.proxyUrl)??k(s?.proxyUrl)),compatibility:Kd(s?.compatibility),expiresAt:fu(n.expiresAt),version:Vr(n.keyVersion)??0}}function Kd(e){return e==="auto"||e==="openai"||e==="anthropic"?e:void 0}function Td(e,t,n){const r=n.find(l=>Ge(k(l.id))===Ge(t)),a=k(r?.isProvidedBy),s=r?$e(t,a??e)??t:$e(t,e)??t,i=r??n.find(l=>{const d=k(l.id),f=k(l.isProvidedBy);return d===t||$e(d,e)===s||cr(f)===e&&$e(d,f??e)===s});return{id:s,provider:e,offeringId:lr(k(i?.isProvidedBy)),credentialId:va(a),resourceId:k(i?.id)??t,displayName:k(i?.displayName),availability:k(i?.status)==="unavailable"||!i?"unavailable":"available"}}function Ld(e){const t=k(e.isProvidedBy),n=cr(t),r=n&&$e(k(e.id),t??n);if(!(!n||!r))return{id:r,provider:n,offeringId:lr(t),credentialId:va(t),resourceId:k(e.id),displayName:k(e.displayName),availability:k(e.status)==="unavailable"?"unavailable":"available"}}function qd(e){const t=Le(e),n=k(t?.id);if(n)return{id:n,displayName:k(t?.displayName)}}function Or(e,t){const n=k(t?.provider),r=Ge(n),a=tt(n);if(r&&a&&a!==e&&r.includes("#"))return J.buildId({id:r});const s=k(Le(t?.metadata)?.offeringId),i=ir(e,s??Hd(e,a));return i?J.buildId({id:`${e}-${i}.ttl#this`}):J.buildId({id:e})}function wn(e,t){const n=ir(e,t)??t;return J.buildId({id:`${e}-${n}.ttl#this`})}function Qd(e){return J.buildId({id:`custom-instance-${encodeURIComponent(e)}.ttl#this`})}function va(e){const t=tt(e),n=t?.startsWith("custom-instance-")?t.slice(16):void 0;if(n)try{return decodeURIComponent(n)}catch{return}}function ir(e,t){if(!t)return;const n=t.trim().toLowerCase();if(e==="bailian"){if(n==="token-plan")return"token-plan-personal";if(n==="coding-plan")return"coding-plan-pro";if(n==="payg")return"pay-as-you-go"}return n}function Hd(e,t){if(!(!t||t===e)&&e==="bailian"){if(t==="bailian-token-plan")return"token-plan-personal";if(t==="bailian-coding-plan")return"coding-plan-pro"}}function Je(e,t){const n=Ge(e),r=Ge(t);return n!==void 0&&n===r}async function Vd(e,t){const n=J.buildId({id:t});(await e.select().from(J).execute()).some(a=>Je(k(a.id),n))||await e.insert(J).values({id:n,displayName:wt(t)}).execute()}async function Kr(e,t,n){(await e.select().from(J).execute()).some(a=>Je(k(a.id),t))||await e.insert(J).values({id:t,displayName:n}).execute()}async function Jd(e,t,n,r){const a=Ca(t,n.id),s={displayName:n.displayName??n.id,isProvidedBy:t,status:"active"};if(r.has(a)){await e.updateById(ye,a,s);return}await e.insert(ye).values({id:a,...s}).execute(),r.add(a)}function Ca(e,t){const n=Ge(e)??`${e}.ttl`;return`${n.split("#",1)[0]??n}#${encodeURIComponent(t)}`}function zd(e,t,n,r){const a=k(t.resourceId),s=ir(e,k(t.offeringId)),i=r??(s?J.buildId({id:`${e}-${s}.ttl#this`}):J.buildId({id:e})),l=k(t.id),d=l?n.filter(u=>{const m=k(u.isProvidedBy),g=tt(m);return(r?Je(m,r):g===e||g?.startsWith(`${e}-`)===!0)&&$e(k(u.id),m??i)===l}):[],f=r?d[0]:s?d.find(u=>Je(k(u.isProvidedBy),i)):d.length===1?d[0]:void 0;if(a){const u=n.find(h=>k(h.id)===a);if(!u&&f)return String(f.id);const m=k(u?.isProvidedBy),g=tt(m),y=r?Je(m,r):g===e||g?.startsWith(`${e}-`)===!0,R=!!r||!s||Je(m,i);if(!u||!y||!R)throw new Error("invalid_model_selection_resource");return a}if(!l)throw new Error("invalid_model_selection_resource");return k(f?.id)??Ca(i,l)}function $e(e,t){if(!e)return;const r=Ge(t)?.split("#",1)[0]??t,a=r.endsWith(".ttl")?`${r}#`:`${r}.ttl#`,s=e.lastIndexOf(a);if(!(s<0))try{return decodeURIComponent(e.slice(s+a.length))}catch{return e.slice(s+a.length)}}function Ea(e){if(Array.isArray(e))return e.map(k).filter(At);const t=k(e);return t?[t]:[]}function Ia(e,t=!1){return(ou[e]??Wd).map(n=>e==="openai"&&n.id==="official-subscription"&&t?{...n,lifecycle:"active",authModes:["local"]}:{...n})}function Gd(e){const t=new Map;for(const n of e){const r=Le(n.metadata),a=k(r?.offeringId)??"openai-compatible",s=Xd(r?.compatibility,a),i=k(n.baseUrl)??k(r?.baseUrl),l=Kt.find(d=>d.id===a)??Kt.find(d=>d.id===`${s}-compatible`)??Kt[0];t.set(a,{...l,id:a,endpoints:i?[{protocol:s==="anthropic"?"anthropic":"chatCompletions",baseUrl:i}]:l.endpoints,modelDiscovery:s==="anthropic"?{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"}:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"}})}return t.size>0?[...t.values()]:Kt}function Xd(e,t){return e==="anthropic"||t==="anthropic-compatible"?"anthropic":"openai"}const Wd=[{id:"api-platform",label:"API 平台",kind:"api-platform",lifecycle:"active",authModes:["apiKey"]}],Kt=[{id:"openai-compatible",label:"OpenAI 兼容",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],endpoints:[],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"openaiCompatible",url:"/usage"}},{id:"anthropic-compatible",label:"Anthropic 兼容",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],endpoints:[],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"console",url:""}}],vn="https://www.kimi.com/code",Yd="https://www.kimi.com/user/agreement",Zd="https://api.kimi.com/coding/v1",_d="https://api.kimi.com/coding/",$d="https://platform.moonshot.cn/console/api-keys",Tr="https://platform.moonshot.cn/console/account",eu="https://platform.moonshot.cn/docs/intro",tu="https://api.moonshot.ai/v1",Tt="https://bailian.console.aliyun.com/",Lt="https://help.aliyun.com/zh/model-studio/",Lr="https://open.bigmodel.cn/usercenter/apikeys",qr="https://open.bigmodel.cn/",nu="https://open.bigmodel.cn/api/paas/v4",ru="https://open.bigmodel.cn/api/coding/paas/v4",ou={openai:[{id:"official-subscription",label:"OpenAI Subscription",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth"],productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:[],consoleUrl:"https://chatgpt.com/codex",subscriptionUrl:"https://chatgpt.com/codex",endpoints:[],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"responses"},quota:{strategy:"subscription",url:"https://chatgpt.com/codex"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"},{id:"api-platform",label:"API 平台",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.openai.com/api-keys",subscriptionUrl:"https://platform.openai.com/settings/organization/billing/overview",endpoints:[{protocol:"responses",baseUrl:"https://api.openai.com/v1"},{protocol:"chatCompletions",baseUrl:"https://api.openai.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"responses"},quota:{strategy:"providerApi",url:"https://platform.openai.com/usage"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"}],anthropic:[{id:"official-subscription",label:"Claude Code 订阅",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth"],productLabel:"Anthropic",runtimeProviderIds:["anthropic"],credentialPrefixHints:[],consoleUrl:"https://claude.ai/",subscriptionUrl:"https://claude.ai/settings/billing",endpoints:[],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"subscription",url:"https://claude.ai/settings/usage"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"},{id:"api-platform",label:"API 平台",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"Anthropic",runtimeProviderIds:["anthropic"],credentialPrefixHints:["sk-ant-"],consoleUrl:"https://console.anthropic.com/settings/keys",subscriptionUrl:"https://console.anthropic.com/settings/plans",endpoints:[{protocol:"anthropic",baseUrl:"https://api.anthropic.com/v1"}],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"console",url:"https://console.anthropic.com/settings/limits"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"}],kimi:[Qr({id:"subscription-key",label:"Token 套餐",kind:"token-plan",authModes:["apiKey"],productLabel:"Kimi Coding",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-kimi-"],baseUrl:Zd,anthropicBaseUrl:_d,quotaStrategy:"subscription",quotaUrl:vn,consoleUrl:vn,subscriptionUrl:vn,usagePolicyUrl:Yd}),Qr({id:"api-platform",label:"API 平台",kind:"api-platform",authModes:["apiKey"],productLabel:"Moonshot AI",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-"],baseUrl:tu,quotaStrategy:"console",quotaUrl:Tr,consoleUrl:$d,subscriptionUrl:Tr,usagePolicyUrl:eu})],bailian:[qt({id:"pay-as-you-go",label:"Pay as You Go",kind:"api-platform",runtimeProviderIds:["bailian"],credentialPrefixHints:["sk-"],region:"cn",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"console",consoleUrl:Tt,usagePolicyUrl:Lt}),qt({id:"token-plan",label:"Token Plan Personal",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:Tt,usagePolicyUrl:Lt}),qt({id:"token-plan-team",label:"Token Plan Team",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:Tt,usagePolicyUrl:Lt}),qt({id:"coding-plan",label:"Coding Plan Pro",kind:"token-plan",runtimeProviderIds:["bailian-coding-plan"],credentialPrefixHints:["sk-sp-"],region:"cn",baseUrl:"https://coding.dashscope.aliyuncs.com/v1",anthropicBaseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:Tt,usagePolicyUrl:Lt})],deepseek:[{id:"api-platform",label:"API 平台",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"DeepSeek",runtimeProviderIds:["deepseek"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.deepseek.com/api_keys",subscriptionUrl:"https://platform.deepseek.com/usage",endpoints:[{protocol:"chatCompletions",baseUrl:"https://api.deepseek.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://platform.deepseek.com/usage"},usagePolicyUrl:"https://cdn.deepseek.com/policies/en-US/deepseek-open-platform-terms-of-use.html",region:"global"}],zhipu:[{id:"api-platform",label:"API 平台",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:Lr,subscriptionUrl:"https://open.bigmodel.cn/finance-center/expense-manage",endpoints:[{protocol:"chatCompletions",baseUrl:nu,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://open.bigmodel.cn/finance-center/expense-manage"},usagePolicyUrl:qr,region:"cn"},{id:"coding-plan",label:"GLM Coding Plan",kind:"token-plan",lifecycle:"active",authModes:["apiKey"],productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:Lr,subscriptionUrl:"https://bigmodel.cn/glm-coding",endpoints:[{protocol:"chatCompletions",baseUrl:ru,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"subscription",url:"https://bigmodel.cn/glm-coding"},usagePolicyUrl:qr,region:"cn"}]};function Qr(e){return{id:e.id,label:e.label,kind:e.kind,lifecycle:"active",authModes:e.authModes,productLabel:e.productLabel,runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.subscriptionUrl,endpoints:ka(e.baseUrl,e.anthropicBaseUrl,"cn"),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.quotaUrl},usagePolicyUrl:e.usagePolicyUrl,region:"cn"}}function qt(e){return{id:e.id,label:e.label,lifecycle:"active",productLabel:"Alibaba Bailian",kind:e.kind,authModes:["apiKey"],runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.consoleUrl,endpoints:ka(e.baseUrl,e.anthropicBaseUrl,e.region),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.consoleUrl},usagePolicyUrl:e.usagePolicyUrl,region:e.region}}function ka(e,t,n){return[{protocol:"chatCompletions",baseUrl:e,region:n},...t?[{protocol:"anthropic",baseUrl:t,region:n}]:[]]}function au(e){return e.some(t=>t.health==="expired"||t.health==="invalid")?"attention":e.some(t=>t.enabled)?"available":e.length>0?"configured":"unconfigured"}function wt(e){switch(e){case"openai":return"OpenAI";case"anthropic":return"Anthropic";case"kimi":return"Kimi";case"bailian":return"百炼";case"deepseek":return"DeepSeek";case"zhipu":return"智谱 AI";case"ollama":return"Ollama";case"custom":return"Custom"}}function Wt(e,t){return e==="openai"&&(t==="local"||t==="oauth"||t==="deviceCode")||e==="kimi"&&(t==="oauth"||t==="deviceCode")?"official-subscription":e==="bailian"?"pay-as-you-go":e==="custom"?"openai-compatible":"api-platform"}function Hr(e,t){const n=Ia(e).find(a=>a.id===(t??Wt(e,"apiKey")));if(!n)return;const r=n.modelDiscovery?.endpointProtocol;return n.endpoints?.find(a=>a.protocol===r)?.baseUrl??n.endpoints?.[0]?.baseUrl}function su(e,t,n,r){const a=Pa(e,t,n,r),s=k(a?.apiKey);if(s)return s.length<=8?`${s.slice(0,2)}…`:`${s.slice(0,3)}...${s.slice(-4)}`}function Pa(e,t,n,r){if(!(typeof r!="string"||!r.trim()))try{const a=JSON.parse(r);if(a.algorithm!=="PLAINTEXT"||a.webId!==e.webId||a.provider!==t)return;const s=L.buildIri(e.podUrl,{id:n});if(a.credentialIri!==s)return;const i=a.encoding==="base64"?iu(String(a.ciphertext)):JSON.parse(String(a.ciphertext));return Le(i)}catch{return}}function iu(e){const t=atob(e),n=Uint8Array.from(t,r=>r.charCodeAt(0));return JSON.parse(new TextDecoder().decode(n))}function cr(e){const t=tt(e),n=Pe(t);return n||bt.find(r=>t?.startsWith(`${r}-`))}function lr(e){const t=tt(e);if(t&&!t.startsWith("custom-instance-")){if(t==="bailian-token-plan-personal")return"token-plan";if(t==="bailian-token-plan-team")return"token-plan-team";if(t==="bailian-coding-plan-pro")return"coding-plan";if(t==="bailian-pay-as-you-go")return"pay-as-you-go";for(const n of bt)if(t.startsWith(`${n}-`))return t.slice(n.length+1)}}function cu(e){const t=/\/([^/#]+)\.ttl#/u.exec(e);return Pe(t?.[1])}function Pe(e){if(typeof e!="string"||!e.trim())return;const t=e.trim().toLowerCase();if(t==="zhipu"||t.startsWith("zhipu-"))return"zhipu";if(bt.includes(t))return t;for(const n of bt)if(t.startsWith(`${n}-`)||n==="bailian"&&(t==="bailian-token-plan"||t==="bailian-coding-plan"))return n}function Cn(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{throw new Error("invalid_proxy_url")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password||t.hash||!t.hostname)throw new Error("invalid_proxy_url");return t.toString().replace(/\/$/u,"")}function lu(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{return}if(!(!["http:","https:"].includes(t.protocol)||!t.hostname))return t.username="",t.password="",t.search="",t.hash="",t.toString().replace(/\/$/u,"")}function Ge(e){if(!e)return;const t=e.split("#",1)[0]??e,n=t.split("/").filter(Boolean).at(-1)??t;if(!n)return;const r=n.endsWith(".ttl")?n:`${n}.ttl`,a=e.indexOf("#");return a<0?r:`${r}${e.slice(a)}`}function tt(e){const t=Ge(e);if(t)return(t.split("#",1)[0]??t).replace(/\.ttl$/u,"")}function du(e){if(e==="oauth"||e==="deviceCode"||e==="apiKey"||e==="local")return e;if(e==="deviceCodeOAuth")return"deviceCode"}function uu(e){if(e==="healthy"||e==="expired"||e==="invalid"||e==="unknown")return e;if(e==="reauthRequired")return"expired";if(e==="disabled")return"unknown"}function Le(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function k(e){return typeof e=="string"&&e.trim()?e:void 0}function Vr(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()){const t=Number(e);return Number.isFinite(t)?t:void 0}}function Jr(e){if(typeof e=="boolean")return e;if(e==="true")return!0;if(e==="false")return!1}function fu(e){return e instanceof Date?e.toISOString():k(e)}function At(e){return e!==void 0}const ja=Ud(),zr=ja.manifest.contributes.applets[0]?.appId,Ua=zr?ja.applets[zr]:void 0;if(!Ua)throw new Error("AI Connection extension did not contribute an applet");const pu=Ua;function Gr(e){switch(e.state.status){case"loading":return{status:"initializing"};case"anonymous":return{status:"anonymous"};case"authenticated":return{status:"authenticated",webId:e.state.webId};case"expired":return e.state.webId?{status:"expired",webId:e.state.webId}:{status:"expired"};case"error":return e.state.webId?{status:"error",webId:e.state.webId,error:e.state.error}:{status:"error",error:e.state.error}}}function mu(e){const t=Ga({runtime:e}),n=e.currentPod?.podUrl??e.selectedStorage?.storageUrl??e.podUrl,r=e.currentPod?{status:"ready",current:e.currentPod}:e.podError?{status:"error",error:e.podError.error}:e.state.status==="authenticated"?{status:"opening"}:e.state.status==="error"?{status:"error",error:e.state.error}:{status:"unavailable"},a=window.fetch.bind(window);return{solid:{session:{getSnapshot:()=>Gr(e),subscribe:s=>e.session.subscribe(()=>{s(Gr(e))}),fetch:e.fetch},pod:r,permissions:{...Yi({fetch:e.fetch})},requireLogin:async()=>{await t.startLogin()}},navigation:{openExternal:async s=>{window.open(s,"_blank","noopener,noreferrer")}},capabilities:{aiConnectionsPodStore:e.currentPod?Rd({database:e.currentPod.database,authenticatedFetch:e.fetch,podUrl:e.currentPod.podUrl,webId:e.currentPod.webId,openAiSubscriptionImportAvailable:globalThis.xpodDesktop!==void 0}):void 0,aiClientConfiguration:n&&(globalThis.xpodDesktop!==void 0||e.aiClientConfiguration?.available===!0&&e.aiClientConfiguration.authority==="local-filesystem")?Za({podUrl:n,authenticatedFetch:e.fetch,invocationFetch:a}):void 0}}}function hu(e){const t=p.useMemo(()=>mu(e),[e]);return p.useMemo(()=>{const n=nc(pu,t);if(n.layout!=="two-pane")throw new Error("AI Connection applet must use a two-pane layout");return n},[t])}function Iu(){const e=Xa(),t=hu(e);return o.jsx($a,{listHeader:t.slots.listHeader,list:t.slots.list,mainHeader:t.slots.mainHeader,main:t.slots.main,mode:"auto"})}export{Iu as default};
|