@kedem/okdb 1.0.0 → 1.0.1
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/README.md +1 -1
- package/bin/okdb.js +1 -1
- package/okdb-data/default/data.mdb +0 -0
- package/okdb-data/default/lock.mdb +0 -0
- package/okdb-data/~log/data.mdb +0 -0
- package/okdb-data/~log/lock.mdb +0 -0
- package/okdb-data/~system/data.mdb +0 -0
- package/okdb-data/~system/lock.mdb +0 -0
- package/okdb.js +1 -1
- package/package.json +1 -1
- package/public/admin-app.js +1 -1
- package/public/components/admin-route-host.ok.js +1 -1
- package/public/components/env-picker.ok.js +1 -1
- package/public/components/field-path-input.ok.js +1 -1
- package/public/components/geo-map.ok.js +1 -1
- package/public/components/ok-cron-input.ok.js +1 -1
- package/public/components/ok-dropzone.ok.js +1 -1
- package/public/components/ok-js-input.ok.js +1 -1
- package/public/components/ok-json-input.ok.js +1 -1
- package/public/components/ok-text-monaco-input.ok.js +1 -1
- package/public/components/theme-toggle.ok.js +1 -1
- package/public/login-app.js +1 -1
- package/public/modules/ok.js +1 -1
- package/public/sections/api/parts/api-endpoint.ok.js +1 -1
- package/public/sections/auth/modals/create-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/edit-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/perm-info-popover.ok.js +1 -1
- package/public/sections/auth/parts/token-detail.ok.js +1 -1
- package/public/sections/auth/parts/token-list.ok.js +1 -1
- package/public/sections/db/modals/add-item-modal.ok.js +1 -1
- package/public/sections/db/modals/create-env-modal.ok.js +1 -1
- package/public/sections/db/modals/create-fts-modal.ok.js +1 -1
- package/public/sections/db/modals/create-index-modal.ok.js +1 -1
- package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -1
- package/public/sections/db/modals/demo-env-modal.ok.js +1 -1
- package/public/sections/db/modals/remove-env-modal.ok.js +1 -1
- package/public/sections/db/modals/schema-edit-modal.ok.js +1 -1
- package/public/sections/db/parts/db-overview.ok.js +1 -1
- package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -1
- package/public/sections/db/parts/edit-row.ok.js +1 -1
- package/public/sections/db/parts/tm-timeline.ok.js +1 -1
- package/public/sections/db/parts/type-changelog.ok.js +1 -1
- package/public/sections/db/parts/type-list.ok.js +1 -1
- package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -1
- package/public/sections/db/parts/type-schema-tab.ok.js +1 -1
- package/public/sections/db/parts/type-viewer.ok.js +1 -1
- package/public/sections/db/parts/type-violations-tab.ok.js +1 -1
- package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/engines-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -1
- package/public/sections/engines/engine-panel-shared-style.js +1 -1
- package/public/sections/engines/engine-ui-utils.js +1 -1
- package/public/sections/engines/modals/engine-modal.ok.js +1 -1
- package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -1
- package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -1
- package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -1
- package/public/sections/engines/parts/engine-resource-card.ok.js +1 -1
- package/public/sections/engines/parts/engine-row-item.ok.js +1 -1
- package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -1
- package/public/sections/files/parts/files-blob-status.ok.js +1 -1
- package/public/sections/files/parts/files-collection-list.ok.js +1 -1
- package/public/sections/files/parts/files-collection-panel.ok.js +1 -1
- package/public/sections/files/parts/files-file-list.ok.js +1 -1
- package/public/sections/files/parts/files-overview.ok.js +1 -1
- package/public/sections/files/parts/files-path-browser.ok.js +1 -1
- package/public/sections/files/parts/files-upload-panel.ok.js +1 -1
- package/public/sections/functions/modals/function-modal.ok.js +1 -1
- package/public/sections/functions/parts/function-detail.ok.js +1 -1
- package/public/sections/functions/parts/function-logs.ok.js +1 -1
- package/public/sections/functions/parts/function-runner.ok.js +1 -1
- package/public/sections/functions/parts/functions-list.ok.js +1 -1
- package/public/sections/license/parts/license-panel.ok.js +1 -1
- package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/job-type-modal.ok.js +1 -1
- package/public/sections/queue/parts/ok-job-form.ok.js +1 -1
- package/public/sections/queue/parts/queue-buckets.ok.js +1 -1
- package/public/sections/queue/parts/queue-job-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-jobs.ok.js +1 -1
- package/public/sections/queue/parts/queue-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-workers.ok.js +1 -1
- package/public/sections/sync/parts/sync-node-detail.ok.js +1 -1
- package/public/sections/sync/parts/sync-retention.ok.js +1 -1
- package/public/sections/sync/parts/sync-topology.ok.js +1 -1
- package/public/sections/system/modals/data-ops-modal.ok.js +1 -1
- package/public/sections/system/parts/system-api-panel.ok.js +1 -1
- package/public/sections/system/parts/system-auth-panel.ok.js +1 -1
- package/public/sections/system/parts/system-log-history.ok.js +1 -1
- package/public/sections/system/parts/system-log.ok.js +1 -1
- package/public/sections/system/parts/system-status.ok.js +1 -1
- package/public/sections/system/parts/system-sync-panel.ok.js +1 -1
- package/public/sections/views/modals/create-view-modal.ok.js +1 -1
- package/public/sections/views/parts/view-detail.ok.js +1 -1
- package/public/sections/views/parts/views-list.ok.js +1 -1
- package/public/sections/views/parts/views-overview.ok.js +1 -1
- package/public/setup-app.js +1 -1
- package/public/stores/auth-store.js +1 -1
- package/public/stores/events-store.js +1 -1
- package/public/stores/functions-store.js +1 -1
- package/public/stores/okdb-store.js +1 -1
- package/public/stores/theme-store.js +1 -1
- package/public/util/permissions.js +1 -1
- package/public/util/sift-schema.js +1 -1
- package/public/view-models/type-query-vm.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x19ed73=_0x532a;function _0x4d71(){const _0xd1d8e5=['changes','slice','backupDlError','canBackup','importDropExisting','true','file','target','exportBusy','status','parse','exportError','exportSelEnvs','input','body','1959841JsVBwu','trim','5398390sxnPrB','catch','importFile','data-ops-modal','exportDone','onDone','API','importError','backupCompact','json','importIncludeChanges','change','exportCanRun','backupDlBusy','exportSingleEnvTypes','importSelTypes','exportInit','match','36ekeImC','text','10WtsBNv','386001SdMMIr','9004lNjODX','removeChild','backupEnvNames','createObjectURL','files','importFileTypes','types','includeChanges','download','importDragOver','exportIncludeChanges','env','name','export','envs','now','map','toFixed','blob','userEnvs','onchange','backupSelEnvs','384ZCbnkn','startsWith','88jeMNgD','split','keys','backupError','exportIsSingleEnv','schema','all','backupBusy','close','.ndjson','.ndjson,.jsonl,.json,.txt','./okdb-backup-','filter','headers','get','accept','modal','records','application/json','importDone','stringify','data','13760lUCbQG','11IRYMie','click','appendChild','length','POST','content-disposition','message','join','type','okdb-backup-','application/x-ndjson','/system/import?','HTTP\x20','envName','exportSelectedTypeNames','backupResult','getDate','backupDlDone','set','_setImportFile','size','getMonth','importEnvOverride','error','\x0a<div\x20style=\x22min-width:520px;\x20max-width:640px;\x20display:flex;\x20flex-direction:column;\x20gap:0;\x22>\x0a\x0a\x20\x20<!--\x20Tab\x20bar\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:2px;\x20padding:3px;\x20background:var(--okdb-app-bg-deep);\x20border-radius:9px;\x20margin-bottom:22px;\x20border:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20<button\x20@click=\x22tab=\x27export\x27\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27export\x27\x20?\x20\x27flex:1;background:var(--okdb-app-surface-2);color:var(--okdb-accent);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);font-weight:600;\x27\x20:\x20\x27flex:1;background:transparent;border-color:transparent;opacity:.5;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:7px\x200;border-radius:7px;font-size:13px;transition:all\x20.15s;cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20⬇\x20Export\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x20@click=\x22tab=\x27import\x27\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27import\x27\x20?\x20\x27flex:1;background:var(--okdb-app-surface-2);color:var(--okdb-accent);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);font-weight:600;\x27\x20:\x20\x27flex:1;background:transparent;border-color:transparent;opacity:.5;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:7px\x200;border-radius:7px;font-size:13px;transition:all\x20.15s;cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20⬆\x20Import\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x20@click=\x22tab=\x27backup\x27\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27backup\x27\x20?\x20\x27flex:1;background:var(--okdb-app-surface-2);color:var(--okdb-purple);border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);font-weight:600;\x27\x20:\x20\x27flex:1;background:transparent;border-color:transparent;opacity:.5;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:7px\x200;border-radius:7px;font-size:13px;transition:all\x20.15s;cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20🗄\x20Backup\x0a\x20\x20\x20\x20</button>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20═══\x20EXPORT\x20═══════════════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27export\x27\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:18px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.5;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Streaming\x20NDJSON\x20export\x20—\x20portable\x20across\x20OKDB\x20versions,\x20importable\x20into\x20any\x20instance.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Environments\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22flex:1;margin:0;\x22>Environments</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22exportToggleAllEnvs(true)\x22\x20\x20class=\x22dops-micro\x22>all</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22exportToggleAllEnvs(false)\x22\x20class=\x22dops-micro\x22>none</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22userEnvs\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22exportSelEnvs[e.name]\x20?\x20\x27background:var(--okdb-app-surface-2);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);color:#e2eaf4;\x27\x20:\x20\x27background:var(--okdb-app-surface);border-color:var(--okdb-app-border);opacity:.55;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:flex;align-items:center;gap:5px;padding:5px\x2011px;border-radius:999px;font-size:12px;cursor:pointer;border:1px\x20solid;transition:all\x20.12s;user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!exportSelEnvs[e.name]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22exportSelEnvs\x20=\x20{...exportSelEnvs,\x20[e.name]:\x20$el.checked}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:none;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22exportSelEnvs[e.name]\x20?\x20\x27color:var(--okdb-accent);font-size:10px;\x27\x20:\x20\x27display:none;\x27\x22>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{e.name}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;font-size:10px;\x22>{{e.types\x20?\x20e.types.filter(t=>!t.name.startsWith(\x27~\x27)).length\x20:\x200}}\x20types</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Types\x20(only\x20for\x20single\x20env)\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportIsSingleEnv\x20&&\x20exportSingleEnvTypes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22flex:1;margin:0;\x22>Types</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22\x20style=\x22font-size:11px;gap:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22exportAllTypes\x22\x20@change=\x22exportAllTypes\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x22>All\x20types</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!exportAllTypes\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:0;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:8px;overflow:hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;padding:5px\x2010px;border-bottom:1px\x20solid\x20var(--okdb-app-border);gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22exportToggleAllTypes(true)\x22\x20\x20class=\x22dops-micro\x22>all</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22exportToggleAllTypes(false)\x22\x20class=\x22dops-micro\x22>none</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;max-height:140px;overflow-y:auto;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22exportSingleEnvTypes\x22\x20let:t>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20style=\x22display:flex;align-items:center;gap:8px;padding:6px\x2010px;cursor:pointer;transition:background\x20.1s;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22exportSelTypes[t]\x20?\x20\x27background:#1a2a1a;\x27\x20:\x20\x27\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@mouseenter=\x22$el.style.background=exportSelTypes[t]?\x27#1a2a1a\x27:\x27var(--okdb-app-surface)\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@mouseleave=\x22$el.style.background=exportSelTypes[t]?\x27#1a2a1a\x27:\x27\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!exportSelTypes[t]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22exportSelTypes\x20=\x20{...exportSelTypes,\x20[t]:\x20$el.checked}\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;font-size:12px;\x22>{{t}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22!exportIsSingleEnv\x20&&\x20exportSelectedEnvNames.length\x20>\x201\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;opacity:.4;font-style:italic;\x22>All\x20types\x20will\x20be\x20exported\x20from\x20each\x20selected\x20environment.</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Options\x20-->\x0a\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22exportIncludeChanges\x22\x20@change=\x22exportIncludeChanges\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>Include\x20changelog\x20<span\x20style=\x22opacity:.4;font-size:11px;\x22>(sync\x20history)</span></span>\x0a\x20\x20\x20\x20\x20\x20</label>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportError\x22><div\x20class=\x22dops-error\x22>{{exportError}}</div></if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Success\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportDone\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-success\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>✓</span><span\x20style=\x22font-weight:600;\x22>Downloaded</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;font-size:11px;margin-left:auto;\x22>{{formatBytes(exportDone.bytes)}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(3,1fr);gap:6px;font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportDone.envCount\x20>\x201\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{exportDone.envCount}}</div><div>envs</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{exportDone.types}}</div><div>types</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{exportDone.records}}</div><div>records</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{exportDone.changes}}</div><div>changes</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.35;margin-top:6px;font-family:monospace;word-break:break-all;\x22>{{exportDone.filename}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;justify-content:flex-end;margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22close()\x22\x20class=\x22dops-btn-ghost\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runExport()\x22\x20:disabled=\x22!exportCanRun\x22\x20class=\x22dops-btn-primary\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportBusy\x22><span\x20class=\x22dops-spinner\x22></span>\x20Exporting…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!exportBusy\x22>⬇\x20Download\x20NDJSON</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20═══\x20IMPORT\x20═══════════════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27import\x27\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:18px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.5;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Upload\x20a\x20OKDB\x20NDJSON\x20export.\x20Types,\x20indexes,\x20and\x20records\x20are\x20restored\x20automatically.\x0a\x20\x20\x20\x20\x20\x20\x20\x20Multi-env\x20files\x20restore\x20each\x20environment\x20separately.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Drop\x20zone\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20@click=\x22pickFile()\x22\x20@drop=\x22onDrop($event)\x22\x20@dragover=\x22onDragOver($event)\x22\x20@dragleave=\x22onDragLeave()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22importDragOver\x20?\x20\x27border-color:var(--okdb-accent);background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x205%,\x20transparent);\x27\x20:\x20importFile\x20?\x20\x27border-color:color-mix(in\x20srgb,\x20var(--okdb-success)\x2033%,\x20transparent);background:#0a1a10;\x27\x20:\x20\x27border-color:var(--okdb-app-border);background:var(--okdb-app-bg-deep);\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22border:2px\x20dashed;border-radius:10px;padding:24px\x2016px;text-align:center;cursor:pointer;transition:all\x20.15s;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!importFile\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:22px;opacity:.4;margin-bottom:8px;\x22>📂</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:13px;opacity:.7;\x22>Drop\x20.ndjson\x20file\x20here\x20or\x20<span\x20style=\x22color:var(--okdb-accent);\x22>click\x20to\x20browse</span></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;opacity:.3;margin-top:4px;\x22>.ndjson\x20·\x20.jsonl\x20·\x20.json</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22importFile\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:20px;margin-bottom:6px;\x22>📄</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:13px;font-weight:600;color:var(--okdb-success);font-family:monospace;word-break:break-all;\x22>{{importFile.name}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;opacity:.45;margin-top:3px;\x22>{{formatBytes(importFile.size)}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22importFileTypes.length\x22>\x20·\x20{{importFileTypes.length}}\x20type{{importFileTypes.length!==1?\x27s\x27:\x27\x27}}\x20detected</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20·\x20click\x20to\x20change</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Types\x20filter\x20(from\x20file)\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22importFileTypes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22flex:1;margin:0;\x22>Types\x20to\x20import</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22\x20style=\x22font-size:11px;gap:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22importAllTypes\x22\x20@change=\x22importAllTypes\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x22>All</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!importAllTypes\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:0;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:8px;overflow:hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;padding:5px\x2010px;border-bottom:1px\x20solid\x20var(--okdb-app-border);gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22importToggleAllTypes(true)\x22\x20\x20class=\x22dops-micro\x22>all</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22importToggleAllTypes(false)\x22\x20class=\x22dops-micro\x22>none</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;max-height:130px;overflow-y:auto;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22importFileTypes\x22\x20let:t>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20style=\x22display:flex;align-items:center;gap:8px;padding:6px\x2010px;cursor:pointer;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22importSelTypes[t]\x20?\x20\x27background:#1a2a1a;\x27\x20:\x20\x27\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!importSelTypes[t]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22importSelTypes\x20=\x20{...importSelTypes,\x20[t]:\x20$el.checked}\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;font-size:12px;\x22>{{t}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Target\x20env\x20override\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22>Target\x20environment\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.35;font-size:11px;font-weight:400;\x22>(leave\x20empty\x20to\x20use\x20the\x20file\x27s\x20source\x20env)</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<select\x20:value=\x22importEnvOverride\x22\x20@change=\x22importEnvOverride\x20=\x20$el.value\x22\x20class=\x22dops-select\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>—\x20from\x20file\x20header\x20—</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22userEnvs\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22e.name\x22>{{e.name}}</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</select>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Options\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:7px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22importDropExisting\x22\x20@change=\x22importDropExisting\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Drop\x20&\x20recreate\x20existing\x20types\x20<span\x20style=\x22opacity:.4;font-size:11px;\x22>(replaces\x20current\x20data)</span></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22importIncludeChanges\x22\x20@change=\x22importIncludeChanges\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Restore\x20changelog\x20rows</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Advanced\x20-->\x0a\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22importShowAdvanced=!importShowAdvanced\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;opacity:.4;background:transparent;border:none;padding:0;cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{importShowAdvanced?\x27▴\x20hide\x27:\x27▾\x27}}\x20advanced\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22importShowAdvanced\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22\x20style=\x22margin-top:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22>Batch\x20size\x20<span\x20style=\x22opacity:.35;font-size:11px;\x22>(records\x20per\x20write-txn)</span></label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20min=\x2210\x22\x20max=\x2210000\x22\x20step=\x2210\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22importBatchSize\x22\x20@input=\x22importBatchSize=Number($el.value)||500\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22dops-input\x22\x20style=\x22max-width:120px;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22importError\x22><div\x20class=\x22dops-error\x22>{{importError}}</div></if>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22importDone\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-success\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>✓</span><span\x20style=\x22font-weight:600;\x22>Import\x20complete</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(3,1fr);gap:6px;font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{importDone.types}}</div><div>types</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{importDone.records}}</div><div>records</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{importDone.changes}}</div><div>changes</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;justify-content:flex-end;margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22close()\x22\x20class=\x22dops-btn-ghost\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runImport()\x22\x20:disabled=\x22!canImport\x22\x20class=\x22dops-btn-primary\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22importBusy\x22><span\x20class=\x22dops-spinner\x22></span>\x20Importing…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!importBusy\x22>⬆\x20Import\x20File</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20═══\x20BACKUP\x20════════════════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27backup\x27\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:0;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Mode\x20tabs\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:0;margin-bottom:18px;border-bottom:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22backupMode=\x27server\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22backupMode===\x27server\x27\x20?\x20\x27color:var(--okdb-purple);border-bottom:2px\x20solid\x20var(--okdb-purple);opacity:1;\x27\x20:\x20\x27border-bottom:2px\x20solid\x20transparent;opacity:.45;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22padding:6px\x2016px;background:transparent;border:none;border-radius:0;font-size:13px;cursor:pointer;transition:all\x20.15s;margin-bottom:-1px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20🗄\x20Server\x20backup\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22backupMode=\x27download\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22backupMode===\x27download\x27\x20?\x20\x27color:var(--okdb-purple);border-bottom:2px\x20solid\x20var(--okdb-purple);opacity:1;\x27\x20:\x20\x27border-bottom:2px\x20solid\x20transparent;opacity:.45;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22padding:6px\x2016px;background:transparent;border:none;border-radius:0;font-size:13px;cursor:pointer;transition:all\x20.15s;margin-bottom:-1px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20⬇\x20Download\x20to\x20PC\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Server\x20backup\x20mode\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupMode\x20===\x20\x27server\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:16px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.5;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Hot\x20LMDB\x20page-copy\x20backup\x20—\x20atomic,\x20exact\x20snapshot,\x20no\x20serialisation.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Writes\x20to\x20a\x20directory\x20<em>on\x20the\x20server</em>.\x20The\x20output\x20can\x20be\x20used\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20directly\x20as\x20a\x20OKDB\x20data\x20path.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Dest\x20dir\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22>Destination\x20directory\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.35;font-size:11px;font-weight:400;\x22>(server-side\x20path)</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22text\x22\x20:value=\x22backupDestDir\x22\x20@input=\x22backupDestDir=$el.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22dops-input\x22\x20style=\x22font-family:monospace;\x22\x20spellcheck=\x22false\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Env\x20selection\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22margin-bottom:8px;\x22>Environments</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:12px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22radio\x22\x20name=\x22bkEnvMode\x22\x20value=\x22all\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22backupEnvMode===\x27all\x27\x22\x20@change=\x22backupEnvMode=\x27all\x27\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>All</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22radio\x22\x20name=\x22bkEnvMode\x22\x20value=\x22selected\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22backupEnvMode===\x27selected\x27\x22\x20@change=\x22backupEnvMode=\x27selected\x27\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Select…</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupEnvMode===\x27selected\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;padding:10px;background:var(--okdb-app-bg-deep);border-radius:8px;border:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22userEnvs\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22backupSelEnvs[e.name]\x20?\x20\x27background:var(--okdb-app-surface);border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);color:#e2d8f4;\x27\x20:\x20\x27background:var(--okdb-app-surface);border-color:var(--okdb-app-border);opacity:.55;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:flex;align-items:center;gap:5px;padding:5px\x2011px;border-radius:999px;font-size:12px;cursor:pointer;border:1px\x20solid;transition:all\x20.12s;user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!backupSelEnvs[e.name]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22backupSelEnvs={...backupSelEnvs,[e.name]:$el.checked}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:none;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22backupSelEnvs[e.name]?\x27color:var(--okdb-purple);font-size:10px;\x27:\x27display:none;\x27\x22>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{e.name}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22backupCompact\x22\x20@change=\x22backupCompact=$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Compact\x20while\x20copying\x20<span\x20style=\x22opacity:.4;font-size:11px;\x22>(smaller\x20files,\x20slightly\x20slower)</span></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupError\x22><div\x20class=\x22dops-error\x22>{{backupError}}</div></if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupResult\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-success\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2020%,\x20transparent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-weight:600;color:var(--okdb-app-fg);\x22>Server\x20backup\x20complete</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;font-size:11px;margin-left:auto;\x22>{{backupResult.durationMs}}ms</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22backupResult.envs||[]\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22background:#1a1228;border-radius:6px;padding:7px\x2010px;font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;font-weight:600;color:var(--okdb-purple);\x22>{{e.name}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.35;font-size:11px;\x22>{{formatBytes(e.sizeBefore)}}\x20→\x20{{formatBytes(e.sizeAfter)}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-family:monospace;font-size:10px;opacity:.4;margin-top:3px;word-break:break-all;\x22>{{e.dest}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;justify-content:flex-end;margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22close()\x22\x20class=\x22dops-btn-ghost\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runBackup()\x22\x20:disabled=\x22!canBackup\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22padding:8px\x2020px;border-radius:8px;font-size:13px;font-weight:600;background:linear-gradient(135deg,#1e1530,#150f22);border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-purple)\x2033%,\x20transparent);color:var(--okdb-purple);cursor:pointer;display:flex;align-items:center;gap:6px;transition:all\x20.15s;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupBusy\x22><span\x20class=\x22dops-spinner\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);border-top-color:var(--okdb-purple);\x22></span>\x20Backing\x20up…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!backupBusy\x22>🗄\x20Run\x20Server\x20Backup</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Download\x20backup\x20mode\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupMode\x20===\x20\x27download\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:16px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.5;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Export\x20all\x20environments\x20as\x20a\x20single\x20portable\x20NDJSON\x20file\x20and\x20download\x20it\x20to\x20your\x20computer.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20This\x20file\x20can\x20be\x20imported\x20back\x20into\x20any\x20OKDB\x20instance.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Env\x20selection\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22margin-bottom:8px;\x22>Environments\x20to\x20include</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:12px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22radio\x22\x20name=\x22dlEnvMode\x22\x20value=\x22all\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22backupEnvMode===\x27all\x27\x22\x20@change=\x22backupEnvMode=\x27all\x27\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>All\x20environments</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22radio\x22\x20name=\x22dlEnvMode\x22\x20value=\x22selected\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22backupEnvMode===\x27selected\x27\x22\x20@change=\x22backupEnvMode=\x27selected\x27\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Select…</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupEnvMode===\x27selected\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;padding:10px;background:var(--okdb-app-bg-deep);border-radius:8px;border:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22userEnvs\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22backupSelEnvs[e.name]\x20?\x20\x27background:var(--okdb-app-surface);border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);\x27\x20:\x20\x27background:var(--okdb-app-surface);border-color:var(--okdb-app-border);opacity:.55;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:flex;align-items:center;gap:5px;padding:5px\x2011px;border-radius:999px;font-size:12px;cursor:pointer;border:1px\x20solid;transition:all\x20.12s;user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!backupSelEnvs[e.name]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22backupSelEnvs={...backupSelEnvs,[e.name]:$el.checked}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:none;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22backupSelEnvs[e.name]?\x27color:var(--okdb-purple);font-size:10px;\x27:\x27display:none;\x27\x22>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{e.name}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupDlError\x22><div\x20class=\x22dops-error\x22>{{backupDlError}}</div></if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupDlDone\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-success\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2020%,\x20transparent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-weight:600;color:var(--okdb-app-fg);\x22>Downloaded</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;font-size:11px;\x22>{{formatBytes(backupDlDone.bytes)}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-family:monospace;font-size:10px;opacity:.35;margin-top:5px;word-break:break-all;\x22>{{backupDlDone.filename}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;justify-content:flex-end;margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22close()\x22\x20class=\x22dops-btn-ghost\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runDownloadBackup()\x22\x20:disabled=\x22!canBackupDl\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22padding:8px\x2020px;border-radius:8px;font-size:13px;font-weight:600;background:linear-gradient(135deg,#1e1530,#150f22);border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-purple)\x2033%,\x20transparent);color:var(--okdb-purple);cursor:pointer;display:flex;align-items:center;gap:6px;transition:all\x20.15s;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupDlBusy\x22><span\x20class=\x22dops-spinner\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);border-top-color:var(--okdb-purple);\x22></span>\x20Downloading…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!backupDlBusy\x22>⬇\x20Download\x20Backup</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a</div>\x0a\x0a<style>\x0a\x20\x20.dops-field\x20{\x20display:flex;\x20flex-direction:column;\x20gap:5px;\x20}\x0a\x20\x20.dops-label\x20{\x20font-size:12px;\x20opacity:.6;\x20font-weight:500;\x20}\x0a\x20\x20.dops-input\x20{\x0a\x20\x20\x20\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x0a\x20\x20\x20\x20color:inherit;\x20padding:7px\x2010px;\x20font-size:13px;\x20width:100%;\x0a\x20\x20\x20\x20box-sizing:border-box;\x20transition:border-color\x20.15s;\x0a\x20\x20}\x0a\x20\x20.dops-input:focus\x20{\x20outline:none;\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x20}\x0a\x20\x20.dops-select\x20{\x0a\x20\x20\x20\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x0a\x20\x20\x20\x20color:inherit;\x20padding:7px\x2010px;\x20font-size:13px;\x20width:100%;\x20box-sizing:border-box;\x20cursor:pointer;\x0a\x20\x20}\x0a\x20\x20.dops-select:focus\x20{\x20outline:none;\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x20}\x0a\x20\x20.dops-check\x20{\x20display:flex;\x20align-items:center;\x20gap:8px;\x20font-size:13px;\x20cursor:pointer;\x20user-select:none;\x20}\x0a\x20\x20.dops-micro\x20{\x0a\x20\x20\x20\x20padding:2px\x208px;\x20border-radius:4px;\x20font-size:10px;\x20background:transparent;\x0a\x20\x20\x20\x20border:1px\x20solid\x20var(--okdb-app-border);\x20opacity:.5;\x20cursor:pointer;\x20transition:opacity\x20.1s;\x0a\x20\x20}\x0a\x20\x20.dops-micro:hover\x20{\x20opacity:.85;\x20}\x0a\x20\x20.dops-error\x20{\x0a\x20\x20\x20\x20background:#2a1010;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2027%,\x20transparent);\x20border-radius:8px;\x0a\x20\x20\x20\x20padding:10px\x2012px;\x20font-size:12px;\x20color:var(--okdb-danger);\x20line-height:1.5;\x0a\x20\x20}\x0a\x20\x20.dops-success\x20{\x0a\x20\x20\x20\x20background:#0d1a14;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x2020%,\x20transparent);\x20border-radius:8px;\x0a\x20\x20\x20\x20padding:12px\x2014px;\x20font-size:13px;\x20color:#d1fae5;\x0a\x20\x20}\x0a\x20\x20.dops-stat\x20{\x0a\x20\x20\x20\x20background:#071410;\x20border-radius:6px;\x20padding:8px;\x20text-align:center;\x20font-size:11px;\x20opacity:.8;\x0a\x20\x20}\x0a\x20\x20.dops-stat-n\x20{\x20font-size:18px;\x20font-weight:700;\x20color:var(--okdb-success);\x20}\x0a\x20\x20.dops-btn-primary\x20{\x0a\x20\x20\x20\x20padding:8px\x2020px;\x20border-radius:8px;\x20font-size:13px;\x20font-weight:600;\x0a\x20\x20\x20\x20background:linear-gradient(135deg,#1e4060,#1a3050);\x0a\x20\x20\x20\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x20color:var(--okdb-accent);\x0a\x20\x20\x20\x20cursor:pointer;\x20display:flex;\x20align-items:center;\x20gap:6px;\x20transition:all\x20.15s;\x0a\x20\x20}\x0a\x20\x20.dops-btn-primary:hover:not(:disabled)\x20{\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2053%,\x20transparent);\x20}\x0a\x20\x20.dops-btn-primary:disabled\x20{\x20opacity:.35;\x20cursor:not-allowed;\x20}\x0a\x20\x20.dops-btn-ghost\x20{\x0a\x20\x20\x20\x20padding:8px\x2016px;\x20border-radius:8px;\x20font-size:13px;\x0a\x20\x20\x20\x20background:transparent;\x20border:1px\x20solid\x20var(--okdb-app-border);\x20opacity:.55;\x20cursor:pointer;\x0a\x20\x20}\x0a\x20\x20.dops-btn-ghost:hover\x20{\x20opacity:.85;\x20}\x0a\x20\x20.dops-spinner\x20{\x0a\x20\x20\x20\x20display:inline-block;\x20width:12px;\x20height:12px;\x0a\x20\x20\x20\x20border:2px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2020%,\x20transparent);\x20border-top-color:var(--okdb-accent);\x0a\x20\x20\x20\x20border-radius:50%;\x20animation:dops-spin\x20.6s\x20linear\x20infinite;\x0a\x20\x20}\x0a\x20\x20@keyframes\x20dops-spin\x20{\x20to\x20{\x20transform:rotate(360deg);\x20}\x20}\x0a</style>\x0a','exportSelectedEnvNames','importBatchSize','dataTransfer','/system/export?','$attr','okdb-export-','87moGFRY','520456pMYOJy','initialTab','find','5159yVjQyu','importAllTypes','exportSelTypes','createElement','header','href','/system/backup','preventDefault','revokeObjectURL','importBusy'];_0x4d71=function(){return _0xd1d8e5;};return _0x4d71();}function _0x532a(_0x15ef28,_0x9ce57){_0x15ef28=_0x15ef28-0x1a0;const _0x4d7155=_0x4d71();let _0x532a3e=_0x4d7155[_0x15ef28];return _0x532a3e;}(function(_0x6d673f,_0x9d73bb){const _0x1a32a5=_0x532a,_0x17ea56=_0x6d673f();while(!![]){try{const _0x30a39f=parseInt(_0x1a32a5(0x1e4))/0x1+-parseInt(_0x1a32a5(0x1c3))/0x2*(-parseInt(_0x1a32a5(0x1e3))/0x3)+-parseInt(_0x1a32a5(0x218))/0x4*(parseInt(_0x1a32a5(0x216))/0x5)+-parseInt(_0x1a32a5(0x1ab))/0x6*(parseInt(_0x1a32a5(0x1e7))/0x7)+-parseInt(_0x1a32a5(0x1ad))/0x8*(parseInt(_0x1a32a5(0x217))/0x9)+-parseInt(_0x1a32a5(0x202))/0xa*(-parseInt(_0x1a32a5(0x1c4))/0xb)+parseInt(_0x1a32a5(0x214))/0xc*(-parseInt(_0x1a32a5(0x200))/0xd);if(_0x30a39f===_0x9d73bb)break;else _0x17ea56['push'](_0x17ea56['shift']());}catch(_0x27e957){_0x17ea56['push'](_0x17ea56['shift']());}}}(_0x4d71,0x455bf));export default{'tag':_0x19ed73(0x205),'attr':{'modal':{},'envs':{'default':()=>[]},'onDone':{},'initialTab':{'default':_0x19ed73(0x1a2)}},'context'(_0xbb70a2){const _0x369b77=_0x19ed73;function _0x42bc79(){const _0x10d080=_0x532a,_0x280432=new Date(),_0x2cbdb3=_0x2618ea=>String(_0x2618ea)['padStart'](0x2,'0');return _0x280432['getFullYear']()+'-'+_0x2cbdb3(_0x280432[_0x10d080(0x1d9)]()+0x1)+'-'+_0x2cbdb3(_0x280432[_0x10d080(0x1d4)]());}return{'tab':_0xbb70a2[_0x369b77(0x1e1)][_0x369b77(0x1e5)]||_0x369b77(0x1a2),'formatBytes':function(_0x2083b9){const _0x18c8fb=_0x369b77;if(null==_0x2083b9)return'--';const _0x109770=['B','KB','MB','GB','TB'];let _0x5ccb59=_0x2083b9,_0x1740b8=0x0;for(;_0x5ccb59>=0x400&&_0x1740b8<_0x109770['length']-0x1;)_0x5ccb59/=0x400,_0x1740b8++;return _0x5ccb59[_0x18c8fb(0x1a6)](0x0===_0x1740b8?0x0:0x2)+'\x20'+_0x109770[_0x1740b8];},get 'userEnvs'(){const _0xcbf0d4=_0x369b77;return(_0xbb70a2[_0xcbf0d4(0x1e1)][_0xcbf0d4(0x1a3)]||[])[_0xcbf0d4(0x1b9)](_0xca04a6=>!_0xca04a6[_0xcbf0d4(0x1a1)][_0xcbf0d4(0x1ac)]('~'));},'typesForEnv'(_0x378881){const _0x26642d=_0x369b77,_0x5cbfe8=(_0xbb70a2[_0x26642d(0x1e1)][_0x26642d(0x1a3)]||[])[_0x26642d(0x1e6)](_0x1fb261=>_0x1fb261['name']===_0x378881);return(_0x5cbfe8?.[_0x26642d(0x21e)]||[])[_0x26642d(0x1b9)](_0x25704e=>!_0x25704e[_0x26642d(0x1a1)][_0x26642d(0x1ac)]('~'))[_0x26642d(0x1a5)](_0x431b21=>_0x431b21[_0x26642d(0x1a1)]);},'exportSelEnvs':{},'exportIncludeChanges':!0x1,'exportBusy':!0x1,'exportError':null,'exportDone':null,'exportSelTypes':{},'exportAllTypes':!0x0,get 'exportSelectedEnvNames'(){const _0x132796=_0x369b77;return Object[_0x132796(0x1af)](this[_0x132796(0x1fd)])[_0x132796(0x1b9)](_0x140a95=>this[_0x132796(0x1fd)][_0x140a95]);},get 'exportIsSingleEnv'(){const _0x2b1d8=_0x369b77;return 0x1===this[_0x2b1d8(0x1dd)][_0x2b1d8(0x1c7)];},get 'exportSingleEnvTypes'(){const _0x2e3735=_0x369b77;return this[_0x2e3735(0x1b1)]?this['typesForEnv'](this[_0x2e3735(0x1dd)][0x0]):[];},get 'exportSelectedTypeNames'(){const _0x1cd5e8=_0x369b77;return!this['exportIsSingleEnv']||this['exportAllTypes']?null:Object[_0x1cd5e8(0x1af)](this[_0x1cd5e8(0x1e9)])[_0x1cd5e8(0x1b9)](_0x24bb92=>this[_0x1cd5e8(0x1e9)][_0x24bb92]);},get 'exportCanRun'(){const _0x41fddf=_0x369b77;return this['exportSelectedEnvNames'][_0x41fddf(0x1c7)]>0x0&&!this[_0x41fddf(0x1f9)];},'exportToggleAllEnvs'(_0x3c9fb1){const _0x175cfb=_0x369b77,_0x34f9d6={};for(const _0x3a6ce1 of this[_0x175cfb(0x1a8)])_0x34f9d6[_0x3a6ce1['name']]=_0x3c9fb1;this['exportSelEnvs']=_0x34f9d6;},'exportToggleAllTypes'(_0x2326aa){const _0x2e4b93=_0x369b77,_0x194ebe={};for(const _0x54cf0d of this[_0x2e4b93(0x210)])_0x194ebe[_0x54cf0d]=_0x2326aa;this[_0x2e4b93(0x1e9)]=_0x194ebe;},'exportInit'(){const _0x2400bc=_0x369b77;0x0===Object['keys'](this[_0x2400bc(0x1fd)])[_0x2400bc(0x1c7)]&&this[_0x2400bc(0x1a8)]['length']&&(this[_0x2400bc(0x1fd)]={[this[_0x2400bc(0x1a8)][0x0][_0x2400bc(0x1a1)]]:!0x0});},async 'runExport'(){const _0x43819b=_0x369b77;if(this[_0x43819b(0x20e)]){this[_0x43819b(0x1f9)]=!0x0,this[_0x43819b(0x1fc)]=null,this[_0x43819b(0x206)]=null;try{const _0x11d8e2=this[_0x43819b(0x1dd)],_0x2d6df1=_0x11d8e2['length']>0x1,_0x32caaf=new URLSearchParams();_0x2d6df1?_0x32caaf[_0x43819b(0x1d6)](_0x43819b(0x1a3),_0x11d8e2[_0x43819b(0x1cb)](',')):_0x32caaf[_0x43819b(0x1d6)](_0x43819b(0x1a0),_0x11d8e2[0x0]),this[_0x43819b(0x222)]&&_0x32caaf[_0x43819b(0x1d6)](_0x43819b(0x21f),_0x43819b(0x1f6));const _0x1663be=this[_0x43819b(0x1d2)];_0x1663be&&_0x1663be['length']&&_0x32caaf[_0x43819b(0x1d6)]('types',_0x1663be[_0x43819b(0x1cb)](','));const _0x51036e=await fetch(__ENV__[_0x43819b(0x208)]+_0x43819b(0x1e0)+_0x32caaf);if(!_0x51036e['ok']){const _0x582b35=await _0x51036e[_0x43819b(0x20b)]()[_0x43819b(0x203)](()=>({}));throw new Error(_0x582b35?.['error']?.[_0x43819b(0x1ca)]||_0x43819b(0x1d0)+_0x51036e[_0x43819b(0x1fa)]);}const _0x537c5d=await _0x51036e[_0x43819b(0x1a7)](),_0xade1f0=URL[_0x43819b(0x21b)](_0x537c5d),_0x3f832d=document['createElement']('a'),_0x14394f=_0x51036e[_0x43819b(0x1ba)][_0x43819b(0x1bb)]('content-disposition')||'',_0x13e415=_0x14394f[_0x43819b(0x213)](/filename="?([^"]+)"?/)?.[0x1]||_0x43819b(0x1e2)+_0x11d8e2[_0x43819b(0x1cb)]('+')+'-'+Date[_0x43819b(0x1a4)]()+'.ndjson';_0x3f832d[_0x43819b(0x1ec)]=_0xade1f0,_0x3f832d[_0x43819b(0x220)]=_0x13e415,document[_0x43819b(0x1ff)][_0x43819b(0x1c6)](_0x3f832d),_0x3f832d[_0x43819b(0x1c5)](),document[_0x43819b(0x1ff)]['removeChild'](_0x3f832d),URL['revokeObjectURL'](_0xade1f0);const _0x170bcd=(await _0x537c5d['text']())[_0x43819b(0x1ae)]('\x0a')[_0x43819b(0x1b9)](_0x5c921c=>_0x5c921c[_0x43819b(0x201)]())['map'](_0x5a27be=>{const _0x309969=_0x43819b;try{return JSON[_0x309969(0x1fb)](_0x5a27be);}catch{return null;}})['filter'](Boolean);this[_0x43819b(0x206)]={'filename':_0x13e415,'bytes':_0x537c5d['size'],'envCount':_0x2d6df1?_0x11d8e2[_0x43819b(0x1c7)]:0x1,'types':_0x170bcd[_0x43819b(0x1b9)](_0xda0814=>_0x43819b(0x1b2)===_0xda0814['r'])[_0x43819b(0x1c7)],'records':_0x170bcd['filter'](_0xfad137=>_0x43819b(0x1c2)===_0xfad137['r'])['length'],'changes':_0x170bcd[_0x43819b(0x1b9)](_0x2ea0e9=>_0x43819b(0x20d)===_0x2ea0e9['r'])[_0x43819b(0x1c7)]};}catch(_0x281994){this[_0x43819b(0x1fc)]=_0x281994?.['message']||String(_0x281994);}finally{this[_0x43819b(0x1f9)]=!0x1;}}},'importFile':null,'importEnvOverride':'','importSelTypes':{},'importAllTypes':!0x0,'importDropExisting':!0x1,'importIncludeChanges':!0x1,'importBatchSize':0x1f4,'importShowAdvanced':!0x1,'importBusy':!0x1,'importError':null,'importDone':null,'importDragOver':!0x1,'importFileTypes':[],get 'importSelectedTypeNames'(){const _0x1b0631=_0x369b77;return this[_0x1b0631(0x1e8)]?null:Object[_0x1b0631(0x1af)](this[_0x1b0631(0x211)])['filter'](_0x301f94=>this[_0x1b0631(0x211)][_0x301f94]);},get 'canImport'(){const _0x3f35ab=_0x369b77;return!!this[_0x3f35ab(0x204)]&&!this[_0x3f35ab(0x1f0)];},'onDrop'(_0x5f5092){const _0x4a1aeb=_0x369b77;_0x5f5092[_0x4a1aeb(0x1ee)](),this[_0x4a1aeb(0x221)]=!0x1;const _0x6140e=_0x5f5092[_0x4a1aeb(0x1df)]?.[_0x4a1aeb(0x21c)]?.[0x0];_0x6140e&&this[_0x4a1aeb(0x1d7)](_0x6140e);},'onDragOver'(_0x17bffa){const _0x5ef57d=_0x369b77;_0x17bffa[_0x5ef57d(0x1ee)](),this['importDragOver']=!0x0;},'onDragLeave'(){const _0x13c75a=_0x369b77;this[_0x13c75a(0x221)]=!0x1;},'pickFile'(){const _0x7dd8d2=_0x369b77,_0x392523=document[_0x7dd8d2(0x1ea)](_0x7dd8d2(0x1fe));_0x392523['type']=_0x7dd8d2(0x1f7),_0x392523[_0x7dd8d2(0x1bc)]=_0x7dd8d2(0x1b7),_0x392523[_0x7dd8d2(0x1a9)]=_0x57d8f1=>{const _0x2f6889=_0x7dd8d2,_0x4caa16=_0x57d8f1[_0x2f6889(0x1f8)][_0x2f6889(0x21c)]?.[0x0];_0x4caa16&&this[_0x2f6889(0x1d7)](_0x4caa16);},_0x392523[_0x7dd8d2(0x1c5)]();},async '_setImportFile'(_0x256980){const _0x5b72d7=_0x369b77;this[_0x5b72d7(0x204)]=_0x256980,this[_0x5b72d7(0x209)]=null,this[_0x5b72d7(0x1c0)]=null,this['importFileTypes']=[];try{const _0x4f9866=(await _0x256980[_0x5b72d7(0x1f2)](0x0,0x8000)[_0x5b72d7(0x215)]())['split']('\x0a')[_0x5b72d7(0x1b9)](_0x353e4a=>_0x353e4a[_0x5b72d7(0x201)]()),_0x2ba207=_0x4f9866[_0x5b72d7(0x1a5)](_0x141278=>{const _0x399edc=_0x5b72d7;try{return JSON[_0x399edc(0x1fb)](_0x141278);}catch{return null;}})[_0x5b72d7(0x1b9)](_0x3bd378=>_0x5b72d7(0x1b2)===_0x3bd378?.['r']);this[_0x5b72d7(0x21d)]=[...new Set(_0x2ba207[_0x5b72d7(0x1a5)](_0x2e1ac3=>_0x2e1ac3[_0x5b72d7(0x1cc)]))];const _0x247961=_0x4f9866[_0x5b72d7(0x1a5)](_0x1518e2=>{const _0x3accf4=_0x5b72d7;try{return JSON[_0x3accf4(0x1fb)](_0x1518e2);}catch{return null;}})[_0x5b72d7(0x1e6)](_0x568d55=>_0x5b72d7(0x1eb)===_0x568d55?.['r']);_0x247961?.[_0x5b72d7(0x1d1)]&&this[_0x5b72d7(0x1da)];}catch{}},'importToggleAllTypes'(_0x492b68){const _0x55584=_0x369b77,_0x4baa6f={};for(const _0x31c085 of this[_0x55584(0x21d)])_0x4baa6f[_0x31c085]=_0x492b68;this[_0x55584(0x211)]=_0x4baa6f;},async 'runImport'(){const _0x5058e7=_0x369b77;if(this['importFile']){this[_0x5058e7(0x1f0)]=!0x0,this[_0x5058e7(0x209)]=null,this[_0x5058e7(0x1c0)]=null;try{const _0x5cae56=new URLSearchParams({'dropExisting':String(this[_0x5058e7(0x1f5)]),'includeChanges':String(this[_0x5058e7(0x20c)]),'batchSize':String(this[_0x5058e7(0x1de)]||0x1f4)});this[_0x5058e7(0x1da)]&&_0x5cae56[_0x5058e7(0x1d6)](_0x5058e7(0x1a0),this[_0x5058e7(0x1da)]);const _0x1da042=this['importSelectedTypeNames'];_0x1da042&&_0x1da042[_0x5058e7(0x1c7)]&&_0x5cae56[_0x5058e7(0x1d6)]('types',_0x1da042[_0x5058e7(0x1cb)](','));const _0x382a3d=await fetch(__ENV__[_0x5058e7(0x208)]+_0x5058e7(0x1cf)+_0x5cae56,{'method':_0x5058e7(0x1c8),'headers':{'content-type':_0x5058e7(0x1ce)},'body':this[_0x5058e7(0x204)]}),_0x259eaf=await _0x382a3d[_0x5058e7(0x20b)]()['catch'](()=>({}));if(!_0x382a3d['ok'])throw new Error(_0x259eaf?.[_0x5058e7(0x1db)]?.[_0x5058e7(0x1ca)]||_0x5058e7(0x1d0)+_0x382a3d[_0x5058e7(0x1fa)]);const _0x4caafd=_0x259eaf[_0x5058e7(0x1c2)]??_0x259eaf;this[_0x5058e7(0x1c0)]={'types':_0x4caafd['types']??0x0,'records':_0x4caafd[_0x5058e7(0x1be)]??0x0,'changes':_0x4caafd[_0x5058e7(0x1f1)]??0x0},_0xbb70a2[_0x5058e7(0x1e1)][_0x5058e7(0x207)]?.();}catch(_0x2e1949){this[_0x5058e7(0x209)]=_0x2e1949?.[_0x5058e7(0x1ca)]||String(_0x2e1949);}finally{this[_0x5058e7(0x1f0)]=!0x1;}}},'backupMode':'server','backupDestDir':_0x369b77(0x1b8)+_0x42bc79(),'backupSelEnvs':{},'backupEnvMode':_0x369b77(0x1b3),'backupCompact':!0x0,'backupBusy':!0x1,'backupError':null,'backupResult':null,'backupDlBusy':!0x1,'backupDlError':null,'backupDlDone':null,get 'backupEnvNames'(){const _0x8e139e=_0x369b77;return _0x8e139e(0x1b3)===this['backupEnvMode']?null:Object[_0x8e139e(0x1af)](this[_0x8e139e(0x1aa)])['filter'](_0x5e49f7=>this[_0x8e139e(0x1aa)][_0x5e49f7]);},get 'canBackup'(){const _0x4a5cb6=_0x369b77;return this['backupDestDir']['trim']()[_0x4a5cb6(0x1c7)]>0x0&&!this[_0x4a5cb6(0x1b4)];},get 'canBackupDl'(){const _0x1b00e4=_0x369b77;return!this[_0x1b00e4(0x20f)];},async 'runBackup'(){const _0xed5fa6=_0x369b77;if(this[_0xed5fa6(0x1f4)]){this[_0xed5fa6(0x1b4)]=!0x0,this['backupError']=null,this[_0xed5fa6(0x1d3)]=null;try{const _0x2fd754=await fetch(__ENV__[_0xed5fa6(0x208)]+_0xed5fa6(0x1ed),{'method':_0xed5fa6(0x1c8),'headers':{'content-type':_0xed5fa6(0x1bf)},'body':JSON[_0xed5fa6(0x1c1)]({'destDir':this['backupDestDir'][_0xed5fa6(0x201)](),'envNames':this['backupEnvNames'],'compact':this[_0xed5fa6(0x20a)]})}),_0xe237a9=await _0x2fd754[_0xed5fa6(0x20b)]()[_0xed5fa6(0x203)](()=>({}));if(!_0x2fd754['ok'])throw new Error(_0xe237a9?.[_0xed5fa6(0x1db)]?.[_0xed5fa6(0x1ca)]||_0xed5fa6(0x1d0)+_0x2fd754[_0xed5fa6(0x1fa)]);this[_0xed5fa6(0x1d3)]=_0xe237a9['data']??_0xe237a9;}catch(_0x133826){this[_0xed5fa6(0x1b0)]=_0x133826?.[_0xed5fa6(0x1ca)]||String(_0x133826);}finally{this[_0xed5fa6(0x1b4)]=!0x1;}}},async 'runDownloadBackup'(){const _0x5e16be=_0x369b77;this['backupDlBusy']=!0x0,this[_0x5e16be(0x1f3)]=null,this['backupDlDone']=null;try{const _0x4abe91=this[_0x5e16be(0x21a)],_0x3cc4fd=new URLSearchParams();_0x4abe91?.[_0x5e16be(0x1c7)]?_0x3cc4fd[_0x5e16be(0x1d6)](_0x5e16be(0x1a3),_0x4abe91[_0x5e16be(0x1cb)](',')):_0x3cc4fd[_0x5e16be(0x1d6)](_0x5e16be(0x1a3),this[_0x5e16be(0x1a8)]['map'](_0x5d3663=>_0x5d3663[_0x5e16be(0x1a1)])[_0x5e16be(0x1cb)](','));const _0x8be961=await fetch(__ENV__[_0x5e16be(0x208)]+_0x5e16be(0x1e0)+_0x3cc4fd);if(!_0x8be961['ok']){const _0x54b3f0=await _0x8be961['json']()[_0x5e16be(0x203)](()=>({}));throw new Error(_0x54b3f0?.[_0x5e16be(0x1db)]||'HTTP\x20'+_0x8be961['status']);}const _0x42f2ee=await _0x8be961[_0x5e16be(0x1a7)](),_0x4a105d=URL['createObjectURL'](_0x42f2ee),_0x269246=document[_0x5e16be(0x1ea)]('a'),_0x3b1304=_0x8be961[_0x5e16be(0x1ba)]['get'](_0x5e16be(0x1c9))||'',_0x327949=_0x3b1304[_0x5e16be(0x213)](/filename="?([^"]+)"?/)?.[0x1]||_0x5e16be(0x1cd)+_0x42bc79()+_0x5e16be(0x1b6);_0x269246[_0x5e16be(0x1ec)]=_0x4a105d,_0x269246[_0x5e16be(0x220)]=_0x327949,document[_0x5e16be(0x1ff)]['appendChild'](_0x269246),_0x269246[_0x5e16be(0x1c5)](),document[_0x5e16be(0x1ff)][_0x5e16be(0x219)](_0x269246),URL[_0x5e16be(0x1ef)](_0x4a105d),this[_0x5e16be(0x1d5)]={'filename':_0x327949,'bytes':_0x42f2ee[_0x5e16be(0x1d8)]};}catch(_0x4b71f9){this[_0x5e16be(0x1f3)]=_0x4b71f9?.['message']||String(_0x4b71f9);}finally{this[_0x5e16be(0x20f)]=!0x1;}},'close'(){const _0x44f333=_0x369b77;_0xbb70a2[_0x44f333(0x1e1)][_0x44f333(0x1bd)][_0x44f333(0x1b5)]();},'mount'(){const _0x45df81=_0x369b77;this[_0x45df81(0x212)]();}};},'template':_0x19ed73(0x1dc)};
|
|
1
|
+
const _0xf3506c=_0x326b;function _0x2c8c(){const _0x29f57a=['$attr','1086234mfWTio','API','96684AwrzbO','json','exportSelectedEnvNames','stringify','application/json','dataTransfer','exportSingleEnvTypes','exportIncludeChanges','change','/system/backup','set','filter','preventDefault','backupCompact','getMonth','files','1099UNOeqG','POST','split','userEnvs','canBackup','removeChild','importSelectedTypeNames','get','match','importIncludeChanges','importBusy','backupEnvNames','exportDone','exportCanRun','length','join','size','backupError','backupDlDone','typesForEnv','exportAllTypes','env','exportSelectedTypeNames','parse','createObjectURL','importEnvOverride','importFile','backupDlError','envs','find','importFileTypes','.ndjson','changes','target','name','appendChild','content-disposition','_setImportFile','server','modal','backupSelEnvs','download','10tEuBlI','importDragOver','schema','importDone','startsWith','catch','10DDVmYa','backupBusy','545612BYFpck','./okdb-backup-','exportIsSingleEnv','includeChanges','2893VVjRdl','file','importDropExisting','headers','keys','exportError','importSelTypes','createElement','/system/import?','body','backupResult','importError','revokeObjectURL','111276ghmATH','getDate','backupEnvMode','HTTP\x20','exportBusy','status','click','436276RsFOjF','padStart','getFullYear','trim','types','type','now','message','onDone','map','6301683AnZrAQ','exportInit','15CszYzL','backupDlBusy','error','header','input','exportSelEnvs','href','importBatchSize','export','true','data','slice','44776qcvlIe','/system/export?','backupDestDir','exportSelTypes','text','onchange','accept','okdb-backup-','all'];_0x2c8c=function(){return _0x29f57a;};return _0x2c8c();}function _0x326b(_0x475194,_0x3060c9){_0x475194=_0x475194-0x8a;const _0x2c8c91=_0x2c8c();let _0x326be9=_0x2c8c91[_0x475194];return _0x326be9;}(function(_0x4eb021,_0x7dc6dc){const _0x2799c5=_0x326b,_0x15e458=_0x4eb021();while(!![]){try{const _0x575b79=parseInt(_0x2799c5(0xef))/0x1+-parseInt(_0x2799c5(0xf6))/0x2*(-parseInt(_0x2799c5(0x102))/0x3)+parseInt(_0x2799c5(0xde))/0x4*(-parseInt(_0x2799c5(0xdc))/0x5)+parseInt(_0x2799c5(0x9a))/0x6+parseInt(_0x2799c5(0xac))/0x7*(parseInt(_0x2799c5(0x90))/0x8)+-parseInt(_0x2799c5(0x100))/0x9*(-parseInt(_0x2799c5(0xd6))/0xa)+parseInt(_0x2799c5(0xe2))/0xb*(-parseInt(_0x2799c5(0x9c))/0xc);if(_0x575b79===_0x7dc6dc)break;else _0x15e458['push'](_0x15e458['shift']());}catch(_0x4921ff){_0x15e458['push'](_0x15e458['shift']());}}}(_0x2c8c,0x8b30c));export default{'tag':'data-ops-modal','attr':{'modal':{},'envs':{'default':()=>[]},'onDone':{},'initialTab':{'default':_0xf3506c(0x8c)}},'context'(_0x513b88){const _0x5b21d7=_0xf3506c;function _0x9fe9cb(){const _0x178d6c=_0x326b,_0x11b76f=new Date(),_0x79d5fd=_0x21da75=>String(_0x21da75)[_0x178d6c(0xf7)](0x2,'0');return _0x11b76f[_0x178d6c(0xf8)]()+'-'+_0x79d5fd(_0x11b76f[_0x178d6c(0xaa)]()+0x1)+'-'+_0x79d5fd(_0x11b76f[_0x178d6c(0xf0)]());}return{'tab':_0x513b88[_0x5b21d7(0x99)]['initialTab']||_0x5b21d7(0x8c),'formatBytes':function(_0x5ac36f){if(null==_0x5ac36f)return'--';const _0x49ce1a=['B','KB','MB','GB','TB'];let _0x1202b6=_0x5ac36f,_0x44d7d4=0x0;for(;_0x1202b6>=0x400&&_0x44d7d4<_0x49ce1a['length']-0x1;)_0x1202b6/=0x400,_0x44d7d4++;return _0x1202b6['toFixed'](0x0===_0x44d7d4?0x0:0x2)+'\x20'+_0x49ce1a[_0x44d7d4];},get 'userEnvs'(){const _0x7bdcb4=_0x5b21d7;return(_0x513b88[_0x7bdcb4(0x99)][_0x7bdcb4(0xc8)]||[])[_0x7bdcb4(0xa7)](_0x138620=>!_0x138620[_0x7bdcb4(0xce)]['startsWith']('~'));},'typesForEnv'(_0x6ca242){const _0x4b6f63=_0x5b21d7,_0x3a50a7=(_0x513b88['$attr'][_0x4b6f63(0xc8)]||[])[_0x4b6f63(0xc9)](_0x3920ba=>_0x3920ba[_0x4b6f63(0xce)]===_0x6ca242);return(_0x3a50a7?.['types']||[])[_0x4b6f63(0xa7)](_0x2f402b=>!_0x2f402b[_0x4b6f63(0xce)][_0x4b6f63(0xda)]('~'))['map'](_0x55d0ce=>_0x55d0ce['name']);},'exportSelEnvs':{},'exportIncludeChanges':!0x1,'exportBusy':!0x1,'exportError':null,'exportDone':null,'exportSelTypes':{},'exportAllTypes':!0x0,get 'exportSelectedEnvNames'(){const _0x438c3c=_0x5b21d7;return Object[_0x438c3c(0xe6)](this[_0x438c3c(0x107)])[_0x438c3c(0xa7)](_0x57b288=>this[_0x438c3c(0x107)][_0x57b288]);},get 'exportIsSingleEnv'(){const _0x5c46f0=_0x5b21d7;return 0x1===this[_0x5c46f0(0x9e)][_0x5c46f0(0xba)];},get 'exportSingleEnvTypes'(){const _0x5c2ccf=_0x5b21d7;return this[_0x5c2ccf(0xe0)]?this[_0x5c2ccf(0xbf)](this[_0x5c2ccf(0x9e)][0x0]):[];},get 'exportSelectedTypeNames'(){const _0x16a7a8=_0x5b21d7;return!this[_0x16a7a8(0xe0)]||this[_0x16a7a8(0xc0)]?null:Object['keys'](this[_0x16a7a8(0x93)])['filter'](_0xcb5ed9=>this[_0x16a7a8(0x93)][_0xcb5ed9]);},get 'exportCanRun'(){const _0x6a2735=_0x5b21d7;return this[_0x6a2735(0x9e)]['length']>0x0&&!this['exportBusy'];},'exportToggleAllEnvs'(_0x3346c3){const _0x8243a0=_0x5b21d7,_0x1900ae={};for(const _0x5114b7 of this[_0x8243a0(0xaf)])_0x1900ae[_0x5114b7[_0x8243a0(0xce)]]=_0x3346c3;this[_0x8243a0(0x107)]=_0x1900ae;},'exportToggleAllTypes'(_0x3a0995){const _0x5f5168=_0x5b21d7,_0x46a77d={};for(const _0x53a059 of this[_0x5f5168(0xa2)])_0x46a77d[_0x53a059]=_0x3a0995;this['exportSelTypes']=_0x46a77d;},'exportInit'(){const _0x199ee0=_0x5b21d7;0x0===Object[_0x199ee0(0xe6)](this[_0x199ee0(0x107)])[_0x199ee0(0xba)]&&this[_0x199ee0(0xaf)][_0x199ee0(0xba)]&&(this[_0x199ee0(0x107)]={[this['userEnvs'][0x0]['name']]:!0x0});},async 'runExport'(){const _0x18a4ed=_0x5b21d7;if(this[_0x18a4ed(0xb9)]){this[_0x18a4ed(0xf3)]=!0x0,this[_0x18a4ed(0xe7)]=null,this[_0x18a4ed(0xb8)]=null;try{const _0x162d48=this[_0x18a4ed(0x9e)],_0x562971=_0x162d48['length']>0x1,_0x4a913d=new URLSearchParams();_0x562971?_0x4a913d[_0x18a4ed(0xa6)](_0x18a4ed(0xc8),_0x162d48[_0x18a4ed(0xbb)](',')):_0x4a913d[_0x18a4ed(0xa6)](_0x18a4ed(0xc1),_0x162d48[0x0]),this[_0x18a4ed(0xa3)]&&_0x4a913d[_0x18a4ed(0xa6)](_0x18a4ed(0xe1),_0x18a4ed(0x8d));const _0x11d864=this[_0x18a4ed(0xc2)];_0x11d864&&_0x11d864['length']&&_0x4a913d[_0x18a4ed(0xa6)](_0x18a4ed(0xfa),_0x11d864[_0x18a4ed(0xbb)](','));const _0x3537d1=await fetch(__ENV__[_0x18a4ed(0x9b)]+_0x18a4ed(0x91)+_0x4a913d);if(!_0x3537d1['ok']){const _0x162f32=await _0x3537d1[_0x18a4ed(0x9d)]()['catch'](()=>({}));throw new Error(_0x162f32?.[_0x18a4ed(0x104)]?.['message']||_0x18a4ed(0xf2)+_0x3537d1[_0x18a4ed(0xf4)]);}const _0x43e6ab=await _0x3537d1['blob'](),_0x4db149=URL[_0x18a4ed(0xc4)](_0x43e6ab),_0x48c781=document[_0x18a4ed(0xe9)]('a'),_0x104a47=_0x3537d1[_0x18a4ed(0xe5)]['get'](_0x18a4ed(0xd0))||'',_0x1053b0=_0x104a47['match'](/filename="?([^"]+)"?/)?.[0x1]||'okdb-export-'+_0x162d48[_0x18a4ed(0xbb)]('+')+'-'+Date[_0x18a4ed(0xfc)]()+_0x18a4ed(0xcb);_0x48c781['href']=_0x4db149,_0x48c781[_0x18a4ed(0xd5)]=_0x1053b0,document[_0x18a4ed(0xeb)][_0x18a4ed(0xcf)](_0x48c781),_0x48c781[_0x18a4ed(0xf5)](),document['body'][_0x18a4ed(0xb1)](_0x48c781),URL['revokeObjectURL'](_0x4db149);const _0x190a05=(await _0x43e6ab[_0x18a4ed(0x94)]())[_0x18a4ed(0xae)]('\x0a')[_0x18a4ed(0xa7)](_0x264dba=>_0x264dba[_0x18a4ed(0xf9)]())[_0x18a4ed(0xff)](_0x1c4daf=>{const _0x1f30ec=_0x18a4ed;try{return JSON[_0x1f30ec(0xc3)](_0x1c4daf);}catch{return null;}})[_0x18a4ed(0xa7)](Boolean);this[_0x18a4ed(0xb8)]={'filename':_0x1053b0,'bytes':_0x43e6ab[_0x18a4ed(0xbc)],'envCount':_0x562971?_0x162d48[_0x18a4ed(0xba)]:0x1,'types':_0x190a05[_0x18a4ed(0xa7)](_0x368b46=>_0x18a4ed(0xd8)===_0x368b46['r'])[_0x18a4ed(0xba)],'records':_0x190a05['filter'](_0x1d8360=>_0x18a4ed(0x8e)===_0x1d8360['r'])[_0x18a4ed(0xba)],'changes':_0x190a05[_0x18a4ed(0xa7)](_0x2d959f=>_0x18a4ed(0xa4)===_0x2d959f['r'])[_0x18a4ed(0xba)]};}catch(_0x2eaf1e){this[_0x18a4ed(0xe7)]=_0x2eaf1e?.[_0x18a4ed(0xfd)]||String(_0x2eaf1e);}finally{this['exportBusy']=!0x1;}}},'importFile':null,'importEnvOverride':'','importSelTypes':{},'importAllTypes':!0x0,'importDropExisting':!0x1,'importIncludeChanges':!0x1,'importBatchSize':0x1f4,'importShowAdvanced':!0x1,'importBusy':!0x1,'importError':null,'importDone':null,'importDragOver':!0x1,'importFileTypes':[],get 'importSelectedTypeNames'(){const _0x4f28a7=_0x5b21d7;return this['importAllTypes']?null:Object['keys'](this[_0x4f28a7(0xe8)])[_0x4f28a7(0xa7)](_0x3ee5f1=>this[_0x4f28a7(0xe8)][_0x3ee5f1]);},get 'canImport'(){const _0x17c751=_0x5b21d7;return!!this[_0x17c751(0xc6)]&&!this['importBusy'];},'onDrop'(_0x395971){const _0x65e5c6=_0x5b21d7;_0x395971[_0x65e5c6(0xa8)](),this[_0x65e5c6(0xd7)]=!0x1;const _0x10cdc0=_0x395971[_0x65e5c6(0xa1)]?.['files']?.[0x0];_0x10cdc0&&this[_0x65e5c6(0xd1)](_0x10cdc0);},'onDragOver'(_0x2e6d11){const _0x40e6e9=_0x5b21d7;_0x2e6d11[_0x40e6e9(0xa8)](),this[_0x40e6e9(0xd7)]=!0x0;},'onDragLeave'(){const _0x20fe46=_0x5b21d7;this[_0x20fe46(0xd7)]=!0x1;},'pickFile'(){const _0x337644=_0x5b21d7,_0x2663c3=document[_0x337644(0xe9)](_0x337644(0x106));_0x2663c3[_0x337644(0xfb)]=_0x337644(0xe3),_0x2663c3[_0x337644(0x96)]='.ndjson,.jsonl,.json,.txt',_0x2663c3[_0x337644(0x95)]=_0x2e75f8=>{const _0x52a8a2=_0x337644,_0x6fa99e=_0x2e75f8[_0x52a8a2(0xcd)][_0x52a8a2(0xab)]?.[0x0];_0x6fa99e&&this[_0x52a8a2(0xd1)](_0x6fa99e);},_0x2663c3[_0x337644(0xf5)]();},async '_setImportFile'(_0x4f960e){const _0x5910ac=_0x5b21d7;this[_0x5910ac(0xc6)]=_0x4f960e,this['importError']=null,this['importDone']=null,this[_0x5910ac(0xca)]=[];try{const _0xbbe980=(await _0x4f960e[_0x5910ac(0x8f)](0x0,0x8000)['text']())[_0x5910ac(0xae)]('\x0a')[_0x5910ac(0xa7)](_0x23b32c=>_0x23b32c['trim']()),_0xfe4926=_0xbbe980['map'](_0x239f23=>{const _0x3529b0=_0x5910ac;try{return JSON[_0x3529b0(0xc3)](_0x239f23);}catch{return null;}})[_0x5910ac(0xa7)](_0xabce0=>'schema'===_0xabce0?.['r']);this['importFileTypes']=[...new Set(_0xfe4926['map'](_0x8db22f=>_0x8db22f[_0x5910ac(0xfb)]))];const _0x27e246=_0xbbe980['map'](_0x49772a=>{try{return JSON['parse'](_0x49772a);}catch{return null;}})[_0x5910ac(0xc9)](_0x59bbaa=>_0x5910ac(0x105)===_0x59bbaa?.['r']);_0x27e246?.['envName']&&this['importEnvOverride'];}catch{}},'importToggleAllTypes'(_0x1eb333){const _0xfb5c5c=_0x5b21d7,_0x57206f={};for(const _0x3ca370 of this[_0xfb5c5c(0xca)])_0x57206f[_0x3ca370]=_0x1eb333;this['importSelTypes']=_0x57206f;},async 'runImport'(){const _0xb8acc7=_0x5b21d7;if(this[_0xb8acc7(0xc6)]){this[_0xb8acc7(0xb6)]=!0x0,this[_0xb8acc7(0xed)]=null,this[_0xb8acc7(0xd9)]=null;try{const _0x3794aa=new URLSearchParams({'dropExisting':String(this[_0xb8acc7(0xe4)]),'includeChanges':String(this[_0xb8acc7(0xb5)]),'batchSize':String(this[_0xb8acc7(0x8b)]||0x1f4)});this[_0xb8acc7(0xc5)]&&_0x3794aa['set'](_0xb8acc7(0xc1),this[_0xb8acc7(0xc5)]);const _0x51a9c2=this[_0xb8acc7(0xb2)];_0x51a9c2&&_0x51a9c2[_0xb8acc7(0xba)]&&_0x3794aa[_0xb8acc7(0xa6)]('types',_0x51a9c2[_0xb8acc7(0xbb)](','));const _0xb52d89=await fetch(__ENV__['API']+_0xb8acc7(0xea)+_0x3794aa,{'method':_0xb8acc7(0xad),'headers':{'content-type':'application/x-ndjson'},'body':this[_0xb8acc7(0xc6)]}),_0x5c7440=await _0xb52d89[_0xb8acc7(0x9d)]()[_0xb8acc7(0xdb)](()=>({}));if(!_0xb52d89['ok'])throw new Error(_0x5c7440?.[_0xb8acc7(0x104)]?.[_0xb8acc7(0xfd)]||_0xb8acc7(0xf2)+_0xb52d89['status']);const _0x4daa6c=_0x5c7440['data']??_0x5c7440;this['importDone']={'types':_0x4daa6c[_0xb8acc7(0xfa)]??0x0,'records':_0x4daa6c['records']??0x0,'changes':_0x4daa6c[_0xb8acc7(0xcc)]??0x0},_0x513b88['$attr'][_0xb8acc7(0xfe)]?.();}catch(_0x942055){this[_0xb8acc7(0xed)]=_0x942055?.[_0xb8acc7(0xfd)]||String(_0x942055);}finally{this['importBusy']=!0x1;}}},'backupMode':_0x5b21d7(0xd2),'backupDestDir':_0x5b21d7(0xdf)+_0x9fe9cb(),'backupSelEnvs':{},'backupEnvMode':_0x5b21d7(0x98),'backupCompact':!0x0,'backupBusy':!0x1,'backupError':null,'backupResult':null,'backupDlBusy':!0x1,'backupDlError':null,'backupDlDone':null,get 'backupEnvNames'(){const _0x1c2265=_0x5b21d7;return'all'===this[_0x1c2265(0xf1)]?null:Object[_0x1c2265(0xe6)](this[_0x1c2265(0xd4)])[_0x1c2265(0xa7)](_0x2ac0f0=>this[_0x1c2265(0xd4)][_0x2ac0f0]);},get 'canBackup'(){const _0x33c2c1=_0x5b21d7;return this[_0x33c2c1(0x92)][_0x33c2c1(0xf9)]()['length']>0x0&&!this['backupBusy'];},get 'canBackupDl'(){const _0x4e0cae=_0x5b21d7;return!this[_0x4e0cae(0x103)];},async 'runBackup'(){const _0x14390b=_0x5b21d7;if(this[_0x14390b(0xb0)]){this[_0x14390b(0xdd)]=!0x0,this[_0x14390b(0xbd)]=null,this[_0x14390b(0xec)]=null;try{const _0x421c4b=await fetch(__ENV__[_0x14390b(0x9b)]+_0x14390b(0xa5),{'method':_0x14390b(0xad),'headers':{'content-type':_0x14390b(0xa0)},'body':JSON[_0x14390b(0x9f)]({'destDir':this[_0x14390b(0x92)][_0x14390b(0xf9)](),'envNames':this[_0x14390b(0xb7)],'compact':this[_0x14390b(0xa9)]})}),_0x3051b2=await _0x421c4b[_0x14390b(0x9d)]()[_0x14390b(0xdb)](()=>({}));if(!_0x421c4b['ok'])throw new Error(_0x3051b2?.['error']?.[_0x14390b(0xfd)]||_0x14390b(0xf2)+_0x421c4b['status']);this[_0x14390b(0xec)]=_0x3051b2['data']??_0x3051b2;}catch(_0x30e03b){this['backupError']=_0x30e03b?.[_0x14390b(0xfd)]||String(_0x30e03b);}finally{this[_0x14390b(0xdd)]=!0x1;}}},async 'runDownloadBackup'(){const _0x49be60=_0x5b21d7;this[_0x49be60(0x103)]=!0x0,this[_0x49be60(0xc7)]=null,this['backupDlDone']=null;try{const _0x1c6a6a=this[_0x49be60(0xb7)],_0x21c096=new URLSearchParams();_0x1c6a6a?.[_0x49be60(0xba)]?_0x21c096[_0x49be60(0xa6)](_0x49be60(0xc8),_0x1c6a6a['join'](',')):_0x21c096[_0x49be60(0xa6)](_0x49be60(0xc8),this['userEnvs'][_0x49be60(0xff)](_0x5347f0=>_0x5347f0[_0x49be60(0xce)])['join'](','));const _0x44845e=await fetch(__ENV__['API']+'/system/export?'+_0x21c096);if(!_0x44845e['ok']){const _0x491c32=await _0x44845e['json']()[_0x49be60(0xdb)](()=>({}));throw new Error(_0x491c32?.['error']||_0x49be60(0xf2)+_0x44845e[_0x49be60(0xf4)]);}const _0x3c10ca=await _0x44845e['blob'](),_0x5dbe02=URL['createObjectURL'](_0x3c10ca),_0x2204fc=document[_0x49be60(0xe9)]('a'),_0x5497aa=_0x44845e[_0x49be60(0xe5)][_0x49be60(0xb3)](_0x49be60(0xd0))||'',_0x376514=_0x5497aa[_0x49be60(0xb4)](/filename="?([^"]+)"?/)?.[0x1]||_0x49be60(0x97)+_0x9fe9cb()+_0x49be60(0xcb);_0x2204fc[_0x49be60(0x8a)]=_0x5dbe02,_0x2204fc[_0x49be60(0xd5)]=_0x376514,document[_0x49be60(0xeb)][_0x49be60(0xcf)](_0x2204fc),_0x2204fc[_0x49be60(0xf5)](),document['body'][_0x49be60(0xb1)](_0x2204fc),URL[_0x49be60(0xee)](_0x5dbe02),this[_0x49be60(0xbe)]={'filename':_0x376514,'bytes':_0x3c10ca[_0x49be60(0xbc)]};}catch(_0x3d528e){this[_0x49be60(0xc7)]=_0x3d528e?.[_0x49be60(0xfd)]||String(_0x3d528e);}finally{this[_0x49be60(0x103)]=!0x1;}},'close'(){const _0x235ed4=_0x5b21d7;_0x513b88[_0x235ed4(0x99)][_0x235ed4(0xd3)]['close']();},'mount'(){const _0x4e1606=_0x5b21d7;this[_0x4e1606(0x101)]();}};},'template':'\x0a<div\x20style=\x22min-width:520px;\x20max-width:640px;\x20display:flex;\x20flex-direction:column;\x20gap:0;\x22>\x0a\x0a\x20\x20<!--\x20Tab\x20bar\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:2px;\x20padding:3px;\x20background:var(--okdb-app-bg-deep);\x20border-radius:9px;\x20margin-bottom:22px;\x20border:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20<button\x20@click=\x22tab=\x27export\x27\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27export\x27\x20?\x20\x27flex:1;background:var(--okdb-app-surface-2);color:var(--okdb-accent);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);font-weight:600;\x27\x20:\x20\x27flex:1;background:transparent;border-color:transparent;opacity:.5;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:7px\x200;border-radius:7px;font-size:13px;transition:all\x20.15s;cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20⬇\x20Export\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x20@click=\x22tab=\x27import\x27\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27import\x27\x20?\x20\x27flex:1;background:var(--okdb-app-surface-2);color:var(--okdb-accent);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);font-weight:600;\x27\x20:\x20\x27flex:1;background:transparent;border-color:transparent;opacity:.5;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:7px\x200;border-radius:7px;font-size:13px;transition:all\x20.15s;cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20⬆\x20Import\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x20@click=\x22tab=\x27backup\x27\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27backup\x27\x20?\x20\x27flex:1;background:var(--okdb-app-surface-2);color:var(--okdb-purple);border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);font-weight:600;\x27\x20:\x20\x27flex:1;background:transparent;border-color:transparent;opacity:.5;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:7px\x200;border-radius:7px;font-size:13px;transition:all\x20.15s;cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20🗄\x20Backup\x0a\x20\x20\x20\x20</button>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20═══\x20EXPORT\x20═══════════════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27export\x27\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:18px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.5;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Streaming\x20NDJSON\x20export\x20—\x20portable\x20across\x20OKDB\x20versions,\x20importable\x20into\x20any\x20instance.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Environments\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22flex:1;margin:0;\x22>Environments</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22exportToggleAllEnvs(true)\x22\x20\x20class=\x22dops-micro\x22>all</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22exportToggleAllEnvs(false)\x22\x20class=\x22dops-micro\x22>none</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22userEnvs\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22exportSelEnvs[e.name]\x20?\x20\x27background:var(--okdb-app-surface-2);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);color:#e2eaf4;\x27\x20:\x20\x27background:var(--okdb-app-surface);border-color:var(--okdb-app-border);opacity:.55;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:flex;align-items:center;gap:5px;padding:5px\x2011px;border-radius:999px;font-size:12px;cursor:pointer;border:1px\x20solid;transition:all\x20.12s;user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!exportSelEnvs[e.name]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22exportSelEnvs\x20=\x20{...exportSelEnvs,\x20[e.name]:\x20$el.checked}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:none;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22exportSelEnvs[e.name]\x20?\x20\x27color:var(--okdb-accent);font-size:10px;\x27\x20:\x20\x27display:none;\x27\x22>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{e.name}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;font-size:10px;\x22>{{e.types\x20?\x20e.types.filter(t=>!t.name.startsWith(\x27~\x27)).length\x20:\x200}}\x20types</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Types\x20(only\x20for\x20single\x20env)\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportIsSingleEnv\x20&&\x20exportSingleEnvTypes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22flex:1;margin:0;\x22>Types</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22\x20style=\x22font-size:11px;gap:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22exportAllTypes\x22\x20@change=\x22exportAllTypes\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x22>All\x20types</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!exportAllTypes\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:0;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:8px;overflow:hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;padding:5px\x2010px;border-bottom:1px\x20solid\x20var(--okdb-app-border);gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22exportToggleAllTypes(true)\x22\x20\x20class=\x22dops-micro\x22>all</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22exportToggleAllTypes(false)\x22\x20class=\x22dops-micro\x22>none</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;max-height:140px;overflow-y:auto;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22exportSingleEnvTypes\x22\x20let:t>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20style=\x22display:flex;align-items:center;gap:8px;padding:6px\x2010px;cursor:pointer;transition:background\x20.1s;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22exportSelTypes[t]\x20?\x20\x27background:#1a2a1a;\x27\x20:\x20\x27\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@mouseenter=\x22$el.style.background=exportSelTypes[t]?\x27#1a2a1a\x27:\x27var(--okdb-app-surface)\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@mouseleave=\x22$el.style.background=exportSelTypes[t]?\x27#1a2a1a\x27:\x27\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!exportSelTypes[t]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22exportSelTypes\x20=\x20{...exportSelTypes,\x20[t]:\x20$el.checked}\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;font-size:12px;\x22>{{t}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22!exportIsSingleEnv\x20&&\x20exportSelectedEnvNames.length\x20>\x201\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;opacity:.4;font-style:italic;\x22>All\x20types\x20will\x20be\x20exported\x20from\x20each\x20selected\x20environment.</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Options\x20-->\x0a\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22exportIncludeChanges\x22\x20@change=\x22exportIncludeChanges\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>Include\x20changelog\x20<span\x20style=\x22opacity:.4;font-size:11px;\x22>(sync\x20history)</span></span>\x0a\x20\x20\x20\x20\x20\x20</label>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportError\x22><div\x20class=\x22dops-error\x22>{{exportError}}</div></if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Success\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportDone\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-success\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>✓</span><span\x20style=\x22font-weight:600;\x22>Downloaded</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;font-size:11px;margin-left:auto;\x22>{{formatBytes(exportDone.bytes)}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(3,1fr);gap:6px;font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportDone.envCount\x20>\x201\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{exportDone.envCount}}</div><div>envs</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{exportDone.types}}</div><div>types</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{exportDone.records}}</div><div>records</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{exportDone.changes}}</div><div>changes</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.35;margin-top:6px;font-family:monospace;word-break:break-all;\x22>{{exportDone.filename}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;justify-content:flex-end;margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22close()\x22\x20class=\x22dops-btn-ghost\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runExport()\x22\x20:disabled=\x22!exportCanRun\x22\x20class=\x22dops-btn-primary\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22exportBusy\x22><span\x20class=\x22dops-spinner\x22></span>\x20Exporting…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!exportBusy\x22>⬇\x20Download\x20NDJSON</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20═══\x20IMPORT\x20═══════════════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27import\x27\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:18px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.5;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Upload\x20a\x20OKDB\x20NDJSON\x20export.\x20Types,\x20indexes,\x20and\x20records\x20are\x20restored\x20automatically.\x0a\x20\x20\x20\x20\x20\x20\x20\x20Multi-env\x20files\x20restore\x20each\x20environment\x20separately.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Drop\x20zone\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20@click=\x22pickFile()\x22\x20@drop=\x22onDrop($event)\x22\x20@dragover=\x22onDragOver($event)\x22\x20@dragleave=\x22onDragLeave()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22importDragOver\x20?\x20\x27border-color:var(--okdb-accent);background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x205%,\x20transparent);\x27\x20:\x20importFile\x20?\x20\x27border-color:color-mix(in\x20srgb,\x20var(--okdb-success)\x2033%,\x20transparent);background:#0a1a10;\x27\x20:\x20\x27border-color:var(--okdb-app-border);background:var(--okdb-app-bg-deep);\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22border:2px\x20dashed;border-radius:10px;padding:24px\x2016px;text-align:center;cursor:pointer;transition:all\x20.15s;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!importFile\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:22px;opacity:.4;margin-bottom:8px;\x22>📂</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:13px;opacity:.7;\x22>Drop\x20.ndjson\x20file\x20here\x20or\x20<span\x20style=\x22color:var(--okdb-accent);\x22>click\x20to\x20browse</span></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;opacity:.3;margin-top:4px;\x22>.ndjson\x20·\x20.jsonl\x20·\x20.json</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22importFile\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:20px;margin-bottom:6px;\x22>📄</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:13px;font-weight:600;color:var(--okdb-success);font-family:monospace;word-break:break-all;\x22>{{importFile.name}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;opacity:.45;margin-top:3px;\x22>{{formatBytes(importFile.size)}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22importFileTypes.length\x22>\x20·\x20{{importFileTypes.length}}\x20type{{importFileTypes.length!==1?\x27s\x27:\x27\x27}}\x20detected</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20·\x20click\x20to\x20change</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Types\x20filter\x20(from\x20file)\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22importFileTypes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22flex:1;margin:0;\x22>Types\x20to\x20import</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22\x20style=\x22font-size:11px;gap:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22importAllTypes\x22\x20@change=\x22importAllTypes\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x22>All</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!importAllTypes\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:0;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:8px;overflow:hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;padding:5px\x2010px;border-bottom:1px\x20solid\x20var(--okdb-app-border);gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22importToggleAllTypes(true)\x22\x20\x20class=\x22dops-micro\x22>all</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22importToggleAllTypes(false)\x22\x20class=\x22dops-micro\x22>none</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;max-height:130px;overflow-y:auto;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22importFileTypes\x22\x20let:t>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20style=\x22display:flex;align-items:center;gap:8px;padding:6px\x2010px;cursor:pointer;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22importSelTypes[t]\x20?\x20\x27background:#1a2a1a;\x27\x20:\x20\x27\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!importSelTypes[t]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22importSelTypes\x20=\x20{...importSelTypes,\x20[t]:\x20$el.checked}\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;font-size:12px;\x22>{{t}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Target\x20env\x20override\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22>Target\x20environment\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.35;font-size:11px;font-weight:400;\x22>(leave\x20empty\x20to\x20use\x20the\x20file\x27s\x20source\x20env)</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<select\x20:value=\x22importEnvOverride\x22\x20@change=\x22importEnvOverride\x20=\x20$el.value\x22\x20class=\x22dops-select\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>—\x20from\x20file\x20header\x20—</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22userEnvs\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22e.name\x22>{{e.name}}</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</select>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Options\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:7px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22importDropExisting\x22\x20@change=\x22importDropExisting\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Drop\x20&\x20recreate\x20existing\x20types\x20<span\x20style=\x22opacity:.4;font-size:11px;\x22>(replaces\x20current\x20data)</span></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22importIncludeChanges\x22\x20@change=\x22importIncludeChanges\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Restore\x20changelog\x20rows</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Advanced\x20-->\x0a\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22importShowAdvanced=!importShowAdvanced\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;opacity:.4;background:transparent;border:none;padding:0;cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{importShowAdvanced?\x27▴\x20hide\x27:\x27▾\x27}}\x20advanced\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22importShowAdvanced\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22\x20style=\x22margin-top:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22>Batch\x20size\x20<span\x20style=\x22opacity:.35;font-size:11px;\x22>(records\x20per\x20write-txn)</span></label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20min=\x2210\x22\x20max=\x2210000\x22\x20step=\x2210\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22importBatchSize\x22\x20@input=\x22importBatchSize=Number($el.value)||500\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22dops-input\x22\x20style=\x22max-width:120px;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22importError\x22><div\x20class=\x22dops-error\x22>{{importError}}</div></if>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22importDone\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-success\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>✓</span><span\x20style=\x22font-weight:600;\x22>Import\x20complete</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(3,1fr);gap:6px;font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{importDone.types}}</div><div>types</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{importDone.records}}</div><div>records</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-stat\x22><div\x20class=\x22dops-stat-n\x22>{{importDone.changes}}</div><div>changes</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;justify-content:flex-end;margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22close()\x22\x20class=\x22dops-btn-ghost\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runImport()\x22\x20:disabled=\x22!canImport\x22\x20class=\x22dops-btn-primary\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22importBusy\x22><span\x20class=\x22dops-spinner\x22></span>\x20Importing…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!importBusy\x22>⬆\x20Import\x20File</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20═══\x20BACKUP\x20════════════════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27backup\x27\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:0;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Mode\x20tabs\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:0;margin-bottom:18px;border-bottom:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22backupMode=\x27server\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22backupMode===\x27server\x27\x20?\x20\x27color:var(--okdb-purple);border-bottom:2px\x20solid\x20var(--okdb-purple);opacity:1;\x27\x20:\x20\x27border-bottom:2px\x20solid\x20transparent;opacity:.45;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22padding:6px\x2016px;background:transparent;border:none;border-radius:0;font-size:13px;cursor:pointer;transition:all\x20.15s;margin-bottom:-1px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20🗄\x20Server\x20backup\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22backupMode=\x27download\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22backupMode===\x27download\x27\x20?\x20\x27color:var(--okdb-purple);border-bottom:2px\x20solid\x20var(--okdb-purple);opacity:1;\x27\x20:\x20\x27border-bottom:2px\x20solid\x20transparent;opacity:.45;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22padding:6px\x2016px;background:transparent;border:none;border-radius:0;font-size:13px;cursor:pointer;transition:all\x20.15s;margin-bottom:-1px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20⬇\x20Download\x20to\x20PC\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Server\x20backup\x20mode\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupMode\x20===\x20\x27server\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:16px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.5;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Hot\x20LMDB\x20page-copy\x20backup\x20—\x20atomic,\x20exact\x20snapshot,\x20no\x20serialisation.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Writes\x20to\x20a\x20directory\x20<em>on\x20the\x20server</em>.\x20The\x20output\x20can\x20be\x20used\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20directly\x20as\x20a\x20OKDB\x20data\x20path.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Dest\x20dir\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22>Destination\x20directory\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.35;font-size:11px;font-weight:400;\x22>(server-side\x20path)</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22text\x22\x20:value=\x22backupDestDir\x22\x20@input=\x22backupDestDir=$el.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22dops-input\x22\x20style=\x22font-family:monospace;\x22\x20spellcheck=\x22false\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Env\x20selection\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22margin-bottom:8px;\x22>Environments</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:12px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22radio\x22\x20name=\x22bkEnvMode\x22\x20value=\x22all\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22backupEnvMode===\x27all\x27\x22\x20@change=\x22backupEnvMode=\x27all\x27\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>All</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22radio\x22\x20name=\x22bkEnvMode\x22\x20value=\x22selected\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22backupEnvMode===\x27selected\x27\x22\x20@change=\x22backupEnvMode=\x27selected\x27\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Select…</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupEnvMode===\x27selected\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;padding:10px;background:var(--okdb-app-bg-deep);border-radius:8px;border:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22userEnvs\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22backupSelEnvs[e.name]\x20?\x20\x27background:var(--okdb-app-surface);border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);color:#e2d8f4;\x27\x20:\x20\x27background:var(--okdb-app-surface);border-color:var(--okdb-app-border);opacity:.55;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:flex;align-items:center;gap:5px;padding:5px\x2011px;border-radius:999px;font-size:12px;cursor:pointer;border:1px\x20solid;transition:all\x20.12s;user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!backupSelEnvs[e.name]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22backupSelEnvs={...backupSelEnvs,[e.name]:$el.checked}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:none;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22backupSelEnvs[e.name]?\x27color:var(--okdb-purple);font-size:10px;\x27:\x27display:none;\x27\x22>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{e.name}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22backupCompact\x22\x20@change=\x22backupCompact=$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Compact\x20while\x20copying\x20<span\x20style=\x22opacity:.4;font-size:11px;\x22>(smaller\x20files,\x20slightly\x20slower)</span></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupError\x22><div\x20class=\x22dops-error\x22>{{backupError}}</div></if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupResult\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-success\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2020%,\x20transparent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-weight:600;color:var(--okdb-app-fg);\x22>Server\x20backup\x20complete</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;font-size:11px;margin-left:auto;\x22>{{backupResult.durationMs}}ms</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22backupResult.envs||[]\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22background:#1a1228;border-radius:6px;padding:7px\x2010px;font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;font-weight:600;color:var(--okdb-purple);\x22>{{e.name}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.35;font-size:11px;\x22>{{formatBytes(e.sizeBefore)}}\x20→\x20{{formatBytes(e.sizeAfter)}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-family:monospace;font-size:10px;opacity:.4;margin-top:3px;word-break:break-all;\x22>{{e.dest}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;justify-content:flex-end;margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22close()\x22\x20class=\x22dops-btn-ghost\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runBackup()\x22\x20:disabled=\x22!canBackup\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22padding:8px\x2020px;border-radius:8px;font-size:13px;font-weight:600;background:linear-gradient(135deg,#1e1530,#150f22);border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-purple)\x2033%,\x20transparent);color:var(--okdb-purple);cursor:pointer;display:flex;align-items:center;gap:6px;transition:all\x20.15s;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupBusy\x22><span\x20class=\x22dops-spinner\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);border-top-color:var(--okdb-purple);\x22></span>\x20Backing\x20up…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!backupBusy\x22>🗄\x20Run\x20Server\x20Backup</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Download\x20backup\x20mode\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupMode\x20===\x20\x27download\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:16px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.5;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Export\x20all\x20environments\x20as\x20a\x20single\x20portable\x20NDJSON\x20file\x20and\x20download\x20it\x20to\x20your\x20computer.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20This\x20file\x20can\x20be\x20imported\x20back\x20into\x20any\x20OKDB\x20instance.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Env\x20selection\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-label\x22\x20style=\x22margin-bottom:8px;\x22>Environments\x20to\x20include</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:12px;margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22radio\x22\x20name=\x22dlEnvMode\x22\x20value=\x22all\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22backupEnvMode===\x27all\x27\x22\x20@change=\x22backupEnvMode=\x27all\x27\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>All\x20environments</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dops-check\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22radio\x22\x20name=\x22dlEnvMode\x22\x20value=\x22selected\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22backupEnvMode===\x27selected\x27\x22\x20@change=\x22backupEnvMode=\x27selected\x27\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Select…</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupEnvMode===\x27selected\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;padding:10px;background:var(--okdb-app-bg-deep);border-radius:8px;border:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<for\x20:=\x22userEnvs\x22\x20let:e>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22backupSelEnvs[e.name]\x20?\x20\x27background:var(--okdb-app-surface);border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);\x27\x20:\x20\x27background:var(--okdb-app-surface);border-color:var(--okdb-app-border);opacity:.55;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:flex;align-items:center;gap:5px;padding:5px\x2011px;border-radius:999px;font-size:12px;cursor:pointer;border:1px\x20solid;transition:all\x20.12s;user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!!backupSelEnvs[e.name]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22backupSelEnvs={...backupSelEnvs,[e.name]:$el.checked}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:none;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22backupSelEnvs[e.name]?\x27color:var(--okdb-purple);font-size:10px;\x27:\x27display:none;\x27\x22>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{e.name}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</for>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupDlError\x22><div\x20class=\x22dops-error\x22>{{backupDlError}}</div></if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupDlDone\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dops-success\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2020%,\x20transparent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>✓</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-weight:600;color:var(--okdb-app-fg);\x22>Downloaded</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;font-size:11px;\x22>{{formatBytes(backupDlDone.bytes)}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-family:monospace;font-size:10px;opacity:.35;margin-top:5px;word-break:break-all;\x22>{{backupDlDone.filename}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;justify-content:flex-end;margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22close()\x22\x20class=\x22dops-btn-ghost\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runDownloadBackup()\x22\x20:disabled=\x22!canBackupDl\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22padding:8px\x2020px;border-radius:8px;font-size:13px;font-weight:600;background:linear-gradient(135deg,#1e1530,#150f22);border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-purple)\x2033%,\x20transparent);color:var(--okdb-purple);cursor:pointer;display:flex;align-items:center;gap:6px;transition:all\x20.15s;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22backupDlBusy\x22><span\x20class=\x22dops-spinner\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-purple)\x2027%,\x20transparent);border-top-color:var(--okdb-purple);\x22></span>\x20Downloading…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!backupDlBusy\x22>⬇\x20Download\x20Backup</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a</div>\x0a\x0a<style>\x0a\x20\x20.dops-field\x20{\x20display:flex;\x20flex-direction:column;\x20gap:5px;\x20}\x0a\x20\x20.dops-label\x20{\x20font-size:12px;\x20opacity:.6;\x20font-weight:500;\x20}\x0a\x20\x20.dops-input\x20{\x0a\x20\x20\x20\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x0a\x20\x20\x20\x20color:inherit;\x20padding:7px\x2010px;\x20font-size:13px;\x20width:100%;\x0a\x20\x20\x20\x20box-sizing:border-box;\x20transition:border-color\x20.15s;\x0a\x20\x20}\x0a\x20\x20.dops-input:focus\x20{\x20outline:none;\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x20}\x0a\x20\x20.dops-select\x20{\x0a\x20\x20\x20\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x0a\x20\x20\x20\x20color:inherit;\x20padding:7px\x2010px;\x20font-size:13px;\x20width:100%;\x20box-sizing:border-box;\x20cursor:pointer;\x0a\x20\x20}\x0a\x20\x20.dops-select:focus\x20{\x20outline:none;\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x20}\x0a\x20\x20.dops-check\x20{\x20display:flex;\x20align-items:center;\x20gap:8px;\x20font-size:13px;\x20cursor:pointer;\x20user-select:none;\x20}\x0a\x20\x20.dops-micro\x20{\x0a\x20\x20\x20\x20padding:2px\x208px;\x20border-radius:4px;\x20font-size:10px;\x20background:transparent;\x0a\x20\x20\x20\x20border:1px\x20solid\x20var(--okdb-app-border);\x20opacity:.5;\x20cursor:pointer;\x20transition:opacity\x20.1s;\x0a\x20\x20}\x0a\x20\x20.dops-micro:hover\x20{\x20opacity:.85;\x20}\x0a\x20\x20.dops-error\x20{\x0a\x20\x20\x20\x20background:#2a1010;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2027%,\x20transparent);\x20border-radius:8px;\x0a\x20\x20\x20\x20padding:10px\x2012px;\x20font-size:12px;\x20color:var(--okdb-danger);\x20line-height:1.5;\x0a\x20\x20}\x0a\x20\x20.dops-success\x20{\x0a\x20\x20\x20\x20background:#0d1a14;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x2020%,\x20transparent);\x20border-radius:8px;\x0a\x20\x20\x20\x20padding:12px\x2014px;\x20font-size:13px;\x20color:#d1fae5;\x0a\x20\x20}\x0a\x20\x20.dops-stat\x20{\x0a\x20\x20\x20\x20background:#071410;\x20border-radius:6px;\x20padding:8px;\x20text-align:center;\x20font-size:11px;\x20opacity:.8;\x0a\x20\x20}\x0a\x20\x20.dops-stat-n\x20{\x20font-size:18px;\x20font-weight:700;\x20color:var(--okdb-success);\x20}\x0a\x20\x20.dops-btn-primary\x20{\x0a\x20\x20\x20\x20padding:8px\x2020px;\x20border-radius:8px;\x20font-size:13px;\x20font-weight:600;\x0a\x20\x20\x20\x20background:linear-gradient(135deg,#1e4060,#1a3050);\x0a\x20\x20\x20\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x20color:var(--okdb-accent);\x0a\x20\x20\x20\x20cursor:pointer;\x20display:flex;\x20align-items:center;\x20gap:6px;\x20transition:all\x20.15s;\x0a\x20\x20}\x0a\x20\x20.dops-btn-primary:hover:not(:disabled)\x20{\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2053%,\x20transparent);\x20}\x0a\x20\x20.dops-btn-primary:disabled\x20{\x20opacity:.35;\x20cursor:not-allowed;\x20}\x0a\x20\x20.dops-btn-ghost\x20{\x0a\x20\x20\x20\x20padding:8px\x2016px;\x20border-radius:8px;\x20font-size:13px;\x0a\x20\x20\x20\x20background:transparent;\x20border:1px\x20solid\x20var(--okdb-app-border);\x20opacity:.55;\x20cursor:pointer;\x0a\x20\x20}\x0a\x20\x20.dops-btn-ghost:hover\x20{\x20opacity:.85;\x20}\x0a\x20\x20.dops-spinner\x20{\x0a\x20\x20\x20\x20display:inline-block;\x20width:12px;\x20height:12px;\x0a\x20\x20\x20\x20border:2px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2020%,\x20transparent);\x20border-top-color:var(--okdb-accent);\x0a\x20\x20\x20\x20border-radius:50%;\x20animation:dops-spin\x20.6s\x20linear\x20infinite;\x0a\x20\x20}\x0a\x20\x20@keyframes\x20dops-spin\x20{\x20to\x20{\x20transform:rotate(360deg);\x20}\x20}\x0a</style>\x0a'};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x37641d=_0x43f6;(function(_0x471700,_0x11f7fe){const _0x101834=_0x43f6,_0x590126=_0x471700();while(!![]){try{const _0x451c0c=-parseInt(_0x101834(0x144))/0x1+parseInt(_0x101834(0x148))/0x2*(parseInt(_0x101834(0x14a))/0x3)+-parseInt(_0x101834(0x161))/0x4*(parseInt(_0x101834(0x143))/0x5)+parseInt(_0x101834(0x160))/0x6*(-parseInt(_0x101834(0x14d))/0x7)+-parseInt(_0x101834(0x162))/0x8*(-parseInt(_0x101834(0x15b))/0x9)+-parseInt(_0x101834(0x165))/0xa+parseInt(_0x101834(0x136))/0xb*(parseInt(_0x101834(0x158))/0xc);if(_0x451c0c===_0x11f7fe)break;else _0x590126['push'](_0x590126['shift']());}catch(_0x7112de){_0x590126['push'](_0x590126['shift']());}}}(_0x206a,0xc77a5));import _0x3026df from'../../api/parts/api-endpoint.ok.js';import _0x4536a0 from'@toolkit/elements/ok-icon.ok.js';export default{'tag':_0x37641d(0x13d),'unwrap':!0x0,'dependencies':[_0x3026df,_0x4536a0],'context':()=>({'routes':[],'loading':!0x1,'error':null,'selected':null,'search':'','tagOrder':[_0x37641d(0x150),'types',_0x37641d(0x13f),_0x37641d(0x15d),_0x37641d(0x154),_0x37641d(0x135),'queue',_0x37641d(0x140),_0x37641d(0x163),_0x37641d(0x133),'envs',_0x37641d(0x159)],async 'load'(){const _0x151b04=_0x37641d;this[_0x151b04(0x131)]=!0x0,this[_0x151b04(0x145)]=null;try{const _0x8d6fdf=await fetch(__ENV__[_0x151b04(0x13a)]+_0x151b04(0x13b)),_0x28787b=await _0x8d6fdf['json']();if(!_0x8d6fdf['ok'])throw new Error(_0x28787b?.[_0x151b04(0x145)]?.[_0x151b04(0x147)]||_0x151b04(0x146));this[_0x151b04(0x13e)]=_0x28787b[_0x151b04(0x13f)]??[];}catch(_0x57a35a){this[_0x151b04(0x145)]=_0x57a35a?.[_0x151b04(0x147)]||String(_0x57a35a);}finally{this[_0x151b04(0x131)]=!0x1;}},get 'filtered'(){const _0x5d2ea9=_0x37641d,_0x297b2a=this[_0x5d2ea9(0x13c)]['trim']()[_0x5d2ea9(0x142)]();return _0x297b2a?this[_0x5d2ea9(0x13e)]['filter'](_0x3d5add=>_0x3d5add['path'][_0x5d2ea9(0x142)]()[_0x5d2ea9(0x164)](_0x297b2a)||_0x3d5add[_0x5d2ea9(0x132)][_0x5d2ea9(0x142)]()[_0x5d2ea9(0x164)](_0x297b2a)||(_0x3d5add[_0x5d2ea9(0x14f)]?.['summary']||'')['toLowerCase']()[_0x5d2ea9(0x164)](_0x297b2a)||(_0x3d5add[_0x5d2ea9(0x14f)]?.[_0x5d2ea9(0x15f)]||[])[_0x5d2ea9(0x156)](_0x1a8ccb=>_0x1a8ccb[_0x5d2ea9(0x164)](_0x297b2a))):this['routes'];},get 'groups'(){const _0x3f76ec=_0x37641d,_0x2682f0=new Map();for(const _0x4a5708 of this['filtered']){const _0x127a30=_0x4a5708[_0x3f76ec(0x14f)]?.['tags']?.[0x0]??_0x3f76ec(0x137);_0x2682f0[_0x3f76ec(0x141)](_0x127a30)||_0x2682f0['set'](_0x127a30,[]),_0x2682f0['get'](_0x127a30)['push'](_0x4a5708);}return[..._0x2682f0[_0x3f76ec(0x134)]()][_0x3f76ec(0x15e)](([_0x286758],[_0xfeaf65])=>{const _0x34dc8b=_0x3f76ec,_0x107e31=this[_0x34dc8b(0x14b)][_0x34dc8b(0x14e)](_0x286758),_0x236853=this[_0x34dc8b(0x14b)][_0x34dc8b(0x14e)](_0xfeaf65);return-0x1===_0x107e31&&-0x1===_0x236853?_0x286758[_0x34dc8b(0x15c)](_0xfeaf65):-0x1===_0x107e31?0x1:-0x1===_0x236853?-0x1:_0x107e31-_0x236853;})['map'](([_0x921496,_0x354fea])=>({'tag':_0x921496,'routes':_0x354fea}));},'methodColor':_0x2e248f=>({'GET':_0x37641d(0x14c),'POST':_0x37641d(0x153),'PUT':_0x37641d(0x130),'PATCH':_0x37641d(0x149),'DELETE':_0x37641d(0x15a)}[_0x2e248f]||_0x37641d(0x152)),'select'(_0x41fbc0){const _0x47ed9f=_0x37641d;this[_0x47ed9f(0x157)]=null,setTimeout(()=>{const _0x12f556=_0x47ed9f;this[_0x12f556(0x157)]=_0x41fbc0;},0x0);},'back'(){const _0x1a6898=_0x37641d;this[_0x1a6898(0x157)]=null;},'shortPath':_0x412542=>_0x412542[_0x37641d(0x151)](/^\/api/,'')[_0x37641d(0x151)](/\[[^\]]*\]/g,''),'optionalHint'(_0x1781e3){const _0x556730=_0x37641d,_0x20cbb3=_0x1781e3[_0x556730(0x138)](/\[([^\]]*)\]/);return _0x20cbb3?_0x20cbb3[0x1][_0x556730(0x151)](/=\w+/g,''):null;}}),'init'(){const _0x51e666=_0x37641d;this[_0x51e666(0x139)]();},'template':'\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;height:100%;min-height:0;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20──\x20Detail\x20view\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22selected\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;height:100%;min-height:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Back\x20bar\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-shrink:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22back()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:flex;align-items:center;gap:5px;font-size:12px;padding:5px\x2012px;color:var(--okdb-accent-muted);border-color:var(--okdb-app-border);border-radius:6px;background:transparent;cursor:pointer;transition:background\x20.12s;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22api-back-btn\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20←\x20Routes\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;font-family:monospace;opacity:.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27color:\x27+methodColor(selected.method)+\x27;font-weight:700;\x27\x22>{{\x20selected.method\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20selected.path\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<api-endpoint\x20:endpoint=\x22selected\x22\x20style=\x22flex:1;min-height:0;overflow:auto;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20──\x20List\x20view\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!selected\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:14px;height:100%;min-height:0;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Search\x20bar\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:10px;flex-shrink:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22text\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20placeholder=\x22Filter\x20routes…\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20!value=\x22search\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22search\x20=\x20$el.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex:1;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:7px;padding:7px\x2012px;color:var(--okdb-app-fg);font-size:12px;outline:none;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22loading\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22loader\x22\x20class=\x22spin\x22\x20style=\x22width:18px;height:18px;opacity:.5;flex-shrink:0;\x22></ok-icon>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22routes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;opacity:.35;white-space:nowrap;flex-shrink:0;\x22>{{\x20filtered.length\x20}}\x20/\x20{{\x20routes.length\x20}}\x20routes</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Error\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:12px;padding:8px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:6px;flex-shrink:0;\x22>{{\x20error\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Route\x20groups\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:18px;padding-bottom:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22groups\x22\x20let:item=\x22g\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.07em;opacity:.38;margin-bottom:6px;padding:0\x204px;\x22>{{\x20g.tag\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(auto-fill,\x20minmax(260px,\x201fr));gap:2px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22g.routes\x22\x20let:item=\x22r\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22select(r)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22r.meta?.summary\x20||\x20r.path\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22api-route-card\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27font-size:10px;font-weight:700;width:42px;flex-shrink:0;text-align:center;color:\x27+methodColor(r.method)+\x27;\x27\x22>{{\x20r.method\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;min-width:0;flex:1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;font-size:11px;color:var(--okdb-accent-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22optionalHint(r.path)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.3;\x22>{{\x20optionalHint(r.path)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>{{\x20shortPath(r.path)\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22r.meta?.summary\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;color:var(--okdb-app-fg-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:1px;\x22>{{\x20r.meta.summary\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!loading\x20&&\x20routes.length\x20===\x200\x20&&\x20!error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.4;padding:8px;\x22>No\x20routes\x20loaded.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20','style':_0x37641d(0x155)};function _0x43f6(_0x1fd57b,_0xb1eedc){_0x1fd57b=_0x1fd57b-0x130;const _0x206a3e=_0x206a();let _0x43f69f=_0x206a3e[_0x1fd57b];return _0x43f69f;}function _0x206a(){const _0x2ff0c8=['fts','32796599MQnMiz','other','match','load','API','/docs','search','system-api-panel','routes','data','pipelines','has','toLowerCase','85vzzvLh','1008052dLhOIY','error','Failed\x20to\x20load\x20routes','message','4dfXqgm','var(--okdb-indigo)','678420nFRIYY','tagOrder','var(--okdb-accent)','6748GwmLVe','indexOf','meta','system','replace','var(--okdb-app-fg-muted)','var(--okdb-success)','indexes','.api-back-btn:hover{background:var(--okdb-app-surface-2)!important;border-color:var(--okdb-app-border-strong)!important}.api-route-card{display:flex;align-items:center;gap:8px;padding:7px\x2010px;background:0\x200;border:1px\x20solid\x20transparent;border-radius:6px;cursor:pointer;text-align:left;min-width:0;transition:background\x20.1s,border-color\x20.1s}.api-route-card:hover{background:var(--okdb-app-bg-deep);border-color:var(--okdb-app-border)}','some','selected','12mpteoT','docs','var(--okdb-danger)','8667qLdALA','localeCompare','changelog','sort','tags','1734EBSNCj','229768ZzFvXo','2168UhmNiC','sync','includes','6145390gqBVVk','var(--okdb-warning)','loading','method','embeddings','entries'];_0x206a=function(){return _0x2ff0c8;};return _0x206a();}
|
|
1
|
+
const _0x38fc0b=_0x27ff;function _0x27ff(_0x136fa6,_0xe52102){_0x136fa6=_0x136fa6-0x1bc;const _0x5d0176=_0x5d01();let _0x27ff05=_0x5d0176[_0x136fa6];return _0x27ff05;}function _0x5d01(){const _0x2dbc5c=['var(--okdb-danger)','loading','\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;height:100%;min-height:0;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20──\x20Detail\x20view\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22selected\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;height:100%;min-height:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Back\x20bar\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-shrink:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22back()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22display:flex;align-items:center;gap:5px;font-size:12px;padding:5px\x2012px;color:var(--okdb-accent-muted);border-color:var(--okdb-app-border);border-radius:6px;background:transparent;cursor:pointer;transition:background\x20.12s;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22api-back-btn\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20←\x20Routes\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;font-family:monospace;opacity:.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27color:\x27+methodColor(selected.method)+\x27;font-weight:700;\x27\x22>{{\x20selected.method\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20selected.path\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<api-endpoint\x20:endpoint=\x22selected\x22\x20style=\x22flex:1;min-height:0;overflow:auto;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20──\x20List\x20view\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!selected\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:14px;height:100%;min-height:0;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Search\x20bar\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:10px;flex-shrink:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22text\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20placeholder=\x22Filter\x20routes…\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20!value=\x22search\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22search\x20=\x20$el.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex:1;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:7px;padding:7px\x2012px;color:var(--okdb-app-fg);font-size:12px;outline:none;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22loading\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22loader\x22\x20class=\x22spin\x22\x20style=\x22width:18px;height:18px;opacity:.5;flex-shrink:0;\x22></ok-icon>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22routes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;opacity:.35;white-space:nowrap;flex-shrink:0;\x22>{{\x20filtered.length\x20}}\x20/\x20{{\x20routes.length\x20}}\x20routes</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Error\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:12px;padding:8px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:6px;flex-shrink:0;\x22>{{\x20error\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Route\x20groups\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:18px;padding-bottom:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22groups\x22\x20let:item=\x22g\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.07em;opacity:.38;margin-bottom:6px;padding:0\x204px;\x22>{{\x20g.tag\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(auto-fill,\x20minmax(260px,\x201fr));gap:2px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22g.routes\x22\x20let:item=\x22r\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22select(r)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22r.meta?.summary\x20||\x20r.path\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22api-route-card\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27font-size:10px;font-weight:700;width:42px;flex-shrink:0;text-align:center;color:\x27+methodColor(r.method)+\x27;\x27\x22>{{\x20r.method\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;min-width:0;flex:1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;font-size:11px;color:var(--okdb-accent-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22optionalHint(r.path)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.3;\x22>{{\x20optionalHint(r.path)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>{{\x20shortPath(r.path)\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22r.meta?.summary\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;color:var(--okdb-app-fg-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:1px;\x22>{{\x20r.meta.summary\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!loading\x20&&\x20routes.length\x20===\x200\x20&&\x20!error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.4;padding:8px;\x22>No\x20routes\x20loaded.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20','summary','has','includes','sort','filtered','var(--okdb-accent)','system-api-panel','Failed\x20to\x20load\x20routes','json','3486qSpwOQ','11QWXciJ','routes','34ZQMOvJ','2471EoOqtH','queue','data','552630VBVFvI','push','method','toLowerCase','changelog','search','4303huhImz','fts','var(--okdb-indigo)','system','path','trim','25ywmobf','var(--okdb-warning)','indexes','localeCompare','var(--okdb-success)','load','tags','get','27918UBDKQM','indexOf','error','some','entries','replace','message','docs','584afepOl','selected','251504FaivlH','API','meta','3244490pVQNhj','filter','/docs','set','embeddings','sync','tagOrder','5382324wKcidc'];_0x5d01=function(){return _0x2dbc5c;};return _0x5d01();}(function(_0x5b5ba9,_0x228206){const _0x14cb29=_0x27ff,_0x7ebfc7=_0x5b5ba9();while(!![]){try{const _0x50bd5d=-parseInt(_0x14cb29(0x1cc))/0x1*(parseInt(_0x14cb29(0x1c2))/0x2)+-parseInt(_0x14cb29(0x1c6))/0x3+parseInt(_0x14cb29(0x1e4))/0x4*(parseInt(_0x14cb29(0x1d2))/0x5)+-parseInt(_0x14cb29(0x1bf))/0x6*(parseInt(_0x14cb29(0x1c3))/0x7)+-parseInt(_0x14cb29(0x1e2))/0x8*(-parseInt(_0x14cb29(0x1da))/0x9)+-parseInt(_0x14cb29(0x1e7))/0xa+-parseInt(_0x14cb29(0x1c0))/0xb*(-parseInt(_0x14cb29(0x1ee))/0xc);if(_0x50bd5d===_0x228206)break;else _0x7ebfc7['push'](_0x7ebfc7['shift']());}catch(_0x1ee640){_0x7ebfc7['push'](_0x7ebfc7['shift']());}}}(_0x5d01,0x316d2));import _0x15c568 from'../../api/parts/api-endpoint.ok.js';import _0x2de67d from'@toolkit/elements/ok-icon.ok.js';export default{'tag':_0x38fc0b(0x1bc),'unwrap':!0x0,'dependencies':[_0x15c568,_0x2de67d],'context':()=>({'routes':[],'loading':!0x1,'error':null,'selected':null,'search':'','tagOrder':[_0x38fc0b(0x1cf),'types',_0x38fc0b(0x1c5),_0x38fc0b(0x1ca),_0x38fc0b(0x1d4),_0x38fc0b(0x1cd),_0x38fc0b(0x1c4),'pipelines',_0x38fc0b(0x1ec),_0x38fc0b(0x1eb),'envs',_0x38fc0b(0x1e1)],async 'load'(){const _0x6ff82c=_0x38fc0b;this[_0x6ff82c(0x1f0)]=!0x0,this[_0x6ff82c(0x1dc)]=null;try{const _0x322c4d=await fetch(__ENV__[_0x6ff82c(0x1e5)]+_0x6ff82c(0x1e9)),_0x1f4b09=await _0x322c4d[_0x6ff82c(0x1be)]();if(!_0x322c4d['ok'])throw new Error(_0x1f4b09?.['error']?.[_0x6ff82c(0x1e0)]||_0x6ff82c(0x1bd));this[_0x6ff82c(0x1c1)]=_0x1f4b09[_0x6ff82c(0x1c5)]??[];}catch(_0xa25172){this[_0x6ff82c(0x1dc)]=_0xa25172?.['message']||String(_0xa25172);}finally{this['loading']=!0x1;}},get 'filtered'(){const _0x2811ae=_0x38fc0b,_0x3fc193=this[_0x2811ae(0x1cb)][_0x2811ae(0x1d1)]()[_0x2811ae(0x1c9)]();return _0x3fc193?this['routes'][_0x2811ae(0x1e8)](_0x43c4e6=>_0x43c4e6[_0x2811ae(0x1d0)]['toLowerCase']()[_0x2811ae(0x1f4)](_0x3fc193)||_0x43c4e6[_0x2811ae(0x1c8)][_0x2811ae(0x1c9)]()[_0x2811ae(0x1f4)](_0x3fc193)||(_0x43c4e6[_0x2811ae(0x1e6)]?.[_0x2811ae(0x1f2)]||'')[_0x2811ae(0x1c9)]()[_0x2811ae(0x1f4)](_0x3fc193)||(_0x43c4e6['meta']?.[_0x2811ae(0x1d8)]||[])[_0x2811ae(0x1dd)](_0x4044d8=>_0x4044d8[_0x2811ae(0x1f4)](_0x3fc193))):this[_0x2811ae(0x1c1)];},get 'groups'(){const _0x139061=_0x38fc0b,_0x4338ca=new Map();for(const _0x40aef4 of this[_0x139061(0x1f6)]){const _0x1a4cec=_0x40aef4[_0x139061(0x1e6)]?.[_0x139061(0x1d8)]?.[0x0]??'other';_0x4338ca[_0x139061(0x1f3)](_0x1a4cec)||_0x4338ca[_0x139061(0x1ea)](_0x1a4cec,[]),_0x4338ca[_0x139061(0x1d9)](_0x1a4cec)[_0x139061(0x1c7)](_0x40aef4);}return[..._0x4338ca[_0x139061(0x1de)]()][_0x139061(0x1f5)](([_0x15c9f0],[_0xcca43d])=>{const _0x3c94bb=_0x139061,_0x51b132=this['tagOrder'][_0x3c94bb(0x1db)](_0x15c9f0),_0x2ef496=this[_0x3c94bb(0x1ed)][_0x3c94bb(0x1db)](_0xcca43d);return-0x1===_0x51b132&&-0x1===_0x2ef496?_0x15c9f0[_0x3c94bb(0x1d5)](_0xcca43d):-0x1===_0x51b132?0x1:-0x1===_0x2ef496?-0x1:_0x51b132-_0x2ef496;})['map'](([_0x4a25d6,_0x4678e8])=>({'tag':_0x4a25d6,'routes':_0x4678e8}));},'methodColor':_0x2ddcb5=>({'GET':_0x38fc0b(0x1f7),'POST':_0x38fc0b(0x1d6),'PUT':_0x38fc0b(0x1d3),'PATCH':_0x38fc0b(0x1ce),'DELETE':_0x38fc0b(0x1ef)}[_0x2ddcb5]||'var(--okdb-app-fg-muted)'),'select'(_0x1e2bc6){const _0x5a4e86=_0x38fc0b;this[_0x5a4e86(0x1e3)]=null,setTimeout(()=>{const _0x4ad66d=_0x5a4e86;this[_0x4ad66d(0x1e3)]=_0x1e2bc6;},0x0);},'back'(){const _0x5705dd=_0x38fc0b;this[_0x5705dd(0x1e3)]=null;},'shortPath':_0x3b70a4=>_0x3b70a4[_0x38fc0b(0x1df)](/^\/api/,'')[_0x38fc0b(0x1df)](/\[[^\]]*\]/g,''),'optionalHint'(_0x99f12a){const _0x5022e9=_0x38fc0b,_0x48d4e7=_0x99f12a['match'](/\[([^\]]*)\]/);return _0x48d4e7?_0x48d4e7[0x1][_0x5022e9(0x1df)](/=\w+/g,''):null;}}),'init'(){const _0x107756=_0x38fc0b;this[_0x107756(0x1d7)]();},'template':_0x38fc0b(0x1f1),'style':'.api-back-btn:hover{background:var(--okdb-app-surface-2)!important;border-color:var(--okdb-app-border-strong)!important}.api-route-card{display:flex;align-items:center;gap:8px;padding:7px\x2010px;background:0\x200;border:1px\x20solid\x20transparent;border-radius:6px;cursor:pointer;text-align:left;min-width:0;transition:background\x20.1s,border-color\x20.1s}.api-route-card:hover{background:var(--okdb-app-bg-deep);border-color:var(--okdb-app-border)}'};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x25b296=_0x41b2;(function(_0xca01d1,_0x5d0a4d){const _0x41a465=_0x41b2,_0x56f617=_0xca01d1();while(!![]){try{const _0x1dfc1b=-parseInt(_0x41a465(0xb0))/0x1*(-parseInt(_0x41a465(0xc1))/0x2)+-parseInt(_0x41a465(0xd7))/0x3*(parseInt(_0x41a465(0xc9))/0x4)+parseInt(_0x41a465(0xd5))/0x5+parseInt(_0x41a465(0xbf))/0x6*(parseInt(_0x41a465(0xb1))/0x7)+-parseInt(_0x41a465(0xc8))/0x8+-parseInt(_0x41a465(0xb5))/0x9*(parseInt(_0x41a465(0xae))/0xa)+parseInt(_0x41a465(0xb9))/0xb;if(_0x1dfc1b===_0x5d0a4d)break;else _0x56f617['push'](_0x56f617['shift']());}catch(_0x2ad65d){_0x56f617['push'](_0x56f617['shift']());}}}(_0x95f8,0x394c4));import _0x3021d6 from'../../auth/parts/token-list.ok.js';function _0x41b2(_0x2d1e11,_0x510617){_0x2d1e11=_0x2d1e11-0xae;const _0x95f84e=_0x95f8();let _0x41b294=_0x95f84e[_0x2d1e11];return _0x41b294;}import _0x28c1cc from'../../auth/parts/token-detail.ok.js';import _0x135796 from'../../auth/modals/create-token-modal.ok.js';import _0x485d66 from'../../auth/modals/edit-token-modal.ok.js';function _0x95f8(){const _0x53c87c=['.auth-panel-btn:hover{background:var(--okdb-app-surface-2)!important;border-color:var(--okdb-app-border-strong)!important;color:var(--okdb-accent-muted)!important}','selectedToken','5336947MAGPvW','success','Unnamed','_selectedId','DELETE','label','1521438fCZECP','modal','73730cUSxKq','$scope','open','tokenListEl','API','load','toast','2624000XoxfdG','18536nKKPND','error','shared','Token\x20deleted','selectToken','$ok','/auth/tokens/','<create-token-modal\x20:modal=\x22modal\x22\x20:on-done=\x22onDone\x22\x20/>','Delete\x20failed','Edit\x20Token:\x20','Failed\x20to\x20delete\x20token','message','771185lwqiiE','<edit-token-modal\x20:modal=\x22modal\x22\x20:token=\x22token\x22\x20:on-done=\x22onDone\x22\x20/>','177pJdEaI','selectedTokenId','2312020gjTuQE','\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:0;height:100%;min-height:0;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Left:\x20token\x20list\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22width:240px;flex-shrink:0;border-right:1px\x20solid\x20var(--okdb-app-surface-2);display:flex;flex-direction:column;gap:8px;padding-right:12px;min-height:0;overflow:hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22openCreateModal()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex-shrink:0;padding:6px\x2010px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;background:transparent;color:var(--okdb-accent-muted);font-size:12px;font-weight:500;cursor:pointer;text-align:left;width:100%;transition:background\x20.12s,border-color\x20.12s,color\x20.12s;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22auth-panel-btn\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20+\x20New\x20Token\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<token-list\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:ref=\x22tokenListEl\x20=\x20$el\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:selected-id=\x22selectedTokenId\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@selected=\x22selectToken($event.detail)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex:1;min-height:0;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Right:\x20token\x20detail\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22flex:1;min-width:0;padding-left:18px;overflow:auto;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<token-detail\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:token=\x22selectedToken\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@edit=\x22openEditModal($event.detail)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@delete=\x22deleteToken($event.detail)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20','11YYPRZU','7KzJOdT','$innerContext','system-auth-panel','Create\x20Token','18gKJdQp','json'];_0x95f8=function(){return _0x53c87c;};return _0x95f8();}export default{'tag':_0x25b296(0xb3),'unwrap':!0x0,'dependencies':[_0x3021d6,_0x28c1cc,_0x135796,_0x485d66],'context':_0x15ee37=>({'selectedToken':null,'tokenListEl':null,'selectedTokenId':null,'selectToken'(_0x43f265){const _0x456c0c=_0x25b296;this[_0x456c0c(0xb8)]=_0x43f265??null,this[_0x456c0c(0xd8)]=_0x43f265?.['id']??null;},async 'openCreateModal'(){const _0x11e501=_0x25b296;await _0x15ee37[_0x11e501(0xce)]['shared'][_0x11e501(0xc0)][_0x11e501(0xc3)]({'owner':_0x15ee37,'title':_0x11e501(0xb4),'content':_0x11e501(0xd0),'context':_0x46401c=>({'modal':_0x46401c,'onDone':async _0x347bc2=>{const _0x3396c7=_0x11e501;if(_0x347bc2?.['id']){const _0x458d80=this[_0x3396c7(0xc4)]?.['$scope']?.[_0x3396c7(0xb2)];_0x458d80&&(_0x458d80[_0x3396c7(0xbc)]=_0x347bc2['id']),this[_0x3396c7(0xcd)](_0x347bc2);}await this[_0x3396c7(0xc4)]?.[_0x3396c7(0xc2)]?.[_0x3396c7(0xb2)]?.[_0x3396c7(0xc6)]?.();}})});},async 'openEditModal'(_0x27a7b2){const _0x223fae=_0x25b296;await _0x15ee37[_0x223fae(0xce)][_0x223fae(0xcb)][_0x223fae(0xc0)][_0x223fae(0xc3)]({'owner':_0x15ee37,'title':_0x223fae(0xd2)+(_0x27a7b2[_0x223fae(0xbe)]||_0x223fae(0xbb)),'content':_0x223fae(0xd6),'context':_0x5be3ad=>({'modal':_0x5be3ad,'token':_0x27a7b2,'onDone':async()=>{const _0x2465dc=_0x223fae;await this[_0x2465dc(0xc4)]?.[_0x2465dc(0xc2)]?.[_0x2465dc(0xb2)]?.[_0x2465dc(0xc6)]?.();}})});},async 'deleteToken'(_0x59fbcf){const _0x14b551=_0x25b296;try{const _0x373a53=await fetch(__ENV__[_0x14b551(0xc5)]+_0x14b551(0xcf)+encodeURIComponent(_0x59fbcf),{'method':_0x14b551(0xbd)});if(!_0x373a53['ok']){const _0x46df7f=await _0x373a53[_0x14b551(0xb6)]();throw new Error(_0x46df7f?.[_0x14b551(0xca)]?.[_0x14b551(0xd4)]||_0x14b551(0xd3));}_0x15ee37[_0x14b551(0xce)][_0x14b551(0xcb)]?.[_0x14b551(0xc7)]?.[_0x14b551(0xba)]?.(_0x14b551(0xcc)),this[_0x14b551(0xcd)](null),await this['tokenListEl']?.[_0x14b551(0xc2)]?.[_0x14b551(0xb2)]?.[_0x14b551(0xc6)]?.();}catch(_0x3c7d17){_0x15ee37[_0x14b551(0xce)][_0x14b551(0xcb)]?.[_0x14b551(0xc7)]?.[_0x14b551(0xca)]?.(_0x3c7d17?.[_0x14b551(0xd4)]||_0x14b551(0xd1));}}}),'template':_0x25b296(0xaf),'style':_0x25b296(0xb7)};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x2b4317=_0x4374;function _0x2a9d(){const _0x4c4518=['\x20selected','hasMore','131929zFtaom','/system/logs?','totalCount','append','212847kRLbZF','levels','all','level','length','24h','loading','48TBVOjQ','data','2006810mhJVOk','message','entries','4634778ceAXhq','toTimeString','toUpperCase','clear','1269mhkdjk','cursor','34806SPiMTi','add','load','Failed\x20to\x20load\x20logs','var(--okdb-danger)','padStart','push','stringify','getMilliseconds','sort','next_cursor','system-log-history','feature','API','error','seenNodes','All\x20time','\x0a<div\x20class=\x22history\x22>\x0a\x0a\x20\x20<!--\x20Toolbar\x20row\x201:\x20filters\x20-->\x0a\x20\x20<div\x20class=\x22history__toolbar\x22>\x0a\x20\x20\x20\x20<span\x20class=\x22history__title\x22>History</span>\x0a\x0a\x20\x20\x20\x20<!--\x20Time\x20range\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22history__group\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__label\x22>Time</span>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x271h\x27)\x22\x20:class=\x22timeRange===\x271h\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>1h</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x276h\x27)\x22\x20:class=\x22timeRange===\x276h\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>6h</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x2724h\x27)\x22\x20:class=\x22timeRange===\x2724h\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>24h</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x277d\x27)\x22\x20:class=\x22timeRange===\x277d\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>7d</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x27all\x27)\x22\x20:class=\x22timeRange===\x27all\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>All</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<div\x20class=\x22history__spacer\x22></div>\x0a\x0a\x20\x20\x20\x20<!--\x20Refresh\x20and\x20count\x20-->\x0a\x20\x20\x20\x20<button\x20@click=\x22resetAndLoad()\x22\x20:disabled=\x22loading\x22\x20class=\x22pill\x22\x20style=\x22white-space:nowrap;\x22>↻\x20Refresh</button>\x0a\x20\x20\x20\x20<span\x20class=\x22history__count\x22>{{\x20totalCount\x20}}</span>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Toolbar\x20row\x202:\x20level\x20filter\x20-->\x0a\x20\x20<div\x20class=\x22history__toolbar\x20history__toolbar--sub\x22>\x0a\x20\x20\x20\x20<span\x20class=\x22history__label\x22>Level</span>\x0a\x20\x20\x20\x20<div\x20class=\x22history__pills\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22clearLevels()\x22\x20:class=\x22levels.length\x20===\x200\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>All</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22toggleLevel(\x27info\x27)\x22\x20:class=\x22levels.includes(\x27info\x27)\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22\x20style=\x22color:var(--okdb-accent)\x22>info</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22toggleLevel(\x27warn\x27)\x22\x20:class=\x22levels.includes(\x27warn\x27)\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22\x20style=\x22color:var(--okdb-warning)\x22>warn</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22toggleLevel(\x27error\x27)\x22\x20:class=\x22levels.includes(\x27error\x27)\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22\x20style=\x22color:var(--okdb-danger)\x22>error</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22toggleLevel(\x27debug\x27)\x22\x20:class=\x22levels.includes(\x27debug\x27)\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22\x20style=\x22color:var(--okdb-app-fg-muted)\x22>debug</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Toolbar\x20row\x203:\x20feature\x20dropdown\x20-->\x0a\x20\x20<if\x20:=\x22seenFeatures.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22history__toolbar\x20history__toolbar--sub\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__label\x22>Feature</span>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setFeature(null)\x22\x20:class=\x22feature\x20===\x20null\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>All</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22seenFeatures\x22\x20let:item=\x22s\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setFeature(s)\x22\x20:class=\x22feature\x20===\x20s\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>{{\x20s\x20}}</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Toolbar\x20row\x204:\x20node\x20dropdown\x20-->\x0a\x20\x20<if\x20:=\x22seenNodes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22history__toolbar\x20history__toolbar--sub\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__label\x22>Node</span>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setNode(null)\x22\x20:class=\x22node\x20===\x20null\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>All</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22seenNodes\x22\x20let:item=\x22n\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setNode(n)\x22\x20:class=\x22node\x20===\x20n\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>{{\x20n\x20}}</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Error\x20state\x20-->\x0a\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22history__error\x22>{{\x20error\x20}}</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Log\x20entries\x20list\x20-->\x0a\x20\x20<div\x20class=\x22history__list\x22>\x0a\x20\x20\x20\x20<if\x20:=\x22entries.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__empty\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22loading\x22>Loading…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!loading\x20&&\x20!error\x22>No\x20log\x20entries</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<each\x20:of=\x22entries\x22\x20let:item=\x22entry\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__row\x22\x20@click=\x22toggleExpanded(entry.key)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__ts\x22>{{\x20fmtTime(entry.ts)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__level\x22\x20:style=\x22\x27color:\x27\x20+\x20levelColor(entry.level)\x22>{{\x20entry.level\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__feature\x22\x20v-if=\x22entry.feature\x22>{{\x20entry.feature\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__msg\x22>{{\x20entry.msg\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__node\x22\x20v-if=\x22entry.node\x22>{{\x20entry.node\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22entry.context\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__has-context\x22>⊕</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Expanded\x20context\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22expandedKeys.has(entry.key)\x20&&\x20entry.context\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__context\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre>{{\x20fmtContext(entry.context)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</each>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Load\x20more\x20button\x20-->\x0a\x20\x20<if\x20:=\x22hasMore\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22history__footer\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22load()\x22\x20:disabled=\x22loading\x22\x20class=\x22history__load-more\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20loading\x20?\x20\x27Loading…\x27\x20:\x20\x27Load\x20More\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</If>\x0a\x0a</div>\x0a','expandedKeys','112CUujLq','splice','var(--okdb-app-fg-muted)','918950VuYARj','node','timeRange','from','All','resetAndLoad','23330weChFc','join','map','#ccc','seenFeatures','now','var(--okdb-warning)'];_0x2a9d=function(){return _0x4c4518;};return _0x2a9d();}(function(_0xb3f6a8,_0x25ed6b){const _0x2a095a=_0x4374,_0xe8e804=_0xb3f6a8();while(!![]){try{const _0x3b808a=parseInt(_0x2a095a(0x221))/0x1+parseInt(_0x2a095a(0x20b))/0x2+-parseInt(_0x2a095a(0x1f9))/0x3*(-parseInt(_0x2a095a(0x200))/0x4)+-parseInt(_0x2a095a(0x202))/0x5+-parseInt(_0x2a095a(0x205))/0x6+parseInt(_0x2a095a(0x1f5))/0x7*(-parseInt(_0x2a095a(0x21e))/0x8)+parseInt(_0x2a095a(0x209))/0x9*(parseInt(_0x2a095a(0x227))/0xa);if(_0x3b808a===_0x25ed6b)break;else _0xe8e804['push'](_0xe8e804['shift']());}catch(_0x4fbe96){_0xe8e804['push'](_0xe8e804['shift']());}}}(_0x2a9d,0xa5c63));function _0x4374(_0x14319e,_0x59d806){_0x14319e=_0x14319e-0x1ed;const _0x2a9d61=_0x2a9d();let _0x43742c=_0x2a9d61[_0x14319e];return _0x43742c;}const e={'info':'var(--okdb-accent)','warn':_0x2b4317(0x1f2),'error':_0x2b4317(0x20f),'debug':_0x2b4317(0x220)},t={'1h':0x36ee80,'6h':0x1499700,'24h':0x5265c00,'7d':0x240c8400,'all':null};export default{'tag':_0x2b4317(0x216),'context':()=>({'level':null,'levels':[],'feature':null,'node':null,'timeRange':_0x2b4317(0x1fe),'entries':[],'seenFeatures':[],'seenNodes':[],'totalCount':0x0,'cursor':null,'hasMore':!0x1,'loading':!0x1,'error':null,'expandedKeys':new Set(),get 'levelsPill'(){const _0x422dbf=_0x2b4317;return 0x0===this['levels'][_0x422dbf(0x1fd)]?_0x422dbf(0x225):this[_0x422dbf(0x1fa)][_0x422dbf(0x1fd)]+_0x422dbf(0x1f3);},get 'timeRangeLabel'(){const _0x40b4cc=_0x2b4317;return _0x40b4cc(0x1fb)===this[_0x40b4cc(0x223)]?_0x40b4cc(0x21b):this[_0x40b4cc(0x223)][_0x40b4cc(0x207)]();},'clearLevels'(){const _0x2777f8=_0x2b4317;this[_0x2777f8(0x1fa)][_0x2777f8(0x21f)](0x0,this[_0x2777f8(0x1fa)][_0x2777f8(0x1fd)]),this[_0x2777f8(0x226)]();},'toggleLevel'(_0x2105a6){const _0x41ed99=_0x2b4317,_0x48eab5=this[_0x41ed99(0x1fa)]['indexOf'](_0x2105a6);_0x48eab5>=0x0?this[_0x41ed99(0x1fa)][_0x41ed99(0x21f)](_0x48eab5,0x1):this['levels'][_0x41ed99(0x211)](_0x2105a6),this[_0x41ed99(0x226)]();},'setTimeRange'(_0x2cfb6c){this['timeRange']=_0x2cfb6c,this['resetAndLoad']();},'setFeature'(_0x218d6c){const _0x11f0f0=_0x2b4317;this['feature']=this[_0x11f0f0(0x217)]===_0x218d6c?null:_0x218d6c,this['resetAndLoad']();},'setNode'(_0x2e25a5){const _0xd538cf=_0x2b4317;this[_0xd538cf(0x222)]=this[_0xd538cf(0x222)]===_0x2e25a5?null:_0x2e25a5,this['resetAndLoad']();},'toggleExpanded'(_0x384de2){const _0x5d91ea=_0x2b4317;this[_0x5d91ea(0x21d)]['has'](_0x384de2)?this[_0x5d91ea(0x21d)]['delete'](_0x384de2):this[_0x5d91ea(0x21d)][_0x5d91ea(0x20c)](_0x384de2);},async 'load'(){const _0x39a816=_0x2b4317;this[_0x39a816(0x1ff)]=!0x0,this[_0x39a816(0x219)]=null;try{const _0x2aab83=Date[_0x39a816(0x1f1)](),_0x1fde21=_0x39a816(0x1fb)===this[_0x39a816(0x223)]?0x0:_0x2aab83-t[this[_0x39a816(0x223)]],_0x290c30=new URLSearchParams();_0x290c30[_0x39a816(0x1f8)](_0x39a816(0x224),String(_0x1fde21)),_0x290c30[_0x39a816(0x1f8)]('to',String(_0x2aab83)),this[_0x39a816(0x1fa)][_0x39a816(0x1fd)]>0x0&&_0x290c30['append'](_0x39a816(0x1fc),this[_0x39a816(0x1fa)][_0x39a816(0x1ed)](',')),this[_0x39a816(0x217)]&&_0x290c30['append'](_0x39a816(0x217),this[_0x39a816(0x217)]),this[_0x39a816(0x222)]&&_0x290c30[_0x39a816(0x1f8)](_0x39a816(0x222),this[_0x39a816(0x222)]),this['cursor']&&_0x290c30[_0x39a816(0x1f8)](_0x39a816(0x20a),String(this[_0x39a816(0x20a)]));const _0x28601b=await fetch(__ENV__[_0x39a816(0x218)]+_0x39a816(0x1f6)+_0x290c30),_0x38a446=await _0x28601b['json']();if(!_0x28601b['ok'])throw new Error(_0x38a446?.[_0x39a816(0x219)]?.['message']||_0x39a816(0x20e));const _0x4152e9=_0x38a446[_0x39a816(0x201)]||_0x38a446['result']||{},_0x1a1189=_0x4152e9['entries']||[];this[_0x39a816(0x20a)]?this[_0x39a816(0x204)][_0x39a816(0x211)](..._0x1a1189):this[_0x39a816(0x204)]=_0x1a1189,this['cursor']=_0x4152e9[_0x39a816(0x215)]??null,this[_0x39a816(0x1f4)]=null!==_0x4152e9[_0x39a816(0x215)];const _0x12447a=new Set(this[_0x39a816(0x204)][_0x39a816(0x1ee)](_0x11c6ca=>_0x11c6ca[_0x39a816(0x217)])['filter'](Boolean)),_0x2d3ff9=new Set(this[_0x39a816(0x204)][_0x39a816(0x1ee)](_0x17d4d0=>_0x17d4d0['node'])['filter'](Boolean));this[_0x39a816(0x1f0)]=Array[_0x39a816(0x224)](_0x12447a)[_0x39a816(0x214)](),this[_0x39a816(0x21a)]=Array[_0x39a816(0x224)](_0x2d3ff9)['sort'](),this[_0x39a816(0x1f7)]=this[_0x39a816(0x204)][_0x39a816(0x1fd)];}catch(_0xfe462e){this[_0x39a816(0x219)]=_0xfe462e?.[_0x39a816(0x203)]||String(_0xfe462e),this[_0x39a816(0x204)]=[];}this[_0x39a816(0x1ff)]=!0x1;},'resetAndLoad'(){const _0x5695ba=_0x2b4317;this['cursor']=null,this[_0x5695ba(0x204)]=[],this[_0x5695ba(0x1f0)]=[],this['seenNodes']=[],this[_0x5695ba(0x21d)][_0x5695ba(0x208)](),this[_0x5695ba(0x20d)]();},'fmtTime'(_0x2edb56){const _0x1db12c=_0x2b4317;if(!_0x2edb56)return'';const _0x1bcd23=new Date(_0x2edb56);return _0x1bcd23[_0x1db12c(0x206)]()['slice'](0x0,0x8)+'.'+String(_0x1bcd23[_0x1db12c(0x213)]())[_0x1db12c(0x210)](0x3,'0');},'fmtContext'(_0x2c880b){const _0x3e1720=_0x2b4317;if(null==_0x2c880b)return'';if('string'==typeof _0x2c880b)return _0x2c880b;try{return JSON[_0x3e1720(0x212)](_0x2c880b);}catch{return String(_0x2c880b);}},'levelColor':_0x5b2232=>e[_0x5b2232]??_0x2b4317(0x1ef)}),'mount'(){const _0x1a33a2=_0x2b4317;this[_0x1a33a2(0x20d)]();},'template':_0x2b4317(0x21c),'style':'.history{display:flex;flex-direction:column;height:100%;min-height:0;background:var(--okdb-app-bg-deep);border-radius:12px;overflow:hidden;border:1px\x20solid\x20var(--okdb-app-border)}.history__toolbar{display:flex;align-items:center;gap:6px;padding:7px\x2010px;background:var(--okdb-app-surface);border-bottom:1px\x20solid\x20var(--okdb-app-border);flex-shrink:0;flex-wrap:wrap}.history__toolbar--sub{padding:5px\x2010px;background:var(--okdb-app-bg-deep);border-bottom:1px\x20solid\x20var(--okdb-app-surface)}.history__title{font-weight:600;font-size:13px;white-space:nowrap;margin-right:2px}.history__label{font-size:10px;opacity:.45;text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;flex-shrink:0}.history__group{display:flex;align-items:center;gap:6px}.history__pills{display:flex;gap:3px;flex-wrap:wrap}.history__spacer{flex:1}.history__count,.pill{font-size:11px;white-space:nowrap}.history__count{opacity:.4;margin-right:4px}.pill{border:1px\x20solid\x20var(--okdb-app-border);background:0\x200;padding:2px\x209px;border-radius:999px;cursor:pointer;color:#666;transition:border-color\x20.12s,color\x20.12s,background\x20.12s}.pill:hover{border-color:var(--okdb-app-fg-muted);color:var(--okdb-app-fg-muted)}.pill:disabled{opacity:.5;cursor:not-allowed}.pill--on{border-color:var(--okdb-accent);background:var(--okdb-app-surface-2);color:var(--okdb-accent)}.history__error{color:var(--okdb-danger);font-size:12px;padding:8px\x2010px;background:var(--okdb-danger-deep-bg);border-bottom:1px\x20solid\x20var(--okdb-app-border)}.history__list{flex:1;overflow-y:auto;font-family:monospace;font-size:12px;padding:2px\x200;min-height:0}.history__row{display:flex;gap:8px;padding:2px\x2010px;border-bottom:1px\x20solid\x20var(--okdb-app-bg-deep);align-items:baseline;min-height:20px;cursor:pointer;transition:background\x20.12s}.history__row:hover{background:var(--okdb-app-surface)}.history__ts{color:var(--okdb-app-fg-muted);flex-shrink:0;font-size:11px;user-select:none;width:86px}.history__level{width:40px;flex-shrink:0;font-weight:700;font-size:10px;text-transform:uppercase;letter-spacing:.04em}.history__feature{flex-shrink:0;font-size:11px;color:var(--okdb-app-fg-muted)}.history__context\x20pre,.history__msg{white-space:pre-wrap;word-break:break-word}.history__msg{flex:1;color:var(--okdb-app-fg);min-width:0}.history__node{flex-shrink:0;font-size:11px;color:var(--okdb-app-fg-muted)}.history__has-context{flex-shrink:0;color:var(--okdb-accent);cursor:pointer;user-select:none}.history__context{background:var(--okdb-app-bg-deep);padding:6px\x2010px\x206px\x2096px;border-bottom:1px\x20solid\x20var(--okdb-app-surface);font-size:11px}.history__context\x20pre{margin:0;color:var(--okdb-app-fg-muted)}.history__empty{padding:24px\x2014px;opacity:.4;font-style:italic;font-size:12px;text-align:center}.history__footer{padding:8px\x2010px;background:var(--okdb-app-surface);border-top:1px\x20solid\x20var(--okdb-app-border);flex-shrink:0;text-align:center}.history__load-more{padding:4px\x2014px;border-radius:6px;font-size:12px;background:var(--okdb-app-surface-2);border:1px\x20solid\x20var(--okdb-app-border);color:var(--okdb-accent);cursor:pointer;transition:background\x20.12s,border-color\x20.12s}.history__load-more:hover{background:var(--okdb-app-surface-2);border-color:var(--okdb-app-fg-muted)}.history__load-more:disabled{opacity:.5;cursor:not-allowed}'};
|
|
1
|
+
const _0x24e017=_0x259b;(function(_0x342f59,_0xcb02d4){const _0x339fb3=_0x259b,_0x3c874d=_0x342f59();while(!![]){try{const _0x2af39=-parseInt(_0x339fb3(0x224))/0x1*(-parseInt(_0x339fb3(0x218))/0x2)+parseInt(_0x339fb3(0x1fb))/0x3*(parseInt(_0x339fb3(0x215))/0x4)+parseInt(_0x339fb3(0x226))/0x5+-parseInt(_0x339fb3(0x1ff))/0x6+parseInt(_0x339fb3(0x1f4))/0x7+-parseInt(_0x339fb3(0x221))/0x8*(parseInt(_0x339fb3(0x200))/0x9)+-parseInt(_0x339fb3(0x22f))/0xa*(parseInt(_0x339fb3(0x207))/0xb);if(_0x2af39===_0xcb02d4)break;else _0x3c874d['push'](_0x3c874d['shift']());}catch(_0x39fe8a){_0x3c874d['push'](_0x3c874d['shift']());}}}(_0x191c,0x78349));function _0x259b(_0x53f175,_0x3be59c){_0x53f175=_0x53f175-0x1f3;const _0x191cc1=_0x191c();let _0x259bb3=_0x191cc1[_0x53f175];return _0x259bb3;}const e={'info':'var(--okdb-accent)','warn':_0x24e017(0x20c),'error':_0x24e017(0x22a),'debug':_0x24e017(0x202)},t={'1h':0x36ee80,'6h':0x1499700,'24h':0x5265c00,'7d':0x240c8400,'all':null};function _0x191c(){const _0x45cad9=['cursor','2032yByHSA','loading','filter','1418swGcLU','totalCount','indexOf','push','all','error','\x0a<div\x20class=\x22history\x22>\x0a\x0a\x20\x20<!--\x20Toolbar\x20row\x201:\x20filters\x20-->\x0a\x20\x20<div\x20class=\x22history__toolbar\x22>\x0a\x20\x20\x20\x20<span\x20class=\x22history__title\x22>History</span>\x0a\x0a\x20\x20\x20\x20<!--\x20Time\x20range\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22history__group\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__label\x22>Time</span>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x271h\x27)\x22\x20:class=\x22timeRange===\x271h\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>1h</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x276h\x27)\x22\x20:class=\x22timeRange===\x276h\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>6h</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x2724h\x27)\x22\x20:class=\x22timeRange===\x2724h\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>24h</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x277d\x27)\x22\x20:class=\x22timeRange===\x277d\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>7d</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setTimeRange(\x27all\x27)\x22\x20:class=\x22timeRange===\x27all\x27\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>All</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<div\x20class=\x22history__spacer\x22></div>\x0a\x0a\x20\x20\x20\x20<!--\x20Refresh\x20and\x20count\x20-->\x0a\x20\x20\x20\x20<button\x20@click=\x22resetAndLoad()\x22\x20:disabled=\x22loading\x22\x20class=\x22pill\x22\x20style=\x22white-space:nowrap;\x22>↻\x20Refresh</button>\x0a\x20\x20\x20\x20<span\x20class=\x22history__count\x22>{{\x20totalCount\x20}}</span>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Toolbar\x20row\x202:\x20level\x20filter\x20-->\x0a\x20\x20<div\x20class=\x22history__toolbar\x20history__toolbar--sub\x22>\x0a\x20\x20\x20\x20<span\x20class=\x22history__label\x22>Level</span>\x0a\x20\x20\x20\x20<div\x20class=\x22history__pills\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22clearLevels()\x22\x20:class=\x22levels.length\x20===\x200\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>All</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22toggleLevel(\x27info\x27)\x22\x20:class=\x22levels.includes(\x27info\x27)\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22\x20style=\x22color:var(--okdb-accent)\x22>info</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22toggleLevel(\x27warn\x27)\x22\x20:class=\x22levels.includes(\x27warn\x27)\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22\x20style=\x22color:var(--okdb-warning)\x22>warn</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22toggleLevel(\x27error\x27)\x22\x20:class=\x22levels.includes(\x27error\x27)\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22\x20style=\x22color:var(--okdb-danger)\x22>error</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22toggleLevel(\x27debug\x27)\x22\x20:class=\x22levels.includes(\x27debug\x27)\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22\x20style=\x22color:var(--okdb-app-fg-muted)\x22>debug</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Toolbar\x20row\x203:\x20feature\x20dropdown\x20-->\x0a\x20\x20<if\x20:=\x22seenFeatures.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22history__toolbar\x20history__toolbar--sub\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__label\x22>Feature</span>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setFeature(null)\x22\x20:class=\x22feature\x20===\x20null\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>All</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22seenFeatures\x22\x20let:item=\x22s\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setFeature(s)\x22\x20:class=\x22feature\x20===\x20s\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>{{\x20s\x20}}</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Toolbar\x20row\x204:\x20node\x20dropdown\x20-->\x0a\x20\x20<if\x20:=\x22seenNodes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22history__toolbar\x20history__toolbar--sub\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__label\x22>Node</span>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setNode(null)\x22\x20:class=\x22node\x20===\x20null\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>All</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22seenNodes\x22\x20let:item=\x22n\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setNode(n)\x22\x20:class=\x22node\x20===\x20n\x20?\x20\x27pill\x20pill--on\x27\x20:\x20\x27pill\x27\x22>{{\x20n\x20}}</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Error\x20state\x20-->\x0a\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22history__error\x22>{{\x20error\x20}}</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Log\x20entries\x20list\x20-->\x0a\x20\x20<div\x20class=\x22history__list\x22>\x0a\x20\x20\x20\x20<if\x20:=\x22entries.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__empty\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22loading\x22>Loading…</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!loading\x20&&\x20!error\x22>No\x20log\x20entries</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<each\x20:of=\x22entries\x22\x20let:item=\x22entry\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__row\x22\x20@click=\x22toggleExpanded(entry.key)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__ts\x22>{{\x20fmtTime(entry.ts)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__level\x22\x20:style=\x22\x27color:\x27\x20+\x20levelColor(entry.level)\x22>{{\x20entry.level\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__feature\x22\x20v-if=\x22entry.feature\x22>{{\x20entry.feature\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__msg\x22>{{\x20entry.msg\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__node\x22\x20v-if=\x22entry.node\x22>{{\x20entry.node\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22entry.context\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22history__has-context\x22>⊕</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Expanded\x20context\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22expandedKeys.has(entry.key)\x20&&\x20entry.context\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22history__context\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre>{{\x20fmtContext(entry.context)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</each>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Load\x20more\x20button\x20-->\x0a\x20\x20<if\x20:=\x22hasMore\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22history__footer\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22load()\x22\x20:disabled=\x22loading\x22\x20class=\x22history__load-more\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20loading\x20?\x20\x27Loading…\x27\x20:\x20\x27Load\x20More\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</If>\x0a\x0a</div>\x0a','hasMore','json','470008eyNrUc','delete','.history{display:flex;flex-direction:column;height:100%;min-height:0;background:var(--okdb-app-bg-deep);border-radius:12px;overflow:hidden;border:1px\x20solid\x20var(--okdb-app-border)}.history__toolbar{display:flex;align-items:center;gap:6px;padding:7px\x2010px;background:var(--okdb-app-surface);border-bottom:1px\x20solid\x20var(--okdb-app-border);flex-shrink:0;flex-wrap:wrap}.history__toolbar--sub{padding:5px\x2010px;background:var(--okdb-app-bg-deep);border-bottom:1px\x20solid\x20var(--okdb-app-surface)}.history__title{font-weight:600;font-size:13px;white-space:nowrap;margin-right:2px}.history__label{font-size:10px;opacity:.45;text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;flex-shrink:0}.history__group{display:flex;align-items:center;gap:6px}.history__pills{display:flex;gap:3px;flex-wrap:wrap}.history__spacer{flex:1}.history__count,.pill{font-size:11px;white-space:nowrap}.history__count{opacity:.4;margin-right:4px}.pill{border:1px\x20solid\x20var(--okdb-app-border);background:0\x200;padding:2px\x209px;border-radius:999px;cursor:pointer;color:#666;transition:border-color\x20.12s,color\x20.12s,background\x20.12s}.pill:hover{border-color:var(--okdb-app-fg-muted);color:var(--okdb-app-fg-muted)}.pill:disabled{opacity:.5;cursor:not-allowed}.pill--on{border-color:var(--okdb-accent);background:var(--okdb-app-surface-2);color:var(--okdb-accent)}.history__error{color:var(--okdb-danger);font-size:12px;padding:8px\x2010px;background:var(--okdb-danger-deep-bg);border-bottom:1px\x20solid\x20var(--okdb-app-border)}.history__list{flex:1;overflow-y:auto;font-family:monospace;font-size:12px;padding:2px\x200;min-height:0}.history__row{display:flex;gap:8px;padding:2px\x2010px;border-bottom:1px\x20solid\x20var(--okdb-app-bg-deep);align-items:baseline;min-height:20px;cursor:pointer;transition:background\x20.12s}.history__row:hover{background:var(--okdb-app-surface)}.history__ts{color:var(--okdb-app-fg-muted);flex-shrink:0;font-size:11px;user-select:none;width:86px}.history__level{width:40px;flex-shrink:0;font-weight:700;font-size:10px;text-transform:uppercase;letter-spacing:.04em}.history__feature{flex-shrink:0;font-size:11px;color:var(--okdb-app-fg-muted)}.history__context\x20pre,.history__msg{white-space:pre-wrap;word-break:break-word}.history__msg{flex:1;color:var(--okdb-app-fg);min-width:0}.history__node{flex-shrink:0;font-size:11px;color:var(--okdb-app-fg-muted)}.history__has-context{flex-shrink:0;color:var(--okdb-accent);cursor:pointer;user-select:none}.history__context{background:var(--okdb-app-bg-deep);padding:6px\x2010px\x206px\x2096px;border-bottom:1px\x20solid\x20var(--okdb-app-surface);font-size:11px}.history__context\x20pre{margin:0;color:var(--okdb-app-fg-muted)}.history__empty{padding:24px\x2014px;opacity:.4;font-style:italic;font-size:12px;text-align:center}.history__footer{padding:8px\x2010px;background:var(--okdb-app-surface);border-top:1px\x20solid\x20var(--okdb-app-border);flex-shrink:0;text-align:center}.history__load-more{padding:4px\x2014px;border-radius:6px;font-size:12px;background:var(--okdb-app-surface-2);border:1px\x20solid\x20var(--okdb-app-border);color:var(--okdb-accent);cursor:pointer;transition:background\x20.12s,border-color\x20.12s}.history__load-more:hover{background:var(--okdb-app-surface-2);border-color:var(--okdb-app-fg-muted)}.history__load-more:disabled{opacity:.5;cursor:not-allowed}','71mCrnvj','/system/logs?','135340EPjPGl','string','system-log-history','length','var(--okdb-danger)','now','feature','All','message','264140ChxZcV','map','levels','splice','has','4422012YmdGlX','from','24h','getMilliseconds','resetAndLoad','clear','load','2100BEIdBZ','append','padStart','entries','649662VtssTo','63arnvxe','level','var(--okdb-app-fg-muted)','expandedKeys','seenFeatures','next_cursor','node','22buzuek','API','stringify','join','#ccc','var(--okdb-warning)','toUpperCase','sort','timeRange','toTimeString','add','seenNodes','result'];_0x191c=function(){return _0x45cad9;};return _0x191c();}export default{'tag':_0x24e017(0x228),'context':()=>({'level':null,'levels':[],'feature':null,'node':null,'timeRange':_0x24e017(0x1f6),'entries':[],'seenFeatures':[],'seenNodes':[],'totalCount':0x0,'cursor':null,'hasMore':!0x1,'loading':!0x1,'error':null,'expandedKeys':new Set(),get 'levelsPill'(){const _0xa52098=_0x24e017;return 0x0===this['levels'][_0xa52098(0x229)]?_0xa52098(0x22d):this[_0xa52098(0x231)][_0xa52098(0x229)]+'\x20selected';},get 'timeRangeLabel'(){const _0x54844f=_0x24e017;return _0x54844f(0x21c)===this['timeRange']?'All\x20time':this['timeRange'][_0x54844f(0x20d)]();},'clearLevels'(){const _0x340ca1=_0x24e017;this['levels']['splice'](0x0,this[_0x340ca1(0x231)]['length']),this['resetAndLoad']();},'toggleLevel'(_0x24f677){const _0x6130b3=_0x24e017,_0x2c0248=this[_0x6130b3(0x231)][_0x6130b3(0x21a)](_0x24f677);_0x2c0248>=0x0?this[_0x6130b3(0x231)][_0x6130b3(0x232)](_0x2c0248,0x1):this[_0x6130b3(0x231)]['push'](_0x24f677),this[_0x6130b3(0x1f8)]();},'setTimeRange'(_0x73799e){const _0x3d8f37=_0x24e017;this[_0x3d8f37(0x20f)]=_0x73799e,this[_0x3d8f37(0x1f8)]();},'setFeature'(_0x1f382f){const _0x5cda92=_0x24e017;this[_0x5cda92(0x22c)]=this[_0x5cda92(0x22c)]===_0x1f382f?null:_0x1f382f,this[_0x5cda92(0x1f8)]();},'setNode'(_0x14f8c7){const _0x4d0c13=_0x24e017;this[_0x4d0c13(0x206)]=this['node']===_0x14f8c7?null:_0x14f8c7,this[_0x4d0c13(0x1f8)]();},'toggleExpanded'(_0x561af0){const _0x457328=_0x24e017;this[_0x457328(0x203)][_0x457328(0x1f3)](_0x561af0)?this[_0x457328(0x203)][_0x457328(0x222)](_0x561af0):this[_0x457328(0x203)][_0x457328(0x211)](_0x561af0);},async 'load'(){const _0x439acd=_0x24e017;this['loading']=!0x0,this[_0x439acd(0x21d)]=null;try{const _0x13a683=Date[_0x439acd(0x22b)](),_0x11a2bd=_0x439acd(0x21c)===this[_0x439acd(0x20f)]?0x0:_0x13a683-t[this['timeRange']],_0x3ffc2f=new URLSearchParams();_0x3ffc2f['append'](_0x439acd(0x1f5),String(_0x11a2bd)),_0x3ffc2f[_0x439acd(0x1fc)]('to',String(_0x13a683)),this[_0x439acd(0x231)][_0x439acd(0x229)]>0x0&&_0x3ffc2f[_0x439acd(0x1fc)](_0x439acd(0x201),this['levels'][_0x439acd(0x20a)](',')),this[_0x439acd(0x22c)]&&_0x3ffc2f[_0x439acd(0x1fc)](_0x439acd(0x22c),this[_0x439acd(0x22c)]),this[_0x439acd(0x206)]&&_0x3ffc2f[_0x439acd(0x1fc)](_0x439acd(0x206),this[_0x439acd(0x206)]),this['cursor']&&_0x3ffc2f[_0x439acd(0x1fc)](_0x439acd(0x214),String(this[_0x439acd(0x214)]));const _0x50997=await fetch(__ENV__[_0x439acd(0x208)]+_0x439acd(0x225)+_0x3ffc2f),_0x24c78a=await _0x50997[_0x439acd(0x220)]();if(!_0x50997['ok'])throw new Error(_0x24c78a?.[_0x439acd(0x21d)]?.[_0x439acd(0x22e)]||'Failed\x20to\x20load\x20logs');const _0x5f2ba2=_0x24c78a['data']||_0x24c78a[_0x439acd(0x213)]||{},_0x8588c5=_0x5f2ba2[_0x439acd(0x1fe)]||[];this[_0x439acd(0x214)]?this[_0x439acd(0x1fe)][_0x439acd(0x21b)](..._0x8588c5):this[_0x439acd(0x1fe)]=_0x8588c5,this[_0x439acd(0x214)]=_0x5f2ba2[_0x439acd(0x205)]??null,this[_0x439acd(0x21f)]=null!==_0x5f2ba2[_0x439acd(0x205)];const _0x564c85=new Set(this[_0x439acd(0x1fe)][_0x439acd(0x230)](_0x1ae632=>_0x1ae632['feature'])['filter'](Boolean)),_0x5465e6=new Set(this[_0x439acd(0x1fe)][_0x439acd(0x230)](_0x39038c=>_0x39038c[_0x439acd(0x206)])[_0x439acd(0x217)](Boolean));this['seenFeatures']=Array[_0x439acd(0x1f5)](_0x564c85)[_0x439acd(0x20e)](),this[_0x439acd(0x212)]=Array['from'](_0x5465e6)['sort'](),this[_0x439acd(0x219)]=this[_0x439acd(0x1fe)][_0x439acd(0x229)];}catch(_0x574fc6){this['error']=_0x574fc6?.['message']||String(_0x574fc6),this['entries']=[];}this[_0x439acd(0x216)]=!0x1;},'resetAndLoad'(){const _0x545bfe=_0x24e017;this[_0x545bfe(0x214)]=null,this['entries']=[],this[_0x545bfe(0x204)]=[],this['seenNodes']=[],this[_0x545bfe(0x203)][_0x545bfe(0x1f9)](),this[_0x545bfe(0x1fa)]();},'fmtTime'(_0x13b89e){const _0x92d2d9=_0x24e017;if(!_0x13b89e)return'';const _0x4cebb6=new Date(_0x13b89e);return _0x4cebb6[_0x92d2d9(0x210)]()['slice'](0x0,0x8)+'.'+String(_0x4cebb6[_0x92d2d9(0x1f7)]())[_0x92d2d9(0x1fd)](0x3,'0');},'fmtContext'(_0x4eae32){const _0xef92dc=_0x24e017;if(null==_0x4eae32)return'';if(_0xef92dc(0x227)==typeof _0x4eae32)return _0x4eae32;try{return JSON[_0xef92dc(0x209)](_0x4eae32);}catch{return String(_0x4eae32);}},'levelColor':_0x57fb7c=>e[_0x57fb7c]??_0x24e017(0x20b)}),'mount'(){const _0x538b72=_0x24e017;this[_0x538b72(0x1fa)]();},'template':_0x24e017(0x21e),'style':_0x24e017(0x223)};
|