@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
|
@@ -2,16 +2,21 @@ const openaiAvatar = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYA
|
|
|
2
2
|
const anthropicAvatar = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAB7CAAAewgFu0HU+AAAQfElEQVR4nO3d2VdVd54F8H1BAYOCCHFIHCtqola0FKfEKYACAl5ABq1V9dBrddZKPXSvrpd66Zfu537p4aH/hZZJrldAcEKknEAkIXGIYBRHEkFAQJCxHwhrJSnzK8V97jnn3v15TMy+N+rmnt895/f9eXp7OiYgIq8UZvcbEHEyFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMVBBRAxUEBEDFUTEQAURMZhh9xtwmv87UoIjR0roufv3p+JPX3xOyzt79hz++3/+l5YHAIcPF+D3hwuomW7n6e3pmLD7TTjFxMQEUtO8uH//AT177txY1J8/hYiICEpef/8Adu5MweDQECUPAJYtXYKaGj88Hg8t0+10ifUTly83WFIOAOjp6cWpU2dpebNnRyMjM52WBwDt9x+gsbGJmul2KshPFJccdVX+4UP51DwAKCoqo2e6mQryo+7uHupP+Fe5fLkB7cRPqPXrf4sPP1xNywOAmpOn0d3dQ810MxXkR+U+P0ZGRix/neKiUmpeQUEuNW9kZATlPj81081UEEwuzgN1aXG0nFvEbG8WoqIiaXkAUFJSTs1zMxUEQGNjE+7daw/Iaz171o2ztXW0vJiYOdifnkrLA4DvvruLq1evUTPdSgUBUFIa2J+YRUe4l1mHrFisF2uxDqgg6O3tRXX1qYC+5sVLV/DgwUNa3saNG7By5W9oeQBQXX0Kvb291Ew3CvmC+HwVGB4eDuhrTkxM0K/zCwvyqHnDw8M45q+kZrpRyBekqJh7ufO6yo4ew9jYGC0vJyeLdpd+SnGxtfeF3CCkC3Lt2pe4c+euLa/d2dmJ2trztLzY2Fikp++j5QFAa2sbmpu/oma6TUgXpNjmhSh7IVxYcJCaBwBF5Ps2bhOyBXn+vA8nqk/a+h7q6y/g8eMntLzNmzdh+fJltDwAOFF9Es+f91Ez3SRkC3LMX4GhoZe2vofJxTrvOt/j8eDQIe5ifWjoJSoqTlAz3SRkC+KUh/KOlvsxNjZOy8vN8WLmzJm0PMC+LzKcICQL0tLyDVpb2+x+GwCAjo7vUXe+npYXFzcXaal7aXkAcOvWbbS0fEPNdIuQLMgRhy08i8mfZvn5OdQ8wHm/Z4EScgXp7x9AVWW13W/jZ+rO/xVPnnTQ8rZv34qlS5fQ8gCgqrIaAwMD1Ew3CLmC+P2V1G2qDOPj4ygv5z1i7vF4cKiQu1gfHBpChcN+sARCyBWkpNSZd4dLSo5ifJy4WM/1YsYM7kwO9kOWbhBSBbl+/QZu3Lhl99t4pcdPOlBff5GWFx8/DykpSbQ8ALh+4yauX79BzXS6kCqI0xea7K9TCwv5d9ad/nvIFjIFGRgYQEUF9xp6/vx3qXnnzp3H06edtLxPP9mGxYvfp+UBQGVlDQYHB6mZThYyBamsrMGLFy+omf/1n/9Bvc4fGxtH2VEfLS8sLIy+Z31gYACVIbRYD5mCFJdw7zUkJm5EYuJGJCftoeaWlJRTF+v5eTkIDw+n5QGhdZkVEgW5efNbfP31dWpmwY9Pzubnc39CP3z4CBcvXaHlJSQkIClpNy0PAL7++jpu3vyWmulUIVEQ9mPl0dHRSE+bfJxj585PsWDBfGo+++tU9m5DgP+J7FRBX5DBwUH4yVtHMzPTMGvWLABAeHgYDuZ6qflna+vQ1fWMlrdr16d4b9FCWh4AHD9e5bgbrlYI+oJUnThJf0QiP+/nl1V5eTnU/NHRUeqd9cnFOvcr376+fpw4Ye9+mkAI+oKUkC+vVq1aiQ0bPv7ZP1uyZDG2bdtCfZ2i4jJMTPAG7+fn5yIsjPvHzZ4S6URBXZDbt1vR/GULNTP/Vz4tCsiL9fv3H+Dy5QZa3vz572LP7p20PABo/rIFt2+3UjOdJqgLwt4UNXPmTGRnZ73y36WmpmDOnNnU12NPgy8k7zYEgn9MadAW5OXLlzjmr6BmJid/hri4ua/8d5GRkThwIIP6eqdOnaVOWt+zexcWLlxAywMA37EKvHxp79ZlKwVtQaqrT6Gvr5+aWfB3NiKx74mwJ62Hh4fR3+Pz588DPpkykIK2IOx7H4sWLcSOHZ8Yf826tWuwZs2H1NctKuIu1vPycuhHrAXzHN+gLEhb23doamqmZubmel/rWyD2T+h799qpx6K9t2ghdu3aQcsDgKamZtsG8FktKAvC/onm8Xh+9durX/IeyKCPAGVPn2fvNgScuxHtbQVdQYaHh+EnL863b9+K999/77V+bUxMDNJSU6ivz560npS0G+++m0DLA4Dycn/Ah4AHQtAVpObkGfT0cMf2v+k9Dvad9eHhYfh8vNKHh4fT79v09PSi5uQZaqYTBF1B2Hd3Y2JisG9f8hv9N9u2baFvVGLvNjx4MJu+WA/GO+tBVZC7d++hgXzO93TWFGFhYcg7mE19H3fu3MW1a1/S8pYsWYxPP9lGywOAhsYmtLffp2baLagKYsV5FtN9yO91v/V6E+xp9IcO849us3tiPlvQFGRkZAS+Y8epmevWrsFHH03vHPLXuW/yptiT1lOSP0NCfDwtD+Cf4mu3oCnI6dO1ePasm5r5tvu52fvBh4a4j8/MmDEDuQe5e1mePevG6dO11Ew7BU1B2Puko6IikZm5/60ykpP2/OqzW9PFfgCTvU8ECK4960FRkHbyo+EAkJq6FzExc94qw/T073S1trZRJ60vW7oE27dvpeUBwJUrjdRTfO0UFAUpK/XRM1/3zvnfzSHfbwD4P6EPk89Zt+IUX7u4viCjo6MoK/NRM5cuXYKtWzdTslat/OBvdiC+rarKavT387YR792bhHnz4mh5AFBW5sPo6Cg10w6uL8iZs+fQ2dVFzWTfRGPftR4cGqIOorDiUrCzqwtnzp6jZtrB9QVhj8ix4iZfRkYaZkVFUTNLXfAAYzCcs+7qgjx69Jg6ZA0Adu/eQZ+5Gx0djYyMNGome9L6ihXLsXVLIi0PAC5cuEQ9xdcOri5IaWk5dTMR8LcjfVjYDzAC/MV6oSWLdXd/iri2IGNjY/R9EvHx8+hjOqckJm6kn2FeUcE9Fi0tNQWxsbG0PGByL8vY2Bg1M5BcW5DaWu5RAQCQ7c2in8r0U+ybci9evEBlZQ0tLyIigr5Yf/q0E7W156mZgeTaglgxG5b9aMgv5WRn0iets38frFiss79QCCTrflxa6An5uDIAWL16FSIjI/Ho0WNq7i8lJm5EQ8NVWt7UpHXWsIiVK3+DxMSN1D39U6f4LiLPBw4EVxaktMxHPUMDmJzCmJzCnWsVKEXFZfj3f/tXWt6hwjxqQcbHx1Fa5sM//9OfaJmB4rpLrLGxcVd/ZFvB76+kHouWlraPPiWytLQcY2PcH2qB4LqC1J2vR0fH93a/DUcZGBhAFXHSelRUJLK93MV6R8f3qK+/QM0MBNcVJFgegmNjT7E/ZMEcXzceuuOqgvzww1PU1bn3K0MrsSetr169Cht/t56WB0ye4vvDD0+pmVZzVUHceh0bKE7fTOXG9aNrCjI+Pu76xxasdszPnbSekZGG6OhoWh4AlJQcpX8DaSXXFOTChUt4/KTD7rfhaH19/dRJ67NmzYLXm0nLA4DHTzroD5hayTUFCYZHpwOBPZfYijvr7C0KVnJFQTo7O4Ni800gNDU1o63tO1remjUf4uOP19HygB83uXVyn6OziisKUlrmc/UToYHG/hThL9bHUEreJm0VxxdkcnHurm8+7Ob3V1AnrWdlpuOdd96h5QFAaamPvpfHCo4vyJUrjXj48JHdb8NV2JPWo6OjkZWVTssDgAcPHtJHNVnB8QUJpiFkgcSetM4eDQS448/W0QXp6noWVGMsA6mhsQl3796j5a1btxZr135EywMmx8V2dT2jZrI5uiDl5f6gmK1kF/barSCfu1gfHR1FeTnvFF8rOLYgExMTQTdKP9DKfdxJ615vJn18UYkFgzeYHLthqrGxCe33H1AzFy1aiO3btlAzma41f0U9gGZq0vr+/amUvNmzo5GRmU6dZDl1ii9rkiWbYwvCfvAOAD7//B/wxz8cpueyVFefwr/8+S/UzCNFpbSCAJOLdfao16KiMscWxJGXWN3dPag5eZqaGRERAe8BZ2+pTU7eg7lzuWN3Ll9uoH4Sr1//W6xatZKWBwA1J0+ju7uHmsniyIKwr52ByZlPMTEx1Ey2iIgIeMk7+QD+9Hv2ZqqRkRH4fNzTwVgcWRAr9gxYMdnQCgX5OfRM9qT1bG8WoqIiaXkAUFLqzIdRHVeQq1ev4c6du9TMxYvfpx8SY5XVq1fRHw5kT1qPiZmD/em8dQ0weYrv1avXqJkMjisI+0E7AMiz4ExwK1lx6A77EfNCKx6Dd+DX+o4qSG9vL3XDDzB5nEFuLvegSqtlZe6n32+4eOkKdSjepk2/wwcfrKDlAZPf4vX29lIz35ajCnLMX0l9ChUAduz4xHUT/WbPjkZa+j5q5sTEhAVninCfzxoeHob/eBU18205qiBW7Bq0et6uVVhnJP4Ue9J6Tk4WIiIiaHmANfe/3oZjCtLc/BVaW9uomXFxc5GctIeaGSibN2/CsmVLqZnsSeuxsbFIJ3/Stba2obn5K2rm23BMQYosePQ5J+cAZs6cSc8NBI/HY8mnCHt4mxXnrFvxd2G6HFGQvr5+nKjmjc6c4pZ7H7/m4EEvwsO5f0T19RfxhDgdZsvmTfSDgU5Un0RfXz81c7ocUZDjx6swNMSb5wQAGzZ8jFUrP6BmBlpCQgL27N5FzZyatM7i8Xjod9aHhl7iuEMW644oSFEx/yOVffSyXay4J8KeUJmb46Vfylrxd2I6bC9IS8s3uHXrNjVzVlQU/VRZu3z22S4kxMdTMzs6vkfd+XpaXlzcXKSmptDyAODWrdtoafmGmjkdthfEin3JVozMtEt4eDhycg/Qc/m7DfmfdE7Ys25rQQYGBlBVxTuEcorbF+e/ZMVfvro67qT17du3YunSJbQ8AKiqqqGe4jsdthakorKaejISAKxYsRyJiRupmXZbvnwZ/f+JPWnd4/HQx5QODg6iorKamvmmbC2IFTNarVjUOoEV9xvYk9Zzc730Y7TtnuNr25bbzs5OLFy0AAsXLaDm5mRzp5E7RXraXpw5U0s/OqC9/T5WrFhOyYqPn4cvvvhH3Lr1LSVvSmdnJxISEqiZr8vT29Ph3JESIjaz/VssESdTQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARAxVExEAFETFQQUQMVBARg/8H+vaH9zU+MiYAAAAASUVORK5CYII=';
|
|
3
3
|
const kimiAvatar = '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=';
|
|
4
4
|
const deepseekAvatar = 'data:image/png;base64,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';
|
|
5
|
-
const bailianAvatar =
|
|
5
|
+
const bailianAvatar = 'data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%20200%20200%27%3E%3Crect%20width%3D%27200%27%20height%3D%27200%27%20fill%3D%27%23FF6A00%27/%3E%3Cpath%20d%3D%27M%2062%2066%20L%2036%20100%20L%2062%20134%27%20fill%3D%27none%27%20stroke%3D%27%23FFFFFF%27%20stroke-width%3D%2716%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27/%3E%3Cpath%20d%3D%27M%20138%2066%20L%20164%20100%20L%20138%20134%27%20fill%3D%27none%27%20stroke%3D%27%23FFFFFF%27%20stroke-width%3D%2716%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27/%3E%3Crect%20x%3D%2782%27%20y%3D%2791%27%20width%3D%2736%27%20height%3D%2718%27%20rx%3D%279%27%20fill%3D%27%23FFFFFF%27/%3E%3C/svg%3E';
|
|
6
|
+
const zhipuAvatar = 'data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%20200%20200%27%3E%3Cdefs%3E%3ClinearGradient%20id%3D%27g%27%20x1%3D%270%27%20y1%3D%270%27%20x2%3D%271%27%20y2%3D%271%27%3E%3Cstop%20offset%3D%270%27%20stop-color%3D%27%237A5CFF%27/%3E%3Cstop%20offset%3D%271%27%20stop-color%3D%27%234A6CF7%27/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect%20width%3D%27200%27%20height%3D%27200%27%20fill%3D%27url%28%23g%29%27/%3E%3Cpath%20fill%3D%27%23FFFFFF%27%20fill-rule%3D%27evenodd%27%20d%3D%27M100%2036%20L156%2068%20L156%20132%20L100%20164%20L44%20132%20L44%2068%20Z%20M100%2064%20C102.5%2086%20114%2097.5%20136%20100%20C114%20102.5%20102.5%20114%20100%20136%20C97.5%20114%2086%20102.5%2064%20100%20C86%2097.5%2097.5%2086%20100%2064%20Z%27/%3E%3C/svg%3E';
|
|
7
|
+
const ollamaAvatar = 'data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cpath%20d%3D%22M16.361%2010.26a.894.894%200%200%200-.558.47l-.072.148.001.207c0%20.193.004.217.059.353.076.193.152.312.291.448.24.238.51.3.872.205a.86.86%200%200%200%20.517-.436.752.752%200%200%200%20.08-.498c-.064-.453-.33-.782-.724-.897a1.06%201.06%200%200%200-.466%200zm-9.203.005c-.305.096-.533.32-.65.639a1.187%201.187%200%200%200-.06.52c.057.309.31.59.598.667.362.095.632.033.872-.205.14-.136.215-.255.291-.448.055-.136.059-.16.059-.353l.001-.207-.072-.148a.894.894%200%200%200-.565-.472%201.02%201.02%200%200%200-.474.007Zm4.184%202c-.131.071-.223.25-.195.383.031.143.157.288.353.407.105.063.112.072.117.136.004.038-.01.146-.029.243-.02.094-.036.194-.036.222.002.074.07.195.143.253.064.052.076.054.255.059.164.005.198.001.264-.03.169-.082.212-.234.15-.525-.052-.243-.042-.28.087-.355.137-.08.281-.219.324-.314a.365.365%200%200%200-.175-.48.394.394%200%200%200-.181-.033c-.126%200-.207.03-.355.124l-.085.053-.053-.032c-.219-.13-.259-.145-.391-.143a.396.396%200%200%200-.193.032zm.39-2.195c-.373.036-.475.05-.654.086-.291.06-.68.195-.951.328-.94.46-1.589%201.226-1.787%202.114-.04.176-.045.234-.045.53%200%20.294.005.357.043.524.264%201.16%201.332%202.017%202.714%202.173.3.033%201.596.033%201.896%200%201.11-.125%202.064-.727%202.493-1.571.114-.226.169-.372.22-.602.039-.167.044-.23.044-.523%200-.297-.005-.355-.045-.531-.288-1.29-1.539-2.304-3.072-2.497a6.873%206.873%200%200%200-.855-.031zm.645.937a3.283%203.283%200%200%201%201.44.514c.223.148.537.458.671.662.166.251.26.508.303.82.02.143.01.251-.043.482-.08.345-.332.705-.672.957a3.115%203.115%200%200%201-.689.348c-.382.122-.632.144-1.525.138-.582-.006-.686-.01-.853-.042-.57-.107-1.022-.334-1.35-.68-.264-.28-.385-.535-.45-.946-.03-.192.025-.509.137-.776.136-.326.488-.73.836-.963.403-.269.934-.46%201.422-.512.187-.02.586-.02.773-.002zm-5.503-11a1.653%201.653%200%200%200-.683.298C5.617.74%205.173%201.666%204.985%202.819c-.07.436-.119%201.04-.119%201.503%200%20.544.064%201.24.155%201.721.02.107.031.202.023.208a8.12%208.12%200%200%201-.187.152%205.324%205.324%200%200%200-.949%201.02%205.49%205.49%200%200%200-.94%202.339%206.625%206.625%200%200%200-.023%201.357c.091.78.325%201.438.727%202.04l.13.195-.037.064c-.269.452-.498%201.105-.605%201.732-.084.496-.095.629-.095%201.294%200%20.67.009.803.088%201.266.095.555.288%201.143.503%201.534.071.128.243.393.264.407.007.003-.014.067-.046.141a7.405%207.405%200%200%200-.548%201.873c-.062.417-.071.552-.071.991%200%20.56.031.832.148%201.279L3.42%2024h1.478l-.05-.091c-.297-.552-.325-1.575-.068-2.597.117-.472.25-.819.498-1.296l.148-.29v-.177c0-.165-.003-.184-.057-.293a.915.915%200%200%200-.194-.25%201.74%201.74%200%200%201-.385-.543c-.424-.92-.506-2.286-.208-3.451.124-.486.329-.918.544-1.154a.787.787%200%200%200%20.223-.531c0-.195-.07-.355-.224-.522a3.136%203.136%200%200%201-.817-1.729c-.14-.96.114-2.005.69-2.834.563-.814%201.353-1.336%202.237-1.475.199-.033.57-.028.776.01.226.04.367.028.512-.041.179-.085.268-.19.374-.431.093-.215.165-.333.36-.576.234-.29.46-.489.822-.729.413-.27.884-.467%201.352-.561.17-.035.25-.04.569-.04.319%200%20.398.005.569.04a4.07%204.07%200%200%201%201.914.997c.117.109.398.457.488.602.034.057.095.177.132.267.105.241.195.346.374.43.14.068.286.082.503.045.343-.058.607-.053.943.016%201.144.23%202.14%201.173%202.581%202.437.385%201.108.276%202.267-.296%203.153-.097.15-.193.27-.333.419-.301.322-.301.722-.001%201.053.493.539.801%201.866.708%203.036-.062.772-.26%201.463-.533%201.854a2.096%202.096%200%200%201-.224.258.916.916%200%200%200-.194.25c-.054.109-.057.128-.057.293v.178l.148.29c.248.476.38.823.498%201.295.253%201.008.231%202.01-.059%202.581a.845.845%200%200%200-.044.098c0%20.006.329.009.732.009h.73l.02-.074.036-.134c.019-.076.057-.3.088-.516.029-.217.029-1.016%200-1.258-.11-.875-.295-1.57-.597-2.226-.032-.074-.053-.138-.046-.141.008-.005.057-.074.108-.152.376-.569.607-1.284.724-2.228.031-.26.031-1.378%200-1.628-.083-.645-.182-1.082-.348-1.525a6.083%206.083%200%200%200-.329-.7l-.038-.064.131-.194c.402-.604.636-1.262.727-2.04a6.625%206.625%200%200%200-.024-1.358%205.512%205.512%200%200%200-.939-2.339%205.325%205.325%200%200%200-.95-1.02%208.097%208.097%200%200%201-.186-.152.692.692%200%200%201%20.023-.208c.208-1.087.201-2.443-.017-3.503-.19-.924-.535-1.658-.98-2.082-.354-.338-.716-.482-1.15-.455-.996.059-1.8%201.205-2.116%203.01a6.805%206.805%200%200%200-.097.726c0%20.036-.007.066-.015.066a.96.96%200%200%201-.149-.078A4.857%204.857%200%200%200%2012%203.03c-.832%200-1.687.243-2.456.698a.958.958%200%200%201-.148.078c-.008%200-.015-.03-.015-.066a6.71%206.71%200%200%200-.097-.725C8.997%201.392%208.337.319%207.46.048a2.096%202.096%200%200%200-.585-.041Zm.293%201.402c.248.197.523.759.682%201.388.03.113.06.244.069.292.007.047.026.152.041.233.067.365.098.76.102%201.24l.002.475-.12.175-.118.178h-.278c-.324%200-.646.041-.954.124l-.238.06c-.033.007-.038-.003-.057-.144a8.438%208.438%200%200%201%20.016-2.323c.124-.788.413-1.501.696-1.711.067-.05.079-.049.157.013zm9.825-.012c.17.126.358.46.498.888.28.854.36%202.028.212%203.145-.019.14-.024.151-.057.144l-.238-.06a3.693%203.693%200%200%200-.954-.124h-.278l-.119-.178-.119-.175.002-.474c.004-.669.066-1.19.214-1.772.157-.623.434-1.185.68-1.382.078-.062.09-.063.159-.012z%22/%3E%3C/svg%3E';
|
|
6
8
|
const providerAvatars = {
|
|
7
9
|
openai: openaiAvatar,
|
|
8
10
|
anthropic: anthropicAvatar,
|
|
9
11
|
kimi: kimiAvatar,
|
|
10
12
|
bailian: bailianAvatar,
|
|
13
|
+
zhipu: zhipuAvatar,
|
|
14
|
+
ollama: ollamaAvatar,
|
|
11
15
|
deepseek: deepseekAvatar,
|
|
12
16
|
};
|
|
13
17
|
const providerAvatarBackgrounds = {
|
|
14
18
|
kimi: '#000000',
|
|
19
|
+
ollama: '#FFFFFF',
|
|
15
20
|
};
|
|
16
21
|
export function getProviderAvatar(provider) {
|
|
17
22
|
return providerAvatars[provider];
|
|
@@ -160,6 +160,11 @@ class LdpExecutor {
|
|
|
160
160
|
body: sparql
|
|
161
161
|
});
|
|
162
162
|
via = 'patch';
|
|
163
|
+
if (await this.shouldFallbackToN3Patch(response)) {
|
|
164
|
+
const n3Result = await this.executeN3PatchInternal(docResourceUrl, [], triples);
|
|
165
|
+
response = new Response(null, { status: n3Result[0]?.status ?? 200 });
|
|
166
|
+
via = 'n3';
|
|
167
|
+
}
|
|
163
168
|
if (response.status === 404) {
|
|
164
169
|
const body = triples.join('\n');
|
|
165
170
|
response = await this.fetchFn(docResourceUrl, {
|
|
@@ -180,6 +185,11 @@ class LdpExecutor {
|
|
|
180
185
|
body: sparql
|
|
181
186
|
});
|
|
182
187
|
via = 'patch';
|
|
188
|
+
if (await this.shouldFallbackToN3Patch(response)) {
|
|
189
|
+
const n3Result = await this.executeN3PatchInternal(docResourceUrl, [], triples);
|
|
190
|
+
response = new Response(null, { status: n3Result[0]?.status ?? 200 });
|
|
191
|
+
via = 'n3';
|
|
192
|
+
}
|
|
183
193
|
}
|
|
184
194
|
else {
|
|
185
195
|
// 资源不存在,使用 PUT 创建
|
|
@@ -219,6 +229,12 @@ class LdpExecutor {
|
|
|
219
229
|
headers: { 'Content-Type': 'application/sparql-update' },
|
|
220
230
|
body: sparql
|
|
221
231
|
});
|
|
232
|
+
let via = 'sparql-update';
|
|
233
|
+
if (await this.shouldFallbackToN3Patch(response)) {
|
|
234
|
+
const n3Result = await this.executeN3PatchInternal(resourceUrl, [], insertTriples);
|
|
235
|
+
response = new Response(null, { status: n3Result[0]?.status ?? 200 });
|
|
236
|
+
via = 'n3';
|
|
237
|
+
}
|
|
222
238
|
// 如果返回 201(创建)但实际可能没创建资源,验证一下
|
|
223
239
|
// 如果资源不存在 (404) 或创建后仍不可访问,先 PUT 创建再重试
|
|
224
240
|
if (response.status === 404 || response.status === 201) {
|
|
@@ -259,7 +275,7 @@ class LdpExecutor {
|
|
|
259
275
|
}
|
|
260
276
|
// Also invalidate global cache to ensure SPARQL endpoint queries see the new data
|
|
261
277
|
await this.sparqlExecutor.invalidateHttpCache(undefined).catch(() => undefined);
|
|
262
|
-
return [{ success: true, source: resourceUrl, status: response.status, via
|
|
278
|
+
return [{ success: true, source: resourceUrl, status: response.status, via }];
|
|
263
279
|
}
|
|
264
280
|
async repairContainerAndRetryPutIfNeeded(response, containerUrl, resourceUrl, body, contentType, repairContainer) {
|
|
265
281
|
if (!repairContainer || !containerUrl || !this.isMissingParentContainerResponse(response)) {
|
|
@@ -310,7 +326,7 @@ class LdpExecutor {
|
|
|
310
326
|
if (col._virtualId || col.options?.predicate === '@id')
|
|
311
327
|
continue;
|
|
312
328
|
// 检查是否是内联对象列
|
|
313
|
-
const isInline = col.dataType === 'object' ||
|
|
329
|
+
const isInline = col.dataType === 'object' ||
|
|
314
330
|
(col.dataType === 'array' && (col.elementType === 'object' || col.options?.baseType === 'object'));
|
|
315
331
|
if (!isInline)
|
|
316
332
|
continue;
|
|
@@ -421,6 +437,11 @@ class LdpExecutor {
|
|
|
421
437
|
error.status = status;
|
|
422
438
|
return error;
|
|
423
439
|
}
|
|
440
|
+
async shouldFallbackToN3Patch(response) {
|
|
441
|
+
return response.status === 415 || response.status === 405 ||
|
|
442
|
+
(response.status === 400 &&
|
|
443
|
+
(await response.clone().text().catch(() => '')).includes('prepared update source provenance is not uniquely identified'));
|
|
444
|
+
}
|
|
424
445
|
async buildUpdatePatchPayload(subject, table, data, resourceUrl) {
|
|
425
446
|
const deleteTriples = [];
|
|
426
447
|
const insertTriples = [];
|
|
@@ -438,7 +459,7 @@ class LdpExecutor {
|
|
|
438
459
|
if (col._virtualId || col.options?.predicate === '@id')
|
|
439
460
|
continue;
|
|
440
461
|
// 内联对象特殊处理在 executeUpdate 主循环中做
|
|
441
|
-
const isInline = col.dataType === 'object' ||
|
|
462
|
+
const isInline = col.dataType === 'object' ||
|
|
442
463
|
(col.dataType === 'array' && (col.elementType === 'object' || col.options?.baseType === 'object'));
|
|
443
464
|
if (isInline) {
|
|
444
465
|
// 只处理插入部分,删除部分由主循环处理
|
|
@@ -518,8 +539,8 @@ class LdpExecutor {
|
|
|
518
539
|
shouldRetry: false
|
|
519
540
|
};
|
|
520
541
|
}
|
|
521
|
-
// SPARQL UPDATE not supported, fallback to N3 Patch
|
|
522
|
-
if (
|
|
542
|
+
// SPARQL UPDATE not supported, or provider provenance is ambiguous; fallback to N3 Patch
|
|
543
|
+
if (await this.shouldFallbackToN3Patch(res)) {
|
|
523
544
|
const fallbackDeletes = deleteWherePatterns.length > 0
|
|
524
545
|
? [...deleteTriples, ...deleteWherePatterns]
|
|
525
546
|
: deleteTriples;
|
|
@@ -652,7 +673,7 @@ class LdpExecutor {
|
|
|
652
673
|
for (const [, col] of Object.entries(table.columns)) {
|
|
653
674
|
const predicate = this.tripleBuilder.getPredicateUri(col, table);
|
|
654
675
|
// Check if column is inline
|
|
655
|
-
const isInline = col.dataType === 'object' ||
|
|
676
|
+
const isInline = col.dataType === 'object' ||
|
|
656
677
|
(col.dataType === 'array' && (col.elementType === 'object' || col.options?.baseType === 'object'));
|
|
657
678
|
if (predicate === pVal && isInline && typeof o.value === 'string') {
|
|
658
679
|
childSubjects.push(o.value);
|
|
@@ -898,7 +898,7 @@ LIMIT 50`,
|
|
|
898
898
|
else if (row[key] === undefined) {
|
|
899
899
|
row[key] = object;
|
|
900
900
|
}
|
|
901
|
-
if ((column.dataType === 'object'
|
|
901
|
+
if ((column.dataType === 'object')
|
|
902
902
|
&& typeof object === 'string'
|
|
903
903
|
&& isAbsoluteIri(object)) {
|
|
904
904
|
hasUnhydratedInlineObject = true;
|
package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js
CHANGED
|
@@ -1330,11 +1330,11 @@ class SelectQueryBuilder {
|
|
|
1330
1330
|
isInlineObjectColumn(column) {
|
|
1331
1331
|
if (!column)
|
|
1332
1332
|
return false;
|
|
1333
|
-
if (column.dataType === 'object'
|
|
1333
|
+
if (column.dataType === 'object')
|
|
1334
1334
|
return true;
|
|
1335
1335
|
if (column.dataType === 'array') {
|
|
1336
1336
|
const elementType = column.elementType ?? column.options?.baseType;
|
|
1337
|
-
return elementType === 'object'
|
|
1337
|
+
return elementType === 'object';
|
|
1338
1338
|
}
|
|
1339
1339
|
return false;
|
|
1340
1340
|
}
|
package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql/builder/update-builder.js
CHANGED
|
@@ -392,11 +392,22 @@ class UpdateBuilder {
|
|
|
392
392
|
const predicate = (0, helpers_1.getPredicateForColumn)(column, table);
|
|
393
393
|
const variableName = `old_${columnName}_${index}`;
|
|
394
394
|
const isInline = column.dataType === 'object' ||
|
|
395
|
-
column.dataType === 'json' ||
|
|
396
395
|
(column.dataType === 'array' && (column.elementType === 'object' || column.options?.baseType === 'object'));
|
|
397
396
|
const subjectTerm = { termType: 'NamedNode', value: resourceUri };
|
|
398
397
|
const predicateTerm = { termType: 'NamedNode', value: predicate };
|
|
399
398
|
const varTerm = { termType: 'Variable', value: variableName };
|
|
399
|
+
const isJson = column.dataType === 'json' ||
|
|
400
|
+
(column.dataType === 'array' && (column.elementType === 'json' || column.options?.baseType === 'json'));
|
|
401
|
+
if (isJson) {
|
|
402
|
+
const linkTriple = { subject: subjectTerm, predicate: predicateTerm, object: varTerm };
|
|
403
|
+
deleteTriples.push(linkTriple);
|
|
404
|
+
whereTriples.push(linkTriple);
|
|
405
|
+
if (value !== null && value !== undefined) {
|
|
406
|
+
const result = this.tripleBuilder.buildInsert(resourceUri, column, value, table);
|
|
407
|
+
insertTriples.push(...result.triples.map(this.toSparqlJsTriple));
|
|
408
|
+
}
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
400
411
|
if (isInline) {
|
|
401
412
|
const childVarPredicate = { termType: 'Variable', value: `p_${variableName}` };
|
|
402
413
|
const childVarObject = { termType: 'Variable', value: `o_${variableName}` };
|
|
@@ -63,7 +63,7 @@ class TripleBuilderImpl {
|
|
|
63
63
|
const predicate = this.getPredicateUri(column, table);
|
|
64
64
|
const varName = `old_${column.name}${varSuffix}`;
|
|
65
65
|
// 检查是否是内联对象
|
|
66
|
-
if (column.dataType === 'object'
|
|
66
|
+
if (column.dataType === 'object') {
|
|
67
67
|
return this.buildInlineDeleteTriples(subject, predicate, column.name, varSuffix);
|
|
68
68
|
}
|
|
69
69
|
// 检查是否是逆向谓词
|
|
@@ -30,6 +30,12 @@ class ArrayHandler {
|
|
|
30
30
|
}
|
|
31
31
|
formatSingleValue(value, elementType) {
|
|
32
32
|
switch (elementType) {
|
|
33
|
+
case 'json':
|
|
34
|
+
return {
|
|
35
|
+
termType: 'Literal',
|
|
36
|
+
value: JSON.stringify(value),
|
|
37
|
+
datatype: { termType: 'NamedNode', value: `${XSD}json` },
|
|
38
|
+
};
|
|
33
39
|
case 'string':
|
|
34
40
|
return {
|
|
35
41
|
termType: 'Literal',
|
|
@@ -72,6 +78,8 @@ class ArrayHandler {
|
|
|
72
78
|
const elementType = column.options?.baseType ?? 'string';
|
|
73
79
|
const datatypeUri = term.datatype?.value ?? '';
|
|
74
80
|
switch (elementType) {
|
|
81
|
+
case 'json':
|
|
82
|
+
return JSON.parse(term.value);
|
|
75
83
|
case 'integer':
|
|
76
84
|
return parseInt(term.value, 10);
|
|
77
85
|
case 'boolean':
|
|
@@ -18,10 +18,16 @@ class DefaultHandler {
|
|
|
18
18
|
}
|
|
19
19
|
canHandle(column) {
|
|
20
20
|
const type = column.dataType;
|
|
21
|
-
return type === 'string' || type === 'integer' || type === 'boolean' || type === 'datetime';
|
|
21
|
+
return type === 'string' || type === 'integer' || type === 'boolean' || type === 'datetime' || type === 'json';
|
|
22
22
|
}
|
|
23
23
|
formatValue(value, column, _context) {
|
|
24
24
|
switch (column.dataType) {
|
|
25
|
+
case 'json':
|
|
26
|
+
return {
|
|
27
|
+
termType: 'Literal',
|
|
28
|
+
value: JSON.stringify(value),
|
|
29
|
+
datatype: { termType: 'NamedNode', value: `${XSD}json` },
|
|
30
|
+
};
|
|
25
31
|
case 'string':
|
|
26
32
|
return {
|
|
27
33
|
termType: 'Literal',
|
|
@@ -58,6 +64,8 @@ class DefaultHandler {
|
|
|
58
64
|
parseValue(term, column) {
|
|
59
65
|
const datatypeUri = term.datatype?.value ?? '';
|
|
60
66
|
switch (column.dataType) {
|
|
67
|
+
case 'json':
|
|
68
|
+
return JSON.parse(term.value);
|
|
61
69
|
case 'integer':
|
|
62
70
|
return parseInt(term.value, 10);
|
|
63
71
|
case 'boolean':
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Inline Object Column Handler
|
|
4
4
|
*
|
|
5
|
-
* 处理内联对象类型列 (object
|
|
5
|
+
* 处理内联对象类型列 (object),创建嵌套三元组结构
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.InlineObjectHandler = void 0;
|
|
@@ -20,12 +20,12 @@ class InlineObjectHandler {
|
|
|
20
20
|
this.name = 'inline';
|
|
21
21
|
}
|
|
22
22
|
canHandle(column) {
|
|
23
|
-
if (column.dataType === 'object'
|
|
23
|
+
if (column.dataType === 'object') {
|
|
24
24
|
return true;
|
|
25
25
|
}
|
|
26
26
|
if (column.dataType === 'array') {
|
|
27
27
|
const baseType = column.elementType || column.options?.baseType;
|
|
28
|
-
return baseType === 'object'
|
|
28
|
+
return baseType === 'object';
|
|
29
29
|
}
|
|
30
30
|
return false;
|
|
31
31
|
}
|
|
@@ -157,6 +157,11 @@ export class LdpExecutor {
|
|
|
157
157
|
body: sparql
|
|
158
158
|
});
|
|
159
159
|
via = 'patch';
|
|
160
|
+
if (await this.shouldFallbackToN3Patch(response)) {
|
|
161
|
+
const n3Result = await this.executeN3PatchInternal(docResourceUrl, [], triples);
|
|
162
|
+
response = new Response(null, { status: n3Result[0]?.status ?? 200 });
|
|
163
|
+
via = 'n3';
|
|
164
|
+
}
|
|
160
165
|
if (response.status === 404) {
|
|
161
166
|
const body = triples.join('\n');
|
|
162
167
|
response = await this.fetchFn(docResourceUrl, {
|
|
@@ -177,6 +182,11 @@ export class LdpExecutor {
|
|
|
177
182
|
body: sparql
|
|
178
183
|
});
|
|
179
184
|
via = 'patch';
|
|
185
|
+
if (await this.shouldFallbackToN3Patch(response)) {
|
|
186
|
+
const n3Result = await this.executeN3PatchInternal(docResourceUrl, [], triples);
|
|
187
|
+
response = new Response(null, { status: n3Result[0]?.status ?? 200 });
|
|
188
|
+
via = 'n3';
|
|
189
|
+
}
|
|
180
190
|
}
|
|
181
191
|
else {
|
|
182
192
|
// 资源不存在,使用 PUT 创建
|
|
@@ -216,6 +226,12 @@ export class LdpExecutor {
|
|
|
216
226
|
headers: { 'Content-Type': 'application/sparql-update' },
|
|
217
227
|
body: sparql
|
|
218
228
|
});
|
|
229
|
+
let via = 'sparql-update';
|
|
230
|
+
if (await this.shouldFallbackToN3Patch(response)) {
|
|
231
|
+
const n3Result = await this.executeN3PatchInternal(resourceUrl, [], insertTriples);
|
|
232
|
+
response = new Response(null, { status: n3Result[0]?.status ?? 200 });
|
|
233
|
+
via = 'n3';
|
|
234
|
+
}
|
|
219
235
|
// 如果返回 201(创建)但实际可能没创建资源,验证一下
|
|
220
236
|
// 如果资源不存在 (404) 或创建后仍不可访问,先 PUT 创建再重试
|
|
221
237
|
if (response.status === 404 || response.status === 201) {
|
|
@@ -256,7 +272,7 @@ export class LdpExecutor {
|
|
|
256
272
|
}
|
|
257
273
|
// Also invalidate global cache to ensure SPARQL endpoint queries see the new data
|
|
258
274
|
await this.sparqlExecutor.invalidateHttpCache(undefined).catch(() => undefined);
|
|
259
|
-
return [{ success: true, source: resourceUrl, status: response.status, via
|
|
275
|
+
return [{ success: true, source: resourceUrl, status: response.status, via }];
|
|
260
276
|
}
|
|
261
277
|
async repairContainerAndRetryPutIfNeeded(response, containerUrl, resourceUrl, body, contentType, repairContainer) {
|
|
262
278
|
if (!repairContainer || !containerUrl || !this.isMissingParentContainerResponse(response)) {
|
|
@@ -307,7 +323,7 @@ export class LdpExecutor {
|
|
|
307
323
|
if (col._virtualId || col.options?.predicate === '@id')
|
|
308
324
|
continue;
|
|
309
325
|
// 检查是否是内联对象列
|
|
310
|
-
const isInline = col.dataType === 'object' ||
|
|
326
|
+
const isInline = col.dataType === 'object' ||
|
|
311
327
|
(col.dataType === 'array' && (col.elementType === 'object' || col.options?.baseType === 'object'));
|
|
312
328
|
if (!isInline)
|
|
313
329
|
continue;
|
|
@@ -418,6 +434,11 @@ export class LdpExecutor {
|
|
|
418
434
|
error.status = status;
|
|
419
435
|
return error;
|
|
420
436
|
}
|
|
437
|
+
async shouldFallbackToN3Patch(response) {
|
|
438
|
+
return response.status === 415 || response.status === 405 ||
|
|
439
|
+
(response.status === 400 &&
|
|
440
|
+
(await response.clone().text().catch(() => '')).includes('prepared update source provenance is not uniquely identified'));
|
|
441
|
+
}
|
|
421
442
|
async buildUpdatePatchPayload(subject, table, data, resourceUrl) {
|
|
422
443
|
const deleteTriples = [];
|
|
423
444
|
const insertTriples = [];
|
|
@@ -435,7 +456,7 @@ export class LdpExecutor {
|
|
|
435
456
|
if (col._virtualId || col.options?.predicate === '@id')
|
|
436
457
|
continue;
|
|
437
458
|
// 内联对象特殊处理在 executeUpdate 主循环中做
|
|
438
|
-
const isInline = col.dataType === 'object' ||
|
|
459
|
+
const isInline = col.dataType === 'object' ||
|
|
439
460
|
(col.dataType === 'array' && (col.elementType === 'object' || col.options?.baseType === 'object'));
|
|
440
461
|
if (isInline) {
|
|
441
462
|
// 只处理插入部分,删除部分由主循环处理
|
|
@@ -515,8 +536,8 @@ export class LdpExecutor {
|
|
|
515
536
|
shouldRetry: false
|
|
516
537
|
};
|
|
517
538
|
}
|
|
518
|
-
// SPARQL UPDATE not supported, fallback to N3 Patch
|
|
519
|
-
if (
|
|
539
|
+
// SPARQL UPDATE not supported, or provider provenance is ambiguous; fallback to N3 Patch
|
|
540
|
+
if (await this.shouldFallbackToN3Patch(res)) {
|
|
520
541
|
const fallbackDeletes = deleteWherePatterns.length > 0
|
|
521
542
|
? [...deleteTriples, ...deleteWherePatterns]
|
|
522
543
|
: deleteTriples;
|
|
@@ -649,7 +670,7 @@ export class LdpExecutor {
|
|
|
649
670
|
for (const [, col] of Object.entries(table.columns)) {
|
|
650
671
|
const predicate = this.tripleBuilder.getPredicateUri(col, table);
|
|
651
672
|
// Check if column is inline
|
|
652
|
-
const isInline = col.dataType === 'object' ||
|
|
673
|
+
const isInline = col.dataType === 'object' ||
|
|
653
674
|
(col.dataType === 'array' && (col.elementType === 'object' || col.options?.baseType === 'object'));
|
|
654
675
|
if (predicate === pVal && isInline && typeof o.value === 'string') {
|
|
655
676
|
childSubjects.push(o.value);
|
|
@@ -862,7 +862,7 @@ LIMIT 50`,
|
|
|
862
862
|
else if (row[key] === undefined) {
|
|
863
863
|
row[key] = object;
|
|
864
864
|
}
|
|
865
|
-
if ((column.dataType === 'object'
|
|
865
|
+
if ((column.dataType === 'object')
|
|
866
866
|
&& typeof object === 'string'
|
|
867
867
|
&& isAbsoluteIri(object)) {
|
|
868
868
|
hasUnhydratedInlineObject = true;
|
|
@@ -1327,11 +1327,11 @@ export class SelectQueryBuilder {
|
|
|
1327
1327
|
isInlineObjectColumn(column) {
|
|
1328
1328
|
if (!column)
|
|
1329
1329
|
return false;
|
|
1330
|
-
if (column.dataType === 'object'
|
|
1330
|
+
if (column.dataType === 'object')
|
|
1331
1331
|
return true;
|
|
1332
1332
|
if (column.dataType === 'array') {
|
|
1333
1333
|
const elementType = column.elementType ?? column.options?.baseType;
|
|
1334
|
-
return elementType === 'object'
|
|
1334
|
+
return elementType === 'object';
|
|
1335
1335
|
}
|
|
1336
1336
|
return false;
|
|
1337
1337
|
}
|
package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/update-builder.js
CHANGED
|
@@ -356,11 +356,22 @@ export class UpdateBuilder {
|
|
|
356
356
|
const predicate = getPredicateForColumn(column, table);
|
|
357
357
|
const variableName = `old_${columnName}_${index}`;
|
|
358
358
|
const isInline = column.dataType === 'object' ||
|
|
359
|
-
column.dataType === 'json' ||
|
|
360
359
|
(column.dataType === 'array' && (column.elementType === 'object' || column.options?.baseType === 'object'));
|
|
361
360
|
const subjectTerm = { termType: 'NamedNode', value: resourceUri };
|
|
362
361
|
const predicateTerm = { termType: 'NamedNode', value: predicate };
|
|
363
362
|
const varTerm = { termType: 'Variable', value: variableName };
|
|
363
|
+
const isJson = column.dataType === 'json' ||
|
|
364
|
+
(column.dataType === 'array' && (column.elementType === 'json' || column.options?.baseType === 'json'));
|
|
365
|
+
if (isJson) {
|
|
366
|
+
const linkTriple = { subject: subjectTerm, predicate: predicateTerm, object: varTerm };
|
|
367
|
+
deleteTriples.push(linkTriple);
|
|
368
|
+
whereTriples.push(linkTriple);
|
|
369
|
+
if (value !== null && value !== undefined) {
|
|
370
|
+
const result = this.tripleBuilder.buildInsert(resourceUri, column, value, table);
|
|
371
|
+
insertTriples.push(...result.triples.map(this.toSparqlJsTriple));
|
|
372
|
+
}
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
364
375
|
if (isInline) {
|
|
365
376
|
const childVarPredicate = { termType: 'Variable', value: `p_${variableName}` };
|
|
366
377
|
const childVarObject = { termType: 'Variable', value: `o_${variableName}` };
|
|
@@ -60,7 +60,7 @@ export class TripleBuilderImpl {
|
|
|
60
60
|
const predicate = this.getPredicateUri(column, table);
|
|
61
61
|
const varName = `old_${column.name}${varSuffix}`;
|
|
62
62
|
// 检查是否是内联对象
|
|
63
|
-
if (column.dataType === 'object'
|
|
63
|
+
if (column.dataType === 'object') {
|
|
64
64
|
return this.buildInlineDeleteTriples(subject, predicate, column.name, varSuffix);
|
|
65
65
|
}
|
|
66
66
|
// 检查是否是逆向谓词
|
|
@@ -27,6 +27,12 @@ export class ArrayHandler {
|
|
|
27
27
|
}
|
|
28
28
|
formatSingleValue(value, elementType) {
|
|
29
29
|
switch (elementType) {
|
|
30
|
+
case 'json':
|
|
31
|
+
return {
|
|
32
|
+
termType: 'Literal',
|
|
33
|
+
value: JSON.stringify(value),
|
|
34
|
+
datatype: { termType: 'NamedNode', value: `${XSD}json` },
|
|
35
|
+
};
|
|
30
36
|
case 'string':
|
|
31
37
|
return {
|
|
32
38
|
termType: 'Literal',
|
|
@@ -69,6 +75,8 @@ export class ArrayHandler {
|
|
|
69
75
|
const elementType = column.options?.baseType ?? 'string';
|
|
70
76
|
const datatypeUri = term.datatype?.value ?? '';
|
|
71
77
|
switch (elementType) {
|
|
78
|
+
case 'json':
|
|
79
|
+
return JSON.parse(term.value);
|
|
72
80
|
case 'integer':
|
|
73
81
|
return parseInt(term.value, 10);
|
|
74
82
|
case 'boolean':
|
|
@@ -15,10 +15,16 @@ export class DefaultHandler {
|
|
|
15
15
|
}
|
|
16
16
|
canHandle(column) {
|
|
17
17
|
const type = column.dataType;
|
|
18
|
-
return type === 'string' || type === 'integer' || type === 'boolean' || type === 'datetime';
|
|
18
|
+
return type === 'string' || type === 'integer' || type === 'boolean' || type === 'datetime' || type === 'json';
|
|
19
19
|
}
|
|
20
20
|
formatValue(value, column, _context) {
|
|
21
21
|
switch (column.dataType) {
|
|
22
|
+
case 'json':
|
|
23
|
+
return {
|
|
24
|
+
termType: 'Literal',
|
|
25
|
+
value: JSON.stringify(value),
|
|
26
|
+
datatype: { termType: 'NamedNode', value: `${XSD}json` },
|
|
27
|
+
};
|
|
22
28
|
case 'string':
|
|
23
29
|
return {
|
|
24
30
|
termType: 'Literal',
|
|
@@ -55,6 +61,8 @@ export class DefaultHandler {
|
|
|
55
61
|
parseValue(term, column) {
|
|
56
62
|
const datatypeUri = term.datatype?.value ?? '';
|
|
57
63
|
switch (column.dataType) {
|
|
64
|
+
case 'json':
|
|
65
|
+
return JSON.parse(term.value);
|
|
58
66
|
case 'integer':
|
|
59
67
|
return parseInt(term.value, 10);
|
|
60
68
|
case 'boolean':
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Inline Object Column Handler
|
|
3
3
|
*
|
|
4
|
-
* 处理内联对象类型列 (object
|
|
4
|
+
* 处理内联对象类型列 (object),创建嵌套三元组结构
|
|
5
5
|
*/
|
|
6
6
|
const XSD = 'http://www.w3.org/2001/XMLSchema#';
|
|
7
7
|
/**
|
|
@@ -17,12 +17,12 @@ export class InlineObjectHandler {
|
|
|
17
17
|
this.name = 'inline';
|
|
18
18
|
}
|
|
19
19
|
canHandle(column) {
|
|
20
|
-
if (column.dataType === 'object'
|
|
20
|
+
if (column.dataType === 'object') {
|
|
21
21
|
return true;
|
|
22
22
|
}
|
|
23
23
|
if (column.dataType === 'array') {
|
|
24
24
|
const baseType = column.elementType || column.options?.baseType;
|
|
25
|
-
return baseType === 'object'
|
|
25
|
+
return baseType === 'object';
|
|
26
26
|
}
|
|
27
27
|
return false;
|
|
28
28
|
}
|